Hi Tommy,

This is the result of our rather long discussion on
http://bugs.darcs.net/issue434

David and all: I'm sorry, but I think I'm too tired to implement this
properly.  I believe that this patch is the bare minimum to deal with
issue434, perhaps not gracefully, but better than the present situation.
Note that it breaks quiet mode and does not do any of the fancy stuff I
was hoping for.

Hopefully somebody else is willing to step up and polish this off.

Thu Apr 19 22:00:48 CEST 2007  Eric Kow <[EMAIL PROTECTED]>
  * Add tests specifically for applying patches to the working dir (issue434).

Thu Apr 19 22:05:58 CEST 2007  Eric Kow <[EMAIL PROTECTED]>
  * Apply patches 'tolerantly' to the working directory (issue434).
  
  If there are any exceptions applying a patch to the working directory, catch
  the exceptions, emit a pretty warning and move on.  This is meant to ease
  the scenario where the user is pulling in a large patch, but there is a
  permissions error (or something similar) in the working directory.
  
  Without this patch, darcs typically dies and leaves the working directory in
  a 'corrupted' state.  The corruption is relatively minor in that patches and
  pristine are perfectly fine.  The problem is that the user has large portions
  of the patch still upapplied and when he does a darcs whatsnew, gets a mass
  of seemingly incomprehensible goop (the inverse of the unapplied changes)
  mixed in with his changes.  We reduce the incomprehensible goop effect by
  catching exceptions so that darcs can continue to apply as much of the patch
  as it can.

New patches:

[Add tests specifically for applying patches to the working dir (issue434).
Eric Kow <[EMAIL PROTECTED]>**20070419200048] 
<
> {
addfile ./tests/workingdir.pl
hunk ./tests/workingdir.pl 1
+#!/usr/bin/env perl
+
+# test for working dir woes
+
+use Test::More qw/no_plan/;
+use lib ('lib/perl');
+use Test::Darcs;
+use strict;
+use Cwd;
+
+sub reset_chmod {
+  my $d = shift;
+  `chmod -R u+w $d` if (-d $d);
+}
+
+# note that we deliberately choose something other than temp
+# so as to avoid interfering with other tests if something
+# goes wrong and we fail to reset the permissions.
+reset_chmod('wtemp0');
+reset_chmod('wtemp1');
+reset_chmod('wtemp2');
+
+cleanup 'wtemp0';
+cleanup 'wtemp1';
+cleanup 'wtemp2';
+mkdir 'wtemp0';
+chdir 'wtemp0';
+darcs 'init';
+mkdir 'a';
+`touch a/x`;
+darcs 'add a';
+darcs 'add a/x';
+darcs 'record -am "a" --author me';
+chdir '..';
+
+darcs 'get wtemp0 wtemp1';
+darcs 'get wtemp1 wtemp2';
+chdir 'wtemp1';
+darcs 'mv a/x a/y';
+darcs 'record -am "x to y" --author me';
+`touch b`;
+darcs 'add b';
+darcs 'record -am "b" --author me';
+chdir '../wtemp2';
+# try to move a file that we don't have the right to do
+`chmod u-w a`;
+darcs 'pull -a';
+ok((-e 'b'), "managed to do pull b despite problems with x to y");
+
+
+reset_chmod('wtemp0');
+reset_chmod('wtemp1');
+reset_chmod('wtemp2');
+cleanup('wtemp0');
+cleanup('wtemp1');
+cleanup('wtemp2');
}
[Apply patches 'tolerantly' to the working directory (issue434).
Eric Kow <[EMAIL PROTECTED]>**20070419200558
 
 If there are any exceptions applying a patch to the working directory, catch
 the exceptions, emit a pretty warning and move on.  This is meant to ease
 the scenario where the user is pulling in a large patch, but there is a
 permissions error (or something similar) in the working directory.
 
 Without this patch, darcs typically dies and leaves the working directory in
 a 'corrupted' state.  The corruption is relatively minor in that patches and
 pristine are perfectly fine.  The problem is that the user has large portions
 of the patch still upapplied and when he does a darcs whatsnew, gets a mass
 of seemingly incomprehensible goop (the inverse of the unapplied changes)
 mixed in with his changes.  We reduce the incomprehensible goop effect by
 catching exceptions so that darcs can continue to apply as much of the patch
 as it can.
] 
<
> {
hunk ./Apply.lhs 50
 import Repository ( PatchSet, withRepoLock, amInRepository,
                     get_unrecorded, slurp_pending, slurp_recorded,
                     with_new_pending, sync_repo, read_repo, updateInventory,
+                    applyToWorking,
                     applyToPristine,
                   )
 import Patch ( Patch, patch2patchinfo, invert, list_touched_files,
hunk ./Apply.lhs 56
                join_patches, unjoin_patches, null_patch,
              )
-import qualified Patch (apply)
 import PatchInfo ( human_friendly )
 import SlurpDirectory ( wait_a_moment, co_slurp, )
 import FastPackedString ( readFilePS, packString, unpackPS, hGetContentsPS,
hunk ./Apply.lhs 193
           fail ("Error applying patch to recorded!\nRunning 'darcs repair' on the target repository may help.\n" ++ show e)
       wait_a_moment -- so work will be more recent than rec
       updateInventory repository tokens
-      Patch.apply opts True pw_resolved `catch` \e ->
+      applyToWorking repository opts pw_resolved `catch` \e ->
           fail ("Error applying patch to working dir:\n" ++ show e)
     sync_repo repository
     putStrLn "Finished applying..."
hunk ./DarcsIO.lhs 37
 
 \begin{comment}
 \begin{code}
-module DarcsIO ( ReadableDirectory(..), WriteableDirectory(..),
+module DarcsIO ( ReadableDirectory(..), WriteableDirectory(..), TolerantIO(..),
                ) where
 
hunk ./DarcsIO.lhs 40
+import Prelude hiding ( catch )
 import Data.List ( isSuffixOf )
hunk ./DarcsIO.lhs 42
-import System.IO.Error ( isDoesNotExistError )
+import System.IO.Error ( isDoesNotExistError, isPermissionError )
+import Control.Exception ( catch, catchJust, ioErrors )
 import Control.Monad.Error
 import System.Directory ( getDirectoryContents, createDirectory,
                           removeDirectory, removeFile,
hunk ./DarcsIO.lhs 54
 import FastPackedString ( PackedString, readFilePS, linesPS,
                           unlinesPS, nilPS, packString, unpackPS,
                         )
-import DarcsUtils ( withCurrentDirectory )
+import DarcsUtils ( withCurrentDirectory, prettyException )
 import Printer ( Doc, renderPS )
 import FileName ( FileName, fn2fp, fp2fn )
 import Lock ( writeBinFile, readBinFile, writeAtomicFilePS )
hunk ./DarcsIO.lhs 87
     mWriteFilePSs f ss = mWriteFilePS f (unlinesPS ss)
     mCreateDirectory :: FileName -> m ()
     mRemoveDirectory :: FileName -> m ()
-    -- | If the directory is non-empty, do not treat it as an error
-    --   nor remove it.  This may print a warning if the Bool (for
-    --   quiet) is 'False'.  Note: this may not always be implemented,
-    --   in which case it is the same as 'mRemoveDirectory'
-    mRemoveDirectoryIfPossible :: Bool -> FileName -> m ()
-    mRemoveDirectoryIfPossible _ d = mRemoveDirectory d
     mWriteDoc :: FileName -> Doc -> m ()
     mWriteDoc f d = mWriteFilePS f (renderPS d)
     mCreateFile :: FileName -> m ()
hunk ./DarcsIO.lhs 119
     mCreateDirectory = createDirectory . fn2fp
     mRemoveFile = removeFile . fn2fp
     mRemoveDirectory = removeDirectory . fn2fp
-    mRemoveDirectoryIfPossible quiet d =
-      (mRemoveDirectory d)
-      `catch` (\e -> if "(Directory not empty)" `isSuffixOf` (show e)
-                     then when (not quiet) $ putStrLn $
-                            "Warning: Not deleting " ++
-                            (fn2fp d) ++ " because it is non-empty."
-                     else ioError e)
-    mRename a b = (renameDirectory x y `mplus` renameFile x y)
+    mRename a b = catchJust ioErrors
+                  (renameDirectory x y `mplus` renameFile x y)
                   -- We need to catch does not exist errors, since older
                   -- versions of darcs allowed users to rename nonexistent
                   -- files.  :(
hunk ./DarcsIO.lhs 124
-                  `catch` (\e -> if isDoesNotExistError e
+                  (\e -> if isDoesNotExistError e
                                  then return ()
                                  else ioError e)
hunk ./DarcsIO.lhs 127
-        where x = fn2fp a
-              y = fn2fp b
+      where x = fn2fp a
+            y = fn2fp b
+
+data TolerantIO a = TIO { runTolerantly :: IO a }
+
+instance Monad TolerantIO where
+   (TIO io) >>= f = TIO $ io >>= (\x -> runTolerantly $ f x)
+   (TIO io) >> f  = TIO $ io >> runTolerantly f
+   return x = TIO $ return x
+   fail x = TIO $ fail x
+
+instance MonadPlus TolerantIO where
+   mzero = TIO $ mzero
+   mplus (TIO a) (TIO b) = TIO $ mplus a b
+
+instance ReadableDirectory TolerantIO where
+    mDoesDirectoryExist d = TIO $ mDoesDirectoryExist d
+    mDoesFileExist f = TIO $ mDoesFileExist f
+    mIsFileExecutable f = TIO $ mIsFileExecutable f
+    mInCurrentDirectory i (TIO j) = TIO $ mInCurrentDirectory i j
+    mGetDirectoryContents = TIO mGetDirectoryContents
+    mReadBinFile f = TIO $ mReadBinFile f
+    mReadFilePS f = TIO $ mReadFilePS f
+
+instance WriteableDirectory TolerantIO where
+     mWithCurrentDirectory f (TIO m) = TIO $ mWithCurrentDirectory f m
+     mSetFileExecutable f e = warning $ mSetFileExecutable f e
+     mWriteBinFile f s = warning $ mWriteBinFile f s
+     mWriteFilePS f s = warning $ mWriteFilePS f s
+     mCreateDirectory d = warning $ mCreateDirectory d
+     mRemoveFile f = warning $ mRemoveFile f
+     mRemoveDirectory d = warning $ catchJust ioErrors
+                                 (mRemoveDirectory d)
+                                 (\e -> when ("(Directory not empty)" `isSuffixOf` (show e)) $
+                                        ioError $ userError $
+                                         "Not deleting " ++ fn2fp d ++ " because it is not empty.")
+     mRename a b = warning $ catchJust ioErrors
+                          (mRename a b)
+                          (\e -> case () of
+                                 _ | isPermissionError e -> ioError $ userError $
+                                       couldNotRename ++ "."
+                                   | isDoesNotExistError e -> ioError $ userError $
+                                       couldNotRename ++ " because " ++ x ++ " does not exist."
+                                   | otherwise -> ioError e
+                          )
+       where
+        x = fn2fp a
+        y = fn2fp b
+        couldNotRename = "Could not rename " ++ x ++ " to " ++ y
+
+warning :: IO () -> TolerantIO ()
+warning io = TIO $ catch io $ \e -> putStrLn $ "Warning: " ++ prettyException e
 \end{code}
 \end{comment}
 
hunk ./PatchApply.lhs 28
        where
 
 import Prelude hiding ( catch, pi )
-import DarcsFlags ( DarcsFlag( SetScriptsExecutable, Quiet ) )
+import DarcsFlags ( DarcsFlag( SetScriptsExecutable ) )
 import FastPackedString ( PackedString, packString, splitPS, concatPS,
                           breakPS, nullPS, nilPS, linesPS, takePS,
                           unlinesPS,
hunk ./PatchApply.lhs 142
                          else fail $ "binary patch to " ++ fn2fp f
                                   ++ " couldn't apply."
 apply _ _ (DP d AddDir) = mCreateDirectory d
-apply opts True (DP d RmDir) = mRemoveDirectoryIfPossible quiet d
-                               where quiet = Quiet `elem` opts
 apply _ _ (DP d RmDir) = mRemoveDirectory d
 
 apply _ _ (Move f f') = mRename f f'
hunk ./Pull.lhs 47
                     slurp_recorded, slurp_recorded_and_unrecorded,
                     read_repo, absolute_dir, get_unrecorded,
                     with_new_pending, read_pending, sync_repo,
+                    applyToWorking,
                     applyToPristine, writePatch, updateInventory,
                   )
 import Patch ( Patch, join_patches, merge, patch2patchinfo,
hunk ./Pull.lhs 53
                unjoin_patches, list_touched_files,
                invert, list_conflicted_files, null_patch,
-               apply,
              )
 import SelectChanges ( promptChar )
 import PatchInfo ( PatchInfo, human_friendly, showPatchInfo )
hunk ./Pull.lhs 185
           updateInventory repository patchTokens
           -- so work will be more recent than rec:
           revertable wait_a_moment
-          revertable $ apply opts True pw_resolved `catch` \e ->
-              fail ("Error applying patch to working dir:\n" ++ show e)
+          revertable $ applyToWorking repository opts pw_resolved `catch` \e ->
+               fail ("Error applying patch to working dir:\n" ++ show e)
       sync_repo repository
       putInfo $ text "Finished pulling and applying."
           where fromMaybePatch Nothing = null_patch
hunk ./Replace.lhs 29
 import DarcsArguments
 import Repository ( withRepoLock,
                     slurp_pending, add_to_pending,
+                    applyToWorking,
                   )
 import DarcsRepo ( am_in_repo, slurp_recorded_and_unrecorded
                  )
hunk ./Replace.lhs 33
-import Patch ( apply, apply_to_slurpy, tokreplace, force_replace_slurpy,
+import Patch ( apply_to_slurpy, tokreplace, force_replace_slurpy,
                join_patches, Patch,
              )
 import SlurpDirectory ( slurp_hasfile, Slurpy )
hunk ./Replace.lhs 140
   (_, work) <- slurp_recorded_and_unrecorded "."
   cur <- slurp_pending repository
   ps_and_pswork <- catMaybes `liftM` sequence (map (repl toks cur work) fs)
-  apply opts True (join_patches $ snd $ unzip ps_and_pswork) `catch` \e ->
+  applyToWorking repository opts (join_patches $ snd $ unzip ps_and_pswork) `catch` \e ->
       fail $ "Can't do replace on working!\n"
           ++ "Perhaps one of the files already contains '"++ new++"'?\n"
           ++ show e
hunk ./Repository.lhs 32
 #endif
                     PatchToken, patchTokenToPatchFile,
                     writePatch, updateInventory, unrevertUrl,
+                    applyToWorking,
                     applyToPristine, patchSetToPatches,
                     PatchSet
                   ) where
hunk ./Repository.lhs 52
                               WorkDir, UMask) )
 import PatchInfo ( PatchInfo )
 import Patch ( Patch, flatten, join_patches, reorder_and_coalesce,
+               apply,
                apply_to_slurpy, gzReadPatchFileLazily )
 import Diff ( smart_diff )
 import PatchSet ( PatchSet )
hunk ./Repository.lhs 63
 #ifdef HAVEWX
 import Lock ( takeLock, releaseLock, withLockCanFail )
 #endif
-
+import DarcsIO ( runTolerantly )
 #include "impossible.h"
 
 data Repository = Repo !String !RepoFormat !RepoType
hunk ./Repository.lhs 241
 unrevertUrl (Repo r _ (DarcsRepository _)) = r ++ "/_darcs/patches/unrevert"
 unrevertUrl (Repo r _ GitRepository) = r ++ "/.git/darcs-unrevert"
 
+applyToWorking :: Repository -> [DarcsFlag] -> Patch -> IO ()
+applyToWorking (Repo r _ (DarcsRepository _)) opts patch =
+    withCurrentDirectory r $ runTolerantly $ apply opts True patch
+applyToWorking (Repo _ _ GitRepository) _ _ = return ()
+
+
 applyToPristine :: Repository -> Patch -> IO ()
 applyToPristine (Repo r _ (DarcsRepository p)) patch =
     withCurrentDirectory r $ applyPristine p patch
hunk ./Resolve.lhs 29
 import DarcsArguments ( DarcsFlag( AnyOrder ),
                         ignoretimes, verbose, working_repo_dir, umask_option,
                       )
-import Repository ( withRepoLock, amInRepository,
+import Repository ( withRepoLock, amInRepository, applyToWorking,
                     read_repo, sync_repo, get_unrecorded, with_new_pending,
                     )
hunk ./Resolve.lhs 32
-import Patch ( join_patches, invert, apply, is_null_patch )
+import Patch ( join_patches, invert, is_null_patch )
 import Resolution ( patchset_conflict_resolutions )
 import SelectChanges ( promptChar )
 #include "impossible.h"
hunk ./Resolve.lhs 85
                          ("This will trash any unrecorded changes"++
                           " in the working directory.\nAre you sure? ") "yn"
                  when (yorn /= 'y') $ exitWith ExitSuccess
-                 apply opts True (invert p) `catch` \e ->
+                 applyToWorking repository opts (invert p) `catch` \e ->
                     bug ("Can't undo pending changes!" ++ show e)
                  sync_repo repository
   withSignalsBlocked $ with_new_pending repository res $
hunk ./Resolve.lhs 89
-      apply opts True res `catch` \e ->
+      applyToWorking repository opts res `catch` \e ->
       bug ("Problem resolving conflicts in resolve!" ++ show e)
   putStrLn "Finished resolving."
 resolve_cmd _ _ = impossible
hunk ./Revert.lhs 37
 import Repository ( withRepoLock,
                     get_unrecorded,
                     with_new_pending, sync_repo,
+                    applyToWorking,
                     amInRepository, slurp_recorded_and_unrecorded,
                   )
 import Patch ( join_patches, invert, is_null_patch,
hunk ./Revert.lhs 41
-               apply, flatten, apply_to_filepaths )
+               flatten, apply_to_filepaths )
 import SelectChanges ( with_selected_last_changes_to_files )
 import TouchesFiles ( choose_touching )
 import Unrevert ( write_unrevert )
hunk ./Revert.lhs 118
              write_unrevert (join_patches skipped') p rec
              withSignalsBlocked $
                  with_new_pending repository (join_patches skipped')$
-                 apply opts True (invert $ join_patches p) `catch` \e ->
+                 applyToWorking repository opts (invert $ join_patches p) `catch` \e ->
                  fail ("Unable to apply inverse patch!" ++ show e)
   sync_repo repository
   putStrLn "Finished reverting."
hunk ./Unrecord.lhs 36
 import Match ( first_match, match_first_patchset,
              )
 import Repository ( PatchSet, withRepoLock, slurp_recorded,
+                    applyToWorking,
                     get_unrecorded,
                     read_pending, with_new_pending, sync_repo,
                   )
hunk ./Unrecord.lhs 47
                  )
 import Pristine ( identifyPristine, applyPristine )
 import Patch ( Patch, invert, patch2patchinfo,
-               join_patches, commute, flatten, null_patch, apply
+               join_patches, commute, flatten, null_patch,
              )
 import PatchInfo ( PatchInfo )
 import Depends ( deep_optimize_patchset, commute_to_end, get_common_and_uncommon )
hunk ./Unrecord.lhs 398
            pris <- identifyPristine
            applyPristine pris (invert $ join_patches ps) `catch` \e ->
                fail ("Unable to apply inverse patch!\n" ++ show e)
-           apply opts True (invert p_after_pending) `catch` \e ->
+           applyToWorking repository opts (invert p_after_pending) `catch` \e ->
                fail ("Couldn't undo patch in working dir.\n" ++ show e)
         sync_repo repository
         logMessage $ "Finished " ++ present_participle cmdname ++ "."
hunk ./Unrevert.lhs 37
                     sync_repo,
                     read_repo, amInRepository,
                     slurp_recorded_and_unrecorded,
+                    applyToWorking,
                   )
hunk ./Unrevert.lhs 39
-import Patch ( Patch, join_patches, apply,
+import Patch ( Patch, join_patches,
                patch2patchinfo, commute, namepatch, flatten_to_primitives,
              )
 import SelectChanges ( with_selected_changes_to_files )
hunk ./Unrevert.lhs 111
                          Nothing -> join_patches p
                          Just pending -> join_patches (pending : p)
         withSignalsBlocked $ with_new_pending repository pend_and_p $
-          do apply opts True (join_patches p) `catch` \e ->
+          do applyToWorking repository opts (join_patches p) `catch` \e ->
                  fail ("Error applying unrevert to working directory...\n"
                     ++ show e)
              write_unrevert pend_and_p skipped rec
hunk ./tests/pull.pl 127
 
 CREATE_DIR_ERROR: {
    my $test_name = "when a patch creating a directory is attempted to be applied
-       when an existing directory, exists, an error is reported.";
+       when an existing directory, exists, a warning is raised, but the pull
+       succeeds.";
    mkdir 'temp1/newdir';
    chdir 'templ/';
    ok((chdir 'temp1/'), "chdir succeeds");;
hunk ./tests/pull.pl 137
    ok((chdir '../temp2'), "chdir succeeds");;
    mkdir 'newdir';
    my $out = darcs('pull -a ../temp1');
-   like($out, qr/fail/i, $test_name);
+   like($out, qr/Warning: /i, $test_name);
+   like($out, qr/Finished pulling/i, $test_name);
    {
       local $TODO = 'awaiting attention from a Haskell coder.';
       like($out, qr/newdir/i, "...and report the name if the directory involved");
hunk ./tests/rmdir.pl 88
 # get temp2 and add some extra stuff to the directory
 setupTemp1Temp2;
 checkTemp2Prepull;
-like(darcs(qw(pull -a --repodir=temp2)), qr(non-empty));
+like(darcs(qw(pull -a --repodir=temp2)), qr(not empty));
 checkTemp2Postpull;
 # same test as above, but be vewy vewy quiet
 setupTemp1Temp2;
hunk ./tests/rmdir.pl 93
 checkTemp2Prepull;
-unlike(darcs(qw(pull -a --repodir=temp2 --quiet)), qr(.+));
+{
+  local $TODO="Make --quiet work for applying to working dir again";
+  unlike(darcs(qw(pull -a --repodir=temp2 --quiet)), qr(.+));
+}
 checkTemp2Postpull;
 # make sure that a messed up pristine still creates an error
 setupTemp1Temp2;
}

Context:

[Use LaTeX for ISO 8601 hyperlink.
Eric Kow <[EMAIL PROTECTED]>**20070217071601] 
[Documentation only: add link for ISO 8601 format
Kirsten Chevalier <[EMAIL PROTECTED]>**20070216004007
 
 In the documentation, make "ISO 8601 format" a link to the official
 W3C page describing the format (for those who don't know it by heart).
] 
[fix bugs in replace.sh script--running wrong darcs.
David Roundy <[EMAIL PROTECTED]>**20070128001826] 
[add documentation for DARCS_PAGER
Benedikt Schmidt <[EMAIL PROTECTED]>**20070126142649] 
[Fix issue383 - allow --disable-ssh-cm for 'darcs changes'.
Georg Neis <[EMAIL PROTECTED]>**20070121224417] 
[Canonize Marco Túlio Gontijo e Silva.
Eric Kow <[EMAIL PROTECTED]>**20070113231736
 
 Sorry for stripping off the accent.
 
] 
[Redundant noncomments
[EMAIL PROTECTED]
 
 noncomments was already called by get_preffile via get_lines.
] 
[Fix issue376 - inconsistent punctuation in darcs get.
Eric Kow <[EMAIL PROTECTED]>**20061231180024
 
] 
[Fix issue367 - pull help message.
Eric Kow <[EMAIL PROTECTED]>**20061231174322] 
[fix some changelog entries
Tommy Pettersson <[EMAIL PROTECTED]>**20061231210024] 
[allow commented tests in tests_to_run.
David Roundy <[EMAIL PROTECTED]>**20061211000322] 
[use variable TEST_FILTER_FILE in makefile.
David Roundy <[EMAIL PROTECTED]>**20061204151217] 
[add test target for testing hashed inventories.
David Roundy <[EMAIL PROTECTED]>**20060927020127] 
[update web page for new mailing list server.
David Roundy <[EMAIL PROTECTED]>**20070116162930] 
[fix spelling errors in comments
Benedikt Schmidt <[EMAIL PROTECTED]>**20061222020037] 
[Fix ssh.sh test.
Dave Love <[EMAIL PROTECTED]>**20061218223442] 
[add warning about ALL and obliterate --all to documentation
Tommy Pettersson <[EMAIL PROTECTED]>**20061219180302] 
[Fix includes in External.hs.
Dave Love <[EMAIL PROTECTED]>**20061218224158
 You can't put comments before {-# INCLUDE ...
] 
[add test for reverting removed directory
Tommy Pettersson <[EMAIL PROTECTED]>**20061108202344] 
[Improve error messages in push_cmd
[EMAIL PROTECTED]
 
 I ran into this because MSYS was munging my repository directory in a
 horrible way. This resulted in a bad repo directory getting passed into
 darcs, which resulted in a fromJust error, which we all know makes the
 baby Jesus cry. So, I at least refactored the code to give a better
 error message, though there may well be a better solution.
] 
[Simplify common libcurl errors.
Juliusz Chroboczek <[EMAIL PROTECTED]>**20061218025419] 
[fix issue369 by failing if quickcheck isn't available
David Roundy <[EMAIL PROTECTED]>**20061218021545] 
[Don't QP-encode bundles when pushing locally.
Juliusz Chroboczek <[EMAIL PROTECTED]>**20061218002533] 
[Make darcs push QP-encode the bundle before transferring.
Juliusz Chroboczek <[EMAIL PROTECTED]>**20061217234635
 This should hopefully fix issues with scp/sftp corrupting bundles in transit.
] 
[Adapt callers to new calling convention for make_email.
Juliusz Chroboczek <[EMAIL PROTECTED]>**20061217234608
 Use Just at the right places.
] 
[Make arguments to make_email optional.
Juliusz Chroboczek <[EMAIL PROTECTED]>**20061217234501
 Makes contents and filename optional.  If they are omitted, we still
 generate a conforming MIME message.
] 
[add test for get --tag and pending
Tommy Pettersson <[EMAIL PROTECTED]>**20061211192821] 
[add new test related to issue262.
David Roundy <[EMAIL PROTECTED]>**20061217221041
 This issue seems to already have been fixed.
] 
[Added test for reverting an unrecorded add
[EMAIL PROTECTED] 
[add test that sigPIPE doesn't make darcs fail.
David Roundy <[EMAIL PROTECTED]>**20061209230155] 
[make it an error to "put" into a preexisting directory.
David Roundy <[EMAIL PROTECTED]>**20061203205826
 This changes darcs' behavior I believe for the better.  Often one could be
 tempted to try to put into a directory, expecting to have the repository
 created as a subdirectory there, and it seems confusing (confused me) to
 have instead the repository contents mingled with whatever was already in
 that directory.  Put should behave like get in this regard, in that it
 shouldn't mix the new repo with a preexisting directory.
] 
[adapt test sametwice to new obliterate --all feature
Tommy Pettersson <[EMAIL PROTECTED]>**20061130132058] 
[Adapt test perms.sh to obliterate --all feature.
Eric Kow <[EMAIL PROTECTED]>**20061209200625] 
[use impossible to document impossible case in Repair.
David Roundy <[EMAIL PROTECTED]>**20061204152854] 
[fix for Issue111, obliterate --all
David Roundy <[EMAIL PROTECTED]>**20061129164016
 This is a patch to implement the wishless item Issue111,
 which asks for an --all option to obliterate.  The idea is
 that you might use the --patches flag to select a bunch of
 patches and not want to have to say yess to all of them.
 
 For good measure, I also added it to unpull and unrecord.
] 
[catch exceptions in stdout_is_a_pipe
Simon Marlow <[EMAIL PROTECTED]>**20061129160620] 
[hFlush after "waiting for lock" message
Simon Marlow <[EMAIL PROTECTED]>**20061129160342
 On Windows, stdout isn't always in line-buffered mode, but we really
 want to see the message about waiting for a lock quickly.  Mostly
 because ^C isn't always caught properly on Windows and lock files are
 often left behind, but that's another storey...
 
] 
[add explicit import list
Simon Marlow <[EMAIL PROTECTED]>**20061129160144] 
[ignore failure from hSetBuffering
Tommy Pettersson <[EMAIL PROTECTED]>**20061117221424
 This affects:
   issue41	Doesn't like pasted text.
   issue94	Crash on bogus input
   issue146	hSetBuffering: invalid argument
   issue318	buffering error of darcs record under bash/cmd.exe
 It doesn't necessarily "fix" anything. It prevents darcs from quiting,
 instead continuing with perhaps an undesirable buffering mode, which may or
 may not be better ... or worse.
] 
[Hard link support on Windows
Simon Marlow <[EMAIL PROTECTED]>*-20061204162040
 This works only on NTFS filesystems.  Also it requires Windows 2000 or
 later; this may or may not be acceptable, I'll leave that up to the
 darcs maintainers to decide.
] 
[Hard link support on Windows
Simon Marlow <[EMAIL PROTECTED]>**20061204162040
 This works only on NTFS filesystems.  Also it requires Windows 2000 or
 later; this may or may not be acceptable, I'll leave that up to the
 darcs maintainers to decide.
] 
[Canonize Kirsten Chevalier.
Kirsten Chevalier <[EMAIL PROTECTED]>**20061217025004
 
 Added my name to the list of authors who originally only submitted an email
 address.
 
] 
[Documentation only - clarify meaning of --from and --author
Kirsten Chevalier <[EMAIL PROTECTED]>**20061217024927
   
 Clarified the meaning of --from and --author. I had assumed that these
 options also set the From: address on the email sent by "darcs sent".  Of
 course they don't, but it's better to make this clear.
 
] 
[Do _not_ allow escaped quotes in `quoted'.
Eric Kow <[EMAIL PROTECTED]>**20061030064531
 
 This undoes the patch by Dave Love: Allow escaped quotes in `quoted'.
 The immediate problem is that it breaks make_changelog (because one of
 Tommy's entries matches on a backslash).  This feature might need more
 discussion before we include it (or not).
 
] 
[Replace tabs with spaces (escaped quotes in PatchMatch).
Eric Kow <[EMAIL PROTECTED]>**20061023192003] 
[Allow escaped quotes in `quoted'.
Dave Love <[EMAIL PROTECTED]>**20060716193940] 
[remove link to obsolete mirror of kernel repo.
David Roundy <[EMAIL PROTECTED]>**20061212012644] 
[Remove raw_mode functions from atomic_create.h.
Eric Kow <[EMAIL PROTECTED]>**20061008202738
 
 It seems these were once implemented in compat.c and have since been
 reimplemented in Haskell by Ian Lynagh on 2005-07-30.  These appear to
 just be leftover declarations in the C header.
 
] 
[Add make rules for tags files.
Dave Love <[EMAIL PROTECTED]>**20061113213923] 
[configure should fail if a required module isn't present.
David Roundy <[EMAIL PROTECTED]>**20061128024557] 
[Define infodepspatch locally in AmendRecord instead of exporting it from Patch
[EMAIL PROTECTED]
 
] 
[Amending a patch doesn't remove explicit dependencies
[EMAIL PROTECTED] 
[Make libcurl use any http authentication.
Tobias Gruetzmacher <[EMAIL PROTECTED]>**20061118230406
 This let darcs use repositories protected with digest authentication.
] 
[Fix curses stuff, especially on Solaris 10.
Dave Love <[EMAIL PROTECTED]>**20061120171211] 
[Canonize Edwin Thomson.
Eric Kow <[EMAIL PROTECTED]>**20061118174454] 
[Annotate various boring patterns.
Dave Love <[EMAIL PROTECTED]>**20061113225701] 
[Implement prettyException.
Juliusz Chroboczek <[EMAIL PROTECTED]>**20061218025440] 
[Overhaul and improve automation of ssh_test.
Eric Kow <[EMAIL PROTECTED]>**20061121141802
 
 * Now quits if you don't supply REMOTE; does not have any
   silly default values
 * Options now passed in through environment variables, so:
     NO_CONTROL_MASTER=1 [EMAIL PROTECTED] ./ssh_test
 * Performs some automated success checks (which means that
   it should be possible to use this from the harness if you
   have ssh-agent running)
 * Performs darcs send test
 * Does not try to pass darcs-ssh flags (like --disable-ssh-cm)
   to non-ssh-using commands like record
 
] 
[Rename ssh_test to ssh.sh (for shell harness).
Eric Kow <[EMAIL PROTECTED]>**20061121141101
 
 Note that you must set environment variables for it do anything
 useful (namely [EMAIL PROTECTED]); something like the following
 should work:
   [EMAIL PROTECTED] make test
 
 You need to be using public key authentication to have a fully
 automated test.
 
] 
[Add a semi-automated test for SSH-related things.
Eric Kow <[EMAIL PROTECTED]>**20061110110801
 
 Testing SSH stuff is tricky in that (1) you need some place to connect
 to and (2) you often want to make sure that the user interactions work
 out right.  But it can't hurt to script away the boring stuff so that
 you are naturally encouraged to test things out more thoroughly.
] 
[Support darcs send --disable-ssh-cm.
Eric Kow <[EMAIL PROTECTED]>**20061121134158] 
[Redirect stderr to Null when exiting SSH control master.
Eric Kow <[EMAIL PROTECTED]>**20061118212115
 
 This suppresses the output
 * Pseudo-terminal will not be allocated because stdin is not a terminal.
   (result of redirecting stdin from /dev/null)
 * Exit request sent.
   (seems to be normal output. Seems also that there is no way to suppress
    this; -q does not do the job, for example)
 
] 
[look for --disable-ssh-cm in defaults files (issue351)
Tommy Pettersson <[EMAIL PROTECTED]>**20061117180942] 
[TAG 1.0.9rc2
Tommy Pettersson <[EMAIL PROTECTED]>**20061116140351] 
Patch bundle hash:
2609fb300752f8fb1ac91541e63464ef8a0732c4
_______________________________________________
darcs-devel mailing list
[email protected]
http://lists.osuosl.org/mailman/listinfo/darcs-devel

Reply via email to