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 "testing"
11
12 "github.com/go-git/go-git/v5/plumbing"
13 "gitroot.dev/server/configuration"
14 "gitroot.dev/server/logger"
15 "gitroot.dev/server/user"
16)
17
18// | commit5
19// | | - commit4 -- branch2
20// | | commit3
21// | - commit2 -- branch1
22// - commit1
23// - init -- main
24func TestFoundAncestor(t *testing.T) {
25 dataDir := t.TempDir()
26 conf := configuration.NewConfiguration(dataDir)
27 userManager, _ := user.NewManager(conf)
28 m := NewManager(conf, userManager)
29 err := m.CreateUserRepo(context.TODO(), RepoConf{Name: "foundAncestor", DefaultBranch: "main"}, []user.SimpleUser{}, []byte(""))
30 if err != nil {
31 t.Fatal(err)
32 }
33 repo, err := m.Open(context.TODO(), "foundAncestor")
34 if err != nil {
35 t.Fatal(err)
36 }
37 repoWriter, err := repo.WillWrite(plumbing.HEAD)
38 if err != nil {
39 t.Fatal(err)
40 }
41 h1 := makeCommit(repoWriter, 1, t, userManager)
42 if err := repoWriter.Branch("branch1", h1); err != nil {
43 t.Fatal(err)
44 }
45 h2 := makeCommit(repoWriter, 2, t, userManager)
46 com2, _ := repoWriter.repoWrite.CommitObject(h2)
47 comAncestor, _ := foundAncestor(repoWriter.repoWrite, logger.NewLogger("test"), RepoConfiguration{DefaultBranch: "main"}, com2)
48 if comAncestor.Hash != h1 {
49 t.Fatal("should be h1")
50 }
51 h3 := makeCommit(repoWriter, 3, t, userManager)
52 if err := repoWriter.Branch("branch2", h3); err != nil {
53 t.Fatal(err)
54 }
55 h4 := makeCommit(repoWriter, 4, t, userManager)
56 com4, _ := repoWriter.repoWrite.CommitObject(h4)
57 comAncestor4, _ := foundAncestor(repoWriter.repoWrite, logger.NewLogger("test"), RepoConfiguration{DefaultBranch: "main"}, com4)
58 if comAncestor4.Hash != h3 {
59 t.Fatal("should be h3", comAncestor4.Hash, h1, h2, h3)
60 }
61 if err := repoWriter.Checkout(plumbing.NewBranchReferenceName("main")); err != nil {
62 t.Fatal(err)
63 }
64 // h5 := makeCommit(repoWriter, 5, t, userManager)
65 // comAncestor5, _ := foundAncestor(repoWriter.repoWrite, logger.NewLogger("test"), RepoConfiguration{DefaultBranch: "main"}, com2)
66 // if comAncestor5.Hash != h1 {
67 // t.Fatal("should be h1", comAncestor5.Hash, h1, h2, h3, h4, h5)
68 // }
69 repo.Close()
70}
71
72func makeCommit(repo *GitRootRepositoryWrite, nb int, t *testing.T, u *user.Manager) plumbing.Hash {
73 if err := repo.Write("README.md", []byte(fmt.Sprintf("commit%d", nb))); err != nil {
74 t.Fatal(err)
75 }
76 h, err := repo.CommitAll(fmt.Sprintf("commit%d", nb), u.RootCommiter())
77 if err != nil {
78 t.Fatal(err)
79 }
80 return h
81}