diff options
Diffstat (limited to 'gitTag.query.go')
| -rw-r--r-- | gitTag.query.go | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/gitTag.query.go b/gitTag.query.go new file mode 100644 index 0000000..8c288e4 --- /dev/null +++ b/gitTag.query.go @@ -0,0 +1,134 @@ +package gitpb + +// runs git, parses output +// types faster than you can + +import ( + "errors" + "path/filepath" + "strings" + + "go.wit.com/log" +) + +func (repo *Repo) GetLastTag() string { + cmd := []string{"git", "rev-list", "--tags", "--max-count=1"} + result := repo.RunQuiet(cmd) + log.Info("getLastTagVersion()", result.Stdout) + + if len(result.Stdout) != 1 { + log.Log(GITPBWARN, "git LastTag() error:", result.Stdout) + return "" + } + + hash := result.Stdout[0] + + cmd = []string{"git", "describe", "--tags", "--always", hash} + result = repo.RunQuiet(cmd) + + if len(result.Stdout) != 1 { + log.Log(GITPBWARN, "git LastTag() error:", result.Stdout) + return "" + } + + return result.Stdout[0] +} + +func (repo *Repo) GitMasterVersion() string { + v, err := repo.gitVersionByName("master") + /* + count := repo.LenGitTags() + log.Info(repo.GoPath, "tag count", count) + repo.UpdateGitTags() + count = repo.LenGitTags() + log.Info(repo.GoPath, "tag count", count) + */ + + if err == nil { + return v + } else { + log.Log(GITPBWARN, "gitpb.GitMasterVersion() error:", err) + return "" + } +} + +func (repo *Repo) GitDevelVersion() string { + v, err := repo.gitVersionByName("devel") + if err == nil { + return v + } else { + log.Log(GITPBWARN, "gitpb.GitDevelVersion() error:", err) + return "" + } +} + +func (repo *Repo) GitUserVersion() string { + v, err := repo.gitVersionByName("jcarr") + if err == nil { + return v + } else { + log.Log(GITPBWARN, "gitpb.GitUserVersion() error:", err) + return "" + } +} + +func (repo *Repo) gitVersionByName(name string) (string, error) { + name = strings.TrimSpace(name) + + if name == "" { + // git will return the current tag + r := repo.RunQuiet([]string{"git", "describe", "--tags", "--always"}) + output := strings.Join(r.Stdout, "\n") + if r.Error != nil { + log.Log(GITPBWARN, "gitDescribeByName() output might have worked anyway:", output) + log.Log(GITPBWARN, "gitDescribeByName() not in a git repo?", r.Error, repo.GoPath) + return "", r.Error + } + return strings.TrimSpace(output), nil + } + if ! repo.IsBranch(name) { + // tag does not exist + log.Log(GITPBWARN, "LocalTagExists()", name, "did not exist") + return "", errors.New("gitDescribeByName() git fatal: Not a valid object name: " + name) + } + cmd := []string{"git", "describe", "--tags", "--always", name} + result := repo.RunQuiet(cmd) + output := strings.Join(result.Stdout, "\n") + if result.Error != nil { + log.Log(GITPBWARN, "cmd =", cmd) + log.Log(GITPBWARN, "err =", result.Error) + log.Log(GITPBWARN, "output (might have worked with error?) =", output) + log.Log(GITPBWARN, "not in a git repo or bad tag?", repo.GoPath) + return "", result.Error + } + + return strings.TrimSpace(output), nil +} + +// find a branch name +// will find "master" or "devel" +// will also find "v0.1.1" +// or will find "patches-from-foo" +// will return *any* match on any git branch because it doesn't +// matter much here yet +// eventually this will be worked out by forge in some future code that hasn't been made yet +func (repo *Repo) IsBranch(findname string) bool { + loop := repo.Tags.All() + for loop.Scan() { + t := loop.Next() + // log.Info("LocalTagExists() tag:", t.Refname) + + tagname := t.Refname + if strings.HasPrefix(tagname, "refs/remotes") { + continue + } + path, filename := filepath.Split(tagname) + log.Log(GITPB, "gitpb.IsBranch() tag:", path, filename, "from", repo.GoPath) + if filename == findname { + log.Log(GITPB, "gitpb.IsBranch() found tag:", path, filename, "from", repo.GoPath) + return true + } + } + log.Log(GITPBWARN, "did not find tag:", findname, "in", repo.GoPath) + return false +} |
