From 55f965d8325f8f82d4e77fe606d51edf3ace4afd Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Sat, 6 Jun 2020 14:05:50 +0100 Subject: [PATCH] Backup local files further, and make it respect --project-file --- .gitignore | 4 +++ .../Distribution/Client/CmdConfigure.hs | 27 ++++++++++++++++--- .../Distribution/Client/TargetProblem.hs | 2 +- .../LocalConfigOverwrite/cabal.out | 23 ++++++++++++++++ .../LocalConfigOverwrite/cabal.test.hs | 19 +++++++++++-- .../LocalConfigOverwrite/foo.project | 0 .../LocalConfigOverwrite/foo.project.local | 5 ++++ 7 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/foo.project create mode 100644 cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/foo.project.local diff --git a/.gitignore b/.gitignore index 66b8c3795d1..0374201a3b7 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ ctags # stack artifacts /.stack-work/ +stack.yaml.lock # Shake artifacts .shake* @@ -60,3 +61,6 @@ register.sh # python artifacts from documentation builds *.pyc + +# macOS folder metadata +.DS_Store diff --git a/cabal-install/Distribution/Client/CmdConfigure.hs b/cabal-install/Distribution/Client/CmdConfigure.hs index 68dfbcafa56..454bb74a9fa 100644 --- a/cabal-install/Distribution/Client/CmdConfigure.hs +++ b/cabal-install/Distribution/Client/CmdConfigure.hs @@ -10,6 +10,7 @@ import Distribution.Client.Compat.Prelude import Prelude () import System.Directory +import System.FilePath import qualified Data.Map as Map import Distribution.Client.ProjectOrchestration @@ -30,6 +31,9 @@ import Distribution.Simple.Command import Distribution.Simple.Utils ( wrapText, notice ) +import Distribution.Client.DistDirLayout + ( DistDirLayout(..) ) + configureCommand :: CommandUI (NixStyleFlags ()) configureCommand = CommandUI { commandName = "v2-configure", @@ -93,10 +97,26 @@ configureAction flags@NixStyleFlags {..} _extraArgs globalFlags = do -- Write out the @cabal.project.local@ so it gets picked up by the -- planning phase. If old config exists, then print the contents -- before overwriting - exists <- doesFileExist "cabal.project.local" + + let localFile = distProjectFile (distDirLayout baseCtx) "local" + -- | Chooses cabal.project.local~, or if it already exists + -- cabal.project.local~0, cabal.project.local~1 etc. + firstFreeBackup = firstFreeBackup' (0 :: Int) + firstFreeBackup' i = do + let backup = localFile <> "~" <> (if i <= 0 then "" else show (i - 1)) + exists <- doesFileExist backup + if exists + then firstFreeBackup' (i + 1) + else return backup + + -- If cabal.project.local already exists, back up to cabal.project.local~[n] + exists <- doesFileExist localFile when exists $ do - notice verbosity "'cabal.project.local' already exists, backing it up to 'cabal.project.local~'." - copyFile "cabal.project.local" "cabal.project.local~" + backup <- firstFreeBackup + notice verbosity $ + quote (takeFileName localFile) <> " already exists, backing it up to " + <> quote (takeFileName backup) <> "." + copyFile localFile backup writeProjectLocalExtraConfig (distDirLayout baseCtx) cliConfig @@ -125,4 +145,5 @@ configureAction flags@NixStyleFlags {..} _extraArgs globalFlags = do verbosity = fromFlagOrDefault normal (configVerbosity configFlags) cliConfig = commandLineFlagsToProjectConfig globalFlags flags mempty -- ClientInstallFlags, not needed here + quote s = "'" <> s <> "'" diff --git a/cabal-install/Distribution/Client/TargetProblem.hs b/cabal-install/Distribution/Client/TargetProblem.hs index 78e3df2fff9..14004d50abd 100644 --- a/cabal-install/Distribution/Client/TargetProblem.hs +++ b/cabal-install/Distribution/Client/TargetProblem.hs @@ -45,8 +45,8 @@ data TargetProblem a | TargetProblemNoSuchPackage PackageId | TargetProblemNoSuchComponent PackageId ComponentName - | CustomTargetProblem a -- | A custom target problem + | CustomTargetProblem a deriving (Eq, Show, Functor) -- | Type alias for a 'TargetProblem' with no user-defined problems/errors. diff --git a/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/cabal.out b/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/cabal.out index 55c1c44e0b5..d9f368c84ea 100644 --- a/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/cabal.out +++ b/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/cabal.out @@ -4,3 +4,26 @@ Resolving dependencies... Build profile: -w ghc- -O1 In order, the following would be built: - NewConfigure-0.1.0.0 (lib) (first run) +# cabal v2-configure +'cabal.project.local' already exists, backing it up to 'cabal.project.local~0'. +Build profile: -w ghc- -O1 +In order, the following would be built: + - NewConfigure-0.1.0.0 (lib) (first run) +# cabal v2-configure +'cabal.project.local' already exists, backing it up to 'cabal.project.local~1'. +Build profile: -w ghc- -O1 +In order, the following would be built: + - NewConfigure-0.1.0.0 (lib) (first run) +# cabal v2-configure +Warning: There are no packages or optional-packages in the project +'foo.project.local' already exists, backing it up to 'foo.project.local~'. +Resolving dependencies... +Up to date +# cabal v2-configure +Warning: There are no packages or optional-packages in the project +'foo.project.local' already exists, backing it up to 'foo.project.local~0'. +Up to date +# cabal v2-configure +Warning: There are no packages or optional-packages in the project +'foo.project.local' already exists, backing it up to 'foo.project.local~1'. +Up to date diff --git a/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/cabal.test.hs b/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/cabal.test.hs index 85f89720913..8adf7ea3d9f 100644 --- a/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/cabal.test.hs +++ b/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/cabal.test.hs @@ -2,5 +2,20 @@ import Test.Cabal.Prelude main = cabalTest $ withSourceCopy $ do - r <- cabal' "v2-configure" [] - assertOutputContains "backing it up to" r + cabal' "v2-configure" [] >>= + assertOutputContains "backing it up to 'cabal.project.local~'" + cabal' "v2-configure" [] >>= + assertOutputContains "backing it up to 'cabal.project.local~0'" + cabal' "v2-configure" [] >>= + assertOutputContains "backing it up to 'cabal.project.local~1'" + + -- With --project-file + cabal' "v2-configure" ["--project-file", "foo.project"] >>= + assertOutputContains + "'foo.project.local' already exists, backing it up to 'foo.project.local~'" + cabal' "v2-configure" ["--project-file", "foo.project"] >>= + assertOutputContains + "'foo.project.local' already exists, backing it up to 'foo.project.local~0'" + cabal' "v2-configure" ["--project-file", "foo.project"] >>= + assertOutputContains + "'foo.project.local' already exists, backing it up to 'foo.project.local~1'" diff --git a/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/foo.project b/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/foo.project new file mode 100644 index 00000000000..e69de29bb2d diff --git a/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/foo.project.local b/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/foo.project.local new file mode 100644 index 00000000000..dfeadba71c9 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/foo.project.local @@ -0,0 +1,5 @@ +verbose: verbose +nowrap +markoutput +builddir: /Users/luke/Source/cabal/cabal-testsuite/PackageTests/NewConfigure/LocalConfigOverwrite/cabal.dist/work/./dist +jobs: 1 +project-file: foo.project +ignore-project: False