From 3f41c6bb637c79f2d0343bbfe0c1ad5bd100a293 Mon Sep 17 00:00:00 2001
From: Mikhail Glushenkov <mikhail.glushenkov@gmail.com>
Date: Thu, 12 May 2016 02:30:39 +0200
Subject: [PATCH] Use a custom ADT instead of a Bool.

---
 cabal-install/Distribution/Client/Setup.hs  | 12 ++++--
 cabal-install/Distribution/Client/Upload.hs | 46 +++++++++++----------
 2 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/cabal-install/Distribution/Client/Setup.hs b/cabal-install/Distribution/Client/Setup.hs
index b7a83b6342..d965c089ca 100644
--- a/cabal-install/Distribution/Client/Setup.hs
+++ b/cabal-install/Distribution/Client/Setup.hs
@@ -35,7 +35,7 @@ module Distribution.Client.Setup
     , getCommand, unpackCommand, GetFlags(..)
     , checkCommand
     , formatCommand
-    , uploadCommand, UploadFlags(..)
+    , uploadCommand, UploadFlags(..), IsCandidate(..)
     , reportCommand, ReportFlags(..)
     , runCommand
     , initCommand, IT.InitFlags(..)
@@ -1426,8 +1426,12 @@ instance Semigroup InstallFlags where
 -- * Upload flags
 -- ------------------------------------------------------------
 
+-- | Is this a candidate package or a package to be published?
+data IsCandidate = IsCandidate | IsPublished
+                 deriving Eq
+
 data UploadFlags = UploadFlags {
-    uploadCandidate   :: Flag Bool,
+    uploadCandidate   :: Flag IsCandidate,
     uploadDoc         :: Flag Bool,
     uploadUsername    :: Flag Username,
     uploadPassword    :: Flag Password,
@@ -1437,7 +1441,7 @@ data UploadFlags = UploadFlags {
 
 defaultUploadFlags :: UploadFlags
 defaultUploadFlags = UploadFlags {
-    uploadCandidate   = toFlag True,
+    uploadCandidate   = toFlag IsCandidate,
     uploadDoc         = toFlag False,
     uploadUsername    = mempty,
     uploadPassword    = mempty,
@@ -1463,7 +1467,7 @@ uploadCommand = CommandUI {
       ,option [] ["publish"]
         "Publish the package instead of uploading it as a candidate."
         uploadCandidate (\v flags -> flags { uploadCandidate = v })
-        falseArg
+        (noArg (Flag IsPublished))
 
       ,option ['d'] ["documentation"]
         ("Upload documentation instead of a source package. "
diff --git a/cabal-install/Distribution/Client/Upload.hs b/cabal-install/Distribution/Client/Upload.hs
index 0053b928b2..320b0d4fb4 100644
--- a/cabal-install/Distribution/Client/Upload.hs
+++ b/cabal-install/Distribution/Client/Upload.hs
@@ -5,7 +5,7 @@ import Distribution.Client.Types ( Username(..), Password(..)
 import Distribution.Client.HttpUtils
          ( HttpTransport(..), remoteRepoTryUpgradeToHttps )
 import Distribution.Client.Setup
-         ( RepoContext(..) )
+         ( IsCandidate(..), RepoContext(..) )
 
 import Distribution.Simple.Utils (notice, warn, info, die)
 import Distribution.Verbosity (Verbosity)
@@ -42,9 +42,9 @@ stripExtensions exts path = foldM f path (reverse exts)
     | otherwise = Nothing
 
 upload :: Verbosity -> RepoContext
-       -> Maybe Username -> Maybe Password -> Bool -> [FilePath]
+       -> Maybe Username -> Maybe Password -> IsCandidate -> [FilePath]
        -> IO ()
-upload verbosity repoCtxt mUsername mPassword candidate paths = do
+upload verbosity repoCtxt mUsername mPassword isCandidate paths = do
     let repos = repoContextRepos repoCtxt
     transport  <- repoContextGetTransport repoCtxt
     targetRepo <-
@@ -55,15 +55,17 @@ upload verbosity repoCtxt mUsername mPassword candidate paths = do
         rootIfEmpty x = if null x then "/" else x
         uploadURI = targetRepoURI {
             uriPath = rootIfEmpty (uriPath targetRepoURI) FilePath.Posix.</>
-              if candidate
-                then "packages/candidates"
-                else "upload"
+              case isCandidate of
+                IsCandidate -> "packages/candidates"
+                IsPublished -> "upload"
         }
         packageURI pkgid = targetRepoURI {
             uriPath = rootIfEmpty (uriPath targetRepoURI)
                       FilePath.Posix.</> concat
               [ "package/", pkgid
-              , if candidate then "/candidate" else ""
+              , case isCandidate of
+                  IsCandidate -> "/candidate"
+                  IsPublished -> ""
               ]
         }
     Username username <- maybe promptUsername return mUsername
@@ -73,15 +75,15 @@ upload verbosity repoCtxt mUsername mPassword candidate paths = do
       notice verbosity $ "Uploading " ++ path ++ "... "
       case fmap takeFileName (stripExtensions ["tar", "gz"] path) of
         Just pkgid -> handlePackage transport verbosity uploadURI
-                                    (packageURI pkgid) auth candidate path
+                                    (packageURI pkgid) auth isCandidate path
         -- This case shouldn't really happen, since we check in Main that we
         -- only pass tar.gz files to upload.
         Nothing -> die $ "Not a tar.gz file: " ++ path
 
 uploadDoc :: Verbosity -> RepoContext
-          -> Maybe Username -> Maybe Password -> Bool -> FilePath
+          -> Maybe Username -> Maybe Password -> IsCandidate -> FilePath
           -> IO ()
-uploadDoc verbosity repoCtxt mUsername mPassword candidate path = do
+uploadDoc verbosity repoCtxt mUsername mPassword isCandidate path = do
     let repos = repoContextRepos repoCtxt
     transport  <- repoContextGetTransport repoCtxt
     targetRepo <-
@@ -94,7 +96,9 @@ uploadDoc verbosity repoCtxt mUsername mPassword candidate path = do
             uriPath = rootIfEmpty (uriPath targetRepoURI)
                       FilePath.Posix.</> concat
               [ "package/", pkgid
-              , if candidate then "/candidate" else ""
+              , case isCandidate of
+                IsCandidate -> "/candidate"
+                IsPublished -> ""
               , "/docs"
               ]
         }
@@ -171,12 +175,12 @@ report verbosity repoCtxt mUsername mPassword = do
                        return ()
 
 handlePackage :: HttpTransport -> Verbosity -> URI -> URI -> Auth
-              -> Bool -> FilePath -> IO ()
-handlePackage transport verbosity uri packageUri auth candidate path =
+              -> IsCandidate -> FilePath -> IO ()
+handlePackage transport verbosity uri packageUri auth isCandidate path =
   do resp <- postHttpFile transport verbosity uri path auth
      case resp of
        (code,warnings) | code `elem` [200, 204] ->
-          notice verbosity $ okMessage ++
+          notice verbosity $ okMessage isCandidate ++
             if null warnings then "" else "\n" ++ formatWarnings (trim warnings)
        (code,err)  -> do
           notice verbosity $ "Error uploading " ++ path ++ ": "
@@ -184,13 +188,13 @@ handlePackage transport verbosity uri packageUri auth candidate path =
                           ++ err
           exitFailure
  where
-  okMessage
-    | candidate =
-        "Package successfully uploaded as candidate. "
-        ++ "You can now preview the result at '" ++ show packageUri
-        ++ "'. To publish the candidate, use 'cabal upload --publish'."
-    | otherwise = "Package successfully published. You can now view it at '"
-                  ++ show packageUri ++ "'."
+  okMessage IsCandidate =
+    "Package successfully uploaded as candidate. "
+    ++ "You can now preview the result at '" ++ show packageUri
+    ++ "'. To publish the candidate, use 'cabal upload --publish'."
+  okMessage IsPublished =
+    "Package successfully published. You can now view it at '"
+    ++ show packageUri ++ "'."
 
 formatWarnings :: String -> String
 formatWarnings x = "Warnings:\n" ++ (unlines . map ("- " ++) . lines) x
-- 
GitLab