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