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
··· 21 21 22 22 <div class="flex items-center gap-2 z-auto"> 23 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 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 - {{ 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 - "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 - 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 182 195 183 repoInfo := repoinfo.RepoInfo{ 196 184 OwnerDid: f.OwnerDid(), ··· 207 195 IssueCount: issueCount, 208 196 PullCount: pullCount, 209 197 }, 210 - DisableFork: disableFork, 211 - CurrentDir: f.CurrentDir, 212 - Ref: f.Ref, 198 + CurrentDir: f.CurrentDir, 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 - _, err := git.PlainClone(repoPath, true, &git.CloneOptions{ 14 - URL: source, 15 - SingleBranch: false, 16 - }) 17 - 18 - if err != nil { 13 + cloneCmd := exec.Command("git", "clone", "--bare", source, repoPath) 14 + if err := cloneCmd.Run(); err != nil { 19 15 return fmt.Errorf("failed to bare clone repository: %w", err) 20 16 } 21 17 22 - err = exec.Command("git", "-C", repoPath, "config", "receive.hideRefs", "refs/hidden").Run() 23 - if err != nil { 18 + configureCmd := exec.Command("git", "-C", repoPath, "config", "receive.hideRefs", "refs/hidden") 19 + if err := configureCmd.Run(); err != nil { 24 20 return fmt.Errorf("failed to configure hidden refs: %w", err) 25 21 } 26 22