all repos

mugit @ f35f950

🐮 git server that your cow will love

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
cli: deduplicate name resolving, 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
	if err = git.Init(path); err != nil {
30
		return err
31
	}
32
33
	repo, err := git.Open(path, "")
34
	if err != nil {
35
		return fmt.Errorf("failed to open repo: %w", err)
36
	}
37
38
	if err := repo.SetPrivate(cmd.Bool("private")); err != nil {
39
		return fmt.Errorf("failed to set private status: %w", err)
40
	}
41
42
	mirrorURL := cmd.String("mirror")
43
	if mirrorURL != "" {
44
		if err := mirror.IsRemoteSupported(mirrorURL); err != nil {
45
			return err
46
		}
47
		if err := repo.SetMirrorRemote(mirrorURL); err != nil {
48
			return fmt.Errorf("failed to set mirror remote: %w", err)
49
		}
50
	}
51
52
	desc := cmd.String("description")
53
	if desc != "" {
54
		if err := repo.SetDescription(desc); err != nil {
55
			return fmt.Errorf("failed to set description: %w", err)
56
		}
57
	}
58
59
	return nil
60
}
61
62
func (c *Cli) repoDescriptionAction(ctx context.Context, cmd *cli.Command) error {
63
	name, err := c.getRepoNameArg(cmd)
64
	if name == "" {
65
		return err
66
	}
67
68
	repo, err := c.openRepo(name)
69
	if err != nil {
70
		return fmt.Errorf("failed to open repo: %w", err)
71
	}
72
73
	newDesc := cmd.Args().Get(0)
74
	if newDesc != "" {
75
		if err = repo.SetDescription(newDesc); err != nil {
76
			return fmt.Errorf("failed to set description: %w", err)
77
		}
78
	}
79
80
	desc, err := repo.Description()
81
	if err != nil {
82
		return fmt.Errorf("failed to get description: %w", err)
83
	}
84
85
	slog.Info("changed repo description", "repo", name, "new_description", desc)
86
	return nil
87
}
88
89
func (c *Cli) repoPrivateAction(ctx context.Context, cmd *cli.Command) error {
90
	name, err := c.getRepoNameArg(cmd)
91
	if name == "" {
92
		return err
93
	}
94
95
	repo, err := c.openRepo(name)
96
	if err != nil {
97
		return fmt.Errorf("failed to open repo: %w", err)
98
	}
99
100
	isPrivate, err := repo.IsPrivate()
101
	if err != nil {
102
		return fmt.Errorf("failed to get private status: %w", err)
103
	}
104
105
	newStatus := !isPrivate
106
	if err := repo.SetPrivate(newStatus); err != nil {
107
		return fmt.Errorf("failed to set private status: %w", err)
108
	}
109
110
	slog.Info("new repo private status", "repo", name, "is_private", newStatus)
111
	return nil
112
}
113
114
func (c *Cli) repoSetHeadAction(ctx context.Context, cmd *cli.Command) error {
115
	name, err := c.getRepoNameArg(cmd)
116
	if name == "" {
117
		return err
118
	}
119
120
	repo, err := c.openRepo(name)
121
	if err != nil {
122
		return fmt.Errorf("failed to open repo: %w", err)
123
	}
124
125
	branch := cmd.Args().Get(0)
126
	slog.Info("chaining repo head", "repo", name, "branch", branch)
127
	err = repo.Checkout(branch)
128
	return err
129
}
130
131
func (c *Cli) getRepoNameArg(cmd *cli.Command) (string, error) {
132
	name := cmd.StringArg("name")
133
	if name == "" {
134
		return "", fmt.Errorf("no name provided")
135
	}
136
	return git.ResolveName(name), nil
137
}