vole
Clone
Read only, no credentials:
https://rodent.software/vole.git
Write over SSH with a registered key:
git clone ssh://git@rodent.software:2222/vole.git
A free and open-source forge that lives in your Git repo.
refactor
c5902451905acdaa478f8476844ccd4a510d9ca9 · Keenan Nemetz · 17d ago · parent ec2aba4b
internal/gc/gc_test.go → forge/gc_test.go +22−22
| @@ -1,4 +1,4 @@ | |||
| 1 | package gc | ||
| 1 | package forge | ||
| 2 | 2 | ||
| 3 | 3 | import ( | |
| 4 | 4 | "bytes" | |
| @@ -7,8 +7,8 @@ import ( | |||
| 7 | 7 | "testing" | |
| 8 | 8 | "time" | |
| 9 | 9 | ||
| 10 | "github.com/rodent-software/vole/internal/gitx" | ||
| 11 | "github.com/rodent-software/vole/internal/lfs" | ||
| 10 | "github.com/rodent-software/vole/core/git" | ||
| 11 | "github.com/rodent-software/vole/core/lfs" | ||
| 12 | 12 | ) | |
| 13 | 13 | ||
| 14 | 14 | // repoWithPointer builds a bare repository whose main branch commits a pointer | |
| @@ -18,15 +18,15 @@ import ( | |||
| 18 | 18 | func repoWithoutPointer(t *testing.T) string { | |
| 19 | 19 | t.Helper() | |
| 20 | 20 | dir := t.TempDir() + "/repo.git" | |
| 21 | if err := gitx.InitBare(dir, "main"); err != nil { | ||
| 21 | if err := git.InitBare(dir, "main"); err != nil { | ||
| 22 | 22 | t.Fatal(err) | |
| 23 | 23 | } | |
| 24 | g := gitx.Open(dir) | ||
| 24 | g := git.Open(dir) | ||
| 25 | 25 | text, err := g.HashObject([]byte("nothing but text here\n")) | |
| 26 | 26 | if err != nil { | |
| 27 | 27 | t.Fatal(err) | |
| 28 | 28 | } | |
| 29 | tree, err := g.MkTree([]gitx.Entry{{Mode: "100644", Type: "blob", SHA: text, Name: "README.md"}}) | ||
| 29 | tree, err := g.MkTree([]git.Entry{{Mode: "100644", Type: "blob", SHA: text, Name: "README.md"}}) | ||
| 30 | 30 | if err != nil { | |
| 31 | 31 | t.Fatal(err) | |
| 32 | 32 | } | |
| @@ -43,10 +43,10 @@ func repoWithoutPointer(t *testing.T) string { | |||
| 43 | 43 | func repoWithPointer(t *testing.T, oid string) string { | |
| 44 | 44 | t.Helper() | |
| 45 | 45 | dir := t.TempDir() + "/repo.git" | |
| 46 | if err := gitx.InitBare(dir, "main"); err != nil { | ||
| 46 | if err := git.InitBare(dir, "main"); err != nil { | ||
| 47 | 47 | t.Fatal(err) | |
| 48 | 48 | } | |
| 49 | g := gitx.Open(dir) | ||
| 49 | g := git.Open(dir) | ||
| 50 | 50 | pointer, err := g.HashObject(lfs.Pointer{OID: oid, Size: 12}.Encode()) | |
| 51 | 51 | if err != nil { | |
| 52 | 52 | t.Fatal(err) | |
| @@ -55,7 +55,7 @@ func repoWithPointer(t *testing.T, oid string) string { | |||
| 55 | 55 | if err != nil { | |
| 56 | 56 | t.Fatal(err) | |
| 57 | 57 | } | |
| 58 | tree1, err := g.MkTree([]gitx.Entry{ | ||
| 58 | tree1, err := g.MkTree([]git.Entry{ | ||
| 59 | 59 | {Mode: "100644", Type: "blob", SHA: pointer, Name: "artifact.bin"}, | |
| 60 | 60 | {Mode: "100644", Type: "blob", SHA: text, Name: "README.md"}, | |
| 61 | 61 | }) | |
| @@ -66,7 +66,7 @@ func repoWithPointer(t *testing.T, oid string) string { | |||
| 66 | 66 | if err != nil { | |
| 67 | 67 | t.Fatal(err) | |
| 68 | 68 | } | |
| 69 | tree2, err := g.MkTree([]gitx.Entry{ | ||
| 69 | tree2, err := g.MkTree([]git.Entry{ | ||
| 70 | 70 | {Mode: "100644", Type: "blob", SHA: text, Name: "README.md"}, | |
| 71 | 71 | }) | |
| 72 | 72 | if err != nil { | |
| @@ -105,8 +105,8 @@ func TestReachableThroughHistorySurvivesAndGarbageDoesNot(t *testing.T) { | |||
| 105 | 105 | reachable, orphan := oids[0], oids[1] | |
| 106 | 106 | dir := repoWithPointer(t, reachable) | |
| 107 | 107 | ||
| 108 | res, err := Run(Options{ | ||
| 109 | Repos: []Repo{{Name: "demo", Dir: dir}}, | ||
| 108 | res, err := GC(GCOptions{ | ||
| 109 | Repos: []GCRepo{{Name: "demo", Dir: dir}}, | ||
| 110 | 110 | Store: store, | |
| 111 | 111 | Grace: 0, | |
| 112 | 112 | Now: time.Now().Add(time.Hour), | |
| @@ -132,7 +132,7 @@ func TestGraceProtectsAFreshUpload(t *testing.T) { | |||
| 132 | 132 | store, oids := storeWith(t, kept, fresh) | |
| 133 | 133 | dir := repoWithPointer(t, oids[0]) | |
| 134 | 134 | ||
| 135 | res, err := Run(Options{Repos: []Repo{{Name: "demo", Dir: dir}}, Store: store, Grace: time.Hour}) | ||
| 135 | res, err := GC(GCOptions{Repos: []GCRepo{{Name: "demo", Dir: dir}}, Store: store, Grace: time.Hour}) | ||
| 136 | 136 | if err != nil { | |
| 137 | 137 | t.Fatal(err) | |
| 138 | 138 | } | |
| @@ -143,8 +143,8 @@ func TestGraceProtectsAFreshUpload(t *testing.T) { | |||
| 143 | 143 | t.Fatalf("result %+v; want 1 within grace, 0 swept", res) | |
| 144 | 144 | } | |
| 145 | 145 | // The same store, an hour later: the grace has run out. | |
| 146 | res, err = Run(Options{ | ||
| 147 | Repos: []Repo{{Name: "demo", Dir: dir}}, Store: store, Grace: time.Hour, | ||
| 146 | res, err = GC(GCOptions{ | ||
| 147 | Repos: []GCRepo{{Name: "demo", Dir: dir}}, Store: store, Grace: time.Hour, | ||
| 148 | 148 | Now: time.Now().Add(2 * time.Hour), | |
| 149 | 149 | }) | |
| 150 | 150 | if err != nil { | |
| @@ -163,7 +163,7 @@ func TestArchivedLogIsARoot(t *testing.T) { | |||
| 163 | 163 | log := []byte("$ go test ./...\nok\n") | |
| 164 | 164 | store, oids := storeWith(t, log) | |
| 165 | 165 | ||
| 166 | res, err := Run(Options{ | ||
| 166 | res, err := GC(GCOptions{ | ||
| 167 | 167 | Repos: nil, | |
| 168 | 168 | Store: store, | |
| 169 | 169 | RunOIDs: map[string][]string{"demo": oids}, | |
| @@ -184,7 +184,7 @@ func TestArchivedLogIsARoot(t *testing.T) { | |||
| 184 | 184 | func TestDryRunRemovesNothing(t *testing.T) { | |
| 185 | 185 | t.Parallel() | |
| 186 | 186 | store, oids := storeWith(t, []byte("garbage")) | |
| 187 | res, err := Run(Options{Store: store, Grace: 0, DryRun: true, Now: time.Now().Add(time.Hour)}) | ||
| 187 | res, err := GC(GCOptions{Store: store, Grace: 0, DryRun: true, Now: time.Now().Add(time.Hour)}) | ||
| 188 | 188 | if err != nil { | |
| 189 | 189 | t.Fatal(err) | |
| 190 | 190 | } | |
| @@ -214,8 +214,8 @@ func TestLinkRepairsAMissingNamespace(t *testing.T) { | |||
| 214 | 214 | t.Fatal("the object is still linked; the fixture proves nothing") | |
| 215 | 215 | } | |
| 216 | 216 | ||
| 217 | res, err := Link(Options{ | ||
| 218 | Repos: []Repo{{Name: "demo", Dir: dir}}, | ||
| 217 | res, err := GCLink(GCOptions{ | ||
| 218 | Repos: []GCRepo{{Name: "demo", Dir: dir}}, | ||
| 219 | 219 | Store: store, | |
| 220 | 220 | Grace: 0, | |
| 221 | 221 | Now: time.Now().Add(time.Hour), | |
| @@ -234,7 +234,7 @@ func TestLinkRepairsAMissingNamespace(t *testing.T) { | |||
| 234 | 234 | t.Fatalf("the repair pass changed more than links: %+v", res) | |
| 235 | 235 | } | |
| 236 | 236 | // And it is idempotent. | |
| 237 | again, err := Link(Options{Repos: []Repo{{Name: "demo", Dir: dir}}, Store: store, Now: time.Now()}) | ||
| 237 | again, err := GCLink(GCOptions{Repos: []GCRepo{{Name: "demo", Dir: dir}}, Store: store, Now: time.Now()}) | ||
| 238 | 238 | if err != nil { | |
| 239 | 239 | t.Fatal(err) | |
| 240 | 240 | } | |
| @@ -257,8 +257,8 @@ func TestOneRepositoryLosingAPointerKeepsTheOthersLink(t *testing.T) { | |||
| 257 | 257 | dirA := repoWithPointer(t, oid) // demo reaches it | |
| 258 | 258 | dirB := repoWithoutPointer(t) // other does not | |
| 259 | 259 | ||
| 260 | res, err := Run(Options{ | ||
| 261 | Repos: []Repo{{Name: "demo", Dir: dirA}, {Name: "other", Dir: dirB}}, | ||
| 260 | res, err := GC(GCOptions{ | ||
| 261 | Repos: []GCRepo{{Name: "demo", Dir: dirA}, {Name: "other", Dir: dirB}}, | ||
| 262 | 262 | Store: store, | |
| 263 | 263 | Grace: 0, | |
| 264 | 264 | Now: time.Now().Add(time.Hour), | |