all repos

mugit @ 1c4878aa8ce5e6fff14b73da9e4036410f91eab9

🐮 git server that your cow will love
3 files changed, 46 insertions(+), 12 deletions(-)
cli: add a way to change HEAD of repo
Author: Oleksandr Smirnov olexsmir@gmail.com
Committed at: 2026-03-03 19:51:52 +0200
Change ID: ntszqumrypsztyyqtozknnoqlrrnzwvz
Parent: e1ac7b9
M internal/cli/cli.go

@@ -86,6 +86,14 @@ Arguments: []cli.Argument{

&cli.StringArg{Name: "name"}, }, }, + { + Name: "checkout", + Usage: "switch branches in repo", + Action: c.repoCheckoutAction, + Arguments: []cli.Argument{ + &cli.StringArg{Name: "name"}, + }, + }, }, }, },
M internal/cli/repo.go

@@ -13,12 +13,10 @@ "olexsmir.xyz/mugit/internal/git"

) func (c *Cli) repoNewAction(ctx context.Context, cmd *cli.Command) error { - name := cmd.StringArg("name") + name, err := c.getRepoNameArg(cmd) if name == "" { - return fmt.Errorf("no name provided") + return err } - - name = strings.TrimRight(name, ".git") + ".git" path, err := securejoin.SecureJoin(c.cfg.Repo.Dir, name) if err != nil {

@@ -56,13 +54,11 @@ return nil

} func (c *Cli) repoDescriptionAction(ctx context.Context, cmd *cli.Command) error { - name := cmd.StringArg("name") + name, err := c.getRepoNameArg(cmd) if name == "" { - return fmt.Errorf("no name provided") + return err } - name = strings.TrimRight(name, ".git") + ".git" - repo, err := c.openRepo(name) if err != nil { return fmt.Errorf("failed to open repo: %w", err)

@@ -85,13 +81,11 @@ return nil

} func (c *Cli) repoPrivateAction(ctx context.Context, cmd *cli.Command) error { - name := cmd.StringArg("name") + name, err := c.getRepoNameArg(cmd) if name == "" { - return fmt.Errorf("no name provided") + return err } - name = strings.TrimRight(name, ".git") + ".git" - repo, err := c.openRepo(name) if err != nil { return fmt.Errorf("failed to open repo: %w", err)

@@ -110,3 +104,29 @@

slog.Info("new repo private status", "repo", name, "is_private", newStatus) return nil } + +func (c *Cli) repoCheckoutAction(ctx context.Context, cmd *cli.Command) error { + name, err := c.getRepoNameArg(cmd) + if name == "" { + return err + } + + repo, err := c.openRepo(name) + if err != nil { + return fmt.Errorf("failed to open repo: %w", err) + } + + branch := cmd.Args().Get(0) + slog.Info("chaining repo head", "repo", name, "branch", branch) + err = repo.Checkout(branch) + return err +} + +func (c *Cli) getRepoNameArg(cmd *cli.Command) (string, error) { + name := cmd.StringArg("name") + if name == "" { + return "", fmt.Errorf("no name provided") + } + name = strings.TrimRight(name, ".git") + ".git" + return name, nil +}
M internal/git/repo.go

@@ -95,6 +95,12 @@ name := filepath.Base(g.path)

return strings.TrimSuffix(name, ".git") } +func (g *Repo) Checkout(ref string) error { + head := plumbing.NewSymbolicReference(plumbing.HEAD, + plumbing.NewBranchReferenceName(ref)) + return g.r.Storer.SetReference(head) +} + type Commit struct { Message string AuthorEmail string