if err := fileutils.RemoveAll(filepath.Join(ctx.Projectdir(), "vendor", "src", filepath.FromSlash(d.Importpath))); err != nil { // TODO(dfc) need to apply vendor.cleanpath here to remove indermediate directories. return errors.Wrap(err, "dependency could not be deleted") } dst := filepath.Join(ctx.Projectdir(), "vendor", "src", filepath.FromSlash(dep.Importpath)) src := filepath.Join(wc.Dir(), dep.Path) if err := fileutils.Copypath(dst, src); err != nil { return err } if err := m.AddDependency(dep); err != nil { return err } if err := vendor.WriteManifest(manifestFile(ctx), m); err != nil { return err } if err := wc.Destroy(); err != nil { return err } } return nil }, AddFlags: addUpdateFlags, }
if strings.HasPrefix(i, d) { return true } } return false } dependencies := make([]vendor.Dependency, len(m.Dependencies)) copy(dependencies, m.Dependencies) for _, d := range dependencies { if !hasImportWithPrefix(d.Importpath) { dep, err := m.GetDependencyForImportpath(d.Importpath) if err != nil { return errors.Wrap(err, "could not get get dependency") } if err := m.RemoveDependency(dep); err != nil { return errors.Wrap(err, "dependency could not be removed") } if err := fileutils.RemoveAll(filepath.Join(ctx.Projectdir(), "vendor", "src", filepath.FromSlash(d.Importpath))); err != nil { // TODO(dfc) need to apply vendor.cleanpath here to remove indermediate directories. return errors.Wrap(err, "dependency could not be deleted") } } } return vendor.WriteManifest(manifestFile(ctx), m) }, }
func fetch(ctx *gb.Context, path string, recurse bool) error { m, err := vendor.ReadManifest(manifestFile(ctx)) if err != nil { return errors.Wrap(err, "could not load manifest") } repo, extra, err := vendor.DeduceRemoteRepo(path, insecure) if err != nil { return err } // strip of any scheme portion from the path, it is already // encoded in the repo. path = stripscheme(path) if m.HasImportpath(path) { return errors.Errorf("%s is already vendored", path) } wc, err := repo.Checkout(branch, tag, revision) if err != nil { return err } rev, err := wc.Revision() if err != nil { return err } b, err := wc.Branch() if err != nil { return err } dep := vendor.Dependency{ Importpath: path, Repository: repo.URL(), Revision: rev, Branch: b, Path: extra, } if err := m.AddDependency(dep); err != nil { return err } dst := filepath.Join(ctx.Projectdir(), "vendor", "src", dep.Importpath) src := filepath.Join(wc.Dir(), dep.Path) if err := fileutils.Copypath(dst, src); err != nil { return err } if err := vendor.WriteManifest(manifestFile(ctx), m); err != nil { return err } if err := wc.Destroy(); err != nil { return err } if !recurse { return nil } // if we are recursing, overwrite branch, tag and revision // values so recursive fetching checks out from HEAD. branch = "" tag = "" revision = "" for done := false; !done; { paths := []struct { Root, Prefix string }{ {filepath.Join(runtime.GOROOT(), "src"), ""}, {filepath.Join(ctx.Projectdir(), "src"), ""}, } m, err := vendor.ReadManifest(manifestFile(ctx)) if err != nil { return err } for _, d := range m.Dependencies { paths = append(paths, struct{ Root, Prefix string }{filepath.Join(ctx.Projectdir(), "vendor", "src", filepath.FromSlash(d.Importpath)), filepath.FromSlash(d.Importpath)}) } dsm, err := vendor.LoadPaths(paths...) if err != nil { return err } is, ok := dsm[filepath.Join(ctx.Projectdir(), "vendor", "src", path)] if !ok { return errors.Errorf("unable to locate depset for %q", path) } missing := findMissing(pkgs(is.Pkgs), dsm) switch len(missing) { case 0: done = true default: // sort keys in ascending order, so the shortest missing import path // with be fetched first. keys := keys(missing) sort.Strings(keys) pkg := keys[0] fmt.Println("fetching recursive dependency", pkg) if err := fetch(ctx, pkg, false); err != nil { return err } } } return nil }