GitRoot
Craft your forge, Build your project, Grow your community freely
1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5package repository
6
7import (
8 "context"
9 "fmt"
10 "os"
11 "testing"
12
13 git "github.com/go-git/go-git/v6"
14 "github.com/go-git/go-git/v6/plumbing"
15 "github.com/go-git/go-git/v6/plumbing/object"
16 "gitroot.dev/server/configuration"
17 "gitroot.dev/server/user"
18)
19
20// | - commit5
21// | | - commit4 -- branch2
22// | | commit3
23// | - commit2 -- branch1
24// - commit1
25// - init -- main
26func TestFoundAncestor(t *testing.T) {
27 dataDir := t.TempDir()
28 conf := configuration.NewConfiguration(dataDir)
29 userManager, _ := user.NewManager(conf)
30 m := NewManager(conf, userManager)
31 repoConf := RepoConf{Name: "foundAncestor", DefaultBranch: "main"}
32 err := m.CreateUserRepo(context.TODO(), repoConf, []user.SimpleUser{}, []byte(""))
33 if err != nil {
34 t.Fatal(err)
35 }
36 repo, err := m.Open(context.TODO(), "foundAncestor")
37 if err != nil {
38 t.Fatal(err)
39 }
40 repoWriter, err := repo.WillWrite(plumbing.HEAD)
41 if err != nil {
42 t.Fatal(err)
43 }
44 h1 := makeCommit(repoWriter, 1, t, userManager)
45 if err := repoWriter.Branch("branch1", h1); err != nil {
46 t.Fatal(err)
47 }
48 h2 := makeCommit(repoWriter, 2, t, userManager)
49
50 h3 := makeCommit(repoWriter, 3, t, userManager)
51 if err := repoWriter.Branch("branch2", h3); err != nil {
52 t.Fatal(err)
53 }
54 makeCommit(repoWriter, 4, t, userManager)
55 if err := repoWriter.worktree.Checkout(&git.CheckoutOptions{Branch: plumbing.NewBranchReferenceName("branch1"), Force: true}); err != nil {
56 t.Fatal(err)
57 }
58 h5 := makeCommit(repoWriter, 5, t, userManager)
59
60 commits := []*object.Commit{}
61 os.Stdout.WriteString("------\n")
62 repo.hasBecomeWrite.WalkCommit(h1, h5, func(c *object.Commit) error {
63 os.Stdout.WriteString(fmt.Sprintf("%s=%s\n", c.Hash.String(), c.Message))
64 commits = append(commits, c)
65 return nil
66 })
67 os.Stdout.WriteString("------\n")
68
69 res := []plumbing.Hash{h5, h3, h2, h1}
70
71 if len(commits) != len(res) {
72 t.Fatalf("commits should be %d but was %d", len(res), len(commits))
73 }
74 for i, r := range res {
75 if !commits[i].Hash.Equal(r) {
76 t.Fatalf("commit %d should be %s but was %s", i, r.String(), commits[0].Hash.String())
77 }
78 }
79
80 repo.Close()
81}
82
83func makeCommit(repo *GitRootRepositoryWrite, nb int, t *testing.T, u *user.Manager) plumbing.Hash {
84 if err := repo.Write("README.md", []byte(fmt.Sprintf("commit%d", nb))); err != nil {
85 t.Fatal(err)
86 }
87 h, err := repo.CommitAll(fmt.Sprintf("commit%d", nb), u.RootCommiter())
88 if err != nil {
89 t.Fatal(err)
90 }
91 return h
92}