mirror of
https://github.com/vbatts/utils.git
synced 2024-12-04 22:45:42 +00:00
92 lines
2.3 KiB
Go
92 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/go-git/go-git/v5/config"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var (
|
|
DefaultConfigPath = ".git/config"
|
|
DefaultRepoPath = "."
|
|
DefaultUpstreamName = "origin"
|
|
|
|
PullRequestRefSpec = "+refs/pull/*/head:refs/remotes/pr/*"
|
|
)
|
|
|
|
func init() {
|
|
flag.StringVar(&DefaultConfigPath, "config", DefaultConfigPath, "path to the git config")
|
|
flag.StringVar(&DefaultRepoPath, "path", DefaultRepoPath, "local path of the git repo")
|
|
flag.StringVar(&DefaultUpstreamName, "remote", DefaultUpstreamName, "upstream remote name")
|
|
}
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
|
|
path := filepath.Join(DefaultRepoPath, DefaultConfigPath)
|
|
logrus.Infof("reading from %q", path)
|
|
origBuf, err := ioutil.ReadFile(path)
|
|
if err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
|
|
cfg := config.NewConfig()
|
|
err = cfg.Unmarshal(origBuf)
|
|
if err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
|
|
changesMade := false
|
|
foundRemote := false
|
|
outer:
|
|
for origin, remote := range cfg.Remotes {
|
|
if origin != DefaultUpstreamName {
|
|
logrus.Infof("skipping %s", origin)
|
|
continue
|
|
}
|
|
foundRemote = true
|
|
|
|
foundGithub := false
|
|
for _, url := range remote.URLs {
|
|
logrus.Infof("%s/%s URL: %s", origin, remote.Name, url)
|
|
if strings.Contains(url, "github.com") {
|
|
foundGithub = true
|
|
}
|
|
}
|
|
if !foundGithub {
|
|
logrus.Warn("no github remote URL found. PR RefSpec doesn't make sense here")
|
|
break outer
|
|
}
|
|
for _, fetch := range remote.Fetch {
|
|
if fetch.String() == PullRequestRefSpec {
|
|
logrus.Infof("PR Fetch RefSpec is already here!")
|
|
break outer
|
|
}
|
|
logrus.Debugf("%s/%s = %s", origin, remote.Name, fetch)
|
|
}
|
|
logrus.Infof("appending fetch = %s", PullRequestRefSpec)
|
|
remote.Fetch = append(remote.Fetch, config.RefSpec(PullRequestRefSpec))
|
|
changesMade = true
|
|
}
|
|
if !foundRemote {
|
|
logrus.Fatalf("failed to find %q remote", DefaultUpstreamName)
|
|
}
|
|
|
|
// write back the Marshalled config
|
|
if changesMade {
|
|
newBuf, err := cfg.Marshal()
|
|
if err != nil {
|
|
logrus.Fatalf("failed to marshal back: %s", err)
|
|
}
|
|
//fmt.Println(string(newBuf))
|
|
if err := ioutil.WriteFile(path, newBuf, os.FileMode(0644)); err != nil {
|
|
logrus.Fatalf("failed to rewrite %q: %s", path, err)
|
|
}
|
|
logrus.Infof("SUCCESS! `git fetch` and then you can `git checkout pr/$NUM` of your PRs")
|
|
}
|
|
}
|