Files
dolt/go/performance/utils/dolt_builder/git.go

84 lines
2.4 KiB
Go

// Copyright 2019-2022 Dolthub, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package dolt_builder
import (
"context"
"fmt"
"os"
"strings"
)
// GitVersion runs git version
func GitVersion(ctx context.Context) error {
checkGit := ExecCommand(ctx, "git", "version")
err := checkGit.Run()
if err != nil {
helpStr := "dolt-builder requires git.\n" +
"Make sure git is installed and on your PATH.\n" +
"git version: %v\n"
return fmt.Errorf(helpStr, err)
}
return nil
}
// GitClone clones the dolt repo into `${dir}/dolt.git`
func GitCloneBare(ctx context.Context, dir string) error {
clone := ExecCommand(ctx, "git", "clone", "--bare", GithubDolt)
clone.Dir = dir
return clone.Run()
}
func CommitArg(c string) string {
if IsCommit(c) {
return c
}
if strings.HasPrefix(c, "v") {
return "tags/" + c
}
return "tags/v" + c
}
// GitCheckoutTree checks out `commit` from the Git repo at
// `repoDir` into `toDir`. It does it without copying the entire
// git repository. First we run `git read-tree` with a GIT_INDEX_FILE set to
// `$toDir/.buildindex`, which gets an index for the commit fully populated
// into the file. Then we run `git checkout-index -a` referencing the same
// INDEX_FILE, which populates the current working directory (`toDir`) with the
// contents of the index file.
func GitCheckoutTree(ctx context.Context, repoDir string, toDir string, commit string) error {
env := os.Environ()
env = append(env, "GIT_DIR="+repoDir)
env = append(env, "GIT_INDEX_FILE=.buildindex")
env = append(env, "GIT_WORK_TREE=.")
read := ExecCommand(ctx, "git", "read-tree", CommitArg(commit))
read.Dir = toDir
read.Env = env
if err := read.Run(); err != nil {
return err
}
checkout := ExecCommand(ctx, "git", "checkout-index", "-a")
checkout.Dir = toDir
checkout.Env = env
return checkout.Run()
}
// IsCommit returns true if a commit is not a tag
func IsCommit(commit string) bool {
return strings.IndexByte(commit, '.') == -1
}