func cloneRepo()

in cmd/git-sync/main.go [865:934]


func cloneRepo(ctx context.Context, repo, branch, rev string, depth int, gitRoot string) error {
	args := []string{"clone", "--no-checkout", "-b", branch}
	if depth != 0 {
		args = append(args, "--depth", strconv.Itoa(depth))
	}
	args = append(args, repo, gitRoot)
	log.V(0).Info("cloning repo", "origin", repo, "path", gitRoot)

	_, err := cmdRunner.Run(ctx, "", *flGitCmd, args...)
	if err != nil {
		if strings.Contains(err.Error(), "already exists and is not an empty directory") {
			// Maybe a previous run crashed?  Git won't use this dir.
			log.V(0).Info("git root exists and is not empty (previous crash?), cleaning up", "path", gitRoot)
			// We remove the contents rather than the dir itself, because a
			// common use-case is to have a volume mounted at git.root, which
			// makes removing it impossible.
			err := removeDirContents(gitRoot, log)
			if err != nil {
				return err
			}
			_, err = cmdRunner.Run(ctx, "", *flGitCmd, args...)
			if err != nil {
				return err
			}
		} else {
			return err
		}
	}

	if *flSparseCheckoutFile != "" {
		log.V(0).Info("configuring sparse checkout")
		checkoutFile := *flSparseCheckoutFile

		gitRepoPath := filepath.Join(gitRoot, ".git")
		gitInfoPath := filepath.Join(gitRepoPath, "info")
		gitSparseConfigPath := filepath.Join(gitInfoPath, "sparse-checkout")

		source, err := os.Open(checkoutFile)
		if err != nil {
			return err
		}
		defer source.Close()

		if _, err := os.Stat(gitInfoPath); os.IsNotExist(err) {
			fileMode := os.FileMode(int(0755))
			err := os.Mkdir(gitInfoPath, fileMode)
			if err != nil {
				return err
			}
		}

		destination, err := os.Create(gitSparseConfigPath)
		if err != nil {
			return err
		}
		defer destination.Close()
		_, err = io.Copy(destination, source)
		if err != nil {
			return err
		}

		args := []string{"sparse-checkout", "init"}
		_, err = cmdRunner.Run(ctx, gitRoot, *flGitCmd, args...)
		if err != nil {
			return err
		}
	}

	return nil
}