aboutsummaryrefslogtreecommitdiffstats
path: root/repository/gogit.go
diff options
context:
space:
mode:
authorAlec Lanter <kintar1900@gmail.com>2023-01-21 16:10:02 -0600
committerAlec Lanter <kintar1900@gmail.com>2023-01-21 16:10:02 -0600
commite97df9c8102c92701489cb2693294064f1488b4b (patch)
treefd695ca699d5d13223692ad9b89fb20905805489 /repository/gogit.go
parent06e8396e6fe83c691bbdfd74cfdd6bc28a0d20f1 (diff)
downloadgit-bug-e97df9c8102c92701489cb2693294064f1488b4b.tar.gz
fix(#971): parse submodule .git files instead of erroring
Altered logic for detecting git directory. Instead of erroring on non-direcctory .git files, now parses the file and returns the linked gitdir.
Diffstat (limited to 'repository/gogit.go')
-rw-r--r--repository/gogit.go23
1 files changed, 23 insertions, 0 deletions
diff --git a/repository/gogit.go b/repository/gogit.go
index 93806026..18f7fb59 100644
--- a/repository/gogit.go
+++ b/repository/gogit.go
@@ -1,6 +1,7 @@
package repository
import (
+ "bufio"
"bytes"
"errors"
"fmt"
@@ -170,6 +171,28 @@ func detectGitPath(path string) (string, error) {
fi, err := os.Stat(filepath.Join(path, ".git"))
if err == nil {
if !fi.IsDir() {
+ // See if our .git item is a dotfile that holds a submodule reference
+ dotfile, err := os.Open(fi.Name())
+ if err != nil {
+ // Can't open" error
+ return "", fmt.Errorf(".git exists but is not a directory or a readable file: %w", err)
+ }
+ // We aren't going to defer the dotfile.Close, because we might keep looping, so we have to be sure to
+ // clean up before returning an error
+ reader := bufio.NewReader(dotfile)
+ line, _, err := reader.ReadLine()
+ if err != nil {
+ _ = dotfile.Close()
+ return "", fmt.Errorf(".git exists but is not a direcctory and cannot be read: %w", err)
+ }
+ dotContent := string(line)
+ if strings.HasPrefix(dotContent, "gitdir:") {
+ _ = dotfile.Close()
+ // This is a submodule parent path link. Strip the prefix, clean the string of whitespace just to
+ // be safe, and return
+ dotContent = strings.TrimSpace(dotContent[7:])
+ return dotContent, nil
+ }
return "", fmt.Errorf(".git exist but is not a directory")
}
return filepath.Join(path, ".git"), nil