// SPDX-FileCopyrightText: 2025 Romain Maneschi // // SPDX-License-Identifier: EUPL-1.2 package repository import ( "errors" 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" "github.com/go-git/go-git/v6/plumbing/storer" "github.com/samber/oops" ) func (repo *GitRootRepositoryWrite) WalkCommit(from plumbing.Hash, to plumbing.Hash, callback func(*object.Commit) error) error { unlock := repo.repo.manager.repoLocks.Read(repo.repo.name) defer unlock() return walkCommit(repo.repoWrite, from, to, callback) } func walkCommit(repo *git.Repository, from plumbing.Hash, to plumbing.Hash, callback func(*object.Commit) error) error { if to.Equal(plumbing.ZeroHash) || from.Equal(plumbing.ZeroHash) { return errors.New("zero hash not authorized to walk") } cIter, err := repo.Log(&git.LogOptions{From: to}) if err != nil { return oops.With("hash", to.String()).Wrapf(err, "can't Log") } defer cIter.Close() return cIter.ForEach(func(commit *object.Commit) error { if err := callback(commit); err != nil { return err } if commit.Hash.Equal(from) { return storer.ErrStop } return nil }) }