// Apply attempts to locate the repository and pin it to the head version. func (dep *RepoVersion) Apply() error { // Find the repository var repo *graph.Repository for _, pkg := range dep.Packages { // Make sure the package is installed and up-to-date get := exec.Command("go", "get", "-d", pkg) get.Dir = os.TempDir() get.Stdout = os.Stdout get.Stderr = os.Stderr if err := get.Run(); err != nil { continue } // Scan for new packages if err := Deps.Scan(dep.Pattern); err != nil { continue } // See if we found the package we wanted p, ok := Deps.Package[pkg] if !ok { continue } // Get the repository r, ok := Deps.Repository[p.RepoRoot] if !ok { continue } repo = r break } if repo == nil { return fmt.Errorf("apply(%q@%q): unable to locate repository", dep.Pattern, dep.Head) } // Get fallback in case the update fails fallback, err := repo.Head() if err != nil { return fmt.Errorf("apply(%q@%q): unable to determine fallback version", dep.Pattern, dep.Head) } // Pin the version if err := repo.ToRev(dep.Head); err != nil { if ferr := repo.ToRev(fallback); ferr != nil { return fmt.Errorf("apply(%q): pin(%q) [%s] and fallback(%q) [%s] failed", dep.Pattern, dep.Head, err, fallback, ferr) } return fmt.Errorf("apply(%q@%q): pin failed: %s", dep.Pattern, dep.Head, err) } log.Printf("Pinned %s @ %s", dep.Pattern, dep.Head) return nil }