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