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}