diff options
| author | Jeff Carr <[email protected]> | 2025-10-12 20:41:59 -0500 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-10-13 03:28:20 -0500 |
| commit | aca9033f21dae1b9862248582827d05151bbe592 (patch) | |
| tree | 4110f7526d08da098d8561c34e6b35c6c91adb3d /makePackagesFile.go | |
| parent | 4cefe0bf52f9d60d25858ebb51b870433004a4a6 (diff) | |
parsing dpkg -I the right way
Diffstat (limited to 'makePackagesFile.go')
| -rw-r--r-- | makePackagesFile.go | 199 |
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 + } + } +*/ |
