blob: 5604ed112fe0a86fee934fcd1e16c882d5c7dee9 [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 Neusfc3b5772019-07-03 11:18:42 -06008 "gotest.tools/assert"
Jack Neus0296c732019-07-17 09:35:01 -06009 "io/ioutil"
10 "os"
11 "path/filepath"
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
15 "go.chromium.org/chromiumos/infra/go/internal/cmd"
16 "go.chromium.org/chromiumos/infra/go/internal/test_util"
Jack Neusfc3b5772019-07-03 11:18:42 -060017)
18
Jack Neus07511722019-07-12 15:41:10 -060019func TestRunGit_success(t *testing.T) {
20 CommandRunnerImpl = cmd.FakeCommandRunner{
21 ExpectedDir: "myrepo",
22 ExpectedCmd: []string{"git", "log"},
23 Stdout: "success",
24 }
25
26 output, err := RunGit("myrepo", []string{"log"})
27 assert.NilError(t, err)
28 assert.Equal(t, output.Stdout, "success")
Jack Neusfc3b5772019-07-03 11:18:42 -060029}
30
Jack Neus07511722019-07-12 15:41:10 -060031func TestRunGit_error(t *testing.T) {
32 CommandRunnerImpl = cmd.FakeCommandRunner{
33 ExpectedDir: "myrepo",
34 ExpectedCmd: []string{"git", "log"},
35 Stdout: "I don't feel so go--",
36 Stderr: "sudden death",
37 FailCommand: true,
Jack Neusfc3b5772019-07-03 11:18:42 -060038 }
Jack Neusfc3b5772019-07-03 11:18:42 -060039
Jack Neus07511722019-07-12 15:41:10 -060040 output, err := RunGit("myrepo", []string{"log"})
41 assert.Assert(t, err != nil)
42 assert.Equal(t, output.Stderr, "sudden death")
Jack Neusfc3b5772019-07-03 11:18:42 -060043}
44
45func TestStripRefsHead(t *testing.T) {
46 assert.Equal(t, StripRefsHead("refs/heads/foo"), "foo")
47 assert.Equal(t, StripRefsHead("foo"), "foo")
48}
49
50func TestStripRefs(t *testing.T) {
51 assert.Equal(t, StripRefs("refs/remotes/origin/foo"), "foo")
52 assert.Equal(t, StripRefs("refs/heads/foo"), "foo")
53 assert.Equal(t, StripRefs("foo"), "foo")
54}
55
56func TestNormalizeRef(t *testing.T) {
57 assert.Equal(t, NormalizeRef("refs/heads/foo"), "refs/heads/foo")
58 assert.Equal(t, NormalizeRef("foo"), "refs/heads/foo")
59}
60
Jack Neuse2370372019-08-14 17:25:16 -060061func TestIsSHA(t *testing.T) {
62 assert.Assert(t, IsSHA("4f4fad584e9c2735af5131f15b697376a3327de5"))
63 assert.Assert(t, !IsSHA("refs/heads/master"))
64}
65
Jack Neusfc3b5772019-07-03 11:18:42 -060066func TestGetCurrentBranch_success(t *testing.T) {
67 fakeGitRepo := "top-secret-project"
68 fakeGitData := "refs/heads/current-branch"
69
Jack Neus07511722019-07-12 15:41:10 -060070 CommandRunnerImpl = cmd.FakeCommandRunner{
71 ExpectedDir: fakeGitRepo,
72 Stdout: fakeGitData,
Jack Neusfc3b5772019-07-03 11:18:42 -060073 }
74 assert.Equal(t, GetCurrentBranch(fakeGitRepo), "current-branch")
75}
76
77func TestGetCurrentBranch_failure(t *testing.T) {
Jack Neus07511722019-07-12 15:41:10 -060078 CommandRunnerImpl = cmd.FakeCommandRunner{
79 FailCommand: true,
Jack Neusfc3b5772019-07-03 11:18:42 -060080 }
81 assert.Equal(t, GetCurrentBranch("project"), "")
82}
83
84func TestMatchBranchName_success(t *testing.T) {
85 fakeGitRepo := "top-secret-project"
86 fakeGitData := "e9cb56bd9af9365b43f82cecf28cc76d49df1f72 refs/heads/foo\n" +
87 "f9c1bb630f4475058d4a9db4aea52fc89d8f7b0d refs/heads/bar\n" +
88 "2102915989de21d9251c11f0a7b5307e175e7677 refs/heads/foobar\n" +
89 "04975f9439ff75502b33d9491155692736e05b07 refs/heads/baz\n"
90
Jack Neus07511722019-07-12 15:41:10 -060091 CommandRunnerImpl = cmd.FakeCommandRunner{
Jack Neus901a6bf2019-07-22 08:30:07 -060092 ExpectedCmd: []string{"git", "show-ref"},
Jack Neus07511722019-07-12 15:41:10 -060093 ExpectedDir: fakeGitRepo,
94 Stdout: fakeGitData,
Jack Neusfc3b5772019-07-03 11:18:42 -060095 }
96
97 expectedMatches := []string{"refs/heads/foo", "refs/heads/foobar"}
98 branches, err := MatchBranchName(fakeGitRepo, regexp.MustCompile("Foo"))
99 assert.NilError(t, err)
100 assert.DeepEqual(t, expectedMatches, branches)
101
102 expectedMatches = []string{"refs/heads/foo"}
103 branches, err = MatchBranchName(fakeGitRepo, regexp.MustCompile("Foo$"))
104 assert.NilError(t, err)
105 assert.DeepEqual(t, expectedMatches, branches)
106}
107
Jack Neus10e6a122019-07-18 10:17:44 -0600108func TestMatchBranchNameWithNamespace_success(t *testing.T) {
109 fakeGitRepo := "top-secret-project"
110 fakeGitData := "e9cb56bd9af9365b43f82cecf28cc76d49df1f72 refs/changes/foo\n" +
111 "f9c1bb630f4475058d4a9db4aea52fc89d8f7b0d refs/changes/bar\n" +
112 "2102915989de21d9251c11f0a7b5307e175e7677 refs/heads/foobar\n" +
113 "04975f9439ff75502b33d9491155692736e05b07 refs/heads/baz\n"
114
115 CommandRunnerImpl = cmd.FakeCommandRunner{
Jack Neus901a6bf2019-07-22 08:30:07 -0600116 ExpectedCmd: []string{"git", "show-ref"},
Jack Neus10e6a122019-07-18 10:17:44 -0600117 ExpectedDir: fakeGitRepo,
118 Stdout: fakeGitData,
119 }
120
121 expectedMatches := []string{"foobar"}
122 pattern := regexp.MustCompile("FOO")
123 namespace := regexp.MustCompile("refs/heads/")
124 branches, err := MatchBranchNameWithNamespace(fakeGitRepo, pattern, namespace)
125 assert.NilError(t, err)
126 assert.DeepEqual(t, expectedMatches, branches)
127}
128
Jack Neusfc3b5772019-07-03 11:18:42 -0600129func TestGetRepoRevision(t *testing.T) {
130 sha := "6446dfef4b55689046395c2db7ba7c35377927fe"
Jack Neus07511722019-07-12 15:41:10 -0600131 CommandRunnerImpl = cmd.FakeCommandRunner{
132 ExpectedCmd: []string{"git", "rev-parse", "HEAD"},
133 ExpectedDir: "project",
134 Stdout: sha,
Jack Neusfc3b5772019-07-03 11:18:42 -0600135 }
Jack Neusa7287522019-07-23 16:36:18 -0600136 res, err := GetGitRepoRevision("project", "")
Jack Neusfc3b5772019-07-03 11:18:42 -0600137 assert.NilError(t, err)
138 assert.Equal(t, res, sha)
139}
Jack Neusabdbe192019-07-15 12:23:22 -0600140
Jack Neusa7287522019-07-23 16:36:18 -0600141func TestIsReachable_true(t *testing.T) {
142 fakeGitRepo := "gitRepo"
143 toRef := "beef"
144 fromRef := "deaf"
145
146 CommandRunnerImpl = cmd.FakeCommandRunner{
147 ExpectedCmd: []string{"git", "merge-base", "--is-ancestor", toRef, fromRef},
148 ExpectedDir: fakeGitRepo,
149 }
150
151 ok, err := IsReachable(fakeGitRepo, toRef, fromRef)
152 assert.NilError(t, err)
153 assert.Assert(t, ok)
154}
155
156func TestIsReachable_false(t *testing.T) {
157 fakeGitRepo := "gitRepo"
158 toRef := "beef"
159 fromRef := "deaf"
160
161 CommandRunnerImpl = cmd.FakeCommandRunner{
162 ExpectedCmd: []string{"git", "merge-base", "--is-ancestor", toRef, fromRef},
163 ExpectedDir: fakeGitRepo,
164 FailCommand: true,
165 FailError: "exit status 1",
166 }
167
168 ok, err := IsReachable(fakeGitRepo, toRef, fromRef)
169 assert.NilError(t, err)
170 assert.Assert(t, !ok)
171}
172
Jack Neus04f4edc2019-07-31 16:42:00 -0600173func TestIsReachable_self(t *testing.T) {
174 CommandRunnerImpl = cmd.RealCommandRunner{}
175
176 tmpDir := "gittest_tmp_dir"
177 tmpDir, err := ioutil.TempDir("", tmpDir)
178 defer os.RemoveAll(tmpDir)
179
180 assert.NilError(t, err)
181 // Create repo.
182 assert.NilError(t, Init(tmpDir, false))
183 // Make commit.
184 commit, err := CommitEmpty(tmpDir, "empty commit")
185 assert.NilError(t, err)
186 // Check that a SHA is reachable from itself.
187 ok, err := IsReachable(tmpDir, commit, commit)
188 assert.NilError(t, err)
189 assert.Assert(t, ok)
190}
191
Jack Neusabdbe192019-07-15 12:23:22 -0600192func TestCreateBranch(t *testing.T) {
193 fakeGitRepo := "top-secret-project"
194 branchName := "project z"
195
196 CommandRunnerImpl = cmd.FakeCommandRunner{
197 ExpectedDir: fakeGitRepo,
Jack Neus0296c732019-07-17 09:35:01 -0600198 ExpectedCmd: []string{"git", "checkout", "-B", branchName},
Jack Neusabdbe192019-07-15 12:23:22 -0600199 }
200 assert.NilError(t, CreateBranch(fakeGitRepo, branchName))
201}
202
Jack Neus0296c732019-07-17 09:35:01 -0600203func TestCreateTrackingBranch(t *testing.T) {
204 fakeGitRepo := "repo"
205 branchName := "branch"
206 remoteRef := RemoteRef{
207 Remote: "remote",
208 Ref: "master",
209 }
210 refspec := fmt.Sprintf("%s/%s", remoteRef.Remote, remoteRef.Ref)
211
212 CommandRunnerImpl = &cmd.FakeCommandRunnerMulti{
213 CommandRunners: []cmd.FakeCommandRunner{
214 {
215 ExpectedDir: fakeGitRepo,
216 ExpectedCmd: []string{"git", "fetch", remoteRef.Remote, remoteRef.Ref},
217 },
218 {
219 ExpectedDir: fakeGitRepo,
220 ExpectedCmd: []string{"git", "checkout", "-b", branchName, "-t", refspec},
221 },
222 },
223 }
224
225 err := CreateTrackingBranch(fakeGitRepo, branchName, remoteRef)
226 assert.NilError(t, err)
227}
228
Jack Neusabdbe192019-07-15 12:23:22 -0600229func TestCommitAll(t *testing.T) {
230 fakeGitRepo := "repo"
231 commitMsg := "commit"
232
233 CommandRunnerImpl = &cmd.FakeCommandRunnerMulti{
234 CommandRunners: []cmd.FakeCommandRunner{
235 {
236 ExpectedDir: fakeGitRepo,
237 ExpectedCmd: []string{"git", "add", "-A"},
238 },
239 {
240 ExpectedDir: fakeGitRepo,
241 ExpectedCmd: []string{"git", "commit", "-m", commitMsg},
242 },
Jack Neusf116fae2019-07-24 15:05:03 -0600243 {
244 ExpectedDir: fakeGitRepo,
245 ExpectedCmd: []string{"git", "rev-parse", "HEAD"},
246 Stdout: "abcde12345\n\n\t\n",
247 },
Jack Neusabdbe192019-07-15 12:23:22 -0600248 },
249 }
250
Jack Neusf116fae2019-07-24 15:05:03 -0600251 commit, err := CommitAll(fakeGitRepo, commitMsg)
Jack Neusabdbe192019-07-15 12:23:22 -0600252 assert.NilError(t, err)
Jack Neusf116fae2019-07-24 15:05:03 -0600253 assert.Equal(t, commit, "abcde12345")
Jack Neusabdbe192019-07-15 12:23:22 -0600254}
255
Jack Neus7440c762019-07-22 10:45:18 -0600256func TestCommitEmpty(t *testing.T) {
257 fakeGitRepo := "repo"
258 commitMsg := "commit"
259
Jack Neusf116fae2019-07-24 15:05:03 -0600260 CommandRunnerImpl = &cmd.FakeCommandRunnerMulti{
261 CommandRunners: []cmd.FakeCommandRunner{
262 {
263 ExpectedDir: fakeGitRepo,
264 ExpectedCmd: []string{"git", "commit", "-m", commitMsg, "--allow-empty"},
265 },
266 {
267 ExpectedDir: fakeGitRepo,
268 ExpectedCmd: []string{"git", "rev-parse", "HEAD"},
269 Stdout: "abcde12345\n\n\t\n",
270 },
271 },
Jack Neus7440c762019-07-22 10:45:18 -0600272 }
273
Jack Neusf116fae2019-07-24 15:05:03 -0600274 commit, err := CommitEmpty(fakeGitRepo, commitMsg)
Jack Neus7440c762019-07-22 10:45:18 -0600275 assert.NilError(t, err)
Jack Neusf116fae2019-07-24 15:05:03 -0600276 assert.Equal(t, commit, "abcde12345")
Jack Neus7440c762019-07-22 10:45:18 -0600277}
278
Jack Neusabdbe192019-07-15 12:23:22 -0600279func TestPushChanges(t *testing.T) {
280 fakeGitRepo := "da-bank"
281 commitMsg := "da-money"
282 localRef := "da-vault"
283
284 remoteRef := RemoteRef{
285 Remote: "da-family",
286 Ref: "da-van",
287 }
288
289 pushStr := fmt.Sprintf("%s:%s", localRef, remoteRef.Ref)
290 CommandRunnerImpl = &cmd.FakeCommandRunnerMulti{
291 CommandRunners: []cmd.FakeCommandRunner{
292 {
293 ExpectedDir: fakeGitRepo,
294 ExpectedCmd: []string{"git", "add", "-A"},
295 },
296 {
297 ExpectedDir: fakeGitRepo,
298 ExpectedCmd: []string{"git", "commit", "-m", commitMsg},
299 },
300 {
301 ExpectedDir: fakeGitRepo,
Jack Neusf116fae2019-07-24 15:05:03 -0600302 ExpectedCmd: []string{"git", "rev-parse", "HEAD"},
303 Stdout: "abcde\n",
304 },
305 {
306 ExpectedDir: fakeGitRepo,
Jack Neusabdbe192019-07-15 12:23:22 -0600307 ExpectedCmd: []string{"git", "push", remoteRef.Remote, pushStr, "--dry-run"},
308 },
309 },
310 }
311
Jack Neusf116fae2019-07-24 15:05:03 -0600312 commit, err := PushChanges(fakeGitRepo, localRef, commitMsg, true, remoteRef)
Jack Neusabdbe192019-07-15 12:23:22 -0600313 assert.NilError(t, err)
Jack Neusf116fae2019-07-24 15:05:03 -0600314 assert.Equal(t, commit, "abcde")
Jack Neusabdbe192019-07-15 12:23:22 -0600315}
Jack Neus0296c732019-07-17 09:35:01 -0600316
Jack Neuseb25f722019-07-19 16:33:20 -0600317func TestPushRef(t *testing.T) {
Jack Neus7440c762019-07-22 10:45:18 -0600318 fakeGitRepo := "repo"
319 localRef := "commitId"
320
321 remoteRef := RemoteRef{
322 Remote: "remote",
323 Ref: "ref",
324 }
325
326 pushStr := fmt.Sprintf("%s:%s", localRef, remoteRef.Ref)
327 CommandRunnerImpl = cmd.FakeCommandRunner{
328 ExpectedDir: fakeGitRepo,
329 ExpectedCmd: []string{"git", "push", remoteRef.Remote, pushStr, "--dry-run"},
330 }
331
Jack Neuseb25f722019-07-19 16:33:20 -0600332 err := PushRef(fakeGitRepo, localRef, true, remoteRef)
Jack Neus7440c762019-07-22 10:45:18 -0600333 assert.NilError(t, err)
334}
335
Jack Neus0296c732019-07-17 09:35:01 -0600336func TestInit(t *testing.T) {
337 fakeGitRepo := "top-secret-project"
338
339 CommandRunnerImpl = cmd.FakeCommandRunner{
340 ExpectedDir: fakeGitRepo,
341 ExpectedCmd: []string{"git", "init"},
342 }
343 assert.NilError(t, Init(fakeGitRepo, false))
344}
345
346func TestInit_bare(t *testing.T) {
347 fakeGitRepo := "top-secret-project"
348
349 CommandRunnerImpl = cmd.FakeCommandRunner{
350 ExpectedDir: fakeGitRepo,
351 ExpectedCmd: []string{"git", "init", "--bare"},
352 }
353 assert.NilError(t, Init(fakeGitRepo, true))
354}
355
356func TestAddRemote(t *testing.T) {
357 fakeGitRepo := "repo"
358 remoteName := "remote"
359 remoteLoc := "remote/"
360
361 CommandRunnerImpl = cmd.FakeCommandRunner{
362 ExpectedDir: fakeGitRepo,
363 ExpectedCmd: []string{"git", "remote", "add", remoteName, remoteLoc},
364 }
365 assert.NilError(t, AddRemote(fakeGitRepo, remoteName, remoteLoc))
366}
367
368func TestCheckout(t *testing.T) {
369 CommandRunnerImpl = cmd.RealCommandRunner{}
370
371 tmpDir := "gittest_tmp_dir"
372 tmpDir, err := ioutil.TempDir("", tmpDir)
373 defer os.RemoveAll(tmpDir)
374
375 assert.NilError(t, err)
376 // Create repo.
377 assert.NilError(t, Init(tmpDir, false))
378 // Create first branch.
379 assert.NilError(t, CreateBranch(tmpDir, "branch1"))
380 // In order for the ref to be created, need to commit something.
381 assert.NilError(t, ioutil.WriteFile(filepath.Join(tmpDir, "foo"), []byte("foo"), 0644))
Jack Neusf116fae2019-07-24 15:05:03 -0600382 _, err = CommitAll(tmpDir, "init commit")
383 assert.NilError(t, err)
Jack Neus0296c732019-07-17 09:35:01 -0600384 // Create second branch (will switch to this branch).
385 assert.NilError(t, CreateBranch(tmpDir, "branch2"))
386 // Try checking out a nonexistent branch.
387 assert.ErrorContains(t, Checkout(tmpDir, "branch3"), "did not match any")
388 // Try checking out the first branch.
389 assert.NilError(t, Checkout(tmpDir, "branch1"))
390}
391
392func TestDeleteBranch_success(t *testing.T) {
393 CommandRunnerImpl = cmd.RealCommandRunner{}
394
395 tmpDir := "gittest_tmp_dir"
396 tmpDir, err := ioutil.TempDir("", tmpDir)
397 defer os.RemoveAll(tmpDir)
398 branchName := "newbranch"
399
400 assert.NilError(t, err)
401 // Create repo.
402 assert.NilError(t, Init(tmpDir, false))
403 // Create master branch.
404 assert.NilError(t, CreateBranch(tmpDir, "master"))
405 // In order for the ref to be created, need to commit something.
406 assert.NilError(t, ioutil.WriteFile(filepath.Join(tmpDir, "foo"), []byte("foo"), 0644))
Jack Neusf116fae2019-07-24 15:05:03 -0600407 _, err = CommitAll(tmpDir, "init commit")
408 assert.NilError(t, err)
Jack Neus0296c732019-07-17 09:35:01 -0600409 // Create branch to be deleted.
410 assert.NilError(t, CreateBranch(tmpDir, branchName))
411 // Switch back to master.
412 assert.NilError(t, Checkout(tmpDir, "master"))
413 err = DeleteBranch(tmpDir, branchName, true)
414 assert.NilError(t, err)
415}
416
417func TestDeleteBranch_inBranch(t *testing.T) {
418 CommandRunnerImpl = cmd.RealCommandRunner{}
419
420 tmpDir := "gittest_tmp_dir"
421 tmpDir, err := ioutil.TempDir("", tmpDir)
422 defer os.RemoveAll(tmpDir)
423 branchName := "newbranch"
424
425 assert.NilError(t, err)
426 // Create repo.
427 assert.NilError(t, Init(tmpDir, false))
428 // Create branch.
429 assert.NilError(t, CreateBranch(tmpDir, branchName))
430 err = DeleteBranch(tmpDir, branchName, true)
431 assert.ErrorContains(t, err, "checked out")
432}
433
434func TestDeleteBranch_unmerged(t *testing.T) {
435 CommandRunnerImpl = cmd.RealCommandRunner{}
436
437 tmpDir := "gittest_tmp_dir"
438 tmpDir, err := ioutil.TempDir("", tmpDir)
439 defer os.RemoveAll(tmpDir)
440 branchName := "newbranch"
441
442 assert.NilError(t, err)
443 // Create repo.
444 assert.NilError(t, Init(tmpDir, false))
445 // Create master branch.
446 assert.NilError(t, CreateBranch(tmpDir, "master"))
447 // In order for the ref to be created, need to commit something.
448 assert.NilError(t, ioutil.WriteFile(filepath.Join(tmpDir, "foo"), []byte("foo"), 0644))
Jack Neusf116fae2019-07-24 15:05:03 -0600449 _, err = CommitAll(tmpDir, "init commit")
450 assert.NilError(t, err)
Jack Neus0296c732019-07-17 09:35:01 -0600451 // Create test branch.
452 assert.NilError(t, CreateBranch(tmpDir, branchName))
453 // Make a change to branch.
454 assert.NilError(t, ioutil.WriteFile(filepath.Join(tmpDir, "bar"), []byte("bar"), 0644))
Jack Neusf116fae2019-07-24 15:05:03 -0600455 _, err = CommitAll(tmpDir, "init commit")
456 assert.NilError(t, err)
Jack Neus0296c732019-07-17 09:35:01 -0600457 // Switch back to master.
458 assert.NilError(t, Checkout(tmpDir, "master"))
459 // Should not be able to delete.
460 assert.ErrorContains(t, DeleteBranch(tmpDir, branchName, false), "fully merged")
461}
462
463func TestClone(t *testing.T) {
464 dest := "foo/bar"
465 remote := "remote"
466
467 CommandRunnerImpl = cmd.FakeCommandRunner{
468 ExpectedDir: "foo",
469 ExpectedCmd: []string{"git", "clone", remote, "bar"},
470 }
471 assert.NilError(t, Clone(remote, dest))
472}
Jack Neus1f489f62019-08-06 12:01:54 -0600473
474func TestRemoteBranches(t *testing.T) {
475 CommandRunnerImpl = cmd.RealCommandRunner{}
476
477 local, err := ioutil.TempDir("", "gittest_tmp_dir")
478 defer os.RemoveAll(local)
479
480 remote, err := ioutil.TempDir("", "gittest_tmp_dir")
481 defer os.RemoveAll(remote)
482
483 assert.NilError(t, err)
484 // Create repos.
485 assert.NilError(t, Init(local, false))
486 assert.NilError(t, Init(remote, false))
487 // Create local master branch.
488 assert.NilError(t, CreateBranch(local, "master"))
489 // In order for the ref to be created, need to commit something.
490 assert.NilError(t, ioutil.WriteFile(filepath.Join(local, "foo"), []byte("foo"), 0644))
491 _, err = CommitAll(local, "init commit")
492 assert.NilError(t, err)
493 // Add remote.
494 assert.NilError(t, AddRemote(local, "remote", remote))
495 // Create remote branches.
496 remoteRef := RemoteRef{
497 Remote: "remote",
498 Ref: "foo",
499 }
500 assert.NilError(t, PushRef(local, "HEAD", false, remoteRef))
501 remoteRef.Ref = "bar"
502 assert.NilError(t, PushRef(local, "HEAD", false, remoteRef))
503
504 branches, err := RemoteBranches(local, "remote")
505 assert.NilError(t, err)
506 assert.Assert(t, test_util.UnorderedEqual(branches, []string{"foo", "bar"}))
507 ok, err := RemoteHasBranch(local, "remote", "foo")
508 assert.NilError(t, err)
509 assert.Assert(t, ok)
510 ok, err = RemoteHasBranch(local, "remote", "baz")
511 assert.NilError(t, err)
512 assert.Assert(t, !ok)
513}
514
515func TestAssertGitBranches_success(t *testing.T) {
516 tmpDir, err := ioutil.TempDir("", "assert_git_branches_test")
517 assert.NilError(t, err)
518 defer os.RemoveAll(tmpDir)
519
520 assert.NilError(t, Init(tmpDir, false))
521
522 branches := []string{"branch1", "branch2", "branch3", "extra"}
523 for _, branch := range branches {
524 assert.NilError(t, CreateBranch(tmpDir, branch))
525 // Empty commit so that branch is not "unborn".
526 _, err := RunGit(tmpDir, []string{"commit", "-m", "init", "--allow-empty"})
527 assert.NilError(t, err)
528 }
529
530 assert.NilError(t, AssertGitBranches(tmpDir, branches[:3]))
531}
532
533func TestAssertGitBranchesExact_success(t *testing.T) {
534 tmpDir, err := ioutil.TempDir("", "assert_git_branches_test")
535 assert.NilError(t, err)
536 defer os.RemoveAll(tmpDir)
537
538 assert.NilError(t, Init(tmpDir, false))
539
540 branches := []string{"branch1", "branch2", "branch3", "branch4"}
541 for _, branch := range branches {
542 assert.NilError(t, CreateBranch(tmpDir, branch))
543 // Empty commit so that branch is not "unborn".
544 _, err := RunGit(tmpDir, []string{"commit", "-m", "init", "--allow-empty"})
545 assert.NilError(t, err)
546 }
547
548 assert.NilError(t, AssertGitBranchesExact(tmpDir, append(branches, "branch2")))
549 assert.ErrorContains(t, AssertGitBranchesExact(tmpDir, branches[:3]), "mismatch")
550}
551
552func TestAssertGitBranches_failure(t *testing.T) {
553 tmpDir, err := ioutil.TempDir("", "assert_git_branches_test")
554 assert.NilError(t, err)
555 defer os.RemoveAll(tmpDir)
556
557 assert.NilError(t, Init(tmpDir, false))
558 assert.ErrorContains(t, AssertGitBranches(tmpDir, []string{"master", "foo"}), "mismatch")
559}