darcs 2.18.1 → 2.18.2
raw patch · 42 files changed
+301/−95 lines, 42 filesdep +safePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: safe
API changes (from Hackage documentation)
+ Darcs.UI.Commands.Convert.Export: cleanPatchAuthor :: String -> String
+ Darcs.UI.Commands.Convert.Export: cleanPatchAuthorTestCases :: [(String, String)]
- Darcs.Repository.Prefs: addRepoSource :: String -> DryRun -> SetDefault -> InheritDefault -> IO ()
+ Darcs.Repository.Prefs: addRepoSource :: String -> DryRun -> SetDefault -> InheritDefault -> Bool -> IO ()
Files
- CHANGELOG +11/−0
- darcs.cabal +4/−1
- darcs/darcs.hs +1/−1
- harness/Darcs/Test/Email.hs +2/−1
- harness/Darcs/Test/Misc.hs +3/−2
- harness/Darcs/Test/Patch/FileUUIDModel.hs +3/−3
- harness/Darcs/Test/Patch/Properties/RepoPatch.hs +2/−1
- harness/Darcs/Test/Shell.hs +5/−1
- harness/Darcs/Test/UI.hs +2/−0
- harness/Darcs/Test/UI/Commands/Convert/Export.hs +14/−0
- harness/test.hs +4/−2
- release/distributed-context +1/−1
- src/Darcs/Patch/Annotate.hs +5/−3
- src/Darcs/Patch/Info.hs +9/−4
- src/Darcs/Patch/Prim/V1/Mangle.hs +3/−2
- src/Darcs/Patch/V1/Commute.hs +2/−1
- src/Darcs/Repository/Clone.hs +3/−2
- src/Darcs/Repository/PatchIndex.hs +3/−1
- src/Darcs/Repository/Prefs.hs +26/−12
- src/Darcs/UI/Commands/Convert/Darcs2.hs +2/−1
- src/Darcs/UI/Commands/Convert/Export.hs +25/−6
- src/Darcs/UI/Commands/Convert/Import.hs +9/−9
- src/Darcs/UI/Commands/Pull.hs +4/−3
- src/Darcs/UI/Commands/Push.hs +1/−1
- src/Darcs/UI/Commands/Record.hs +6/−1
- src/Darcs/UI/Commands/Replace.hs +4/−3
- src/Darcs/UI/Commands/Send.hs +1/−1
- src/Darcs/UI/Commands/ShowAuthors.hs +5/−3
- src/Darcs/UI/External.hs +10/−10
- src/Darcs/UI/Usage.hs +2/−1
- src/Darcs/Util/Diff/Patience.hs +8/−6
- src/Darcs/Util/Graph.hs +3/−1
- src/Darcs/Util/Lock.hs +3/−1
- tests/issue1465_ortryrunning.sh +4/−4
- tests/issue189-external-merge-move.sh +1/−1
- tests/issue1898-set-default-notification.sh +51/−0
- tests/issue2204-send-mail.sh +1/−1
- tests/latin9-input.sh +1/−1
- tests/network/external.sh +1/−1
- tests/set-default-hint.sh +54/−0
- tests/test-untestable.sh +1/−1
- tests/trackdown-bisect.sh +1/−1
CHANGELOG view
@@ -1,3 +1,14 @@+Darcs 2.18.2, 24 Mar 2024++ * Fix deprecated head/tail warnings on GHC 9.8, making the build there+ warning-free.++ * Replace the set-default hint that was removed in 2.18.1++ * Add a --ghcflags/-g option to the test suite to allow flags+ like -dynamic to be passed to GHC when it builds helper exes+ in various test scripts.+ Darcs 2.18.1, 25 Feb 2024 * Supports GHC 9.8 and the most recent version of other dependencies
darcs.cabal view
@@ -1,6 +1,6 @@ Cabal-Version: 2.4 Name: darcs-version: 2.18.1+version: 2.18.2 License: GPL-2.0-or-later License-file: COPYING Author: David Roundy <droundy@darcs.net>, <darcs-devel@darcs.net>@@ -413,6 +413,7 @@ build-depends: unix >= 2.7.1.0 && < 2.9 build-depends: base >= 4.10 && < 4.20,+ safe >= 0.3.20 && < 0.4, stm >= 2.1 && < 2.6, binary >= 0.5 && < 0.11, containers >= 0.5.11 && < 0.8,@@ -571,6 +572,7 @@ constraints, filepath, mtl,+ safe, transformers, text, directory,@@ -655,6 +657,7 @@ Darcs.Test.Shell Darcs.Test.TestOnly.Instance Darcs.Test.UI+ Darcs.Test.UI.Commands.Convert.Export Darcs.Test.UI.Commands.Test Darcs.Test.UI.Commands.Test.Commutable Darcs.Test.UI.Commands.Test.IndexedApply
darcs/darcs.hs view
@@ -81,7 +81,7 @@ ["-V"] -> putStrLn version ["--version"] -> putStrLn version ["--exact-version"] -> printExactVersion- _ -> runTheCommand commandControlList (head argv) (tail argv)+ cmd:args -> runTheCommand commandControlList cmd args where handleErrors = handle errorExceptionHandler handleExecFail = handle execExceptionHandler
harness/Darcs/Test/Email.hs view
@@ -36,6 +36,7 @@ import Darcs.Util.Printer ( text, renderPS, packedString ) import Darcs.UI.Email ( makeEmail, readEmail, formatHeader, prop_qp_roundtrip )+import Safe ( tailErr ) testSuite :: Test testSuite = testGroup "Darcs.Email"@@ -79,7 +80,7 @@ testProperty "Checking for spaces at start of folded email header lines" $ \field value -> let headerLines = bsLines (formatHeader cleanField value) cleanField = cleanFieldString field- in all (\l -> B.null l || B.head l == 32) (tail headerLines)+ in all (\l -> B.null l || B.head l == 32) (tailErr headerLines) -- Checks that there are no lines in email headers with only whitespace emailHeaderNoEmptyLines :: Test
harness/Darcs/Test/Misc.hs view
@@ -42,6 +42,7 @@ import Data.Coerce ( coerce ) import Data.Maybe ( isJust ) import Control.Monad.ST+import Safe ( tailErr ) import Test.HUnit ( assertBool, assertEqual, assertFailure ) import Test.Framework.Providers.QuickCheck2 ( testProperty ) import Test.Framework.Providers.HUnit ( testCase )@@ -148,8 +149,8 @@ p_b = listArray (0, length sb) $ B.empty:(toPS sb) shiftBoundaries ca_arr cb_arr p_a 1 1 shiftBoundaries cb_arr ca_arr p_b 1 1- ca_res <- fmap (fromBool . tail) $ getElems ca_arr- cb_res <- fmap (fromBool . tail) $ getElems cb_arr+ ca_res <- fmap (fromBool . tailErr) $ getElems ca_arr+ cb_res <- fmap (fromBool . tailErr) $ getElems cb_arr return $ if ca_res == ca' && cb_res == cb' then [] else ["shiftBoundaries failed on "++sa++" and "++sb++" with " ++(show (ca,cb))++" expected "++(show (ca', cb'))
harness/Darcs/Test/Patch/FileUUIDModel.hs view
@@ -162,11 +162,11 @@ return $ (dirid, Directory $ M.fromList $ names `zip` ids ++ dirnames `zip` dirids) : (fileids `zip` files) ++ dirs where subdirs [] _ _ = return []- subdirs tomake dirs files = do+ subdirs (uuid:uuids) dirs files = do dirsplit <- choose (1, length dirs) filesplit <- choose (1, length files)- dir <- aDir (head tomake : take dirsplit dirs) (take filesplit files)- remaining <- subdirs (tail tomake) (drop dirsplit dirs) (drop filesplit files)+ dir <- aDir (uuid : take dirsplit dirs) (take filesplit files)+ remaining <- subdirs uuids (drop dirsplit dirs) (drop filesplit files) return $ dir ++ remaining
harness/Darcs/Test/Patch/Properties/RepoPatch.hs view
@@ -10,6 +10,7 @@ import Darcs.Prelude import Data.Maybe ( catMaybes )+import Safe ( tailErr ) import Darcs.Test.Patch.Arbitrary.Generic ( PrimBased ) import Darcs.Test.Patch.Arbitrary.PatchTree@@ -68,7 +69,7 @@ let flat = take 20 flat' in case map (start `repoApply`) flat of rms ->- if and $ zipWith assertEqualFst (zip rms flat) (tail $ zip rms flat)+ if and $ zipWith assertEqualFst (zip rms flat) (tailErr $ zip rms flat) then succeeded else failed $ redText "oops"
harness/Darcs/Test/Shell.hs view
@@ -61,6 +61,7 @@ , testfile :: FilePath , testdir :: Maybe FilePath -- ^ only if you want to set it explicitly , darcspath :: FilePath+ , ghcflags :: String , diffalgorithm :: DiffAlgorithm , useindex :: UseIndex , usecache :: UseCache@@ -124,6 +125,7 @@ -- double-check that the darcs on the path is the expected one, -- so is passed as a string directly without any translation , ("DARCS" , EnvString darcspath)+ , ("GHC_FLAGS" , EnvString ghcflags) , ("GHC_VERSION", EnvString $ show (__GLASGOW_HASKELL__ :: Int)) -- https://www.joshkel.com/2018/01/18/symlinks-in-windows/ , ("MSYS" , EnvString "winsymlinks:nativestrict")@@ -237,12 +239,13 @@ :: FilePath -> [FilePath] -> Maybe FilePath+ -> String -> [DiffAlgorithm] -> [Format] -> [UseIndex] -> [UseCache] -> IO [Test]-findShell dp files tdir diffAlgorithms repoFormats useindexs usecaches =+findShell dp files tdir ghcflags diffAlgorithms repoFormats useindexs usecaches = do return [ shellTest@@ -251,6 +254,7 @@ , testfile = file , testdir = tdir , darcspath = dp+ , ghcflags = ghcflags , diffalgorithm = da , useindex = ui , usecache = uc
harness/Darcs/Test/UI.hs view
@@ -1,6 +1,7 @@ module Darcs.Test.UI ( testSuite ) where import qualified Darcs.Test.UI.Commands.Test ( testSuite )+import qualified Darcs.Test.UI.Commands.Convert.Export ( testSuite ) import Test.Framework ( Test, testGroup ) @@ -8,4 +9,5 @@ testSuite = testGroup "Darcs.UI" [ Darcs.Test.UI.Commands.Test.testSuite+ , Darcs.Test.UI.Commands.Convert.Export.testSuite ]
+ harness/Darcs/Test/UI/Commands/Convert/Export.hs view
@@ -0,0 +1,14 @@+module Darcs.Test.UI.Commands.Convert.Export ( testSuite ) where++import Darcs.Prelude+import Darcs.UI.Commands.Convert.Export ( cleanPatchAuthor, cleanPatchAuthorTestCases )++import Test.Framework.Providers.HUnit ( testCase )+import Test.Framework ( Test, testGroup )+import Test.HUnit ( (@?=) )++testSuite :: Test+testSuite = testGroup "Darcs.UI.Commands.Convert.Export"+ [ testGroup "cleanPatchAuthor" $ flip map cleanPatchAuthorTestCases $ \(input, expected) ->+ testCase (show input) $ cleanPatchAuthor input @?= expected+ ]
harness/test.hs view
@@ -38,6 +38,7 @@ , darcs :: String , tests :: [String] , testDir :: Maybe FilePath+ , ghcFlags :: String , plain :: Bool , hideSuccesses :: Bool , threads :: Int@@ -59,6 +60,7 @@ , darcs := "" += help "Darcs binary path" += typ "PATH" , tests := [] += help "Pattern to limit the tests to run" += typ "PATTERN" += name "t" , testDir := Nothing += help "Directory to run tests in" += typ "PATH" += name "d"+ , ghcFlags := "" += help "GHC flags to use when compiling tests" += typ "FLAGS" += name "g" , plain := False += help "Use plain-text output [no]" , hideSuccesses := False += help "Hide successes [no]" , threads := 1 += help "Number of threads [1]" += name "j"@@ -176,14 +178,14 @@ if shell then do files <- findTestFiles "tests"- findShell darcsBin files (testDir conf) diffAlgorithm+ findShell darcsBin files (testDir conf) (ghcFlags conf) diffAlgorithm repoFormat useIndex useCache else return [] ntests <- if network then do files <- findTestFiles "tests/network"- findShell darcsBin files (testDir conf) diffAlgorithm+ findShell darcsBin files (testDir conf) (ghcFlags conf) diffAlgorithm repoFormat useIndex useCache else return [] let utests =
release/distributed-context view
@@ -1,1 +1,1 @@-Just "\nContext:\n\n\n[TAG 2.18.1\nGanesh Sittampalam <ganesh@earth.li>**20240225173219\n Ignore-this: dc3a92eafcab9d4fa9f53b1811d4c99d330615a8c202bff1b77f44d551d21684eee81e96c69be62b\n] \n"+Just "\nContext:\n\n\n[TAG 2.18.2\nGanesh Sittampalam <ganesh@earth.li>**20240324205714\n Ignore-this: d03c480e509ce62eacaf0f1ad40f0cb7821163cac313d5ee4c977e7f77f9ec020b9e61214ddafe49\n] \n"
src/Darcs/Patch/Annotate.hs view
@@ -53,7 +53,9 @@ import qualified Data.Vector as V import Data.Function ( on )-import Data.List( nub, groupBy )+import Data.List( nub )+import Data.List.NonEmpty ( groupBy )+import qualified Data.List.NonEmpty as NE import Data.Maybe( isJust, mapMaybe ) import qualified Darcs.Patch.Prim.FileUUID as FileUUID@@ -233,8 +235,8 @@ pi_list = unlines [ show n ++ ": " ++ renderString (displayPatchInfo i) | (n :: Int, i) <- zip [1..] pis ] - file = concat [ annotation (fst $ head chunk) ++ " | " ++ line (head chunk) ++- "\n" ++ unlines [ indent 25 (" | " ++ line l) | l <- tail chunk ]+ file = concat [ annotation (fst $ NE.head chunk) ++ " | " ++ line (NE.head chunk) +++ "\n" ++ unlines [ indent 25 (" | " ++ line l) | l <- NE.tail chunk ] | chunk <- file_ann ] pis = nub $ mapMaybe fst $ V.toList a
src/Darcs/Patch/Info.hs view
@@ -74,6 +74,8 @@ import qualified Data.ByteString.Char8 as BC ( index, head, notElem, all, unpack, pack ) import Data.List( isPrefixOf )+import Data.List.NonEmpty ( NonEmpty(..) )+import qualified Data.List.NonEmpty as NE import Darcs.Util.Printer ( Doc, packedString, empty, ($$), (<+>), vcat, text, cyanText, blueText, prefix )@@ -212,18 +214,21 @@ "will not be shown when displaying a patch." confirmed <- promptYorn "Proceed? " unless confirmed $ fail "User cancelled because of Ignore-this."- return $ pinf { _piLog = BC.pack (head ignored++showHex x ""):+ return $ pinf { _piLog = BC.pack (NE.head ignored++showHex x ""): _piLog pinf } replaceJunk :: PatchInfo -> IO PatchInfo replaceJunk pi@(PatchInfo {_piLog=log}) = addJunk $ pi{_piLog = ignoreJunk log} -ignored :: [String] -- this is a [String] so we can change the junk header.-ignored = ["Ignore-this: "]+-- This is a list so we can change the junk header.+-- The first element will be used for new patches, the rest are also recognised+-- in existing patches.+ignored :: NonEmpty String+ignored = "Ignore-this: " :| [] ignoreJunk :: [B.ByteString] -> [B.ByteString] ignoreJunk = filter isnt_ignored- where isnt_ignored x = doesnt_start_with x (map BC.pack ignored) -- TODO+ where isnt_ignored x = doesnt_start_with x (map BC.pack (NE.toList ignored)) -- TODO doesnt_start_with x ys = not $ any (`B.isPrefixOf` x) ys
src/Darcs/Patch/Prim/V1/Mangle.hs view
@@ -8,6 +8,7 @@ import qualified Data.ByteString as B (null, ByteString) import Data.Maybe ( isJust, listToMaybe ) import Data.List ( sort, intercalate, nub )+import Safe ( headErr, tailErr ) import Darcs.Patch.Apply ( ObjectIdOfPatch ) import Darcs.Patch.FileHunk ( FileHunk(..), IsHunk(..) )@@ -102,9 +103,9 @@ where -- head and tail are safe here because all inner lists are infinite go n pps =- if any (isJust . head) pps+ if any (isJust . headErr) pps then n- else go (n + 1) $ map tail pps+ else go (n + 1) $ map tailErr pps -- | The chunk of defined lines starting at the given position (1-based). makeChunk :: Int -> Sealed FileState -> [B.ByteString]
src/Darcs/Patch/V1/Commute.hs view
@@ -31,6 +31,7 @@ import Control.Monad ( MonadPlus, mplus, msum, mzero, guard ) import Control.Applicative ( Alternative(..) ) import Data.Maybe ( fromMaybe )+import Safe ( headErr ) import Darcs.Patch.Apply ( ApplyState ) import Darcs.Patch.Commute ( selfCommuter )@@ -390,7 +391,7 @@ _ `iso` NilFL = True NilFL `iso` _ = False a `iso` (b:>:bs) =- head $ ([as `iso` bs | (ah :>: as) <- simpleHeadPermutationsFL a, IsEq <- [ah =\/= b]] :: [Bool]) ++ [False]+ headErr $ ([as `iso` bs | (ah :>: as) <- simpleHeadPermutationsFL a, IsEq <- [ah =\/= b]] :: [Bool]) ++ [False] -- | merger takes two patches, (which have been determined to conflict) and -- constructs a Merger patch to represent the conflict. @p1@ is considered to
src/Darcs/Repository/Clone.hs view
@@ -9,6 +9,7 @@ import qualified Data.ByteString.Char8 as BC import Data.List( intercalate ) import Data.Maybe( catMaybes )+import Safe ( tailErr ) import System.FilePath.Posix ( (</>) ) import System.Directory ( removeFile@@ -185,7 +186,7 @@ (if cloneKind == LazyClone then NoPatchIndex else usePatchIndex) useCache withPrefsTemplates debugMessage "Finished initializing new repository."- addRepoSource repourl NoDryRun setDefault inheritDefault+ addRepoSource repourl NoDryRun setDefault inheritDefault False debugMessage "Identifying remote repository..." fromRepo <- identifyRepositoryFor Reading _toRepo useCache repourl@@ -412,7 +413,7 @@ do ps <- readPatches toRepo let patches = patchSet2RL ps ppatches = progressRLShowTags "Copying patches" patches- (first, other) = splitAt (100 - 1) $ tail $ hashes patches+ (first, other) = splitAt (100 - 1) $ tailErr $ hashes patches speculate = [] : first : map (:[]) other mapM_ fetchAndSpeculate $ zip (hashes ppatches) (speculate ++ repeat []) where hashes :: forall wX wY . RL (PatchInfoAnd p) wX wY -> [PatchHash]
src/Darcs/Repository/PatchIndex.hs view
@@ -50,6 +50,8 @@ import qualified Data.Map as M import qualified Data.Set as S +import Safe ( tailErr )+ import System.Directory ( createDirectory , doesDirectoryExist@@ -750,7 +752,7 @@ let f :: FilePathSpan -> FilePathSpan -> Bool f (FpSpan _ x _) (FpSpan _ _ (Just y)) = x == y f _ _ = error "adj test of fpspans fail"- unless (and $ zipWith f spans (tail spans)) (fail $ "Adjcency test failed! fid: " ++ show fid)+ unless (and $ zipWith f spans (tailErr spans)) (fail $ "Adjcency test failed! fid: " ++ show fid) putStrLn "fpspans tests passed" -- test infomap
src/Darcs/Repository/Prefs.hs view
@@ -68,6 +68,7 @@ import qualified Control.Exception as C import qualified Data.ByteString as B ( empty, null, hPut, ByteString ) import qualified Data.ByteString.Char8 as BC ( unpack )+import Safe ( tailErr ) import System.Directory ( createDirectory , doesDirectoryExist@@ -100,7 +101,7 @@ ) import Darcs.Repository.Paths ( prefsDirPath ) import Darcs.Util.Lock( readTextFile, writeTextFile )-import Darcs.Util.Exception ( catchall, ifIOError )+import Darcs.Util.Exception ( catchall ) import Darcs.Util.Global ( darcsdir, debugMessage ) import Darcs.Util.Path ( AbsoluteOrRemotePath@@ -498,7 +499,7 @@ return $ case map snd $ filter ((== p) . fst) $ map (break (== ' ')) pl of [val] -> case words val of [] -> Nothing- _ -> Just $ tail val+ _ -> Just $ tailErr val _ -> Nothing setPrefval :: String -> String -> IO ()@@ -527,20 +528,33 @@ -> DryRun -> SetDefault -> InheritDefault+ -> Bool -> IO ()-addRepoSource r isDryRun setDefault inheritDefault =- ifIOError () $ do+addRepoSource r isDryRun setDefault inheritDefault isInteractive = (do olddef <- getDefaultRepo newdef <- newDefaultRepo- let shouldDoIt =- noSetDefault && isDryRun == NoDryRun && olddef /= Just newdef- when shouldDoIt $ setPreflist Defaultrepo [newdef]- addToPreflist Repos newdef+ let shouldDoIt = null noSetDefault && greenLight+ greenLight = shouldAct && olddef /= Just newdef+ -- the nuance here is that we should only notify when the reason we're not+ -- setting default is the --no-set-default flag, not the various automatic+ -- show stoppers+ if shouldDoIt+ then setPreflist Defaultrepo [newdef]+ else when (True `notElem` noSetDefault && greenLight && inheritDefault == NoInheritDefault) $+ putStr . unlines $ setDefaultMsg+ addToPreflist Repos newdef) `catchall` return () where- noSetDefault =- case setDefault of- NoSetDefault _ -> False- _ -> True+ shouldAct = isDryRun == NoDryRun+ noSetDefault = case setDefault of+ NoSetDefault x -> [x]+ _ -> []+ setDefaultMsg =+ [ "By the way, to change the default remote repository to"+ , " " ++ r ++ ","+ , "you can " +++ (if isInteractive then "quit now and " else "") +++ "issue the same command with the --set-default flag."+ ] newDefaultRepo :: IO String newDefaultRepo = case inheritDefault of YesInheritDefault -> getRemoteDefaultRepo
src/Darcs/UI/Commands/Convert/Darcs2.hs view
@@ -22,6 +22,7 @@ import Data.Char ( toLower ) import Data.Maybe ( catMaybes ) import Data.List ( lookup )+import Safe ( headErr ) import System.FilePath.Posix ( (</>) ) import System.Directory ( doesDirectoryExist, doesFileExist ) @@ -270,7 +271,7 @@ modifyRepoName :: String -> IO String modifyRepoName name =- if head name == '/'+ if headErr name == '/' then mrn name (-1) else do cwd <- getCurrentDirectory mrn (cwd ++ "/" ++ name) (-1)
src/Darcs/UI/Commands/Convert/Export.hs view
@@ -17,7 +17,12 @@ {-# LANGUAGE OverloadedStrings #-} -module Darcs.UI.Commands.Convert.Export ( convertExport ) where+module Darcs.UI.Commands.Convert.Export+ ( convertExport+ -- exported for testing+ , cleanPatchAuthor+ , cleanPatchAuthorTestCases+ ) where import Darcs.Prelude hiding ( readFile, lex ) @@ -313,29 +318,43 @@ -- john <john@home -> john <john@home> -- <john> -> john <unknown> patchAuthor :: (PatchInfoAnd p) x y -> String-patchAuthor p+patchAuthor = cleanPatchAuthor . piAuthor . info++cleanPatchAuthor :: String -> String+cleanPatchAuthor authorString | null author = unknownEmail "unknown" | otherwise = case span (/='<') author of -- No name, but have email (nothing spanned)- ("", email) -> case span (/='@') (tail email) of+ ("", _:email) -> case span (/='@') email of -- Not a real email address (no @). (n, "") -> case span (/='>') n of (name, _) -> unknownEmail name -- A "real" email address.- (user, rest) -> case span (/= '>') (tail rest) of+ (user, _:rest) -> case span (/= '>') rest of (dom, _) -> mkAuthor user $ emailPad (user ++ "@" ++ dom) -- No email (everything spanned) (_, "") -> case span (/='@') author of (n, "") -> unknownEmail n (name, _) -> mkAuthor name $ emailPad author -- Name and email- (n, rest) -> case span (/='>') $ tail rest of+ (n, _:rest) -> case span (/='>') rest of (email, _) -> n ++ emailPad email where- author = dropWhile isSpace $ piAuthor (info p)+ author = dropWhile isSpace authorString unknownEmail = flip mkAuthor "<unknown>" emailPad email = "<" ++ email ++ ">" mkAuthor name email = name ++ " " ++ email++cleanPatchAuthorTestCases :: [(String, String)]+cleanPatchAuthorTestCases =+ [ ("<john@home>", "john <john@home>")+ , ("john@home", "john <john@home>")+ , ("john <john@home>", "john <john@home>")+ , ("john <john@home", "john <john@home>")+ , ("<john>", "john <unknown>")+ , ("", "unknown <unknown>")+ , (" ", "unknown <unknown>")+ ] patchDate :: (PatchInfoAnd p) x y -> String patchDate = formatDateTime "%s +0000" . fromClockTime . toClockTime .
src/Darcs/UI/Commands/Convert/Import.hs view
@@ -36,6 +36,8 @@ import Data.Maybe (fromMaybe) import Data.Word (Word8) +import Safe (headErr, tailErr)+ import System.Directory (doesFileExist) import System.FilePath.Posix ((</>)) import System.IO (stdin)@@ -266,7 +268,7 @@ makeinfo author message tag = do let (name, log) = case unpackPSFromUTF8 message of "" -> ("Unnamed patch", [])- msg -> (head &&& tail) . lines $ msg+ msg -> (headErr &&& tailErr) . lines $ msg (author'', date'') = span (/='>') $ unpackPSFromUTF8 author date' = dropWhile (`notElem` ("0123456789" :: String)) date'' author' = author'' ++ ">"@@ -290,7 +292,7 @@ -- but only for blobs and excluding anything under _darcs -- * it also returns the resulting tree with _darcs filtered out updateHashes = do- let nodarcs = \(AnchoredPath xs) _ -> head xs /= darcsdirName+ let nodarcs = \(AnchoredPath xs) _ -> headErr xs /= darcsdirName hashblobs (File blob@(T.Blob con Nothing)) = do hash <- sha256 `fmap` readBlob blob return $ File (T.Blob con (Just hash))@@ -464,13 +466,11 @@ Unquoted uqNames -> do let spaceIndices = BC.elemIndices ' ' uqNames splitStr = second (BC.drop 1) . flip BC.splitAt uqNames- -- Reverse the components, so we find the longest- -- prefix existing name.- spaceComponents = reverse $ map splitStr spaceIndices- componentCount = length spaceComponents- if componentCount == 1- then return $ head spaceComponents- else do+ -- Reverse the components, so we find the longest+ -- prefix existing name.+ case reverse $ map splitStr spaceIndices of+ [component] -> return component+ spaceComponents -> do let dieMessage = unwords [ "Couldn't determine move/rename" , "source/destination filenames, with the"
src/Darcs/UI/Commands/Pull.hs view
@@ -29,6 +29,7 @@ import Control.Monad ( when, unless, (>=>) ) import Data.List ( nub ) import Data.Maybe ( fromMaybe )+import Safe ( headErr, tailErr ) import Darcs.UI.Commands ( DarcsCommand(..)@@ -273,8 +274,8 @@ O.NoDryRun -> "Pulling" in putInfo opts $ text pulling <+> "from" <+> hsep (map quoted repourls) <> "..." (Sealed them, Sealed compl) <- readRepos repository opts repourls- addRepoSource (head repourls) (dryRun ? opts)- (setDefault False opts) (O.inheritDefault ? opts)+ addRepoSource (headErr repourls) (dryRun ? opts)+ (setDefault False opts) (O.inheritDefault ? opts) (isInteractive True opts) mapM_ (addToPreflist Repos) repourls unless (quiet opts || hasXmlOutput opts) $ mapM_ showMotd repourls us <- readPatches repository@@ -354,7 +355,7 @@ return $ seal ps) us return $ case parseFlags O.repoCombinator opts of O.Intersection -> (patchSetIntersection rs, seal emptyPatchSet)- O.Complement -> (head rs, patchSetUnion $ tail rs)+ O.Complement -> (headErr rs, patchSetUnion $ tailErr rs) O.Union -> (patchSetUnion rs, seal emptyPatchSet) pullPatchSelOpts :: [DarcsFlag] -> S.PatchSelectionOptions
src/Darcs/UI/Commands/Push.hs view
@@ -199,7 +199,7 @@ in putInfo opts $ text pushing <+> "to" <+> quoted repodir <> "..." them <- identifyRepositoryFor Writing repository (useCache ? opts) repodir >>= readPatches addRepoSource repodir (dryRun ? opts) (setDefault False opts)- (O.inheritDefault ? opts)+ (O.inheritDefault ? opts) (isInteractive True opts) us <- readPatches repository common :> only_us <- return $ findCommonWithThem us them prePushChatter opts us (reverseFL only_us) them
src/Darcs/UI/Commands/Record.hs view
@@ -252,7 +252,12 @@ checkNameIsNotOption Nothing _ = return () checkNameIsNotOption _ False = return () checkNameIsNotOption (Just name) True =- when (length name == 1 || (length name == 2 && head name == '-')) $ do+ case name of+ [_] -> warnPatchName+ ('-':_) -> warnPatchName+ _ -> return ()+ where+ warnPatchName = do confirmed <- promptYorn $ "You specified " ++ show name ++ " as the patch name. Is that really what you want?" unless confirmed $ putStrLn "Okay, aborting the record." >> exitFailure
src/Darcs/UI/Commands/Replace.hs view
@@ -28,6 +28,7 @@ import Data.Char ( isAscii, isPrint, isSpace ) import Data.List.Ordered ( nubSort ) import Data.Maybe ( fromJust, isJust )+import Safe ( headErr, tailErr ) import Control.Monad ( unless, filterM, void, when ) import Darcs.Util.Tree( readBlob, modifyTree, findFile, TreeItem(..), Tree , makeBlobBS )@@ -253,9 +254,9 @@ | length t <= 2 = badTokenSpec $ "It must contain more than 2 characters, because it" ++ " should be enclosed in square brackets"- | head t /= '[' || last t /= ']' =+ | headErr t /= '[' || last t /= ']' = badTokenSpec "It should be enclosed in square brackets"- | '^' == head tok && length tok == 1 =+ | '^' == headErr tok && length tok == 1 = badTokenSpec "Must be at least one character in the complementary set" | any isSpace t = badTokenSpec "Space is not allowed"@@ -269,7 +270,7 @@ | not (isTok tok b) = badTokenSpec $ notAToken b | otherwise = return tok where- tok = init $ tail t :: String+ tok = init $ tailErr t :: String badTokenSpec msg = fail $ "Bad token spec: " ++ show t ++ " (" ++ msg ++ ")" spaceyToken x = x ++ " must not contain any space" notAToken x = x ++ " is not a token, according to your spec"
src/Darcs/UI/Commands/Send.hs view
@@ -215,7 +215,7 @@ repo <- identifyRepositoryFor Reading repository (useCache ? opts) repodir them <- readPatches repo addRepoSource repodir (dryRun ? opts) (setDefault False opts)- (O.inheritDefault ? opts)+ (O.inheritDefault ? opts) (isInteractive True opts) wtds <- decideOnBehavior opts (Just repo) sendToThem repository opts wtds repodir them sendCmd _ _ _ = error "impossible case"
src/Darcs/UI/Commands/ShowAuthors.hs view
@@ -22,7 +22,9 @@ import Control.Arrow ( (&&&), (***) ) import Data.Char ( toLower, isSpace ) import Data.Function ( on )-import Data.List ( isInfixOf, sortBy, groupBy, group, sort )+import Data.List ( isInfixOf, sortBy, sort )+import Data.List.NonEmpty ( group, groupBy )+import qualified Data.List.NonEmpty as NE import Data.Maybe( isJust ) import Data.Ord ( comparing ) import System.IO.Error ( catchIOError )@@ -132,13 +134,13 @@ reverse $ sortBy (comparing fst) . -- Combine duplicates from a list [(count, canonized name)] -- with duplicates canonized names (see next comment).- map ((sum *** head) . unzip) .+ map ((sum *** NE.head) . NE.unzip) . groupBy ((==) `on` snd) . sortBy (comparing snd) . -- Because it would take a long time to canonize "foo" into -- "foo <foo@bar.baz>" once per patch, the code below -- generates a list [(count, canonized name)].- map (length &&& (canonizeAuthor spellings . head)) .+ map (length &&& (canonizeAuthor spellings . NE.head)) . group $ sort authors canonizeAuthor :: [Spelling] -> String -> String
src/Darcs/UI/External.hs view
@@ -23,9 +23,7 @@ import Darcs.Prelude import Data.Maybe ( isJust )-#ifndef WIN32-import Data.Maybe ( isNothing, maybeToList )-#endif+import Safe ( tailErr ) import Control.Monad ( unless, when, filterM, void ) #ifndef WIN32 import Control.Monad ( liftM2 )@@ -113,17 +111,19 @@ searchPath [ "sendmail" ] ex <- findExecutable "sendmail"- when (isNothing ex && null l) $- fail $ "Cannot find the 'sendmail' program in " +++ case (ex, l) of+ (Just v, _) -> return v+ (_, v:_) -> return v+ _ -> fail $ "Cannot find the 'sendmail' program in " ++ orClauses ("your PATH" : searchPath) ++ "."- return $ head $ maybeToList ex ++ l #endif diffProgram :: IO String diffProgram = do l <- filterM (fmap isJust . findExecutable) [ "gdiff", "gnudiff", "diff" ]- when (null l) $ fail "Cannot find the \"diff\" program."- return $ head l+ case l of+ [] -> fail "Cannot find the \"diff\" program."+ v:_ -> return v -- |Get the name of the darcs executable (as supplied by @getExecutablePath@) darcsProgram :: IO String@@ -348,7 +348,7 @@ x /= BC.pack "-----BEGIN PGP SIGNED MESSAGE-----" && x /= BC.pack "-----BEGIN PGP SIGNED MESSAGE-----\r"- in unlinesPS $ map fix_line $ tail $ dropWhile not_begin_signature $ linesPS s+ in unlinesPS $ map fix_line $ tailErr $ dropWhile not_begin_signature $ linesPS s fix_line x | B.length x < 3 = x | BC.pack "- -" `B.isPrefixOf` x = B.drop 2 x | otherwise = x@@ -364,7 +364,7 @@ certdata <- opensslPS ["smime", "-pk7out"] s >>= opensslPS ["pkcs7", "-print_certs"] cruddy_pk <- opensslPS ["x509", "-pubkey"] certdata- let key_used = B.concat $ tail $+ let key_used = B.concat $ tailErr $ takeWhile (/= BC.pack"-----END PUBLIC KEY-----") $ linesPS cruddy_pk in do allowed_keys <- linesPS `fmap` B.readFile (toFilePath goodkeys)
src/Darcs/UI/Usage.hs view
@@ -10,6 +10,7 @@ import Darcs.Prelude import Data.Functor.Compose+import Safe ( headErr ) import System.Console.GetOpt( OptDescr(..), ArgDescr(..) ) import Darcs.UI.Options.All ( stdCmdActions ) import Darcs.UI.Commands@@ -35,7 +36,7 @@ (sameLen $ map last ls)) ds shortPadded = sameLen ss- prePad = replicate (3 + length (head shortPadded)) ' '+ prePad = replicate (3 + length (headErr shortPadded)) ' ' -- Similar to unlines (additional ',' and padding): unlines' = concatMap (\x -> x ++ ",\n" ++ prePad) -- Unchanged:
src/Darcs/Util/Diff/Patience.hs view
@@ -21,7 +21,6 @@ import Darcs.Prelude import Data.List ( sort )-import Data.Maybe ( fromJust ) import Data.Array.Unboxed import Data.Array.ST import Control.Monad.ST@@ -96,11 +95,14 @@ --Given a HunkMap, check collisions and return the line with an updated Map toHunk' :: HunkMap -> B.ByteString -> (Hunk, HunkMap)-toHunk' lmap bs | oldbs == Nothing || null oldhunkpair = insert hash bs lmap- | otherwise = (fst $ head oldhunkpair, lmap)- where hash = H.hash bs- oldbs = M.lookup hash (getMap lmap)- oldhunkpair = filter ((== bs) . snd) $ fromJust oldbs+toHunk' lmap bs =+ case M.lookup hash (getMap lmap) of+ Nothing -> insert hash bs lmap+ Just hunkpairs ->+ case filter ((== bs) . snd) hunkpairs of+ [] -> insert hash bs lmap+ (hunknumber, _):_ -> (hunknumber, lmap)+ where hash = H.hash bs listToHunk :: [B.ByteString] -> HunkMap -> ([Hunk], HunkMap) listToHunk [] hmap = ([], hmap)
src/Darcs/Util/Graph.hs view
@@ -43,6 +43,8 @@ import qualified Data.Vector.Unboxed as U import qualified Data.Vector.Unboxed.Mutable as MU +import Safe ( tailErr )+ import Darcs.Prelude -- | Vertices are represented as 'Int'.@@ -241,7 +243,7 @@ prop_connected :: Graph -> VertexSet -> Bool prop_connected g = not . any (prop_self_contained g) . proper_non_empty_subsets where- proper_non_empty_subsets = filter (not . null) . tail . powerset+ proper_non_empty_subsets = filter (not . null) . tailErr . powerset -- | Whether a 'VertexSet' is a connected component of the 'Graph'. prop_connected_component :: Component -> Bool
src/Darcs/Util/Lock.hs view
@@ -89,6 +89,8 @@ import GHC.IO.Encoding ( getFileSystemEncoding ) +import Safe ( headErr )+ import Darcs.Util.URL ( isRelative ) import Darcs.Util.Exception ( firstJustIO@@ -172,7 +174,7 @@ tempdirLoc :: IO FilePath tempdirLoc = fromJust <$>- firstJustIO [ fmap (Just . head . words) (readFile (darcsdir++"/prefs/tmpdir")) >>= chkdir,+ firstJustIO [ fmap (Just . headErr . words) (readFile (darcsdir++"/prefs/tmpdir")) >>= chkdir, lookupEnv "DARCS_TMPDIR" >>= chkdir, getTemporaryDirectory >>= chkdir . Just, getCurrentDirectorySansDarcs,
tests/issue1465_ortryrunning.sh view
@@ -33,26 +33,26 @@ import System.IO main = getArgs >>= \[name] -> writeFile name "fake" FAKE-ghc -o editor-good --make editor-good.hs+ghc $GHC_FLAGS -o editor-good --make editor-good.hs cat <<FAKE > editor-bad.hs import System.Exit main = exitWith (ExitFailure 127) FAKE-ghc -o editor-bad --make editor-bad.hs+ghc $GHC_FLAGS -o editor-bad --make editor-bad.hs cat <<FAKE > editor-gave-up.hs import System.Exit main = exitWith (ExitFailure 1) FAKE-ghc -o editor-gave-up --make editor-gave-up.hs+ghc $GHC_FLAGS -o editor-gave-up --make editor-gave-up.hs cat <<VI > vi.hs import System.Environment import System.IO main = getArgs >>= \[name] -> writeFile name "vi" VI-ghc -o vi --make vi.hs+ghc $GHC_FLAGS -o vi --make vi.hs cd R mkdir d
tests/issue189-external-merge-move.sh view
@@ -43,7 +43,7 @@ when (c2 /= "content2\n") exitFailure when (co /= "content\n") exitFailure EOF-ghc --make external_merge.hs+ghc $GHC_FLAGS --make external_merge.hs merge_tool=$(pwd)/external_merge # try to merge them with our external_merge script
+ tests/issue1898-set-default-notification.sh view
@@ -0,0 +1,51 @@+#!/usr/bin/env bash+## Test for issue1898 - set-default mechanism+##+## Copyright (C) 2010 Eric Kow+##+## Permission is hereby granted, free of charge, to any person+## obtaining a copy of this software and associated documentation+## files (the "Software"), to deal in the Software without+## restriction, including without limitation the rights to use, copy,+## modify, merge, publish, distribute, sublicense, and/or sell copies+## of the Software, and to permit persons to whom the Software is+## furnished to do so, subject to the following conditions:+##+## The above copyright notice and this permission notice shall be+## included in all copies or substantial portions of the Software.+##+## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,+## EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF+## MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND+## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS+## BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN+## ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN+## CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE+## SOFTWARE.++. lib # Load some portability helpers.+rm -rf R0 R1 R2 S # Another script may have left a mess.+darcs init --repo R0 # Create our test repos.++darcs get R0 R1+darcs get R0 R2+darcs get R0 S++cd S+# default to no-set-default+darcs push ../R1 > log+test R0 = $(cat _darcs/prefs/defaultrepo | xargs basename)+# notification when using no-set-default+grep -- "--set-default" log+# ...but not when --inherit-default is active+darcs push ../R1 --inherit-default > log+not grep -- "--set-default" log+# set-default works+darcs push ../R1 --set-default > log+test R1 = $(cat _darcs/prefs/defaultrepo | xargs basename)+# no notification when already using --set-default+not grep -- "--set-default" log+# no notification when already pushing to the default repo+darcs push > log+not grep -- "--set-default" log+cd ..
tests/issue2204-send-mail.sh view
@@ -33,7 +33,7 @@ import System.IO main = hGetContents stdin >>= writeFile "message" FAKE-ghc -o dummy-sendmail --make dummy-sendmail.hs+ghc $GHC_FLAGS -o dummy-sendmail --make dummy-sendmail.hs cd R echo 'foo@example.com' > _darcs/prefs/email
tests/latin9-input.sh view
@@ -132,7 +132,7 @@ str = B.pack [65,108,108,32,109,121,32,164,115,32,97,114,101,32,103,111,110,101] main = getArgs >>= \[x] -> B.writeFile x str FAKE-ghc --make -o editor editor.hs+ghc $GHC_FLAGS --make -o editor editor.hs export DARCS_EDITOR="`pwd`/editor" if echo $OS | not grep -i windows; then # issue2591 printf "y\ny\n" | darcs amend --edit -p 'Patch by '
tests/network/external.sh view
@@ -11,7 +11,7 @@ cat >$fakessh.hs <<EOF main = writeFile "touchedby_fakessh" "hello\n" EOF-ghc --make $fakessh.hs+ghc $GHC_FLAGS --make $fakessh.hs export DARCS_SSH=$fakessh export DARCS_SCP=$fakessh
+ tests/set-default-hint.sh view
@@ -0,0 +1,54 @@+#!/usr/bin/env bash+## Test that set-default hint messages are produced at the right times+##+## Copyright (C) 2011 Ganesh Sittampalam+##+## Permission is hereby granted, free of charge, to any person+## obtaining a copy of this software and associated documentation+## files (the "Software"), to deal in the Software without+## restriction, including without limitation the rights to use, copy,+## modify, merge, publish, distribute, sublicense, and/or sell copies+## of the Software, and to permit persons to whom the Software is+## furnished to do so, subject to the following conditions:+##+## The above copyright notice and this permission notice shall be+## included in all copies or substantial portions of the Software.+##+## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,+## EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF+## MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND+## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS+## BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN+## ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN+## CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE+## SOFTWARE.++. lib # Load some portability helpers.+rm -rf R1 R2 R3 # Another script may have left a mess.++darcs init --repo R1+darcs get R1 R2+darcs get R1 R3++HINTSTRING="issue the same command with the --set-default flag"++cd R3+for command in pull push send+do+ opt=+ test "$command" = "send" && opt=-O++ # R1 should be the default for R3+ darcs $command $opt ../R1 | not grep "$HINTSTRING"+ darcs $command $opt ../R2 | grep "$HINTSTRING"++ # can disable message on the command-line+ darcs $command $opt --no-set-default ../R2 | not grep "$HINTSTRING"++ # or using defaults+ echo "$command no-set-default" >> ../.darcs/defaults+ darcs $command $opt ../R2 | not grep "$HINTSTRING"++ darcs $command $opt --set-default ../R2 | not grep "$HINTSTRING"+ darcs $command $opt --set-default ../R1 | not grep "$HINTSTRING"+done
tests/test-untestable.sh view
@@ -38,7 +38,7 @@ when (n /= 0) (exitWith (ExitFailure n)) END -ghc --make -o runtest runtest.hs+ghc $GHC_FLAGS --make -o runtest runtest.hs export RUNTEST=`pwd`/runtest
tests/trackdown-bisect.sh view
@@ -13,7 +13,7 @@ fi cp $TESTBIN/trackdown-bisect-helper.hs .-ghc -o trackdown-bisect-helper trackdown-bisect-helper.hs+ghc $GHC_FLAGS -o trackdown-bisect-helper trackdown-bisect-helper.hs function make_repo_with_test { rm -fr temp1