From 3a83cf030d6037790f1a57bb224f6bf55054a120 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Fri, 13 Dec 2024 17:13:29 -0600 Subject: [PATCH] start skipping repos with tracked go.* files --- isTracked.go | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 22 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 isTracked.go diff --git a/isTracked.go b/isTracked.go new file mode 100644 index 0000000..391ecd5 --- /dev/null +++ b/isTracked.go @@ -0,0 +1,62 @@ +package main + +import ( + "fmt" + "os" + "os/exec" + + "go.wit.com/lib/protobuf/gitpb" +) + +func isTracked(file string) (bool, error) { + cmd := exec.Command("git", "ls-files", "--error-unmatch", file) + err := cmd.Run() + if err == nil { + return true, nil + } + if exitError, ok := err.(*exec.ExitError); ok && exitError.ExitCode() == 1 { + return false, nil // File not tracked + } + return false, fmt.Errorf("error checking tracked status: %v", err) +} + +func isIgnored(file string) (bool, error) { + cmd := exec.Command("git", "check-ignore", "-q", file) + err := cmd.Run() + if err == nil { + return true, nil + } + if exitError, ok := err.(*exec.ExitError); ok && exitError.ExitCode() == 1 { + return false, nil // File not ignored + } + return false, fmt.Errorf("error checking ignored status: %v", err) +} + +func repoOwnsGoMod(repo *gitpb.Repo) (bool, error) { + os.Chdir(repo.FullPath) + file := "go.mod" + + tracked, err := isTracked(file) + if err != nil { + fmt.Printf("%s Error checking if tracked: %v\n", repo.GoPath, err) + return false, err + } + + if tracked { + fmt.Printf("%s %s is tracked by Git.\n", repo.GoPath, file) + return true, nil + } + + ignored, err := isIgnored(file) + if err != nil { + fmt.Printf("%s Error checking if ignored: %v\n", repo.GoPath, err) + return false, err + } + + if ignored { + fmt.Printf("%s %s is ignored by Git.\n", repo.GoPath, file) + return true, nil + } + fmt.Printf("%s %s is neither tracked nor ignored by Git.\n", repo.GoPath, file) + return false, nil +} diff --git a/main.go b/main.go index 8febccd..fb50fa0 100644 --- a/main.go +++ b/main.go @@ -131,6 +131,28 @@ func doMain(repo *gitpb.Repo) error { return errors.New(repo.GoPath + " not in the git master branch") } + ok, err := repoOwnsGoMod(repo) + if err != nil { + return err + } + // if ok, then git owns 'go.mod' and we can't really do anything + // todo: ignore this with --force + if ok { + return nil + } else { + if forge.Config.IsReadOnly(repo.GoPath) { + log.Info("skipping read only", repo.GoPath) + return nil + } + } + + if repo.CheckDirty() { + log.Info("") + log.Info("You can not run this on dirty branches.") + log.Info("") + return errors.New(repo.GoPath + " git repo is dirty") + } + // re-create go.sum and go.mod if err := redoGoMod(repo); err != nil { return err