func updateGomodWithTaggedDependencies()

in cmd/sync-tags/gomod.go [36:119]


func updateGomodWithTaggedDependencies(tag string, depsRepo []string, semverTag bool) (bool, error) {
	found := map[string]bool{}
	changed := false

	depPackages, err := depsImportPaths(depsRepo)
	if err != nil {
		return changed, err
	}

	for _, dep := range depsRepo {
		depPath := filepath.Join("..", dep)
		dr, err := gogit.PlainOpen(depPath)
		if err != nil {
			return changed, fmt.Errorf("failed to open dependency repo at %q: %v", depPath, err)
		}

		depPkg, err := fullPackageName(depPath)
		if err != nil {
			return changed, fmt.Errorf("failed to get package at %s: %v", depPath, err)
		}

		commit, commitTime, err := localOrPublishedTaggedCommitHashAndTime(dr, tag)
		if err != nil {
			return changed, fmt.Errorf("failed to get tag %s for %q: %v", tag, depPkg, err)
		}
		rev := commit.String()
		pseudoVersionOrTag := fmt.Sprintf("v0.0.0-%s-%s", commitTime.UTC().Format("20060102150405"), rev[:12])

		if semverTag {
			pseudoVersionOrTag = tag
		}

		// check if we have the pseudoVersion/tag published already. if we don't, package it up
		// and save to local mod download cache.
		if err := packageDepToGoModCache(depPath, depPkg, rev, pseudoVersionOrTag, commitTime); err != nil {
			return changed, fmt.Errorf("failed to package %s dependency: %v", depPkg, err)
		}

		requireCommand := exec.Command("go", "mod", "edit", "-fmt", "-require", fmt.Sprintf("%s@%s", depPkg, pseudoVersionOrTag))
		requireCommand.Env = append(os.Environ(), "GO111MODULE=on")
		requireCommand.Stdout = os.Stdout
		requireCommand.Stderr = os.Stderr
		if err := requireCommand.Run(); err != nil {
			return changed, fmt.Errorf("unable to pin %s in the require section of go.mod to %s: %v", depPkg, pseudoVersionOrTag, err)
		}

		replaceCommand := exec.Command("go", "mod", "edit", "-fmt", "-replace", fmt.Sprintf("%s=%s@%s", depPkg, depPkg, pseudoVersionOrTag))
		replaceCommand.Env = append(os.Environ(), "GO111MODULE=on")
		replaceCommand.Stdout = os.Stdout
		replaceCommand.Stderr = os.Stderr
		if err := replaceCommand.Run(); err != nil {
			return changed, fmt.Errorf("unable to pin %s in the replace section of go.mod to %s: %v", depPkg, pseudoVersionOrTag, err)
		}

		found[dep] = true
		fmt.Printf("Bumping %s in go.mod to %s.\n", depPkg, rev)
		changed = true
	}

	for _, dep := range depsRepo {
		if !found[dep] {
			fmt.Printf("Warning: dependency %s not found in go.mod.\n", dep)
		}
	}

	downloadCommand2 := exec.Command("go", "mod", "download")
	downloadCommand2.Env = append(os.Environ(), "GO111MODULE=on", fmt.Sprintf("GOPRIVATE=%s", depPackages), "GOPROXY=https://proxy.golang.org")
	downloadCommand2.Stdout = os.Stdout
	downloadCommand2.Stderr = os.Stderr
	if err := downloadCommand2.Run(); err != nil {
		return changed, fmt.Errorf("error running go mod download: %v", err)
	}

	tidyCommand := exec.Command("go", "mod", "tidy")
	tidyCommand.Env = append(os.Environ(), "GO111MODULE=on", fmt.Sprintf("GOPROXY=file://%s/pkg/mod/cache/download", os.Getenv("GOPATH")), fmt.Sprintf("GOPRIVATE=%s", depPackages))
	tidyCommand.Stdout = os.Stdout
	tidyCommand.Stderr = os.Stderr
	if err := tidyCommand.Run(); err != nil {
		return changed, fmt.Errorf("unable to run go mod tidy: %v", err)
	}
	fmt.Printf("Completed running go mod tidy for %s.\n", tag)

	return changed, nil
}