This patch sequence (which is a superset of the previous ones) adds
a new "query gfi" command, which exports a repository to GIT,
via git-fast-import ("gfi").  A facility for flexible tag translation
is included.

The exporter is reasonably fast; it is possible to convert the
entire GHC repository in a few minutes.  The exporter is rather
stupid, but it's better than nothing.  I've got a few ideas
regarding multiple branches and incremental conversion, but
I don't need this functionality at the moment.

Sun Mar 25 18:03:43 CEST 2007  Florian Weimer <[EMAIL PROTECTED]>
  * Implement PatchInfo.pi_tag

Sun Mar 25 19:00:19 CEST 2007  Florian Weimer <[EMAIL PROTECTED]>
  * Include the query commands in the manual

Sun Mar 25 19:06:17 CEST 2007  Florian Weimer <[EMAIL PROTECTED]>
  * Add the query tags command

Sun Mar 25 19:12:47 CEST 2007  Florian Weimer <[EMAIL PROTECTED]>
  * Mention the query tags command in the tag documentation

Sun Mar 25 21:37:47 CEST 2007  Florian Weimer <[EMAIL PROTECTED]>
  * Implement the query gfi command

New patches:

[Implement PatchInfo.pi_tag
Florian Weimer <[EMAIL PROTECTED]>**20070325160343] {
hunk ./PatchInfo.lhs 23
-                   pi_author, showPatchInfo,
+                   pi_author, pi_tag, showPatchInfo,
hunk ./PatchInfo.lhs 72
-human_friendly (PatchInfo d n a l inv) =
+human_friendly pinfo@(PatchInfo d n a l inv) =
hunk ./PatchInfo.lhs 76
-  where hfn x = if takePS 4 x == packString "TAG "
-                then text "  tagged" <+> packedString (dropPS 4 x)
-                else inverted <+> packedString x
+  where hfn x = case pi_tag pinfo of
+                Nothing -> inverted <+> packedString x
+                Just t -> text "  tagged" <+> text t
hunk ./PatchInfo.lhs 91
+pi_tag :: PatchInfo -> Maybe String
+pi_tag (PatchInfo  _ n _ _ _) =
+    if l == t
+      then Just $ unpackPS r
+      else Nothing
+    where (l, r) = splitAtPS (lengthPS t) n
+          t = packString "TAG "
+
}

[Include the query commands in the manual
Florian Weimer <[EMAIL PROTECTED]>**20070325170019] {
hunk ./Query.lhs 43
+\subsection{darcs query}
+
+The query command provides access to several subcommands which can be
+used to investigate the state of a repository.
+
+\input{QueryManifest.lhs}
+
hunk ./QueryManifest.lhs 18
-\subsection{darcs query manifest}
+\subsubsection{darcs query manifest}
}

[Add the query tags command
Florian Weimer <[EMAIL PROTECTED]>**20070325170617] 
<
[Implement PatchInfo.pi_tag
Florian Weimer <[EMAIL PROTECTED]>**20070325160343] 
> {
hunk ./GNUmakefile 50
-	Query.lhs QueryManifest.lhs Record.lhs RemoteApply.lhs	\
+	Query.lhs QueryManifest.lhs QueryTags.lhs \
+	Record.lhs RemoteApply.lhs	\
hunk ./Query.lhs 24
+import QueryTags ( query_tags )
hunk ./Query.lhs 40
-                      command_sub_commands = [Command_data query_manifest]
+                      command_sub_commands = [Command_data query_manifest,
+                                              Command_data query_tags]
hunk ./Query.lhs 51
+\input{QueryTags.lhs}
addfile ./QueryTags.lhs
hunk ./QueryTags.lhs 1
+%  Copyright (C) 2007 Florian Weimer
+%
+%  This program is free software; you can redistribute it and/or modify
+%  it under the terms of the GNU General Public License as published by
+%  the Free Software Foundation; either version 2, or (at your option)
+%  any later version.
+%
+%  This program is distributed in the hope that it will be useful,
+%  but WITHOUT ANY WARRANTY; without even the implied warranty of
+%  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%  GNU General Public License for more details.
+%
+%  You should have received a copy of the GNU General Public License
+%  along with this program; see the file COPYING.  If not, write to
+%  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+%  Boston, MA 02110-1301, USA.
+
+\subsubsection{darcs query tags}
+\begin{code}
+module QueryTags ( query_tags ) where
+import DarcsArguments ( DarcsFlag(..), working_repo_dir )
+import DarcsCommands ( DarcsCommand(..), nodefaults )
+import Repository ( amInRepository )
+import DarcsRepo ( lazily_read_repo )
+import Control.Monad ( mapM_ )
+import PatchInfo ( pi_tag )
+import IO ( stderr, hPutStrLn )
+-- import Printer ( renderPS )
+\end{code}
+
+\options{query tags}
+
+\haskell{query_tags_help}
+
+Tab characters (ASCII character 9) in tag names are changed to spaces
+for better interoperability with shell tools.  A warning is printed if
+this happens.
+
+\begin{code}
+query_tags_description :: String
+query_tags_description = "List all tags in the repository."
+\end{code}
+
+\begin{code}
+query_tags_help :: String
+query_tags_help =
+ "The tags command writes a list of all tags in the repository to standard\n"++
+ "output."
+\end{code}
+
+\begin{code}
+query_tags :: DarcsCommand
+query_tags = DarcsCommand {
+  command_name = "tags",
+  command_help = query_tags_help,
+  command_description = query_tags_description,
+  command_extra_args = 0,
+  command_extra_arg_help = [],
+  command_command = tags_cmd,
+  command_prereq = amInRepository,
+  command_get_arg_possibilities = return [],
+  command_argdefaults = nodefaults,
+  command_darcsoptions = [working_repo_dir] }
+
+tags_cmd :: [DarcsFlag] -> [String] -> IO ()
+tags_cmd _ _ = do
+  patches <- lazily_read_repo "."
+  mapM_ process $ concat patches
+  where process (p, _) =
+            case pi_tag p of
+              Just t -> do
+                 t' <- normalize t t False
+                 putStrLn t'
+              Nothing -> return ()
+        normalize :: String -> String -> Bool -> IO String
+        normalize _ [] _ = return []
+        normalize t (x : xs) flag =
+            if x == '\t' then do
+                  if flag
+                    then return ()
+                    else hPutStrLn stderr
+                             ("warning: tag with TAB character: " ++ t)
+                  rest <- (normalize t xs True)
+                  return $ ' ' : rest
+            else do
+                  rest <- (normalize t xs flag)
+                  return $ x : rest
+
+\end{code}
}

[Mention the query tags command in the tag documentation
Florian Weimer <[EMAIL PROTECTED]>**20070325171247] 
<
[Implement PatchInfo.pi_tag
Florian Weimer <[EMAIL PROTECTED]>**20070325160343] 
[Include the query commands in the manual
Florian Weimer <[EMAIL PROTECTED]>**20070325170019] 
[Add the query tags command
Florian Weimer <[EMAIL PROTECTED]>**20070325170617] 
> {
hunk ./Tag.lhs 144
-Because the word `tagged' is always prepended to the tag name, you can search
-for tag names by simply passing the output of \verb!darcs changes! through \verb!grep!:
-
-\begin{verbatim}
- darcs changes | grep tagged
-\end{verbatim}
-
-The above example would display all the tag names in use in the repository.
-
+To display all tags in the repository, use the ``\verb!darcs query tags!''
+command.
}

[Implement the query gfi command
Florian Weimer <[EMAIL PROTECTED]>**20070325193747] {
hunk ./DarcsArguments.lhs 64
+                        git_branch, get_git_branch, tag_translation,
hunk ./DarcsArguments.lhs 115
+get_content (GitBranch s) = Just s
hunk ./DarcsArguments.lhs 1049
+
+git_branch :: DarcsOption
+git_branch = DarcsArgOption [] ["git-branch"] GitBranch "BRANCH"
+             "target GIT branch to export to (default: git-darcs)"
+
+get_git_branch :: [DarcsFlag] -> String
+get_git_branch (GitBranch a:_) = a
+get_git_branch (_:flags) = get_git_branch flags
+get_git_branch [] = "git-darcs"
+
+tag_translation :: DarcsOption
+tag_translation = DarcsArgOption [] ["tag-translation"] TagTranslation "FILE"
+                  "file with tag translation rules"
hunk ./DarcsFlags.lhs 73
+               | GitBranch String | TagTranslation String
hunk ./GNUmakefile 50
-	Query.lhs QueryManifest.lhs QueryTags.lhs \
+	Query.lhs QueryManifest.lhs QueryTags.lhs QueryGFI.lhs \
hunk ./Query.lhs 25
+import QueryGFI ( query_gfi )
hunk ./Query.lhs 42
-                                              Command_data query_tags]
+                                              Command_data query_tags,
+                                              Command_data query_gfi]
hunk ./Query.lhs 54
+\input{QueryGFI.lhs}
addfile ./QueryGFI.lhs
hunk ./QueryGFI.lhs 1
+%  Copyright (C) 2007 Florian Weimer
+%
+%  This program is free software; you can redistribute it and/or modify
+%  it under the terms of the GNU General Public License as published by
+%  the Free Software Foundation; either version 2, or (at your option)
+%  any later version.
+%
+%  This program is distributed in the hope that it will be useful,
+%  but WITHOUT ANY WARRANTY; without even the implied warranty of
+%  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%  GNU General Public License for more details.
+%
+%  You should have received a copy of the GNU General Public License
+%  along with this program; see the file COPYING.  If not, write to
+%  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+%  Boston, MA 02110-1301, USA.
+
+\subsubsection{darcs query gfi}
+\begin{code}
+module QueryGFI ( query_gfi ) where
+import DarcsArguments ( DarcsFlag(..), working_repo_dir,
+                        git_branch, get_git_branch, tag_translation )
+import DarcsCommands ( DarcsCommand(..), nodefaults )
+import Repository ( amInRepository )
+import DarcsRepo ( lazily_read_repo )
+import Control.Monad ( mapM_, foldM )
+import PatchCore ( Patch(..), filenames )
+import PatchInfo
+import PatchApply ( apply )
+import FastPackedString ( PackedString, hPutPS, takePS, dropPS, packString,
+                          readFilePS, lengthPS, concatPS, appendPS, lastPS,
+                          findPS, nilPS, indexPS, elemPS, splitAtPS,
+                          reversePS, linesPS, nullPS )
+import System.IO ( stdout )
+import FileName ( fn2fp )
+import List ( sort )
+import Lock ( withTempDir )
+import System.Time ( ClockTime(TOD), toClockTime )
+import Directory ( doesFileExist, doesDirectoryExist )
+import SlurpDirectory ( slurp, list_slurpy_files )
+import Workaround ( getCurrentDirectory )
+import qualified Map
+\end{code}
+
+\options{query gfi}
+
+\haskell{query_gfi_help} You can set the name of the GIT branch with
+the \verb!--git-branch!  option.
+
+The conversion proceeds in a rather simplistic way: a linear stream of
+commits is exported, without special treatment of conflicts.  Neither
+incremental conversion nor conversion from multiple branches are
+supported.
+
+The \verb|--tag-translation| option permits fine-grained control over
+the converted tag names.  The specified file should contain lines of
+the form ``\emph{darcs-tag} \verb|TAB| \emph{git-tag}''. If
+\emph{git-tag} is empty, the tag is removed from the conversion.
+darcs tags not listed in the file are preserved as-is.
+
+You can create an input file for \verb|--tag-translation| option using
+the query tags command and Perl (or sed).  For instance, if you want
+to follow the GIT convention of prefixing tag names with ``\verb|v|'',
+you can achieve this using:
+
+\begin{verbatim}
+ darcs query tags | perl -pe 's/(.*)/\1\tv\1/' > tags.txt
+ darcs query gfi --tag-translation tags.txt
+\end{verbatim}
+
+\begin{code}
+query_gfi_description :: String
+query_gfi_description = "Export repository to git-fast-import."
+\end{code}
+
+\begin{code}
+query_gfi_help :: String
+query_gfi_help =
+ "The gfi command exports a darcs repository in a format which can be\n"++
+ "processed by the git-fast-import tool from the GIT suite.\n"
+\end{code}
+
+\begin{code}
+query_gfi :: DarcsCommand
+query_gfi = DarcsCommand {
+  command_name = "gfi",
+  command_help = query_gfi_help,
+  command_description = query_gfi_description,
+  command_extra_args = 0,
+  command_extra_arg_help = [],
+  command_command = gfi_cmd,
+  command_prereq = amInRepository,
+  command_get_arg_possibilities = return [],
+  command_argdefaults = nodefaults,
+  command_darcsoptions = [working_repo_dir, git_branch, tag_translation] }
+
+type TagMap = (Map.Map PackedString PackedString)
+data Params = Params PackedString TagMap
+p_branch :: Params -> PackedString
+p_branch (Params branch _) = branch
+p_tagMap :: Params -> TagMap
+p_tagMap (Params _ m) = m
+
+gfi_cmd :: [DarcsFlag] -> [String] -> IO ()
+gfi_cmd flags _ = do
+  patches <- lazily_read_repo "."
+  tag_map <- buildTagTranslation flags
+  let params = Params branch tag_map in
+    withTempDir "exporting" $ \ _ -> do
+                    mapM_ (procOuter params) $ reverse $ concat patches
+  where branch = if '/' `elemPS` branch'
+                 then branch'
+                 else appendPS refs branch'
+        branch' = packString $ get_git_branch flags
+        refs = packString "refs/heads/"
+
+procOuter :: Params -> (PatchInfo, Maybe Patch) -> IO ()
+procOuter params (pinfo, Just p) = procNamedP params pinfo p
+procOuter _ (pinfo, Nothing) = fail $ "no patch for: " ++ (show pinfo)
+
+procNamedP :: Params -> PatchInfo -> Patch -> IO ()
+procNamedP params piouter@(PatchInfo _ note author noteList _)
+               (NamedP pinfo _ p) =
+    if piouter == pinfo then
+       case pi_tag pinfo of
+         Nothing -> do
+           putStr "commit "
+           hPutPS stdout branch
+           putStr "\ncommitter "
+           doWho ()
+           procData $ formatPatchInfo note noteList
+           apply [] False p
+           procInner p
+           putChar '\n'
+         Just t ->
+           let tag_name = normalize t
+           in if nullPS tag_name
+              then return ()
+              else do
+                    putStr "tag "
+                    hPutPS stdout tag_name
+                    putChar '\n'
+                    putStr "from "
+                    hPutPS stdout branch
+                    putStr "\ntagger "
+                    doWho ()
+                    procData $ formatPatchInfo (packString t) noteList
+    else fail "inner and outer patch information are different"
+    where branch = p_branch params
+          (name, email) = splitAuthor author
+          doWho () = do
+            hPutPS stdout name
+            putChar ' '
+            hPutPS stdout email
+            putChar ' '
+            putStr $ formatDate pinfo
+            putStrLn " +0000"
+          normalize t =
+              let t' = normTab t
+                  k = packString t'
+                  def = packString $ normSlash t'
+                  m = p_tagMap params
+              in Map.findWithDefault def k m
+                  where normTab = map mTab
+                            where mTab '\t' = ' '
+                                  mTab x = x
+                        normSlash = map mSlash
+                            where mSlash '/' = '_'
+                                  mSlash x = x
+procNamedP _ _ p = fail $ "unexpected patch: " ++ (show p)
+
+procInner :: Patch -> IO ()
+procInner p = do
+  fileList <- myFileNames p
+  mapM_ procFile fileList
+
+procFile :: FilePath -> IO ()
+procFile fp = do
+  exists <- doesFileExist fp
+  if exists
+    then procFileM fp fn
+    else procFileD fn
+    where fn = formatFn fp
+
+procFileM :: FilePath -> String -> IO ()
+procFileM fp fn = do
+  contents <- readFilePS fp
+  putStr "M 644 inline "
+  putStrLn fn
+  procData contents
+procFileD :: String -> IO ()
+procFileD fn = do
+  putStr "D "
+  putStrLn fn
+
+procData :: PackedString -> IO ()
+procData contents = do
+    putStr "data "
+    putStr $ show $ lengthPS contents
+    putChar '\n'
+    hPutPS stdout contents
+    putChar '\n'
+
+formatDate :: PatchInfo -> String
+formatDate pinfo =
+    case toClockTime $ pi_date pinfo of
+      TOD i _ -> show i
+
+lfPS :: PackedString
+lfPS = packString "\n"
+
+splitAuthor :: PackedString -> (PackedString, PackedString)
+splitAuthor author =
+    case findPS '<' author of
+      Nothing -> (nilPS, concatPS [packString "<", author, packString ">"])
+      Just 0 -> (nilPS, author)
+      Just i ->
+          let pfxLen = case indexPS author (i - 1) of
+                         ' ' -> i - 1
+                         _ -> i
+          in cleanup (takePS pfxLen author) (dropPS i author)
+          where cleanup l r =
+                    case findPS '>' r of
+                      Nothing ->
+                          -- misformed string, fix it
+                          (l, appendPS l $ packString ">")
+                      Just j ->
+                          -- Drop garbage after the trailing ">",
+                          -- handle enclosing quotes
+                          let (r', garbage) = splitAtPS (j + 1) r
+                              (pfx, l') = splitAtPS (lengthPS garbage) l
+                          in if (reversePS pfx) == garbage
+                             then (l', r')
+                             else (l, r')
+
+formatPatchInfo :: PackedString -> [PackedString] -> PackedString
+formatPatchInfo note [] = endWithLF note
+formatPatchInfo note notes =
+    endWithLF $ concatPS (n : lfPS : notes)
+    where n = endWithLF note
+
+endWithLF :: PackedString -> PackedString
+endWithLF ps =
+    if hasLF then ps else appendPS ps lfPS
+    where hasLF = lengthPS ps > 0 && lastPS ps == '\n'
+
+formatFn :: String -> String
+formatFn s =
+    if take 2 s == "./"
+    then drop 2 s
+    else s
+
+-- PatchCore.filenames does not list files in moved directories.  We
+-- look at the file system to discover those.
+myFileNames :: Patch -> IO [FilePath]
+myFileNames p = do
+  movedFiles <- expandDirs $ moveTargets p
+  return $ deduplicate $ regular ++ movedFiles
+    where regular = map fn2fp $ filenames p
+
+expandDirs :: [FilePath] -> IO [FilePath]
+expandDirs path = do
+  total <- mapM expandOne path
+  return $ concat total
+    where expandOne fp = do
+            dir <- doesDirectoryExist fp
+            if dir
+              then list fp
+              else return []
+          list p = do
+            cwd <- getCurrentDirectory
+            s <- slurp $ cwd ++ ('/' : p)
+            return $ map convert $ list_slurpy_files s
+              where convert fn = prefix ++ (formatFn fn)
+                    prefix = p ++ "/"
+
+moveTargets :: Patch -> [FilePath]
+moveTargets (NamedP _ _ p) = moveTargets p
+moveTargets (Move _ f2) = [fn2fp f2]
+moveTargets (DP _ _) = []
+moveTargets (FP _ _) = []
+moveTargets (Split ps) = concatMap moveTargets ps
+moveTargets (ComP ps) = concatMap moveTargets ps
+moveTargets (Merger _ _ p ps p1 p2) = concatMap moveTargets (p:p1:p2:ps)
+moveTargets (Conflictor _ ps1 ps2) = concatMap moveTargets (ps1++ps2)
+moveTargets (ChangePref _ _ _) = []
+
+-- We run a first pass of deduplication before sorting because there
+-- are lots of runs of redundant entries.
+deduplicate :: Ord t => [t] -> [t]
+deduplicate = dedup . sort . dedup
+    where dedup [] = []
+          dedup (x:xs) = dedup' x xs
+          dedup' x [] = [x]
+          dedup' x (y:ys') =
+              if x == y then
+                  dedup' x ys'
+              else
+                  x : (dedup' y ys')
+
+buildTagTranslation :: [DarcsFlag] -> IO TagMap
+buildTagTranslation = foldM read_file Map.empty
+    where read_file m (TagTranslation path) = do
+            contents <- readFilePS path
+            return $ foldr read_line m (linesPS contents)
+          read_file m _ = return m
+          read_line line m =
+              Map.insert k v m
+              where (k ,v) =
+                        case findPS '\t' line of
+                          Just i -> (takePS i line, dropPS (i + 1) line)
+                          Nothing -> (line, nilPS)
+
+\end{code}
}

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.
] 
[Implement prettyException.
Juliusz Chroboczek <[EMAIL PROTECTED]>**20061218025440] 
[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] 
[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.
 
] 
[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
 
] 
[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.
] 
[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] 
[look for --disable-ssh-cm in defaults files (issue351)
Tommy Pettersson <[EMAIL PROTECTED]>**20061117180942] 
[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.
] 
[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)
 
] 
[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] 
[TAG 1.0.9rc2
Tommy Pettersson <[EMAIL PROTECTED]>**20061116140351] 
Patch bundle hash:
ce97f7a6823bd33bca155c42129ab8838a57d30d
_______________________________________________
darcs-devel mailing list
[email protected]
http://lists.osuosl.org/mailman/listinfo/darcs-devel

Reply via email to