all repos

mugit @ 326692c

🐮 git server that your cow will love

mugit/internal/cli/repo.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
git: set default branch; dont replay on list of default branches (#7)..., 2 months ago
1
package cli
2
3
import (
4
	"context"
5
	"fmt"
6
	"log/slog"
7
	"os"
8
9
	"github.com/urfave/cli/v3"
10
	"olexsmir.xyz/mugit/internal/git"
11
	"olexsmir.xyz/mugit/internal/mirror"
12
)
13
14
func (c *Cli) repoNewAction(ctx context.Context, cmd *cli.Command) error {
15
	name, err := c.getRepoNameArg(cmd)
16
	if name == "" {
17
		return err
18
	}
19
20
	path, err := git.ResolvePath(c.cfg.Repo.Dir, name)
21
	if err != nil {
22
		return err
23
	}
24
25
	if _, err = os.Stat(path); err == nil {
26
		return fmt.Errorf("repository already exists: %s", name)
27
	}
28
29
	mirrorURL := cmd.String("mirror")
30
	if mirrorURL != "" {
31
		if merr := mirror.IsRemoteSupported(mirrorURL); merr != nil {
32
			return merr
33
		}
34
	}
35
36
	if err = git.Init(path); err != nil {
37
		return err
38
	}
39
40
	repo, err := git.Open(path, "")
41
	if err != nil {
42
		return fmt.Errorf("failed to open repo: %w", err)
43
	}
44
45
	if err := repo.SetPrivate(cmd.Bool("private")); err != nil {
46
		return fmt.Errorf("failed to set private status: %w", err)
47
	}
48
49
	if mirrorURL != "" {
50
		if err := repo.SetMirrorRemote(mirrorURL); err != nil {
51
			return fmt.Errorf("failed to set mirror remote: %w", err)
52
		}
53
	}
54
55
	desc := cmd.String("description")
56
	if desc != "" {
57
		if err := repo.SetDescription(desc); err != nil {
58
			return fmt.Errorf("failed to set description: %w", err)
59
		}
60
	}
61
62
	defaultBranch := cmd.String("default")
63
	if defaultBranch != "" {
64
		if err := repo.SetDefaultBranch(defaultBranch); err != nil {
65
			return fmt.Errorf("failed to set default branch: %w", err)
66
		}
67
	}
68
69
	return nil
70
}
71
72
func (c *Cli) repoDescriptionAction(ctx context.Context, cmd *cli.Command) error {
73
	name, err := c.getRepoNameArg(cmd)
74
	if name == "" {
75
		return err
76
	}
77
78
	repo, err := c.openRepo(name)
79
	if err != nil {
80
		return fmt.Errorf("failed to open repo: %w", err)
81
	}
82
83
	newDesc := cmd.Args().Get(0)
84
	if newDesc != "" {
85
		if err = repo.SetDescription(newDesc); err != nil {
86
			return fmt.Errorf("failed to set description: %w", err)
87
		}
88
	}
89
90
	desc, err := repo.Description()
91
	if err != nil {
92
		return fmt.Errorf("failed to get description: %w", err)
93
	}
94
95
	slog.Info("changed repo description", "repo", name, "new_description", desc)
96
	return nil
97
}
98
99
func (c *Cli) repoPrivateAction(ctx context.Context, cmd *cli.Command) error {
100
	name, err := c.getRepoNameArg(cmd)
101
	if name == "" {
102
		return err
103
	}
104
105
	repo, err := c.openRepo(name)
106
	if err != nil {
107
		return fmt.Errorf("failed to open repo: %w", err)
108
	}
109
110
	isPrivate, err := repo.IsPrivate()
111
	if err != nil {
112
		return fmt.Errorf("failed to get private status: %w", err)
113
	}
114
115
	newStatus := !isPrivate
116
	if err := repo.SetPrivate(newStatus); err != nil {
117
		return fmt.Errorf("failed to set private status: %w", err)
118
	}
119
120
	slog.Info("new repo private status", "repo", name, "is_private", newStatus)
121
	return nil
122
}
123
124
func (c *Cli) repoDefaultAction(ctx context.Context, cmd *cli.Command) error {
125
	name, err := c.getRepoNameArg(cmd)
126
	if name == "" {
127
		return err
128
	}
129
130
	repo, err := c.openRepo(name)
131
	if err != nil {
132
		return fmt.Errorf("failed to open repo: %w", err)
133
	}
134
135
	branch := cmd.Args().Get(0)
136
	if err = repo.SetDefaultBranch(branch); err != nil {
137
		return err
138
	}
139
140
	slog.Info("changed repo head", "repo", name, "branch", branch)
141
	return err
142
}
143
144
func (c *Cli) getRepoNameArg(cmd *cli.Command) (string, error) {
145
	name := cmd.StringArg("name")
146
	if name == "" {
147
		return "", fmt.Errorf("no name provided")
148
	}
149
	return git.ResolveName(name), nil
150
}