blob: dd2a8eb43c3e8fee54451188900d7b71cc773322 [file] [log] [blame]
Jack Neusfc3b5772019-07-03 11:18:42 -06001// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4package git
5
6import (
Jack Neusabdbe192019-07-15 12:23:22 -06007 "fmt"
Jack Neus0296c732019-07-17 09:35:01 -06008 "io/ioutil"
9 "os"
10 "path/filepath"
Jack Neusb49819f2021-03-01 23:37:34 +000011 "reflect"
Jack Neusfc3b5772019-07-03 11:18:42 -060012 "regexp"
Jack Neusfc3b5772019-07-03 11:18:42 -060013 "testing"
Jack Neus1f489f62019-08-06 12:01:54 -060014
Jack Neusb49819f2021-03-01 23:37:34 +000015 "go.chromium.org/chromiumos/infra/go/internal/assert"
Jack Neus1f489f62019-08-06 12:01:54 -060016 "go.chromium.org/chromiumos/infra/go/internal/cmd"
Jack Neus5e583582019-08-16 10:57:39 -060017 "go.chromium.org/chromiumos/infra/go/internal/util"
Jack Neusfc3b5772019-07-03 11:18:42 -060018)
19
Jack Neus07511722019-07-12 15:41:10 -060020func TestRunGit_success(t *testing.T) {
21 CommandRunnerImpl = cmd.FakeCommandRunner{
22 ExpectedDir: "myrepo",
23 ExpectedCmd: []string{"git", "log"},
24 Stdout: "success",
25 }
26
27 output, err := RunGit("myrepo", []string{"log"})
28 assert.NilError(t, err)
Jack Neusb49819f2021-03-01 23:37:34 +000029 assert.StringsEqual(t, output.Stdout, "success")
Jack Neusfc3b5772019-07-03 11:18:42 -060030}
31
Jack Neus07511722019-07-12 15:41:10 -060032func TestRunGit_error(t *testing.T) {
33 CommandRunnerImpl = cmd.FakeCommandRunner{
34 ExpectedDir: "myrepo",
35 ExpectedCmd: []string{"git", "log"},
36 Stdout: "I don't feel so go--",
37 Stderr: "sudden death",
38 FailCommand: true,
Jack Neusfc3b5772019-07-03 11:18:42 -060039 }
Jack Neusfc3b5772019-07-03 11:18:42 -060040
Jack Neus07511722019-07-12 15:41:10 -060041 output, err := RunGit("myrepo", []string{"log"})
42 assert.Assert(t, err != nil)
Jack Neusb49819f2021-03-01 23:37:34 +000043 assert.StringsEqual(t, output.Stderr, "sudden death")
Jack Neusfc3b5772019-07-03 11:18:42 -060044}
45
46func TestStripRefsHead(t *testing.T) {
Jack Neusb49819f2021-03-01 23:37:34 +000047 assert.StringsEqual(t, StripRefsHead("refs/heads/foo"), "foo")
48 assert.StringsEqual(t, StripRefsHead("foo"), "foo")
Jack Neusfc3b5772019-07-03 11:18:42 -060049}
50
51func TestStripRefs(t *testing.T) {
Jack Neusb49819f2021-03-01 23:37:34 +000052 assert.StringsEqual(t, StripRefs("refs/remotes/origin/foo"), "foo")
53 assert.StringsEqual(t, StripRefs("refs/heads/foo"), "foo")
54 assert.StringsEqual(t, StripRefs("foo"), "foo")
Jack Neusfc3b5772019-07-03 11:18:42 -060055}
56
57func TestNormalizeRef(t *testing.T) {
Jack Neusb49819f2021-03-01 23:37:34 +000058 assert.StringsEqual(t, NormalizeRef("refs/heads/foo"), "refs/heads/foo")
59 assert.StringsEqual(t, NormalizeRef("foo"), "refs/heads/foo")
Jack Neusfc3b5772019-07-03 11:18:42 -060060}
61
Jack Neuse2370372019-08-14 17:25:16 -060062func TestIsSHA(t *testing.T) {
63 assert.Assert(t, IsSHA("4f4fad584e9c2735af5131f15b697376a3327de5"))
64 assert.Assert(t, !IsSHA("refs/heads/master"))
65}
66
Jack Neusfc3b5772019-07-03 11:18:42 -060067func TestGetCurrentBranch_success(t *testing.T) {
68 fakeGitRepo := "top-secret-project"
69 fakeGitData := "refs/heads/current-branch"
70
Jack Neus07511722019-07-12 15:41:10 -060071 CommandRunnerImpl = cmd.FakeCommandRunner{
72 ExpectedDir: fakeGitRepo,
73 Stdout: fakeGitData,
Jack Neusfc3b5772019-07-03 11:18:42 -060074 }
Jack Neusb49819f2021-03-01 23:37:34 +000075 assert.StringsEqual(t, GetCurrentBranch(fakeGitRepo), "current-branch")
Jack Neusfc3b5772019-07-03 11:18:42 -060076}
77
78func TestGetCurrentBranch_failure(t *testing.T) {
Jack Neus07511722019-07-12 15:41:10 -060079 CommandRunnerImpl = cmd.FakeCommandRunner{
80 FailCommand: true,
Jack Neusfc3b5772019-07-03 11:18:42 -060081 }
Jack Neusb49819f2021-03-01 23:37:34 +000082 assert.StringsEqual(t, GetCurrentBranch("project"), "")
Jack Neusfc3b5772019-07-03 11:18:42 -060083}
84
85func TestMatchBranchName_success(t *testing.T) {
86 fakeGitRepo := "top-secret-project"
87 fakeGitData := "e9cb56bd9af9365b43f82cecf28cc76d49df1f72 refs/heads/foo\n" +
88 "f9c1bb630f4475058d4a9db4aea52fc89d8f7b0d refs/heads/bar\n" +
89 "2102915989de21d9251c11f0a7b5307e175e7677 refs/heads/foobar\n" +
90 "04975f9439ff75502b33d9491155692736e05b07 refs/heads/baz\n"
91
Jack Neus07511722019-07-12 15:41:10 -060092 CommandRunnerImpl = cmd.FakeCommandRunner{
Jack Neus901a6bf2019-07-22 08:30:07 -060093 ExpectedCmd: []string{"git", "show-ref"},
Jack Neus07511722019-07-12 15:41:10 -060094 ExpectedDir: fakeGitRepo,
95 Stdout: fakeGitData,
Jack Neusfc3b5772019-07-03 11:18:42 -060096 }
97
98 expectedMatches := []string{"refs/heads/foo", "refs/heads/foobar"}
99 branches, err := MatchBranchName(fakeGitRepo, regexp.MustCompile("Foo"))
100 assert.NilError(t, err)
Jack Neusb49819f2021-03-01 23:37:34 +0000101 if !reflect.DeepEqual(expectedMatches, branches) {
102 t.Fatalf("branches mismatch: got %v, expected %v", branches, expectedMatches)
103 }
Jack Neusfc3b5772019-07-03 11:18:42 -0600104
105 expectedMatches = []string{"refs/heads/foo"}
106 branches, err = MatchBranchName(fakeGitRepo, regexp.MustCompile("Foo$"))
107 assert.NilError(t, err)
Jack Neusb49819f2021-03-01 23:37:34 +0000108 if !reflect.DeepEqual(expectedMatches, branches) {
109 t.Fatalf("branches mismatch: got %v, expected %v", branches, expectedMatches)
110 }
Jack Neusfc3b5772019-07-03 11:18:42 -0600111}
112
Jack Neus10e6a122019-07-18 10:17:44 -0600113func TestMatchBranchNameWithNamespace_success(t *testing.T) {
114 fakeGitRepo := "top-secret-project"
115 fakeGitData := "e9cb56bd9af9365b43f82cecf28cc76d49df1f72 refs/changes/foo\n" +
116 "f9c1bb630f4475058d4a9db4aea52fc89d8f7b0d refs/changes/bar\n" +
117 "2102915989de21d9251c11f0a7b5307e175e7677 refs/heads/foobar\n" +
118 "04975f9439ff75502b33d9491155692736e05b07 refs/heads/baz\n"
119
120 CommandRunnerImpl = cmd.FakeCommandRunner{
Jack Neus901a6bf2019-07-22 08:30:07 -0600121 ExpectedCmd: []string{"git", "show-ref"},
Jack Neus10e6a122019-07-18 10:17:44 -0600122 ExpectedDir: fakeGitRepo,
123 Stdout: fakeGitData,
124 }
125
126 expectedMatches := []string{"foobar"}
127 pattern := regexp.MustCompile("FOO")
128 namespace := regexp.MustCompile("refs/heads/")
129 branches, err := MatchBranchNameWithNamespace(fakeGitRepo, pattern, namespace)
130 assert.NilError(t, err)
Jack Neusb49819f2021-03-01 23:37:34 +0000131 if !reflect.DeepEqual(expectedMatches, branches) {
132 t.Fatalf("branches mismatch: got %v, expected %v", branches, expectedMatches)
133 }
Jack Neus10e6a122019-07-18 10:17:44 -0600134}
135
Jack Neusfc3b5772019-07-03 11:18:42 -0600136func TestGetRepoRevision(t *testing.T) {
137 sha := "6446dfef4b55689046395c2db7ba7c35377927fe"
Jack Neus07511722019-07-12 15:41:10 -0600138 CommandRunnerImpl = cmd.FakeCommandRunner{
139 ExpectedCmd: []string{"git", "rev-parse", "HEAD"},
140 ExpectedDir: "project",
141 Stdout: sha,
Jack Neusfc3b5772019-07-03 11:18:42 -0600142 }
Jack Neusa7287522019-07-23 16:36:18 -0600143 res, err := GetGitRepoRevision("project", "")
Jack Neusfc3b5772019-07-03 11:18:42 -0600144 assert.NilError(t, err)
Jack Neusb49819f2021-03-01 23:37:34 +0000145 assert.StringsEqual(t, res, sha)
Jack Neusfc3b5772019-07-03 11:18:42 -0600146}
Jack Neusabdbe192019-07-15 12:23:22 -0600147
Jack Neusa7287522019-07-23 16:36:18 -0600148func TestIsReachable_true(t *testing.T) {
149 fakeGitRepo := "gitRepo"
150 toRef := "beef"
151 fromRef := "deaf"
152
153 CommandRunnerImpl = cmd.FakeCommandRunner{
154 ExpectedCmd: []string{"git", "merge-base", "--is-ancestor", toRef, fromRef},
155 ExpectedDir: fakeGitRepo,
156 }
157
158 ok, err := IsReachable(fakeGitRepo, toRef, fromRef)
159 assert.NilError(t, err)
160 assert.Assert(t, ok)
161}
162
163func TestIsReachable_false(t *testing.T) {
164 fakeGitRepo := "gitRepo"
165 toRef := "beef"
166 fromRef := "deaf"
167
168 CommandRunnerImpl = cmd.FakeCommandRunner{
169 ExpectedCmd: []string{"git", "merge-base", "--is-ancestor", toRef, fromRef},
170 ExpectedDir: fakeGitRepo,
171 FailCommand: true,
172 FailError: "exit status 1",
173 }
174
175 ok, err := IsReachable(fakeGitRepo, toRef, fromRef)
176 assert.NilError(t, err)
177 assert.Assert(t, !ok)
178}
179
Jack Neus04f4edc2019-07-31 16:42:00 -0600180func TestIsReachable_self(t *testing.T) {
181 CommandRunnerImpl = cmd.RealCommandRunner{}
182
183 tmpDir := "gittest_tmp_dir"
184 tmpDir, err := ioutil.TempDir("", tmpDir)
185 defer os.RemoveAll(tmpDir)
186
187 assert.NilError(t, err)
188 // Create repo.
189 assert.NilError(t, Init(tmpDir, false))
190 // Make commit.
191 commit, err := CommitEmpty(tmpDir, "empty commit")
192 assert.NilError(t, err)
193 // Check that a SHA is reachable from itself.
194 ok, err := IsReachable(tmpDir, commit, commit)
195 assert.NilError(t, err)
196 assert.Assert(t, ok)
197}
198
Jack Neusabdbe192019-07-15 12:23:22 -0600199func TestCreateBranch(t *testing.T) {
200 fakeGitRepo := "top-secret-project"
201 branchName := "project z"
202
203 CommandRunnerImpl = cmd.FakeCommandRunner{
204 ExpectedDir: fakeGitRepo,
Jack Neus0296c732019-07-17 09:35:01 -0600205 ExpectedCmd: []string{"git", "checkout", "-B", branchName},
Jack Neusabdbe192019-07-15 12:23:22 -0600206 }
207 assert.NilError(t, CreateBranch(fakeGitRepo, branchName))
208}
209
Jack Neus0296c732019-07-17 09:35:01 -0600210func TestCreateTrackingBranch(t *testing.T) {
211 fakeGitRepo := "repo"
212 branchName := "branch"
213 remoteRef := RemoteRef{
214 Remote: "remote",
215 Ref: "master",
216 }
217 refspec := fmt.Sprintf("%s/%s", remoteRef.Remote, remoteRef.Ref)
218
219 CommandRunnerImpl = &cmd.FakeCommandRunnerMulti{
220 CommandRunners: []cmd.FakeCommandRunner{
221 {
222 ExpectedDir: fakeGitRepo,
223 ExpectedCmd: []string{"git", "fetch", remoteRef.Remote, remoteRef.Ref},
224 },
225 {
226 ExpectedDir: fakeGitRepo,
227 ExpectedCmd: []string{"git", "checkout", "-b", branchName, "-t", refspec},
228 },
229 },
230 }
231
232 err := CreateTrackingBranch(fakeGitRepo, branchName, remoteRef)
233 assert.NilError(t, err)
234}
235
Jack Neusabdbe192019-07-15 12:23:22 -0600236func TestCommitAll(t *testing.T) {
237 fakeGitRepo := "repo"
238 commitMsg := "commit"
239
240 CommandRunnerImpl = &cmd.FakeCommandRunnerMulti{
241 CommandRunners: []cmd.FakeCommandRunner{
242 {
243 ExpectedDir: fakeGitRepo,
244 ExpectedCmd: []string{"git", "add", "-A"},
245 },
246 {
247 ExpectedDir: fakeGitRepo,
248 ExpectedCmd: []string{"git", "commit", "-m", commitMsg},
249 },
Jack Neusf116fae2019-07-24 15:05:03 -0600250 {
251 ExpectedDir: fakeGitRepo,
252 ExpectedCmd: []string{"git", "rev-parse", "HEAD"},
253 Stdout: "abcde12345\n\n\t\n",
254 },
Jack Neusabdbe192019-07-15 12:23:22 -0600255 },
256 }
257
Jack Neusf116fae2019-07-24 15:05:03 -0600258 commit, err := CommitAll(fakeGitRepo, commitMsg)
Jack Neusabdbe192019-07-15 12:23:22 -0600259 assert.NilError(t, err)
Jack Neusb49819f2021-03-01 23:37:34 +0000260 assert.StringsEqual(t, commit, "abcde12345")
Jack Neusabdbe192019-07-15 12:23:22 -0600261}
262
Jack Neus7440c762019-07-22 10:45:18 -0600263func TestCommitEmpty(t *testing.T) {
264 fakeGitRepo := "repo"
265 commitMsg := "commit"
266
Jack Neusf116fae2019-07-24 15:05:03 -0600267 CommandRunnerImpl = &cmd.FakeCommandRunnerMulti{
268 CommandRunners: []cmd.FakeCommandRunner{
269 {
270 ExpectedDir: fakeGitRepo,
271 ExpectedCmd: []string{"git", "commit", "-m", commitMsg, "--allow-empty"},
272 },
273 {
274 ExpectedDir: fakeGitRepo,
275 ExpectedCmd: []string{"git", "rev-parse", "HEAD"},
276 Stdout: "abcde12345\n\n\t\n",
277 },
278 },
Jack Neus7440c762019-07-22 10:45:18 -0600279 }
280
Jack Neusf116fae2019-07-24 15:05:03 -0600281 commit, err := CommitEmpty(fakeGitRepo, commitMsg)
Jack Neus7440c762019-07-22 10:45:18 -0600282 assert.NilError(t, err)
Jack Neusb49819f2021-03-01 23:37:34 +0000283 assert.StringsEqual(t, commit, "abcde12345")
Jack Neus7440c762019-07-22 10:45:18 -0600284}
285
Jack Neuseb25f722019-07-19 16:33:20 -0600286func TestPushRef(t *testing.T) {
Jack Neus7440c762019-07-22 10:45:18 -0600287 fakeGitRepo := "repo"
288 localRef := "commitId"
289
290 remoteRef := RemoteRef{
291 Remote: "remote",
292 Ref: "ref",
293 }
294
295 pushStr := fmt.Sprintf("%s:%s", localRef, remoteRef.Ref)
296 CommandRunnerImpl = cmd.FakeCommandRunner{
297 ExpectedDir: fakeGitRepo,
Jack Neusab8df5b2019-08-16 13:43:12 -0600298 ExpectedCmd: []string{"git", "push", remoteRef.Remote, pushStr, "--dry-run", "--force"},
Jack Neus7440c762019-07-22 10:45:18 -0600299 }
300
Jack Neusab8df5b2019-08-16 13:43:12 -0600301 opts := GitOpts{
302 DryRun: true,
303 Force: true,
304 }
305 err := PushRef(fakeGitRepo, localRef, remoteRef, opts)
Jack Neus7440c762019-07-22 10:45:18 -0600306 assert.NilError(t, err)
307}
308
Jack Neus0296c732019-07-17 09:35:01 -0600309func TestInit(t *testing.T) {
310 fakeGitRepo := "top-secret-project"
311
312 CommandRunnerImpl = cmd.FakeCommandRunner{
313 ExpectedDir: fakeGitRepo,
314 ExpectedCmd: []string{"git", "init"},
315 }
316 assert.NilError(t, Init(fakeGitRepo, false))
317}
318
319func TestInit_bare(t *testing.T) {
320 fakeGitRepo := "top-secret-project"
321
322 CommandRunnerImpl = cmd.FakeCommandRunner{
323 ExpectedDir: fakeGitRepo,
324 ExpectedCmd: []string{"git", "init", "--bare"},
325 }
326 assert.NilError(t, Init(fakeGitRepo, true))
327}
328
329func TestAddRemote(t *testing.T) {
330 fakeGitRepo := "repo"
331 remoteName := "remote"
332 remoteLoc := "remote/"
333
334 CommandRunnerImpl = cmd.FakeCommandRunner{
335 ExpectedDir: fakeGitRepo,
336 ExpectedCmd: []string{"git", "remote", "add", remoteName, remoteLoc},
337 }
338 assert.NilError(t, AddRemote(fakeGitRepo, remoteName, remoteLoc))
339}
340
341func TestCheckout(t *testing.T) {
342 CommandRunnerImpl = cmd.RealCommandRunner{}
343
344 tmpDir := "gittest_tmp_dir"
345 tmpDir, err := ioutil.TempDir("", tmpDir)
346 defer os.RemoveAll(tmpDir)
347
348 assert.NilError(t, err)
349 // Create repo.
350 assert.NilError(t, Init(tmpDir, false))
351 // Create first branch.
352 assert.NilError(t, CreateBranch(tmpDir, "branch1"))
353 // In order for the ref to be created, need to commit something.
354 assert.NilError(t, ioutil.WriteFile(filepath.Join(tmpDir, "foo"), []byte("foo"), 0644))
Jack Neusf116fae2019-07-24 15:05:03 -0600355 _, err = CommitAll(tmpDir, "init commit")
356 assert.NilError(t, err)
Jack Neus0296c732019-07-17 09:35:01 -0600357 // Create second branch (will switch to this branch).
358 assert.NilError(t, CreateBranch(tmpDir, "branch2"))
359 // Try checking out a nonexistent branch.
360 assert.ErrorContains(t, Checkout(tmpDir, "branch3"), "did not match any")
361 // Try checking out the first branch.
362 assert.NilError(t, Checkout(tmpDir, "branch1"))
363}
364
365func TestDeleteBranch_success(t *testing.T) {
366 CommandRunnerImpl = cmd.RealCommandRunner{}
367
368 tmpDir := "gittest_tmp_dir"
369 tmpDir, err := ioutil.TempDir("", tmpDir)
370 defer os.RemoveAll(tmpDir)
371 branchName := "newbranch"
372
373 assert.NilError(t, err)
374 // Create repo.
375 assert.NilError(t, Init(tmpDir, false))
376 // Create master branch.
377 assert.NilError(t, CreateBranch(tmpDir, "master"))
378 // In order for the ref to be created, need to commit something.
379 assert.NilError(t, ioutil.WriteFile(filepath.Join(tmpDir, "foo"), []byte("foo"), 0644))
Jack Neusf116fae2019-07-24 15:05:03 -0600380 _, err = CommitAll(tmpDir, "init commit")
381 assert.NilError(t, err)
Jack Neus0296c732019-07-17 09:35:01 -0600382 // Create branch to be deleted.
383 assert.NilError(t, CreateBranch(tmpDir, branchName))
384 // Switch back to master.
385 assert.NilError(t, Checkout(tmpDir, "master"))
386 err = DeleteBranch(tmpDir, branchName, true)
387 assert.NilError(t, err)
388}
389
390func TestDeleteBranch_inBranch(t *testing.T) {
391 CommandRunnerImpl = cmd.RealCommandRunner{}
392
393 tmpDir := "gittest_tmp_dir"
394 tmpDir, err := ioutil.TempDir("", tmpDir)
395 defer os.RemoveAll(tmpDir)
396 branchName := "newbranch"
397
398 assert.NilError(t, err)
399 // Create repo.
400 assert.NilError(t, Init(tmpDir, false))
401 // Create branch.
402 assert.NilError(t, CreateBranch(tmpDir, branchName))
403 err = DeleteBranch(tmpDir, branchName, true)
404 assert.ErrorContains(t, err, "checked out")
405}
406
407func TestDeleteBranch_unmerged(t *testing.T) {
408 CommandRunnerImpl = cmd.RealCommandRunner{}
409
410 tmpDir := "gittest_tmp_dir"
411 tmpDir, err := ioutil.TempDir("", tmpDir)
412 defer os.RemoveAll(tmpDir)
413 branchName := "newbranch"
414
415 assert.NilError(t, err)
416 // Create repo.
417 assert.NilError(t, Init(tmpDir, false))
418 // Create master branch.
419 assert.NilError(t, CreateBranch(tmpDir, "master"))
420 // In order for the ref to be created, need to commit something.
421 assert.NilError(t, ioutil.WriteFile(filepath.Join(tmpDir, "foo"), []byte("foo"), 0644))
Jack Neusf116fae2019-07-24 15:05:03 -0600422 _, err = CommitAll(tmpDir, "init commit")
423 assert.NilError(t, err)
Jack Neus0296c732019-07-17 09:35:01 -0600424 // Create test branch.
425 assert.NilError(t, CreateBranch(tmpDir, branchName))
426 // Make a change to branch.
427 assert.NilError(t, ioutil.WriteFile(filepath.Join(tmpDir, "bar"), []byte("bar"), 0644))
Jack Neusf116fae2019-07-24 15:05:03 -0600428 _, err = CommitAll(tmpDir, "init commit")
429 assert.NilError(t, err)
Jack Neus0296c732019-07-17 09:35:01 -0600430 // Switch back to master.
431 assert.NilError(t, Checkout(tmpDir, "master"))
432 // Should not be able to delete.
433 assert.ErrorContains(t, DeleteBranch(tmpDir, branchName, false), "fully merged")
434}
435
436func TestClone(t *testing.T) {
437 dest := "foo/bar"
438 remote := "remote"
439
440 CommandRunnerImpl = cmd.FakeCommandRunner{
441 ExpectedDir: "foo",
442 ExpectedCmd: []string{"git", "clone", remote, "bar"},
443 }
444 assert.NilError(t, Clone(remote, dest))
445}
Jack Neus1f489f62019-08-06 12:01:54 -0600446
447func TestRemoteBranches(t *testing.T) {
448 CommandRunnerImpl = cmd.RealCommandRunner{}
449
450 local, err := ioutil.TempDir("", "gittest_tmp_dir")
451 defer os.RemoveAll(local)
452
453 remote, err := ioutil.TempDir("", "gittest_tmp_dir")
454 defer os.RemoveAll(remote)
455
456 assert.NilError(t, err)
457 // Create repos.
458 assert.NilError(t, Init(local, false))
459 assert.NilError(t, Init(remote, false))
460 // Create local master branch.
461 assert.NilError(t, CreateBranch(local, "master"))
462 // In order for the ref to be created, need to commit something.
463 assert.NilError(t, ioutil.WriteFile(filepath.Join(local, "foo"), []byte("foo"), 0644))
464 _, err = CommitAll(local, "init commit")
465 assert.NilError(t, err)
466 // Add remote.
467 assert.NilError(t, AddRemote(local, "remote", remote))
468 // Create remote branches.
469 remoteRef := RemoteRef{
470 Remote: "remote",
471 Ref: "foo",
472 }
Jack Neusab8df5b2019-08-16 13:43:12 -0600473 opts := GitOpts{
474 DryRun: false,
475 Force: true,
476 }
477 assert.NilError(t, PushRef(local, "HEAD", remoteRef, opts))
Jack Neus1f489f62019-08-06 12:01:54 -0600478 remoteRef.Ref = "bar"
Jack Neusab8df5b2019-08-16 13:43:12 -0600479 assert.NilError(t, PushRef(local, "HEAD", remoteRef, opts))
Jack Neus1f489f62019-08-06 12:01:54 -0600480
481 branches, err := RemoteBranches(local, "remote")
482 assert.NilError(t, err)
Jack Neus5e583582019-08-16 10:57:39 -0600483 assert.Assert(t, util.UnorderedEqual(branches, []string{"foo", "bar"}))
Jack Neus1f489f62019-08-06 12:01:54 -0600484 ok, err := RemoteHasBranch(local, "remote", "foo")
485 assert.NilError(t, err)
486 assert.Assert(t, ok)
487 ok, err = RemoteHasBranch(local, "remote", "baz")
488 assert.NilError(t, err)
489 assert.Assert(t, !ok)
490}
Mike Frysingerdfb710a2021-02-12 23:26:59 -0500491
492func TestResolveRemoteSymbolicRef(t *testing.T) {
493 remote := "remote"
494
495 CommandRunnerImpl = cmd.FakeCommandRunner{
496 ExpectedDir: "foo",
497 ExpectedCmd: []string{"git", "ls-remote", "-q", "--symref", "--exit-code", remote, "HEAD"},
498 Stdout: "ref: refs/heads/main\tHEAD\n5f6803b100bb3cd0f534e96e88c91373e8ed1c44\tHEAD\n",
499 }
500 ref, err := ResolveRemoteSymbolicRef("foo", remote, "HEAD")
501 assert.NilError(t, err)
Jack Neusb49819f2021-03-01 23:37:34 +0000502 assert.StringsEqual(t, ref, "refs/heads/main")
Mike Frysingerdfb710a2021-02-12 23:26:59 -0500503}