// Copyright 2017-2025 WIT.COM Inc. All rights reserved. // Use of this source code is governed by the GPL 3.0 package main import ( "os" "path/filepath" "strings" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/forgepb" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) // saves the patches in ~/.config/forge/currentpatches/ func savePatchset(pset *forgepb.Patchset) error { log.Info("savePatches() NAME", pset.Name) log.Info("savePatches() COMMENT", pset.Comment) log.Info("savePatches() GIT_AUTHOR_NAME", pset.GetGitAuthorName()) log.Info("savePatches() GIT_AUTHOR_EMAIL", pset.GetGitAuthorEmail()) log.Info("savePatches() Branch Name", pset.GetStartBranchName()) log.Info("savePatches() Start Hash", pset.GetStartBranchHash()) var count int var bad int var lasterr error all := pset.Patches.SortByFilename() for all.Scan() { p := all.Next() basedir := filepath.Join(os.Getenv("FORGE_CONFIG"), "currentpatches") if fullname, err := savePatchFile(p, basedir); err != nil { log.Info(fullname, "save failed", err) bad += 1 lasterr = err } count += 1 } log.Info("pset has", count, "total patches, ", bad, "bad save patches") if bad == 0 { return lasterr } return nil } // re-run git CheckDirty() on everything func IsAnythingDirty() bool { me.found = new(gitpb.Repos) findAll() // select all the repos doCheckDirtyAndConfigSave() me.found = new(gitpb.Repos) findDirty() if len(me.found.Repos) == 0 { return false } else { return true } } // From 18ee541f89be2e9f9a91c54873da87885e8ffdf5 Mon Sep 17 00:00:00 2001 // From: Jeff Carr // Date: Sun, 5 Jan 2025 01:18:47 -0600 // Subject: [PATCH] 'forge dirty' will find and list only dirty repos // list patches in jcarr but not in devel // git log --format="%H %Subject" jcarr --not devel func countCurrentPatches(repo *gitpb.Repo) int { cmd := []string{"git", "log", "--format=\"%H %s\"", "--no-merges", "jcarr", "--not", "devel"} result := repo.Run(cmd) return len(result.Stdout) } func applyPatchset(pset *forgepb.Patchset) 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.Patches.SortByFilename() for all.Scan() { p := all.Next() basedir := me.forge.GetGoSrc() if fullname, err := savePatchFile(p, basedir); err != nil { log.Info(fullname, "save failed", err) continue } else { basedir, filename := filepath.Split(fullname) cmd := []string{"git", "am", filename} log.Info("Should run: at", basedir, ":", cmd) log.Info(basedir, filename) result := shell.PathRun(basedir, cmd) for _, line := range result.Stdout { log.Warn("stdout:", line) } for _, line := range result.Stderr { log.Warn("stderr:", line) } } everythingworked = false } if everythingworked { os.RemoveAll(tmpdir) // clean up } log.Info("THIS IS THE END MY FRIEND") return nil } func savePatchFile(p *forgepb.Patch, basedir string) (string, error) { basepath, filename := filepath.Split(p.Filename) fulldir := filepath.Join(basedir, basepath) err := os.MkdirAll(fulldir, os.ModePerm) if err != nil { log.Info("applyPathces() MkdirAll failed for", fulldir) log.Info("applyPathces() MkdirAll failed err", err) return "", err } tmpname := filepath.Join(fulldir, filename) log.Info("pset filename FILENAME IS REAL?", tmpname) raw, _ := os.OpenFile(tmpname, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) raw.Write(p.Data) raw.Close() return tmpname, nil } func readPatchFile(pbfile string) (*forgepb.Patchset, 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.Patchset, error) { var pset *forgepb.Patchset pset = new(forgepb.Patchset) err := pset.Unmarshal(bytes) if err != nil { log.Info("Unmarshal failed", err) return nil, err } return pset, nil } func doRegister(newurl string) error { var url string url = me.urlbase + "/register?url=" + newurl body, err := me.forge.HttpPost(url, nil) if err != nil { log.Info("httpPost() failed:", err) return err } test := strings.TrimSpace(string(body)) for _, line := range strings.Split(test, "\n") { line = strings.TrimSpace(line) log.Info("server returned:", line) } return nil }