mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-14 11:23:09 +02:00
78 lines
1.9 KiB
Go
78 lines
1.9 KiB
Go
package commands
|
|
|
|
import (
|
|
"bufio"
|
|
"os"
|
|
"regexp"
|
|
)
|
|
|
|
// .gitmodules looks like this:
|
|
// [submodule "mysubmodule"]
|
|
// path = blah/mysubmodule
|
|
// url = git@github.com:subbo.git
|
|
|
|
func (c *GitCommand) GetSubmoduleConfigs() ([]*SubmoduleConfig, error) {
|
|
file, err := os.Open(".gitmodules")
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
return nil, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
scanner.Split(bufio.ScanLines)
|
|
|
|
firstMatch := func(str string, regex string) (string, bool) {
|
|
re := regexp.MustCompile(regex)
|
|
matches := re.FindStringSubmatch(str)
|
|
|
|
if len(matches) > 0 {
|
|
return matches[1], true
|
|
} else {
|
|
return "", false
|
|
}
|
|
}
|
|
|
|
configs := []*SubmoduleConfig{}
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
|
|
if name, ok := firstMatch(line, `\[submodule "(.*)"\]`); ok {
|
|
configs = append(configs, &SubmoduleConfig{Name: name})
|
|
continue
|
|
}
|
|
|
|
if len(configs) > 0 {
|
|
lastConfig := configs[len(configs)-1]
|
|
|
|
if path, ok := firstMatch(line, `\s*path\s*=\s*(.*)\s*`); ok {
|
|
lastConfig.Path = path
|
|
} else if url, ok := firstMatch(line, `\s*url\s*=\s*(.*)\s*`); ok {
|
|
lastConfig.Url = url
|
|
}
|
|
}
|
|
}
|
|
|
|
return configs, nil
|
|
}
|
|
|
|
func (c *GitCommand) SubmoduleStash(config *SubmoduleConfig) error {
|
|
// if the path does not exist then it hasn't yet been initialized so we'll swallow the error
|
|
// because the intention here is to have no dirty worktree state
|
|
if _, err := os.Stat(config.Path); os.IsNotExist(err) {
|
|
c.Log.Infof("submodule path %s does not exist, returning", config.Path)
|
|
return nil
|
|
}
|
|
|
|
return c.OSCommand.RunCommand("git -C %s stash --include-untracked", config.Path)
|
|
}
|
|
|
|
func (c *GitCommand) SubmoduleReset(config *SubmoduleConfig) error {
|
|
return c.OSCommand.RunCommand("git submodule update --force %s", config.Name)
|
|
}
|
|
|
|
func (c *GitCommand) SubmoduleUpdateAll() error {
|
|
return c.OSCommand.RunCommand("git submodule update --force")
|
|
}
|