|
1 | 1 | package main_test
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "bytes" |
| 5 | + "encoding/json" |
4 | 6 | "fmt"
|
5 | 7 | "io"
|
6 | 8 | "io/ioutil"
|
@@ -141,6 +143,118 @@ func newGitBomb(
|
141 | 143 | return repo, nil
|
142 | 144 | }
|
143 | 145 |
|
| 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 | + |
144 | 258 | func pow(x uint64, n int) uint64 {
|
145 | 259 | p := uint64(1)
|
146 | 260 | for ; n > 0; n-- {
|
|
0 commit comments