-
Notifications
You must be signed in to change notification settings - Fork 220
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: handle
run
command in skip/only settings (#634)
* feat: handle `run` command in skip/only settings * chore: add a testscript * fix: call skip commands via shell * fix: try to use command for windows * ci: run integration tests on Windows * ci: checking windows section in testscript * ci: test another syntax testscript * ci: make it work with windows --------- Co-authored-by: Valentin Kiselev <mrexox@evilmartians.com>
- Loading branch information
1 parent
6ba7b10
commit e9ca955
Showing
18 changed files
with
279 additions
and
56 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
package config | ||
|
||
import ( | ||
"os/exec" | ||
"runtime" | ||
) | ||
|
||
type Exec interface { | ||
Cmd(commandLine string) bool | ||
} | ||
|
||
type osExec struct{} | ||
|
||
// NewOsExec returns an object that executes given commands in the OS. | ||
func NewOsExec() Exec { | ||
return &osExec{} | ||
} | ||
|
||
// Cmd runs plain string command. It checks only exit code and returns bool value. | ||
func (o *osExec) Cmd(commandLine string) bool { | ||
if commandLine == "" { | ||
return false | ||
} | ||
|
||
var cmd *exec.Cmd | ||
if runtime.GOOS == "windows" { | ||
cmd = exec.Command("powershell", "-Command", commandLine) | ||
} else { | ||
cmd = exec.Command("sh", "-c", commandLine) | ||
} | ||
|
||
err := cmd.Run() | ||
|
||
return err == nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
package config | ||
|
||
import ( | ||
"github.com/gobwas/glob" | ||
|
||
"github.com/evilmartians/lefthook/internal/git" | ||
"github.com/evilmartians/lefthook/internal/log" | ||
) | ||
|
||
type SkipChecker struct { | ||
Executor Exec | ||
} | ||
|
||
func NewSkipChecker(executor Exec) *SkipChecker { | ||
if executor == nil { | ||
executor = NewOsExec() | ||
} | ||
|
||
return &SkipChecker{Executor: executor} | ||
} | ||
|
||
func (sc *SkipChecker) Check(gitState git.State, skip interface{}, only interface{}) bool { | ||
if skip != nil { | ||
if sc.matches(gitState, skip) { | ||
return true | ||
} | ||
} | ||
|
||
if only != nil { | ||
return !sc.matches(gitState, only) | ||
} | ||
|
||
return false | ||
} | ||
|
||
func (sc *SkipChecker) matches(gitState git.State, value interface{}) bool { | ||
switch typedValue := value.(type) { | ||
case bool: | ||
return typedValue | ||
case string: | ||
return typedValue == gitState.Step | ||
case []interface{}: | ||
return sc.matchesSlices(gitState, typedValue) | ||
} | ||
return false | ||
} | ||
|
||
func (sc *SkipChecker) matchesSlices(gitState git.State, slice []interface{}) bool { | ||
for _, state := range slice { | ||
switch typedState := state.(type) { | ||
case string: | ||
if typedState == gitState.Step { | ||
return true | ||
} | ||
case map[string]interface{}: | ||
if sc.matchesRef(gitState, typedState) { | ||
return true | ||
} | ||
|
||
if sc.matchesCommands(typedState) { | ||
return true | ||
} | ||
} | ||
} | ||
|
||
return false | ||
} | ||
|
||
func (sc *SkipChecker) matchesRef(gitState git.State, typedState map[string]interface{}) bool { | ||
ref, ok := typedState["ref"].(string) | ||
if !ok { | ||
return false | ||
} | ||
|
||
if ref == gitState.Branch { | ||
return true | ||
} | ||
|
||
g := glob.MustCompile(ref) | ||
|
||
return g.Match(gitState.Branch) | ||
} | ||
|
||
func (sc *SkipChecker) matchesCommands(typedState map[string]interface{}) bool { | ||
commandLine, ok := typedState["run"].(string) | ||
if !ok { | ||
return false | ||
} | ||
|
||
result := sc.Executor.Cmd(commandLine) | ||
|
||
log.Debugf("[lefthook] skip/only cmd: %s, result: %t", commandLine, result) | ||
|
||
return result | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
[windows] skip | ||
|
||
exec git init | ||
exec lefthook add pre-commit | ||
! stderr . | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
[windows] skip | ||
|
||
exec git init | ||
exec lefthook dump | ||
cmp stdout lefthook-dumped.yml | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
[windows] skip | ||
|
||
exec git init | ||
exec lefthook install | ||
exec git config user.email "you@example.com" | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
[windows] skip | ||
|
||
exec git init | ||
exec lefthook install | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
[windows] skip | ||
|
||
exec git init | ||
exec lefthook install | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
[windows] skip | ||
|
||
chmod 0700 hook.sh | ||
chmod 0700 commit-with-interrupt.sh | ||
exec git init | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
[windows] skip | ||
|
||
exec git init | ||
exec git add -A | ||
exec lefthook run skip | ||
! stdout 'Ha-ha!' | ||
exec lefthook run no-skip | ||
stdout 'Ha-ha!' | ||
|
||
exec lefthook run skip-var | ||
! stdout 'Ha-ha!' | ||
|
||
env VAR=1 | ||
exec lefthook run skip-var | ||
stdout 'Ha-ha!' | ||
|
||
-- lefthook.yml -- | ||
skip_output: | ||
- skips | ||
- meta | ||
- summary | ||
- execution_info | ||
skip: | ||
skip: | ||
- run: test 1 -eq 1 | ||
commands: | ||
echo: | ||
run: echo 'Ha-ha!' | ||
|
||
no-skip: | ||
skip: | ||
- run: "[ 1 -eq 0 ]" | ||
commands: | ||
echo: | ||
run: echo 'Ha-ha!' | ||
|
||
skip-var: | ||
skip: | ||
- run: test -z $VAR | ||
commands: | ||
echo: | ||
run: echo 'Ha-ha!' |
Oops, something went wrong.