tangled
alpha
login
or
join now
back
round
0
view raw
appview,knotserver: allow forking empty repos
#514
merged
opened by
oppi.li
4 months ago
targeting
master
from
push-xopyykmxuqzw
as a result, this lets us avoid making another call to knots.
Signed-off-by: oppiliappan
me@oppi.li
options
unified
split
Changed files
+6
-34
appview
pages
templates
layouts
repobase.html
reporesolver
resolver.go
knotserver
git
fork.go
-11
appview/pages/templates/layouts/repobase.html
···
21
22
<div class="flex items-center gap-2 z-auto">
23
{{ template "repo/fragments/repoStar" .RepoInfo }}
24
-
{{ if .RepoInfo.DisableFork }}
25
-
<button
26
-
class="btn text-sm no-underline hover:no-underline flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed"
27
-
disabled
28
-
title="Empty repositories cannot be forked"
29
-
>
30
-
{{ i "git-fork" "w-4 h-4" }}
31
-
fork
32
-
</button>
33
-
{{ else }}
34
<a
35
class="btn text-sm no-underline hover:no-underline flex items-center gap-2 group"
36
hx-boost="true"
···
40
fork
41
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
42
</a>
43
-
{{ end }}
44
</div>
45
</div>
46
{{ template "repo/fragments/repoDescription" . }}
···
21
22
<div class="flex items-center gap-2 z-auto">
23
{{ template "repo/fragments/repoStar" .RepoInfo }}
0
0
0
0
0
0
0
0
0
0
24
<a
25
class="btn text-sm no-underline hover:no-underline flex items-center gap-2 group"
26
hx-boost="true"
···
30
fork
31
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
32
</a>
0
33
</div>
34
</div>
35
{{ template "repo/fragments/repoDescription" . }}
+2
-15
appview/reporesolver/resolver.go
···
20
"tangled.sh/tangled.sh/core/appview/pages"
21
"tangled.sh/tangled.sh/core/appview/pages/repoinfo"
22
"tangled.sh/tangled.sh/core/idresolver"
23
-
"tangled.sh/tangled.sh/core/knotclient"
24
"tangled.sh/tangled.sh/core/rbac"
25
)
26
···
180
}
181
182
knot := f.Knot
183
-
var disableFork bool
184
-
us, err := knotclient.NewUnsignedClient(knot, f.rr.config.Core.Dev)
185
-
if err != nil {
186
-
log.Printf("failed to create unsigned client for %s: %v", knot, err)
187
-
} else {
188
-
if result, err := us.Branches(f.OwnerDid(), f.Name); err != nil {
189
-
log.Printf("failed to get branches for %s/%s: %v", f.OwnerDid(), f.Name, err)
190
-
} else if len(result.Branches) == 0 {
191
-
disableFork = true
192
-
}
193
-
}
194
195
repoInfo := repoinfo.RepoInfo{
196
OwnerDid: f.OwnerDid(),
···
207
IssueCount: issueCount,
208
PullCount: pullCount,
209
},
210
-
DisableFork: disableFork,
211
-
CurrentDir: f.CurrentDir,
212
-
Ref: f.Ref,
213
}
214
215
if sourceRepo != nil {
···
20
"tangled.sh/tangled.sh/core/appview/pages"
21
"tangled.sh/tangled.sh/core/appview/pages/repoinfo"
22
"tangled.sh/tangled.sh/core/idresolver"
0
23
"tangled.sh/tangled.sh/core/rbac"
24
)
25
···
179
}
180
181
knot := f.Knot
0
0
0
0
0
0
0
0
0
0
0
182
183
repoInfo := repoinfo.RepoInfo{
184
OwnerDid: f.OwnerDid(),
···
195
IssueCount: issueCount,
196
PullCount: pullCount,
197
},
198
+
CurrentDir: f.CurrentDir,
199
+
Ref: f.Ref,
0
200
}
201
202
if sourceRepo != nil {
+4
-8
knotserver/git/fork.go
···
10
)
11
12
func Fork(repoPath, source string) error {
13
-
_, err := git.PlainClone(repoPath, true, &git.CloneOptions{
14
-
URL: source,
15
-
SingleBranch: false,
16
-
})
17
-
18
-
if err != nil {
19
return fmt.Errorf("failed to bare clone repository: %w", err)
20
}
21
22
-
err = exec.Command("git", "-C", repoPath, "config", "receive.hideRefs", "refs/hidden").Run()
23
-
if err != nil {
24
return fmt.Errorf("failed to configure hidden refs: %w", err)
25
}
26
···
10
)
11
12
func Fork(repoPath, source string) error {
13
+
cloneCmd := exec.Command("git", "clone", "--bare", source, repoPath)
14
+
if err := cloneCmd.Run(); err != nil {
0
0
0
0
15
return fmt.Errorf("failed to bare clone repository: %w", err)
16
}
17
18
+
configureCmd := exec.Command("git", "-C", repoPath, "config", "receive.hideRefs", "refs/hidden")
19
+
if err := configureCmd.Run(); err != nil {
20
return fmt.Errorf("failed to configure hidden refs: %w", err)
21
}
22