mirror of
https://github.com/tailscale/tailscale.git
synced 2026-05-18 13:51:31 -04:00
Move HOOK_VERSION into the githook package and export it as githook.HookVersion, so tailscale/corp can reference it via the shared-code bump instead of having to bump HOOK_VERSION by hand. New launcher.sh composes the wanted version from 2 sources: the shared HOOK_VERSION and an optional repo local version, misc/git_hook/HOOK_VERSION, for repo-specific config bumps. Updates tailscale/corp#40381 Change-Id: I7cf16889ba53cb564cc2df7dfd7588748f542c55 Signed-off-by: Fernando Serboncini <fserb@tailscale.com>
53 lines
1.4 KiB
Go
53 lines
1.4 KiB
Go
// 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
|
|
|
|
// HookVersion is the shared version of this package and launcher.sh.
|
|
// Bump HOOK_VERSION on any change under this package.
|
|
//
|
|
//go:embed HOOK_VERSION
|
|
var HookVersion string
|
|
|
|
// 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
|
|
}
|