···
···
"github.com/go-git/go-git/v5"
+
"github.com/go-git/go-git/v5/config"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object"
+
ErrBinaryFile = errors.New("binary file")
+
ErrNotBinaryFile = errors.New("not binary file")
+
ErrMissingGitModules = errors.New("no .gitmodules file found")
+
ErrInvalidGitModules = errors.New("invalid .gitmodules file")
+
ErrNotSubmodule = errors.New("path is not a submodule")
···
return io.ReadAll(reader)
+
// read and parse .gitmodules
+
func (g *GitRepo) Submodules() (*config.Modules, error) {
+
c, err := g.r.CommitObject(g.h)
+
return nil, fmt.Errorf("commit object: %w", err)
+
return nil, fmt.Errorf("tree: %w", err)
+
// read .gitmodules file
+
modulesEntry, err := tree.FindEntry(".gitmodules")
+
return nil, fmt.Errorf("%w: %w", ErrMissingGitModules, err)
+
modulesFile, err := tree.TreeEntryFile(modulesEntry)
+
return nil, fmt.Errorf("%w: failed to read file: %w", ErrInvalidGitModules, err)
+
content, err := modulesFile.Contents()
+
return nil, fmt.Errorf("%w: failed to read contents: %w", ErrInvalidGitModules, err)
+
modules := config.NewModules()
+
if err = modules.Unmarshal([]byte(content)); err != nil {
+
return nil, fmt.Errorf("%w: failed to parse: %w", ErrInvalidGitModules, err)
+
func (g *GitRepo) Submodule(path string) (*config.Submodule, error) {
+
modules, err := g.Submodules()
+
for _, submodule := range modules.Submodules {
+
if submodule.Path == path {
+
// path is not a submodule
+
return nil, ErrNotSubmodule
func (g *GitRepo) Branch(name string) (*plumbing.Reference, error) {
ref, err := g.r.Reference(plumbing.NewBranchReferenceName(name), false)