func gc(pkg *Package, gofiles []string) error { t0 := time.Now() if pkg.Scope != "test" { // only log compilation message if not in test scope log.Infof(pkg.ImportPath) } includes := pkg.IncludePaths() importpath := pkg.ImportPath if pkg.Scope == "test" && pkg.ExtraIncludes != "" { // TODO(dfc) gross includes = append([]string{pkg.ExtraIncludes}, includes...) } for i := range gofiles { if filepath.IsAbs(gofiles[i]) { // terrible hack for cgo files which come with an absolute path continue } fullpath := filepath.Join(pkg.Dir, gofiles[i]) path, err := filepath.Rel(pkg.Dir, fullpath) if err == nil { gofiles[i] = path } else { gofiles[i] = fullpath } } err := pkg.tc.Gc(pkg, includes, importpath, pkg.Dir, objfile(pkg), gofiles) pkg.Record("gc", time.Since(t0)) return err }
// probe calls the supplied vcs function to probe a variety of url constructions. // If vcs returns non nil, it is assumed that the url is not a valid repo. func probe(vcs func(*url.URL) error, url *url.URL, insecure bool, schemes ...string) (string, error) { var unsuccessful []string for _, scheme := range schemes { // make copy of url and apply scheme url := *url url.Scheme = scheme switch url.Scheme { case "https", "ssh": if err := vcs(&url); err == nil { return url.String(), nil } case "http", "git": if !insecure { log.Infof("skipping insecure protocol: %s", url.String()) continue } if err := vcs(&url); err == nil { return url.String(), nil } default: return "", fmt.Errorf("unsupported scheme: %v", url.Scheme) } unsuccessful = append(unsuccessful, url.String()) } return "", fmt.Errorf("vcs probe failed, tried: %s", strings.Join(unsuccessful, ",")) }
func fetchMetadata(scheme, path string, insecure bool) (io.ReadCloser, error) { url := fmt.Sprintf("%s://%s?go-get=1", scheme, path) var err error var resp *http.Response switch scheme { case "https": resp, err = http.Get(url) if err == nil { return resp.Body, nil } case "http": if !insecure { log.Infof("skipping insecure protocol: %v", url) } else { resp, err = http.Get(url) if err == nil { return resp.Body, nil } } default: return nil, fmt.Errorf("unknown remote protocol scheme: %q", scheme) } return nil, fmt.Errorf("fail to access url %q", url) }
func fetch(ctx *gb.Context, path string, recurse bool) error { m, err := vendor.ReadManifest(manifestFile(ctx)) if err != nil { return fmt.Errorf("could not load manifest: %v", err) } 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 fmt.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 } branch, err := wc.Branch() if err != nil { return err } dep := vendor.Dependency{ Importpath: path, Repository: repo.URL(), Revision: rev, Branch: branch, 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 := vendor.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 fmt.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] log.Infof("fetching recursive dependency %s", pkg) if err := fetch(ctx, pkg, false); err != nil { return err } } } return nil }