diff --git a/cfg/config.go b/cfg/config.go index ae01039a..c2f80bb9 100644 --- a/cfg/config.go +++ b/cfg/config.go @@ -369,14 +369,29 @@ func (d Dependencies) DeDupe() (Dependencies, error) { // Dependency describes a package that the present package depends upon. type Dependency struct { - Name string `yaml:"package"` - Reference string `yaml:"version,omitempty"` - Pin string `yaml:"-"` - Repository string `yaml:"repo,omitempty"` - VcsType string `yaml:"vcs,omitempty"` - Subpackages []string `yaml:"subpackages,omitempty"` - Arch []string `yaml:"arch,omitempty"` - Os []string `yaml:"os,omitempty"` + Name string `yaml:"package"` + Reference string `yaml:"version,omitempty"` + Pin string `yaml:"-"` + Original string `yaml:"-"` + CommitInfo *vcs.CommitInfo `yaml:"-"` + Repository string `yaml:"repo,omitempty"` + VcsType string `yaml:"vcs,omitempty"` + Subpackages []string `yaml:"subpackages,omitempty"` + Arch []string `yaml:"arch,omitempty"` + Os []string `yaml:"os,omitempty"` +} + +func (dep *Dependency) RefString() string { + refString := dep.Reference + if refString == dep.Pin { + refString = refString[0:7] + } + if refString != "" && refString != dep.Original { + refString = " (" + refString + ")" + } else { + refString = "" + } + return refString } // A transitive representation of a dependency for importing and exploting to yaml. @@ -532,6 +547,8 @@ func (d *Dependency) Clone() *Dependency { return &Dependency{ Name: d.Name, Reference: d.Reference, + Original: d.Original, + CommitInfo: d.CommitInfo, Pin: d.Pin, Repository: d.Repository, VcsType: d.VcsType, diff --git a/cfg/lock.go b/cfg/lock.go index c03ac417..9a312d18 100644 --- a/cfg/lock.go +++ b/cfg/lock.go @@ -1,6 +1,7 @@ package cfg import ( + "bytes" "crypto/sha256" "fmt" "io/ioutil" @@ -8,6 +9,7 @@ import ( "strings" "time" + "github.com/Masterminds/glide/util" "gopkg.in/yaml.v2" ) @@ -77,6 +79,12 @@ func (lf *Lockfile) WriteFile(lockpath string) error { if err != nil { return err } + for _, l := range lf.Imports { + o = bytes.Replace(o, []byte("version: "+l.Version), []byte("version: "+l.Version+" # "+l.Dep.Original+", "+util.Date(l.Dep.CommitInfo.Date)), 1) + } + for _, l := range lf.DevImports { + o = bytes.Replace(o, []byte("version: "+l.Version), []byte("version: "+l.Version+" # "+l.Dep.Original+", "+util.Date(l.Dep.CommitInfo.Date)), 1) + } return ioutil.WriteFile(lockpath, o, 0666) } @@ -155,13 +163,14 @@ func (l Locks) Swap(i, j int) { // Lock represents an individual locked dependency. type Lock struct { - Name string `yaml:"name"` - Version string `yaml:"version"` - Repository string `yaml:"repo,omitempty"` - VcsType string `yaml:"vcs,omitempty"` - Subpackages []string `yaml:"subpackages,omitempty"` - Arch []string `yaml:"arch,omitempty"` - Os []string `yaml:"os,omitempty"` + Name string `yaml:"name"` + Version string `yaml:"version"` + Repository string `yaml:"repo,omitempty"` + VcsType string `yaml:"vcs,omitempty"` + Subpackages []string `yaml:"subpackages,omitempty"` + Arch []string `yaml:"arch,omitempty"` + Os []string `yaml:"os,omitempty"` + Dep *Dependency `yaml:"-"` } // Clone creates a clone of a Lock. @@ -174,6 +183,7 @@ func (l *Lock) Clone() *Lock { Subpackages: l.Subpackages, Arch: l.Arch, Os: l.Os, + Dep: l.Dep, } } @@ -187,6 +197,7 @@ func LockFromDependency(dep *Dependency) *Lock { Subpackages: dep.Subpackages, Arch: dep.Arch, Os: dep.Os, + Dep: dep, } } diff --git a/repo/installer.go b/repo/installer.go index 9be777c0..a0fbd022 100644 --- a/repo/installer.go +++ b/repo/installer.go @@ -284,7 +284,15 @@ func (i *Installer) Export(conf *cfg.Config) error { if err != nil { msg.Die(err.Error()) } - msg.Info("--> Exporting %s", dep.Name) + + commitInfo := " " + if dep.CommitInfo != nil { + commitInfo = " " + + util.Date(dep.CommitInfo.Date) + " " + + dep.CommitInfo.Author + } + + msg.Info("--> Exporting %s %s@%s%s%s", dep.Name, dep.Original, dep.Pin[0:7], dep.RefString(), commitInfo) if err := repo.ExportDir(filepath.Join(vp, filepath.ToSlash(dep.Name))); err != nil { msg.Err("Export failed for %s: %s\n", dep.Name, err) // Capture the error while making sure the concurrent diff --git a/repo/vcs.go b/repo/vcs.go index 780e60a4..bb807885 100644 --- a/repo/vcs.go +++ b/repo/vcs.go @@ -164,6 +164,7 @@ func VcsVersion(dep *cfg.Dependency) error { // If there is no reference configured there is nothing to set. if dep.Reference == "" { + dep.Original = "master" // Before exiting update the pinned version repo, err := dep.GetRepo(cwd) if err != nil { @@ -173,6 +174,11 @@ func VcsVersion(dep *cfg.Dependency) error { if err != nil { return err } + dep.CommitInfo, err = repo.CommitInfo(dep.Pin) + if err != nil { + dep.CommitInfo = nil + } + return nil } @@ -240,10 +246,18 @@ func VcsVersion(dep *cfg.Dependency) error { if err := repo.UpdateVersion(ver); err != nil { return err } + dep.Original = ver dep.Pin, err = repo.Version() + if dep.Pin == dep.Original { + dep.Original = dep.Original[0:7] + } if err != nil { return err } + dep.CommitInfo, err = repo.CommitInfo(dep.Pin) + if err != nil { + dep.CommitInfo = nil + } return nil } diff --git a/util/util.go b/util/util.go index 5a186b4c..adec9607 100644 --- a/util/util.go +++ b/util/util.go @@ -12,6 +12,7 @@ import ( "path/filepath" "regexp" "strings" + "time" "github.com/Masterminds/vcs" ) @@ -335,3 +336,8 @@ func NormalizeName(name string) (string, string) { return root, extra } + +// Date formats short date string in UTC +func Date(t time.Time) string { + return t.UTC().Format("2006-01-02") +}