Avoid backtraces on expected failures when built with ghc 8; only use backtraces...
authorJoey Hess <joeyh@joeyh.name>
Wed, 16 Nov 2016 01:29:54 +0000 (21:29 -0400)
committerJoey Hess <joeyh@joeyh.name>
Wed, 16 Nov 2016 01:29:54 +0000 (21:29 -0400)
ghc 8 added backtraces on uncaught errors. This is great, but git-annex was
using error in many places for a error message targeted at the user, in
some known problem case. A backtrace only confuses such a message, so omit it.

Notably, commands like git annex drop that failed due to eg, numcopies,
used to use error, so had a backtrace.

This commit was sponsored by Ethan Aubin.

116 files changed:
Annex/AdjustedBranch.hs
Annex/Branch.hs
Annex/Content.hs
Annex/FileMatcher.hs
Annex/Init.hs
Annex/View.hs
Assistant/Threads/Watcher.hs
Assistant/Threads/WebApp.hs
Assistant/Upgrade.hs
Assistant/WebApp/Configurators/AWS.hs
Assistant/WebApp/Configurators/IA.hs
Assistant/WebApp/Configurators/Local.hs
Assistant/WebApp/Configurators/Ssh.hs
Assistant/WebApp/Configurators/WebDAV.hs
Assistant/WebApp/Gpg.hs
CHANGELOG
CmdLine/Action.hs
CmdLine/Batch.hs
CmdLine/GitAnnexShell.hs
CmdLine/GitAnnexShell/Checks.hs
CmdLine/Seek.hs
Command.hs
Command/AddUnused.hs
Command/AddUrl.hs
Command/Assistant.hs
Command/CheckPresentKey.hs
Command/ContentLocation.hs
Command/Dead.hs
Command/Describe.hs
Command/DiffDriver.hs
Command/Direct.hs
Command/DropKey.hs
Command/EnableRemote.hs
Command/ExamineKey.hs
Command/Expire.hs
Command/FromKey.hs
Command/Fsck.hs
Command/FuzzTest.hs
Command/GCryptSetup.hs
Command/Group.hs
Command/GroupWanted.hs
Command/Import.hs
Command/ImportFeed.hs
Command/Indirect.hs
Command/InitRemote.hs
Command/Lock.hs
Command/LockContent.hs
Command/Log.hs
Command/MetaData.hs
Command/Move.hs
Command/NumCopies.hs
Command/PreCommit.hs
Command/Proxy.hs
Command/ReKey.hs
Command/ReadPresentKey.hs
Command/RegisterUrl.hs
Command/Reinject.hs
Command/ResolveMerge.hs
Command/Schedule.hs
Command/SetKey.hs
Command/SetPresentKey.hs
Command/Sync.hs
Command/TestRemote.hs
Command/TransferInfo.hs
Command/Unannex.hs
Command/Undo.hs
Command/Ungroup.hs
Command/Uninit.hs
Command/Unused.hs
Command/VAdd.hs
Command/VCycle.hs
Command/VFilter.hs
Command/VPop.hs
Command/Vicfg.hs
Command/View.hs
Command/Wanted.hs
Command/WebApp.hs
Config/Files.hs
Creds.hs
Crypto.hs
Database/Types.hs
Git/AutoCorrect.hs
Git/CurrentRepo.hs
Git/GCrypt.hs
Limit.hs
Logs/Transitions.hs
Remote.hs
Remote/BitTorrent.hs
Remote/Bup.hs
Remote/Ddar.hs
Remote/Directory.hs
Remote/External.hs
Remote/GCrypt.hs
Remote/Git.hs
Remote/Glacier.hs
Remote/Helper/Chunked.hs
Remote/Helper/Encryptable.hs
Remote/Helper/Http.hs
Remote/Helper/Messages.hs
Remote/Helper/Ssh.hs
Remote/Hook.hs
Remote/Rsync.hs
Remote/S3.hs
Remote/Tahoe.hs
Remote/Web.hs
Remote/WebDAV.hs
Upgrade.hs
Utility/Daemon.hs
Utility/DirWatcher/FSEvents.hs
Utility/DirWatcher/INotify.hs
Utility/Exception.hs
Utility/Glob.hs
Utility/Gpg.hs
Utility/LockFile/PidLock.hs
Utility/Quvi.hs
Utility/UserInfo.hs

index 4caf637c7ee241645efc398d49f3ae8469577a91..72c07a5bc4eba65c054ba9859e9392006d25f2e2 100644 (file)
@@ -596,7 +596,7 @@ checkAdjustedClone = ifM isBareRepo
                                aps <- fmap commitParent <$> findAdjustingCommit (AdjBranch currbranch)
                                case aps of
                                        Just [p] -> setBasisBranch basis p
-                                       _ -> error $ "Unable to clean up from clone of adjusted branch; perhaps you should check out " ++ Git.Ref.describe origbranch
+                                       _ -> giveup $ "Unable to clean up from clone of adjusted branch; perhaps you should check out " ++ Git.Ref.describe origbranch
                        ifM versionSupportsUnlockedPointers
                                ( return InAdjustedClone
                                , return NeedUpgradeForAdjustedClone
@@ -610,6 +610,6 @@ isGitVersionSupported = not <$> Git.Version.older "2.2.0"
 checkVersionSupported :: Annex ()
 checkVersionSupported = do
        unlessM versionSupportsAdjustedBranch $
-               error "Adjusted branches are only supported in v6 or newer repositories."
+               giveup "Adjusted branches are only supported in v6 or newer repositories."
        unlessM (liftIO isGitVersionSupported) $
-               error "Your version of git is too old; upgrade it to 2.2.0 or newer to use adjusted branches."
+               giveup "Your version of git is too old; upgrade it to 2.2.0 or newer to use adjusted branches."
index a426c76d85445d9a4d2f513b99f5853b3f02fd75..9663311d51936ac1ba81749b9bc416cc5311e35b 100644 (file)
@@ -225,7 +225,7 @@ getHistorical date file =
        -- This check avoids some ugly error messages when the reflog
        -- is empty.
        ifM (null <$> inRepo (Git.RefLog.get' [Param (fromRef fullname), Param "-n1"]))
-               ( error ("No reflog for " ++ fromRef fullname)
+               ( giveup ("No reflog for " ++ fromRef fullname)
                , getRef (Git.Ref.dateRef fullname date) file
                )
 
@@ -574,7 +574,7 @@ checkBranchDifferences ref = do
                <$> catFile ref differenceLog
        mydiffs <- annexDifferences <$> Annex.getGitConfig
        when (theirdiffs /= mydiffs) $
-               error "Remote repository is tuned in incompatable way; cannot be merged with local repository."
+               giveup "Remote repository is tuned in incompatable way; cannot be merged with local repository."
 
 ignoreRefs :: [Git.Sha] -> Annex ()
 ignoreRefs rs = do
index cb96a0068bf07eac35e34239a40e62ec30b8dee1..e879e4eebbf3f0bcb72301f422a212b97eadd3d9 100644 (file)
@@ -268,8 +268,8 @@ lockContentUsing locker key a = do
                (unlock lockfile)
                (const a)
   where
-       alreadylocked = error "content is locked"
-       failedtolock e = error $ "failed to lock content: " ++ show e
+       alreadylocked = giveup "content is locked"
+       failedtolock e = giveup $ "failed to lock content: " ++ show e
 
        lock contentfile lockfile =
                (maybe alreadylocked return 
index fa46e64b1dc93f1294dcd69dd69cb38349f41024..654c5a9606aa8f5ed8c4441b046d1514aa3ae8d9 100644 (file)
@@ -165,7 +165,7 @@ largeFilesMatcher = go =<< annexLargeFiles <$> Annex.getGitConfig
        mkmatcher expr = do
                parser <- mkLargeFilesParser
                either badexpr return $ parsedToMatcher $ parser expr
-       badexpr e = error $ "bad annex.largefiles configuration: " ++ e
+       badexpr e = giveup $ "bad annex.largefiles configuration: " ++ e
 
 simply :: MatchFiles Annex -> ParseResult
 simply = Right . Operation
index 5aff4cf39874d82c644dd662cfa0872ec055f025..8a208fe2bb6cf3070a285773d656b05f4329053a 100644 (file)
@@ -129,7 +129,7 @@ ensureInitialized = getVersion >>= maybe needsinit checkUpgrade
   where
        needsinit = ifM Annex.Branch.hasSibling
                        ( initialize Nothing Nothing
-                       , error "First run: git-annex init"
+                       , giveup "First run: git-annex init"
                        )
 
 {- Checks if a repository is initialized. Does not check version for ugrade. -}
index 7d2b43e60816e0fa1aa96c4165d3d86926bcac4d..d865c8f783f9183da45163787e711bec88ff9dc4 100644 (file)
@@ -110,7 +110,7 @@ refineView origview = checksize . calc Unchanged origview
                        in (view', Narrowing)
        
        checksize r@(v, _)
-               | viewTooLarge v = error $ "View is too large (" ++ show (visibleViewSize v) ++ " levels of subdirectories)"
+               | viewTooLarge v = giveup $ "View is too large (" ++ show (visibleViewSize v) ++ " levels of subdirectories)"
                | otherwise = r
 
 updateViewComponent :: ViewComponent -> MetaField -> ViewFilter -> Writer [ViewChange] ViewComponent
@@ -424,4 +424,4 @@ genViewBranch view = withViewIndex $ do
        return branch
 
 withCurrentView :: (View -> Annex a) -> Annex a
-withCurrentView a = maybe (error "Not in a view.") a =<< currentView
+withCurrentView a = maybe (giveup "Not in a view.") a =<< currentView
index 1f50065b9c7594550c523b9c225c2e1549ea1ab3..4b82a799d71b4f65129615948a2cfb3711d69843 100644 (file)
@@ -65,10 +65,10 @@ checkCanWatch
 #else
                noop
 #endif
-       | otherwise = error "watch mode is not available on this system"
+       | otherwise = giveup "watch mode is not available on this system"
 
 needLsof :: Annex ()
-needLsof = error $ unlines
+needLsof = giveup $ unlines
        [ "The lsof command is needed for watch mode to be safe, and is not in PATH."
        , "To override lsof checks to ensure that files are not open for writing"
        , "when added to the annex, you can use --force"
index 58effdc1c03ae9f96d4e0b3fcd9584efb078144d..f9a456f357921f0bc19eadc95131ac598346bcc6 100644 (file)
@@ -71,7 +71,7 @@ webAppThread assistantdata urlrenderer noannex cannotrun postfirstrun listenhost
 #ifdef __ANDROID__
        when (isJust listenhost') $
                -- See Utility.WebApp
-               error "Sorry, --listen is not currently supported on Android"
+               giveup "Sorry, --listen is not currently supported on Android"
 #endif
        webapp <- WebApp
                <$> pure assistantdata
index fa5870f3eaaaf99ecdb5a8f4b01aaabe4dd235f2..28b838dc2b7dd3bd7ce4eb9817c4074b3a24adb6 100644 (file)
@@ -153,7 +153,7 @@ upgradeToDistribution newdir cleanup distributionfile = do
   where
        changeprogram program = liftIO $ do
                unlessM (boolSystem program [Param "version"]) $
-                       error "New git-annex program failed to run! Not using."
+                       giveup "New git-annex program failed to run! Not using."
                pf <- programFile
                liftIO $ writeFile pf program
        
index bec3123f89db161dc6a7218ddef056d2db74d18a..981477e1145f12aee3cfe35bf253502316882da5 100644 (file)
@@ -139,7 +139,7 @@ postAddS3R = awsConfigurator $ do
                                ]
                _ -> $(widgetFile "configurators/adds3")
 #else
-postAddS3R = error "S3 not supported by this build"
+postAddS3R = giveup "S3 not supported by this build"
 #endif
 
 getAddGlacierR :: Handler Html
@@ -161,7 +161,7 @@ postAddGlacierR = glacierConfigurator $ do
                                ]
                _ -> $(widgetFile "configurators/addglacier")
 #else
-postAddGlacierR = error "S3 not supported by this build"
+postAddGlacierR = giveup "S3 not supported by this build"
 #endif
 
 getEnableS3R :: UUID -> Handler Html
@@ -179,7 +179,7 @@ postEnableS3R :: UUID -> Handler Html
 #ifdef WITH_S3
 postEnableS3R uuid = awsConfigurator $ enableAWSRemote S3.remote uuid
 #else
-postEnableS3R _ = error "S3 not supported by this build"
+postEnableS3R _ = giveup "S3 not supported by this build"
 #endif
 
 getEnableGlacierR :: UUID -> Handler Html
@@ -205,7 +205,7 @@ enableAWSRemote remotetype uuid = do
                                T.pack <$> Remote.prettyUUID uuid
                        $(widgetFile "configurators/enableaws")
 #else
-enableAWSRemote _ _ = error "S3 not supported by this build"
+enableAWSRemote _ _ = giveup "S3 not supported by this build"
 #endif
 
 makeAWSRemote :: SpecialRemoteMaker -> RemoteType -> StandardGroup -> AWSCreds -> RemoteName -> RemoteConfig -> Handler ()
index a6816958e750136004ac9abaf37f088af95af714..c46fcf510e6d6b9a2cc90878659f957c4ae58057 100644 (file)
@@ -147,7 +147,7 @@ postAddIAR = iaConfigurator $ do
                                        ]
                _ -> $(widgetFile "configurators/addia")
 #else
-postAddIAR = error "S3 not supported by this build"
+postAddIAR = giveup "S3 not supported by this build"
 #endif
 
 getEnableIAR :: UUID -> Handler Html
@@ -157,7 +157,7 @@ postEnableIAR :: UUID -> Handler Html
 #ifdef WITH_S3
 postEnableIAR = iaConfigurator . enableIARemote
 #else
-postEnableIAR _ = error "S3 not supported by this build"
+postEnableIAR _ = giveup "S3 not supported by this build"
 #endif
 
 #ifdef WITH_S3
index 76f21e9937443ed3d98ad7a10eba399cd16963a7..f2079c0ed26311728483b4a3fc75b80e0c9ead1d 100644 (file)
@@ -151,7 +151,7 @@ getFirstRepositoryR = postFirstRepositoryR
 postFirstRepositoryR :: Handler Html
 postFirstRepositoryR = page "Getting started" (Just Configuration) $ do
        unlessM (liftIO $ inPath "git") $
-               error "You need to install git in order to use git-annex!"
+               giveup "You need to install git in order to use git-annex!"
 #ifdef __ANDROID__
        androidspecial <- liftIO $ doesDirectoryExist "/sdcard/DCIM"
        let path = "/sdcard/annex"
@@ -309,7 +309,7 @@ getFinishAddDriveR drive = go
                mu <- liftAnnex $ probeGCryptRemoteUUID dir
                case mu of
                        Just u -> enableexistinggcryptremote u
-                       Nothing -> error "The drive contains a gcrypt repository that is not a git-annex special remote. This is not supported."
+                       Nothing -> giveup "The drive contains a gcrypt repository that is not a git-annex special remote. This is not supported."
        enableexistinggcryptremote u = do
                remotename' <- liftAnnex $ getGCryptRemoteName u dir
                makewith $ const $ do
index 5ad28402e4eba13cbfd9e0aa13eca1c99451ab15..950290249cf892cc63dbdc325da2dc5a120332e7 100644 (file)
@@ -196,7 +196,7 @@ postEnableSshGCryptR u = whenGcryptInstalled $
        enablegcrypt sshdata _ = prepSsh False sshdata $ \sshdata' ->
                sshConfigurator $
                        checkExistingGCrypt sshdata' $
-                               error "Expected to find an encrypted git repository, but did not."
+                               giveup "Expected to find an encrypted git repository, but did not."
        getsshinput = parseSshUrl <=< M.lookup "gitrepo"
 
 getEnableSshGitRemoteR :: UUID -> Handler Html
@@ -475,7 +475,7 @@ checkExistingGCrypt sshdata nope = checkGCryptRepoEncryption repourl nope nope $
        case mu of
                Just u -> void $ liftH $
                        combineExistingGCrypt sshdata u
-               Nothing -> error "The location contains a gcrypt repository that is not a git-annex special remote. This is not supported."
+               Nothing -> giveup "The location contains a gcrypt repository that is not a git-annex special remote. This is not supported."
   where
        repourl = genSshUrl sshdata
 
@@ -641,7 +641,7 @@ enableRsyncNetGCrypt sshinput reponame =
                checkGCryptRepoEncryption (genSshUrl sshdata) notencrypted notinstalled $
                        enableGCrypt sshdata reponame
   where
-       notencrypted = error "Unexpectedly found a non-encrypted git repository, instead of the expected encrypted git repository."
+       notencrypted = giveup "Unexpectedly found a non-encrypted git repository, instead of the expected encrypted git repository."
        notinstalled = error "internal"
 
 {- Prepares rsync.net ssh key and creates the directory that will be 
index 613e5439a78f2865b82e2dc2c3571ba4274a5aeb..9c168d744fe24e08811085a24cf04d03258eeea1 100644 (file)
@@ -82,7 +82,7 @@ postAddBoxComR = boxConfigurator $ do
                                ]
                _ -> $(widgetFile "configurators/addbox.com")
 #else
-postAddBoxComR = error "WebDAV not supported by this build"
+postAddBoxComR = giveup "WebDAV not supported by this build"
 #endif
 
 getEnableWebDAVR :: UUID -> Handler Html
@@ -120,7 +120,7 @@ postEnableWebDAVR uuid = do
                                        T.pack <$> Remote.prettyUUID uuid
                                $(widgetFile "configurators/enablewebdav")
 #else
-postEnableWebDAVR _ = error "WebDAV not supported by this build"
+postEnableWebDAVR _ = giveup "WebDAV not supported by this build"
 #endif
 
 #ifdef WITH_WEBDAV
index 6afb20fd11a3b1e3d373ba56d32d096e7338b503..10223ccccbf80181abe49737f4abd590a71e97da 100644 (file)
@@ -56,7 +56,7 @@ withNewSecretKey use = do
        liftIO $ genSecretKey cmd RSA "" userid maxRecommendedKeySize
        results <- M.keys . M.filter (== userid) <$> liftIO (secretKeys cmd)
        case results of
-               [] -> error "Failed to generate gpg key!"
+               [] -> giveup "Failed to generate gpg key!"
                (key:_) -> use key
 
 {- Tries to find the name used in remote.log for a gcrypt repository
@@ -85,7 +85,7 @@ getGCryptRemoteName u repoloc = do
        void $ inRepo $ Git.Remote.Remove.remove tmpremote
        maybe missing return mname
   where
-       missing = error $ "Cannot find configuration for the gcrypt remote at " ++ repoloc
+       missing = giveup $ "Cannot find configuration for the gcrypt remote at " ++ repoloc
 
 {- Checks to see if a repo is encrypted with gcrypt, and runs one action if
  - it's not an another if it is.
@@ -103,7 +103,7 @@ checkGCryptRepoEncryption location notencrypted notinstalled encrypted =
        dispatch Git.GCrypt.Decryptable = encrypted
        dispatch Git.GCrypt.NotEncrypted = notencrypted
        dispatch Git.GCrypt.NotDecryptable =
-               error "This git repository is encrypted with a GnuPG key that you do not have."
+               giveup "This git repository is encrypted with a GnuPG key that you do not have."
 
 {- Gets the UUID of the gcrypt repo at a location, which may not exist.
  - Only works if the gcrypt repo was created as a git-annex remote. -}
index a792d71cc7b4c4be06dcbb35e97db146e1100891..71ef1c1002c5664f7bae2abef1f7b076e902a852 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -9,6 +9,8 @@ git-annex (6.20161112) UNRELEASED; urgency=medium
   * sync: Pass --allow-unrelated-histories to git merge when used with git
     git 2.9.0 or newer. This makes merging a remote into a freshly created
     direct mode repository work the same as it works in indirect mode.
+  * Avoid backtraces on expected failures when built with ghc 8;
+    only use backtraces for unexpected errors.
 
  -- Joey Hess <id@joeyh.name>  Tue, 15 Nov 2016 11:15:27 -0400
 
index 7d9dce57435bb02282da0e56e7e1ed169684abb4..27621e4458fc647425c10ff145f1f38cdf49c6b4 100644 (file)
@@ -38,7 +38,7 @@ performCommandAction Command { cmdcheck = c, cmdname = name } seek cont = do
        showerrcount =<< Annex.getState Annex.errcounter
   where
        showerrcount 0 = noop
-       showerrcount cnt = error $ name ++ ": " ++ show cnt ++ " failed"
+       showerrcount cnt = giveup $ name ++ ": " ++ show cnt ++ " failed"
 
 {- Runs one of the actions needed to perform a command.
  - Individual actions can fail without stopping the whole command,
index cca93b0b394ecccf09851cac7857c718b153ffe3..627c1df101b188c821c576728efa288c0e87c686 100644 (file)
@@ -56,7 +56,7 @@ batchInput parser a = do
                        either parseerr a (parser v)
                        batchInput parser a
   where
-       parseerr s = error $ "Batch input parse failure: " ++ s
+       parseerr s = giveup $ "Batch input parse failure: " ++ s
 
 -- Runs a CommandStart in batch mode.
 --
index 599d12fec11a628affd8b71b23d04a15778587e8..70c86ec2f7b13575f6e613f951890d8c38888418 100644 (file)
@@ -71,7 +71,7 @@ globalOptions =
                check Nothing = unexpected expected "uninitialized repository"
                check (Just u) = unexpectedUUID expected u
        unexpectedUUID expected u = unexpected expected $ "UUID " ++ fromUUID u
-       unexpected expected s = error $
+       unexpected expected s = giveup $
                "expected repository UUID " ++ expected ++ " but found " ++ s
 
 run :: [String] -> IO ()
@@ -109,7 +109,7 @@ builtin cmd dir params = do
                Git.Config.read r
                        `catchIO` \_ -> do
                                hn <- fromMaybe "unknown" <$> getHostname
-                               error $ "failed to read git config of git repository in " ++ hn ++ " on " ++ dir ++ "; perhaps this repository is not set up correctly or has moved"
+                               giveup $ "failed to read git config of git repository in " ++ hn ++ " on " ++ dir ++ "; perhaps this repository is not set up correctly or has moved"
 
 external :: [String] -> IO ()
 external params = do
@@ -120,7 +120,7 @@ external params = do
        checkDirectory lastparam
        checkNotLimited
        unlessM (boolSystem "git-shell" $ map Param $ "-c":params') $
-               error "git-shell failed"
+               giveup "git-shell failed"
 
 {- Split the input list into 3 groups separated with a double dash --.
  - Parameters between two -- markers are field settings, in the form:
@@ -150,6 +150,6 @@ checkField (field, val)
        | otherwise = False
 
 failure :: IO ()
-failure = error $ "bad parameters\n\n" ++ usage h cmds
+failure = giveup $ "bad parameters\n\n" ++ usage h cmds
   where
        h = "git-annex-shell [-c] command [parameters ...] [option ...]"
index 63d2e594f75d9ff2c7e323d241598079dd3f7750..47bc11a767d869c7eba5190469cdea6ef202985a 100644 (file)
@@ -26,7 +26,7 @@ checkEnv var = do
        case v of
                Nothing -> noop
                Just "" -> noop
-               Just _ -> error $ "Action blocked by " ++ var
+               Just _ -> giveup $ "Action blocked by " ++ var
 
 checkDirectory :: Maybe FilePath -> IO ()
 checkDirectory mdir = do
@@ -44,7 +44,7 @@ checkDirectory mdir = do
                                        then noop
                                        else req d' (Just dir')
   where
-       req d mdir' = error $ unwords 
+       req d mdir' = giveup $ unwords 
                [ "Only allowed to access"
                , d
                , maybe "and could not determine directory from command line" ("not " ++) mdir'
@@ -64,4 +64,4 @@ gitAnnexShellCheck :: Command -> Command
 gitAnnexShellCheck = addCheck okforshell . dontCheck repoExists
   where
        okforshell = unlessM (isInitialized <||> isJust . gcryptId <$> Annex.getGitConfig) $
-               error "Not a git-annex or gcrypt repository."
+               giveup "Not a git-annex or gcrypt repository."
index 5d20ad0dbe76578dab4aa32a99ec5cfc9eb09665..7fc64c52846a04a40487cd00dccbbd121f857f96 100644 (file)
@@ -40,7 +40,7 @@ withFilesInGitNonRecursive :: String -> (FilePath -> CommandStart) -> CmdParams
 withFilesInGitNonRecursive needforce a params = ifM (Annex.getState Annex.force)
        ( withFilesInGit a params
        , if null params
-               then error needforce
+               then giveup needforce
                else seekActions $ prepFiltered a (getfiles [] params)
        )
   where
@@ -54,7 +54,7 @@ withFilesInGitNonRecursive needforce a params = ifM (Annex.getState Annex.force)
                        [] -> do
                                void $ liftIO $ cleanup
                                getfiles c ps
-                       _ -> error needforce
+                       _ -> giveup needforce
 
 withFilesNotInGit :: Bool -> (FilePath -> CommandStart) -> CmdParams -> CommandSeek
 withFilesNotInGit skipdotfiles a params
@@ -117,7 +117,7 @@ withPairs a params = seekActions $ return $ map a $ pairs [] params
   where
        pairs c [] = reverse c
        pairs c (x:y:xs) = pairs ((x,y):c) xs
-       pairs _ _ = error "expected pairs"
+       pairs _ _ = giveup "expected pairs"
 
 withFilesToBeCommitted :: (FilePath -> CommandStart) -> CmdParams -> CommandSeek
 withFilesToBeCommitted a params = seekActions $ prepFiltered a $
@@ -152,11 +152,11 @@ withFilesMaybeModified a params = seekActions $
 withKeys :: (Key -> CommandStart) -> CmdParams -> CommandSeek
 withKeys a params = seekActions $ return $ map (a . parse) params
   where
-       parse p = fromMaybe (error "bad key") $ file2key p
+       parse p = fromMaybe (giveup "bad key") $ file2key p
 
 withNothing :: CommandStart -> CmdParams -> CommandSeek
 withNothing a [] = seekActions $ return [a]
-withNothing _ _ = error "This command takes no parameters."
+withNothing _ _ = giveup "This command takes no parameters."
 
 {- Handles the --all, --branch, --unused, --failed, --key, and
  - --incomplete options, which specify particular keys to run an
@@ -191,7 +191,7 @@ withKeyOptions'
 withKeyOptions' ko auto mkkeyaction fallbackaction params = do
        bare <- fromRepo Git.repoIsLocalBare
        when (auto && bare) $
-               error "Cannot use --auto in a bare repository"
+               giveup "Cannot use --auto in a bare repository"
        case (null params, ko) of
                (True, Nothing)
                        | bare -> noauto $ runkeyaction loggedKeys
@@ -203,10 +203,10 @@ withKeyOptions' ko auto mkkeyaction fallbackaction params = do
                (True, Just (WantSpecificKey k)) -> noauto $ runkeyaction (return [k])
                (True, Just WantIncompleteKeys) -> noauto $ runkeyaction incompletekeys
                (True, Just (WantBranchKeys bs)) -> noauto $ runbranchkeys bs
-               (False, Just _) -> error "Can only specify one of file names, --all, --branch, --unused, --failed, --key, or --incomplete"
+               (False, Just _) -> giveup "Can only specify one of file names, --all, --branch, --unused, --failed, --key, or --incomplete"
   where
        noauto a
-               | auto = error "Cannot use --auto with --all or --branch or --unused or --key or --incomplete"
+               | auto = giveup "Cannot use --auto with --all or --branch or --unused or --key or --incomplete"
                | otherwise = a
        incompletekeys = staleKeysPrune gitAnnexTmpObjectDir True
        runkeyaction getks = do
index 94a4742577f6d0bcf8f1c8fef63d5a14ec5c371e..f8d4fe32bbe31f37b1bfb552f0e5aed46b4305b2 100644 (file)
@@ -101,15 +101,15 @@ repoExists = CommandCheck 0 ensureInitialized
 
 notDirect :: Command -> Command
 notDirect = addCheck $ whenM isDirect $
-       error "You cannot run this command in a direct mode repository."
+       giveup "You cannot run this command in a direct mode repository."
 
 notBareRepo :: Command -> Command
 notBareRepo = addCheck $ whenM (fromRepo Git.repoIsLocalBare) $
-       error "You cannot run this command in a bare repository."
+       giveup "You cannot run this command in a bare repository."
 
 noDaemonRunning :: Command -> Command
 noDaemonRunning = addCheck $ whenM (isJust <$> daemonpid) $
-       error "You cannot run this command while git-annex watch or git-annex assistant is running."
+       giveup "You cannot run this command while git-annex watch or git-annex assistant is running."
   where
        daemonpid = liftIO . checkDaemon =<< fromRepo gitAnnexPidFile
 
index 7a9a1ba30cf229db7833ea26a40443226c3c5b46..c83c74e726e5531975fd5fa7acaf33ba55edb62c 100644 (file)
@@ -38,4 +38,4 @@ perform key = next $ do
  - it seems better to error out, rather than moving bad/tmp content into
  - the annex. -}
 performOther :: String -> Key -> CommandPerform
-performOther other _ = error $ "cannot addunused " ++ other ++ "content"
+performOther other _ = giveup $ "cannot addunused " ++ other ++ "content"
index 80f3582ed5393fa9afd6169e18337c7c98f11e24..e32ceb5684242be56ee05be994a589fcf9cea3b1 100644 (file)
@@ -133,7 +133,7 @@ checkUrl r o u = do
                                let f' = adjustFile o (deffile </> fromSafeFilePath f)
                                void $ commandAction $
                                        startRemote r (relaxedOption o) f' u' sz
-               | otherwise = error $ unwords
+               | otherwise = giveup $ unwords
                        [ "That url contains multiple files according to the"
                        , Remote.name r
                        , " remote; cannot add it to a single file."
@@ -182,7 +182,7 @@ startWeb :: AddUrlOptions -> String -> CommandStart
 startWeb o s = go $ fromMaybe bad $ parseURI urlstring
   where
        (urlstring, downloader) = getDownloader s
-       bad = fromMaybe (error $ "bad url " ++ urlstring) $
+       bad = fromMaybe (giveup $ "bad url " ++ urlstring) $
                Url.parseURIRelaxed $ urlstring
        go url = case downloader of
                QuviDownloader -> usequvi
@@ -208,7 +208,7 @@ startWeb o s = go $ fromMaybe bad $ parseURI urlstring
                                                )
                showStart "addurl" file
                next $ performWeb (relaxedOption o) urlstring file urlinfo
-       badquvi = error $ "quvi does not know how to download url " ++ urlstring
+       badquvi = giveup $ "quvi does not know how to download url " ++ urlstring
        usequvi = do
                page <- fromMaybe badquvi
                        <$> withQuviOptions Quvi.forceQuery [Quvi.quiet, Quvi.httponly] urlstring
@@ -372,7 +372,7 @@ url2file url pathdepth pathmax = case pathdepth of
                | depth >= length urlbits -> frombits id
                | depth > 0 -> frombits $ drop depth
                | depth < 0 -> frombits $ reverse . take (negate depth) . reverse
-               | otherwise -> error "bad --pathdepth"
+               | otherwise -> giveup "bad --pathdepth"
   where
        fullurl = concat
                [ maybe "" uriRegName (uriAuthority url)
@@ -385,7 +385,7 @@ url2file url pathdepth pathmax = case pathdepth of
 
 urlString2file :: URLString -> Maybe Int -> Int -> FilePath
 urlString2file s pathdepth pathmax = case Url.parseURIRelaxed s of
-       Nothing -> error $ "bad uri " ++ s
+       Nothing -> giveup $ "bad uri " ++ s
        Just u -> url2file u pathdepth pathmax
 
 adjustFile :: AddUrlOptions -> FilePath -> FilePath
index 690f36f19972dffc3f1913d878cc78a98e745522..6a9ae6436aba8bffcbb69ac297b89a7709a3cfba 100644 (file)
@@ -66,14 +66,14 @@ startNoRepo :: AssistantOptions -> IO ()
 startNoRepo o
        | autoStartOption o = autoStart o
        | autoStopOption o = autoStop
-       | otherwise = error "Not in a git repository."
+       | otherwise = giveup "Not in a git repository."
 
 autoStart :: AssistantOptions -> IO ()
 autoStart o = do
        dirs <- liftIO readAutoStartFile
        when (null dirs) $ do
                f <- autoStartFile
-               error $ "Nothing listed in " ++ f
+               giveup $ "Nothing listed in " ++ f
        program <- programPath
        haveionice <- pure Build.SysConfig.ionice <&&> inPath "ionice"
        forM_ dirs $ \d -> do
index 29df810a63637fd033ccda6f73d6691778ab46f0..4f9b4b1207cb9cc60a2b1d7a4e68c4b9e3cdd049 100644 (file)
@@ -40,7 +40,7 @@ seek o = case batchOption o of
                        _ -> wrongnumparams
                batchInput Right $ checker >=> batchResult
   where
-       wrongnumparams = error "Wrong number of parameters"
+       wrongnumparams = giveup "Wrong number of parameters"
                                        
 data Result = Present | NotPresent | CheckFailure String
 
@@ -71,8 +71,8 @@ batchResult Present = liftIO $ putStrLn "1"
 batchResult _ = liftIO $ putStrLn "0"
 
 toKey :: String -> Key
-toKey = fromMaybe (error "Bad key") . file2key
+toKey = fromMaybe (giveup "Bad key") . file2key
 
 toRemote :: String -> Annex Remote
-toRemote rn = maybe (error "Unknown remote") return
+toRemote rn = maybe (giveup "Unknown remote") return
        =<< Remote.byNameWithUUID (Just rn)
index 5b2acb6a54216876696bbfde0eacecdf36f56e2f..202d76a21ddb7eb29993bcfc5b16ee5c37f897ce 100644 (file)
@@ -19,7 +19,7 @@ cmd = noCommit $ noMessages $
 
 run :: () -> String -> Annex Bool
 run _ p = do
-       let k = fromMaybe (error "bad key") $ file2key p
+       let k = fromMaybe (giveup "bad key") $ file2key p
        maybe (return False) (\f -> liftIO (putStrLn f) >> return True)
                =<< inAnnex' (pure True) Nothing check k
   where
index ecbe41293801fc919d231bd991209e78771b1493..44cf7b7f6a089cf831cbae1155145ba66a57f898 100644 (file)
@@ -37,7 +37,7 @@ startKey key = do
        ls <- keyLocations key
        case ls of
                [] -> next $ performKey key
-               _ -> error "This key is still known to be present in some locations; not marking as dead."
+               _ -> giveup "This key is still known to be present in some locations; not marking as dead."
                
 performKey :: Key -> CommandPerform
 performKey key = do
index 8872244f0f15abb2d7e96e9d2450c47138b8a603..dc7a5d8f91474cdc2f7bc56c1d42c15533cf81c3 100644 (file)
@@ -25,7 +25,7 @@ start (name:description) = do
        showStart "describe" name
        u <- Remote.nameToUUID name
        next $ perform u $ unwords description
-start _ = error "Specify a repository and a description."      
+start _ = giveup "Specify a repository and a description."     
 
 perform :: UUID -> String -> CommandPerform
 perform u description = do
index 2c9b4a39dc246a126c751fe5f582c5abe9937b50..1164dd103b1d58be462e86b6f9d84c17336ea441 100644 (file)
@@ -73,7 +73,7 @@ parseReq opts = case separate (== "--") opts of
        mk (unmergedpath:[]) = UnmergedReq { rPath = unmergedpath }
        mk _ = badopts
 
-       badopts = error $ "Unexpected input: " ++ unwords opts
+       badopts = giveup $ "Unexpected input: " ++ unwords opts
 
 {- Check if either file is a symlink to a git-annex object,
  - which git-diff will leave as a normal file containing the link text.
index 32d63f0598ddc8f00e9f76a6e6abe5aa1f43a285..06adf0e05b037745f8a9eafec82b08225d3f4052 100644 (file)
@@ -26,7 +26,7 @@ seek = withNothing start
 start :: CommandStart
 start = ifM versionSupportsDirectMode
        ( ifM isDirect ( stop , next perform )
-       , error "Direct mode is not suppported by this repository version. Use git-annex unlock instead."
+       , giveup "Direct mode is not suppported by this repository version. Use git-annex unlock instead."
        )
 
 perform :: CommandPerform
index 42516f838c090ab0264231633b15e9e5e77fbe7e..65446ba06ebf4d3db95397bbc1012e4b3034bfa0 100644 (file)
@@ -32,7 +32,7 @@ optParser desc = DropKeyOptions
 seek :: DropKeyOptions -> CommandSeek
 seek o = do
        unlessM (Annex.getState Annex.force) $
-               error "dropkey can cause data loss; use --force if you're sure you want to do this"
+               giveup "dropkey can cause data loss; use --force if you're sure you want to do this"
        withKeys start (toDrop o)
        case batchOption o of
                Batch -> batchInput parsekey $ batchCommandAction . start
index dc3e7bc56e545f03a0206ae10784e6975a10ca2d..e1af8bb7a4ca58f97a1393355c8d7ed2966aac37 100644 (file)
@@ -63,7 +63,7 @@ startSpecialRemote name config Nothing = do
                _ -> unknownNameError "Unknown remote name."
 startSpecialRemote name config (Just (u, c)) = do
        let fullconfig = config `M.union` c     
-       t <- either error return (Annex.SpecialRemote.findType fullconfig)
+       t <- either giveup return (Annex.SpecialRemote.findType fullconfig)
        showStart "enableremote" name
        gc <- maybe def Remote.gitconfig <$> Remote.byUUID u
        next $ performSpecialRemote t u fullconfig gc
@@ -94,7 +94,7 @@ unknownNameError prefix = do
        disabledremotes <- filterM isdisabled =<< Annex.fromRepo Git.remotes
        let remotesmsg = unlines $ map ("\t" ++) $
                mapMaybe Git.remoteName disabledremotes
-       error $ concat $ filter (not . null) [prefix ++ "\n", remotesmsg, specialmsg]
+       giveup $ concat $ filter (not . null) [prefix ++ "\n", remotesmsg, specialmsg]
   where
        isdisabled r = anyM id
                [ (==) NoUUID <$> getRepoUUID r
index e14ac10b8e6a853af68741c17e85fc9cc50cced6..24d6942fe531c712ec20a0d030e4d66312894424 100644 (file)
@@ -21,6 +21,6 @@ cmd = noCommit $ noMessages $ dontCheck repoExists $
 
 run :: Maybe Utility.Format.Format -> String -> Annex Bool
 run format p = do
-       let k = fromMaybe (error "bad key") $ file2key p
+       let k = fromMaybe (giveup "bad key") $ file2key p
        showFormatted format (key2file k) (keyVars k)
        return True
index fafee4506e263b021d1c28b56d62470a460c1b45..8dd0e962e547655ff50451298ea7f3955109bd80 100644 (file)
@@ -92,7 +92,7 @@ start (Expire expire) noact actlog descs u =
 data Expire = Expire (M.Map (Maybe UUID) (Maybe POSIXTime))
 
 parseExpire :: [String] -> Annex Expire
-parseExpire [] = error "Specify an expire time."
+parseExpire [] = giveup "Specify an expire time."
 parseExpire ps = do
        now <- liftIO getPOSIXTime
        Expire . M.fromList <$> mapM (parse now) ps
@@ -104,7 +104,7 @@ parseExpire ps = do
                        return (Just r, parsetime now t)
        parsetime _ "never" = Nothing
        parsetime now s = case parseDuration s of
-               Nothing -> error $ "bad expire time: " ++ s
+               Nothing -> giveup $ "bad expire time: " ++ s
                Just d -> Just (now - durationToPOSIXTime d)
 
 parseActivity :: Monad m => String -> m Activity
index 36cc1d31fdcd01722daa8a2591016eaea4027e76..670e9e6a6bf2efd35aacc15baccc293abdd7afff 100644 (file)
@@ -33,14 +33,14 @@ start force (keyname:file:[]) = do
        let key = mkKey keyname
        unless force $ do
                inbackend <- inAnnex key
-               unless inbackend $ error $
+               unless inbackend $ giveup $
                        "key ("++ keyname ++") is not present in backend (use --force to override this sanity check)"
        showStart "fromkey" file
        next $ perform key file
 start _ [] = do
        showStart "fromkey" "stdin"
        next massAdd
-start _ _ = error "specify a key and a dest file"
+start _ _ = giveup "specify a key and a dest file"
 
 massAdd :: CommandPerform
 massAdd = go True =<< map (separate (== ' ')) . lines <$> liftIO getContents
@@ -51,7 +51,7 @@ massAdd = go True =<< map (separate (== ' ')) . lines <$> liftIO getContents
                ok <- perform' key f
                let !status' = status && ok
                go status' rest
-       go _ _ = error "Expected pairs of key and file on stdin, but got something else."
+       go _ _ = giveup "Expected pairs of key and file on stdin, but got something else."
 
 -- From user input to a Key.
 -- User can input either a serialized key, or an url.
@@ -66,7 +66,7 @@ mkKey s = case parseURI s of
                Backend.URL.fromUrl s Nothing
        _ -> case file2key s of
                Just k -> k
-               Nothing -> error $ "bad key/url " ++ s
+               Nothing -> giveup $ "bad key/url " ++ s
 
 perform :: Key -> FilePath -> CommandPerform
 perform key file = do
index b37a26e122bc7457f3c5a34b824fdc9ec7d77fbd..9383c07f27ca7ad8ac55dcbac3c0c394d342abf4 100644 (file)
@@ -584,7 +584,7 @@ prepIncremental u (Just StartIncrementalO) = do
        recordStartTime u
        ifM (FsckDb.newPass u)
                ( StartIncremental <$> openFsckDb u
-               , error "Cannot start a new --incremental fsck pass; another fsck process is already running."
+               , giveup "Cannot start a new --incremental fsck pass; another fsck process is already running."
                )
 prepIncremental u (Just MoreIncrementalO) =
        ContIncremental <$> openFsckDb u
index 4aed02d465335c2b047b63db358d1d840a360d11..0c5aac9b3303b5a8e324fa7c93fbce556bcba403 100644 (file)
@@ -39,7 +39,7 @@ start = do
 
 guardTest :: Annex ()
 guardTest = unlessM (fromMaybe False . Git.Config.isTrue <$> getConfig key "") $
-       error $ unlines
+       giveup $ unlines
                [ "Running fuzz tests *writes* to and *deletes* files in"
                , "this repository, and pushes those changes to other"
                , "repositories! This is a developer tool, not something"
index f2943ea134199394835d08758588ba903c1546f7..cbc2de0efb5bbfd9b49c0d1b748821186ac4e1fd 100644 (file)
@@ -25,7 +25,7 @@ start :: String -> CommandStart
 start gcryptid = next $ next $ do
        u <- getUUID
        when (u /= NoUUID) $
-               error "gcryptsetup refusing to run; this repository already has a git-annex uuid!"
+               giveup "gcryptsetup refusing to run; this repository already has a git-annex uuid!"
        
        g <- gitRepo
        gu <- Remote.GCrypt.getGCryptUUID True g
@@ -35,5 +35,5 @@ start gcryptid = next $ next $ do
                        then do
                                void $ Remote.GCrypt.setupRepo gcryptid g
                                return True
-                       else error "cannot use gcrypt in a non-bare repository"
-               else error "gcryptsetup uuid mismatch"
+                       else giveup "cannot use gcrypt in a non-bare repository"
+               else giveup "gcryptsetup uuid mismatch"
index 8e901dfb343f84a4733977aa2969a646399ef870..6d9b4ab131900b1dedc5ffc0bdb9bea162c3eb42 100644 (file)
@@ -30,7 +30,7 @@ start (name:[]) = do
        u <- Remote.nameToUUID name
        showRaw . unwords . S.toList =<< lookupGroups u
        stop
-start _ = error "Specify a repository and a group."
+start _ = giveup "Specify a repository and a group."
 
 setGroup :: UUID -> Group -> CommandPerform
 setGroup uuid g = do
index 6a9e300bf3d74b8220848e56e0e46e6a2944bde5..c0be2462dbd02b090ecf77b059485d1072b48f78 100644 (file)
@@ -25,4 +25,4 @@ start (g:[]) = next $ performGet groupPreferredContentMapRaw g
 start (g:expr:[]) = do
        showStart "groupwanted" g
        next $ performSet groupPreferredContentSet expr g
-start _ = error "Specify a group."
+start _ = giveup "Specify a group."
index d5a2feed59f829deac9e122fb5654cd3a5ee19c6..a16349ad2a648beade117f8bb8b478100dcb2bbc 100644 (file)
@@ -62,7 +62,7 @@ seek o = allowConcurrentOutput $ do
        repopath <- liftIO . absPath =<< fromRepo Git.repoPath
        inrepops <- liftIO $ filter (dirContains repopath) <$> mapM absPath (importFiles o)
        unless (null inrepops) $ do
-               error $ "cannot import files from inside the working tree (use git annex add instead): " ++ unwords inrepops
+               giveup $ "cannot import files from inside the working tree (use git annex add instead): " ++ unwords inrepops
        largematcher <- largeFilesMatcher
        withPathContents (start largematcher (duplicateMode o)) (importFiles o)
 
index 8f3a6072613c7f55d963e647d745b4c46c313bf6..1736f2567c78a1f85dac36b7f396c6a91d79913f 100644 (file)
@@ -147,7 +147,7 @@ findDownloads u = go =<< downloadFeed u
 {- Feeds change, so a feed download cannot be resumed. -}
 downloadFeed :: URLString -> Annex (Maybe Feed)
 downloadFeed url
-       | Url.parseURIRelaxed url == Nothing = error "invalid feed url"
+       | Url.parseURIRelaxed url == Nothing = giveup "invalid feed url"
        | otherwise = do
                showOutput
                uo <- Url.getUrlOptions
@@ -336,7 +336,7 @@ noneValue = "none"
  - Throws an error if the feed is broken, otherwise shows a warning. -}
 feedProblem :: URLString -> String -> Annex ()
 feedProblem url message = ifM (checkFeedBroken url)
-       ( error $ message ++ " (having repeated problems with feed: " ++ url ++ ")"
+       ( giveup $ message ++ " (having repeated problems with feed: " ++ url ++ ")"
        , warning $ "warning: " ++ message
        )
 
index 74841a5f63392059f8fd566943c745994f68a40d..f12f9e59e72dcfe7fd90f7a13cc782b9ce83aaa0 100644 (file)
@@ -33,9 +33,9 @@ start :: CommandStart
 start = ifM isDirect
        ( do
                unlessM (coreSymlinks <$> Annex.getGitConfig) $
-                       error "Git is configured to not use symlinks, so you must use direct mode."
+                       giveup "Git is configured to not use symlinks, so you must use direct mode."
                whenM probeCrippledFileSystem $
-                       error "This repository seems to be on a crippled filesystem, you must use direct mode."
+                       giveup "This repository seems to be on a crippled filesystem, you must use direct mode."
                next perform
        , stop
        )
index 05717bc609b3a92049e764a41430c2ca164083e9..e5d7a90390b9705c0eb388a49fad7f18954deccf 100644 (file)
@@ -26,16 +26,16 @@ seek :: CmdParams -> CommandSeek
 seek = withWords start
 
 start :: [String] -> CommandStart
-start [] = error "Specify a name for the remote."
+start [] = giveup "Specify a name for the remote."
 start (name:ws) = ifM (isJust <$> findExisting name)
-       ( error $ "There is already a special remote named \"" ++ name ++
+       ( giveup $ "There is already a special remote named \"" ++ name ++
                "\". (Use enableremote to enable an existing special remote.)"
        , do
                ifM (isJust <$> Remote.byNameOnly name)
-                       ( error $ "There is already a remote named \"" ++ name ++ "\""
+                       ( giveup $ "There is already a remote named \"" ++ name ++ "\""
                        , do
                                let c = newConfig name
-                               t <- either error return (findType config)
+                               t <- either giveup return (findType config)
 
                                showStart "initremote" name
                                next $ perform t name $ M.union config c
index 68360705cce47b2b15fa6d1189815f62699bb1fe..a3fc251172f0878e087073725f8d2e020fada344 100644 (file)
@@ -79,7 +79,7 @@ performNew file key = do
                unlessM (sameInodeCache obj (maybeToList mfc)) $ do
                        modifyContent obj $ replaceFile obj $ \tmp -> do
                                unlessM (checkedCopyFile key obj tmp Nothing) $
-                                       error "unable to lock file"
+                                       giveup "unable to lock file"
                        Database.Keys.storeInodeCaches key [obj]
 
        -- Try to repopulate obj from an unmodified associated file.
@@ -115,4 +115,4 @@ performOld file = do
        next $ return True
 
 errorModified :: a
-errorModified =  error "Locking this file would discard any changes you have made to it. Use 'git annex add' to stage your changes. (Or, use --force to override)"
+errorModified =  giveup "Locking this file would discard any changes you have made to it. Use 'git annex add' to stage your changes. (Or, use --force to override)"
index de697c0901f9ef63bb34c12dd5fc9bb85c56092a..35342c529b09f5d780da32ccd2637d800f6d8ae2 100644 (file)
@@ -32,7 +32,7 @@ start [ks] = do
                then exitSuccess
                else exitFailure
   where
-       k = fromMaybe (error "bad key") (file2key ks)
+       k = fromMaybe (giveup "bad key") (file2key ks)
        locksuccess = ifM (inAnnex k)
                ( liftIO $ do
                        putStrLn contentLockedMarker
@@ -41,4 +41,4 @@ start [ks] = do
                        return True
                , return False
                )
-start _ = error "Specify exactly 1 key."
+start _ = giveup "Specify exactly 1 key."
index 3806d8fdf7dff194f3a4bb219ebd1ae2582a0eb7..357bcf1f3e51398daa5341af6885cfc3986d377b 100644 (file)
@@ -93,7 +93,7 @@ seek o = do
        case (logFiles o, allOption o) of
                (fs, False) -> withFilesInGit (whenAnnexed $ start o outputter) fs
                ([], True) -> commandAction (startAll o outputter)
-               (_, True) -> error "Cannot specify both files and --all"
+               (_, True) -> giveup "Cannot specify both files and --all"
 
 start :: LogOptions -> (FilePath -> Outputter) -> FilePath -> Key -> CommandStart
 start o outputter file key = do
index 6e64207c83fc7f014120e1f727e631e7c6b46df4..04d859e4cf25163c0e3d4fc3ca4b934b8b1865f1 100644 (file)
@@ -81,7 +81,7 @@ seek o = do
                Batch -> withMessageState $ \s -> case outputType s of
                        JSONOutput _ -> batchInput parseJSONInput $
                                commandAction . startBatch now
-                       _ -> error "--batch is currently only supported in --json mode"
+                       _ -> giveup "--batch is currently only supported in --json mode"
 
 start :: POSIXTime -> MetaDataOptions -> FilePath -> Key -> CommandStart
 start now o file k = startKeys now o k (mkActionItem afile)
@@ -156,7 +156,7 @@ startBatch now (i, (MetaData m)) = case i of
                mk <- lookupFile f
                case mk of
                        Just k -> go k (mkActionItem (Just f))
-                       Nothing -> error $ "not an annexed file: " ++ f
+                       Nothing -> giveup $ "not an annexed file: " ++ f
        Right k -> go k (mkActionItem k)
   where
        go k ai = do
index 9c43c6f1db3e522352f04dea43c796eec41831cf..d74eea90036a5a274c158470e2ada0c7f07b7f9d 100644 (file)
@@ -197,4 +197,4 @@ fromPerform src move key afile = ifM (inAnnex key)
                        ]
                ok <- Remote.removeKey src key
                next $ Command.Drop.cleanupRemote key src ok
-       faileddropremote = error "Unable to drop from remote."
+       faileddropremote = giveup "Unable to drop from remote."
index 0a9c4404b4bd9efe30ab4a990c448a53a3cddde0..005a0d16afa586aee16f3564724b1dd906bde653 100644 (file)
@@ -23,15 +23,15 @@ seek = withWords start
 start :: [String] -> CommandStart
 start [] = startGet
 start [s] = case readish s of
-       Nothing -> error $ "Bad number: " ++ s
+       Nothing -> giveup $ "Bad number: " ++ s
        Just n
                | n > 0 -> startSet n
                | n == 0 -> ifM (Annex.getState Annex.force)
                        ( startSet n
-                       , error "Setting numcopies to 0 is very unsafe. You will lose data! If you really want to do that, specify --force."
+                       , giveup "Setting numcopies to 0 is very unsafe. You will lose data! If you really want to do that, specify --force."
                        )
-               | otherwise -> error "Number cannot be negative!"
-start _ = error "Specify a single number."
+               | otherwise -> giveup "Number cannot be negative!"
+start _ = giveup "Specify a single number."
 
 startGet :: CommandStart
 startGet = next $ next $ do
index f55318475c908b7f5108c2628cf17c573509a5bf..1ff2227d83aa21a788db54fcd1968affa5b3603d 100644 (file)
@@ -46,7 +46,7 @@ seek ps = lockPreCommitHook $ ifM isDirect
                        ( do
                                (fs, cleanup) <- inRepo $ Git.typeChangedStaged ps
                                whenM (anyM isOldUnlocked fs) $
-                                       error "Cannot make a partial commit with unlocked annexed files. You should `git annex add` the files you want to commit, and then run git commit."
+                                       giveup "Cannot make a partial commit with unlocked annexed files. You should `git annex add` the files you want to commit, and then run git commit."
                                void $ liftIO cleanup
                        , do
                                -- fix symlinks to files being committed
index f1f7f194f64134309a7dfcef88d47474292fe293..dba0300b8c28498e922a3a961201250a6713fb8a 100644 (file)
@@ -30,7 +30,7 @@ seek :: CmdParams -> CommandSeek
 seek = withWords start
 
 start :: [String] -> CommandStart
-start [] = error "Did not specify command to run."
+start [] = giveup "Did not specify command to run."
 start (c:ps) = liftIO . exitWith =<< ifM isDirect
        ( do
                tmp <- gitAnnexTmpMiscDir <$> gitRepo
index 4d203953077be97d3f96aa08ee74b42c789b83fb..51f9f6fe1579ae9150df773852bbcdd2cb1544ee 100644 (file)
@@ -33,7 +33,7 @@ seek = withPairs start
 start :: (FilePath, String) -> CommandStart
 start (file, keyname) = ifAnnexed file go stop
   where
-       newkey = fromMaybe (error "bad key") $ file2key keyname
+       newkey = fromMaybe (giveup "bad key") $ file2key keyname
        go oldkey
                | oldkey == newkey = stop
                | otherwise = do
@@ -46,7 +46,7 @@ perform file oldkey newkey = do
                ( unlessM (linkKey file oldkey newkey) $
                        error "failed"
                , unlessM (Annex.getState Annex.force) $
-                       error $ file ++ " is not available (use --force to override)"
+                       giveup $ file ++ " is not available (use --force to override)"
                )
        next $ cleanup file oldkey newkey
 
index 1eba2cc122cf2ab8b015ed9d846d8acbed981a4a..f73e22af40b0d92377c936033840dbe163a27144 100644 (file)
@@ -27,5 +27,5 @@ start (ks:us:[]) = do
                then liftIO exitSuccess
                else liftIO exitFailure
   where
-       k = fromMaybe (error "bad key") (file2key ks)
-start _ = error "Wrong number of parameters"
+       k = fromMaybe (giveup "bad key") (file2key ks)
+start _ = giveup "Wrong number of parameters"
index 273d111b0c3588c3991bcf2f253c0400558fcfa0..28dd2d8c5a56c3fb6cf99c77919debb7d1a2f8f0 100644 (file)
@@ -32,7 +32,7 @@ start (keyname:url:[]) = do
 start [] = do
        showStart "registerurl" "stdin"
        next massAdd
-start _ = error "specify a key and an url"
+start _ = giveup "specify a key and an url"
 
 massAdd :: CommandPerform
 massAdd = go True =<< map (separate (== ' ')) . lines <$> liftIO getContents
@@ -43,7 +43,7 @@ massAdd = go True =<< map (separate (== ' ')) . lines <$> liftIO getContents
                ok <- perform' key u
                let !status' = status && ok
                go status' rest
-       go _ _ = error "Expected pairs of key and url on stdin, but got something else."
+       go _ _ = giveup "Expected pairs of key and url on stdin, but got something else."
 
 perform :: Key -> URLString -> CommandPerform
 perform key url = do
index fa2459e22d6c5b3e834de8954efcda10cb7c3b3c..97aa602e7bd9de9479877ad7154b31982dae12d3 100644 (file)
@@ -47,7 +47,7 @@ startSrcDest (src:dest:[])
                next $ ifAnnexed dest
                        (\key -> perform src key (verifyKeyContent DefaultVerify UnVerified key src))
                        stop
-startSrcDest _ = error "specify a src file and a dest file"
+startSrcDest _ = giveup "specify a src file and a dest file"
 
 startKnown :: FilePath -> CommandStart
 startKnown src = notAnnexed src $ do
@@ -63,7 +63,8 @@ startKnown src = notAnnexed src $ do
                        )
 
 notAnnexed :: FilePath -> CommandStart -> CommandStart
-notAnnexed src = ifAnnexed src (error $ "cannot used annexed file as src: " ++ src)
+notAnnexed src = ifAnnexed src $
+       giveup $ "cannot used annexed file as src: " ++ src
 
 perform :: FilePath -> Key -> Annex Bool -> CommandPerform
 perform src key verify = ifM move
index 8742a1104f2c972a9046ebdc7c0c4d1a6841c0f3..0ba6efb3629191fef101112f0857b60b1147938e 100644 (file)
@@ -33,8 +33,8 @@ start = do
                ( do
                        void $ commitResolvedMerge Git.Branch.ManualCommit
                        next $ next $ return True
-               , error "Merge conflict could not be automatically resolved."
+               , giveup "Merge conflict could not be automatically resolved."
                )
   where
-       nobranch = error "No branch is currently checked out."
-       nomergehead = error "No SHA found in .git/merge_head"
+       nobranch = giveup "No branch is currently checked out."
+       nomergehead = giveup "No SHA found in .git/merge_head"
index 5721e98e76789f68c2dc70e8dca69928dcee7dc0..5cc8b37bf540c3606480fa5d10d7ac6f19b6ffd7 100644 (file)
@@ -31,7 +31,7 @@ start = parse
        parse (name:expr:[]) = go name $ \uuid -> do
                showStart "schedile" name
                performSet expr uuid
-       parse _ = error "Specify a repository."
+       parse _ = giveup "Specify a repository."
 
        go name a = do
                u <- Remote.nameToUUID name
@@ -47,7 +47,7 @@ performGet uuid = do
 
 performSet :: String -> UUID -> CommandPerform
 performSet expr uuid = case parseScheduledActivities expr of
-       Left e -> error $ "Parse error: " ++ e
+       Left e -> giveup $ "Parse error: " ++ e
        Right l -> do
                scheduleSet uuid l
                next $ return True
index fd7a4ab887fac968b86ac3b22098ac34ea7cd5c2..090edee0bafc622cb367fc7ad19b12eb39ae1778 100644 (file)
@@ -23,10 +23,10 @@ start :: [String] -> CommandStart
 start (keyname:file:[]) = do
        showStart "setkey" file
        next $ perform file (mkKey keyname)
-start _ = error "specify a key and a content file"
+start _ = giveup "specify a key and a content file"
 
 mkKey :: String -> Key
-mkKey = fromMaybe (error "bad key") . file2key
+mkKey = fromMaybe (giveup "bad key") . file2key
 
 perform :: FilePath -> Key -> CommandPerform
 perform file key = do
index 20c96ae3653ff3e88776aeeb1e4675a4184451a5..da2a6fa3d9375b3757e6d8492e83a3708f2a2bae 100644 (file)
@@ -26,9 +26,9 @@ start (ks:us:vs:[]) = do
        showStart' "setpresentkey" k (mkActionItem k)
        next $ perform k (toUUID us) s
   where
-       k = fromMaybe (error "bad key") (file2key ks)
-       s = fromMaybe (error "bad value") (parseStatus vs)
-start _ = error "Wrong number of parameters"
+       k = fromMaybe (giveup "bad key") (file2key ks)
+       s = fromMaybe (giveup "bad value") (parseStatus vs)
+start _ = giveup "Wrong number of parameters"
 
 perform :: Key -> UUID -> LogStatus -> CommandPerform
 perform k u s = next $ do
index fb80c3e74b90e3fe52b6b0ed2bc37bf139c2277d..acc5fbbc949a4b1d0ef4926c56b7a2f7f60a05e7 100644 (file)
@@ -292,7 +292,7 @@ updateSyncBranch (Just branch, madj) = do
 
 updateBranch :: Git.Branch -> Git.Branch -> Git.Repo -> IO ()
 updateBranch syncbranch updateto g = 
-       unlessM go $ error $ "failed to update " ++ Git.fromRef syncbranch
+       unlessM go $ giveup $ "failed to update " ++ Git.fromRef syncbranch
   where
        go = Git.Command.runBool
                [ Param "branch"
index 40d02c166c019ef71d877f487c123681ac2b9e86..4c0ff9e3c86362bb74dae657f7c2a5a287e220fb 100644 (file)
@@ -57,7 +57,7 @@ seek o = commandAction $ start (fromInteger $ sizeOption o) (testRemote o)
 start :: Int -> RemoteName -> CommandStart
 start basesz name = do
        showStart "testremote" name
-       r <- either error id <$> Remote.byName' name
+       r <- either giveup id <$> Remote.byName' name
        showAction "generating test keys"
        fast <- Annex.getState Annex.fast
        ks <- mapM randKey (keySizes basesz fast)
index 21b7830c316b4275962536791e9cd3679669d58b..6870c84f013f90655b0d39132a9242ba585f14de 100644 (file)
@@ -59,7 +59,7 @@ start (k:[]) = do
                                , exitSuccess
                                ]
        stop
-start _ = error "wrong number of parameters"
+start _ = giveup "wrong number of parameters"
 
 readUpdate :: IO (Maybe Integer)
 readUpdate = readish <$> getLine
index 4e83fd420924f3e7587270792466a06b79b2b3be..e744b51a8636a057df76c8a4e20b92b1c05ad1bf 100644 (file)
@@ -45,7 +45,7 @@ wrapUnannex a = ifM (versionSupportsUnlockedPointers <||> isDirect)
         -}
        , ifM cleanindex
                ( lockPreCommitHook $ commit `after` a
-               , error "Cannot proceed with uncommitted changes staged in the index. Recommend you: git commit"
+               , giveup "Cannot proceed with uncommitted changes staged in the index. Recommend you: git commit"
                )
        )
   where
index 24c099f92cf7430d862b66318a9ae97367e6a434..c366453a3d3157eb6adc97fece608b69f4eadb2b 100644 (file)
@@ -32,7 +32,7 @@ seek ps = do
        -- in the index.
        (fs, cleanup) <- inRepo $ LsFiles.notInRepo False ps
        unless (null fs) $
-               error $ "Cannot undo changes to files that are not checked into git: " ++ unwords fs
+               giveup $ "Cannot undo changes to files that are not checked into git: " ++ unwords fs
        void $ liftIO $ cleanup
 
        -- Committing staged changes before undo allows later
index 5f84a375f0a51ddacde276eefdd8f4d0f85fb8fa..ddcdba466789012ff547e47a253b344b824a7a61 100644 (file)
@@ -26,7 +26,7 @@ start (name:g:[]) = do
        showStart "ungroup" name
        u <- Remote.nameToUUID name
        next $ perform u g
-start _ = error "Specify a repository and a group."
+start _ = giveup "Specify a repository and a group."
 
 perform :: UUID -> Group -> CommandPerform
 perform uuid g = do
index fa7e130137670003b20718241dfeddb08cac9419..d8c7d1295a8da357deaa47466de11584a2f867f3 100644 (file)
@@ -30,12 +30,12 @@ cmd = addCheck check $
 check :: Annex ()
 check = do
        b <- current_branch
-       when (b == Annex.Branch.name) $ error $
+       when (b == Annex.Branch.name) $ giveup $
                "cannot uninit when the " ++ Git.fromRef b ++ " branch is checked out"
        top <- fromRepo Git.repoPath
        currdir <- liftIO getCurrentDirectory
        whenM ((/=) <$> liftIO (absPath top) <*> liftIO (absPath currdir)) $
-               error "can only run uninit from the top of the git repository"
+               giveup "can only run uninit from the top of the git repository"
   where
        current_branch = Git.Ref . Prelude.head . lines <$> revhead
        revhead = inRepo $ Git.Command.pipeReadStrict
@@ -51,7 +51,7 @@ seek ps = do
 {- git annex symlinks that are not checked into git could be left by an
  - interrupted add. -}
 startCheckIncomplete :: FilePath -> Key -> CommandStart
-startCheckIncomplete file _ = error $ unlines
+startCheckIncomplete file _ = giveup $ unlines
        [ file ++ " points to annexed content, but is not checked into git."
        , "Perhaps this was left behind by an interrupted git annex add?"
        , "Not continuing with uninit; either delete or git annex add the file and retry."
@@ -65,7 +65,7 @@ finish = do
        prepareRemoveAnnexDir annexdir
        if null leftovers
                then liftIO $ removeDirectoryRecursive annexdir
-               else error $ unlines
+               else giveup $ unlines
                        [ "Not fully uninitialized"
                        , "Some annexed data is still left in " ++ annexobjectdir
                        , "This may include deleted files, or old versions of modified files."
index c116cdc0e1e4bb607abc2cfb4b463391a6b9f95f..1711fe047c71d0cf091952a3a7e61b15074b68db 100644 (file)
@@ -320,7 +320,7 @@ unusedSpec m spec
        range (a, b) = case (readish a, readish b) of
                (Just x, Just y) -> [x..y]
                _ -> badspec
-       badspec = error $ "Expected number or range, not \"" ++ spec ++ "\""
+       badspec = giveup $ "Expected number or range, not \"" ++ spec ++ "\""
 
 {- Seek action for unused content. Finds the number in the maps, and
  - calls one of 3 actions, depending on the type of unused file. -}
@@ -335,7 +335,7 @@ startUnused message unused badunused tmpunused maps n = search
        , (unusedTmpMap maps, tmpunused)
        ]
   where
-       search [] = error $ show n ++ " not valid (run git annex unused for list)"
+       search [] = giveup $ show n ++ " not valid (run git annex unused for list)"
        search ((m, a):rest) =
                case M.lookup n m of
                        Nothing -> search rest
index a4b3f379f288c799d6b00a28b1ca3157280b0a80..c94ce572290a77d6c1c48c535a30a0f7c02d525a 100644 (file)
@@ -33,6 +33,6 @@ start params = do
                                next $ next $ return True
                        Narrowing -> next $ next $ do
                                if visibleViewSize view' == visibleViewSize view
-                                       then error "That would not add an additional level of directory structure to the view. To filter the view, use vfilter instead of vadd."
+                                       then giveup "That would not add an additional level of directory structure to the view. To filter the view, use vfilter instead of vadd."
                                        else checkoutViewBranch view' narrowView
-                       Widening -> error "Widening view to match more files is not currently supported."
+                       Widening -> giveup "Widening view to match more files is not currently supported."
index 20fc9a22a62fe098431f87924e191f673b935ca7..28326e16fa97ee21465d3b813287e839b151425f 100644 (file)
@@ -25,7 +25,7 @@ seek = withNothing start
 start ::CommandStart
 start = go =<< currentView
   where
-       go Nothing = error "Not in a view."
+       go Nothing = giveup "Not in a view."
        go (Just v) = do
                showStart "vcycle" ""
                let v' = v { viewComponents = vcycle [] (viewComponents v) }
index 60bbcd3d3ffffad7914b04d55bae0105e979f034..130e2550cb938751634f1206d5c070831bdb580e 100644 (file)
@@ -26,5 +26,5 @@ start params = do
                let view' = filterView view $
                        map parseViewParam $ reverse params
                next $ next $ if visibleViewSize view' > visibleViewSize view
-                       then error "That would add an additional level of directory structure to the view, rather than filtering it. If you want to do that, use vadd instead of vfilter."
+                       then giveup "That would add an additional level of directory structure to the view, rather than filtering it. If you want to do that, use vadd instead of vfilter."
                        else checkoutViewBranch view' narrowView
index 8490567dc61ce24db55a2badf4d1132267d2806f..58411001befccccc294cb2ca93edefa80d5eb3f0 100644 (file)
@@ -26,7 +26,7 @@ seek = withWords start
 start :: [String] -> CommandStart
 start ps = go =<< currentView
   where
-       go Nothing = error "Not in a view."
+       go Nothing = giveup "Not in a view."
        go (Just v) = do
                showStart "vpop" (show num)
                removeView v
index d7963725a90d345f2434f375ebff89412b1d4aff..64daa598b729fae8c4565d8f751669e01f5d918a 100644 (file)
@@ -50,7 +50,7 @@ vicfg curcfg f = do
        vi <- liftIO $ catchDefaultIO "vi" $ getEnv "EDITOR"
        -- Allow EDITOR to be processed by the shell, so it can contain options.
        unlessM (liftIO $ boolSystem "sh" [Param "-c", Param $ unwords [vi, shellEscape f]]) $
-               error $ vi ++ " exited nonzero; aborting"
+               giveup $ vi ++ " exited nonzero; aborting"
        r <- parseCfg (defCfg curcfg) <$> liftIO (readFileStrictAnyEncoding f)
        liftIO $ nukeFile f
        case r of
index 65985fdac93a31dd2ac76c51673cc8fb3829287d..513e6d10c07f0a1c50b7712e37908dadbb1b6d45 100644 (file)
@@ -25,7 +25,7 @@ seek :: CmdParams -> CommandSeek
 seek = withWords start
 
 start :: [String] -> CommandStart
-start [] = error "Specify metadata to include in view"
+start [] = giveup "Specify metadata to include in view"
 start ps = do
        showStart "view" ""
        view <- mkView ps
@@ -34,7 +34,7 @@ start ps = do
        go view Nothing = next $ perform view
        go view (Just v)
                | v == view = stop
-               | otherwise = error "Already in a view. Use the vfilter and vadd commands to further refine this view."
+               | otherwise = giveup "Already in a view. Use the vfilter and vadd commands to further refine this view."
 
 perform :: View -> CommandPerform
 perform view = do
@@ -47,7 +47,7 @@ paramView = paramRepeating "FIELD=VALUE"
 mkView :: [String] -> Annex View
 mkView ps = go =<< inRepo Git.Branch.current
   where
-       go Nothing = error "not on any branch!"
+       go Nothing = giveup "not on any branch!"
        go (Just b) = return $ fst $ refineView (View b []) $
                map parseViewParam $ reverse ps
 
index dca92a7b425770a0ce70d4bf1acc3ad759ce8ae7..8fd369df6a3ef88f466db6db0c4ae6f173f4c991 100644 (file)
@@ -37,7 +37,7 @@ cmd' name desc getter setter = command name SectionSetup desc pdesc (withParams
        start (rname:expr:[]) = go rname $ \uuid -> do
                showStart name rname
                performSet setter expr uuid
-       start _ = error "Specify a repository."
+       start _ = giveup "Specify a repository."
                
        go rname a = do
                u <- Remote.nameToUUID rname
@@ -52,7 +52,7 @@ performGet getter a = do
 
 performSet :: (a -> PreferredContentExpression -> Annex ()) -> String -> a -> CommandPerform
 performSet setter expr a = case checkPreferredContentExpression expr of
-       Just e -> error $ "Parse error: " ++ e
+       Just e -> giveup $ "Parse error: " ++ e
        Nothing -> do
                setter a expr
                next $ return True
index 4dff8c9d1634855a43dbeb934e435495c3639054..d9c001b22611ad9d052ab1f3626a5906f392457c 100644 (file)
@@ -77,7 +77,7 @@ start' allowauto o = do
                        else annexListen <$> Annex.getGitConfig
                ifM (checkpid <&&> checkshim f)
                        ( if isJust (listenAddress o)
-                               then error "The assistant is already running, so --listen cannot be used."
+                               then giveup "The assistant is already running, so --listen cannot be used."
                                else do
                                        url <- liftIO . readFile
                                                =<< fromRepo gitAnnexUrlFile
@@ -125,7 +125,7 @@ startNoRepo o = go =<< liftIO (filterM doesDirectoryExist =<< readAutoStartFile)
                                go ds
                        Right state -> void $ Annex.eval state $ do
                                whenM (fromRepo Git.repoIsLocalBare) $
-                                       error $ d ++ " is a bare git repository, cannot run the webapp in it"
+                                       giveup $ d ++ " is a bare git repository, cannot run the webapp in it"
                                callCommandAction $
                                        start' False o
 
index 8f8b4c115891a74bf30e4d6f8b712f5f9237b4d2..b18d912e9ebcfeb2b131232130be53eb632dd84f 100644 (file)
@@ -80,4 +80,4 @@ readProgramFile = do
 cannotFindProgram :: IO a
 cannotFindProgram = do
        f <- programFile
-       error $ "cannot find git-annex program in PATH or in the location listed in " ++ f
+       giveup $ "cannot find git-annex program in PATH or in the location listed in " ++ f
index e818317c78bb8c830527da062ef7fddf5cf3f795..6be9b339161bbabe6fd77bc28ac0a492be252b09 100644 (file)
--- a/Creds.hs
+++ b/Creds.hs
@@ -105,7 +105,7 @@ getRemoteCredPair c gc storage = maybe fromcache (return . Just) =<< fromenv
                                -- Not a problem for shared cipher.
                                case storablecipher of
                                        SharedCipher {} -> showLongNote "gpg error above was caused by an old git-annex bug in credentials storage. Working around it.."
-                                       _ -> error "*** Insecure credentials storage detected for this remote! See https://git-annex.branchable.com/upgrades/insecure_embedded_creds/"
+                                       _ -> giveup "*** Insecure credentials storage detected for this remote! See https://git-annex.branchable.com/upgrades/insecure_embedded_creds/"
                                fromcreds $ fromB64 enccreds
        fromcreds creds = case decodeCredPair creds of
                Just credpair -> do
index f3d6f5e5a925f6f4c535835043cd14b3ada9e144..d3cbfa2f7fb75475da04a0b4ba6dc3716daaf666 100644 (file)
--- a/Crypto.hs
+++ b/Crypto.hs
@@ -100,7 +100,7 @@ genSharedPubKeyCipher cmd keyid highQuality = do
  -
  - When the Cipher is encrypted, re-encrypts it. -}
 updateCipherKeyIds :: LensGpgEncParams encparams => Gpg.GpgCmd -> encparams -> [(Bool, Gpg.KeyId)] -> StorableCipher -> IO StorableCipher
-updateCipherKeyIds _ _ _ SharedCipher{} = error "Cannot update shared cipher"
+updateCipherKeyIds _ _ _ SharedCipher{} = giveup "Cannot update shared cipher"
 updateCipherKeyIds _ _ [] c = return c
 updateCipherKeyIds cmd encparams changes encipher@(EncryptedCipher _ variant ks) = do
        ks' <- updateCipherKeyIds' cmd changes ks
@@ -113,11 +113,11 @@ updateCipherKeyIds' :: Gpg.GpgCmd -> [(Bool, Gpg.KeyId)] -> KeyIds -> IO KeyIds
 updateCipherKeyIds' cmd changes (KeyIds ks) = do
        dropkeys <- listKeyIds [ k | (False, k) <- changes ]
        forM_ dropkeys $ \k -> unless (k `elem` ks) $
-               error $ "Key " ++ k ++ " was not present; cannot remove."
+               giveup $ "Key " ++ k ++ " was not present; cannot remove."
        addkeys <- listKeyIds [ k | (True, k) <- changes ]
        let ks' = (addkeys ++ ks) \\ dropkeys
        when (null ks') $
-               error "Cannot remove the last key."
+               giveup "Cannot remove the last key."
        return $ KeyIds ks'
   where
        listKeyIds = concat <$$> mapM (keyIds <$$> Gpg.findPubKeys cmd)
index 4521bb34631e863ec07d5c97058e183ee2b905ab..9eabc6983ef47b3bc517837b8581554f2ae2caac 100644 (file)
@@ -25,7 +25,7 @@ toSKey :: Key -> SKey
 toSKey = SKey . key2file
 
 fromSKey :: SKey -> Key
-fromSKey (SKey s) = fromMaybe (error $ "bad serialied Key " ++ s) (file2key s)
+fromSKey (SKey s) = fromMaybe (error $ "bad serialized Key " ++ s) (file2key s)
 
 derivePersistField "SKey"
 
@@ -43,7 +43,7 @@ toIKey :: Key -> IKey
 toIKey = IKey . key2file
 
 fromIKey :: IKey -> Key
-fromIKey (IKey s) = fromMaybe (error $ "bad serialied Key " ++ s) (file2key s)
+fromIKey (IKey s) = fromMaybe (error $ "bad serialized Key " ++ s) (file2key s)
 
 derivePersistField "IKey"
 
index 7a9d788511ef987aa47f4ae90b36c95fdecc59ce..ae7cc91a87cd5b053eae7b1ef302a9244d04dc65 100644 (file)
@@ -50,7 +50,7 @@ prepare input showmatch matches r =
                        | otherwise -> sleep n
                Nothing -> list
   where
-       list = error $ unlines $
+       list = giveup $ unlines $
                [ "Unknown command '" ++ input ++ "'"
                , ""
                , "Did you mean one of these?"
index dab4ad21bf8d03f8c3485c564ad9ca7799c96ac4..69a679ee36c02bc8b684d4fd752a0643c6ea496d 100644 (file)
@@ -52,7 +52,7 @@ get = do
                curr <- getCurrentDirectory
                Git.Config.read $ newFrom $
                        Local { gitdir = absd, worktree = Just curr }
-       configure Nothing Nothing = error "Not in a git repository."
+       configure Nothing Nothing = giveup "Not in a git repository."
 
        addworktree w r = changelocation r $
                Local { gitdir = gitdir (location r), worktree = w }
index 2a2f7dfe1536860ad16b6c15c761a7a32432b243..e61b763588d55bf615d5fb1016a247287eac2c4f 100644 (file)
@@ -46,7 +46,7 @@ encryptedRemote baserepo = go
                u = show url
                plen = length urlPrefix
        go _ = notencrypted
-       notencrypted = error "not a gcrypt encrypted repository"
+       notencrypted = giveup "not a gcrypt encrypted repository"
 
 data ProbeResult = Decryptable | NotDecryptable | NotEncrypted
 
index 4bd5dd59e32438b3f6969a2948543785981080fd..efe4fea85b7ba344679c17f8a27ce3f1fe5179bd 100644 (file)
--- a/Limit.hs
+++ b/Limit.hs
@@ -73,7 +73,7 @@ addToken = add . Utility.Matcher.token
 
 {- Adds a new limit. -}
 addLimit :: Either String (MatchFiles Annex) -> Annex ()
-addLimit = either error (\l -> add $ Utility.Matcher.Operation $ l S.empty)
+addLimit = either giveup (\l -> add $ Utility.Matcher.Operation $ l S.empty)
 
 {- Add a limit to skip files that do not match the glob. -}
 addInclude :: String -> Annex ()
@@ -289,7 +289,7 @@ limitMetaData s = case parseMetaDataMatcher s of
 
 addTimeLimit :: String -> Annex ()
 addTimeLimit s = do
-       let seconds = maybe (error "bad time-limit") durationToPOSIXTime $
+       let seconds = maybe (giveup "bad time-limit") durationToPOSIXTime $
                parseDuration s
        start <- liftIO getPOSIXTime
        let cutoff = start + seconds
index 07667c407497e424a8ad7ba9b8869df60f3de02b..04f9824b16735a853ad00e8a3ddf69ad2665331e 100644 (file)
@@ -60,7 +60,7 @@ parseTransitions = check . map parseTransitionLine . splitLines
 parseTransitionsStrictly :: String -> String -> Transitions
 parseTransitionsStrictly source = fromMaybe badsource . parseTransitions
   where
-       badsource = error $ "unknown transitions listed in " ++ source ++ "; upgrade git-annex!"
+       badsource = giveup $ "unknown transitions listed in " ++ source ++ "; upgrade git-annex!"
 
 showTransitionLine :: TransitionLine -> String
 showTransitionLine (TransitionLine ts t) = unwords [show t, show ts]
index 10c526e1e437f936a7a61a61c624010b26128859..bcd91b7034bd9d8fff81db3b98757ea0e7a0cd0f 100644 (file)
--- a/Remote.hs
+++ b/Remote.hs
@@ -112,7 +112,7 @@ byUUID u = headMaybe . filter matching <$> remoteList
  -}
 byName :: Maybe RemoteName -> Annex (Maybe Remote)
 byName Nothing = return Nothing
-byName (Just n) = either error Just <$> byName' n
+byName (Just n) = either giveup Just <$> byName' n
 
 {- Like byName, but the remote must have a configured UUID. -}
 byNameWithUUID :: Maybe RemoteName -> Annex (Maybe Remote)
@@ -120,7 +120,7 @@ byNameWithUUID = checkuuid <=< byName
   where
        checkuuid Nothing = return Nothing
        checkuuid (Just r)
-               | uuid r == NoUUID = error $
+               | uuid r == NoUUID = giveup $
                        if remoteAnnexIgnore (gitconfig r)
                                then noRemoteUUIDMsg r ++
                                        " (" ++ show (remoteConfig (repo r) "ignore") ++
@@ -156,7 +156,7 @@ noRemoteUUIDMsg r = "cannot determine uuid for " ++ name r ++ " (perhaps you nee
  - and returns its UUID. Finds even repositories that are not
  - configured in .git/config. -}
 nameToUUID :: RemoteName -> Annex UUID
-nameToUUID = either error return <=< nameToUUID'
+nameToUUID = either giveup return <=< nameToUUID'
 
 nameToUUID' :: RemoteName -> Annex (Either String UUID)
 nameToUUID' "." = Right <$> getUUID -- special case for current repo
index a0ccf99df29316aab1b4cd38d7131c7cfe0993a1..899c57e3eb581679d1224d3ad21c359babc3384d 100644 (file)
@@ -111,7 +111,7 @@ dropKey k = do
  - implemented, it tells us nothing about the later state of the torrent.
  -}
 checkKey :: Key -> Annex Bool
-checkKey = error "cannot reliably check torrent status"
+checkKey = giveup "cannot reliably check torrent status"
 
 getBitTorrentUrls :: Key -> Annex [URLString]
 getBitTorrentUrls key = filter supported <$> getUrls key
@@ -138,7 +138,7 @@ checkTorrentUrl u = do
        registerTorrentCleanup u
        ifM (downloadTorrentFile u)
                ( torrentContents u
-               , error "could not download torrent file"
+               , giveup "could not download torrent file"
                )
 
 {- To specify which file inside a multi-url torrent, the file number is
@@ -268,13 +268,13 @@ downloadTorrentContent k u dest filenum p = do
                fs <- liftIO $ map fst <$> torrentFileSizes torrent
                if length fs >= filenum
                        then return (fs !! (filenum - 1))
-                       else error "Number of files in torrent seems to have changed."
+                       else giveup "Number of files in torrent seems to have changed."
 
 checkDependencies :: Annex ()
 checkDependencies = do
        missing <- liftIO $ filterM (not <$$> inPath) deps
        unless (null missing) $
-               error $ "need to install additional software in order to download from bittorrent: " ++ unwords missing
+               giveup $ "need to install additional software in order to download from bittorrent: " ++ unwords missing
   where
        deps =
                [ "aria2c"
@@ -343,7 +343,7 @@ torrentFileSizes torrent = do
        let mkfile = joinPath . map (scrub . decodeBS)
        b <- B.readFile torrent
        return $ case readTorrent b of
-               Left e -> error $ "failed to parse torrent: " ++ e
+               Left e -> giveup $ "failed to parse torrent: " ++ e
                Right t -> case tInfo t of
                        SingleFile { tLength = l, tName = f } ->
                                [ (mkfile [f], l) ]
@@ -366,7 +366,7 @@ torrentFileSizes torrent = do
                                _ -> parsefailed (show v)
   where
        getfield = btshowmetainfo torrent
-       parsefailed s = error $ "failed to parse btshowmetainfo output for torrent file: " ++ show s
+       parsefailed s = giveup $ "failed to parse btshowmetainfo output for torrent file: " ++ show s
 
        -- btshowmetainfo outputs a list of "filename (size)"
        splitsize d l = (scrub (d </> fn), sz)
@@ -379,7 +379,7 @@ torrentFileSizes torrent = do
 #endif
        -- a malicious torrent file might try to do directory traversal
        scrub f = if isAbsolute f || any (== "..") (splitPath f)
-               then error "found unsafe filename in torrent!"
+               then giveup "found unsafe filename in torrent!"
                else f
 
 torrentContents :: URLString -> Annex UrlContents
index 22510859c080011f7af71ffa5e1bc1d17064d29a..332e8d5dc6d4962ff0a0a95d14841fc30b8f52f7 100644 (file)
@@ -84,7 +84,7 @@ gen r u c gc = do
                (simplyPrepare $ checkKey r bupr')
                this
   where
-       buprepo = fromMaybe (error "missing buprepo") $ remoteAnnexBupRepo gc
+       buprepo = fromMaybe (giveup "missing buprepo") $ remoteAnnexBupRepo gc
        specialcfg = (specialRemoteCfg c)
                -- chunking would not improve bup
                { chunkConfig = NoChunks
@@ -95,14 +95,14 @@ bupSetup mu _ c gc = do
        u <- maybe (liftIO genUUID) return mu
 
        -- verify configuration is sane
-       let buprepo = fromMaybe (error "Specify buprepo=") $
+       let buprepo = fromMaybe (giveup "Specify buprepo=") $
                M.lookup "buprepo" c
        (c', _encsetup) <- encryptionSetup c gc
 
        -- bup init will create the repository.
        -- (If the repository already exists, bup init again appears safe.)
        showAction "bup init"
-       unlessM (bup "init" buprepo []) $ error "bup init failed"
+       unlessM (bup "init" buprepo []) $ giveup "bup init failed"
 
        storeBupUUID u buprepo
 
@@ -197,7 +197,7 @@ storeBupUUID u buprepo = do
                        showAction "storing uuid"
                        unlessM (onBupRemote r boolSystem "git"
                                [Param "config", Param "annex.uuid", Param v]) $
-                                       error "ssh failed"
+                                       giveup "ssh failed"
                else liftIO $ do
                        r' <- Git.Config.read r
                        let olduuid = Git.Config.get "annex.uuid" "" r'
@@ -251,7 +251,7 @@ bup2GitRemote r
        | bupLocal r = 
                if "/" `isPrefixOf` r
                        then Git.Construct.fromAbsPath r
-                       else error "please specify an absolute path"
+                       else giveup "please specify an absolute path"
        | otherwise = Git.Construct.fromUrl $ "ssh://" ++ host ++ slash dir
   where
        bits = split ":" r
index fded8d420004cd96cc9385f4ca20f256d2afabeb..dcb16f5ddc3c7a7062812b899812dabe3e01e672 100644 (file)
@@ -76,7 +76,7 @@ gen r u c gc = do
                , claimUrl = Nothing
                , checkUrl = Nothing
                }
-       ddarrepo = maybe (error "missing ddarrepo") (DdarRepo gc) (remoteAnnexDdarRepo gc)
+       ddarrepo = maybe (giveup "missing ddarrepo") (DdarRepo gc) (remoteAnnexDdarRepo gc)
        specialcfg = (specialRemoteCfg c)
                -- chunking would not improve ddar
                { chunkConfig = NoChunks
@@ -87,7 +87,7 @@ ddarSetup mu _ c gc = do
        u <- maybe (liftIO genUUID) return mu
 
        -- verify configuration is sane
-       let ddarrepo = fromMaybe (error "Specify ddarrepo=") $
+       let ddarrepo = fromMaybe (giveup "Specify ddarrepo=") $
                M.lookup "ddarrepo" c
        (c', _encsetup) <- encryptionSetup c gc
 
index 3b26947b63696424d97767e915fbdb128dd02bea..248e5d49f754ca21d80b11d52c9f5ee36765b53b 100644 (file)
@@ -75,17 +75,17 @@ gen r u c gc = do
                        , checkUrl = Nothing
                        }
   where
-       dir = fromMaybe (error "missing directory") $ remoteAnnexDirectory gc
+       dir = fromMaybe (giveup "missing directory") $ remoteAnnexDirectory gc
 
 directorySetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> RemoteGitConfig -> Annex (RemoteConfig, UUID)
 directorySetup mu _ c gc = do
        u <- maybe (liftIO genUUID) return mu
        -- verify configuration is sane
-       let dir = fromMaybe (error "Specify directory=") $
+       let dir = fromMaybe (giveup "Specify directory=") $
                M.lookup "directory" c
        absdir <- liftIO $ absPath dir
        liftIO $ unlessM (doesDirectoryExist absdir) $
-               error $ "Directory does not exist: " ++ absdir
+               giveup $ "Directory does not exist: " ++ absdir
        (c', _encsetup) <- encryptionSetup c gc
 
        -- The directory is stored in git config, not in this remote's
@@ -216,6 +216,6 @@ checkKey d _ k = liftIO $
                ( return True
                , ifM (doesDirectoryExist d)
                        ( return False
-                       , error $ "directory " ++ d ++ " is not accessible"
+                       , giveup $ "directory " ++ d ++ " is not accessible"
                        )
                )
index 65b05fe62422055baeebea512b39d60257219dba..0b0e1dc18b576c51cfc9c79bc97efefedaf19b02 100644 (file)
@@ -107,12 +107,12 @@ gen r u c gc
                        (simplyPrepare toremove)
                        (simplyPrepare tocheckkey)
                        rmt
-       externaltype = fromMaybe (error "missing externaltype") (remoteAnnexExternalType gc)
+       externaltype = fromMaybe (giveup "missing externaltype") (remoteAnnexExternalType gc)
 
 externalSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> RemoteGitConfig -> Annex (RemoteConfig, UUID)
 externalSetup mu _ c gc = do
        u <- maybe (liftIO genUUID) return mu
-       let externaltype = fromMaybe (error "Specify externaltype=") $
+       let externaltype = fromMaybe (giveup "Specify externaltype=") $
                M.lookup "externaltype" c
        (c', _encsetup) <- encryptionSetup c gc
 
@@ -124,7 +124,7 @@ externalSetup mu _ c gc = do
                        external <- newExternal externaltype u c' gc
                        handleRequest external INITREMOTE Nothing $ \resp -> case resp of
                                INITREMOTE_SUCCESS -> Just noop
-                               INITREMOTE_FAILURE errmsg -> Just $ error errmsg
+                               INITREMOTE_FAILURE errmsg -> Just $ giveup errmsg
                                _ -> Nothing
                        withExternalState external $
                                liftIO . atomically . readTVar . externalConfig
@@ -151,8 +151,7 @@ retrieve external = fileRetriever $ \d k p ->
                        TRANSFER_SUCCESS Download k'
                                | k == k' -> Just $ return ()
                        TRANSFER_FAILURE Download k' errmsg
-                               | k == k' -> Just $ do
-                                       error errmsg
+                               | k == k' -> Just $ giveup errmsg
                        _ -> Nothing
 
 remove :: External -> Remover
@@ -168,7 +167,7 @@ remove external k = safely $
                        _ -> Nothing
 
 checkKey :: External -> CheckPresent
-checkKey external k = either error id <$> go
+checkKey external k = either giveup id <$> go
   where
        go = handleRequest external (CHECKPRESENT k) Nothing $ \resp ->
                case resp of
@@ -284,7 +283,7 @@ handleRequest' st external req mp responsehandler
        handleRemoteRequest (VERSION _) =
                sendMessage st external (ERROR "too late to send VERSION")
 
-       handleAsyncMessage (ERROR err) = error $ "external special remote error: " ++ err
+       handleAsyncMessage (ERROR err) = giveup $ "external special remote error: " ++ err
 
        send = sendMessage st external
 
@@ -332,7 +331,7 @@ receiveMessage st external handleresponse handlerequest handleasync =
                                Nothing -> case parseMessage s :: Maybe AsyncMessage of
                                        Just msg -> maybe (protocolError True s) id (handleasync msg)
                                        Nothing -> protocolError False s
-       protocolError parsed s = error $ "external special remote protocol error, unexpectedly received \"" ++ s ++ "\" " ++
+       protocolError parsed s = giveup $ "external special remote protocol error, unexpectedly received \"" ++ s ++ "\" " ++
                if parsed then "(command not allowed at this time)" else "(unable to parse command)"
 
 protocolDebug :: External -> ExternalState -> Bool -> String -> IO ()
@@ -413,14 +412,14 @@ startExternal external = do
                environ <- propGitEnv g
                return $ p { env = Just environ }
 
-       runerr _ = error ("Cannot run " ++ basecmd ++ " -- Make sure it's in your PATH and is executable.")
+       runerr _ = giveup ("Cannot run " ++ basecmd ++ " -- Make sure it's in your PATH and is executable.")
 
        checkearlytermination Nothing = noop
        checkearlytermination (Just exitcode) = ifM (inPath basecmd)
-               ( error $ unwords [ "failed to run", basecmd, "(" ++ show exitcode ++ ")" ]
+               ( giveup $ unwords [ "failed to run", basecmd, "(" ++ show exitcode ++ ")" ]
                , do
                        path <- intercalate ":" <$> getSearchPath
-                       error $ basecmd ++ " is not installed in PATH (" ++ path ++ ")"
+                       giveup $ basecmd ++ " is not installed in PATH (" ++ path ++ ")"
                )
 
 stopExternal :: External -> Annex ()
@@ -452,7 +451,7 @@ checkPrepared st external = do
        v <- liftIO $ atomically $ readTVar $ externalPrepared st
        case v of
                Prepared -> noop
-               FailedPrepare errmsg -> error errmsg
+               FailedPrepare errmsg -> giveup errmsg
                Unprepared ->
                        handleRequest' st external PREPARE Nothing $ \resp ->
                                case resp of
@@ -460,7 +459,7 @@ checkPrepared st external = do
                                                setprepared Prepared
                                        PREPARE_FAILURE errmsg -> Just $ do
                                                setprepared $ FailedPrepare errmsg
-                                               error errmsg
+                                               giveup errmsg
                                        _ -> Nothing
   where
        setprepared status = liftIO $ atomically $ void $
@@ -520,8 +519,8 @@ checkurl external url =
                CHECKURL_MULTI ((_, sz, f):[]) ->
                        Just $ return $ UrlContents sz $ Just $ mkSafeFilePath f
                CHECKURL_MULTI l -> Just $ return $ UrlMulti $ map mkmulti l
-               CHECKURL_FAILURE errmsg -> Just $ error errmsg
-               UNSUPPORTED_REQUEST -> error "CHECKURL not implemented by external special remote"
+               CHECKURL_FAILURE errmsg -> Just $ giveup errmsg
+               UNSUPPORTED_REQUEST -> giveup "CHECKURL not implemented by external special remote"
                _ -> Nothing
   where
        mkmulti (u, s, f) = (u, s, mkSafeFilePath f)
@@ -530,7 +529,7 @@ retrieveUrl :: Retriever
 retrieveUrl = fileRetriever $ \f k p -> do
        us <- getWebUrls k
        unlessM (downloadUrl k p us f) $
-               error "failed to download content"
+               giveup "failed to download content"
 
 checkKeyUrl :: Git.Repo -> CheckPresent
 checkKeyUrl r k = do
index a0c8ecaf7a6e570d428c3ed26e695e1f01f76507..78ab6ed79c382200e8f2ff0e340d4359c8090e4f 100644 (file)
@@ -164,16 +164,16 @@ rsyncTransport r gc
        othertransport = return ([], loc, AccessDirect)
 
 noCrypto :: Annex a
-noCrypto = error "cannot use gcrypt remote without encryption enabled"
+noCrypto = giveup "cannot use gcrypt remote without encryption enabled"
 
 unsupportedUrl :: a
-unsupportedUrl = error "using non-ssh remote repo url with gcrypt is not supported"
+unsupportedUrl = giveup "using non-ssh remote repo url with gcrypt is not supported"
 
 gCryptSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> RemoteGitConfig -> Annex (RemoteConfig, UUID)
 gCryptSetup mu _ c gc = go $ M.lookup "gitrepo" c
   where
        remotename = fromJust (M.lookup "name" c)
-       go Nothing = error "Specify gitrepo="
+       go Nothing = giveup "Specify gitrepo="
        go (Just gitrepo) = do
                (c', _encsetup) <- encryptionSetup c gc
                inRepo $ Git.Command.run 
@@ -200,7 +200,7 @@ gCryptSetup mu _ c gc = go $ M.lookup "gitrepo" c
                        ]
                g <- inRepo Git.Config.reRead
                case Git.GCrypt.remoteRepoId g (Just remotename) of
-                       Nothing -> error "unable to determine gcrypt-id of remote"
+                       Nothing -> giveup "unable to determine gcrypt-id of remote"
                        Just gcryptid -> do
                                let u = genUUIDInNameSpace gCryptNameSpace gcryptid
                                if Just u == mu || isNothing mu
@@ -208,7 +208,7 @@ gCryptSetup mu _ c gc = go $ M.lookup "gitrepo" c
                                                method <- setupRepo gcryptid =<< inRepo (Git.Construct.fromRemoteLocation gitrepo)
                                                gitConfigSpecialRemote u c' "gcrypt" (fromAccessMethod method)
                                                return (c', u)
-                                       else error $ "uuid mismatch; expected " ++ show mu ++ " but remote gitrepo has " ++ show u ++ " (" ++ show gcryptid ++ ")"
+                                       else giveup $ "uuid mismatch; expected " ++ show mu ++ " but remote gitrepo has " ++ show u ++ " (" ++ show gcryptid ++ ")"
 
 {- Sets up the gcrypt repository. The repository is either a local
  - repo, or it is accessed via rsync directly, or it is accessed over ssh
@@ -258,7 +258,7 @@ setupRepo gcryptid r
                        , Param rsyncurl
                        ]
                unless ok $
-                       error "Failed to connect to remote to set it up."
+                       giveup "Failed to connect to remote to set it up."
                return AccessDirect
 
        {-  Ask git-annex-shell to configure the repository as a gcrypt
@@ -337,7 +337,7 @@ retrieve r rsyncopts
        | Git.repoIsSsh (repo r) = if accessShell r
                then fileRetriever $ \f k p ->
                        unlessM (Ssh.rsyncHelper (Just p) =<< Ssh.rsyncParamsRemote False r Download k f Nothing) $
-                               error "rsync failed"
+                               giveup "rsync failed"
                else fileRetriever $ Remote.Rsync.retrieve rsyncopts
        | otherwise = unsupportedUrl
   where
index 34bdd83a163aee0679fbc0ed41aed8018df291dd..3304e2069f89273cf8f2cd92c3f26831700c30c2 100644 (file)
@@ -95,20 +95,20 @@ list autoinit = do
  -}
 gitSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> RemoteGitConfig -> Annex (RemoteConfig, UUID)
 gitSetup Nothing _ c _ = do
-       let location = fromMaybe (error "Specify location=url") $
+       let location = fromMaybe (giveup "Specify location=url") $
                Url.parseURIRelaxed =<< M.lookup "location" c
        g <- Annex.gitRepo
        u <- case filter (\r -> Git.location r == Git.Url location) (Git.remotes g) of
                [r] -> getRepoUUID r
-               [] -> error "could not find existing git remote with specified location"
-               _ -> error "found multiple git remotes with specified location"
+               [] -> giveup "could not find existing git remote with specified location"
+               _ -> giveup "found multiple git remotes with specified location"
        return (c, u)
 gitSetup (Just u) _ c _ = do
        inRepo $ Git.Command.run
                [ Param "remote"
                , Param "add"
-               , Param $ fromMaybe (error "no name") (M.lookup "name" c)
-               , Param $ fromMaybe (error "no location") (M.lookup "location" c)
+               , Param $ fromMaybe (giveup "no name") (M.lookup "name" c)
+               , Param $ fromMaybe (giveup "no location") (M.lookup "location" c)
                ]
        return (c, u)
 
@@ -202,7 +202,7 @@ tryGitConfigRead :: Bool -> Git.Repo -> Annex Git.Repo
 tryGitConfigRead autoinit r 
        | haveconfig r = return r -- already read
        | Git.repoIsSsh r = store $ do
-               v <- Ssh.onRemote r (pipedconfig, return (Left $ error "configlist failed")) "configlist" [] configlistfields
+               v <- Ssh.onRemote r (pipedconfig, return (Left $ giveup "configlist failed")) "configlist" [] configlistfields
                case v of
                        Right r'
                                | haveconfig r' -> return r'
@@ -321,7 +321,7 @@ inAnnex rmt key
                showChecking r
                ifM (Url.withUrlOptions $ \uo -> anyM (\u -> Url.checkBoth u (keySize key) uo) (keyUrls rmt key))
                        ( return True
-                       , error "not found"
+                       , giveup "not found"
                        )
        checkremote = Ssh.inAnnex r key
        checklocal = guardUsable r (cantCheck r) $
@@ -357,7 +357,7 @@ dropKey r key
                                        logStatus key InfoMissing
                                        Annex.Content.saveState True
                                return True
-       | Git.repoIsHttp (repo r) = error "dropping from http remote not supported"
+       | Git.repoIsHttp (repo r) = giveup "dropping from http remote not supported"
        | otherwise = commitOnCleanup r $ Ssh.dropKey (repo r) key
 
 lockKey :: Remote -> Key -> (VerifiedCopy -> Annex r) -> Annex r
@@ -414,7 +414,7 @@ lockKey r key callback
                                        failedlock
        | otherwise = failedlock
   where
-       failedlock = error "can't lock content"
+       failedlock = giveup "can't lock content"
 
 {- Tries to copy a key's content from a remote's annex to a file. -}
 copyFromRemote :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex (Bool, Verification)
@@ -444,7 +444,7 @@ copyFromRemote' r key file dest meterupdate
        | Git.repoIsSsh (repo r) = unVerified $ feedprogressback $ \p -> do
                Ssh.rsyncHelper (Just (combineMeterUpdate meterupdate p))
                        =<< Ssh.rsyncParamsRemote False r Download key dest file
-       | otherwise = error "copying from non-ssh, non-http remote not supported"
+       | otherwise = giveup "copying from non-ssh, non-http remote not supported"
   where
        {- Feed local rsync's progress info back to the remote,
         - by forking a feeder thread that runs
@@ -547,7 +547,7 @@ copyToRemote' r key file meterupdate
                        unlocked <- isDirect <||> versionSupportsUnlockedPointers
                        Ssh.rsyncHelper (Just meterupdate)
                                =<< Ssh.rsyncParamsRemote unlocked r Upload key object file
-       | otherwise = error "copying to non-ssh repo not supported"
+       | otherwise = giveup "copying to non-ssh repo not supported"
   where
        copylocal Nothing = return False
        copylocal (Just (object, checksuccess)) = do
index eae2dab6846a3e5aa8cbcd90310c33d3d8b37274..77a907b97cd7e750152b5e0b2b7ca01e707ae2c7 100644 (file)
@@ -146,7 +146,7 @@ retrieve r k sink = go =<< glacierEnv c gc u
                , Param $ getVault $ config r
                , Param $ archive r k
                ]
-       go Nothing = error "cannot retrieve from glacier"
+       go Nothing = giveup "cannot retrieve from glacier"
        go (Just e) = do
                let cmd = (proc "glacier" (toCommand params))
                        { env = Just e
@@ -182,7 +182,7 @@ checkKey r k = do
        showChecking r
        go =<< glacierEnv (config r) (gitconfig r) (uuid r)
   where
-       go Nothing = error "cannot check glacier"
+       go Nothing = giveup "cannot check glacier"
        go (Just e) = do
                {- glacier checkpresent outputs the archive name to stdout if
                 - it's present. -}
@@ -190,7 +190,7 @@ checkKey r k = do
                let probablypresent = key2file k `elem` lines s
                if probablypresent
                        then ifM (Annex.getFlag "trustglacier")
-                               ( return True, error untrusted )
+                               ( return True, giveup untrusted )
                        else return False
 
        params = glacierParams (config r)
@@ -222,7 +222,7 @@ glacierParams :: RemoteConfig -> [CommandParam] -> [CommandParam]
 glacierParams c params = datacenter:params
   where
        datacenter = Param $ "--region=" ++
-               fromMaybe (error "Missing datacenter configuration")
+               fromMaybe (giveup "Missing datacenter configuration")
                        (M.lookup "datacenter" c)
 
 glacierEnv :: RemoteConfig -> RemoteGitConfig -> UUID -> Annex (Maybe [(String, String)])
@@ -239,7 +239,7 @@ glacierEnv c gc u = do
        (uk, pk) = credPairEnvironment creds
 
 getVault :: RemoteConfig -> Vault
-getVault = fromMaybe (error "Missing vault configuration") 
+getVault = fromMaybe (giveup "Missing vault configuration") 
        . M.lookup "vault"
 
 archive :: Remote -> Key -> Archive
@@ -249,7 +249,7 @@ archive r k = fileprefix ++ key2file k
 
 genVault :: RemoteConfig -> RemoteGitConfig -> UUID -> Annex ()
 genVault c gc u = unlessM (runGlacier c gc u params) $
-       error "Failed creating glacier vault."
+       giveup "Failed creating glacier vault."
   where
        params = 
                [ Param "vault"
@@ -312,7 +312,7 @@ jobList r keys = go =<< glacierEnv (config r) (gitconfig r) (uuid r)
 checkSaneGlacierCommand :: IO ()
 checkSaneGlacierCommand = 
        whenM ((Nothing /=) <$> catchMaybeIO shouldfail) $
-               error wrongcmd
+               giveup wrongcmd
   where
        test = proc "glacier" ["--compatibility-test-git-annex"]
        shouldfail = withQuietOutput createProcessSuccess test
index e3cf0d27b8f5cef622675d35e4d70cd98df02620..103dcf4ca1a5535cbdd5de92e6cac52af6b7a8c5 100644 (file)
@@ -59,7 +59,7 @@ getChunkConfig m =
                Just size
                        | size == 0 -> NoChunks
                        | size > 0 -> c (fromInteger size)
-               _ -> error $ "bad configuration " ++ f ++ "=" ++ v
+               _ -> giveup $ "bad configuration " ++ f ++ "=" ++ v
 
 -- An infinite stream of chunk keys, starting from chunk 1.
 newtype ChunkKeyStream = ChunkKeyStream [Key]
index 05c3e38a5e8270099640832f9e768622a19e74cc..45ceae0681ff730d842e7b7d4ee5ba8db35d07e4 100644 (file)
@@ -66,14 +66,14 @@ encryptionSetup c gc = do
                        encsetup $ genEncryptedCipher cmd (c, gc) key Hybrid
                Just "pubkey" -> encsetup $ genEncryptedCipher cmd (c, gc) key PubKey
                Just "sharedpubkey" -> encsetup $ genSharedPubKeyCipher cmd key
-               _ -> error $ "Specify " ++ intercalate " or "
+               _ -> giveup $ "Specify " ++ intercalate " or "
                        (map ("encryption=" ++)
                                ["none","shared","hybrid","pubkey", "sharedpubkey"])
                        ++ "."
-       key = fromMaybe (error "Specifiy keyid=...") $ M.lookup "keyid" c
+       key = fromMaybe (giveup "Specifiy keyid=...") $ M.lookup "keyid" c
        newkeys = maybe [] (\k -> [(True,k)]) (M.lookup "keyid+" c) ++
                maybe [] (\k -> [(False,k)]) (M.lookup "keyid-" c)
-       cannotchange = error "Cannot set encryption type of existing remotes."
+       cannotchange = giveup "Cannot set encryption type of existing remotes."
        -- Update an existing cipher if possible.
        updateCipher cmd v = case v of
                SharedCipher _ | maybe True (== "shared") encryption -> return (c', EncryptionIsSetup)
index f01dfd9224a1eb3493990ced5884e4f890401e8c..ebe0f2598e6b43a497cc40286498b3e4f547244e 100644 (file)
@@ -70,7 +70,7 @@ handlePopper numchunks chunksize meterupdate h sink = do
 -- meter as it goes.
 httpBodyRetriever :: FilePath -> MeterUpdate -> Response BodyReader -> IO ()
 httpBodyRetriever dest meterupdate resp
-       | responseStatus resp /= ok200 = error $ show $ responseStatus resp
+       | responseStatus resp /= ok200 = giveup $ show $ responseStatus resp
        | otherwise = bracket (openBinaryFile dest WriteMode) hClose (go zeroBytesProcessed)
   where
        reader = responseBody resp
index 484ea19552e0a7adc07912fb28dac1819cc40c37..01482577603bf10d27d4452b7898c2c4a8bcd3ee 100644 (file)
@@ -29,7 +29,7 @@ showChecking :: Describable a => a -> Annex ()
 showChecking v = showAction $ "checking " ++ describe v
 
 cantCheck :: Describable a => a -> e
-cantCheck v = error $ "unable to check " ++ describe v
+cantCheck v = giveup $ "unable to check " ++ describe v
 
 showLocking :: Describable a => a -> Annex ()
 showLocking v = showAction $ "locking " ++ describe v
index 4ec772296d7f6fda2781e48daddcd30d9ffeebf2..dff16b6568525db16c1670815a7f1620776d96b7 100644 (file)
@@ -29,7 +29,7 @@ import Config
 toRepo :: Git.Repo -> RemoteGitConfig -> [CommandParam] -> Annex [CommandParam]
 toRepo r gc sshcmd = do
        let opts = map Param $ remoteAnnexSshOptions gc
-       let host = fromMaybe (error "bad ssh url") $ Git.Url.hostuser r
+       let host = fromMaybe (giveup "bad ssh url") $ Git.Url.hostuser r
        params <- sshOptions (host, Git.Url.port r) gc opts
        return $ params ++ Param host : sshcmd
 
index 7d8f7f0967c65cdfef98af2e7ead20503c7535db..6abffe11770b4a891e9349a0c60e622136cbc174 100644 (file)
@@ -68,12 +68,12 @@ gen r u c gc = do
                        , checkUrl = Nothing
                        }
   where
-       hooktype = fromMaybe (error "missing hooktype") $ remoteAnnexHookType gc
+       hooktype = fromMaybe (giveup "missing hooktype") $ remoteAnnexHookType gc
 
 hookSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> RemoteGitConfig -> Annex (RemoteConfig, UUID)
 hookSetup mu _ c gc = do
        u <- maybe (liftIO genUUID) return mu
-       let hooktype = fromMaybe (error "Specify hooktype=") $
+       let hooktype = fromMaybe (giveup "Specify hooktype=") $
                M.lookup "hooktype" c
        (c', _encsetup) <- encryptionSetup c gc
        gitConfigSpecialRemote u c' "hooktype" hooktype
@@ -129,7 +129,7 @@ store h = fileStorer $ \k src _p ->
 retrieve :: HookName -> Retriever
 retrieve h = fileRetriever $ \d k _p ->
        unlessM (runHook h "retrieve" k (Just d) $ return True) $
-               error "failed to retrieve content"
+               giveup "failed to retrieve content"
 
 retrieveCheap :: HookName -> Key -> AssociatedFile -> FilePath -> Annex Bool
 retrieveCheap _ _ _ _ = return False
@@ -145,7 +145,7 @@ checkKey r h k = do
   where
        action = "checkpresent"
        findkey s = key2file k `elem` lines s
-       check Nothing = error $ action ++ " hook misconfigured"
+       check Nothing = giveup $ action ++ " hook misconfigured"
        check (Just hook) = do
                environ <- hookEnv action k Nothing
                findkey <$> readProcessEnv "sh" ["-c", hook] environ
index 4695ac7a9ede022dd3513ce41ae14b4daf1b8b40..22ef0b2cfb5f751952115925b98630c8252a9726 100644 (file)
@@ -53,7 +53,7 @@ gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remot
 gen r u c gc = do
        cst <- remoteCost gc expensiveRemoteCost
        (transport, url) <- rsyncTransport gc $
-               fromMaybe (error "missing rsyncurl") $ remoteAnnexRsyncUrl gc
+               fromMaybe (giveup "missing rsyncurl") $ remoteAnnexRsyncUrl gc
        let o = genRsyncOpts c gc transport url
        let islocal = rsyncUrlIsPath $ rsyncUrl o
        return $ Just $ specialRemote' specialcfg c
@@ -127,7 +127,7 @@ rsyncTransport gc url
                                        (map Param $ loginopt ++ sshopts')
                        "rsh":rshopts -> return $ map Param $ "rsh" :
                                loginopt ++ rshopts
-                       rsh -> error $ "Unknown Rsync transport: "
+                       rsh -> giveup $ "Unknown Rsync transport: "
                                ++ unwords rsh
        | otherwise = return ([], url)
   where
@@ -141,7 +141,7 @@ rsyncSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> RemoteGitConfig ->
 rsyncSetup mu _ c gc = do
        u <- maybe (liftIO genUUID) return mu
        -- verify configuration is sane
-       let url = fromMaybe (error "Specify rsyncurl=") $
+       let url = fromMaybe (giveup "Specify rsyncurl=") $
                M.lookup "rsyncurl" c
        (c', _encsetup) <- encryptionSetup c gc
 
@@ -188,7 +188,7 @@ store o k src meterupdate = withRsyncScratchDir $ \tmp -> do
 retrieve :: RsyncOpts -> FilePath -> Key -> MeterUpdate -> Annex ()
 retrieve o f k p = 
        unlessM (rsyncRetrieve o k f (Just p)) $
-               error "rsync failed"
+               giveup "rsync failed"
 
 retrieveCheap :: RsyncOpts -> Key -> AssociatedFile -> FilePath -> Annex Bool
 retrieveCheap o k _af f = ifM (preseedTmp k f) ( rsyncRetrieve o k f Nothing , return False )
index 97265e1481e460e90d0a6b75d926319b7a8fb509..c6f23333f1b38560c185367bf4b149f61a3845c5 100644 (file)
@@ -136,7 +136,7 @@ s3Setup' new u mcreds c gc
                -- Ensure user enters a valid bucket name, since
                -- this determines the name of the archive.org item.
                let validbucket = replace " " "-" $
-                       fromMaybe (error "specify bucket=") $
+                       fromMaybe (giveup "specify bucket=") $
                                getBucketName c'
                let archiveconfig = 
                        -- IA acdepts x-amz-* as an alias for x-archive-*
@@ -252,7 +252,7 @@ retrieve r info Nothing = case getpublicurl info of
                return False
        Just geturl -> fileRetriever $ \f k p ->
                unlessM (downloadUrl k p [geturl k] f) $
-                       error "failed to download content"
+                       giveup "failed to download content"
 
 retrieveCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool
 retrieveCheap _ _ _ = return False
@@ -301,7 +301,7 @@ checkKey r info (Just h) k = do
 checkKey r info Nothing k = case getpublicurl info of
        Nothing -> do
                warnMissingCredPairFor "S3" (AWS.creds $ uuid r)
-               error "No S3 credentials configured"
+               giveup "No S3 credentials configured"
        Just geturl -> do
                showChecking r
                withUrlOptions $ checkBoth (geturl k) (keySize k)
@@ -415,7 +415,7 @@ withS3Handle c gc u a = withS3HandleMaybe c gc u $ \mh -> case mh of
        Just h -> a h
        Nothing -> do
                warnMissingCredPairFor "S3" (AWS.creds u)
-               error "No S3 credentials configured"
+               giveup "No S3 credentials configured"
 
 withS3HandleMaybe :: RemoteConfig -> RemoteGitConfig -> UUID -> (Maybe S3Handle -> Annex a) -> Annex a
 withS3HandleMaybe c gc u a = do
@@ -437,7 +437,7 @@ s3Configuration c = cfg
        { S3.s3Port = port
        , S3.s3RequestStyle = case M.lookup "requeststyle" c of
                Just "path" -> S3.PathStyle
-               Just s -> error $ "bad S3 requeststyle value: " ++ s
+               Just s -> giveup $ "bad S3 requeststyle value: " ++ s
                Nothing -> S3.s3RequestStyle cfg
        }
   where
@@ -455,7 +455,7 @@ s3Configuration c = cfg
        port = let s = fromJust $ M.lookup "port" c in
                case reads s of
                [(p, _)] -> p
-               _ -> error $ "bad S3 port value: " ++ s
+               _ -> giveup $ "bad S3 port value: " ++ s
        cfg = S3.s3 proto endpoint False
 
 tryS3 :: Annex a -> Annex (Either S3.S3Error a)
@@ -475,7 +475,7 @@ data S3Info = S3Info
 extractS3Info :: RemoteConfig -> Annex S3Info
 extractS3Info c = do
        b <- maybe
-               (error "S3 bucket not configured")
+               (giveup "S3 bucket not configured")
                (return . T.pack)
                (getBucketName c)
        let info = S3Info
index 05b120d461baf30eb4779170bcebf52be95c5ebc..c29cfb438f2af08480967137abf69f2f27e60156 100644 (file)
@@ -109,7 +109,7 @@ tahoeSetup mu _ c _ = do
   where
        scsk = "shared-convergence-secret"
        furlk = "introducer-furl"
-       missingfurl = error "Set TAHOE_FURL to the introducer furl to use."
+       missingfurl = giveup "Set TAHOE_FURL to the introducer furl to use."
 
 store :: UUID -> TahoeHandle -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool
 store u hdl k _f _p = sendAnnex k noop $ \src ->
@@ -137,7 +137,7 @@ checkKey u hdl k = go =<< getCapability u k
                        [ Param "--raw"
                        , Param cap
                        ]
-               either error return v
+               either giveup return v
 
 defaultTahoeConfigDir :: UUID -> IO TahoeConfigDir
 defaultTahoeConfigDir u = do
@@ -147,7 +147,7 @@ defaultTahoeConfigDir u = do
 tahoeConfigure :: TahoeConfigDir -> IntroducerFurl -> Maybe SharedConvergenceSecret -> IO SharedConvergenceSecret
 tahoeConfigure configdir furl mscs = do
        unlessM (createClient configdir furl) $
-               error "tahoe create-client failed"
+               giveup "tahoe create-client failed"
        maybe noop (writeSharedConvergenceSecret configdir) mscs
        startTahoeDaemon configdir
        getSharedConvergenceSecret configdir
@@ -173,7 +173,7 @@ getSharedConvergenceSecret configdir = go (60 :: Int)
   where
        f = convergenceFile configdir
        go n
-               | n == 0 = error $ "tahoe did not write " ++ f ++ " after 1 minute. Perhaps the daemon failed to start?"
+               | n == 0 = giveup $ "tahoe did not write " ++ f ++ " after 1 minute. Perhaps the daemon failed to start?"
                | otherwise = do
                        v <- catchMaybeIO (readFile f)
                        case v of
index 033057dd8d8d0d3ca44c89c700ee9753e80933b9..be2f265e087a287565b2e18a855c0ad47bd84997 100644 (file)
@@ -100,7 +100,7 @@ checkKey key = do
        us <- getWebUrls key
        if null us
                then return False
-               else either error return =<< checkKey' key us
+               else either giveup return =<< checkKey' key us
 checkKey' :: Key -> [URLString] -> Annex (Either String Bool)
 checkKey' key us = firsthit us (Right False) $ \u -> do
        let (u', downloader) = getDownloader u
index 3de8b357e6dcf76e89c20352c08adeea6aba3a7e..19dbaa8af5baec77f5e424f29652dd0b03fc864b 100644 (file)
@@ -85,7 +85,7 @@ webdavSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> RemoteGitConfig -
 webdavSetup mu mcreds c gc = do
        u <- maybe (liftIO genUUID) return mu
        url <- case M.lookup "url" c of
-               Nothing -> error "Specify url="
+               Nothing -> giveup "Specify url="
                Just url -> return url
        (c', encsetup) <- encryptionSetup c gc
        creds <- maybe (getCreds c' gc u) (return . Just) mcreds
@@ -122,7 +122,7 @@ retrieveCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool
 retrieveCheap _ _ _ = return False
 
 retrieve :: ChunkConfig -> Maybe DavHandle -> Retriever
-retrieve _ Nothing = error "unable to connect"
+retrieve _ Nothing = giveup "unable to connect"
 retrieve (LegacyChunks _) (Just dav) = retrieveLegacyChunked dav
 retrieve _ (Just dav) = fileRetriever $ \d k p -> liftIO $
        goDAV dav $
@@ -147,7 +147,7 @@ remove (Just dav) k = liftIO $ do
                                        _ -> return False
 
 checkKey :: Remote -> ChunkConfig -> Maybe DavHandle -> CheckPresent
-checkKey r _ Nothing _ = error $ name r ++ " not configured"
+checkKey r _ Nothing _ = giveup $ name r ++ " not configured"
 checkKey r chunkconfig (Just dav) k = do
        showChecking r
        case chunkconfig of
@@ -155,7 +155,7 @@ checkKey r chunkconfig (Just dav) k = do
                _ -> do
                        v <- liftIO $ goDAV dav $
                                existsDAV (keyLocation k)
-                       either error return v
+                       either giveup return v
 
 configUrl :: Remote -> Maybe URLString
 configUrl r = fixup <$> M.lookup "url" (config r)
index 20ed7a40226cbcaa67280466bbf0db1f73b31cfc..c6552f89c007fe3a90022e3641c26a5395e01df7 100644 (file)
@@ -21,7 +21,7 @@ import qualified Upgrade.V4
 import qualified Upgrade.V5
 
 checkUpgrade :: Version -> Annex ()
-checkUpgrade = maybe noop error <=< needsUpgrade
+checkUpgrade = maybe noop giveup <=< needsUpgrade
 
 needsUpgrade :: Version -> Annex (Maybe String)
 needsUpgrade v
@@ -49,8 +49,8 @@ upgrade automatic destversion = do
        go (Just "0") = Upgrade.V0.upgrade
        go (Just "1") = Upgrade.V1.upgrade
 #else
-       go (Just "0") = error "upgrade from v0 on Windows not supported"
-       go (Just "1") = error "upgrade from v1 on Windows not supported"
+       go (Just "0") = giveup "upgrade from v0 on Windows not supported"
+       go (Just "1") = giveup "upgrade from v1 on Windows not supported"
 #endif
        go (Just "2") = Upgrade.V2.upgrade
        go (Just "3") = Upgrade.V3.upgrade automatic
index 3cc2eb26131e9cf9b885c886ab11a2c39555b3e5..5c0ea41696d4daf3cec2586957c67489eb587fa1 100644 (file)
@@ -111,7 +111,7 @@ lockPidFile pidfile = do
 #endif
 
 alreadyRunning :: IO ()
-alreadyRunning = error "Daemon is already running."
+alreadyRunning = giveup "Daemon is already running."
 
 {- Checks if the daemon is running, by checking that the pid file
  - is locked by the same process that is listed in the pid file.
@@ -135,7 +135,7 @@ checkDaemon pidfile = bracket setup cleanup go
        check _ Nothing = Nothing
        check (Just (pid, _)) (Just pid')
                | pid == pid' = Just pid
-               | otherwise = error $
+               | otherwise = giveup $
                        "stale pid in " ++ pidfile ++ 
                        " (got " ++ show pid' ++ 
                        "; expected " ++ show pid ++ " )"
index a07139c44bbcbb1fb60db7a59fc0a3c3f81614a0..d7472d490a485bf357ef9aca550540950c11842f 100644 (file)
@@ -17,7 +17,7 @@ import Data.Bits ((.&.))
 watchDir :: FilePath -> (FilePath -> Bool) -> Bool -> WatchHooks -> IO EventStream
 watchDir dir ignored scanevents hooks = do
        unlessM fileLevelEventsSupported $
-               error "Need at least OSX 10.7.0 for file-level FSEvents"
+               giveup "Need at least OSX 10.7.0 for file-level FSEvents"
        scan dir
        eventStreamCreate [dir] 1.0 True True True dispatch
   where
index 4d11b95a8d5d19a07483f563146f8c13f08a57be..1890b8af5ed4d90eea6fddd9352ecb3c05510273 100644 (file)
@@ -152,7 +152,7 @@ watchDir i dir ignored scanevents hooks
                -- disk full error.
                | isFullError e =
                        case errHook hooks of
-                               Nothing -> error $ "failed to add inotify watch on directory " ++ dir ++ " (" ++ show e ++ ")"
+                               Nothing -> giveup $ "failed to add inotify watch on directory " ++ dir ++ " (" ++ show e ++ ")"
                                Just hook -> tooManyWatches hook dir
                -- The directory could have been deleted.
                | isDoesNotExistError e = return ()
index 0ffc7103faf3f4c492b75e182317d958ed974586..5cd8fd19976fc846a33a16616719891882904f11 100644 (file)
@@ -1,6 +1,6 @@
 {- Simple IO exception handling (and some more)
  -
- - Copyright 2011-2015 Joey Hess <id@joeyh.name>
+ - Copyright 2011-2016 Joey Hess <id@joeyh.name>
  -
  - License: BSD-2-clause
  -}
@@ -10,6 +10,7 @@
 
 module Utility.Exception (
        module X,
+       giveup,
        catchBoolIO,
        catchMaybeIO,
        catchDefaultIO,
@@ -40,6 +41,17 @@ import GHC.IO.Exception (IOErrorType(..))
 
 import Utility.Data
 
+{- Like error, this throws an exception. Unlike error, if this exception
+ - is not caught, it won't generate a backtrace. So use this for situations
+ - where there's a problem that the user is excpected to see in some
+ - circumstances. -}
+giveup :: [Char] -> a
+#if MIN_VERSION_base(4,9,0)
+giveup = errorWithoutStackTrace
+#else
+giveup = error
+#endif
+
 {- Catches IO errors and returns a Bool -}
 catchBoolIO :: MonadCatch m => m Bool -> m Bool
 catchBoolIO = catchDefaultIO False
index 98ffe751babefb0630e16053457e627da8f6b096..119ea4834749a1d54ac8f361a410be005a7fd975 100644 (file)
@@ -12,6 +12,8 @@ module Utility.Glob (
        matchGlob
 ) where
 
+import Utility.Exception
+
 import System.Path.WildMatch
 
 import "regex-tdfa" Text.Regex.TDFA
@@ -26,7 +28,7 @@ compileGlob :: String -> GlobCase -> Glob
 compileGlob glob globcase = Glob $
        case compile (defaultCompOpt {caseSensitive = casesentitive}) defaultExecOpt regex of
                Right r -> r
-               Left _ -> error $ "failed to compile regex: " ++ regex
+               Left _ -> giveup $ "failed to compile regex: " ++ regex
   where
        regex = '^':wildToRegex glob
        casesentitive = case globcase of
index 21171b6fb02946b1c140fd115f9475e605a1fac4..118515222088123baafefdf6f9cd84f0c3e10ff2 100644 (file)
@@ -253,7 +253,7 @@ genRandom cmd highQuality size = checksize <$> readStrict cmd params
                        then s
                        else shortread len
 
-       shortread got = error $ unwords
+       shortread got = giveup $ unwords
                [ "Not enough bytes returned from gpg", show params
                , "(got", show got, "; expected", show expectedlength, ")"
                ]
index 6a3e86a3f542841bf23e3d9dfeddba9dae2adc8b..bc8ddfe6bbb12cc8fc19c927fbd4071f0d05c796 100644 (file)
@@ -210,7 +210,7 @@ waitLock (Seconds timeout) lockfile = go timeout
                        =<< tryLock lockfile
                | otherwise = do
                        hPutStrLn stderr $ show timeout ++ " second timeout exceeded while waiting for pid lock file " ++ lockfile
-                       error $ "Gave up waiting for possibly stale pid lock file " ++ lockfile
+                       giveup $ "Gave up waiting for possibly stale pid lock file " ++ lockfile
 
 dropLock :: LockHandle -> IO ()
 dropLock (LockHandle lockfile _ sidelock) = do
index 09f74968b00a2b5217fa94143f68fa1d294bd755..417ab7041cc095edbb9cbcb5464e64a44a024d47 100644 (file)
@@ -79,8 +79,8 @@ forceQuery :: Query (Maybe Page)
 forceQuery v ps url = query' v ps url `catchNonAsync` onerr
   where
        onerr e = ifM (inPath "quvi")
-               ( error ("quvi failed: " ++ show e)
-               , error "quvi is not installed"
+               ( giveup ("quvi failed: " ++ show e)
+               , giveup "quvi is not installed"
                )
 
 {- Returns Nothing if the page is not a video page, or quvi is not
index ec0b0d0b2ebd1e1db131bbc0ed922e962ed1403f..dd66c331e6c4fdc15821f267d97b3d28378ddd75 100644 (file)
@@ -16,6 +16,7 @@ module Utility.UserInfo (
 
 import Utility.Env
 import Utility.Data
+import Utility.Exception
 
 import System.PosixCompat
 import Control.Applicative
@@ -25,7 +26,7 @@ import Prelude
  -
  - getpwent will fail on LDAP or NIS, so use HOME if set. -}
 myHomeDir :: IO FilePath
-myHomeDir = either error return =<< myVal env homeDirectory
+myHomeDir = either giveup return =<< myVal env homeDirectory
   where
 #ifndef mingw32_HOST_OS
        env = ["HOME"]