Skip to content

Commit

Permalink
Do not use shallow clones for short revisions
Browse files Browse the repository at this point in the history
When the `tag` of a `source-repository-stanza` is not a full hash,
we cannot do a shallow clone and fetch it separately.

Therefore, in those cases, we fall back to doing a full clone.

Fixes haskell#10605

Includes a regression test by @9999years.

Co-authored-by: Rebecca Turner <[email protected]>
  • Loading branch information
9999years authored and alt-romes committed Dec 16, 2024
1 parent ae3f4d9 commit ed9968c
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 2 deletions.
32 changes: 30 additions & 2 deletions cabal-install/src/Distribution/Client/VCS.hs
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,10 @@ vcsGit =
-- If we want a particular branch or tag, fetch it.
ref <- case srpBranch `mplus` srpTag of
Nothing -> pure "HEAD"
Just ref -> do
-- `doShallow` controls whether we use a shallow clone.
-- If the clone is shallow, make sure to fetch specified revisions
-- before using them.
Just ref | doShallow -> do
-- /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\
-- /!\ MULTIPLE HOURS HAVE BEEN LOST HERE!! /!\
-- /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\
Expand Down Expand Up @@ -582,6 +585,9 @@ vcsGit =
-- for now. Option 1 is possible but seems to have little benefit.
git localDir ("fetch" : verboseArg ++ ["origin", ref])
pure "FETCH_HEAD"
Just ref
| otherwise ->
pure ref

-- Then, reset to the appropriate ref.
git localDir $
Expand All @@ -608,8 +614,30 @@ vcsGit =
{ progInvokeCwd = Just cwd
}

-- Beware: if the user supplied revision for the source repository
-- package is /not/ a full hash, then we cannot fetch it, which means
-- we cannot do a shallow clone (--depth=1).
-- See #10605.
doShallow
| Nothing <- srpTag =
-- No tag, OK for shallow
True
-- full hashes are exactly 40 characters
| Just tg <- srpTag
, length tg == 40
, all (`elem` (['0' .. '9'] ++ ['a' .. 'f'] ++ ['A' .. 'F'])) tg =
True
| otherwise =
False

depthIs1
| doShallow = ["--depth=1"]
| otherwise = []

cloneArgs =
["clone", "--depth=1", "--no-checkout", loc, localDir]
["clone"]
++ depthIs1
++ [ "--no-checkout", loc, localDir]
++ case peer of
Nothing -> []
Just peerLocalDir -> ["--reference", peerLocalDir]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# cabal v2-build
Configuration is affected by the following files:
- cabal.project
Resolving dependencies...
Build profile: -w ghc-<GHCVER> -O1
In order, the following will be built:
- puppy-1.0 (lib) (first run)
Configuring library for puppy-1.0...
Preprocessing library for puppy-1.0...
Building library for puppy-1.0...
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
packages: .

-- Regression for https://github.com/haskell/cabal/issues/10605
-- This is `my-lib` 0.9.
source-repository-package
type: git
location: https://github.com/9999years/cabal-testsuite-my-lib.git
tag: 9a0af0aa
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import Test.Cabal.Prelude

main = cabalTest $ do
cabal "v2-build" []
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
cabal-version: 3.0
name: puppy
version: 1.0

library
default-language: Haskell2010
hs-source-dirs: src
build-depends: base
exposed-modules: Puppy
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module Puppy () where

0 comments on commit ed9968c

Please sign in to comment.