// SPDX-FileCopyrightText: 2025 Romain Maneschi // // SPDX-License-Identifier: EUPL-1.2 package repository import ( "context" "fmt" "os" "testing" git "github.com/go-git/go-git/v6" "github.com/go-git/go-git/v6/plumbing" "github.com/go-git/go-git/v6/plumbing/object" "gitroot.dev/server/configuration" "gitroot.dev/server/user" ) // | - commit5 // | | - commit4 -- branch2 // | | commit3 // | - commit2 -- branch1 // - commit1 // - init -- main func TestFoundAncestor(t *testing.T) { dataDir := t.TempDir() conf := configuration.NewConfiguration(dataDir) userManager, _ := user.NewManager(conf) m := NewManager(conf, userManager) repoConf := RepoConf{Name: "foundAncestor", DefaultBranch: "main"} err := m.CreateUserRepo(context.TODO(), repoConf, []user.SimpleUser{}, []byte("")) if err != nil { t.Fatal(err) } repo, err := m.Open(context.TODO(), "foundAncestor") if err != nil { t.Fatal(err) } repoWriter, err := repo.WillWrite(plumbing.HEAD) if err != nil { t.Fatal(err) } h1 := makeCommit(repoWriter, 1, t, userManager) if err := repoWriter.Branch("branch1", h1); err != nil { t.Fatal(err) } h2 := makeCommit(repoWriter, 2, t, userManager) h3 := makeCommit(repoWriter, 3, t, userManager) if err := repoWriter.Branch("branch2", h3); err != nil { t.Fatal(err) } makeCommit(repoWriter, 4, t, userManager) if err := repoWriter.worktree.Checkout(&git.CheckoutOptions{Branch: plumbing.NewBranchReferenceName("branch1"), Force: true}); err != nil { t.Fatal(err) } h5 := makeCommit(repoWriter, 5, t, userManager) commits := []*object.Commit{} os.Stdout.WriteString("------\n") repo.hasBecomeWrite.WalkCommit(h1, h5, func(c *object.Commit) error { os.Stdout.WriteString(fmt.Sprintf("%s=%s\n", c.Hash.String(), c.Message)) commits = append(commits, c) return nil }) os.Stdout.WriteString("------\n") res := []plumbing.Hash{h5, h3, h2, h1} if len(commits) != len(res) { t.Fatalf("commits should be %d but was %d", len(res), len(commits)) } for i, r := range res { if !commits[i].Hash.Equal(r) { t.Fatalf("commit %d should be %s but was %s", i, r.String(), commits[0].Hash.String()) } } repo.Close() } func makeCommit(repo *GitRootRepositoryWrite, nb int, t *testing.T, u *user.Manager) plumbing.Hash { if err := repo.Write("README.md", []byte(fmt.Sprintf("commit%d", nb))); err != nil { t.Fatal(err) } h, err := repo.CommitAll(fmt.Sprintf("commit%d", nb), u.RootCommiter()) if err != nil { t.Fatal(err) } return h }