3 files changed,
46 insertions(+),
12 deletions(-)
Author:
Oleksandr Smirnov
olexsmir@gmail.com
Committed at:
2026-03-03 19:51:52 +0200
Authored at:
2026-03-03 19:51:08 +0200
Change ID:
ntszqumrypsztyyqtozknnoqlrrnzwvz
Parent:
e1ac7b9
jump to
| M | internal/cli/cli.go |
| M | internal/cli/repo.go |
| M | internal/git/repo.go |
M
internal/cli/repo.go
路路路 13 13 ) 14 14 15 15 func (c *Cli) repoNewAction(ctx context.Context, cmd *cli.Command) error { 16 - name := cmd.StringArg("name") 16 + name, err := c.getRepoNameArg(cmd) 17 17 if name == "" { 18 - return fmt.Errorf("no name provided") 18 + return err 19 19 } 20 - 21 - name = strings.TrimRight(name, ".git") + ".git" 22 20 23 21 path, err := securejoin.SecureJoin(c.cfg.Repo.Dir, name) 24 22 if err != nil { 路路路 56 54 } 57 55 58 56 func (c *Cli) repoDescriptionAction(ctx context.Context, cmd *cli.Command) error { 59 - name := cmd.StringArg("name") 57 + name, err := c.getRepoNameArg(cmd) 60 58 if name == "" { 61 - return fmt.Errorf("no name provided") 59 + return err 62 60 } 63 61 64 - name = strings.TrimRight(name, ".git") + ".git" 65 - 66 62 repo, err := c.openRepo(name) 67 63 if err != nil { 68 64 return fmt.Errorf("failed to open repo: %w", err) 路路路 85 81 } 86 82 87 83 func (c *Cli) repoPrivateAction(ctx context.Context, cmd *cli.Command) error { 88 - name := cmd.StringArg("name") 84 + name, err := c.getRepoNameArg(cmd) 89 85 if name == "" { 90 - return fmt.Errorf("no name provided") 86 + return err 91 87 } 92 88 93 - name = strings.TrimRight(name, ".git") + ".git" 94 - 95 89 repo, err := c.openRepo(name) 96 90 if err != nil { 97 91 return fmt.Errorf("failed to open repo: %w", err) 路路路 110 104 slog.Info("new repo private status", "repo", name, "is_private", newStatus) 111 105 return nil 112 106 } 107 + 108 +func (c *Cli) repoCheckoutAction(ctx context.Context, cmd *cli.Command) error { 109 + name, err := c.getRepoNameArg(cmd) 110 + if name == "" { 111 + return err 112 + } 113 + 114 + repo, err := c.openRepo(name) 115 + if err != nil { 116 + return fmt.Errorf("failed to open repo: %w", err) 117 + } 118 + 119 + branch := cmd.Args().Get(0) 120 + slog.Info("chaining repo head", "repo", name, "branch", branch) 121 + err = repo.Checkout(branch) 122 + return err 123 +} 124 + 125 +func (c *Cli) getRepoNameArg(cmd *cli.Command) (string, error) { 126 + name := cmd.StringArg("name") 127 + if name == "" { 128 + return "", fmt.Errorf("no name provided") 129 + } 130 + name = strings.TrimRight(name, ".git") + ".git" 131 + return name, nil 132 +}
M
internal/git/repo.go
路路路 95 95 return strings.TrimSuffix(name, ".git") 96 96 } 97 97 98 +func (g *Repo) Checkout(ref string) error { 99 + head := plumbing.NewSymbolicReference(plumbing.HEAD, 100 + plumbing.NewBranchReferenceName(ref)) 101 + return g.r.Storer.SetReference(head) 102 +} 103 + 98 104 type Commit struct { 99 105 Message string 100 106 AuthorEmail string