diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2026-07-09 19:37:42 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2026-07-09 19:37:42 -0700 |
| commit | 191461e0dd2ba5e9d1cc72c9f360ffa98ceb407d (patch) | |
| tree | 339d864f188cfd0c37ad3e8202db8391a841ec01 /git-shell-commands.go | |
| parent | Support multiple arguments (diff) | |
| download | git-shell-commands-191461e0dd2ba5e9d1cc72c9f360ffa98ceb407d.tar.zst | |
Make the delete command more obnoxious
Diffstat (limited to 'git-shell-commands.go')
| -rw-r--r-- | git-shell-commands.go | 114 |
1 files changed, 58 insertions, 56 deletions
diff --git a/git-shell-commands.go b/git-shell-commands.go index ccb940a..f78f195 100644 --- a/git-shell-commands.go +++ b/git-shell-commands.go @@ -1,6 +1,7 @@ package main import ( + "bufio" "errors" "flag" "fmt" @@ -23,32 +24,13 @@ func checkRepoName(name string) (string, error) { return name, nil } -func checkRepoNames(args []string) ([]string, error) { - if len(args) == 0 { - return nil, fmt.Errorf("missing operand\nUse %s -help for usage info", filepath.Base(os.Args[0])) - } - names := make([]string, len(args)) - var errs []error - for i, arg := range args { - var err error - names[i], err = checkRepoName(arg) - if err != nil { - errs = append(errs, err) - } - } - if len(errs) > 0 { - return nil, errors.Join(errs...) - } - return names, nil -} - func createRepo(name string) error { dir := filepath.Join(codeDir, name) - fmt.Printf("mkdir %s\n", dir) + fmt.Fprintf(os.Stderr, "mkdir %s\n", dir) if err := os.Mkdir(dir, 0755); err != nil { return err } - fmt.Printf("cd %s && git init --bare\n", dir) + fmt.Fprintf(os.Stderr, "cd %s && git init --bare\n", dir) git := exec.Command("git", "init", "--bare") git.Dir = dir git.Stdout = os.Stdout @@ -58,33 +40,47 @@ func createRepo(name string) error { } hook := filepath.Join(dir, "hooks/post-update") hookSample := hook + ".sample" - fmt.Printf("mv %s %s\n", hookSample, hook) + fmt.Fprintf(os.Stderr, "mv %s %s\n", hookSample, hook) if err := os.Rename(hookSample, hook); err != nil { return err } return nil } -func create() { +func create() error { flag.Usage = func() { fmt.Fprintf(os.Stderr, `Usage: create [REPO]... Create a new git repo named REPO. `) } flag.Parse() - names, err := checkRepoNames(flag.Args()) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + args := flag.Args() + if len(args) == 0 { + return fmt.Errorf("missing operand\nUse create -help for usage info") + } + names := make([]string, len(args)) + var errs []error + for i, arg := range args { + var err error + names[i], err = checkRepoName(arg) + if err != nil { + errs = append(errs, err) + } } - exitCode := 0 + if len(errs) > 0 { + return errors.Join(errs...) + } + failed := false for _, name := range names { if err := createRepo(name); err != nil { fmt.Fprintln(os.Stderr, err) - exitCode = 1 + failed = true } } - os.Exit(exitCode) + if failed { + return fmt.Errorf("failed to create repo") + } + return nil } func fileExists(path string) bool { @@ -92,38 +88,39 @@ func fileExists(path string) bool { return !errors.Is(err, fs.ErrNotExist) } -func deleteRepo(name string) error { - dir := filepath.Join(codeDir, name) - fmt.Printf("rm -rf %s\n", dir) - if !fileExists(dir) { - return fmt.Errorf("repo %q does not exist", name) - } - if err := os.RemoveAll(dir); err != nil { - return err - } - return nil -} - -func delete() { +func delete() error { flag.Usage = func() { - fmt.Fprintf(os.Stderr, `Usage: delete [REPO]... + fmt.Fprintf(os.Stderr, `Usage: delete [REPO] Delete the git repo named REPO. `) } flag.Parse() - names, err := checkRepoNames(flag.Args()) + args := flag.Args() + if len(args) == 0 { + return fmt.Errorf("missing operand\nUse delete -help for usage info") + } + if len(args) > 1 { + return fmt.Errorf("too many positional arguments\nUse delete -help for usage info") + } + name, err := checkRepoName(args[0]) if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + return err } - exitCode := 0 - for _, name := range names { - if err := deleteRepo(name); err != nil { - fmt.Fprintln(os.Stderr, err) - exitCode = 1 - } + dir := filepath.Join(codeDir, name) + shortName := strings.TrimSuffix(name, ".git") + fmt.Fprintf(os.Stderr, "This will irreversibly delete repo %q.\nType %q to confirm: ", name, shortName) + scanner := bufio.NewScanner(os.Stdin) + if !scanner.Scan() || scanner.Text() != shortName { + return fmt.Errorf("name does not match") } - os.Exit(exitCode) + fmt.Fprintf(os.Stderr, "rm -rf %s\n", dir) + if !fileExists(dir) { + return fmt.Errorf("repo %q does not exist", name) + } + if err := os.RemoveAll(dir); err != nil { + return err + } + return nil } func help() { @@ -135,12 +132,17 @@ func help() { } func main() { + var err error switch filepath.Base(os.Args[0]) { case "create": - create() + err = create() case "delete": - delete() + err = delete() default: help() } + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } } |
