in iterator/fs.go [257:315]
func (obj *Fs) GitSubmodulesHelper(ctx context.Context, path safepath.Path) ([]interfaces.Iterator, error) {
// TODO: this could happen in init() if we wanted to optimize perf a bit
gitModulesRelFile, err := safepath.ParseIntoRelFile(".gitmodules")
if err != nil {
return nil, err // bug!
}
absFile, ok := path.(safepath.AbsFile)
if !ok || absFile.Base().Cmp(gitModulesRelFile) != nil {
return nil, nil
}
// parse absFile and get a list of URL's
contents, err := os.ReadFile(absFile.Path())
if err != nil {
return nil, err
}
// found some possible git submodules
modules := gitConfig.NewModules()
if err := modules.Unmarshal(contents); err != nil {
return nil, err
}
iterators := []interfaces.Iterator{}
names := []string{}
for name := range modules.Submodules {
names = append(names, name)
}
sort.Strings(names) // loop in deterministic order
for _, name := range names {
submodule := modules.Submodules[name]
if err := submodule.Validate(); err != nil {
return nil, err
}
if obj.Debug {
obj.Logf("found git submodule named: %s", submodule.Name)
}
iterator := &Git{
Debug: obj.Debug,
Logf: func(format string, v ...interface{}) {
obj.Logf(format, v...) // TODO: add a prefix?
},
Prefix: obj.Prefix,
Iterator: obj,
//submodule.Path
URL: submodule.URL,
//submodule.Branch // TODO: use this?
TrimGitSuffix: true,
}
iterators = append(iterators, iterator)
}
return iterators, nil
}