in cmd/sync-tags/gomod.go [145:214]
func packageDepToGoModCache(depPath, depPkg, commit, pseudoVersionOrTag string, commitTime time.Time) error {
cacheDir := fmt.Sprintf("%s/pkg/mod/cache/download/%s/@v", os.Getenv("GOPATH"), depPkg)
goModFile := fmt.Sprintf("%s/%s.mod", cacheDir, pseudoVersionOrTag)
if _, err := os.Stat(goModFile); err == nil {
fmt.Printf("%s for %s is already packaged up.\n", pseudoVersionOrTag, depPkg)
return nil
} else if err != nil && !os.IsNotExist(err) {
return fmt.Errorf("could not check if %s exists: %v", goModFile, err)
}
fmt.Printf("Packaging up %s for %s into go mod cache.\n", pseudoVersionOrTag, depPkg)
// create the cache if it doesn't exist
if err := os.MkdirAll(filepath.Dir(goModFile), os.FileMode(0755)); err != nil {
return fmt.Errorf("unable to create %s directory: %v", cacheDir, err)
}
// checkout the dep repo to the commit at the tag
checkoutCommand := exec.Command("git", "checkout", commit)
checkoutCommand.Dir = fmt.Sprintf("%s/src/%s", os.Getenv("GOPATH"), depPkg)
checkoutCommand.Stdout = os.Stdout
checkoutCommand.Stderr = os.Stderr
if err := checkoutCommand.Run(); err != nil {
return fmt.Errorf("failed to checkout %s at %s: %v", depPkg, commit, err)
}
// copy go.mod to the cache dir
if err := copyFile(fmt.Sprintf("%s/go.mod", depPath), goModFile); err != nil {
return fmt.Errorf("unable to copy %s file to %s to gomod cache for %s: %v", fmt.Sprintf("%s/go.mod", depPath), goModFile, depPkg, err)
}
// create info file in the cache dir
moduleInfo := ModuleInfo{
Version: pseudoVersionOrTag,
Name: commit,
Short: commit[:12],
Time: commitTime.UTC().Format("2006-01-02T15:04:05Z"),
}
moduleFile, err := json.Marshal(moduleInfo)
if err != nil {
return fmt.Errorf("error marshaling .info file for %s: %v", depPkg, err)
}
if err := ioutil.WriteFile(fmt.Sprintf("%s/%s.info", cacheDir, pseudoVersionOrTag), moduleFile, 0644); err != nil {
return fmt.Errorf("failed to write %s file for %s: %v", fmt.Sprintf("%s/%s.info", cacheDir, pseudoVersionOrTag), depPkg, err)
}
// create the zip file in the cache dir. This zip file has the same hash
// as of the zip file that would have been created by go mod download.
zipCommand := exec.Command("/gomod-zip", "--package-name", depPkg, "--pseudo-version", pseudoVersionOrTag)
zipCommand.Stdout = os.Stdout
zipCommand.Stderr = os.Stderr
if err := zipCommand.Run(); err != nil {
return fmt.Errorf("failed to run gomod-zip for %s at %s: %v", depPkg, pseudoVersionOrTag, err)
}
// append the pseudoVersion to the list file in the cache dir
listFile, err := os.OpenFile(fmt.Sprintf("%s/list", cacheDir), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return fmt.Errorf("unable to open list file in %s: %v", cacheDir, err)
}
defer listFile.Close()
if _, err := listFile.WriteString(fmt.Sprintf("%s\n", pseudoVersionOrTag)); err != nil {
return fmt.Errorf("unable to write to list file in %s: %v", cacheDir, err)
}
return nil
}