13 "github.com/stretchr/testify/assert"
16 type ArgsTestCase struct {
26 func (c *ArgsTestCase) Assert(t *testing.T) {
27 stdin, args, err := revListArgs(c.Include, c.Exclude, c.Opt)
29 if len(c.ExpectedErr) > 0 {
30 assert.EqualError(t, err, c.ExpectedErr)
35 assert.EqualValues(t, c.ExpectedArgs, args)
38 b, err := ioutil.ReadAll(stdin)
41 assert.Equal(t, c.ExpectedStdin, string(b))
42 } else if len(c.ExpectedStdin) > 0 {
43 t.Errorf("git: expected stdin contents %s, got none", c.ExpectedStdin)
48 s1 = "decafdecafdecafdecafdecafdecafdecafdecaf"
49 s2 = "cafecafecafecafecafecafecafecafecafecafe"
52 func TestRevListArgs(t *testing.T) {
53 for desc, c := range map[string]*ArgsTestCase{
54 "scan refs deleted, left and right": {
55 Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
57 SkipDeletedBlobs: false,
59 ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
60 ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--do-walk", "--"},
62 "scan refs not deleted, left and right": {
63 Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
65 SkipDeletedBlobs: true,
67 ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
68 ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--no-walk", "--"},
70 "scan refs deleted, left only": {
71 Include: []string{s1}, Opt: &ScanRefsOptions{
73 SkipDeletedBlobs: false,
76 ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--do-walk", "--"},
78 "scan refs not deleted, left only": {
79 Include: []string{s1}, Opt: &ScanRefsOptions{
81 SkipDeletedBlobs: true,
84 ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--no-walk", "--"},
87 Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
90 ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--all", "--"},
92 "scan left to remote, no skipped refs": {
93 Include: []string{s1}, Opt: &ScanRefsOptions{
94 Mode: ScanLeftToRemoteMode,
96 SkippedRefs: []string{},
99 ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--not", "--remotes=origin", "--"},
101 "scan left to remote, skipped refs": {
102 Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
103 Mode: ScanLeftToRemoteMode,
105 SkippedRefs: []string{"a", "b", "c"},
107 ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--"},
108 ExpectedStdin: s1 + "\n^" + s2 + "\na\nb\nc",
110 "scan unknown type": {
111 Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
112 Mode: ScanningMode(-1),
114 ExpectedErr: "unknown scan type: -1",
117 Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
119 Order: DateRevListOrder,
121 ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
122 ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--date-order", "--do-walk", "--"},
124 "scan author date order": {
125 Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
127 Order: AuthorDateRevListOrder,
129 ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
130 ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--author-date-order", "--do-walk", "--"},
133 Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
135 Order: TopoRevListOrder,
137 ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
138 ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--topo-order", "--do-walk", "--"},
140 "scan commits only": {
141 Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
145 ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
146 ExpectedArgs: []string{"rev-list", "--stdin", "--do-walk", "--"},
149 Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
153 ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
154 ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--reverse", "--do-walk", "--"},
157 t.Run(desc, c.Assert)
161 func TestRevListScannerCallsClose(t *testing.T) {
163 err := errors.New("Hello world")
165 s := &RevListScanner{
166 closeFn: func() error {
167 atomic.AddUint32(&called, 1)
174 assert.EqualValues(t, 1, atomic.LoadUint32(&called))
175 assert.Equal(t, err, got)
178 func TestRevListScannerTreatsCloseFnAsOptional(t *testing.T) {
179 s := &RevListScanner{
183 defer func() { assert.Nil(t, recover()) }()
185 assert.Nil(t, s.Close())
188 func TestRevListScannerParsesLinesWithNames(t *testing.T) {
189 given := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa name.dat"
190 s := &RevListScanner{
191 s: bufio.NewScanner(strings.NewReader(given)),
194 assert.True(t, s.Scan())
195 assert.Equal(t, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", hex.EncodeToString(s.OID()))
196 assert.Equal(t, "name.dat", s.Name())
197 assert.Nil(t, s.Err())
199 assert.False(t, s.Scan())
200 assert.Equal(t, "", s.Name())
201 assert.Nil(t, s.OID())
202 assert.Nil(t, s.Err())
205 func TestRevListScannerParsesLinesWithoutName(t *testing.T) {
206 given := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
207 s := &RevListScanner{
208 s: bufio.NewScanner(strings.NewReader(given)),
211 assert.True(t, s.Scan())
212 assert.Equal(t, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", hex.EncodeToString(s.OID()))
213 assert.Nil(t, s.Err())
215 assert.False(t, s.Scan())
216 assert.Equal(t, "", s.Name())
217 assert.Nil(t, s.OID())
218 assert.Nil(t, s.Err())