// Copyright 2024 WIT.COM Inc Licensed GPL 3.0 package main import ( "os" "path/filepath" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/forgepb" "go.wit.com/log" ) func dumpPatchset(pset *forgepb.Patchs) error { log.Info("applyPatches() NAME", pset.Name) log.Info("applyPatches() COMMENT", pset.Comment) log.Info("applyPatches() GIT_AUTHOR_NAME", pset.GetGitAuthorName()) log.Info("applyPatches() GIT_AUTHOR_EMAIL", pset.GetGitAuthorEmail()) log.Info("applyPatches() Branch Name", pset.GetStartBranchName()) log.Info("applyPatches() Start Hash", pset.GetStartBranchHash()) var count int all := pset.SortByFilename() for all.Scan() { p := all.Next() // log.Info("pset filename FILENAME IS REAL?", p.Filename, pset.Name, pset.Comment) basepath, filename := filepath.Split(p.Filename) repo := me.forge.FindByGoPath(basepath) if repo == nil { log.Info("can not apply patch! repo not found", basepath, filename) continue } if repo.DevelHash() != p.StartHash { log.Info("can not apply patch! devel hash mismatch", basepath, filename) continue } log.Info("start:", p.StartHash, "end:", p.CommitHash, "file:", basepath, filename, "devel version", repo.GetDevelVersion()) count += 1 } log.Info("pset has", count, "patches") return nil } func applyPatches(pset *forgepb.Patchs) error { var everythingworked bool = true tmpdir, err := os.MkdirTemp("", "forge") if err != nil { return err } // log.Info("got to applyPatches() pset", pset) log.Info("applyPatches() NAME", pset.Name) log.Info("applyPatches() COMMENT", pset.Comment) log.Info("applyPatches() GIT_AUTHOR_NAME", pset.GetGitAuthorName()) log.Info("applyPatches() GIT_AUTHOR_EMAIL", pset.GetGitAuthorEmail()) all := pset.SortByFilename() for all.Scan() { p := all.Next() // log.Info("pset filename FILENAME IS REAL?", p.Filename, pset.Name, pset.Comment) basepath, filename := filepath.Split(p.Filename) fullpath := filepath.Join(me.forge.GetGoSrc(), basepath) log.Info("pset filename FILENAME IS REAL? fullpath", fullpath) fullTmpdir := filepath.Join(tmpdir, basepath) err := os.MkdirAll(fullTmpdir, os.ModePerm) if err != nil { log.Info("applyPathces() MkdirAll failed for", fullTmpdir) log.Info("applyPathces() MkdirAll failed err", err) everythingworked = false continue } log.Info("pset filename FILENAME IS REAL? tmp fullTmpdir", fullTmpdir) tmpname := filepath.Join(fullTmpdir, filename) raw, _ := os.OpenFile(tmpname, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) raw.Write(p.Data) raw.Close() cmd := []string{"git", "am", tmpname} result := shell.PathRun(fullpath, cmd) if result.Exit != 0 { log.Info("cmd failed", cmd, result.Exit) everythingworked = false } // until 'git am' works everythingworked = false } if everythingworked { os.RemoveAll(tmpdir) // clean up } log.Info("THIS IS THE END MY FRIEND") return nil } func readPatchFile(pbfile string) (*forgepb.Patchs, error) { bytes, err := os.ReadFile(pbfile) if err != nil { log.Info("readfile error", pbfile, err) return nil, err } return handleBytes(bytes) } func handleBytes(bytes []byte) (*forgepb.Patchs, error) { var pset *forgepb.Patchs pset = new(forgepb.Patchs) err := pset.Unmarshal(bytes) if err != nil { log.Info("Unmarshal failed", err) return nil, err } return pset, nil }