@@ -224,7 +224,14 @@ run { packages: packagesRequestedToInstall, ensureRanges, isTest, isRepl } = do
224224 -- (we return them from inside there because we need to update the commit hashes)
225225 case workspace.packageSet.lockfile of
226226 Right _lockfile -> pure dependencies
227- Left reason -> writeNewLockfile reason dependencies
227+ Left reason -> do
228+ -- When generating a lockfile, we need ALL git packages to be fetched so we can
229+ -- get their commit hashes. If a package is selected, depsToFetch only includes
230+ -- that package's deps, but the lockfile needs all packages.
231+ let allDeps = toAllDependencies allTransitiveDeps
232+ when (Map .keys allDeps /= Map .keys depsToFetch) do
233+ fetchPackagesToLocalCache allDeps
234+ writeNewLockfile reason dependencies
228235
229236fetchPackagesToLocalCache :: ∀ a . Map PackageName Package -> Spago (FetchEnv a ) Unit
230237fetchPackagesToLocalCache packages = do
@@ -530,16 +537,24 @@ getPackageDependencies packageName package = case package of
530537 maybeManifest <- Registry .getManifestFromIndex packageName v
531538 pure $ maybeManifest <#> \(Manifest m) -> { core: m.dependencies, test: Map .empty }
532539 GitPackage p -> do
533- -- Note: we get the package in local cache nonetheless,
534- -- so we have guarantees about being able to fetch it
535- { rootPath } <- ask
536- let packageLocation = Config .getLocalPackageLocation rootPath packageName package
537- unlessM (FS .exists packageLocation) do
538- getGitPackageInLocalCache packageName p
539540 case p.dependencies of
540- Just (Dependencies dependencies) ->
541+ -- if dependencies are declared, we can use them directly without cloning.
542+ -- the package will be fetched later in fetchPackagesToLocalCache.
543+ Just (Dependencies dependencies) -> do
544+ -- when offline, verify the package is cached before proceeding
545+ { offline, rootPath } <- ask
546+ let packageLocation = Config .getLocalPackageLocation rootPath packageName (GitPackage p)
547+ when (offline == Offline ) do
548+ unlessM (FS .exists packageLocation) do
549+ die $ " Package '" <> PackageName .print packageName <> " ' is not in the local cache, and Spago is running in offline mode - can't make progress."
541550 pure $ Just { core: map (fromMaybe Config .widestRange) dependencies, test: Map .empty }
551+ -- if the dependencies are not declared, then we need to clone the repo
552+ -- to look at the package manifest inside
542553 Nothing -> do
554+ { rootPath } <- ask
555+ let packageLocation = Config .getLocalPackageLocation rootPath packageName package
556+ unlessM (FS .exists packageLocation) do
557+ getGitPackageInLocalCache packageName p
543558 readLocalDependencies $ Path .toGlobal $ maybe packageLocation (packageLocation </> _) p.subdir
544559 LocalPackage p -> do
545560 readLocalDependencies $ Path .global p.path
0 commit comments