misc/git_hook: extract shared githook package; auto-rebuild on version bump (#19440)
Pull the hook logic into a reusable githook library package so tailscale/corp can share it via a thin wrapper main instead of keeping a forked copy in sync. The install flow also changes: a wrapper scripts now build the binary and reinstall the git hooks. Pulling new shared code no longer requires re-running the installer. Updates tailscale/corp#39860 Change-Id: I4d606d11c8c883015c190c54e3387a7f9fe4dd32 Signed-off-by: Fernando Serboncini <fserb@tailscale.com>
This commit is contained in:
committed by
GitHub
parent
1fbb834dc3
commit
514d7d28e7
@@ -0,0 +1,46 @@
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
// Package githook contains the shared implementation of Tailscale's git
|
||||
// hooks. The tailscale/tailscale and tailscale/corp repositories each have
|
||||
// a thin main package that dispatches to this one, calling individual
|
||||
// hook functions with per-repo arguments as needed.
|
||||
package githook
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
// Launcher is the canonical bytes of launcher.sh. Downstream repos
|
||||
// (e.g. tailscale/corp) rely on these bytes at install time.
|
||||
//
|
||||
//go:embed launcher.sh
|
||||
var Launcher []byte
|
||||
|
||||
// RunLocalHook runs an optional user-supplied hook at
|
||||
// .git/hooks/<name>.local, if present.
|
||||
func RunLocalHook(hookName string, args []string) error {
|
||||
cmdPath, err := os.Executable()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
localHookPath := filepath.Join(filepath.Dir(cmdPath), hookName+".local")
|
||||
if _, err := os.Stat(localHookPath); errors.Is(err, os.ErrNotExist) {
|
||||
return nil
|
||||
} else if err != nil {
|
||||
return fmt.Errorf("checking for local hook: %w", err)
|
||||
}
|
||||
|
||||
cmd := exec.Command(localHookPath, args...)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
if err := cmd.Run(); err != nil {
|
||||
return fmt.Errorf("running local hook %q: %w", localHookPath, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user