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}