Skip to content

Commit

Permalink
Do not use shallow clones for source-repository-packages
Browse files Browse the repository at this point in the history
Fixes haskell#10605

Includes a regression test.
  • Loading branch information
9999years committed Dec 9, 2024
1 parent e8d73a2 commit c12168e
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 42 deletions.
46 changes: 4 additions & 42 deletions cabal-install/src/Distribution/Client/VCS.hs
Original file line number Diff line number Diff line change
Expand Up @@ -491,9 +491,6 @@ vcsGit =
resetArgs tag = "reset" : verboseArg ++ ["--hard", tag, "--"]
verboseArg = ["--quiet" | verbosity < Verbosity.normal]

-- Note: No --depth=1 for vcsCloneRepo since that is used for `cabal get -s`,
-- whereas `vcsSyncRepo` is used for source-repository-package where we do want shallow clones.

vcsSyncRepos
:: Verbosity
-> ConfiguredProgram
Expand Down Expand Up @@ -546,44 +543,9 @@ vcsGit =
(\e -> if isPermissionError e then removePathForcibly dotGitModulesPath else throw e)
else removeDirectoryRecursive dotGitModulesPath

-- If we want a particular branch or tag, fetch it.
ref <- case srpBranch `mplus` srpTag of
Nothing -> pure "HEAD"
Just ref -> do
-- /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\
-- /!\ MULTIPLE HOURS HAVE BEEN LOST HERE!! /!\
-- /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\
--
-- If you run `git fetch origin MY_TAG`, then the tag _will_ be
-- fetched, but no local ref (e.g. `refs/tags/MY_TAG`) will be
-- created.
--
-- This means that doing `git fetch origin MY_TAG && git reset --hard
-- MY_TAG` will fail with a message like `unknown revision MY_TAG`.
--
-- There are two ways around this:
--
-- 1. Provide a refmap explicitly:
--
-- git fetch --refmap="+refs/tags/*:refs/tags/*" origin MYTAG
--
-- This tells Git to create local tags matching remote tags. It's
-- not in the default refmap so you need to set it explicitly.
-- (You can also set it with `git config set --local
-- remote.origin.fetch ...`.)
--
-- 2. Use `FETCH_HEAD` directly: Git writes a `FETCH_HEAD` ref
-- containing the commit that was just fetched. This feels a bit
-- nasty but seems to work reliably, even if nothing was fetched.
-- (That is, deleting `FETCH_HEAD` and re-running a `git fetch`
-- command will succesfully recreate the `FETCH_HEAD` ref.)
--
-- Option 2 is what Cabal has done historically, and we're keeping it
-- for now. Option 1 is possible but seems to have little benefit.
git localDir ("fetch" : verboseArg ++ ["origin", ref])
pure "FETCH_HEAD"

-- Then, reset to the appropriate ref.
-- If we want a particular branch or tag, reset to it.
-- Otherwise, check out the default `HEAD`.
let ref = fromMaybe "HEAD" $ srpBranch `mplus` srpTag
git localDir $
"reset"
: verboseArg
Expand All @@ -609,7 +571,7 @@ vcsGit =
}

cloneArgs =
["clone", "--depth=1", "--no-checkout", loc, localDir]
["clone", "--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
source-repository-package
type: git
location: https://github.com/haskell/bytestring
-- Uses an abbreviated commit hash (not a tag! why was this ever accepted???)
tag: c73756a
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 c12168e

Please sign in to comment.