From f3fc650434c67eaae7e9544f724463f6b3aa10b0 Mon Sep 17 00:00:00 2001
From: Duncan Coutts <duncan@community.haskell.org>
Date: Sun, 18 Sep 2016 22:24:33 +0100
Subject: [PATCH] Distinguish PreExisting vs Installed in BuildStatus

Not a big deal, but should be useful later for more precise status
reporting. For now just means the rebuild reasons can be more precise.
---
 cabal-install/Distribution/Client/ProjectBuilding.hs     | 9 ++++++++-
 .../Distribution/Client/ProjectOrchestration.hs          | 3 ++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/cabal-install/Distribution/Client/ProjectBuilding.hs b/cabal-install/Distribution/Client/ProjectBuilding.hs
index ba6ebcb0db..75216a5468 100644
--- a/cabal-install/Distribution/Client/ProjectBuilding.hs
+++ b/cabal-install/Distribution/Client/ProjectBuilding.hs
@@ -146,6 +146,10 @@ data BuildStatus =
      --   need building.
      BuildStatusPreExisting
 
+     -- | The package is in the 'InstallPlan.Installed' state, so does not
+     --   need building.
+   | BuildStatusInstalled
+
      -- | The package has not been downloaded yet, so it will have to be
      --   downloaded, unpacked and built.
    | BuildStatusDownload
@@ -166,6 +170,7 @@ data BuildStatus =
 
 buildStatusToString :: BuildStatus -> String
 buildStatusToString BuildStatusPreExisting      = "BuildStatusPreExisting"
+buildStatusToString BuildStatusInstalled        = "BuildStatusInstalled"
 buildStatusToString BuildStatusDownload         = "BuildStatusDownload"
 buildStatusToString (BuildStatusUnpack fp)      = "BuildStatusUnpack " ++ show fp
 buildStatusToString (BuildStatusRebuild fp _)   = "BuildStatusRebuild " ++ show fp
@@ -229,6 +234,7 @@ data BuildReason =
 --
 buildStatusRequiresBuild :: BuildStatus -> Bool
 buildStatusRequiresBuild BuildStatusPreExisting = False
+buildStatusRequiresBuild BuildStatusInstalled   = False
 buildStatusRequiresBuild BuildStatusUpToDate {} = False
 buildStatusRequiresBuild _                      = True
 
@@ -263,7 +269,7 @@ rebuildTargetsDryRun verbosity distDirLayout@DistDirLayout{..} shared = \install
       return BuildStatusPreExisting
 
     dryRunPkg (InstallPlan.Installed _pkg) _depsBuildStatus =
-      return BuildStatusPreExisting --TODO: distinguish installed state
+      return BuildStatusInstalled
 
     dryRunPkg (InstallPlan.Configured pkg) depsBuildStatus = do
       mloc <- checkFetched (elabPkgSourceLocation pkg)
@@ -743,6 +749,7 @@ rebuildTarget verbosity
 
       -- TODO: perhaps re-nest the types to make these impossible
       BuildStatusPreExisting {} -> unexpectedState
+      BuildStatusInstalled   {} -> unexpectedState
       BuildStatusUpToDate    {} -> unexpectedState
   where
     unexpectedState = error "rebuildTarget: unexpected package status"
diff --git a/cabal-install/Distribution/Client/ProjectOrchestration.hs b/cabal-install/Distribution/Client/ProjectOrchestration.hs
index 6141059f7b..548fe1b9df 100644
--- a/cabal-install/Distribution/Client/ProjectOrchestration.hs
+++ b/cabal-install/Distribution/Client/ProjectOrchestration.hs
@@ -492,7 +492,8 @@ printPlan verbosity
     showFlagName (PD.FlagName f) = f
 
     showBuildStatus status = case status of
-      BuildStatusPreExisting -> "already installed"
+      BuildStatusPreExisting -> "existing package"
+      BuildStatusInstalled   -> "already installed"
       BuildStatusDownload {} -> "requires download & build"
       BuildStatusUnpack   {} -> "requires build"
       BuildStatusRebuild _ rebuild -> case rebuild of
-- 
GitLab