diff options
Diffstat (limited to 'cli/internal/scm')
| -rw-r--r-- | cli/internal/scm/git_go.go | 111 | ||||
| -rw-r--r-- | cli/internal/scm/git_rust.go | 34 | ||||
| -rw-r--r-- | cli/internal/scm/scm.go | 53 | ||||
| -rw-r--r-- | cli/internal/scm/stub.go | 14 |
4 files changed, 0 insertions, 212 deletions
diff --git a/cli/internal/scm/git_go.go b/cli/internal/scm/git_go.go deleted file mode 100644 index 0dac2bf..0000000 --- a/cli/internal/scm/git_go.go +++ /dev/null @@ -1,111 +0,0 @@ -//go:build go || !rust -// +build go !rust - -// Package scm abstracts operations on various tools like git -// Currently, only git is supported. -// -// Adapted from https://github.com/thought-machine/please/tree/master/src/scm -// Copyright Thought Machine, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package scm - -import ( - "fmt" - "github.com/vercel/turbo/cli/internal/turbopath" - "os/exec" - "path/filepath" - "strings" - - "github.com/pkg/errors" -) - -// git implements operations on a git repository. -type git struct { - repoRoot turbopath.AbsoluteSystemPath -} - -// ChangedFiles returns a list of modified files since the given commit, optionally including untracked files. -func (g *git) ChangedFiles(fromCommit string, toCommit string, relativeTo string) ([]string, error) { - if relativeTo == "" { - relativeTo = g.repoRoot.ToString() - } - relSuffix := []string{"--", relativeTo} - command := []string{"diff", "--name-only", toCommit} - - out, err := exec.Command("git", append(command, relSuffix...)...).CombinedOutput() - if err != nil { - return nil, errors.Wrapf(err, "finding changes relative to %v", relativeTo) - } - files := strings.Split(string(out), "\n") - - if fromCommit != "" { - // Grab the diff from the merge-base to HEAD using ... syntax. This ensures we have just - // the changes that have occurred on the current branch. - command = []string{"diff", "--name-only", fromCommit + "..." + toCommit} - out, err = exec.Command("git", append(command, relSuffix...)...).CombinedOutput() - if err != nil { - // Check if we can provide a better error message for non-existent commits. - // If we error on the check or can't find it, fall back to whatever error git - // reported. - if exists, err := commitExists(fromCommit); err == nil && !exists { - return nil, fmt.Errorf("commit %v does not exist", fromCommit) - } - return nil, errors.Wrapf(err, "git comparing with %v", fromCommit) - } - committedChanges := strings.Split(string(out), "\n") - files = append(files, committedChanges...) - } - command = []string{"ls-files", "--other", "--exclude-standard"} - out, err = exec.Command("git", append(command, relSuffix...)...).CombinedOutput() - if err != nil { - return nil, errors.Wrap(err, "finding untracked files") - } - untracked := strings.Split(string(out), "\n") - files = append(files, untracked...) - // git will report changed files relative to the worktree: re-relativize to relativeTo - normalized := make([]string, 0) - for _, f := range files { - if f == "" { - continue - } - normalizedFile, err := g.fixGitRelativePath(strings.TrimSpace(f), relativeTo) - if err != nil { - return nil, err - } - normalized = append(normalized, normalizedFile) - } - return normalized, nil -} - -func (g *git) PreviousContent(fromCommit string, filePath string) ([]byte, error) { - if fromCommit == "" { - return nil, fmt.Errorf("Need commit sha to inspect file contents") - } - - out, err := exec.Command("git", "show", fmt.Sprintf("%s:%s", fromCommit, filePath)).CombinedOutput() - if err != nil { - return nil, errors.Wrapf(err, "unable to get contents of %s", filePath) - } - - return out, nil -} - -func commitExists(commit string) (bool, error) { - err := exec.Command("git", "cat-file", "-t", commit).Run() - if err != nil { - exitErr := &exec.ExitError{} - if errors.As(err, &exitErr) && exitErr.ExitCode() == 128 { - return false, nil - } - return false, err - } - return true, nil -} - -func (g *git) fixGitRelativePath(worktreePath, relativeTo string) (string, error) { - p, err := filepath.Rel(relativeTo, filepath.Join(g.repoRoot, worktreePath)) - if err != nil { - return "", errors.Wrapf(err, "unable to determine relative path for %s and %s", g.repoRoot, relativeTo) - } - return p, nil -} diff --git a/cli/internal/scm/git_rust.go b/cli/internal/scm/git_rust.go deleted file mode 100644 index 4b4cd2d..0000000 --- a/cli/internal/scm/git_rust.go +++ /dev/null @@ -1,34 +0,0 @@ -// Package scm abstracts operations on various tools like git -// Currently, only git is supported. -// -// Adapted from https://github.com/thought-machine/please/tree/master/src/scm -// Copyright Thought Machine, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -//go:build rust -// +build rust - -package scm - -import ( - "fmt" - "github.com/vercel/turbo/cli/internal/ffi" - "github.com/vercel/turbo/cli/internal/turbopath" -) - -// git implements operations on a git repository. -type git struct { - repoRoot turbopath.AbsoluteSystemPath -} - -// ChangedFiles returns a list of modified files since the given commit, optionally including untracked files. -func (g *git) ChangedFiles(fromCommit string, toCommit string, monorepoRoot string) ([]string, error) { - return ffi.ChangedFiles(g.repoRoot.ToString(), monorepoRoot, fromCommit, toCommit) -} - -func (g *git) PreviousContent(fromCommit string, filePath string) ([]byte, error) { - if fromCommit == "" { - return nil, fmt.Errorf("Need commit sha to inspect file contents") - } - - return ffi.PreviousContent(g.repoRoot.ToString(), fromCommit, filePath) -} diff --git a/cli/internal/scm/scm.go b/cli/internal/scm/scm.go deleted file mode 100644 index e7f17c8..0000000 --- a/cli/internal/scm/scm.go +++ /dev/null @@ -1,53 +0,0 @@ -// Package scm abstracts operations on various tools like git -// Currently, only git is supported. -// -// Adapted from https://github.com/thought-machine/please/tree/master/src/scm -// Copyright Thought Machine, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package scm - -import ( - "github.com/pkg/errors" - - "github.com/vercel/turbo/cli/internal/turbopath" -) - -var ErrFallback = errors.New("cannot find a .git folder. Falling back to manual file hashing (which may be slower). If you are running this build in a pruned directory, you can ignore this message. Otherwise, please initialize a git repository in the root of your monorepo") - -// An SCM represents an SCM implementation that we can ask for various things. -type SCM interface { - // ChangedFiles returns a list of modified files since the given commit, including untracked files - ChangedFiles(fromCommit string, toCommit string, relativeTo string) ([]string, error) - // PreviousContent Returns the content of the file at fromCommit - PreviousContent(fromCommit string, filePath string) ([]byte, error) -} - -// newGitSCM returns a new SCM instance for this repo root. -// It returns nil if there is no known implementation there. -func newGitSCM(repoRoot turbopath.AbsoluteSystemPath) SCM { - if repoRoot.UntypedJoin(".git").Exists() { - return &git{repoRoot: repoRoot} - } - return nil -} - -// newFallback returns a new SCM instance for this repo root. -// If there is no known implementation it returns a stub. -func newFallback(repoRoot turbopath.AbsoluteSystemPath) (SCM, error) { - if scm := newGitSCM(repoRoot); scm != nil { - return scm, nil - } - - return &stub{}, ErrFallback -} - -// FromInRepo produces an SCM instance, given a path within a -// repository. It does not need to be a git repository, and if -// it is not, the given path is assumed to be the root. -func FromInRepo(repoRoot turbopath.AbsoluteSystemPath) (SCM, error) { - dotGitDir, err := repoRoot.Findup(".git") - if err != nil { - return nil, err - } - return newFallback(dotGitDir.Dir()) -} diff --git a/cli/internal/scm/stub.go b/cli/internal/scm/stub.go deleted file mode 100644 index 2e356c5..0000000 --- a/cli/internal/scm/stub.go +++ /dev/null @@ -1,14 +0,0 @@ -// Adapted from https://github.com/thought-machine/please/tree/master/src/scm -// Copyright Thought Machine, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package scm - -type stub struct{} - -func (s *stub) ChangedFiles(fromCommit string, toCommit string, relativeTo string) ([]string, error) { - return nil, nil -} - -func (s *stub) PreviousContent(fromCommit string, filePath string) ([]byte, error) { - return nil, nil -} |
