Skip to content

Commit d01bfce

Browse files
committed
Add an integration test of reference selection
1 parent 197eb5a commit d01bfce

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed

git_sizer_test.go

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package main_test
22

33
import (
4+
"bytes"
5+
"encoding/json"
46
"fmt"
57
"io"
68
"io/ioutil"
@@ -141,6 +143,118 @@ func newGitBomb(
141143
return repo, nil
142144
}
143145

146+
func TestRefSelection(t *testing.T) {
147+
t.Parallel()
148+
149+
allRefs := []string{
150+
"refs/barfoo",
151+
"refs/foo",
152+
"refs/foobar",
153+
"refs/heads/foo",
154+
"refs/heads/master",
155+
"refs/remotes/origin/master",
156+
"refs/remotes/upstream/foo",
157+
"refs/remotes/upstream/master",
158+
"refs/tags/foolish",
159+
"refs/tags/other",
160+
"refs/tags/release-1",
161+
"refs/tags/release-2",
162+
}
163+
164+
expectedStderr := "References (included references marked with '+'):\n" +
165+
"+ refs/barfoo\n" +
166+
" refs/foo\n" +
167+
"+ refs/foobar\n" +
168+
"+ refs/heads/foo\n" +
169+
"+ refs/heads/master\n" +
170+
" refs/remotes/origin/master\n" +
171+
"+ refs/remotes/upstream/foo\n" +
172+
" refs/remotes/upstream/master\n" +
173+
"+ refs/tags/foolish\n" +
174+
"+ refs/tags/other\n" +
175+
" refs/tags/release-1\n" +
176+
" refs/tags/release-2\n"
177+
178+
// Create a test repo with one orphan commit per refname:
179+
path, err := ioutil.TempDir("", "ref-selection")
180+
require.NoError(t, err)
181+
182+
defer os.RemoveAll(path)
183+
184+
err = exec.Command("git", "init", "--bare", path).Run()
185+
require.NoError(t, err)
186+
187+
repo, err := git.NewRepository(path)
188+
require.NoError(t, err)
189+
190+
for _, refname := range allRefs {
191+
oid, err := repo.CreateObject("blob", func(w io.Writer) error {
192+
_, err := fmt.Fprintf(w, "%s\n", refname)
193+
return err
194+
})
195+
require.NoError(t, err)
196+
197+
oid, err = repo.CreateObject("tree", func(w io.Writer) error {
198+
_, err = fmt.Fprintf(w, "100644 a.txt\x00%s", oid.Bytes())
199+
return err
200+
})
201+
require.NoError(t, err)
202+
203+
oid, err = repo.CreateObject("commit", func(w io.Writer) error {
204+
_, err := fmt.Fprintf(
205+
w,
206+
"tree %s\n"+
207+
"author Example <[email protected]> 1112911993 -0700\n"+
208+
"committer Example <[email protected]> 1112911993 -0700\n"+
209+
"\n"+
210+
"Commit for reference %s\n",
211+
oid, refname,
212+
)
213+
return err
214+
})
215+
require.NoError(t, err)
216+
217+
err = repo.UpdateRef(refname, oid)
218+
require.NoError(t, err)
219+
}
220+
221+
executable, err := exec.LookPath("bin/git-sizer")
222+
require.NoError(t, err)
223+
executable, err = filepath.Abs(executable)
224+
require.NoError(t, err)
225+
226+
cmd := exec.Command(
227+
executable, "--show-refs", "--no-progress", "--json", "--json-version=2",
228+
"--include=refs/heads",
229+
"--tags",
230+
"--exclude", "refs/heads/foo",
231+
"--include-regexp", ".*foo.*",
232+
"--exclude", "refs/foo",
233+
"--exclude-regexp", "refs/tags/release-.*",
234+
)
235+
cmd.Dir = path
236+
var stdout bytes.Buffer
237+
cmd.Stdout = &stdout
238+
var stderr bytes.Buffer
239+
cmd.Stderr = &stderr
240+
err = cmd.Run()
241+
require.NoError(t, err)
242+
243+
// Make sure that the right number of commits was scanned:
244+
var v struct {
245+
UniqueCommitCount struct {
246+
Value int
247+
}
248+
}
249+
err = json.Unmarshal(stdout.Bytes(), &v)
250+
if assert.NoError(t, err) {
251+
assert.EqualValues(t, 7, v.UniqueCommitCount.Value)
252+
}
253+
254+
// Make sure that the right references were reported scanned:
255+
assert.Equal(t, expectedStderr, stderr.String())
256+
}
257+
144258
func pow(x uint64, n int) uint64 {
145259
p := uint64(1)
146260
for ; n > 0; n-- {

0 commit comments

Comments
 (0)