all repos

mugit @ 334ab235a0d17d253e3a1d7b816527eb63c794b0

🐮 git server that your cow will love

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

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