all repos

mugit @ 1c4878a

馃惍 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
Authored at: 2026-03-03 19:51:08 +0200
Change ID: ntszqumrypsztyyqtozknnoqlrrnzwvz
Parent: e1ac7b9
M internal/cli/cli.go
路路路
        86
        86
         							&cli.StringArg{Name: "name"},

      
        87
        87
         						},

      
        88
        88
         					},

      
        
        89
        +					{

      
        
        90
        +						Name:   "checkout",

      
        
        91
        +						Usage:  "switch branches in repo",

      
        
        92
        +						Action: c.repoCheckoutAction,

      
        
        93
        +						Arguments: []cli.Argument{

      
        
        94
        +							&cli.StringArg{Name: "name"},

      
        
        95
        +						},

      
        
        96
        +					},

      
        89
        97
         				},

      
        90
        98
         			},

      
        91
        99
         		},

      
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