Skip to content

Commit

Permalink
Merge pull request #132 from tri-adam/mage-refactor
Browse files Browse the repository at this point in the history
Move Git Code to Internal Package
  • Loading branch information
tri-adam authored Aug 31, 2021
2 parents 06f2daf + 9d3190d commit 266e45a
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 59 deletions.
59 changes: 49 additions & 10 deletions git.go → internal/pkg/git/git.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,10 @@
// LICENSE file distributed with the sources of this project regarding your
// rights to use or distribute this software.

//go:build mage
// +build mage

package main
package git

import (
"errors"
"strings"

"github.com/blang/semver/v4"
Expand Down Expand Up @@ -46,15 +44,16 @@ func getVersions(r *git.Repository) (map[plumbing.Hash]semver.Version, error) {
return tags, err
}

type gitDescription struct {
// Description describes the state of a git repository.
type Description struct {
isClean bool // if true, the git working tree has local modifications
ref *plumbing.Reference // reference being described
v *semver.Version // version of nearest tag reachable from ref (or nil if none found)
n uint64 // commits between nearest semver tag and ref (if v is non-nil)
}

// describe returns a gitDescription of ref.
func describe(r *git.Repository, ref *plumbing.Reference) (*gitDescription, error) {
func describe(r *git.Repository, ref *plumbing.Reference) (*Description, error) {
tags, err := getVersions(r)
if err != nil {
return nil, err
Expand Down Expand Up @@ -94,18 +93,18 @@ func describe(r *git.Repository, ref *plumbing.Reference) (*gitDescription, erro
return nil, err
}

return &gitDescription{
return &Description{
isClean: status.IsClean(),
ref: ref,
v: ver,
n: n,
}, nil
}

// describeHead returns a gitDescription of HEAD.
func describeHead() (*gitDescription, error) {
// Describe returns a description of HEAD of the git repository at path.
func Describe(path string) (*Description, error) {
// Open git repo.
r, err := git.PlainOpen(".")
r, err := git.PlainOpen(path)
if err != nil {
return nil, err
}
Expand All @@ -118,3 +117,43 @@ func describeHead() (*gitDescription, error) {

return describe(r, head)
}

// IsClean returns true if the git working tree has local modifications.
func (d *Description) IsClean() bool {
return d.isClean
}

// Reference returns the reference described by d.
func (d *Description) Reference() *plumbing.Reference {
return d.ref
}

// Version returns a semantic version based on d. If d is tagged directly, the parsed version is
// returned. Otherwise, a version is derived that preserves semantic precedence.
//
// For example:
// - If d.tag.Name = "v0.1.2-alpha.1" and d.n = 1, 0.1.2-alpha.1.0.devel.1 is returned.
// - If d.tag.Name = "v0.1.2" and d.n = 1, 0.1.3-0.devel.1 is returned.
// - If d.tag.Name = "v0.1.3" and d.n = 0, 0.1.3 is returned.
func (d *Description) Version() (semver.Version, error) {
if d.v == nil {
return semver.Version{}, errors.New("no semver tags found")
}

// If this version wasn't tagged directly, modify tag.
v := *d.v
if d.n > 0 {
if len(v.Pre) == 0 {
v.Patch++
}

// Append "0.devel.N" pre-release components.
v.Pre = append(v.Pre,
semver.PRVersion{VersionNum: 0, IsNum: true},
semver.PRVersion{VersionStr: "devel"},
semver.PRVersion{VersionNum: d.n, IsNum: true},
)
}

return v, nil
}
9 changes: 5 additions & 4 deletions magefile.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (

"github.com/magefile/mage/mg"
"github.com/magefile/mage/sh"
"github.com/sylabs/sif/v2/internal/pkg/git"
)

// Aliases defines command-line aliases exposed by Mage.
Expand All @@ -35,16 +36,16 @@ func ldFlags() string {
}

// Attempt to get git details.
if d, err := describeHead(); err == nil {
vals = append(vals, "-X", fmt.Sprintf("main.commit=%v", d.ref.Hash()))
if d, err := git.Describe("."); err == nil {
vals = append(vals, "-X", fmt.Sprintf("main.commit=%v", d.Reference().Hash()))

if d.isClean {
if d.IsClean() {
vals = append(vals, "-X", "main.state=clean")
} else {
vals = append(vals, "-X", "main.state=dirty")
}

if v, err := getVersion(d); err == nil {
if v, err := d.Version(); err == nil {
vals = append(vals, "-X", fmt.Sprintf("main.version=%v", v))
} else {
fmt.Fprintf(os.Stderr, "warning: failed to get version: %v\n", err)
Expand Down
45 changes: 0 additions & 45 deletions version.go

This file was deleted.

0 comments on commit 266e45a

Please sign in to comment.