Skip to content

Commit

Permalink
fix: executable path in hooks
Browse files Browse the repository at this point in the history
On platforms, where soft-serve executable gets installed in a path that
is not the same throughout installation, or upgrades, hooks break. Some
examples of such a situation is when moving soft-serve repositories from
one OS to another OS, or on NixOS/Guix

This commit passes the path to the current executable as an environment
variable $SOFT_SERVE_BIN_PATH to the hooks.

To fix/update existing repository hooks:

  [/path/to/soft-serve/repos] $ grep -ERl \
   '^[^[:space:]]+soft-serve[^[:space:]]+' . | xargs sed -r -e \
   's,^([^[:space:]]*soft-serve[^[:space:]]*),"${SOFT_SERVE_BIN_PATH}",g' -i

Signed-off-by: Ashish SHUKLA <[email protected]>
Co-authored-by: Ayman Bagabas <[email protected]>
  • Loading branch information
wahjava and aymanbagabas committed Jan 15, 2024
1 parent 3d02df4 commit d9c99e0
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 11 deletions.
15 changes: 14 additions & 1 deletion pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import (
"gopkg.in/yaml.v3"
)

var binPath string

// SSHConfig is the configuration for the SSH server.
type SSHConfig struct {
// ListenAddr is the address on which the SSH server will listen.
Expand Down Expand Up @@ -151,7 +153,9 @@ type Config struct {

// Environ returns the config as a list of environment variables.
func (c *Config) Environ() []string {
envs := []string{}
envs := []string{
fmt.Sprintf("SOFT_SERVE_BIN_PATH=%s", binPath),
}
if c == nil {
return envs
}
Expand Down Expand Up @@ -419,3 +423,12 @@ func parseAuthKeys(aks []string) []ssh.PublicKey {
func (c *Config) AdminKeys() []ssh.PublicKey {
return parseAuthKeys(c.InitialAdminKeys)
}

func init() {
ex, err := os.Executable()
if err != nil {
ex = "soft"
}

Check warning on line 431 in pkg/config/config.go

View check run for this annotation

Codecov / codecov/patch

pkg/config/config.go#L430-L431

Added lines #L430 - L431 were not covered by tests
ex = filepath.ToSlash(ex)
binPath = ex
}
12 changes: 2 additions & 10 deletions pkg/hooks/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,6 @@ func GenerateHooks(_ context.Context, cfg *config.Config, repo string) error {
return err
}

ex, err := os.Executable()
if err != nil {
return err
}

// Convert to forward slashes for Windows.
ex = filepath.ToSlash(ex)

for _, hook := range []string{
PreReceiveHook,
UpdateHook,
Expand Down Expand Up @@ -78,7 +70,7 @@ func GenerateHooks(_ context.Context, cfg *config.Config, repo string) error {
Hook string
Args string
}{
Executable: ex,
Executable: "\"${SOFT_SERVE_BIN_PATH}\"",
Hook: hook,
Args: args,
}); err != nil {
Expand All @@ -88,7 +80,7 @@ func GenerateHooks(_ context.Context, cfg *config.Config, repo string) error {

// Write the soft-serve hook inside ${hook}.d directory.
hp = filepath.Join(hp, "soft-serve")
err = os.WriteFile(hp, data.Bytes(), os.ModePerm) //nolint:gosec
err := os.WriteFile(hp, data.Bytes(), os.ModePerm) //nolint:gosec
if err != nil {
log.WithPrefix("hooks").Error("failed to write hook", "err", err)
continue
Expand Down

0 comments on commit d9c99e0

Please sign in to comment.