summaryrefslogtreecommitdiff
path: root/control.read.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-09-11 19:08:15 -0500
committerJeff Carr <[email protected]>2025-09-11 19:08:15 -0500
commit475e72018e18757026e50c1f80d71b630461b7ec (patch)
tree8cbc6bebd3fdebca54bbd9b46ecc5ef59c093a0c /control.read.go
parentaedb5a3bef4eb587e56744837f528836986e9f92 (diff)
Diffstat (limited to 'control.read.go')
-rw-r--r--control.read.go145
1 files changed, 145 insertions, 0 deletions
diff --git a/control.read.go b/control.read.go
new file mode 100644
index 0000000..d6a4c0d
--- /dev/null
+++ b/control.read.go
@@ -0,0 +1,145 @@
+package main
+
+import (
+ "bufio"
+ "os"
+ "path/filepath"
+ "strings"
+ "unicode"
+
+ "go.wit.com/lib/protobuf/gitpb"
+ "go.wit.com/log"
+)
+
+func trimNonNumericPrefix(s string) string {
+ // Find the index of the first character that IS a digit.
+ firstDigitIndex := strings.IndexFunc(s, unicode.IsDigit)
+
+ // If no digit is found, IndexFunc returns -1.
+ // In this case, the result should be an empty string.
+ if firstDigitIndex == -1 {
+ return ""
+ }
+
+ // Return the substring starting from the first digit.
+ return s[firstDigitIndex:]
+}
+
+// readGitConfig reads and parses the control file
+func readControlFile(repo *gitpb.Repo) error {
+ pairs := make(map[string]string)
+ var key string
+
+ file, err := os.Open("control")
+ if err != nil {
+ log.Warn("readControlFile() could not find the file")
+ // return errors.New("'control': file not found")
+ // if this happens, make up a fake control file
+ pairs["Architecture"] = "amd64" // TODO: figure this out
+ pairs["Recommends"] = ""
+ pairs["Source"] = "notsure"
+ if me.repo == nil {
+ pairs["Description"] = "put something here"
+ } else {
+ pairs["Description"] = me.repo.GetGoPath()
+ }
+ if repo.Control == nil {
+ repo.Control = make(map[string]string)
+ }
+ for key, value := range pairs {
+ repo.Control[key] = value
+ }
+ if os.Getenv("GIT_AUTHOR_NAME") != "" {
+ author := log.Sprintf("%s <%s>", os.Getenv("GIT_AUTHOR_NAME"), os.Getenv("GIT_AUTHOR_EMAIL"))
+ repo.Control["Packager"] = author
+ }
+ _, fname := filepath.Split(repo.GetFullPath())
+ repo.Control["Package"] = fname
+ repo.Control["Version"] = trimNonNumericPrefix(repo.GetCurrentVersion())
+ repo.Control["URL"] = repo.URL
+ return nil
+ }
+ defer file.Close()
+
+ pairs["Version"] = trimNonNumericPrefix(repo.GetCurrentVersion())
+
+ scanner := bufio.NewScanner(file)
+ for scanner.Scan() {
+ line := scanner.Text()
+
+ // Skip empty lines and comments
+ if line == "" || strings.HasPrefix(line, "#") || strings.HasPrefix(line, ";") {
+ continue
+ }
+
+ // if line starts with a space, it's part of the last key
+ if strings.HasPrefix(line, " ") {
+ pairs[key] = pairs[key] + "\n" + strings.TrimSpace(line)
+ continue
+ }
+
+ partsNew := strings.SplitN(line, ":", 2)
+ if len(partsNew) < 2 {
+ log.Warn("error on line:", line)
+ continue
+ }
+
+ key = strings.TrimSpace(partsNew[0])
+ value := strings.TrimSpace(partsNew[1])
+ pairs[key] = value
+ }
+ if repo.Control == nil {
+ repo.Control = make(map[string]string)
+ }
+ for key, value := range pairs {
+ repo.Control[key] = value
+ /*
+ switch key {
+ case "Source":
+ c.Source.SetText(value)
+ case "Build-Depends":
+ c.BuildDepends.SetText(value)
+ case "Description":
+ c.Description.SetText(value)
+ case "Maintainer":
+ c.Maintainer.SetText(value)
+ case "Packager":
+ c.Packager.SetText(value)
+ case "GoPath":
+ c.GoPath.SetText(value)
+ case "URL":
+ c.URL.SetText(value)
+ case "Depends":
+ c.Depends.SetText(value)
+ case "Recommends":
+ c.Recommends.SetText(value)
+ case "Conflicts":
+ c.Conflicts.SetText(value)
+ case "Version":
+ c.Version.SetText(value)
+ case "Package":
+ c.Package.SetText(value)
+ // if c.Package.String() != value {
+ // log.Warn("not sure what to do with Package", c.Package.String(), value)
+ // }
+ case "Architecture":
+ // todo: add logic to find OS arch
+ if c.Architecture.String() != value {
+ log.Warn("attempting to set arch to", value)
+ c.Architecture.SetText(value)
+
+ }
+ default:
+ log.Warn("the 'control' file has a value I don't know about")
+ log.Warn("error unknown key", key, "value:", value)
+ }
+ */
+ }
+ pairs["Architecture"] = "amd64" // TODO: figure this out
+
+ if err := scanner.Err(); err != nil {
+ return err
+ }
+
+ return nil
+}