[prev in list] [next in list] [prev in thread] [next in thread] 

List:       darcs-devel
Subject:    [darcs-devel] [patch1602] three patches regarding replace command
From:       Ben Franksen <bugs () darcs ! net>
Date:       2017-09-23 19:41:45
Message-ID: 1506195705.14.0.58435954761.patch1602 () darcs ! net
[Download RAW message or body]

New submission from Ben Franksen <ben.franksen@online.de>:

Look at the patch descriptions for details...

----------
files: re_wrote-token-replace-code.dpatch
messages: 19666
nosy: bf
status: needs-screening
title: three patches regarding replace command

__________________________________
Darcs bug tracker <bugs@darcs.net>
<http://bugs.darcs.net/patch1602>
__________________________________
["re_wrote-token-replace-code.dpatch" (application/x-darcs-patch)]

3 patches for repository http://darcs.net/screened:

patch 5609da31165b937ec58402d1260de1341b412140
Author: Ben Franksen <benjamin.franksen@helmholtz-berlin.de>
Date:   Wed Sep 20 18:21:10 CEST 2017
  * re-wrote token replace code
  
  This is mostly optimization and one bug fix.
  
  The fix is that breakOutToken and therefore breakToTokens can no longer
  return empty tokens. This could happen before and led to crashes (endless
  loop consuming all available memory) when using --look-for-replaces.
  
  The optimization is for forceTokReplace and tryTokReplace. The idea is to
  minimize the number of ByteStrings that we have to re-concat when we are
  done, and so avoid needless copying and allocation. Instead of breaking up
  the input into an alternating list of tokens and non-tokens, we remember the
  original input and a current offset and increase only the offset whenever we
  skip over a non-matching token. In addition, forceTokReplace can use
  Data.ByteString.breakSubstring to efficiently find a match, since we don't
  have to check whether the new token is also found. The two functions can now
  efficiently operate on whole files, so we can avoid breaking (and later
  re-assembling) it into lines inside D.P.Prim.V1.
  

patch 44bfaa60a567615194315e175924e61a93f4a779
Author: Ben Franksen <benjamin.franksen@helmholtz-berlin.de>
Date:   Thu Sep 21 18:20:17 CEST 2017
  * resolve issue2208: replace detects existing force hunks in working
  
  It is wrong to check that we can apply the replace patch to the
  recorded+pending state. This is cared for by addToPending from D.R.State
  which commutes it past the diff between pending and working, pushing
  dependent hunks into pending, too.

patch dcda8f594ca3e4b578b4ae2355c3677e6d7cb006
Author: Ben Franksen <benjamin.franksen@helmholtz-berlin.de>
Date:   Thu Sep 21 18:29:13 CEST 2017
  * fixed error message in replace command
  
  If we cannot apply the replace (plus possible force replace hunks) to
  working then there is something seriously wrong, i.e. this would be a bug.

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256


New patches:

[re-wrote token replace code
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170920162110
 Ignore-this: 97dcc05a73ad999ff8048535df869c1a
 
 This is mostly optimization and one bug fix.
 
 The fix is that breakOutToken and therefore breakToTokens can no longer
 return empty tokens. This could happen before and led to crashes (endless
 loop consuming all available memory) when using --look-for-replaces.
 
 The optimization is for forceTokReplace and tryTokReplace. The idea is to
 minimize the number of ByteStrings that we have to re-concat when we are
 done, and so avoid needless copying and allocation. Instead of breaking up
 the input into an alternating list of tokens and non-tokens, we remember the
 original input and a current offset and increase only the offset whenever we
 skip over a non-matching token. In addition, forceTokReplace can use
 Data.ByteString.breakSubstring to efficiently find a match, since we don't
 have to check whether the new token is also found. The two functions can now
 efficiently operate on whole files, so we can avoid breaking (and later
 re-assembling) it into lines inside D.P.Prim.V1.
 
] hunk ./src/Darcs/Patch/Prim/V1/Apply.hs 19
- -import Darcs.Patch.TokenReplace ( tryTokInternal )
+import Darcs.Patch.TokenReplace ( tryTokReplace )
hunk ./src/Darcs/Patch/Prim/V1/Apply.hs 43
- -    apply (FP f (TokReplace t o n)) = mModifyFilePSs f doreplace
- -        where doreplace ls =
- -                  case mapM (tryTokInternal t (BC.pack o) (BC.pack n)) ls of
+    apply (FP f (TokReplace t o n)) = mModifyFilePS f doreplace
+        where doreplace fc =
+                  case tryTokReplace t (BC.pack o) (BC.pack n) fc of
hunk ./src/Darcs/Patch/Prim/V1/Apply.hs 48
- -                  Just ls' -> return $ map B.concat ls'
+                  Just fc' -> return fc'
hunk ./src/Darcs/Patch/Prim/V1/Commute.hs 16
- -import qualified Data.ByteString as B (ByteString, concat)
- -import qualified Data.ByteString.Char8 as BC (pack)
+import qualified Data.ByteString as B ( ByteString )
+import qualified Data.ByteString.Char8 as BC ( pack )
hunk ./src/Darcs/Patch/Prim/V1/Commute.hs 27
- -import Darcs.Patch.TokenReplace ( tryTokInternal )
+import Darcs.Patch.TokenReplace ( tryTokReplace )
hunk ./src/Darcs/Patch/Prim/V1/Commute.hs 188
- -    case tryTokReplace t o n old1 of
+    let po = BC.pack o; pn = BC.pack n in
+    case tryTokReplaces t po pn old1 of
hunk ./src/Darcs/Patch/Prim/V1/Commute.hs 192
- -      case tryTokReplace t o n new1 of
+      case tryTokReplaces t po pn new1 of
hunk ./src/Darcs/Patch/Prim/V1/Commute.hs 230
- -tryTokReplace :: String -> String -> String
- -                -> [B.ByteString] -> Maybe [B.ByteString]
- -tryTokReplace t o n =
- -  mapM (fmap B.concat . tryTokInternal t (BC.pack o) (BC.pack n))
+tryTokReplaces :: String -> B.ByteString -> B.ByteString
+               -> [B.ByteString] -> Maybe [B.ByteString]
+tryTokReplaces t o n = mapM (tryTokReplace t o n)
hunk ./src/Darcs/Patch/TokenReplace.hs 1
+{-# LANGUAGE CPP #-}
hunk ./src/Darcs/Patch/TokenReplace.hs 3
- -    (
- -      tryTokInternal
+    ( tryTokReplace
hunk ./src/Darcs/Patch/TokenReplace.hs 6
- -    , breakOutToken
hunk ./src/Darcs/Patch/TokenReplace.hs 15
- -import Data.Maybe ( isNothing )
- -
- -import Darcs.Util.ByteString ( substrPS, linesPS, unlinesPS )
+
hunk ./src/Darcs/Patch/TokenReplace.hs 18
- --- | breakOutToken takes a String of token chars and an input ByteString, and
- --- returns the ByteString triple of (beforeToken, token, afterToken).
+#include "impossible.h"
+
+-- | @breakOutToken tokChars input@ splits the @input@ 'ByteString' into
+-- @'Just' (before, token, after)@, where @token@ is the first non-empty
+-- substring consisting only of 'Char's in @tokChars@, or 'Nothing' if no token
+-- was found. The 'Char's in @tokChars@ should not have code points larger than
+-- 255 (0xff).
hunk ./src/Darcs/Patch/TokenReplace.hs 26
- -              -> (BC.ByteString, BC.ByteString, BC.ByteString)
- -breakOutToken tokChars input =
- -    let isTokChar = regChars tokChars
- -        (before, tokAndRest) = BC.break isTokChar input
- -        (tok, remaining) = BC.break (not . isTokChar) tokAndRest in
- -    (before, tok, remaining)
- -
- --- | tryTokInternal takes a String of token chars, an oldToken ByteString, a
- --- newToken ByteString and returns the list of token-delimited ByteStrings,
- --- with any tokens matching oldToken being replaced by newToken. If newToken is
- --- already in the input, we return Nothing.
- -tryTokInternal :: String -> B.ByteString -> B.ByteString -> B.ByteString
- -               -> Maybe [B.ByteString]
- -tryTokInternal _ oldToken newToken input
- -  | isNothing (substrPS oldToken input) &&
- -    isNothing (substrPS newToken input) = Just [ input ]
- -tryTokInternal tokChars oldToken newToken input =
- -    let (before, tok, remaining) = breakOutToken tokChars input in
- -    case tryTokInternal tokChars oldToken newToken remaining of
- -        Nothing -> Nothing
- -        Just rest | tok == oldToken -> Just $ before : newToken : rest
- -                  | tok == newToken -> Nothing
- -                  | otherwise -> Just $ before : tok : rest
- -
- --- | forceTokReplace replaces all occurrences of the old token with the new
- --- token, throughout the input ByteString.
- -forceTokReplace :: String -> B.ByteString -> B.ByteString -> B.ByteString
- -                -> B.ByteString
- -forceTokReplace tokChars oldToken newToken = forceReplaceLines
+              -> Maybe (BC.ByteString, BC.ByteString, BC.ByteString)
+breakOutToken tokChars input
+  | not (B.null tok) = Just (before, tok, remaining)
+  | otherwise = Nothing
hunk ./src/Darcs/Patch/TokenReplace.hs 31
- -    forceReplaceLines = unlinesPS . map forceReplace . linesPS
- -    breakOutAllTokens input | B.null input = []
- -    breakOutAllTokens input =
- -        let (before, tok, remaining) = breakOutToken tokChars input in
- -        before : tok : breakOutAllTokens remaining
- -
- -    forceReplace = B.concat . map replaceMatchingToken . breakOutAllTokens
- -
- -    replaceMatchingToken input | input == oldToken = newToken
- -                               | otherwise = input
- -
+    isTokChar = regChars tokChars
+    (before, tokAndRest) = BC.break isTokChar input
+    (tok, remaining) = BC.break (not . isTokChar) tokAndRest
+
+-- | @tryTokReplace tokChars old new input@ tries to find the token @old@ and
+-- replace it with the token @new@ everywhere in the @input@, returning 'Just'
+-- the modified @input@, unless the token @new@ is already in the @input@ in
+-- which case 'Nothing' is returned. A token is a sequence of bytes that match
+-- the class defined by @tokChars@. This function is supposed to work
+-- efficiently with large @input@s i.e. whole files.
+tryTokReplace :: String -> B.ByteString -> B.ByteString
+              -> B.ByteString -> Maybe B.ByteString
+tryTokReplace tokChars old new
+  | B.null old = bug "tryTokInternal called with empty old token"
+  | BC.any (not . isTokChar) old = bug "tryTokInternal called with old non-token"
+  | BC.any (not . isTokChar) new = bug "tryTokInternal called with new non-token"
+  | otherwise = fmap B.concat . loop 0
+    where
+      isTokChar = regChars tokChars
+      loop !from input =
+        case BC.findIndex isTokChar (B.drop from input) of
+          Nothing -> Just [input]
+          Just start ->
+            case BC.span isTokChar (B.drop (from + start) input) of
+              (tok, rest)
+                | tok == old ->
+                    (B.take (from + start) input :).(new :) <$> loop 0 rest
+                | tok == new -> Nothing
+                | otherwise ->
+                    loop (from + start + B.length tok) input
+
+-- | @forceTokReplace tokChars old new input@ replaces all occurrences of
+-- the @old@ token with the @new@ one, throughout the @input@.
+forceTokReplace :: String -> B.ByteString -> B.ByteString
+                -> B.ByteString -> B.ByteString
+forceTokReplace tokChars old new
+  | B.null old = bug "tryTokInternal called with empty old token"
+  | BC.any (not . isTokChar) old = bug "tryTokInternal called with old non-token"
+  | BC.any (not . isTokChar) new = bug "tryTokInternal called with new non-token"
+  | otherwise = B.concat . loop 0
+    where
+      isTokChar = regChars tokChars
+      len = B.length old
+      loop !from input =
+        case B.breakSubstring old (B.drop from input) of
+          (before, match)
+            | B.null match -> [input] -- not found
+            | B.null before || not (isTokChar (BC.last before))
+            , B.length match == len || not (isTokChar (BC.index match len)) ->
+                -- found and is token
+                B.take (from + B.length before) input : new :
+                  loop 0 (B.drop len match)
+            | otherwise ->
+                -- found but not a token
+                loop (from + B.length before + len) input
+
+-- | Check if a token replace operation touches the given line.
hunk ./src/Darcs/Patch/TokenReplace.hs 89
- -annotateReplace tokChars oldToken newToken input =
- -    let (before, tok, remaining) = breakOutToken tokChars input in
- -    not (B.null before && B.null tok) &&
- -       (tok == oldToken || annotateReplace tokChars oldToken newToken remaining)
- -
- --- break a single bytestring into tokens
+annotateReplace tokChars old new input =
+  case breakOutToken tokChars input of
+    Just (_, tok, remaining) ->
+      (tok == old || annotateReplace tokChars old new remaining)
+    Nothing -> False
+
+-- | Break a 'Bytestring' into tokens, according to 'defaultToks',
+-- discarding non-tokens.
hunk ./src/Darcs/Patch/TokenReplace.hs 98
- -breakToTokens input | B.null input = []
hunk ./src/Darcs/Patch/TokenReplace.hs 99
- -  let (_, tok, remaining) = breakOutToken defaultToks input in
- -    tok : breakToTokens remaining
+  case breakOutToken defaultToks input of
+    Nothing -> []
+    Just (_, tok, remaining) -> tok : breakToTokens remaining

[resolve issue2208: replace detects existing force hunks in working
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170921162017
 Ignore-this: fe088d2c251ecdbbed326944dac5f740
 
 It is wrong to check that we can apply the replace patch to the
 recorded+pending state. This is cared for by addToPending from D.R.State
 which commutes it past the diff between pending and working, pushing
 dependent hunks into pending, too.
] move ./tests/failing-issue2208-replace-fails-with-resolving-unrecorded-change.sh \
./tests/issue2208-replace-fails-with-resolving-unrecorded-change.sh hunk \
                ./src/Darcs/UI/Commands/Replace.hs 57
- -    , readRecordedAndPending
hunk ./src/Darcs/UI/Commands/Replace.hs 179
- -        pending <- readRecordedAndPending repository
hunk ./src/Darcs/UI/Commands/Replace.hs 181
- -            mapM (doReplace toks pending working) files
+            mapM (doReplace toks working) files
+        -- Note: addToPending takes care of commuting the replace patch and
+        -- everything it depends on past the diff between pending and working
hunk ./src/Darcs/UI/Commands/Replace.hs 200
- -              ApplyState prim ~ Tree) => String -> Tree IO -> Tree IO
+              ApplyState prim ~ Tree) => String -> Tree IO
hunk ./src/Darcs/UI/Commands/Replace.hs 202
- -    doReplace toks pend work f = do
- -        let maybeReplace p = isJust <$> maybeApplyToTree replacePatch p
- -        workReplaced <- maybeReplace work
- -        pendReplaced <- maybeReplace pend
- -        if workReplaced && pendReplaced
- -            then return $ joinGap (:>:) (freeGap replacePatch) gapNilFL
- -            else if O.forceReplace ? opts
- -                then getForceReplace f toks work
- -                else putStrLn existsMsg >> return gapNilFL
+    doReplace toks work f = do
+        workReplaced <- maybeApplyToTree replacePatch work
+        case workReplaced of
+          Just _ -> do
+            return $ joinGap (:>:) (freeGap replacePatch) gapNilFL
+          Nothing
+            | O.forceReplace ? opts -> getForceReplace f toks work
+            | otherwise -> putStrLn existsMsg >> return gapNilFL
hunk ./src/Darcs/UI/Commands/Replace.hs 211
- -        existsMsg = "Skipping file '" ++ fp ++ "'\nPerhaps the recorded"
+        existsMsg = "Skipping file '" ++ fp ++ "'\nPerhaps the working"
hunk ./tests/issue2208-replace-fails-with-resolving-unrecorded-change.sh 45
- -# We can get around this by recording, then replacing and amending the patch...
- -darcs rec -am "I don't want to have to record this!"
+cat <<EOF > ../expected
+hunk ./testing 1
+-foo
++baz
+replace ./testing [A-Za-z_0-9] bar foo
+EOF
hunk ./tests/issue2208-replace-fails-with-resolving-unrecorded-change.sh 52
- -darcs replace bar foo testing
+darcs whatsnew > ../actual
hunk ./tests/issue2208-replace-fails-with-resolving-unrecorded-change.sh 54
- -echo y | darcs amend -a
+cd ..
hunk ./tests/issue2208-replace-fails-with-resolving-unrecorded-change.sh 56
- -# Check the workaround succeeded.
- -darcs changes --last 1 -v | grep 'replace.*bar.*foo'
+diff actual expected

[fixed error message in replace command
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170921162913
 Ignore-this: f6d0bea70e7cd0bfb1502cc7629bb83
 
 If we cannot apply the replace (plus possible force replace hunks) to
 working then there is something seriously wrong, i.e. this would be a bug.
] hunk ./src/Darcs/UI/Commands/Replace.hs 186
- -            fail $ "Can't do replace on working!\n"
- -                   ++ "Perhaps one of the files already" ++ " contains '"
- -                   ++ new ++ "'?\n"
- -                   ++ show e
+            bug $ "Can't do replace on working!\n" ++ show e

Context:

[improve efficiency of annotate
Ben Franksen <ben.franksen@online.de>**20170428145539
 Ignore-this: 1c0aa3f5e4e3b970bbaf579263b7a435
 
 The patch index makes finding the relevant patches quite efficient, but when
 a patch contains many hunks, the previous implementation took a very long
 time to finish. This was because it naively applied every hunk and then used
 diff to see which lines were changed.
 
 The new implementation directly observes the effect of patches on the
 Annotated structure using the new Annotate patch interface (type class).
 This also makes attribution of lines to patches more accurate, since the
 result no longer depends on the diff algorithm that annotate used
 internally.
] 
[plugging memory leak in annotate
Ben Franksen <ben.franksen@online.de>**20170427163813
 Ignore-this: 5b62d4833f8586566e5fafa8d572453a
] 
[fixed crash when annotate gets a single invalid filename
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170426162814
 Ignore-this: 730c993b7355eedb8a78ae590c13dad0
] 
[get rid of almost all flag list hacking
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170329210440
 Ignore-this: eb2f438db9a901e51e7e1e73f80499ef
 
 The only command where this was highly non-trivial was whatsnew. For the
 others, a few simple refactorings in the option definitions made the changes
 quite mechanical. For instance, I have changed options where the user code
 (the command implementations, mostly) had to supply a default, with separate
 options (e.g. conficts -> conflictsYes, conflictsNo). This makes it clearer
 which commands have which defaults and makes it less probable to
 accidentally use one default for the options definition and another one for
 parsing the option.
 
 The remaining few cases are those where we need to do processing of the raw
 flag list: the match option hack for init (--to-match is converted to
 --match), and the WorkRepo and NewRepo flags. My plan for removing these is:
 (1) change definition of the matching options darcs init takes, and
 (2) but IO into DarcsOptDescr, so we can do the needed processing on
 options, rather than the raw flag list
] 
[refactor: replace all trivial functions in D.UI.Flags with re-exports
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170328193550
 Ignore-this: e4a09fa82809381af19488194faa7bad
 
 This is a big patch but the changes are mostly trivial. Darcs.UI.Flags
 contained many functions that just extract the value of a primitive option.
 In many cases the functionality was exported under a name that slightly
 differed from the name of the option. All of these functions have been
 removed and replaced with re-exports of options from Dacs.UI.Options.All. In
 some cases the renaming was done in the other direction, i.e. the option was
 renamed to what the function in D...Flags was called.
 
 Re-exporting the options was done because the change is already large enough
 and also for convenience (moving explicitly imported names from one module
 to another for all the many commands is really tedious).
 
 The new (?) operator synonym for parseFlag was used heavily to adapt the
 command implementations.
 
 In a few places I cleaned up legacy code e.g. use putInfo and putVerbose.
] 
[renamed option xmloutput to xmlOutput
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170328133954
 Ignore-this: 4765a2c2cca845048a8f6288b12ee048
] 
[cleaned up pull command
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170328124002
 Ignore-this: 1fe0d978fead28f5fd3c77182d387d4c
 - removed explicit flag list manipulation
 - use verbose, xmlOutput, putVerbose, etc
 - avoid excessively long type signatures for option definitions
] 
[renamed hasXmlOutput to xmlOutput, hasXmlOutput returns Bool
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170328115856
 Ignore-this: 885baeca7863780bbcc1681265690f3e
] 
[rename (amQuiet,amVerbose) to (quiet,verbose), move to D.UI.Flags, and export
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170328114940
 Ignore-this: c7d870eab25ff2394e32dfec6bc44fd9
] 
[refactored shell completion support
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170326210826
 Ignore-this: 140351c8fb04325c4e4f41e7056bf187
 
 - moved listFiles, listRegisteredFiles, listUnregisteredFiles
   from Darcs.Repository to their own module Darcs.UI.Completion
 - renamed them to fileArgs, knownFileArgs, unknownFileArgs
 - added to that module: noArgs and prefArgs
 - import and use these functions for commandGetArgPossibilities
 - renamed this record member to commandCompleteArgs
 - added the full command line info as extra arguments to
   this member, same as for commandCommand
 - re-implemented completion support functions to take difference
   between original cwd and repo path into account
 - incomplete: also take flags and args that are already on the
   command line into account; currently only used for --boring by
   unknownFileArgs; more are planned
 - re-implemented the only remaining (unrelated) use of listFiles in
   Darcs.UI.Command.Util
 - factored expandDirs (which used listFiles) and doesDirectoryReallyExist
   (which is called by expandDirs) from add command to Util
   since it is shared by remove command 
 - use fileArgs for apply and rebase apply instead of noArgs
 - use knownFileArgs for replace command (planned: do this only after the
   two other args have been given)
 - some small things I may have forgotten
] 
[refactored repair/check command
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170323134402
 Ignore-this: ea635b0b788dac9d2b8f21e5b8e61763
 
 - remove explicit manipulations of flag list
 - remove useless dryRun and umask options from check
 - revert check back to a normal (hidden) command but re-use code where
   appropriate
 - make option definitions local to command definitions unless shared between
   commands (avoids type signatures that are useless and detrimental to
   refactorings)
 - cleanup of code layout, including import and export lists
] 
[show repo: fixed excessively borked code indentation
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170323094046
 Ignore-this: 918ea2104ad27711059d09430118efd6
] 
[show repo: removed --files option, removed manual flags parsing
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170323092407
 Ignore-this: f8e1c85a7934aa5158ba32f3ed39c0bf
 
 The --files option was abused to enable additional output of number of
 patches and weak hash. This is completely obscure, since --files gives no
 hint at all as to what effect it has here. The two extra lines are now
 printed unconditionally.
] 
[add patch index status to show repo command
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170319201535
 Ignore-this: 89ee9bebfec64707f2d29f96d061f655
] 
[refactor: add data type for hook options
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170320005236
 Ignore-this: 9e453de94af77090f482aa18ec19beed
 
 This patch is quite simple despite touching many files.
] 
[refactor: move usage and help related functions from Darcs.UI.Commands to \
Darcs.UI.Usage Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170322183559
 Ignore-this: d55631f6578fe3e23cb383213c2b6e63
] 
[refactor: moved printDryRunMessageAndExit from Darcs.UI.Commands to \
Darcs.UI.Commands.Util Ben Franksen \
<benjamin.franksen@helmholtz-berlin.de>**20170322183500  Ignore-this: \
d00a235861f0c1f155b53371eabeb7fa ] 
[refactor: help and usage formatting cleanup
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170322105017
 Ignore-this: 92d8bca3e5c3bfd0214d77e76f601009
 
 The main change here is to use Doc for formatting since it has all the
 features we need and was designed for just that kind of task. This needs the
 recent fix in vsep to avoid too many empty lines in the output.
] 
[remove umask and update_working parameters from withRepoLockCanFail
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170319202004
 Ignore-this: 9fad7aff5a00ba0b8a760a3d36f7e67a
 
 This entry point is currently only used for attemptCreatePatchIndex. I added
 documentation to withRepoLockCanFail that makes it clear that neither
 pending nor pending.tentative should be touched by the job, making the call
 to revertRepositoryChanges unnecessary.
 
 BTW, the passed umask setting was a fake anyway: of both commands
 that use withRepoLockCanFail (log and annotate), none actually has the
 --umask switch (and rightly so, since the user doesn't expect them to write
 any files) so we always get the default NoUMask.
] 
[Fix 'optimize <subcommand> --list-options'
Gian Piero Carrubba <gpiero@rm-rf.it>**20170308120357
 Ignore-this: e69e8e0d23aca84011970cae826ab62d
 erroring out with 'darcs: Prelude.undefined' message
] 
[resolve issue2526: actually consider boring option in D.UI.Flags.diffingOpts
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20170315160845
 Ignore-this: 6c43ca467a60bbe35785b5a4ac4ab9ea
] 
[resolve issue2512: author name is written to repository after multiple-choice prompt
Stephan-A. Posselt <dev-darcs@nimbrium.net>**20161018173325
 Ignore-this: fc7a73a454d35b9b70bc84ee9a924b2c
] 
[added regression test for issue2512
Stephan-A. Posselt <dev-darcs@nimbrium.net>**20161018172504
 Ignore-this: df19775bf8a02796f1aa3e66f42efbd6
] 
[introduce withOldRepoLock, reduce code specific to old-fashioned repos
Guillaume Hoffmann <guillaumh@gmail.com>**20160929213157
 Ignore-this: 6fb77b508088324804d664d79bb83aeb
] 
[rename Darcs.Repository.Internal to Darcs.Repository.Identify
Guillaume Hoffmann <guillaumh@gmail.com>**20160927160123
 Ignore-this: 32c335d198aeb5e6c627140b6a5b8404
] 
[move hashed related functions from Internal to Hashed
Guillaume Hoffmann <guillaumh@gmail.com>**20160927154618
 Ignore-this: f51fe4f258991342f7b9a3f399246cfa
] 
[move repoPatchType from Internal to InternalTypes
Guillaume Hoffmann <guillaumh@gmail.com>**20160926201713
 Ignore-this: b1332e7f77f25e2b64e57e810829fbae
] 
[create Repository.Working
Guillaume Hoffmann <guillaumh@gmail.com>**20160926201137
 Ignore-this: 91b4ec7f4e64e4397a049162e6539e95
] 
[move merge related functions from Internal to Merge
Guillaume Hoffmann <guillaumh@gmail.com>**20160926183320
 Ignore-this: 375e38c09059097fbb788dab225c6abf
] 
[move pending related functions from Internal to Pending
Guillaume Hoffmann <guillaumh@gmail.com>**20160926182908
 Ignore-this: bc9f126db6710ad5e7d8706af945cda7
] 
[rename Darcs.Repository.HashedRepo to Darcs.Repository.Hashed
Guillaume Hoffmann <guillaumh@gmail.com>**20160926154145
 Ignore-this: 1a7fb8f0a4cb85aa8edbc47efb71ca5f
] 
[merge Motd module into Prefs
Guillaume Hoffmann <guillaumh@gmail.com>**20160916215341
 Ignore-this: 9b21ecde946e232720f002e0958e3818
] 
[resolve issue2498: unconditionally use the Haskell HTTP package
Ganesh Sittampalam <ganesh@earth.li>**20160901225222
 Ignore-this: 907b6d2ea2dcc72a2aa5a02d89574ccd
 
 The buildable: False line in the library section was causing problems
 with GHC 8.0 (https://github.com/haskell/cabal/issues/3742), and
 in reality there's no value in being able to turn HTTP off.
 
] 
[resolve issue2496: improve output of darcs whatsnew with file arguments
Ben Franksen <benjamin.franksen@helmholtz-berlin.de>**20160505183910
 Ignore-this: ec14871d3cce595370792f7b52be5f7a
] 
[TAG 2.12.0
Guillaume Hoffmann <guillaumh@gmail.com>**20160429142058
 Ignore-this: 5c8cbe0424942686a2168f9e6fd8e35d
] 
Patch bundle hash:
5e8a59ba44ef22331906b1015238a378b92951d7
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iF4EAREIAAYFAlnGuh4ACgkQ025FMW5YzJf8RgD/VARznMT4eiEZNnKxkP68UQ8r
Ckabb02ikrFiBU7GaSgA/3+OKCvu/rqSJczSSntAyUj/z0ys/LaUiCYfcZYtKKbF
=x3r2
-----END PGP SIGNATURE-----



_______________________________________________
darcs-devel mailing list
darcs-devel@osuosl.org
https://lists.osuosl.org/mailman/listinfo/darcs-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic