package shared_tests

import (
	"context"
	"fmt"
	"os"
	"path"
	"reflect"
	"sort"
	"strings"
	"time"

	"github.com/stretchr/testify/require"

	cipd_git "go.skia.org/infra/bazel/external/cipd/git"
	"go.skia.org/infra/go/deepequal/assertdeep"
	"go.skia.org/infra/go/git"
	"go.skia.org/infra/go/git/repograph"
	git_testutils "go.skia.org/infra/go/git/testutils"
	"go.skia.org/infra/go/sktest"
	"go.skia.org/infra/go/testutils"
	"go.skia.org/infra/go/util"
	"go.skia.org/infra/go/vcsinfo"
)

// RepoImplRefresher is an interface used for testing which notifies a RepoImpl
// that there are new commits available.
type RepoImplRefresher interface {
	Refresh(...*vcsinfo.LongCommit)
}

// CommonSetup performs common setup. Importantly, it uses the git executable brought
// in from CIPD.
func CommonSetup(t sktest.TestingT) (context.Context, *git_testutils.GitBuilder, func()) {
	ctx := cipd_git.UseGitFinder(context.Background())
	g := git_testutils.GitInit(t, ctx)
	return ctx, g, g.Cleanup
}

// GitSetup initializes a Git repo in a temporary directory with some commits.
// Returns the path of the temporary directory, the Graph object associated with
// the repo, and a slice of the commits which were added.
//
// The repo layout looks like this:
//
// c1--c2------c4--c5--
//
//	\-c3-----/
func GitSetup(t sktest.TestingT, ctx context.Context, g *git_testutils.GitBuilder, repo *repograph.Graph, rf RepoImplRefresher) []*repograph.Commit {
	t0 := time.Unix(1564963200, 0) // Arbitrary time to fix commit hashes.
	ts := t0
	fileNum := 0
	co := git.CheckoutDir(g.Dir())
	doGit := func(hash string) *vcsinfo.LongCommit {
		ts = ts.Add(time.Second)
		fileNum++
		details, err := co.Details(ctx, hash)
		require.NoError(t, err)
		return details
	}
	commit := func() *vcsinfo.LongCommit {
		return doGit(g.CommitGenAt(ctx, fmt.Sprintf("file%d", fileNum), ts))
	}
	merge := func(branch string) *vcsinfo.LongCommit {
		return doGit(g.MergeBranchAt(ctx, branch, ts))
	}

	c1details := commit()
	rf.Refresh(c1details)
	require.NoError(t, repo.Update(ctx))

	c1 := repo.Get(git.MainBranch)
	require.NotNil(t, c1)
	require.Equal(t, 0, len(c1.GetParents()))
	require.False(t, util.TimeIsZero(c1.Timestamp))

	c2details := commit()
	rf.Refresh(c2details)
	require.NoError(t, repo.Update(ctx))
	c2 := repo.Get(git.MainBranch)
	require.NotNil(t, c2)
	require.Equal(t, 1, len(c2.GetParents()))
	require.Equal(t, c1, c2.GetParents()[0])
	require.Equal(t, []string{git.MainBranch}, repo.Branches())
	require.False(t, util.TimeIsZero(c2.Timestamp))

	// Create a second branch.
	g.CreateBranchTrackBranch(ctx, "branch2", git.DefaultRemoteBranch)
	c3details := commit()
	rf.Refresh(c1details, c2details, c3details)
	require.NoError(t, repo.Update(ctx))
	c3 := repo.Get("branch2")
	require.NotNil(t, c3)
	require.Equal(t, c2, repo.Get(git.MainBranch))
	require.Equal(t, []string{"branch2", git.MainBranch}, repo.Branches())
	require.False(t, util.TimeIsZero(c3.Timestamp))

	// Commit again to the main branch.
	g.CheckoutBranch(ctx, git.MainBranch)
	c4details := commit()
	rf.Refresh(c4details)
	require.NoError(t, repo.Update(ctx))
	require.Equal(t, c3, repo.Get("branch2"))
	c4 := repo.Get(git.MainBranch)
	require.NotNil(t, c4)
	require.False(t, util.TimeIsZero(c4.Timestamp))

	// Merge branch2 into main.
	c5details := merge("branch2")
	rf.Refresh(c1details, c2details, c3details, c4details, c5details)
	require.NoError(t, repo.Update(ctx))
	require.Equal(t, []string{"branch2", git.MainBranch}, repo.Branches())
	c5 := repo.Get(git.MainBranch)
	require.NotNil(t, c5)
	require.Equal(t, c3, repo.Get("branch2"))
	require.False(t, util.TimeIsZero(c5.Timestamp))

	return []*repograph.Commit{c1, c2, c3, c4, c5}
}

// Assert that the given Commits are in reverse topological order.
func AssertTopoSorted(t sktest.TestingT, commits []*repograph.Commit) {
	// Collect all commits in a map so we can quickly check for their
	// presence in the commits slice.
	commitsMap := make(map[*repograph.Commit]bool, len(commits))
	for _, c := range commits {
		// Assert that each parent is not yet visited.
		parents := c.GetParents()
		for _, p := range parents {
			require.False(t, commitsMap[p])
		}
		commitsMap[c] = true
	}

	// Ensure that we don't mix lines of history. Practically this means,
	// for each commit:
	// - If it has one parent and its parent has one child,
	//   they are adjacent in the sorted slice.
	// - If it has multiple parents, it is adjacent to one of them.
	// - If it has multiple children, it is adjacent to one of them.

	// Create a mapping from commits to their children.
	children := make(map[*repograph.Commit]map[*repograph.Commit]bool, len(commits))
	for _, c := range commits {
		for _, p := range c.GetParents() {
			// Don't include parents which aren't in the slice.
			if !commitsMap[p] {
				continue
			}
			subMap, ok := children[p]
			if !ok {
				subMap = map[*repograph.Commit]bool{}
				children[p] = subMap
			}
			subMap[c] = true
		}
	}

	// Verify that the above cases are true for each commit in the slice.
	for idx, c := range commits {
		// If the commit has one parent, and its parent has one child,
		// they should be adjacent.
		if len(c.GetParents()) == 1 && len(children[c.GetParents()[0]]) == 1 {
			// Expect that we're not at the end of the commits slice
			// since the parent should be listed after the current
			// commit.
			require.True(t, len(commits) > idx+1)
			require.Equal(t, c.GetParents()[0], commits[idx+1])
		}

		// If the commit has multiple parents, it should be adjacent to
		// one of them.
		if len(c.GetParents()) > 1 {
			expectParentAdjacent := false
			parentIsAdjacent := false
			for _, p := range c.GetParents() {
				// Only include parents which are in the slice.
				if commitsMap[p] {
					expectParentAdjacent = true
					if len(commits) > idx+1 && commits[idx+1] == p {
						parentIsAdjacent = true
						break
					}
				}
			}
			require.Equal(t, expectParentAdjacent, parentIsAdjacent)
		}

		// If the commit has multiple children, it should be adjacent
		// to one of them.
		if len(children[c]) > 1 {
			require.True(t, idx > 0)
			childIsAdjacent := false
			for child := range children[c] {
				if commits[idx-1] == child {
					childIsAdjacent = true
					break
				}
			}
			require.True(t, childIsAdjacent)
		}
	}
}

// Assert that the given commit hashses are in reverse topological order.
func assertHashesTopoSorted(t sktest.TestingT, repo *repograph.Graph, hashes []string) {
	commits := make([]*repograph.Commit, 0, len(hashes))
	for _, hash := range hashes {
		commits = append(commits, repo.Get(hash))
	}
	AssertTopoSorted(t, commits)
}

func TestGraphWellFormed(t sktest.TestingT, ctx context.Context, g *git_testutils.GitBuilder, repo *repograph.Graph, rf RepoImplRefresher) {
	commits := GitSetup(t, ctx, g, repo, rf)

	c1 := commits[0]
	c2 := commits[1]
	c3 := commits[2]
	c4 := commits[3]
	c5 := commits[4]

	// Trace commits back to the beginning of time.
	require.Equal(t, []*repograph.Commit{c4, c3}, c5.GetParents())
	require.Equal(t, []*repograph.Commit{c2}, c4.GetParents())
	require.Equal(t, []*repograph.Commit{c1}, c2.GetParents())
	require.Equal(t, []*repograph.Commit(nil), c1.GetParents())
	require.Equal(t, []*repograph.Commit{c2}, c3.GetParents())

	// Assert that each of the commits has the correct index.
	require.Equal(t, 0, c1.Index)
	require.Equal(t, 1, c2.Index)
	require.Equal(t, 2, c3.Index)
	require.Equal(t, 2, c4.Index)
	require.Equal(t, 3, c5.Index)

	// Ensure that we can start in an empty dir and check out from scratch properly.
	tmp2, err := os.MkdirTemp("", "")
	require.NoError(t, err)
	defer testutils.RemoveAll(t, tmp2)
	repo2, err := repograph.NewLocalGraph(ctx, g.Dir(), tmp2)
	require.NoError(t, err)
	require.NoError(t, repo2.Update(ctx))
	assertdeep.Equal(t, repo.Branches(), repo2.Branches())
	m1 := repo.Get(git.MainBranch)
	m2 := repo2.Get(git.MainBranch)
	// Different implementations may or may not track branch info.
	for _, c := range repo2.GetAll() {
		c.Branches = repo.Get(c.Hash).Branches
	}
	assertdeep.Equal(t, m1, m2)
}

func TestRecurse(t sktest.TestingT, ctx context.Context, g *git_testutils.GitBuilder, repo *repograph.Graph, rf RepoImplRefresher) {
	commits := GitSetup(t, ctx, g, repo, rf)

	c1 := commits[0]
	c2 := commits[1]
	c3 := commits[2]
	c4 := commits[3]
	c5 := commits[4]

	// Get the list of commits using head.Recurse(). Ensure that we get all
	// of the commits but don't get any duplicates.
	head := repo.Get(git.MainBranch)
	require.NotNil(t, head)
	gotCommits := map[*repograph.Commit]bool{}
	require.NoError(t, head.Recurse(func(c *repograph.Commit) error {
		require.False(t, gotCommits[c])
		gotCommits[c] = true
		return nil
	}))
	require.Equal(t, len(commits), len(gotCommits))
	for _, c := range commits {
		require.True(t, gotCommits[c])
	}
	// AllCommits is the same thing as the above.
	allCommits, err := head.AllCommits()
	require.NoError(t, err)
	require.Equal(t, len(allCommits), len(gotCommits))

	// Verify that we properly return early when the passed-in function
	// return false.
	gotCommits = map[*repograph.Commit]bool{}
	require.NoError(t, head.Recurse(func(c *repograph.Commit) error {
		gotCommits[c] = true
		if c == c3 || c == c4 {
			return repograph.ErrStopRecursing
		}
		return nil
	}))
	require.False(t, gotCommits[c1])
	require.False(t, gotCommits[c2])

	// Verify that we properly exit immediately when the passed-in function
	// returns an error.
	gotCommits = map[*repograph.Commit]bool{}
	require.Error(t, head.Recurse(func(c *repograph.Commit) error {
		gotCommits[c] = true
		if c == c4 {
			return fmt.Errorf("STOP!")
		}
		return nil
	}))
	require.False(t, gotCommits[c1])
	require.False(t, gotCommits[c2])
	require.False(t, gotCommits[c3])
	require.True(t, gotCommits[c4])
	require.True(t, gotCommits[c5])
}

func TestRecurseAllBranches(t sktest.TestingT, ctx context.Context, g *git_testutils.GitBuilder, repo *repograph.Graph, rf RepoImplRefresher) {
	commits := GitSetup(t, ctx, g, repo, rf)

	c1 := commits[0]
	c2 := commits[1]
	c3 := commits[2]
	c4 := commits[3]

	test := func() {
		gotCommits := map[*repograph.Commit]bool{}
		require.NoError(t, repo.RecurseAllBranches(func(c *repograph.Commit) error {
			require.False(t, gotCommits[c])
			gotCommits[c] = true
			return nil
		}))
		require.Equal(t, len(commits), len(gotCommits))
		for _, c := range commits {
			require.True(t, gotCommits[c])
		}
	}

	// Get the list of commits using head.RecurseAllBranches(). Ensure that
	// we get all of the commits but don't get any duplicates.
	test()

	// The above used only one branch. Add a branch and ensure that we see
	// its commits too.
	g.CreateBranchTrackBranch(ctx, "mybranch", git.DefaultRemoteBranch)
	c5 := g.CommitGen(ctx, "anotherfile.txt")
	c5details, err := git.CheckoutDir(g.Dir()).Details(ctx, c5)
	require.NoError(t, err)
	rf.Refresh(c5details)
	require.NoError(t, repo.Update(ctx))
	c := repo.Get("mybranch")
	require.NotNil(t, c)
	commits = append(commits, c)
	test()

	// Verify that we don't revisit a branch whose HEAD is an ancestor of
	// a different branch HEAD.
	g.CreateBranchAtCommit(ctx, "ancestorbranch", c3.Hash)
	rf.Refresh()
	require.NoError(t, repo.Update(ctx))
	test()

	// Verify that we still stop recursion when requested.
	gotCommits := map[*repograph.Commit]bool{}
	require.NoError(t, repo.RecurseAllBranches(func(c *repograph.Commit) error {
		gotCommits[c] = true
		if c == c3 || c == c4 {
			return repograph.ErrStopRecursing
		}
		return nil
	}))
	require.False(t, gotCommits[c1])
	require.False(t, gotCommits[c2])

	// Verify that we error out properly.
	gotCommits = map[*repograph.Commit]bool{}
	require.Error(t, repo.RecurseAllBranches(func(c *repograph.Commit) error {
		gotCommits[c] = true
		// Because of nondeterministic map iteration and the added
		// branches, we have to halt way back at c2 in order to have
		// a sane, deterministic test case.
		if c == c2 {
			return fmt.Errorf("STOP!")
		}
		return nil
	}))
	require.False(t, gotCommits[c1])
	require.True(t, gotCommits[c2])
}

func TestLogLinear(t sktest.TestingT, ctx context.Context, g *git_testutils.GitBuilder, repo *repograph.Graph, rf RepoImplRefresher) {
	commits := GitSetup(t, ctx, g, repo, rf)

	c1 := commits[0]
	c2 := commits[1]
	c3 := commits[2]
	c4 := commits[3]
	c5 := commits[4]

	gitdir := git.CheckoutDir(g.Dir())
	test := func(from, to string, checkAgainstGit bool, expect ...*repograph.Commit) {
		if checkAgainstGit {
			// Ensure that our expectations match actual git results.
			cmd := []string{"--first-parent"}
			if from == "" {
				cmd = append(cmd, to)
			} else {
				cmd = append(cmd, "--ancestry-path", git.LogFromTo(from, to))
			}
			hashes, err := gitdir.RevList(ctx, cmd...)
			require.NoError(t, err)
			require.Equal(t, len(hashes), len(expect))
			for i, h := range hashes {
				require.Equal(t, h, expect[i].Hash)
			}
		}

		// Ensure that we get the expected results from the Graph.
		actual, err := repo.LogLinear(from, to)
		require.NoError(t, err)
		assertdeep.Equal(t, expect, actual)
	}

	// Get the full linear history from c5.
	test("", c5.Hash, true, c5, c4, c2, c1)
	// Get the linear history from c1 to c5. Like "git log", we don't
	// include the "from" commit in the results.
	test(c1.Hash, c5.Hash, true, c5, c4, c2)
	// c3 is not reachable via first-parents from c5. For some reason, git
	// actually returns c5.Hash, even though c5 has c4 as its first parent.
	// Ignore the check against git in this case.
	test(c3.Hash, c5.Hash, false)
}

func TestUpdateHistoryChanged(t sktest.TestingT, ctx context.Context, g *git_testutils.GitBuilder, repo *repograph.Graph, rf RepoImplRefresher) {
	commits := GitSetup(t, ctx, g, repo, rf)
	co := git.CheckoutDir(g.Dir())

	// c3 is the one commit on branch2.
	c3 := repo.Get("branch2")
	require.NotNil(t, c3)
	require.Equal(t, c3, commits[2]) // c3 from setup()

	// Change branch 2 to be based at c4 with one commit, c6.
	g.CheckoutBranch(ctx, "branch2")
	g.Reset(ctx, "--hard", commits[3].Hash) // c4 from setup()
	f := "myfile"
	c6hash := g.CommitGen(ctx, f)
	c6details, err := co.Details(ctx, c6hash)
	require.NoError(t, err)
	rf.Refresh(c6details)
	require.NoError(t, repo.Update(ctx))
	c6 := repo.Get("branch2")
	require.NotNil(t, c6)
	require.Equal(t, c6hash, c6.Hash)

	// Ensure that c3 is not reachable from c6.
	anc, err := repo.IsAncestor(c3.Hash, c6.Hash)
	require.NoError(t, err)
	require.False(t, anc)

	require.NoError(t, c6.Recurse(func(c *repograph.Commit) error {
		require.NotEqual(t, c, c3)
		return nil
	}))

	// Create a new branch, add some commits. Reset the old branches to
	// orphan some commits. Ensure that those are removed from the graph.
	g.CreateBranchAtCommit(ctx, "new", commits[0].Hash)
	c7 := g.CommitGen(ctx, "blah")
	c8 := g.CommitGen(ctx, "blah")
	g.CheckoutBranch(ctx, git.MainBranch)
	g.Reset(ctx, "--hard", c8)
	c7details, err := co.Details(ctx, c7)
	require.NoError(t, err)
	c8details, err := co.Details(ctx, c8)
	require.NoError(t, err)
	rf.Refresh(c7details, c8details)
	require.NoError(t, repo.Update(ctx))
	require.NotNil(t, repo.Get(c7))
	require.NotNil(t, repo.Get(c8))
	main := repo.Get(git.MainBranch)
	require.NotNil(t, main)
	require.Equal(t, c8, main.Hash)
	require.NoError(t, repo.RecurseAllBranches(func(c *repograph.Commit) error {
		require.NotEqual(t, c.Hash, commits[2].Hash)
		require.NotEqual(t, c.Hash, commits[4].Hash)
		return nil
	}))
	require.Nil(t, repo.Get(commits[2].Hash)) // Should be orphaned now.
	require.Nil(t, repo.Get(commits[4].Hash)) // Should be orphaned now.

	// Delete branch2. Ensure that c6 disappears.
	g.UpdateRef(ctx, "-d", "refs/heads/branch2")
	rf.Refresh()
	require.NoError(t, repo.Update(ctx))
	require.Nil(t, repo.Get("branch2"))
	require.Nil(t, repo.Get(c6hash))

	// Rewind a branch. Make sure that we correctly handle this case.
	removed := []string{c7, c8}
	for _, c := range removed {
		require.NotNil(t, repo.Get(c))
	}
	g.UpdateRef(ctx, git.DefaultRef, commits[0].Hash)
	g.UpdateRef(ctx, "refs/heads/new", commits[0].Hash)
	rf.Refresh()
	require.NoError(t, repo.Update(ctx))
	require.NotNil(t, repo.Get(git.MainBranch))
	require.NotNil(t, repo.Get(commits[0].Hash))
	require.Equal(t, commits[0].Hash, repo.Get(commits[0].Hash).Hash)
	for _, c := range removed {
		require.Nil(t, repo.Get(c))
	}
}

func TestUpdateAndReturnCommitDiffs(t sktest.TestingT, ctx context.Context, g *git_testutils.GitBuilder, repo *repograph.Graph, rf RepoImplRefresher) {
	GitSetup(t, ctx, g, repo, rf)
	co := git.CheckoutDir(g.Dir())

	// The repo has commits, but GitSetup has already run Update(), so
	// there's nothing new.
	rf.Refresh()
	added, removed, err := repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, len(added), 0)
	require.Equal(t, len(removed), 0)

	// No new commits.
	rf.Refresh()
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 0, len(added))
	require.Equal(t, len(removed), 0)

	// Add a few commits, ensure that they get picked up.
	g.CheckoutBranch(ctx, git.MainBranch)
	f := "myfile"
	new1 := g.CommitGen(ctx, f)
	new2 := g.CommitGen(ctx, f)
	new1details, err := co.Details(ctx, new1)
	require.NoError(t, err)
	new2details, err := co.Details(ctx, new2)
	require.NoError(t, err)
	rf.Refresh(new1details, new2details)
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 2, len(added))
	require.Equal(t, len(removed), 0)
	if added[0].Hash == new1 {
		require.Equal(t, new2, added[1].Hash)
	} else {
		require.Equal(t, new1, added[1].Hash)
		require.Equal(t, new2, added[0].Hash)
	}

	// Add commits on both branches, ensure that they get picked up.
	new1 = g.CommitGen(ctx, f)
	g.CheckoutBranch(ctx, "branch2")
	new2 = g.CommitGen(ctx, "file2")
	new1details, err = co.Details(ctx, new1)
	require.NoError(t, err)
	new2details, err = co.Details(ctx, new2)
	require.NoError(t, err)
	rf.Refresh(new1details, new2details)
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 2, len(added))
	require.Equal(t, len(removed), 0)
	if added[0].Hash == new1 {
		require.Equal(t, new2, added[1].Hash)
	} else {
		require.Equal(t, new1, added[1].Hash)
		require.Equal(t, new2, added[0].Hash)
	}

	// Add a new branch. Make sure that we don't get duplicate commits.
	g.CheckoutBranch(ctx, git.MainBranch)
	g.CreateBranchTrackBranch(ctx, "branch3", git.MainBranch)
	rf.Refresh()
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 0, len(added))
	require.Equal(t, len(removed), 0)
	require.Equal(t, 3, len(repo.BranchHeads()))

	// Make sure we get no duplicates if the branch heads aren't the same.
	g.Reset(ctx, "--hard", git.MainBranch+"^")
	rf.Refresh()
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 0, len(added))
	require.Equal(t, len(removed), 0)

	// Create a new branch.
	g.CheckoutBranch(ctx, git.MainBranch)
	g.CreateBranchTrackBranch(ctx, "branch4", git.MainBranch)
	rf.Refresh()
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 0, len(added))
	require.Equal(t, len(removed), 0)

	// Add a commit on the new branch.
	new1 = g.CommitGen(ctx, f)
	new1details, err = co.Details(ctx, new1)
	require.NoError(t, err)
	rf.Refresh(new1details)
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 1, len(added))
	require.Equal(t, len(removed), 0)
	require.Equal(t, new1, added[0].Hash)

	// Add a merge commit. Because there were no commits on main in
	// between, the main branch head moves and now has the same hash as
	// "branch4", which means that there aren't any new commits even though
	// the branch head changed.
	g.CheckoutBranch(ctx, git.MainBranch)
	mergeCommit := g.MergeBranch(ctx, "branch4")
	mergeCommitDetails, err := co.Details(ctx, mergeCommit)
	require.NoError(t, err)
	rf.Refresh(mergeCommitDetails)
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 0, len(added))
	require.Equal(t, len(removed), 0)
	require.Equal(t, mergeCommit, new1)

	// Create a new branch.
	g.CheckoutBranch(ctx, git.MainBranch)
	g.CreateBranchTrackBranch(ctx, "branch5", git.MainBranch)
	rf.Refresh()
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 0, len(added))
	require.Equal(t, len(removed), 0)

	// Add a commit on the new branch.
	new1 = g.CommitGen(ctx, f)
	new1details, err = co.Details(ctx, new1)
	require.NoError(t, err)
	rf.Refresh(new1details)
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 1, len(added))
	require.Equal(t, len(removed), 0)
	require.Equal(t, new1, added[0].Hash)

	// Add a commit on the main branch.
	g.CheckoutBranch(ctx, git.MainBranch)
	new1 = g.CommitGen(ctx, "file2")
	new1details, err = co.Details(ctx, new1)
	require.NoError(t, err)
	rf.Refresh(new1details)
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 1, len(added))
	require.Equal(t, len(removed), 0)
	require.Equal(t, new1, added[0].Hash)

	// Merge "branch5" into main. This should result in a new commit.
	mergeCommit = g.MergeBranch(ctx, "branch5")
	mergeCommitDetails, err = co.Details(ctx, mergeCommit)
	require.NoError(t, err)
	rf.Refresh(mergeCommitDetails)
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 1, len(added))
	require.Equal(t, len(removed), 0)
	require.Equal(t, mergeCommit, added[0].Hash)

	// Reset all branches to the initial commit.
	var c0 string
	require.NoError(t, repo.Get(git.MainBranch).Recurse(func(c *repograph.Commit) error {
		if len(c.Parents) == 0 {
			c0 = c.Hash
			return repograph.ErrStopRecursing
		}
		return nil
	}))
	for _, branch := range []string{git.MainBranch, "branch2", "branch3", "branch4", "branch5"} {
		g.CheckoutBranch(ctx, branch)
		g.Reset(ctx, "--hard", c0)
	}
	rf.Refresh()
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 0, len(added))
	require.Equal(t, 12, len(removed))

	// Add some new commits, some of which share an ancestor. Ensure that
	// the added list doesn't double-count the shared commit.
	g.CheckoutBranch(ctx, git.MainBranch)
	shared := g.CommitGen(ctx, "f")
	main := g.CommitGen(ctx, "f")
	g.CheckoutBranch(ctx, "branch2")
	g.Reset(ctx, "--hard", shared)
	branch2 := g.CommitGen(ctx, "f2")
	sharedDetails, err := co.Details(ctx, shared)
	mainDetails, err := co.Details(ctx, main)
	branch2Details, err := co.Details(ctx, branch2)
	rf.Refresh(sharedDetails, mainDetails, branch2Details)
	added, removed, err = repo.UpdateAndReturnCommitDiffs(ctx)
	require.NoError(t, err)
	require.Equal(t, 3, len(added))
	require.Equal(t, 0, len(removed))
}

func TestRevList(t sktest.TestingT, ctx context.Context, gb *git_testutils.GitBuilder, repo *repograph.Graph, rf RepoImplRefresher) {
	commits := git_testutils.GitSetup(ctx, gb)
	tmpDir, err := os.MkdirTemp("", "")
	require.NoError(t, err)
	defer testutils.RemoveAll(t, tmpDir)
	d1 := path.Join(tmpDir, "1")
	require.NoError(t, os.Mkdir(d1, os.ModePerm))
	co, err := git.NewCheckout(ctx, gb.Dir(), d1)
	require.NoError(t, err)
	d2 := path.Join(tmpDir, "2")
	require.NoError(t, os.Mkdir(d2, os.ModePerm))
	g, err := repograph.NewLocalGraph(ctx, gb.Dir(), d2)
	require.NoError(t, err)
	require.NoError(t, g.Update(ctx))

	check := func(from, to string, expectOrig []string) {
		expect := util.CopyStringSlice(expectOrig)
		revs, err := co.RevList(ctx, git.LogFromTo(from, to))
		require.NoError(t, err)
		// Sanity check; assert that the commits returned from git are
		// in reverse topological order.
		assertHashesTopoSorted(t, g, revs)

		// Topological sorting is not deterministic, so we can't compare
		// the slices directly.
		sort.Strings(expect)
		sort.Strings(revs)
		assertdeep.Equal(t, expect, revs)

		revs, err = g.RevList(from, to)
		require.NoError(t, err)
		assertHashesTopoSorted(t, g, revs)
		sort.Strings(revs)
		assertdeep.Equal(t, expect, revs)
	}

	check(commits[0], commits[4], commits[1:])
	check(commits[1], commits[2], commits[2:3])
	check(commits[1], commits[4], commits[2:5])
	check(commits[2], commits[4], commits[3:5])
	check(commits[3], commits[4], []string{commits[2], commits[4]})
}

func TestBranchMembership(t sktest.TestingT, ctx context.Context, gb *git_testutils.GitBuilder, repo *repograph.Graph, rf RepoImplRefresher) {
	commits := GitSetup(t, ctx, gb, repo, rf)
	c1 := commits[0]
	c2 := commits[1]
	c3 := commits[2]
	c4 := commits[3]
	c5 := commits[4]
	co := git.CheckoutDir(gb.Dir())
	test := func(c *repograph.Commit, branches ...string) {
		require.Equal(t, len(branches), len(c.Branches))
		for _, b := range branches {
			require.True(t, c.Branches[b])
		}
	}
	up := func(expect ...*repograph.Commit) {
		actual := repo.UpdateBranchInfo()
		// Some implementations of RepoImpl call UpdateBranchInfo() in
		// their UpdateCallback(), so it's possible that when the test
		// calls UpdateBranchInfo(), no commits are changed.
		if len(actual) == 0 {
			return
		}
		require.Equal(t, len(actual), len(expect))
		commitMap := make(map[string]*vcsinfo.LongCommit, len(actual))
		for _, c := range actual {
			commitMap[c.Hash] = c
		}
		for _, c := range expect {
			_, ok := commitMap[c.Hash]
			require.True(t, ok, "%s not modified", c.Hash)
		}
		// Verify that we deduplicated the branch maps.
		maps := map[string]uintptr{}
		for _, c := range actual {
			keys := util.StringSet(c.Branches).Keys()
			sort.Strings(keys)
			str := strings.Join(keys, ",")
			ptr := reflect.ValueOf(c.Branches).Pointer()
			if exist, ok := maps[str]; ok {
				require.Equal(t, exist, ptr)
			} else {
				maps[str] = ptr
			}
		}
	}

	// Update branch info. Ensure that all commits were updated with the
	// correct branch membership.
	up(c1, c2, c3, c4, c5)
	test(c1, git.MainBranch, "branch2")
	test(c2, git.MainBranch, "branch2")
	test(c3, "branch2") // c3 is reachable from main, but not via first-parent.
	test(c4, git.MainBranch)
	test(c5, git.MainBranch)

	// Add a branch.
	gb.CreateBranchTrackBranch(ctx, "b3", git.MainBranch)
	rf.Refresh()
	require.NoError(t, repo.Update(ctx))
	up(c1, c2, c4, c5)
	test(c1, git.MainBranch, "branch2", "b3")
	test(c2, git.MainBranch, "branch2", "b3")
	test(c3, "branch2") // c3 is reachable from b3, but not via first-parent.
	test(c4, git.MainBranch, "b3")
	test(c5, git.MainBranch, "b3")

	// Reset b3 to branch2.
	gb.Reset(ctx, "--hard", "branch2")
	rf.Refresh()
	require.NoError(t, repo.Update(ctx))
	up(c3, c4, c5)
	test(c1, git.MainBranch, "branch2", "b3")
	test(c2, git.MainBranch, "branch2", "b3")
	test(c3, "branch2", "b3")
	test(c4, git.MainBranch)
	test(c5, git.MainBranch)

	// Reset branch2 to c4.
	gb.CheckoutBranch(ctx, "branch2")
	gb.Reset(ctx, "--hard", c4.Hash)
	rf.Refresh()
	require.NoError(t, repo.Update(ctx))
	up(c3, c4)
	test(c1, git.MainBranch, "branch2", "b3")
	test(c2, git.MainBranch, "branch2", "b3")
	test(c3, "b3")
	test(c4, git.MainBranch, "branch2")
	test(c5, git.MainBranch)

	// Delete b3. We should get the same results as before it was added.
	gb.CheckoutBranch(ctx, git.MainBranch)
	gb.UpdateRef(ctx, "-d", "refs/heads/b3")
	rf.Refresh()
	require.NoError(t, repo.Update(ctx))
	up(c1, c2, c3)
	test(c1, git.MainBranch, "branch2")
	test(c2, git.MainBranch, "branch2")
	test(c3)
	test(c4, git.MainBranch, "branch2")
	test(c5, git.MainBranch)

	// Add a commit.
	c6hash := gb.CommitGenAt(ctx, "blah", c5.Timestamp.Add(time.Second))
	c6details, err := co.Details(ctx, c6hash)
	require.NoError(t, err)
	rf.Refresh(c6details)
	require.NoError(t, repo.Update(ctx))
	c6 := repo.Get(c6hash)
	require.NotNil(t, c6)
	up(c6)
	test(c1, git.MainBranch, "branch2")
	test(c2, git.MainBranch, "branch2")
	test(c3)
	test(c4, git.MainBranch, "branch2")
	test(c5, git.MainBranch)
	test(c6, git.MainBranch)
}
