// downloadPackages downloads packages with certain commit,
// if the commit is empty string, then it downloads all dependencies,
// otherwise, it only downloada package with specific commit only.
func downloadPackages(target string, ctx *cli.Context, nodes []*doc.Node) (err error) {
for _, n := range nodes {
// Check if it is a valid remote path or C.
if n.ImportPath == "C" {
continue
} else if !base.IsValidRemotePath(n.ImportPath) {
// Invalid import path.
if setting.LibraryMode {
errors.AppendError(errors.NewErrInvalidPackage(n.VerString()))
}
log.Error("Skipped invalid package: " + n.VerString())
failConut++
continue
}
// Valid import path.
if isSubpackage(n.RootPath, target) {
continue
}
// Indicates whether need to download package or update.
if n.IsFixed() && n.IsExist() {
n.IsGetDepsOnly = true
}
if downloadCache.Get(n.VerString()) {
if !skipCache.Get(n.VerString()) {
skipCache.Set(n.VerString())
log.Debug("Skipped downloaded package: %s", n.VerString())
}
continue
}
if !ctx.Bool("update") {
// Check if package has been downloaded.
if n.IsExist() {
if !skipCache.Get(n.VerString()) {
skipCache.Set(n.VerString())
log.Info("%s", n.InstallPath)
log.Debug("Skipped installed package: %s", n.VerString())
}
// Only copy when no version control.
if !copyCache.Get(n.VerString()) && (ctx.Bool("gopath") || ctx.Bool("local")) {
copyCache.Set(n.VerString())
if err = n.CopyToGopath(); err != nil {
return err
}
}
continue
} else {
setting.LocalNodes.SetValue(n.RootPath, "value", "")
}
}
// Download package.
nod, imports, err := downloadPackage(ctx, n)
if err != nil {
return err
}
for _, name := range imports {
var gf *goconfig.ConfigFile
gfPath := path.Join(n.InstallPath, setting.GOPMFILE)
// Check if has gopmfile.
if base.IsFile(gfPath) {
log.Info("Found gopmfile: %s", n.VerString())
var err error
gf, _, err = parseGopmfile(gfPath)
if err != nil {
return fmt.Errorf("fail to parse gopmfile(%s): %v", gfPath, err)
}
}
// Need to download dependencies.
// Generate temporary nodes.
nodes := make([]*doc.Node, len(imports))
for i := range nodes {
nodes[i] = doc.NewNode(name, doc.BRANCH, "", !ctx.Bool("download"))
if gf == nil {
continue
}
// Check if user specified the version.
if v := gf.MustValue("deps", imports[i]); len(v) > 0 {
nodes[i].Type, nodes[i].Value, err = validPkgInfo(v)
if err != nil {
return err
}
}
}
if err = downloadPackages(target, ctx, nodes); err != nil {
return err
}
}
// Only save package information with specific commit.
//.........这里部分代码省略.........
请发表评论