WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit b67165f

Browse files
committed
feat: verify git repository before running git diff
1 parent 6fc14d7 commit b67165f

File tree

3 files changed

+118
-0
lines changed

3 files changed

+118
-0
lines changed

cmd/hepler.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ func check() error {
1717
return errors.New("git command not found in your system's PATH. Please install Git and try again")
1818
}
1919

20+
// Check if current working directory is inside a Git repository.
21+
if !util.IsGitRepo() {
22+
return errors.New("not a git repository")
23+
}
24+
2025
// Apply configuration values from CLI flags to Viper
2126
if diffUnified != 3 {
2227
viper.Set("git.diff_unified", diffUnified)

util/util.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package util
22

33
import (
4+
"bytes"
45
"os/exec"
56
"strings"
67
)
@@ -35,3 +36,16 @@ func ConvertToMap(args []string) Data {
3536
}
3637
return m
3738
}
39+
40+
// IsGitRepo returns true if the current working directory is inside a Git work tree.
41+
func IsGitRepo() bool {
42+
cmd := exec.Command("git", "rev-parse", "--is-inside-work-tree")
43+
44+
var out bytes.Buffer
45+
cmd.Stdout = &out
46+
if err := cmd.Run(); err != nil {
47+
return false
48+
}
49+
50+
return strings.TrimSpace(out.String()) == "true"
51+
}

util/util_test.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package util
22

33
import (
44
"os"
5+
"os/exec"
6+
"path/filepath"
57
"reflect"
68
"testing"
79
)
@@ -82,3 +84,100 @@ func TestConvertToMap(t *testing.T) {
8284
})
8385
}
8486
}
87+
88+
func TestIsGitRepo(t *testing.T) {
89+
type fields struct {
90+
setup func(t *testing.T)
91+
want bool
92+
}
93+
94+
testCases := []struct {
95+
name string
96+
fields fields
97+
}{
98+
{
99+
name: "inside git repo root",
100+
fields: fields{
101+
want: true,
102+
setup: func(t *testing.T) {
103+
t.Helper()
104+
105+
tmpDir := t.TempDir()
106+
107+
cmd := exec.Command("git", "init")
108+
cmd.Dir = tmpDir
109+
if output, err := cmd.CombinedOutput(); err != nil {
110+
t.Fatalf("failed to init git repo: %v, output: %s", err, string(output))
111+
}
112+
113+
if err := os.Chdir(tmpDir); err != nil {
114+
t.Fatalf("failed to chdir to repo root: %v", err)
115+
}
116+
},
117+
},
118+
},
119+
{
120+
name: "inside git repo subdir",
121+
fields: fields{
122+
want: true,
123+
setup: func(t *testing.T) {
124+
t.Helper()
125+
126+
tmpDir := t.TempDir()
127+
128+
cmd := exec.Command("git", "init")
129+
cmd.Dir = tmpDir
130+
if output, err := cmd.CombinedOutput(); err != nil {
131+
t.Fatalf("failed to init git repo: %v, output: %s", err, string(output))
132+
}
133+
134+
subDir := filepath.Join(tmpDir, "subdir", "nested")
135+
if err := os.MkdirAll(subDir, 0o755); err != nil {
136+
t.Fatalf("failed to create subdir: %v", err)
137+
}
138+
139+
if err := os.Chdir(subDir); err != nil {
140+
t.Fatalf("failed to chdir to subdir: %v", err)
141+
}
142+
},
143+
},
144+
},
145+
{
146+
name: "outside git repo",
147+
fields: fields{
148+
want: false,
149+
setup: func(t *testing.T) {
150+
t.Helper()
151+
152+
tmpDir := t.TempDir()
153+
154+
if err := os.Chdir(tmpDir); err != nil {
155+
t.Fatalf("failed to chdir to temp dir: %v", err)
156+
}
157+
},
158+
},
159+
},
160+
}
161+
162+
for _, tc := range testCases {
163+
tc := tc
164+
t.Run(tc.name, func(t *testing.T) {
165+
origWD, err := os.Getwd()
166+
if err != nil {
167+
t.Fatalf("failed to get current working directory: %v", err)
168+
}
169+
t.Cleanup(func() {
170+
_ = os.Chdir(origWD)
171+
})
172+
173+
if tc.fields.setup != nil {
174+
tc.fields.setup(t)
175+
}
176+
177+
got := IsGitRepo()
178+
if got != tc.fields.want {
179+
t.Errorf("IsGitRepo() = %v; want %v", got, tc.fields.want)
180+
}
181+
})
182+
}
183+
}

0 commit comments

Comments
 (0)