Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/git/vole.git

Write over SSH with a registered key:

git clone ssh://git@0.0.0.0:2222/vole.git

A free and open-source forge that lives in your Git repo.

Code

392 commit(s) on main

Merge change request 01M70WES5ZZDJ6RP226WB11BBZ: Let people rename and remove their own passkeys keenan · 1h ago 4b8c9e1d
history blame raw 2.5 KiB
1package storage
2
3import (
4 "os"
5 "path/filepath"
6 "testing"
7)
8
9func TestMeasureClassifiesAndDeduplicatesHardLinks(t *testing.T) {
10 t.Parallel()
11 root := t.TempDir()
12 write := func(rel string, data []byte) {
13 t.Helper()
14 path := filepath.Join(root, filepath.FromSlash(rel))
15 if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
16 t.Fatal(err)
17 }
18 if err := os.WriteFile(path, data, 0o644); err != nil {
19 t.Fatal(err)
20 }
21 }
22 write("repos/demo.git/objects/aa/object", []byte("repo object"))
23 write("lfs/objects/aa/bb/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", []byte("large object"))
24 write("queue/spool/event", []byte("event"))
25 write("users.db", []byte("database"))
26 write("audit.log", []byte("log"))
27
28 before, err := Measure(root)
29 if err != nil {
30 t.Fatal(err)
31 }
32 cats := categoryMap(before)
33 if cats["Repositories"].Files != 1 || cats["Databases"].Files != 1 || cats["Queue"].Files != 1 {
34 t.Fatalf("categories = %+v", before.Categories)
35 }
36 lfsBytes := cats["LFS objects"].Bytes
37 if cats["LFS objects"].Files != 1 || lfsBytes == 0 {
38 t.Fatalf("LFS category = %+v", cats["LFS objects"])
39 }
40 if before.Disk.Total == 0 || before.Disk.Available == 0 {
41 t.Fatalf("filesystem capacity = %+v", before.Disk)
42 }
43
44 // A repository's namespace is a hard link into the pool. It must not make the
45 // same bytes count twice or move them into a different category.
46 linked := filepath.Join(root, "lfs/repos/demo/aa/bb/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
47 if err := os.MkdirAll(filepath.Dir(linked), 0o755); err != nil {
48 t.Fatal(err)
49 }
50 if err := os.Link(filepath.Join(root, "lfs/objects/aa/bb/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), linked); err != nil {
51 t.Fatal(err)
52 }
53 after, err := Measure(root)
54 if err != nil {
55 t.Fatal(err)
56 }
57 afterCats := categoryMap(after)
58 if afterCats["LFS objects"].Files != 1 || afterCats["LFS objects"].Bytes != lfsBytes {
59 t.Fatalf("hard link changed LFS usage: before=%+v after=%+v", cats["LFS objects"], afterCats["LFS objects"])
60 }
61 if after.Bytes != before.Bytes || after.Files != before.Files {
62 t.Fatalf("hard link changed total: before=%d/%d after=%d/%d", before.Bytes, before.Files, after.Bytes, after.Files)
63 }
64 var sum int64
65 for _, c := range after.Categories {
66 sum += c.Bytes
67 }
68 if sum != after.Bytes {
69 t.Fatalf("categories sum to %d, total is %d", sum, after.Bytes)
70 }
71}
72
73func categoryMap(st Stats) map[string]Category {
74 out := make(map[string]Category, len(st.Categories))
75 for _, c := range st.Categories {
76 out[c.Name] = c
77 }
78 return out
79}
80