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	"errors"
 9
10	git "github.com/go-git/go-git/v6"
11	"github.com/go-git/go-git/v6/plumbing"
12	"github.com/go-git/go-git/v6/plumbing/object"
13	"github.com/go-git/go-git/v6/plumbing/storer"
14	"github.com/samber/oops"
15)
16
17func (repo *GitRootRepositoryWrite) WalkCommit(from plumbing.Hash, to plumbing.Hash, callback func(*object.Commit) error) error {
18	unlock := repo.repo.manager.repoLocks.Read(repo.repo.name)
19	defer unlock()
20	return walkCommit(repo.repoWrite, from, to, callback)
21}
22
23func walkCommit(repo *git.Repository, from plumbing.Hash, to plumbing.Hash, callback func(*object.Commit) error) error {
24	if to.Equal(plumbing.ZeroHash) || from.Equal(plumbing.ZeroHash) {
25		return errors.New("zero hash not authorized to walk")
26	}
27	cIter, err := repo.Log(&git.LogOptions{From: to})
28	if err != nil {
29		return oops.With("hash", to.String()).Wrapf(err, "can't Log")
30	}
31	defer cIter.Close()
32	return cIter.ForEach(func(commit *object.Commit) error {
33		if err := callback(commit); err != nil {
34			return err
35		}
36		if commit.Hash.Equal(from) {
37			return storer.ErrStop
38		}
39		return nil
40	})
41}