fix: initial default branch name (#340)

Ayman Bagabas created

Use git plumbing to set the initial default branch name.

Fixes: https://github.com/charmbracelet/soft-serve/issues/147
Fixes: https://github.com/charmbracelet/soft-serve/issues/260

Change summary

git/repo.go              | 11 +++++++----
server/git/git.go        | 10 +++++-----
server/ssh/cmd/branch.go |  6 +++++-
3 files changed, 17 insertions(+), 10 deletions(-)

Detailed changes

git/repo.go 🔗

@@ -230,10 +230,13 @@ func (r *Repository) SetConfig(key, value string, opts ...ConfigOptions) error {
 
 // SymbolicRef returns or updates the symbolic reference for the given name.
 // Both name and ref can be empty.
-func (r *Repository) SymbolicRef(name string, ref string) (string, error) {
-	opt := git.SymbolicRefOptions{
-		Name: name,
-		Ref:  ref,
+func (r *Repository) SymbolicRef(name string, ref string, opts ...git.SymbolicRefOptions) (string, error) {
+	var opt git.SymbolicRefOptions
+	if len(opts) > 0 {
+		opt = opts[0]
 	}
+
+	opt.Name = name
+	opt.Ref = ref
 	return r.Repository.SymbolicRef(opt)
 }

server/git/git.go 🔗

@@ -11,6 +11,7 @@ import (
 	"github.com/charmbracelet/log"
 	"github.com/charmbracelet/soft-serve/git"
 	"github.com/go-git/go-git/v5/plumbing/format/pktline"
+	gitm "github.com/gogs/git-module"
 )
 
 var (
@@ -102,11 +103,10 @@ func EnsureDefaultBranch(ctx context.Context, scmd ServiceCommand) error {
 			}
 		}
 
-		cmd := git.NewCommand("branch", "-M", branch).WithContext(ctx)
-		if err := cmd.RunInDirWithOptions(scmd.Dir, git.RunInDirOptions{
-			Stdin:  scmd.Stdin,
-			Stdout: scmd.Stdout,
-			Stderr: scmd.Stderr,
+		if _, err := r.SymbolicRef(git.HEAD, git.RefsHeads+branch, gitm.SymbolicRefOptions{
+			CommandOptions: gitm.CommandOptions{
+				Context: ctx,
+			},
 		}); err != nil {
 			return err
 		}

server/ssh/cmd/branch.go 🔗

@@ -116,7 +116,11 @@ func branchDefaultCommand() *cobra.Command {
 					return git.ErrReferenceNotExist
 				}
 
-				if _, err := r.SymbolicRef("HEAD", gitm.RefsHeads+branch); err != nil {
+				if _, err := r.SymbolicRef(git.HEAD, gitm.RefsHeads+branch, gitm.SymbolicRefOptions{
+					CommandOptions: gitm.CommandOptions{
+						Context: ctx,
+					},
+				}); err != nil {
 					return err
 				}
 			}