This repository has no description
3.1 kB
92 lines
1package gitea
2
3import (
4 "context"
5 "fmt"
6 "os"
7 "os/exec"
8 "path/filepath"
9 "testing"
10
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
13)
14
15func initRepo(t *testing.T) (string, func(args ...string) []byte) {
16 t.Helper()
17 repo := t.TempDir()
18 runGit := func(args ...string) []byte {
19 t.Helper()
20 cmd := exec.Command("git", args...)
21 cmd.Dir = repo
22 out, err := cmd.CombinedOutput()
23 require.NoError(t, err, string(out))
24 return out
25 }
26 runGit("init")
27 runGit("config", "user.name", "nel")
28 runGit("config", "user.email", "nel@oyster.cafe")
29 return repo, runGit
30}
31
32func sizesByName(t *testing.T, repo string) map[string]int64 {
33 t.Helper()
34 ctx := context.Background()
35 tree, err := GetTree(ctx, repo, "HEAD^{tree}")
36 require.NoError(t, err)
37
38 sizes, err := EntrySizes(ctx, repo, tree.Entries)
39 require.NoError(t, err, "the batch survives an entry pointing outside this repo")
40 require.Len(t, sizes, len(tree.Entries))
41
42 byName := map[string]int64{}
43 for i, entry := range tree.Entries {
44 byName[entry.Name] = sizes[i]
45 }
46 return byName
47}
48
49func TestEntrySizesReportsEveryEntryKind(t *testing.T) {
50 repo, runGit := initRepo(t)
51 require.NoError(t, os.WriteFile(filepath.Join(repo, "conch.txt"), make([]byte, 10), 0o644))
52 require.NoError(t, os.WriteFile(filepath.Join(repo, "kelp.txt"), make([]byte, 9000), 0o644))
53 require.NoError(t, os.Mkdir(filepath.Join(repo, "limpet"), 0o755))
54 require.NoError(t, os.WriteFile(filepath.Join(repo, "limpet", "uni.txt"), make([]byte, 3), 0o644))
55 require.NoError(t, os.Symlink("conch.txt", filepath.Join(repo, "cuttle.txt")))
56 runGit("add", ".")
57 runGit("update-index", "--add", "--cacheinfo",
58 "160000,0000000000000000000000000000000000000001,mussel")
59 require.NoError(t, os.WriteFile(filepath.Join(repo, "zzz-nautilus.txt"), make([]byte, 4096), 0o644))
60 runGit("add", "zzz-nautilus.txt")
61 runGit("commit", "-m", "initial")
62
63 byName := sizesByName(t, repo)
64 assert.Equal(t, int64(10), byName["conch.txt"])
65 assert.Equal(t, int64(9000), byName["kelp.txt"])
66 assert.Equal(t, int64(0), byName["limpet"], "a tree doesn't have a blob size")
67 assert.Equal(t, int64(len("conch.txt")), byName["cuttle.txt"], "a symlink is its target's length")
68 assert.Equal(t, int64(0), byName["mussel"], "a submodule doesn't have a blob size")
69 assert.Equal(t, int64(4096), byName["zzz-nautilus.txt"], "entries after a submodule keep their size")
70
71 sizes, err := EntrySizes(context.Background(), repo, nil)
72 require.NoError(t, err)
73 assert.Empty(t, sizes, "we don't spawn a git process for an empty tree")
74}
75
76func TestEntrySizesReadsATreeLargerThanThePipeBuffer(t *testing.T) {
77 repo, runGit := initRepo(t)
78 const entries = 2000
79 for i := range entries {
80 name := fmt.Sprintf("scallop-%04d.txt", i)
81 require.NoError(t, os.WriteFile(filepath.Join(repo, name), make([]byte, i), 0o644))
82 }
83 runGit("add", ".")
84 runGit("commit", "-m", "initial")
85
86 byName := sizesByName(t, repo)
87 require.Len(t, byName, entries)
88 for i := range entries {
89 name := fmt.Sprintf("scallop-%04d.txt", i)
90 require.Equal(t, int64(i), byName[name], name)
91 }
92}