From 13cba9aa5e2566d030cf6e8a6c9c9c2855f15fe5 Mon Sep 17 00:00:00 2001 From: Shulhan Date: Fri, 14 Sep 2018 04:22:58 +0700 Subject: Add freeze methods to package Previously, we call package Update when doing Freeze operation, which cause confusion, because Update use parameter newPkg which may change the remote URL or version. --- env.go | 2 +- package.go | 8 ++++++++ package_git.go | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/env.go b/env.go index 130c648..63ebbbe 100644 --- a/env.go +++ b/env.go @@ -199,7 +199,7 @@ func (env *Env) Freeze() (err error) { continue } - err = localPkg.Update(pkg) + err = pkg.Freeze() if err != nil { return } diff --git a/package.go b/package.go index ee24d93..39bbbeb 100644 --- a/package.go +++ b/package.go @@ -127,6 +127,14 @@ func (pkg *Package) Fetch() (err error) { return } +func (pkg *Package) Freeze() (err error) { + switch pkg.vcsMode { + case VCSModeGit: + err = pkg.gitFreeze() + } + return +} + // // GoClean will remove the package binaries and archives. // diff --git a/package_git.go b/package_git.go index 042572e..12c91c2 100644 --- a/package_git.go +++ b/package_git.go @@ -6,10 +6,30 @@ package beku import ( "fmt" + "strings" + "github.com/shuLhan/share/lib/debug" "github.com/shuLhan/share/lib/git" ) +func (pkg *Package) gitFreeze() (err error) { + err = git.FetchAll(pkg.FullPath) + if err != nil { + return + } + if len(pkg.RemoteBranch) == 0 { + err = pkg.gitGetBranch() + if err != nil { + return + } + } + + err = git.CheckoutRevision(pkg.FullPath, pkg.RemoteName, + pkg.RemoteBranch, pkg.Version) + + return +} + // // gitInstall the package into source directory. // @@ -58,7 +78,50 @@ func (pkg *Package) gitScan() (err error) { } pkg.RemoteURL, err = git.GetRemoteURL(pkg.FullPath, "") + if err != nil { + err = fmt.Errorf("gitScan: %s", err) + return + } + err = pkg.gitGetBranch() + + return +} + +func (pkg *Package) gitGetBranch() (err error) { + branches, err := git.RemoteBranches(pkg.FullPath) + if err != nil { + err = fmt.Errorf("gitGetBranch: %s", err) + return + } + + // Select branch by version, master, or the last branch. + midx := -1 + vidx := -1 + for x := 0; x < len(branches); x++ { + if branches[x] == gitDefBranch { + midx = x + } + if branches[x][0] == 'v' { + if vidx < 0 { + vidx = x + continue + } + if strings.Compare(branches[vidx], branches[x]) == -1 { + vidx = x + } + } + } + if midx >= 0 { + pkg.RemoteBranch = branches[midx] + } else if vidx >= 0 { + pkg.RemoteBranch = branches[vidx] + } else { + pkg.RemoteBranch = branches[len(branches)-1] + } + if debug.Value >= 1 { + fmt.Printf("= gitGetBranch: %s\n", pkg.RemoteBranch) + } return } -- cgit v1.3