summaryrefslogtreecommitdiff
path: root/reloadParseGitConfig.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-09-11 13:40:48 -0500
committerJeff Carr <[email protected]>2025-09-11 13:40:48 -0500
commite395456c536b2458563d5e872a73e8667cc08659 (patch)
treec9976e9faecac92aeda0aca2cf60ee03a4890f1e /reloadParseGitConfig.go
parentcb604213743839453565a58afbb72bb63a66a9e1 (diff)
cleaning up .git/config parsing
Diffstat (limited to 'reloadParseGitConfig.go')
-rw-r--r--reloadParseGitConfig.go196
1 files changed, 196 insertions, 0 deletions
diff --git a/reloadParseGitConfig.go b/reloadParseGitConfig.go
new file mode 100644
index 0000000..5373e2e
--- /dev/null
+++ b/reloadParseGitConfig.go
@@ -0,0 +1,196 @@
+package gitpb
+
+import (
+ "bufio"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "go.wit.com/log"
+)
+
+// does processing on the go.mod and go.sum files
+
+func (repo *Repo) updateGitConfig() error {
+ if repo == nil {
+ return fmt.Errorf("gitpb.updateGitConfig() repo == nil")
+ }
+ if repo.GitConfig == nil {
+ repo.GitConfig = new(GitConfig)
+ }
+
+ repo.GitConfig.Core = make(map[string]string)
+ repo.GitConfig.Remotes = make(map[string]*GitRemote)
+ repo.GitConfig.Branches = make(map[string]*GitBranch)
+ repo.GitConfig.Submodules = make(map[string]string)
+ repo.GitConfig.Versions = make(map[string]string)
+ repo.GitConfig.Hashes = make(map[string]string)
+ return repo.readGitConfig()
+}
+
+// readGitConfig reads and parses the .git/config file
+func (repo *Repo) readGitConfig() error {
+ filename := filepath.Join(repo.GetFullPath(), ".git/config")
+ file, err := os.Open(filename)
+ defer file.Close()
+ if err != nil {
+ return err
+ }
+
+ var currentSection string = ""
+ var currentName string = ""
+
+ scanner := bufio.NewScanner(file)
+ for scanner.Scan() {
+ line := strings.TrimSpace(scanner.Text())
+
+ // Skip empty lines and comments
+ if line == "" || strings.HasPrefix(line, "#") || strings.HasPrefix(line, ";") {
+ continue
+ }
+
+ // Check for section headers
+ if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") {
+ line = strings.Trim(line, "[]")
+ parts := strings.Split(line, " ")
+ currentSection = parts[0]
+
+ if len(parts) == 2 {
+ line = strings.Trim(line, "[]")
+ currentName = strings.Trim(parts[1], "\"")
+ }
+ continue
+ }
+
+ partsNew := strings.SplitN(line, "=", 2)
+ if len(partsNew) != 2 {
+ log.Log(WARN, "error on config section:", currentSection, "line:", line)
+ }
+
+ key := strings.TrimSpace(partsNew[0])
+ key = strings.TrimSuffix(key, "\"")
+
+ value := strings.TrimSpace(partsNew[1])
+ value = strings.TrimSuffix(value, "\"")
+
+ switch currentSection {
+ case "core":
+ repo.GitConfig.Core[key] = value
+ case "gui":
+ // don't really need gui stuff right now
+ case "pull":
+ // don't store git config pull settings here
+ // git config probably has 'rebase = false'
+ case "remote":
+ test, ok := repo.GitConfig.Remotes[currentName]
+ if !ok {
+ test = new(GitRemote)
+ repo.GitConfig.Remotes[currentName] = test
+ }
+ log.Log(INFO, "switch currentSection", currentSection, currentName)
+ switch key {
+ case "url":
+ if test.Url == value {
+ continue
+ }
+ if test.Url == "" {
+ test.Url = value
+ continue
+ }
+ log.Log(INFO, "error url mismatch", test.Url, value)
+ case "fetch":
+ if test.Fetch == value {
+ continue
+ }
+ if test.Fetch == "" {
+ test.Fetch = value
+ continue
+ }
+ log.Log(INFO, "error fetch mismatch", test.Fetch, value)
+ default:
+ log.Log(INFO, "unknown remote:", line)
+ }
+ case "branch":
+ test, ok := repo.GitConfig.Branches[currentName]
+ if !ok {
+ test = new(GitBranch)
+ repo.GitConfig.Branches[currentName] = test
+ repo.processBranch(currentName)
+ }
+ switch key {
+ case "remote":
+ repo.GitConfig.Branches[currentName].Remote = value
+ case "merge":
+ repo.GitConfig.Branches[currentName].Merge = value
+ default:
+ log.Log(INFO, "error unknown remote:", currentSection, currentName, key, value)
+ log.Log(INFO, "unknown branch:", line)
+ }
+ case "submodule":
+ // test, ok := rs.gitConfig.submodules[currentName]
+ switch key {
+ case "active":
+ // probably 'true' or 'false'
+ case "url":
+ repo.GitConfig.Submodules[currentName] = value
+ default:
+ log.Log(WARN, "unknown submodule line:", line)
+ }
+ case "diff":
+ // test, ok := rs.gitConfig.submodules[currentName]
+ switch key {
+ case "renameLimit":
+ log.Log(INFO, "name:", line)
+ default:
+ log.Log(WARN, "unknown name line:", filename, line)
+ }
+ case "user":
+ // test, ok := rs.gitConfig.submodules[currentName]
+ switch key {
+ case "name":
+ log.Log(INFO, "name:", line)
+ case "email":
+ log.Log(INFO, "email:", line)
+ default:
+ log.Log(WARN, "unknown name line:", filename, line)
+ }
+ case "git-bug":
+ log.Log(WARN, "repo uses git-bug!", filename)
+ default:
+ log.Log(WARN, filename, "unknown line:", line)
+ }
+ }
+
+ if err := scanner.Err(); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (repo *Repo) processBranch(branch string) {
+ log.Log(INFO, " ", branch)
+ hash, ok := repo.GitConfig.Hashes[branch]
+ filename := filepath.Join(repo.GetFullPath() + "/.git/refs/heads/" + branch)
+ log.Log(INFO, " hash: need to open", filename)
+
+ data, err := ioutil.ReadFile(filename)
+ if err != nil {
+ log.Log(WARN, "hash: read failed", filename)
+ return
+ }
+ newhash := strings.TrimSpace(string(data))
+ log.Log(INFO, " hash:", newhash)
+ repo.GitConfig.Hashes[branch] = newhash
+ if ok {
+ if hash != newhash {
+ log.Log(WARN, "hash changed", hash)
+ }
+ }
+
+ name, _ := repo.gitDescribeByHash(newhash)
+ repo.GitConfig.Versions[newhash] = name
+ log.Log(INFO, " hash: version", name)
+}