Skip to content

Commit 67f3d34

Browse files
committed
chore(deps): Pull in Git client changes from Argo CD v2.11.2
Signed-off-by: jannfis <jann@mistrust.net>
1 parent eb1d8d3 commit 67f3d34

File tree

13 files changed

+1444
-214
lines changed

13 files changed

+1444
-214
lines changed

ext/git/client.go

Lines changed: 252 additions & 76 deletions
Large diffs are not rendered by default.

ext/git/client_test.go

Lines changed: 263 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,263 @@
1+
package git
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"os/exec"
7+
"path"
8+
"path/filepath"
9+
"testing"
10+
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
13+
)
14+
15+
func runCmd(workingDir string, name string, args ...string) error {
16+
cmd := exec.Command(name, args...)
17+
cmd.Dir = workingDir
18+
cmd.Stdout = os.Stdout
19+
cmd.Stderr = os.Stderr
20+
return cmd.Run()
21+
}
22+
23+
func _createEmptyGitRepo() (string, error) {
24+
tempDir, err := os.MkdirTemp("", "")
25+
if err != nil {
26+
return tempDir, err
27+
}
28+
29+
err = runCmd(tempDir, "git", "init")
30+
if err != nil {
31+
return tempDir, err
32+
}
33+
34+
err = runCmd(tempDir, "git", "commit", "-m", "Initial commit", "--allow-empty")
35+
return tempDir, err
36+
}
37+
38+
func Test_nativeGitClient_Fetch(t *testing.T) {
39+
tempDir, err := _createEmptyGitRepo()
40+
require.NoError(t, err)
41+
42+
client, err := NewClient(fmt.Sprintf("file://%s", tempDir), NopCreds{}, true, false, "")
43+
require.NoError(t, err)
44+
45+
err = client.Init()
46+
require.NoError(t, err)
47+
48+
err = client.Fetch("")
49+
assert.NoError(t, err)
50+
}
51+
52+
func Test_nativeGitClient_Fetch_Prune(t *testing.T) {
53+
tempDir, err := _createEmptyGitRepo()
54+
require.NoError(t, err)
55+
56+
client, err := NewClient(fmt.Sprintf("file://%s", tempDir), NopCreds{}, true, false, "")
57+
require.NoError(t, err)
58+
59+
err = client.Init()
60+
require.NoError(t, err)
61+
62+
err = runCmd(tempDir, "git", "branch", "test/foo")
63+
require.NoError(t, err)
64+
65+
err = client.Fetch("")
66+
assert.NoError(t, err)
67+
68+
err = runCmd(tempDir, "git", "branch", "-d", "test/foo")
69+
require.NoError(t, err)
70+
err = runCmd(tempDir, "git", "branch", "test/foo/bar")
71+
require.NoError(t, err)
72+
73+
err = client.Fetch("")
74+
assert.NoError(t, err)
75+
}
76+
77+
func Test_IsAnnotatedTag(t *testing.T) {
78+
tempDir := t.TempDir()
79+
client, err := NewClient(fmt.Sprintf("file://%s", tempDir), NopCreds{}, true, false, "")
80+
require.NoError(t, err)
81+
82+
err = client.Init()
83+
require.NoError(t, err)
84+
85+
p := path.Join(client.Root(), "README")
86+
f, err := os.Create(p)
87+
require.NoError(t, err)
88+
_, err = f.WriteString("Hello.")
89+
require.NoError(t, err)
90+
err = f.Close()
91+
require.NoError(t, err)
92+
93+
err = runCmd(client.Root(), "git", "add", "README")
94+
require.NoError(t, err)
95+
96+
err = runCmd(client.Root(), "git", "commit", "-m", "Initial commit", "-a")
97+
require.NoError(t, err)
98+
99+
atag := client.IsAnnotatedTag("master")
100+
assert.False(t, atag)
101+
102+
err = runCmd(client.Root(), "git", "tag", "some-tag", "-a", "-m", "Create annotated tag")
103+
require.NoError(t, err)
104+
atag = client.IsAnnotatedTag("some-tag")
105+
assert.True(t, atag)
106+
107+
// Tag effectually points to HEAD, so it's considered the same
108+
atag = client.IsAnnotatedTag("HEAD")
109+
assert.True(t, atag)
110+
111+
err = runCmd(client.Root(), "git", "rm", "README")
112+
assert.NoError(t, err)
113+
err = runCmd(client.Root(), "git", "commit", "-m", "remove README", "-a")
114+
assert.NoError(t, err)
115+
116+
// We moved on, so tag doesn't point to HEAD anymore
117+
atag = client.IsAnnotatedTag("HEAD")
118+
assert.False(t, atag)
119+
}
120+
121+
func Test_ChangedFiles(t *testing.T) {
122+
tempDir := t.TempDir()
123+
124+
client, err := NewClientExt(fmt.Sprintf("file://%s", tempDir), tempDir, NopCreds{}, true, false, "")
125+
require.NoError(t, err)
126+
127+
err = client.Init()
128+
require.NoError(t, err)
129+
130+
err = runCmd(client.Root(), "git", "commit", "-m", "Initial commit", "--allow-empty")
131+
require.NoError(t, err)
132+
133+
// Create a tag to have a second ref
134+
err = runCmd(client.Root(), "git", "tag", "some-tag")
135+
require.NoError(t, err)
136+
137+
p := path.Join(client.Root(), "README")
138+
f, err := os.Create(p)
139+
require.NoError(t, err)
140+
_, err = f.WriteString("Hello.")
141+
require.NoError(t, err)
142+
err = f.Close()
143+
require.NoError(t, err)
144+
145+
err = runCmd(client.Root(), "git", "add", "README")
146+
require.NoError(t, err)
147+
148+
err = runCmd(client.Root(), "git", "commit", "-m", "Changes", "-a")
149+
require.NoError(t, err)
150+
151+
previousSHA, err := client.LsRemote("some-tag")
152+
require.NoError(t, err)
153+
154+
commitSHA, err := client.LsRemote("HEAD")
155+
require.NoError(t, err)
156+
157+
// Invalid commits, error
158+
_, err = client.ChangedFiles("0000000000000000000000000000000000000000", "1111111111111111111111111111111111111111")
159+
require.Error(t, err)
160+
161+
// Not SHAs, error
162+
_, err = client.ChangedFiles(previousSHA, "HEAD")
163+
require.Error(t, err)
164+
165+
// Same commit, no changes
166+
changedFiles, err := client.ChangedFiles(commitSHA, commitSHA)
167+
require.NoError(t, err)
168+
assert.ElementsMatch(t, []string{}, changedFiles)
169+
170+
// Different ref, with changes
171+
changedFiles, err = client.ChangedFiles(previousSHA, commitSHA)
172+
require.NoError(t, err)
173+
assert.ElementsMatch(t, []string{"README"}, changedFiles)
174+
}
175+
176+
func Test_nativeGitClient_Submodule(t *testing.T) {
177+
tempDir, err := os.MkdirTemp("", "")
178+
require.NoError(t, err)
179+
180+
foo := filepath.Join(tempDir, "foo")
181+
err = os.Mkdir(foo, 0755)
182+
require.NoError(t, err)
183+
184+
err = runCmd(foo, "git", "init")
185+
require.NoError(t, err)
186+
187+
bar := filepath.Join(tempDir, "bar")
188+
err = os.Mkdir(bar, 0755)
189+
require.NoError(t, err)
190+
191+
err = runCmd(bar, "git", "init")
192+
require.NoError(t, err)
193+
194+
err = runCmd(bar, "git", "commit", "-m", "Initial commit", "--allow-empty")
195+
require.NoError(t, err)
196+
197+
// Embed repository bar into repository foo
198+
t.Setenv("GIT_ALLOW_PROTOCOL", "file")
199+
err = runCmd(foo, "git", "submodule", "add", bar)
200+
require.NoError(t, err)
201+
202+
err = runCmd(foo, "git", "commit", "-m", "Initial commit")
203+
require.NoError(t, err)
204+
205+
tempDir, err = os.MkdirTemp("", "")
206+
require.NoError(t, err)
207+
208+
// Clone foo
209+
err = runCmd(tempDir, "git", "clone", foo)
210+
require.NoError(t, err)
211+
212+
client, err := NewClient(fmt.Sprintf("file://%s", foo), NopCreds{}, true, false, "")
213+
require.NoError(t, err)
214+
215+
err = client.Init()
216+
require.NoError(t, err)
217+
218+
err = client.Fetch("")
219+
assert.NoError(t, err)
220+
221+
commitSHA, err := client.LsRemote("HEAD")
222+
assert.NoError(t, err)
223+
224+
// Call Checkout() with submoduleEnabled=false.
225+
err = client.Checkout(commitSHA, false)
226+
assert.NoError(t, err)
227+
228+
// Check if submodule url does not exist in .git/config
229+
err = runCmd(client.Root(), "git", "config", "submodule.bar.url")
230+
assert.Error(t, err)
231+
232+
// Call Submodule() via Checkout() with submoduleEnabled=true.
233+
err = client.Checkout(commitSHA, true)
234+
assert.NoError(t, err)
235+
236+
// Check if the .gitmodule URL is reflected in .git/config
237+
cmd := exec.Command("git", "config", "submodule.bar.url")
238+
cmd.Dir = client.Root()
239+
result, err := cmd.Output()
240+
assert.NoError(t, err)
241+
assert.Equal(t, bar+"\n", string(result))
242+
243+
// Change URL of submodule bar
244+
err = runCmd(client.Root(), "git", "config", "--file=.gitmodules", "submodule.bar.url", bar+"baz")
245+
require.NoError(t, err)
246+
247+
// Call Submodule()
248+
err = client.Submodule()
249+
assert.NoError(t, err)
250+
251+
// Check if the URL change in .gitmodule is reflected in .git/config
252+
cmd = exec.Command("git", "config", "submodule.bar.url")
253+
cmd.Dir = client.Root()
254+
result, err = cmd.Output()
255+
assert.NoError(t, err)
256+
assert.Equal(t, bar+"baz\n", string(result))
257+
}
258+
259+
func TestNewClient_invalidSSHURL(t *testing.T) {
260+
client, err := NewClient("ssh://bitbucket.org:org/repo", NopCreds{}, false, false, "")
261+
assert.Nil(t, client)
262+
assert.ErrorIs(t, err, ErrInvalidRepoURL)
263+
}

0 commit comments

Comments
 (0)