summaryrefslogtreecommitdiff
path: root/makePackagesFile.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-10-12 20:41:59 -0500
committerJeff Carr <[email protected]>2025-10-13 03:28:20 -0500
commitaca9033f21dae1b9862248582827d05151bbe592 (patch)
tree4110f7526d08da098d8561c34e6b35c6c91adb3d /makePackagesFile.go
parent4cefe0bf52f9d60d25858ebb51b870433004a4a6 (diff)
parsing dpkg -I the right way
Diffstat (limited to 'makePackagesFile.go')
-rw-r--r--makePackagesFile.go199
1 files changed, 199 insertions, 0 deletions
diff --git a/makePackagesFile.go b/makePackagesFile.go
index 9f28e46..d7067e5 100644
--- a/makePackagesFile.go
+++ b/makePackagesFile.go
@@ -1,13 +1,150 @@
package main
import (
+ "bufio"
+ "errors"
+ "path/filepath"
"strings"
"go.wit.com/lib/cobol"
+ "go.wit.com/lib/gui/shell"
"go.wit.com/lib/protobuf/zoopb"
"go.wit.com/log"
+ "google.golang.org/protobuf/types/known/timestamppb"
)
+func populateDebInfo(p *zoopb.Package) error {
+ var verbose bool = false
+ if p.DebInfo != nil {
+ // already added p.DebInfo
+ return nil
+ }
+ fullname := filepath.Join(me.pb.BaseDir, p.Filename)
+ cmd := []string{"dpkg", "-I", fullname}
+ r := shell.Run(cmd)
+ if r.Error != nil {
+ return r.Error
+ }
+ if r.Exit != 0 {
+ return errors.New("dpkg returned -1")
+ }
+ p.DebInfo = new(zoopb.DebInfo)
+
+ starting := true
+ all := strings.Join(r.Stdout, "\n")
+ scanner := bufio.NewScanner(strings.NewReader(all))
+ for scanner.Scan() {
+ line := scanner.Text()
+ parts := strings.Fields(line)
+ if starting {
+ if parts[0] == "new" {
+ if verbose {
+ log.Printf("new: %v\n", parts)
+ }
+ // skip the first dpkg -I line
+ continue
+ }
+ if parts[0] == "size" {
+ if verbose {
+ log.Printf("size: %v\n", parts)
+ }
+ p.DebInfo.InstalledSize = parts[1]
+ // scan all the entries from size
+ for scanner.Scan() {
+ line = scanner.Text()
+ parts = strings.Fields(line)
+ if strings.HasPrefix(line, " ") {
+ if verbose {
+ log.Printf("sizeline: %v\n", parts)
+ }
+ continue
+ }
+ starting = false
+ break
+ }
+ }
+ if starting {
+ if verbose {
+ log.Printf("parts: %v\n", parts)
+ }
+ continue
+ }
+ }
+ varname := strings.TrimSuffix(parts[0], ":")
+ // varname = strings.TrimSuffix(varname, ":") // WTF is causing this to be needed
+ varval := strings.Join(parts[1:], " ")
+ // log.Printf("varname:%s varval:%s\n", varname, varval)
+ switch varname {
+ case "Package":
+ p.Package = varval
+ case "Filename":
+ log.Printf("Filename: varname:%s varval:%s\n", varname, varval)
+ // p.Package = varval
+ case "Version":
+ p.Version = varval
+ case "Architecture":
+ p.Architecture = varval
+ case "GoPath":
+ p.Namespace = varval
+ case "Maintainer":
+ p.DebInfo.Maintainer = varval
+ case "Packager":
+ p.DebInfo.Packager = varval
+ case "Depends":
+ p.DebInfo.Depends = varval
+ case "URL":
+ p.DebInfo.URL = varval
+ case "Build-Depends":
+ p.DebInfo.BuildDepends = varval
+ case "Installed-Size":
+ p.DebInfo.InstalledSize = varval
+ case "Homepage":
+ p.DebInfo.URL = varval
+ case "Package-Build-Date":
+ t, err := cobol.GetTime(varval)
+ if err == nil {
+ p.BuildDate = timestamppb.New(t)
+ } else {
+ if verbose {
+ log.Info("FIXME: Package-Build-Date", varval, err)
+ }
+ }
+ case "Git-Tag-Date":
+ if verbose {
+ log.Info("FIXME: Git-Tag-Date", varval)
+ }
+ case "Description":
+ description := varval
+ for scanner.Scan() {
+ line := scanner.Text()
+ if strings.HasPrefix(line, " ") {
+ line = strings.TrimSpace(line)
+ description += line + "\n"
+ continue
+ }
+ break
+ }
+ p.DebInfo.Description = description
+ default:
+ varname2 := strings.TrimSuffix(varname, ":")
+ log.Printf("UNKNOWN: varname:%s varval:%s varname2=%s\n", varname, varval, varname2)
+ panic("fix mirrors populateDebInfo()")
+ }
+ }
+ // log.Info("Ran:", cmd, r, err)
+ return nil
+}
+
+/*
+UNKNOWN: varname:Depends varval:protobuf-compiler, protoc-gen-go | protoc-gen-go-wit
+UNKNOWN: varname:Build-Depends varval:golang
+UNKNOWN: varname:URL varval:https://go.wit.com/
+UNKNOWN: varname:Package-Build-Date varval:2025/10/05 07:40:30 UTC
+UNKNOWN: varname:Git-Tag-Date varval:todo: get from repo
+UNKNOWN: varname:Description varval:autogen protobuf marshal and sort files
+UNKNOWN: varname:this varval:is needed for go.wit.com/lib/protobuf/ GO packages
+*/
+
func getDebianControlFile(p *zoopb.Package, varname string) (string, string) {
switch varname {
case "Package":
@@ -75,3 +212,65 @@ func doMakePackagesFile(all *zoopb.Packages) string {
}
return pfile
}
+
+/*
+ log.Printf("Scanning for .deb files in %s\n", poolDir)
+ debInfos, err := scanDebs(poolDir, 200)
+ if err != nil {
+ log.Printf("Failed to scan .deb files: %v\n", err)
+ me.sh.BadExit("scan pool scan dir", err)
+ }
+
+ var counter int
+ for _, deb := range debInfos {
+ newdeb := new(zoopb.Package)
+ newdeb.DebInfo = new(zoopb.DebInfo)
+ newdeb.Filename = deb.Filename
+ newdeb.DebInfo.Filename = deb.Filename
+ newdeb.DebInfo.MD5SUM = deb.MD5Sum
+ // newdeb.DebInfo.SHA1 = deb.SHA1Sum
+ newdeb.DebInfo.SHA256 = deb.SHA256Sum
+
+ // log.Info("len(CONTROLDATA)", len(deb.ControlData))
+ // log.Sprintf("VAR='%s' VAL='%s'\n", varname, varvalue)
+ // log.Info("%v", deb.ControlData)
+ for varname, varvalue := range deb.ControlData {
+ switch varname {
+ case "Package":
+ newdeb.Package = varvalue
+ case "Version":
+ newdeb.Version = varvalue
+ case "Architecture":
+ newdeb.Architecture = varvalue
+ case "Git-Tag-Date":
+ if argv.Verbose {
+ log.Info("CONVERT THIS TO TIME", varname, varvalue)
+ }
+ case "Depends":
+ newdeb.DebInfo.Depends = varvalue
+ case "Build-Depends":
+ newdeb.DebInfo.BuildDepends = varvalue
+ case "Packager":
+ newdeb.DebInfo.Packager = varvalue
+ case "Package-Build-Date":
+ varname = "PackageBuildDate"
+ const layout = "2006/01/02 15:04:05 MST"
+ parsedTime, err := time.Parse(layout, varvalue)
+ if err != nil {
+ log.Info("CONVERT TO TIME failed", varname, varvalue, err)
+ }
+ newdeb.BuildDate = timestamppb.New(parsedTime)
+ case "URL":
+ newdeb.DebInfo.Homepage = varvalue
+ default:
+ if err := debian.SetDebInfoString(newdeb, varname, varvalue); err == nil {
+ if argv.Verbose {
+ log.Printf("Searching for Sugarman WORKED: VAR='%-30s' VAL='%s'\n", varname, varvalue)
+ }
+ } else {
+ log.Printf("Searching for Sugarman (unknwon var): VAR='%-30s' VAL='%s' err=%v\n", varname, varvalue, err)
+ }
+ // todo: add to protomap
+ }
+ }
+*/