Brian McGee
80e99b6d75
Figured out how to use `go-git` properly. ```console # git ❯ nix run .# -- --config-file ./test/echo.toml --tree-root /home/brian/Development/com/github/nixos/nixpkgs -c 38539 files changed in 272.843495ms # filesystem ❯ nix run .# -- --config-file ./test/echo.toml --tree-root /home/brian/Development/com/github/nixos/nixpkgs -c --walk filesystem 38567 files changed in 348.84277ms ``` Signed-off-by: Brian McGee <brian@bmcgee.ie> Reviewed-on: #23 Reviewed-by: Jonas Chevalier <zimbatm@noreply.git.numtide.com> Co-authored-by: Brian McGee <brian@bmcgee.ie> Co-committed-by: Brian McGee <brian@bmcgee.ie>
54 lines
884 B
Go
54 lines
884 B
Go
package walk
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/go-git/go-git/v5"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
type gitWalker struct {
|
|
root string
|
|
repo *git.Repository
|
|
}
|
|
|
|
func (g *gitWalker) Root() string {
|
|
return g.root
|
|
}
|
|
|
|
func (g *gitWalker) Walk(ctx context.Context, fn filepath.WalkFunc) error {
|
|
|
|
idx, err := g.repo.Storer.Index()
|
|
if err != nil {
|
|
return fmt.Errorf("%w: failed to open index", err)
|
|
}
|
|
|
|
for _, entry := range idx.Entries {
|
|
|
|
select {
|
|
case <-ctx.Done():
|
|
return ctx.Err()
|
|
default:
|
|
path := filepath.Join(g.root, entry.Name)
|
|
|
|
// stat the file
|
|
info, err := os.Lstat(path)
|
|
if err = fn(path, info, err); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func NewGit(root string) (Walker, error) {
|
|
repo, err := git.PlainOpen(root)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%w: failed to open git repo", err)
|
|
}
|
|
return &gitWalker{root, repo}, nil
|
|
}
|