aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/cli/internal/lockfile/lockfile.go
diff options
context:
space:
mode:
author简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:55 +0800
committer简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:55 +0800
commitfc8c5fdce62fb229202659408798a7b6c98f6e8b (patch)
tree7554f80e50de4af6fd255afa7c21bcdd58a7af34 /cli/internal/lockfile/lockfile.go
parentdd84b9d64fb98746a230cd24233ff50a562c39c9 (diff)
downloadHydroRoll-fc8c5fdce62fb229202659408798a7b6c98f6e8b.tar.gz
HydroRoll-fc8c5fdce62fb229202659408798a7b6c98f6e8b.zip
Diffstat (limited to 'cli/internal/lockfile/lockfile.go')
-rw-r--r--cli/internal/lockfile/lockfile.go135
1 files changed, 0 insertions, 135 deletions
diff --git a/cli/internal/lockfile/lockfile.go b/cli/internal/lockfile/lockfile.go
deleted file mode 100644
index bb36eda..0000000
--- a/cli/internal/lockfile/lockfile.go
+++ /dev/null
@@ -1,135 +0,0 @@
-// Package lockfile provides the lockfile interface and implementations for the various package managers
-package lockfile
-
-import (
- "fmt"
- "io"
- "reflect"
- "sort"
-
- mapset "github.com/deckarep/golang-set"
- "github.com/vercel/turbo/cli/internal/turbopath"
- "golang.org/x/sync/errgroup"
-)
-
-// Lockfile Interface for general operations that work across all lockfiles
-type Lockfile interface {
- // ResolvePackage Given a workspace, a package it imports and version returns the key, resolved version, and if it was found
- ResolvePackage(workspacePath turbopath.AnchoredUnixPath, name string, version string) (Package, error)
- // AllDependencies Given a lockfile key return all (dev/optional/peer) dependencies of that package
- AllDependencies(key string) (map[string]string, bool)
- // Subgraph Given a list of lockfile keys returns a Lockfile based off the original one that only contains the packages given
- Subgraph(workspacePackages []turbopath.AnchoredSystemPath, packages []string) (Lockfile, error)
- // Encode encode the lockfile representation and write it to the given writer
- Encode(w io.Writer) error
- // Patches return a list of patches used in the lockfile
- Patches() []turbopath.AnchoredUnixPath
- // GlobalChange checks if there are any differences between lockfiles that would completely invalidate
- // the cache.
- GlobalChange(other Lockfile) bool
-}
-
-// IsNil checks if lockfile is nil
-func IsNil(l Lockfile) bool {
- return l == nil || reflect.ValueOf(l).IsNil()
-}
-
-// Package Structure representing a possible Pack
-type Package struct {
- // Key used to lookup a package in the lockfile
- Key string
- // The resolved version of a package as it appears in the lockfile
- Version string
- // Set to true iff Key and Version are set
- Found bool
-}
-
-// ByKey sort package structures by key
-type ByKey []Package
-
-func (p ByKey) Len() int {
- return len(p)
-}
-
-func (p ByKey) Swap(i, j int) {
- p[i], p[j] = p[j], p[i]
-}
-
-func (p ByKey) Less(i, j int) bool {
- return p[i].Key+p[i].Version < p[j].Key+p[j].Version
-}
-
-var _ (sort.Interface) = (*ByKey)(nil)
-
-// TransitiveClosure the set of all lockfile keys that pkg depends on
-func TransitiveClosure(
- workspaceDir turbopath.AnchoredUnixPath,
- unresolvedDeps map[string]string,
- lockFile Lockfile,
-) (mapset.Set, error) {
- if lf, ok := lockFile.(*NpmLockfile); ok {
- // We special case as Rust implementations have their own dep crawl
- return npmTransitiveDeps(lf, workspaceDir, unresolvedDeps)
- }
- return transitiveClosure(workspaceDir, unresolvedDeps, lockFile)
-}
-
-func transitiveClosure(
- workspaceDir turbopath.AnchoredUnixPath,
- unresolvedDeps map[string]string,
- lockFile Lockfile,
-) (mapset.Set, error) {
- if IsNil(lockFile) {
- return nil, fmt.Errorf("No lockfile available to do analysis on")
- }
-
- resolvedPkgs := mapset.NewSet()
- lockfileEg := &errgroup.Group{}
-
- transitiveClosureHelper(lockfileEg, workspaceDir, lockFile, unresolvedDeps, resolvedPkgs)
-
- if err := lockfileEg.Wait(); err != nil {
- return nil, err
- }
-
- return resolvedPkgs, nil
-}
-
-func transitiveClosureHelper(
- wg *errgroup.Group,
- workspacePath turbopath.AnchoredUnixPath,
- lockfile Lockfile,
- unresolvedDirectDeps map[string]string,
- resolvedDeps mapset.Set,
-) {
- for directDepName, unresolvedVersion := range unresolvedDirectDeps {
- directDepName := directDepName
- unresolvedVersion := unresolvedVersion
- wg.Go(func() error {
-
- lockfilePkg, err := lockfile.ResolvePackage(workspacePath, directDepName, unresolvedVersion)
-
- if err != nil {
- return err
- }
-
- if !lockfilePkg.Found || resolvedDeps.Contains(lockfilePkg) {
- return nil
- }
-
- resolvedDeps.Add(lockfilePkg)
-
- allDeps, ok := lockfile.AllDependencies(lockfilePkg.Key)
-
- if !ok {
- panic(fmt.Sprintf("Unable to find entry for %s", lockfilePkg.Key))
- }
-
- if len(allDeps) > 0 {
- transitiveClosureHelper(wg, workspacePath, lockfile, allDeps, resolvedDeps)
- }
-
- return nil
- })
- }
-}