summaryrefslogtreecommitdiffstats
path: root/git-shell-commands.go
diff options
context:
space:
mode:
Diffstat (limited to 'git-shell-commands.go')
-rw-r--r--git-shell-commands.go114
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)
+ }
}