all repos

mugit @ 7073ff2

🐮 git server that your cow will love

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

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