···
···
"github.com/go-git/go-git/v5"
16
+
"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"
20
-
ErrBinaryFile = fmt.Errorf("binary file")
21
-
ErrNotBinaryFile = fmt.Errorf("not binary file")
22
+
ErrBinaryFile = errors.New("binary file")
23
+
ErrNotBinaryFile = errors.New("not binary file")
24
+
ErrMissingGitModules = errors.New("no .gitmodules file found")
25
+
ErrInvalidGitModules = errors.New("invalid .gitmodules file")
26
+
ErrNotSubmodule = errors.New("path is not a submodule")
···
return io.ReadAll(reader)
198
+
// read and parse .gitmodules
199
+
func (g *GitRepo) Submodules() (*config.Modules, error) {
200
+
c, err := g.r.CommitObject(g.h)
202
+
return nil, fmt.Errorf("commit object: %w", err)
205
+
tree, err := c.Tree()
207
+
return nil, fmt.Errorf("tree: %w", err)
210
+
// read .gitmodules file
211
+
modulesEntry, err := tree.FindEntry(".gitmodules")
213
+
return nil, fmt.Errorf("%w: %w", ErrMissingGitModules, err)
216
+
modulesFile, err := tree.TreeEntryFile(modulesEntry)
218
+
return nil, fmt.Errorf("%w: failed to read file: %w", ErrInvalidGitModules, err)
221
+
content, err := modulesFile.Contents()
223
+
return nil, fmt.Errorf("%w: failed to read contents: %w", ErrInvalidGitModules, err)
226
+
// parse .gitmodules
227
+
modules := config.NewModules()
228
+
if err = modules.Unmarshal([]byte(content)); err != nil {
229
+
return nil, fmt.Errorf("%w: failed to parse: %w", ErrInvalidGitModules, err)
232
+
return modules, nil
235
+
func (g *GitRepo) Submodule(path string) (*config.Submodule, error) {
236
+
modules, err := g.Submodules()
241
+
for _, submodule := range modules.Submodules {
242
+
if submodule.Path == path {
243
+
return submodule, nil
247
+
// path is not a submodule
248
+
return nil, ErrNotSubmodule
func (g *GitRepo) Branch(name string) (*plumbing.Reference, error) {
ref, err := g.r.Reference(plumbing.NewBranchReferenceName(name), false)