merged with crew
authorMartin Geisler <mg@lazybytes.net>
Mon, 22 Jun 2009 22:22:48 +0200
changeset 8925 3ad0b5ddae58
parent 8924 482a92a45917 (current diff)
parent 8896 b793ce68f082 (diff)
child 8926 5f6e1d5a2fbe
merged with crew
--- a/hgext/acl.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/acl.py	Mon Jun 22 22:22:48 2009 +0200
@@ -6,18 +6,23 @@
 # GNU General Public License version 2, incorporated herein by reference.
 #
 
-'''provide simple hooks for access control
+'''control access to a repository using simple hooks
 
-Authorization is against local user name on system where hook is run, not
-committer of original changeset (since that is easy to spoof).
+This hook makes it possible to allow or deny write access to portions
+of a repository when receiving incoming changesets.
+
+The authorization is matched based on the local user name on the
+system where the hook runs, and not the committer of the original
+changeset (since the latter is merely informative).
 
-The acl hook is best to use if you use hgsh to set up restricted shells for
-authenticated users to only push to / pull from. It's not safe if user has
-interactive shell access, because they can disable the hook. It's also not
-safe if remote users share one local account, because then there's no way to
-tell remote users apart.
+The acl hook is best used along with a restricted shell like hgsh,
+preventing authenticating users from doing anything other than
+pushing or pulling. The hook is not safe to use if users have
+interactive shell access, as they can then disable the hook.
+Nor is it safe if remote users share an account, because then there
+is no way to distinguish them.
 
-To use, configure the acl extension in hgrc like this:
+To use this hook, configure the acl extension in your hgrc like this:
 
   [extensions]
   hgext.acl =
@@ -26,21 +31,24 @@
   pretxnchangegroup.acl = python:hgext.acl.hook
 
   [acl]
-  sources = serve        # check if source of incoming changes in this list
-                         # ("serve" == ssh or http, "push", "pull", "bundle")
+  # Check whether the source of incoming changes is in this list
+  # ("serve" == ssh or http, "push", "pull", "bundle")
+  sources = serve
 
-Allow and deny lists have a subtree pattern (default syntax is glob) on the
-left and user names on right. The deny list is checked before the allow list.
+The allow and deny sections take a subtree pattern as key (with a
+glob syntax by default), and a comma separated list of users as
+the corresponding value. The deny list is checked before the allow
+list is.
 
   [acl.allow]
-  # if acl.allow not present, all users allowed by default
-  # empty acl.allow = no users allowed
+  # If acl.allow is not present, all users are allowed by default.
+  # An empty acl.allow section means no users allowed.
   docs/** = doc_writer
   .hgtags = release_engineer
 
   [acl.deny]
-  # if acl.deny not present, no users denied by default
-  # empty acl.deny = all users allowed
+  # If acl.deny is not present, no users are refused by default.
+  # An empty acl.deny section means all users allowed.
   glob pattern = user4, user5
    ** = user6
 '''
--- a/hgext/bookmarks.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/bookmarks.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,24 +5,26 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''Mercurial bookmarks
+'''track a line of development with movable markers
 
-Mercurial bookmarks are local moveable pointers to changesets. Every
-bookmark points to a changeset identified by its hash. If you commit a
-changeset that is based on a changeset that has a bookmark on it, the
-bookmark is forwarded to the new changeset.
+Bookmarks are local movable markers to changesets. Every bookmark
+points to a changeset identified by its hash. If you commit a
+changeset that is based on a changeset that has a bookmark on it,
+the bookmark shifts to the new changeset.
+
+It is possible to use bookmark names in every revision lookup
+(e.g. hg merge, hg update).
 
-It is possible to use bookmark names in every revision lookup (e.g. hg
-merge, hg update).
-
-The bookmark extension offers the possiblity to have a more git-like
-experience by adding the following configuration option to your .hgrc:
+By default, when several bookmarks point to the same changeset, they
+will all move forward together. It is possible to obtain a more
+git-like experience by adding the following configuration option to
+your .hgrc:
 
-[bookmarks]
-track.current = True
+  [bookmarks]
+  track.current = True
 
-This will cause bookmarks to track the bookmark that you are currently
-on, and just updates it. This is similar to git's approach to
+This will cause Mercurial to track the bookmark that you are currently
+using, and only update it. This is similar to git's approach to
 branching.
 '''
 
@@ -120,10 +122,10 @@
     repo._bookmarkcurrent = mark
 
 def bookmark(ui, repo, mark=None, rev=None, force=False, delete=False, rename=None):
-    '''Mercurial bookmarks
+    '''track a line of development with movable markers
 
     Bookmarks are pointers to certain commits that move when
-    commiting. Bookmarks are local. They can be renamed, copied and
+    committing. Bookmarks are local. They can be renamed, copied and
     deleted. It is possible to use bookmark names in 'hg merge' and
     'hg update' to merge and update respectively to a given bookmark.
 
--- a/hgext/bugzilla.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/bugzilla.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''Bugzilla integration
+'''integrate Mercurial with a Bugzilla bug tracker
 
 This hook extension adds comments on bugs in Bugzilla when changesets
 that refer to bugs by Bugzilla ID are seen. The hook does not change
--- a/hgext/children.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/children.py	Mon Jun 22 22:22:48 2009 +0200
@@ -8,7 +8,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''provides children command to show children changesets'''
+'''display children changesets'''
 
 from mercurial import cmdutil
 from mercurial.commands import templateopts
--- a/hgext/churn.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/churn.py	Mon Jun 22 22:22:48 2009 +0200
@@ -6,7 +6,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''command to show certain statistics about revision history'''
+'''display statistics about repository history'''
 
 from mercurial.i18n import _
 from mercurial import patch, cmdutil, util, templater
--- a/hgext/color.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/color.py	Mon Jun 22 22:22:48 2009 +0200
@@ -16,7 +16,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc.,
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
-'''add color output to status, qseries, and diff-related commands
+'''colorize output from some commands
 
 This extension modifies the status command to add color to its output
 to reflect file status, the qseries command to add color to reflect
--- a/hgext/convert/__init__.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/convert/__init__.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''converting foreign VCS repositories to Mercurial'''
+'''import from foreign VCS repositories into Mercurial'''
 
 import convcmd
 import cvsps
--- a/hgext/convert/common.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/convert/common.py	Mon Jun 22 22:22:48 2009 +0200
@@ -103,7 +103,10 @@
         raise NotImplementedError()
 
     def gettags(self):
-        """Return the tags as a dictionary of name: revision"""
+        """Return the tags as a dictionary of name: revision
+
+        Tag names must be UTF-8 strings.
+        """
         raise NotImplementedError()
 
     def recode(self, s, encoding=None):
@@ -198,7 +201,9 @@
 
     def puttags(self, tags):
         """Put tags into sink.
-        tags: {tagname: sink_rev_id, ...}"""
+
+        tags: {tagname: sink_rev_id, ...} where tagname is an UTF-8 string.
+        """
         raise NotImplementedError()
 
     def setbranch(self, branch, pbranches):
--- a/hgext/convert/cvsps.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/convert/cvsps.py	Mon Jun 22 22:22:48 2009 +0200
@@ -511,7 +511,9 @@
                   e.comment == c.comment and
                   e.author == c.author and
                   e.branch == c.branch and
-                  e.branchpoints == c.branchpoints and
+                  (not hasattr(e, 'branchpoints') or
+                    not hasattr (c, 'branchpoints') or
+                    e.branchpoints == c.branchpoints) and
                   ((c.date[0] + c.date[1]) <=
                    (e.date[0] + e.date[1]) <=
                    (c.date[0] + c.date[1]) + fuzz) and
--- a/hgext/convert/subversion.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/convert/subversion.py	Mon Jun 22 22:22:48 2009 +0200
@@ -1,19 +1,6 @@
 # Subversion 1.4/1.5 Python API backend
 #
 # Copyright(C) 2007 Daniel Holth et al
-#
-# Configuration options:
-#
-# convert.svn.trunk
-#   Relative path to the trunk (default: "trunk")
-# convert.svn.branches
-#   Relative path to tree of branches (default: "branches")
-# convert.svn.tags
-#   Relative path to tree of tags (default: "tags")
-#
-# Set these in a hgrc, or on the command line as follows:
-#
-#   hg convert --config convert.svn.trunk=wackoname [...]
 
 import locale
 import os
@@ -23,7 +10,7 @@
 import tempfile
 import urllib
 
-from mercurial import strutil, util
+from mercurial import strutil, util, encoding
 from mercurial.i18n import _
 
 # Subversion stuff. Works best with very recent Python SVN bindings
@@ -63,6 +50,9 @@
         path = os.path.normpath(os.path.abspath(path))
         if os.name == 'nt':
             path = '/' + util.normpath(path)
+        # Module URL is later compared with the repository URL returned
+        # by svn API, which is UTF-8.
+        path = encoding.tolocal(path)
         return 'file://%s' % urllib.quote(path)
     return path
 
@@ -213,7 +203,6 @@
             raise MissingTool(_('Subversion python bindings are too old, 1.4 '
                                 'or later required'))
 
-        self.encoding = locale.getpreferredencoding()
         self.lastrevs = {}
 
         latest = None
@@ -240,7 +229,7 @@
             self.rootmodule = self.module
             self.commits = {}
             self.paths = {}
-            self.uuid = svn.ra.get_uuid(self.ra).decode(self.encoding)
+            self.uuid = svn.ra.get_uuid(self.ra)
         except SubversionException:
             ui.traceback()
             raise NoRepo("%s does not look like a Subversion repo" % self.url)
@@ -260,15 +249,10 @@
             raise util.Abort(_('svn: start revision %s is not an integer')
                              % self.startrev)
 
-        try:
-            self.get_blacklist()
-        except IOError:
-            pass
-
         self.head = self.latest(self.module, latest)
         if not self.head:
-            raise util.Abort(_('no revision found in module %s') %
-                             self.module.encode(self.encoding))
+            raise util.Abort(_('no revision found in module %s')
+                             % self.module)
         self.last_changed = self.revnum(self.head)
 
         self._changescache = None
@@ -328,8 +312,8 @@
             self.module += '/' + trunk
             self.head = self.latest(self.module, self.last_changed)
             if not self.head:
-                raise util.Abort(_('no revision found in module %s') %
-                                 self.module.encode(self.encoding))
+                raise util.Abort(_('no revision found in module %s') 
+                                 % self.module)
 
         # First head in the list is the module's head
         self.heads = [self.head]
@@ -347,8 +331,7 @@
                     continue
                 brevid = self.latest(module, self.last_changed)
                 if not brevid:
-                    self.ui.note(_('ignoring empty branch %s\n') %
-                                   branch.encode(self.encoding))
+                    self.ui.note(_('ignoring empty branch %s\n') % branch)
                     continue
                 self.ui.note(_('found branch %s at %d\n') %
                              (branch, self.revnum(brevid)))
@@ -524,19 +507,14 @@
         self.convertfp.write('%s %d\n' % (destrev, self.revnum(rev)))
         self.convertfp.flush()
 
-    # -- helper functions --
-
     def revid(self, revnum, module=None):
-        if not module:
-            module = self.module
-        return u"svn:%s%s@%s" % (self.uuid, module.decode(self.encoding),
-                                 revnum)
+        return 'svn:%s%s@%s' % (self.uuid, module or self.module, revnum)
 
     def revnum(self, rev):
         return int(rev.split('@')[-1])
 
     def revsplit(self, rev):
-        url, revnum = rev.encode(self.encoding).rsplit('@', 1)
+        url, revnum = rev.rsplit('@', 1)
         revnum = int(revnum)
         parts = url.split('/', 1)
         uuid = parts.pop(0)[4:]
@@ -593,25 +571,6 @@
             return None
         return self.revid(dirent.created_rev, path)
 
-    def get_blacklist(self):
-        """Avoid certain revision numbers.
-        It is not uncommon for two nearby revisions to cancel each other
-        out, e.g. 'I copied trunk into a subdirectory of itself instead
-        of making a branch'. The converted repository is significantly
-        smaller if we ignore such revisions."""
-        self.blacklist = set()
-        blacklist = self.blacklist
-        for line in file("blacklist.txt", "r"):
-            if not line.startswith("#"):
-                try:
-                    svn_rev = int(line.strip())
-                    blacklist.add(svn_rev)
-                except ValueError:
-                    pass # not an integer or a comment
-
-    def is_blacklisted(self, svn_rev):
-        return svn_rev in self.blacklist
-
     def reparent(self, module):
         """Reparent the svn transport and return the previous parent."""
         if self.prevmodule == module:
@@ -639,11 +598,10 @@
 
         for path, ent in paths:
             entrypath = self.getrelpath(path)
-            entry = entrypath.decode(self.encoding)
 
             kind = self._checkpath(entrypath, revnum)
             if kind == svn.core.svn_node_file:
-                entries.append(self.recode(entry))
+                entries.append(self.recode(entrypath))
                 if not ent.copyfrom_path or not parents:
                     continue
                 # Copy sources not in parent revisions cannot be
@@ -656,102 +614,46 @@
                     continue
                 self.ui.debug(_("copied to %s from %s@%s\n") %
                               (entrypath, copyfrom_path, ent.copyfrom_rev))
-                copies[self.recode(entry)] = self.recode(copyfrom_path)
+                copies[self.recode(entrypath)] = self.recode(copyfrom_path)
             elif kind == 0: # gone, but had better be a deleted *file*
                 self.ui.debug(_("gone from %s\n") % ent.copyfrom_rev)
-
-                # if a branch is created but entries are removed in
-                # the same changeset, get the right fromrev
-                # parents cannot be empty here, you cannot remove
-                # things from a root revision.
-                uuid, old_module, fromrev = self.revsplit(parents[0])
-
-                basepath = old_module + "/" + self.getrelpath(path)
-                entrypath = basepath
-
-                def lookup_parts(p):
-                    rc = None
-                    parts = p.split("/")
-                    for i in range(len(parts)):
-                        part = "/".join(parts[:i])
-                        info = part, copyfrom.get(part, None)
-                        if info[1] is not None:
-                            self.ui.debug(_("found parent directory %s\n") % info[1])
-                            rc = info
-                    return rc
-
-                self.ui.debug(_("base, entry %s %s\n") % (basepath, entrypath))
-
-                frompath, froment = lookup_parts(entrypath) or (None, revnum - 1)
-
-                # need to remove fragment from lookup_parts and
-                # replace with copyfrom_path
-                if frompath is not None:
-                    self.ui.debug(_("munge-o-matic\n"))
-                    self.ui.debug(entrypath + '\n')
-                    self.ui.debug(entrypath[len(frompath):] + '\n')
-                    entrypath = froment.copyfrom_path + entrypath[len(frompath):]
-                    fromrev = froment.copyfrom_rev
-                    self.ui.debug(_("info: %s %s %s %s\n") % (frompath, froment, ent, entrypath))
+                pmodule, prevnum = self.revsplit(parents[0])[1:]
+                parentpath = pmodule + "/" + entrypath
+                self.ui.debug(_("entry %s\n") % parentpath)
 
                 # We can avoid the reparent calls if the module has
                 # not changed but it probably does not worth the pain.
                 prevmodule = self.reparent('')
-                fromkind = svn.ra.check_path(self.ra, entrypath.strip('/'), fromrev)
+                fromkind = svn.ra.check_path(self.ra, parentpath.strip('/'), prevnum)
                 self.reparent(prevmodule)
 
-                if fromkind == svn.core.svn_node_file:   # a deleted file
-                    entries.append(self.recode(entry))
+                if fromkind == svn.core.svn_node_file:
+                    entries.append(self.recode(entrypath))
                 elif fromkind == svn.core.svn_node_dir:
-                    # print "Deleted/moved non-file:", revnum, path, ent
-                    # children = self._find_children(path, revnum - 1)
-                    # print ("find children %s@%d from %d action %s" %
-                    #        (path, revnum, ent.copyfrom_rev, ent.action))
-                    # Sometimes this is tricky. For example: in
-                    # The Subversion Repository revision 6940 a dir
-                    # was copied and one of its files was deleted
-                    # from the new location in the same commit. This
-                    # code can't deal with that yet.
                     if ent.action == 'C':
-                        children = self._find_children(path, fromrev)
+                        children = self._find_children(path, prevnum)
                     else:
-                        oroot = entrypath.strip('/')
+                        oroot = parentpath.strip('/')
                         nroot = path.strip('/')
-                        children = self._find_children(oroot, fromrev)
+                        children = self._find_children(oroot, prevnum)
                         children = [s.replace(oroot,nroot) for s in children]
-                    # Mark all [files, not directories] as deleted.
+
                     for child in children:
-                        # Can we move a child directory and its
-                        # parent in the same commit? (probably can). Could
-                        # cause problems if instead of revnum -1,
-                        # we have to look in (copyfrom_path, revnum - 1)
-                        entrypath = self.getrelpath("/" + child, module=old_module)
-                        if entrypath:
-                            entry = self.recode(entrypath.decode(self.encoding))
-                            if entry in copies:
-                                # deleted file within a copy
-                                del copies[entry]
-                            else:
-                                entries.append(entry)
+                        childpath = self.getrelpath("/" + child, pmodule)
+                        if not childpath:
+                            continue
+                        if childpath in copies:
+                            del copies[childpath]
+                        entries.append(childpath)
                 else:
                     self.ui.debug(_('unknown path in revision %d: %s\n') % \
                                   (revnum, path))
             elif kind == svn.core.svn_node_dir:
-                # Should probably synthesize normal file entries
-                # and handle as above to clean up copy/rename handling.
-
                 # If the directory just had a prop change,
                 # then we shouldn't need to look for its children.
                 if ent.action == 'M':
                     continue
 
-                # Also this could create duplicate entries. Not sure
-                # whether this will matter. Maybe should make entries a set.
-                # print "Changed directory", revnum, path, ent.action, \
-                #     ent.copyfrom_path, ent.copyfrom_rev
-                # This will fail if a directory was copied
-                # from another branch and then some of its files
-                # were deleted in the same transaction.
                 children = sorted(self._find_children(path, revnum))
                 for child in children:
                     # Can we move a child directory and its
@@ -759,15 +661,13 @@
                     # cause problems if instead of revnum -1,
                     # we have to look in (copyfrom_path, revnum - 1)
                     entrypath = self.getrelpath("/" + child)
-                    # print child, self.module, entrypath
                     if entrypath:
                         # Need to filter out directories here...
                         kind = self._checkpath(entrypath, revnum)
                         if kind != svn.core.svn_node_dir:
                             entries.append(self.recode(entrypath))
 
-                # Copies here (must copy all from source) Probably not
-                # a real problem for us if source does not exist
+                # Handle directory copies
                 if not ent.copyfrom_path or not parents:
                     continue
                 # Copy sources not in parent revisions cannot be
@@ -775,8 +675,7 @@
                 pmodule, prevnum = self.revsplit(parents[0])[1:]
                 if ent.copyfrom_rev < prevnum:
                     continue
-                copyfrompath = ent.copyfrom_path.decode(self.encoding)
-                copyfrompath = self.getrelpath(copyfrompath, pmodule)
+                copyfrompath = self.getrelpath(ent.copyfrom_path, pmodule)
                 if not copyfrompath:
                     continue
                 copyfrom[path] = ent
@@ -788,10 +687,9 @@
                     entrypath = self.getrelpath("/" + child, pmodule)
                     if not entrypath:
                         continue
-                    entry = entrypath.decode(self.encoding)
-                    copytopath = path + entry[len(copyfrompath):]
+                    copytopath = path + entrypath[len(copyfrompath):]
                     copytopath = self.getrelpath(copytopath)
-                    copies[self.recode(copytopath)] = self.recode(entry, pmodule)
+                    copies[self.recode(copytopath)] = self.recode(entrypath)
 
         return (list(set(entries)), copies)
 
@@ -862,7 +760,7 @@
                           desc=log,
                           parents=parents,
                           branch=branch,
-                          rev=rev.encode('utf-8'))
+                          rev=rev)
 
             self.commits[rev] = cset
             # The parents list is *shared* among self.paths and the
@@ -886,10 +784,6 @@
                     if revnum < self.startrev:
                         lastonbranch = True
                         break
-                    if self.is_blacklisted(revnum):
-                        self.ui.note(_('skipping blacklisted revision %d\n')
-                                     % revnum)
-                        continue
                     if not paths:
                         self.ui.debug(_('revision %d has no entries\n') % revnum)
                         continue
--- a/hgext/fetch.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/fetch.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''pulling, updating and merging in one command'''
+'''pull, update and merge in one command'''
 
 from mercurial.i18n import _
 from mercurial.node import nullid, short
--- a/hgext/gpg.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/gpg.py	Mon Jun 22 22:22:48 2009 +0200
@@ -3,7 +3,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''GnuPG signing extension for Mercurial'''
+'''sign and verify changesets'''
 
 import os, tempfile, binascii
 from mercurial import util, commands, match
--- a/hgext/graphlog.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/graphlog.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''show revision graphs in terminal windows
+'''show revision graphs in terminals
 
 This extension adds a --graph option to the incoming, outgoing and log
 commands. When this options is given, an ASCII representation of the
--- a/hgext/hgcia.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/hgcia.py	Mon Jun 22 22:22:48 2009 +0200
@@ -1,7 +1,7 @@
 # Copyright (C) 2007-8 Brendan Cully <brendan@kublai.com>
 # Published under the GNU GPL
 
-"""CIA notification
+"""integrate Mercurial with a CIA notification service
 
 This is meant to be run as a changegroup or incoming hook.
 To configure it, set the following options in your hgrc:
--- a/hgext/hgk.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/hgk.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''browsing the repository in a graphical way
+'''browse the repository in a graphical way
 
 The hgk extension allows browsing the history of a repository in a
 graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not
--- a/hgext/highlight/__init__.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/highlight/__init__.py	Mon Jun 22 22:22:48 2009 +0200
@@ -8,7 +8,7 @@
 # The original module was split in an interface and an implementation
 # file to defer pygments loading and speedup extension setup.
 
-"""syntax highlighting in hgweb, based on Pygments
+"""syntax highlighting for hgweb
 
 It depends on the Pygments syntax highlighting library:
 http://pygments.org/
--- a/hgext/inotify/__init__.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/inotify/__init__.py	Mon Jun 22 22:22:48 2009 +0200
@@ -6,8 +6,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''inotify-based status acceleration for Linux systems
-'''
+'''accelerate status report using system level services'''
 
 # todo: socket permissions
 
--- a/hgext/keyword.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/keyword.py	Mon Jun 22 22:22:48 2009 +0200
@@ -26,7 +26,7 @@
 #
 # Run "hg help keyword" and "hg kwdemo" to get info on configuration.
 
-'''keyword expansion in tracked files
+'''expand keywords in tracked files
 
 This extension expands RCS/CVS-like or self-customized $Keywords$ in
 tracked text files selected by your configuration.
--- a/hgext/mq.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/mq.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''patch management and development
+'''work with a stack of patches
 
 This extension lets you work with a stack of patches in a Mercurial
 repository. It manages two stacks of patches - all known patches, and
--- a/hgext/notify.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/notify.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''hook extension to email notifications on commits/pushes
+'''send e-mail notifications for commits/pushes
 
 Subscriptions can be managed through hgrc. Default mode is to print
 messages to stdout, for testing and configuring.
--- a/hgext/pager.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/pager.py	Mon Jun 22 22:22:48 2009 +0200
@@ -12,7 +12,7 @@
 #
 # Run "hg help pager" to get info on configuration.
 
-'''browse command output with external pager
+'''browse command output with an external pager
 
 To set the pager that should be used, set the application variable:
 
--- a/hgext/parentrevspec.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/parentrevspec.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''use suffixes to refer to ancestor revisions
+'''interpret suffixes to refer to ancestor revisions
 
 This extension allows you to use git-style suffixes to refer to the
 ancestors of a specific revision.
--- a/hgext/patchbomb.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/patchbomb.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''sending Mercurial changesets as a series of patch emails
+'''send Mercurial changesets as a series of patch e-mails
 
 The series is started off with a "[PATCH 0 of N]" introduction, which
 describes the series as a whole.
--- a/hgext/purge.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/purge.py	Mon Jun 22 22:22:48 2009 +0200
@@ -23,7 +23,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-'''enable removing untracked files only'''
+'''delete files not tracked from the working directory'''
 
 from mercurial import util, commands, cmdutil
 from mercurial.i18n import _
--- a/hgext/record.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/record.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''interactive change selection during commit or qrefresh'''
+'''interactively select which sets of changes to commit/qrefresh'''
 
 from mercurial.i18n import gettext, _
 from mercurial import cmdutil, commands, extensions, hg, mdiff, patch
--- a/hgext/share.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/share.py	Mon Jun 22 22:22:48 2009 +0200
@@ -3,7 +3,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''provides the hg share command'''
+'''share a common history between several working directories'''
 
 import os
 from mercurial.i18n import _
--- a/hgext/transplant.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/transplant.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''patch transplanting tool
+'''transplant changesets from another branch
 
 This extension allows you to transplant patches from another branch.
 
--- a/hgext/win32mbcs.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/win32mbcs.py	Mon Jun 22 22:22:48 2009 +0200
@@ -9,7 +9,7 @@
 # GNU General Public License version 2, incorporated herein by reference.
 #
 
-"""allow to use MBCS path with problematic encoding.
+'''allow the use of MBCS paths with problematic encoding
 
 Some MBCS encodings are not good for some path operations (i.e.
 splitting path, case conversion, etc.) with its encoded bytes. We call
@@ -36,8 +36,7 @@
 Path encoding conversion are done between Unicode and
 encoding.encoding which is decided by Mercurial from current locale
 setting or HGENCODING.
-
-"""
+'''
 
 import os
 from mercurial.i18n import _
--- a/hgext/win32text.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/win32text.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''LF <-> CRLF/CR translation utilities
+'''perform automatic newline conversion
 
 To perform automatic newline conversion, use:
 
--- a/hgext/zeroconf/__init__.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/hgext/zeroconf/__init__.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-'''zeroconf support for Mercurial repositories
+'''discover and advertise repositories on the local network
 
 Zeroconf enabled repositories will be announced in a network without
 the need to configure a server or a service. They can be discovered
--- a/mercurial/extensions.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/mercurial/extensions.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-import imp, os, sys
+import imp, os
 import util, cmdutil, help
 from i18n import _, gettext
 
--- a/mercurial/help.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/mercurial/help.py	Mon Jun 22 22:22:48 2009 +0200
@@ -5,6 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
+import textwrap
 from i18n import _
 import extensions
 
@@ -45,21 +46,27 @@
         return ''
     result = '\n%s\n\n' % header
     for name, desc in sorted(exts.iteritems()):
-        result += ' %s   %s\n' % (name.ljust(maxlength), desc)
+        # wrap desc at 70 characters, just like the main help texts
+        desc = textwrap.wrap(desc, width=70 - maxlength - 4)
+        pad = '\n' + ' ' * (maxlength + 4)
+        result += ' %s   %s\n' % (name.ljust(maxlength),
+                                  pad.join(desc))
     return result
 
 def extshelp():
     doc = _(r'''
-    Mercurial has a mechanism for adding new features through the
-    use of extensions. Extensions may bring new commands, or new
-    hooks, or change Mercurial's behavior.
+    Mercurial has the ability to add new features through the use of
+    extensions. Extensions may add new commands, add options to
+    existing commands, change the default behavior of commands, or
+    implement hooks.
 
-    Extensions are not loaded by default for a variety of reasons,
-    they may be meant for advanced users or provide potentially
-    dangerous commands (e.g. mq and rebase allow history to be
-    rewritten), they might not be ready for prime-time yet, or
-    they may alter Mercurial's behavior. It is thus up to the user
-    to activate extensions as desired.
+    Extensions are not loaded by default for a variety of reasons:
+    they can increase startup overhead; they may be meant for
+    advanced usage only; they may provide potentially dangerous
+    abilities (such as letting you destroy or modify history); they
+    might not be ready for prime time; or they may alter some
+    usual behaviors of stock Mercurial. It is thus up to the user to
+    activate extensions as needed.
 
     To enable the "foo" extension, either shipped with Mercurial
     or in the Python search path, create an entry for it in your
@@ -77,7 +84,7 @@
     scope, prepend its path with !:
 
       [extensions]
-      # disabling extension bar residing in /ext/path
+      # disabling extension bar residing in /path/to/extension/bar.py
       hgext.bar = !/path/to/extension/bar.py
       # ditto, but no path was supplied for extension baz
       hgext.baz = !
--- a/mercurial/patch.py	Mon Jun 22 15:58:21 2009 -0300
+++ b/mercurial/patch.py	Mon Jun 22 22:22:48 2009 +0200
@@ -228,7 +228,7 @@
 
     return (dopatch, gitpatches)
 
-class linereader:
+class linereader(object):
     # simple class to allow pushing lines back into the input stream
     def __init__(self, fp, textmode=False):
         self.fp = fp
--- a/tests/svn/branches.svndump	Mon Jun 22 15:58:21 2009 -0300
+++ b/tests/svn/branches.svndump	Mon Jun 22 22:22:48 2009 +0200
@@ -1,6 +1,6 @@
 SVN-fs-dump-format-version: 2
 
-UUID: 7b60030a-5a1f-4344-a009-73f0c1c2adf2
+UUID: 3c3c228a-b3dd-467c-a766-896f4b7cd0af
 
 Revision-number: 0
 Prop-content-length: 56
@@ -9,7 +9,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:47:52.296168Z
+2009-06-21T12:38:53.023457Z
 PROPS-END
 
 Revision-number: 1
@@ -27,7 +27,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:47:52.342238Z
+2009-06-21T12:38:53.111986Z
 PROPS-END
 
 Node-path: branches
@@ -72,7 +72,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:47:53.190046Z
+2009-06-21T12:38:54.182594Z
 PROPS-END
 
 Node-path: branches/notinbranch
@@ -81,6 +81,7 @@
 Prop-content-length: 10
 Text-content-length: 2
 Text-content-md5: e29311f6f1bf1af907f9ef9f44b8328b
+Text-content-sha1: e983f374794de9c64e3d1c1de1d490c0756eeeff
 Content-length: 12
 
 PROPS-END
@@ -93,6 +94,7 @@
 Prop-content-length: 10
 Text-content-length: 2
 Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
 Content-length: 12
 
 PROPS-END
@@ -105,6 +107,7 @@
 Prop-content-length: 10
 Text-content-length: 2
 Text-content-md5: 3b5d5c3712955042212316173ccf37be
+Text-content-sha1: 89e6c98d92887913cadf06b2adb97f26cde4849b
 Content-length: 12
 
 PROPS-END
@@ -117,20 +120,43 @@
 Prop-content-length: 10
 Text-content-length: 2
 Text-content-md5: 2cd6ee2c70b0bde53fbe6cac3c8b8bb1
+Text-content-sha1: 2b66fd261ee5c6cfc8de7fa466bab600bcfe4f69
 Content-length: 12
 
 PROPS-END
 c
 
 
+Node-path: trunk/dir
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/dir/e
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 9ffbf43126e33be52cd2bf7e01d627f9
+Text-content-sha1: 094e3afb2fe8dfe82f63731cdcd3b999f4856cff
+Content-length: 12
+
+PROPS-END
+e
+
+
 Revision-number: 3
-Prop-content-length: 124
-Content-length: 124
+Prop-content-length: 132
+Content-length: 132
 
 K 7
 svn:log
-V 22
-branch trunk, remove c
+V 30
+branch trunk, remove c and dir
 K 10
 svn:author
 V 7
@@ -138,38 +164,22 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:47:55.188535Z
+2009-06-21T12:38:57.166484Z
 PROPS-END
 
 Node-path: branches/old
 Node-kind: dir
 Node-action: add
-Node-copyfrom-rev: 1
+Node-copyfrom-rev: 2
 Node-copyfrom-path: trunk
-Prop-content-length: 34
-Content-length: 34
-
-K 13
-svn:mergeinfo
-V 0
-
-PROPS-END
 
 
-Node-path: branches/old/a
-Node-kind: file
-Node-action: add
-Node-copyfrom-rev: 2
-Node-copyfrom-path: trunk/a
-Text-copy-source-md5: 60b725f10c9c85c70d97880dfe8191b3
+Node-path: branches/old/dir
+Node-action: delete
 
 
-Node-path: branches/old/b
-Node-kind: file
-Node-action: add
-Node-copyfrom-rev: 2
-Node-copyfrom-path: trunk/b
-Text-copy-source-md5: 3b5d5c3712955042212316173ccf37be
+Node-path: branches/old/c
+Node-action: delete
 
 
 Revision-number: 4
@@ -187,7 +197,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:47:57.146347Z
+2009-06-21T12:38:59.084420Z
 PROPS-END
 
 Node-path: trunk/a
@@ -195,6 +205,7 @@
 Node-action: change
 Text-content-length: 4
 Text-content-md5: 0d227f1abf8c2932d342e9b99cc957eb
+Text-content-sha1: d7c8127a20a396cff08af086a1c695b0636f0c29
 Content-length: 4
 
 a
@@ -216,7 +227,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:47:58.150124Z
+2009-06-21T12:39:00.093201Z
 PROPS-END
 
 Node-path: branches/old/b
@@ -224,6 +235,7 @@
 Node-action: change
 Text-content-length: 4
 Text-content-md5: 06ac26ed8b614fc0b141e4542aa067c2
+Text-content-sha1: f6980469e74f7125178e88ec571e06fe6ce86e95
 Content-length: 4
 
 b
@@ -245,7 +257,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:48:00.161336Z
+2009-06-21T12:39:02.078633Z
 PROPS-END
 
 Node-path: branches/old/c
@@ -254,16 +266,12 @@
 Node-copyfrom-rev: 3
 Node-copyfrom-path: trunk/b
 Text-copy-source-md5: 3b5d5c3712955042212316173ccf37be
-Prop-content-length: 34
+Text-copy-source-sha1: 89e6c98d92887913cadf06b2adb97f26cde4849b
 Text-content-length: 4
 Text-content-md5: 33cb6785d50937d8d307ebb66d6259a7
-Content-length: 38
+Text-content-sha1: 7a6478264aa11a0f4befef356c03e83f2b1f6eba
+Content-length: 4
 
-K 13
-svn:mergeinfo
-V 0
-
-PROPS-END
 b
 c
 
@@ -287,7 +295,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:48:01.153724Z
+2009-06-21T12:39:03.065537Z
 PROPS-END
 
 Node-path: branches/old/b
@@ -295,6 +303,7 @@
 Node-action: change
 Text-content-length: 6
 Text-content-md5: cdcfb41554e2d092c13f5e6839e63577
+Text-content-sha1: 17ac58cabedebea235d1b5605531d5b1559797e9
 Content-length: 6
 
 b
@@ -317,7 +326,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:48:04.150915Z
+2009-06-21T12:39:06.070275Z
 PROPS-END
 
 Node-path: branches/old2
@@ -346,7 +355,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:48:06.149560Z
+2009-06-21T12:39:08.082539Z
 PROPS-END
 
 Node-path: branches/old
@@ -375,7 +384,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:48:07.268498Z
+2009-06-21T12:39:09.073290Z
 PROPS-END
 
 Node-path: trunk/a
@@ -383,6 +392,7 @@
 Node-action: change
 Text-content-length: 2
 Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
 Content-length: 2
 
 a
@@ -403,7 +413,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T12:48:09.151702Z
+2009-06-21T12:39:11.070264Z
 PROPS-END
 
 Node-path: branches/old3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/svn/encoding.svndump	Mon Jun 22 22:22:48 2009 +0200
@@ -0,0 +1,280 @@
+SVN-fs-dump-format-version: 2
+
+UUID: afeb9c47-92ff-4c0c-9f72-e1f6eb8ac9af
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2009-06-21T16:34:55.835945Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 112
+Content-length: 112
+
+K 7
+svn:log
+V 10
+init projA
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:34:55.909545Z
+PROPS-END
+
+Node-path: branches
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: tags
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 106
+Content-length: 106
+
+K 7
+svn:log
+V 5
+hello
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:34:56.150049Z
+PROPS-END
+
+Node-path: trunk/à
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/à/é
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: e29311f6f1bf1af907f9ef9f44b8328b
+Text-content-sha1: e983f374794de9c64e3d1c1de1d490c0756eeeff
+Content-length: 12
+
+PROPS-END
+d
+
+
+Node-path: trunk/é
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 9ffbf43126e33be52cd2bf7e01d627f9
+Text-content-sha1: 094e3afb2fe8dfe82f63731cdcd3b999f4856cff
+Content-length: 12
+
+PROPS-END
+e
+
+
+Revision-number: 3
+Prop-content-length: 112
+Content-length: 112
+
+K 7
+svn:log
+V 10
+copy files
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:34:59.089402Z
+PROPS-END
+
+Node-path: trunk/è
+Node-kind: file
+Node-action: add
+Node-copyfrom-rev: 2
+Node-copyfrom-path: trunk/é
+Text-copy-source-md5: 9ffbf43126e33be52cd2bf7e01d627f9
+Text-copy-source-sha1: 094e3afb2fe8dfe82f63731cdcd3b999f4856cff
+
+
+Node-path: trunk/ù
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 2
+Node-copyfrom-path: trunk/à
+
+
+Node-path: trunk/à
+Node-action: delete
+
+
+Node-path: trunk/é
+Node-action: delete
+
+
+Revision-number: 4
+Prop-content-length: 114
+Content-length: 114
+
+K 7
+svn:log
+V 12
+remove files
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:35:00.165121Z
+PROPS-END
+
+Node-path: trunk/è
+Node-action: delete
+
+
+Node-path: trunk/ù
+Node-action: delete
+
+
+Revision-number: 5
+Prop-content-length: 120
+Content-length: 120
+
+K 7
+svn:log
+V 18
+branch to branché
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:35:03.079138Z
+PROPS-END
+
+Node-path: branches/branché
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 4
+Node-copyfrom-path: trunk
+
+
+Revision-number: 6
+Prop-content-length: 121
+Content-length: 121
+
+K 7
+svn:log
+V 19
+branch to branchée
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:35:06.060801Z
+PROPS-END
+
+Node-path: branches/branchée
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 5
+Node-copyfrom-path: branches/branché
+
+
+Revision-number: 7
+Prop-content-length: 110
+Content-length: 110
+
+K 7
+svn:log
+V 9
+tag trunk
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:35:09.061530Z
+PROPS-END
+
+Node-path: tags/branché
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 6
+Node-copyfrom-path: trunk
+
+
+Revision-number: 8
+Prop-content-length: 114
+Content-length: 114
+
+K 7
+svn:log
+V 12
+tag branché
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:35:11.068562Z
+PROPS-END
+
+Node-path: tags/branchée
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 6
+Node-copyfrom-path: branches/branchée
+
+
--- a/tests/svn/move.svndump	Mon Jun 22 15:58:21 2009 -0300
+++ b/tests/svn/move.svndump	Mon Jun 22 22:22:48 2009 +0200
@@ -1,6 +1,6 @@
 SVN-fs-dump-format-version: 2
 
-UUID: 0682b859-320d-4a69-a164-a7cab5695072
+UUID: 9de99ecc-876b-46e5-bc59-bff9b2b58b1e
 
 Revision-number: 0
 Prop-content-length: 56
@@ -9,7 +9,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:36.768573Z
+2009-06-21T14:32:26.678698Z
 PROPS-END
 
 Revision-number: 1
@@ -27,7 +27,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:37.083146Z
+2009-06-21T14:32:27.278689Z
 PROPS-END
 
 Node-path: trunk
@@ -45,6 +45,7 @@
 Prop-content-length: 10
 Text-content-length: 2
 Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
 Content-length: 12
 
 PROPS-END
@@ -66,6 +67,7 @@
 Prop-content-length: 10
 Text-content-length: 2
 Text-content-md5: 3b5d5c3712955042212316173ccf37be
+Text-content-sha1: 89e6c98d92887913cadf06b2adb97f26cde4849b
 Content-length: 12
 
 PROPS-END
@@ -78,6 +80,7 @@
 Prop-content-length: 10
 Text-content-length: 2
 Text-content-md5: 2cd6ee2c70b0bde53fbe6cac3c8b8bb1
+Text-content-sha1: 2b66fd261ee5c6cfc8de7fa466bab600bcfe4f69
 Content-length: 12
 
 PROPS-END
@@ -99,6 +102,7 @@
 Prop-content-length: 10
 Text-content-length: 2
 Text-content-md5: e29311f6f1bf1af907f9ef9f44b8328b
+Text-content-sha1: e983f374794de9c64e3d1c1de1d490c0756eeeff
 Content-length: 12
 
 PROPS-END
@@ -120,7 +124,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:38.152773Z
+2009-06-21T14:32:28.312955Z
 PROPS-END
 
 Node-path: trunk/a
@@ -128,6 +132,7 @@
 Node-action: change
 Text-content-length: 4
 Text-content-md5: 0d227f1abf8c2932d342e9b99cc957eb
+Text-content-sha1: d7c8127a20a396cff08af086a1c695b0636f0c29
 Content-length: 4
 
 a
@@ -139,6 +144,7 @@
 Node-action: change
 Text-content-length: 4
 Text-content-md5: 63fad9092ad37713ebe26b3193f89c41
+Text-content-sha1: ccfb93b7bac6f1520f0adc0eebc2cafe9da80f42
 Content-length: 4
 
 c
@@ -160,7 +166,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:39.146388Z
+2009-06-21T14:32:29.183467Z
 PROPS-END
 
 Node-path: subproject
@@ -189,7 +195,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:40.179944Z
+2009-06-21T14:32:30.300975Z
 PROPS-END
 
 Node-path: subproject/trunk
@@ -216,7 +222,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:41.184505Z
+2009-06-21T14:32:31.354398Z
 PROPS-END
 
 Node-path: subproject/branches
@@ -243,7 +249,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:42.153312Z
+2009-06-21T14:32:32.121901Z
 PROPS-END
 
 Node-path: subproject/trunk/d1
@@ -272,7 +278,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:42.206313Z
+2009-06-21T14:32:32.317815Z
 PROPS-END
 
 Node-path: subproject/trunk/d2
@@ -301,7 +307,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:43.182355Z
+2009-06-21T14:32:33.418320Z
 PROPS-END
 
 Node-path: subproject/trunk/d1/b
@@ -309,6 +315,7 @@
 Node-action: change
 Text-content-length: 4
 Text-content-md5: 06ac26ed8b614fc0b141e4542aa067c2
+Text-content-sha1: f6980469e74f7125178e88ec571e06fe6ce86e95
 Content-length: 4
 
 b
@@ -334,7 +341,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:44.153682Z
+2009-06-21T14:32:34.126542Z
 PROPS-END
 
 Node-path: subproject/branches/d1
@@ -363,7 +370,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:44.298011Z
+2009-06-21T14:32:34.436015Z
 PROPS-END
 
 Node-path: subproject/trunk/d
@@ -372,6 +379,7 @@
 Node-copyfrom-rev: 7
 Node-copyfrom-path: subproject/trunk/d2/d
 Text-copy-source-md5: e29311f6f1bf1af907f9ef9f44b8328b
+Text-copy-source-sha1: e983f374794de9c64e3d1c1de1d490c0756eeeff
 
 
 Revision-number: 11
@@ -389,7 +397,7 @@
 K 8
 svn:date
 V 27
-2008-12-06T13:33:44.349920Z
+2009-06-21T14:32:34.803189Z
 PROPS-END
 
 Node-path: subproject/trunk/d2
@@ -399,3 +407,94 @@
 Node-copyfrom-path: subproject/trunk/d2
 
 
+Revision-number: 12
+Prop-content-length: 107
+Content-length: 107
+
+K 7
+svn:log
+V 6
+add d3
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T14:32:36.531735Z
+PROPS-END
+
+Node-path: subproject/trunk/d3
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: subproject/trunk/d3/d31
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: subproject/trunk/d3/d31/e
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 9ffbf43126e33be52cd2bf7e01d627f9
+Text-content-sha1: 094e3afb2fe8dfe82f63731cdcd3b999f4856cff
+Content-length: 12
+
+PROPS-END
+e
+
+
+Node-path: subproject/trunk/d3/f
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 9a8ad92c50cae39aa2c5604fd0ab6d8c
+Text-content-sha1: a9fcd54b25e7e863d72cd47c08af46e61b74b561
+Content-length: 12
+
+PROPS-END
+f
+
+
+Revision-number: 13
+Prop-content-length: 128
+Content-length: 128
+
+K 7
+svn:log
+V 26
+copy dir and remove subdir
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T14:32:38.281829Z
+PROPS-END
+
+Node-path: subproject/trunk/d3/d31
+Node-action: delete
+
+
+Node-path: subproject/trunk/d4
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 12
+Node-copyfrom-path: subproject/trunk/d3
+
+
--- a/tests/svn/svndump-branches.sh	Mon Jun 22 15:58:21 2009 -0300
+++ b/tests/svn/svndump-branches.sh	Mon Jun 22 22:22:48 2009 +0200
@@ -22,15 +22,19 @@
 echo a > trunk/a
 echo b > trunk/b
 echo c > trunk/c
+mkdir trunk/dir
+echo e > trunk/dir/e
 # Add a file within branches, used to confuse branch detection
 echo d > branches/notinbranch
-svn add trunk/a trunk/b trunk/c branches/notinbranch
+svn add trunk/a trunk/b trunk/c trunk/dir branches/notinbranch
 svn ci -m hello
+svn up
 
 # Branch to old
 svn copy trunk branches/old
 svn rm branches/old/c
-svn ci -m "branch trunk, remove c"
+svn rm branches/old/dir
+svn ci -m "branch trunk, remove c and dir"
 svn up
 
 # Update trunk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/svn/svndump-encoding.sh	Mon Jun 22 22:22:48 2009 +0200
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+#!/bin/sh
+#
+# Use this script to generate encoding.svndump
+#
+
+mkdir temp
+cd temp
+
+mkdir project-orig
+cd project-orig
+mkdir trunk
+mkdir branches
+mkdir tags
+cd ..
+
+svnadmin create svn-repo
+svnurl=file://`pwd`/svn-repo
+svn import project-orig $svnurl -m "init projA"
+
+svn co $svnurl project
+cd project
+echo e > trunk/é
+mkdir trunk/à
+echo d > trunk/à/é
+svn add trunk/é trunk/à
+svn ci -m hello
+
+# Copy files and directories
+svn mv trunk/é trunk/è
+svn mv trunk/à trunk/ù
+svn ci -m "copy files"
+
+# Remove files
+svn rm trunk/è
+svn rm trunk/ù
+svn ci -m 'remove files'
+
+# Create branches with and from weird names
+svn up
+svn cp trunk branches/branché
+echo a > branches/branché/a
+svn ci -m 'branch to branché'
+svn up
+svn cp branches/branché branches/branchée
+echo a >> branches/branché/a
+svn ci -m 'branch to branchée'
+
+# Create tag with weird name
+svn up
+svn cp trunk tags/branché
+svn ci -m 'tag trunk'
+svn cp branches/branchée tags/branchée
+svn ci -m 'tag branché'
+cd ..
+
+svnadmin dump svn-repo > ../encoding.svndump
--- a/tests/svn/svndump-move.sh	Mon Jun 22 15:58:21 2009 -0300
+++ b/tests/svn/svndump-move.sh	Mon Jun 22 22:22:48 2009 +0200
@@ -57,6 +57,17 @@
     # Copy a directory from a past revision
     svn copy -r 7 $svnurl/subproject/trunk/d2 $svnurl/subproject/trunk -m copydirfrompast
 fi
+
+# Copy a directory while removing a subdirectory
+svn up
+mkdir -p subproject/trunk/d3/d31
+echo e > subproject/trunk/d3/d31/e
+echo f > subproject/trunk/d3/f
+svn add subproject/trunk/d3
+svn ci -m "add d3"
+svn copy subproject/trunk/d3 subproject/trunk/d4
+svn rm subproject/trunk/d3/d31
+svn ci -m "copy dir and remove subdir"
 cd ..
 
 svnadmin dump svn-repo > ../move.svndump
\ No newline at end of file
--- a/tests/test-convert-svn-branches.out	Mon Jun 22 15:58:21 2009 -0300
+++ b/tests/test-convert-svn-branches.out	Mon Jun 22 22:22:48 2009 +0200
@@ -5,7 +5,7 @@
 converting...
 10 init projA
 9 hello
-8 branch trunk, remove c
+8 branch trunk, remove c and dir
 7 change a
 6 change b
 5 move and update c
@@ -37,9 +37,9 @@
 | | |
 | o |  branch= 3 change a files: a
 | | |
-+---o  branch=old 2 branch trunk, remove c files: a b
-| |
-| o  branch= 1 hello files: a b c
+| | o  branch=old 2 branch trunk, remove c and dir files: c
+| |/
+| o  branch= 1 hello files: a b c dir/e
 |/
 o  branch= 0 init projA files:
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-convert-svn-encoding	Mon Jun 22 22:22:48 2009 +0200
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+"$TESTDIR/hghave" svn svn-bindings || exit 80
+
+echo "[extensions]" >> $HGRCPATH
+echo "convert = " >> $HGRCPATH
+
+svnadmin create svn-repo
+cat "$TESTDIR/svn/encoding.svndump" | svnadmin load svn-repo > /dev/null
+
+echo '% convert while testing all possible outputs'
+hg --debug convert svn-repo A-hg > /dev/null
+cd A-hg
+hg up
+echo '% check tags are in UTF-8'
+python -c "print '\n'.join([('%r' % l) for l in file('.hgtags', 'rb').readlines()])"
+cd ..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-convert-svn-encoding.out	Mon Jun 22 22:22:48 2009 +0200
@@ -0,0 +1,5 @@
+% convert while testing all possible outputs
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+% check tags are in UTF-8
+'1c1b4062874e8197a68e7ce9e498479a37d0215c branch\xc3\xa9e\n'
+'edc96568720ef79eefa6372677b18d855de3abee branch\xc3\xa9\n'
--- a/tests/test-convert-svn-move.out	Mon Jun 22 15:58:21 2009 -0300
+++ b/tests/test-convert-svn-move.out	Mon Jun 22 22:22:48 2009 +0200
@@ -3,16 +3,22 @@
 scanning source...
 sorting...
 converting...
-9 createtrunk
-8 moved1
-7 moved1
-6 moved2
-5 changeb and rm d2
-4 changeb and rm d2
-3 moved1again
-2 moved1again
-1 copyfilefrompast
-0 copydirfrompast
+11 createtrunk
+10 moved1
+9 moved1
+8 moved2
+7 changeb and rm d2
+6 changeb and rm d2
+5 moved1again
+4 moved1again
+3 copyfilefrompast
+2 copydirfrompast
+1 add d3
+0 copy dir and remove subdir
+o  11 copy dir and remove subdir files: d3/d31/e d4/d31/e d4/f
+|
+o  10 add d3 files: d3/d31/e d3/f
+|
 o  9 copydirfrompast files: d2/d
 |
 o  8 copyfilefrompast files: d
@@ -33,5 +39,5 @@
 |
 o  0 createtrunk files:
 
-default                        9:
+default                       11:
 d1                             6:
--- a/tests/test-keyword.out	Mon Jun 22 15:58:21 2009 -0300
+++ b/tests/test-keyword.out	Mon Jun 22 22:22:48 2009 +0200
@@ -1,5 +1,5 @@
 % help
-keyword extension - keyword expansion in tracked files
+keyword extension - expand keywords in tracked files
 
 This extension expands RCS/CVS-like or self-customized $Keywords$ in
 tracked text files selected by your configuration.
@@ -55,9 +55,9 @@
 
 enabled extensions:
 
- keyword   keyword expansion in tracked files
- mq        patch management and development
- notify    hook extension to email notifications on commits/pushes
+ keyword   expand keywords in tracked files
+ mq        work with a stack of patches
+ notify    send e-mail notifications for commits/pushes
 
 use "hg -v help keyword" to show aliases and global options
 % hg kwdemo
--- a/tests/test-mq.out	Mon Jun 22 15:58:21 2009 -0300
+++ b/tests/test-mq.out	Mon Jun 22 22:22:48 2009 +0200
@@ -1,5 +1,5 @@
 % help
-mq extension - patch management and development
+mq extension - work with a stack of patches
 
 This extension lets you work with a stack of patches in a Mercurial
 repository. It manages two stacks of patches - all known patches, and
@@ -53,7 +53,7 @@
 
 enabled extensions:
 
- mq   patch management and development
+ mq   work with a stack of patches
 
 use "hg -v help mq" to show aliases and global options
 adding a
--- a/tests/test-notify.out	Mon Jun 22 15:58:21 2009 -0300
+++ b/tests/test-notify.out	Mon Jun 22 22:22:48 2009 +0200
@@ -1,4 +1,4 @@
-notify extension - hook extension to email notifications on commits/pushes
+notify extension - send e-mail notifications for commits/pushes
 
 Subscriptions can be managed through hgrc. Default mode is to print
 messages to stdout, for testing and configuring.