diff --git a/cmd/dehub/cmd_hook.go b/cmd/dehub/cmd_hook.go index a4032cc..a15cd08 100644 --- a/cmd/dehub/cmd_hook.go +++ b/cmd/dehub/cmd_hook.go @@ -16,48 +16,51 @@ import ( func cmdHook(ctx context.Context, cmd *dcmd.Cmd) { flag := cmd.FlagSet() - preRcv := flag.Bool("pre-receive", false, "Use dehub as a server-side pre-receive hook") - var proj proj proj.initFlags(flag) - cmd.Run(func() (context.Context, error) { - if !*preRcv { - return nil, errors.New("must set the hook type") - } - + body := func() (context.Context, error) { if err := proj.openProj(); err != nil { return nil, err } + return ctx, nil + } - br := bufio.NewReader(os.Stdin) - for { - line, err := br.ReadString('\n') - if errors.Is(err, io.EOF) { - break - } else if err != nil { - return nil, fmt.Errorf("error reading next line from stdin: %w", err) - } - fmt.Printf("Processing line %q\n", strings.TrimSpace(line)) - - lineParts := strings.Fields(line) - if len(lineParts) < 3 { - return nil, fmt.Errorf("malformed pre-receive hook stdin line %q", line) - } - - endHash := plumbing.NewHash(lineParts[1]) - branchName := plumbing.ReferenceName(lineParts[2]) - - if !branchName.IsBranch() { - return nil, fmt.Errorf("reference %q is not a branch, can't push to it", branchName) - } else if endHash == plumbing.ZeroHash { - return nil, errors.New("deleting remote branches is not currently supported") - } - - return nil, proj.VerifyCanSetBranchHEADTo(branchName, endHash) - } + cmd.SubCmd("pre-receive", "Use dehub as a server-side pre-receive hook", + func(ctx context.Context, cmd *dcmd.Cmd) { + cmd.Run(func() (context.Context, error) { + br := bufio.NewReader(os.Stdin) + for { + line, err := br.ReadString('\n') + if errors.Is(err, io.EOF) { + break + } else if err != nil { + return nil, fmt.Errorf("error reading next line from stdin: %w", err) + } + fmt.Printf("Processing line %q\n", strings.TrimSpace(line)) + + lineParts := strings.Fields(line) + if len(lineParts) < 3 { + return nil, fmt.Errorf("malformed pre-receive hook stdin line %q", line) + } + + endHash := plumbing.NewHash(lineParts[1]) + branchName := plumbing.ReferenceName(lineParts[2]) + + if !branchName.IsBranch() { + return nil, fmt.Errorf("reference %q is not a branch, can't push to it", branchName) + } else if endHash == plumbing.ZeroHash { + return nil, errors.New("deleting remote branches is not currently supported") + } + + return nil, proj.VerifyCanSetBranchHEADTo(branchName, endHash) + } + + fmt.Println("All pushed commits have been verified, well done.") + return nil, nil + }) + }, + ) - fmt.Println("All pushed commits have been verified, well done.") - return nil, nil - }) + cmd.Run(body) } diff --git a/project.go b/project.go index d894831..70cadf3 100644 --- a/project.go +++ b/project.go @@ -194,9 +194,9 @@ func (proj *Project) initRemotePreReceive(bare bool) error { var preRcvBody string if bare { - preRcvBody = "#!/bin/sh\nexec dehub hook -bare -pre-receive\n" + preRcvBody = "#!/bin/sh\nexec dehub hook -bare pre-receive\n" } else { - preRcvBody = "#!/bin/sh\nexec dehub hook -pre-receive\n" + preRcvBody = "#!/bin/sh\nexec dehub hook pre-receive\n" } if _, err := io.Copy(preRcv, bytes.NewBufferString(preRcvBody)); err != nil {