appview,knotserver: allow forking empty repos #514

merged
opened by oppi.li targeting master from push-xopyykmxuqzw

as a result, this lets us avoid making another call to knots.

Signed-off-by: oppiliappan me@oppi.li

Changed files
+6 -34
appview
pages
templates
layouts
reporesolver
knotserver
git
-11
appview/pages/templates/layouts/repobase.html
···
<div class="flex items-center gap-2 z-auto">
{{ template "repo/fragments/repoStar" .RepoInfo }}
-
{{ if .RepoInfo.DisableFork }}
-
<button
-
class="btn text-sm no-underline hover:no-underline flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed"
-
disabled
-
title="Empty repositories cannot be forked"
-
>
-
{{ i "git-fork" "w-4 h-4" }}
-
fork
-
</button>
-
{{ else }}
<a
class="btn text-sm no-underline hover:no-underline flex items-center gap-2 group"
hx-boost="true"
···
fork
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
</a>
-
{{ end }}
</div>
</div>
{{ template "repo/fragments/repoDescription" . }}
+2 -15
appview/reporesolver/resolver.go
···
"tangled.sh/tangled.sh/core/appview/pages"
"tangled.sh/tangled.sh/core/appview/pages/repoinfo"
"tangled.sh/tangled.sh/core/idresolver"
-
"tangled.sh/tangled.sh/core/knotclient"
"tangled.sh/tangled.sh/core/rbac"
)
···
}
knot := f.Knot
-
var disableFork bool
-
us, err := knotclient.NewUnsignedClient(knot, f.rr.config.Core.Dev)
-
if err != nil {
-
log.Printf("failed to create unsigned client for %s: %v", knot, err)
-
} else {
-
if result, err := us.Branches(f.OwnerDid(), f.Name); err != nil {
-
log.Printf("failed to get branches for %s/%s: %v", f.OwnerDid(), f.Name, err)
-
} else if len(result.Branches) == 0 {
-
disableFork = true
-
}
-
}
repoInfo := repoinfo.RepoInfo{
OwnerDid: f.OwnerDid(),
···
IssueCount: issueCount,
PullCount: pullCount,
},
-
DisableFork: disableFork,
-
CurrentDir: f.CurrentDir,
-
Ref: f.Ref,
+
CurrentDir: f.CurrentDir,
+
Ref: f.Ref,
}
if sourceRepo != nil {
+4 -8
knotserver/git/fork.go
···
)
func Fork(repoPath, source string) error {
-
_, err := git.PlainClone(repoPath, true, &git.CloneOptions{
-
URL: source,
-
SingleBranch: false,
-
})
-
-
if err != nil {
+
cloneCmd := exec.Command("git", "clone", "--bare", source, repoPath)
+
if err := cloneCmd.Run(); err != nil {
return fmt.Errorf("failed to bare clone repository: %w", err)
}
-
err = exec.Command("git", "-C", repoPath, "config", "receive.hideRefs", "refs/hidden").Run()
-
if err != nil {
+
configureCmd := exec.Command("git", "-C", repoPath, "config", "receive.hideRefs", "refs/hidden")
+
if err := configureCmd.Run(); err != nil {
return fmt.Errorf("failed to configure hidden refs: %w", err)
}