diff --git a/hgext/acl.py b/hgext/acl.py --- a/hgext/acl.py +++ b/hgext/acl.py @@ -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 @@ To use, configure the acl extension in h 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 ''' diff --git a/hgext/bookmarks.py b/hgext/bookmarks.py --- a/hgext/bookmarks.py +++ b/hgext/bookmarks.py @@ -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 @@ def setcurrent(repo, mark): 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. diff --git a/hgext/bugzilla.py b/hgext/bugzilla.py --- a/hgext/bugzilla.py +++ b/hgext/bugzilla.py @@ -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 diff --git a/hgext/children.py b/hgext/children.py --- a/hgext/children.py +++ b/hgext/children.py @@ -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 diff --git a/hgext/churn.py b/hgext/churn.py --- a/hgext/churn.py +++ b/hgext/churn.py @@ -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 diff --git a/hgext/color.py b/hgext/color.py --- a/hgext/color.py +++ b/hgext/color.py @@ -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 diff --git a/hgext/convert/__init__.py b/hgext/convert/__init__.py --- a/hgext/convert/__init__.py +++ b/hgext/convert/__init__.py @@ -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 diff --git a/hgext/convert/common.py b/hgext/convert/common.py --- a/hgext/convert/common.py +++ b/hgext/convert/common.py @@ -103,7 +103,10 @@ class converter_source(object): 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 @@ class converter_sink(object): 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): diff --git a/hgext/convert/cvsps.py b/hgext/convert/cvsps.py --- a/hgext/convert/cvsps.py +++ b/hgext/convert/cvsps.py @@ -511,7 +511,9 @@ def createchangeset(ui, log, fuzz=60, me 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 diff --git a/hgext/convert/subversion.py b/hgext/convert/subversion.py --- a/hgext/convert/subversion.py +++ b/hgext/convert/subversion.py @@ -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 cPickle as pickle 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 @@ def geturl(path): 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): # 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): 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 @@ class svn_source(converter_source): 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 diff --git a/hgext/fetch.py b/hgext/fetch.py --- a/hgext/fetch.py +++ b/hgext/fetch.py @@ -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 diff --git a/hgext/gpg.py b/hgext/gpg.py --- a/hgext/gpg.py +++ b/hgext/gpg.py @@ -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 diff --git a/hgext/graphlog.py b/hgext/graphlog.py --- a/hgext/graphlog.py +++ b/hgext/graphlog.py @@ -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 diff --git a/hgext/hgcia.py b/hgext/hgcia.py --- a/hgext/hgcia.py +++ b/hgext/hgcia.py @@ -1,7 +1,7 @@ # Copyright (C) 2007-8 Brendan Cully # 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: diff --git a/hgext/hgk.py b/hgext/hgk.py --- a/hgext/hgk.py +++ b/hgext/hgk.py @@ -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 diff --git a/hgext/highlight/__init__.py b/hgext/highlight/__init__.py --- a/hgext/highlight/__init__.py +++ b/hgext/highlight/__init__.py @@ -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/ diff --git a/hgext/inotify/__init__.py b/hgext/inotify/__init__.py --- a/hgext/inotify/__init__.py +++ b/hgext/inotify/__init__.py @@ -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 diff --git a/hgext/keyword.py b/hgext/keyword.py --- a/hgext/keyword.py +++ b/hgext/keyword.py @@ -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. diff --git a/hgext/mq.py b/hgext/mq.py --- a/hgext/mq.py +++ b/hgext/mq.py @@ -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 diff --git a/hgext/notify.py b/hgext/notify.py --- a/hgext/notify.py +++ b/hgext/notify.py @@ -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. diff --git a/hgext/pager.py b/hgext/pager.py --- a/hgext/pager.py +++ b/hgext/pager.py @@ -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: diff --git a/hgext/parentrevspec.py b/hgext/parentrevspec.py --- a/hgext/parentrevspec.py +++ b/hgext/parentrevspec.py @@ -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. diff --git a/hgext/patchbomb.py b/hgext/patchbomb.py --- a/hgext/patchbomb.py +++ b/hgext/patchbomb.py @@ -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. diff --git a/hgext/purge.py b/hgext/purge.py --- a/hgext/purge.py +++ b/hgext/purge.py @@ -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 _ diff --git a/hgext/record.py b/hgext/record.py --- a/hgext/record.py +++ b/hgext/record.py @@ -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 diff --git a/hgext/share.py b/hgext/share.py --- a/hgext/share.py +++ b/hgext/share.py @@ -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 _ diff --git a/hgext/transplant.py b/hgext/transplant.py --- a/hgext/transplant.py +++ b/hgext/transplant.py @@ -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. diff --git a/hgext/win32mbcs.py b/hgext/win32mbcs.py --- a/hgext/win32mbcs.py +++ b/hgext/win32mbcs.py @@ -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 @@ Note that there are some limitations on 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 _ diff --git a/hgext/win32text.py b/hgext/win32text.py --- a/hgext/win32text.py +++ b/hgext/win32text.py @@ -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: diff --git a/hgext/zeroconf/__init__.py b/hgext/zeroconf/__init__.py --- a/hgext/zeroconf/__init__.py +++ b/hgext/zeroconf/__init__.py @@ -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 diff --git a/mercurial/extensions.py b/mercurial/extensions.py --- a/mercurial/extensions.py +++ b/mercurial/extensions.py @@ -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 diff --git a/mercurial/help.py b/mercurial/help.py --- a/mercurial/help.py +++ b/mercurial/help.py @@ -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 @@ def listexts(header, exts, maxlength): 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 @@ def extshelp(): 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 = ! diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -228,7 +228,7 @@ def readgitpatch(lr): 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 diff --git a/tests/svn/branches.svndump b/tests/svn/branches.svndump --- a/tests/svn/branches.svndump +++ b/tests/svn/branches.svndump @@ -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 @@ Content-length: 56 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 @@ pmezard 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 @@ pmezard 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 @@ Node-action: add 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 @@ Node-action: add 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 @@ Node-action: add 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 @@ Node-action: add 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 @@ pmezard 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 @@ pmezard 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-kind: file Node-action: change Text-content-length: 4 Text-content-md5: 0d227f1abf8c2932d342e9b99cc957eb +Text-content-sha1: d7c8127a20a396cff08af086a1c695b0636f0c29 Content-length: 4 a @@ -216,7 +227,7 @@ pmezard 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-kind: file Node-action: change Text-content-length: 4 Text-content-md5: 06ac26ed8b614fc0b141e4542aa067c2 +Text-content-sha1: f6980469e74f7125178e88ec571e06fe6ce86e95 Content-length: 4 b @@ -245,7 +257,7 @@ pmezard 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-action: add 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 @@ pmezard 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-kind: file Node-action: change Text-content-length: 6 Text-content-md5: cdcfb41554e2d092c13f5e6839e63577 +Text-content-sha1: 17ac58cabedebea235d1b5605531d5b1559797e9 Content-length: 6 b @@ -317,7 +326,7 @@ pmezard 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 @@ pmezard 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 @@ pmezard 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-kind: file Node-action: change Text-content-length: 2 Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3 +Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b Content-length: 2 a @@ -403,7 +413,7 @@ pmezard K 8 svn:date V 27 -2008-12-06T12:48:09.151702Z +2009-06-21T12:39:11.070264Z PROPS-END Node-path: branches/old3 diff --git a/tests/svn/encoding.svndump b/tests/svn/encoding.svndump new file mode 100644 --- /dev/null +++ b/tests/svn/encoding.svndump @@ -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 + + diff --git a/tests/svn/move.svndump b/tests/svn/move.svndump --- a/tests/svn/move.svndump +++ b/tests/svn/move.svndump @@ -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 @@ Content-length: 56 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 @@ pmezard 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 @@ Node-action: add 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 @@ Node-action: add 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 @@ Node-action: add 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 @@ Node-action: add 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 @@ pmezard 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-kind: file Node-action: change Text-content-length: 4 Text-content-md5: 0d227f1abf8c2932d342e9b99cc957eb +Text-content-sha1: d7c8127a20a396cff08af086a1c695b0636f0c29 Content-length: 4 a @@ -139,6 +144,7 @@ Node-kind: file Node-action: change Text-content-length: 4 Text-content-md5: 63fad9092ad37713ebe26b3193f89c41 +Text-content-sha1: ccfb93b7bac6f1520f0adc0eebc2cafe9da80f42 Content-length: 4 c @@ -160,7 +166,7 @@ pmezard 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 @@ pmezard 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 @@ pmezard 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 @@ pmezard 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 @@ pmezard 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 @@ pmezard 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-kind: file Node-action: change Text-content-length: 4 Text-content-md5: 06ac26ed8b614fc0b141e4542aa067c2 +Text-content-sha1: f6980469e74f7125178e88ec571e06fe6ce86e95 Content-length: 4 b @@ -334,7 +341,7 @@ pmezard 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 @@ pmezard 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-action: add 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 @@ pmezard 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-rev: 7 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 + + diff --git a/tests/svn/svndump-branches.sh b/tests/svn/svndump-branches.sh --- a/tests/svn/svndump-branches.sh +++ b/tests/svn/svndump-branches.sh @@ -22,15 +22,19 @@ cd project 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 diff --git a/tests/svn/svndump-encoding.sh b/tests/svn/svndump-encoding.sh new file mode 100755 --- /dev/null +++ b/tests/svn/svndump-encoding.sh @@ -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 diff --git a/tests/svn/svndump-move.sh b/tests/svn/svndump-move.sh --- a/tests/svn/svndump-move.sh +++ b/tests/svn/svndump-move.sh @@ -57,6 +57,17 @@ else # 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 diff --git a/tests/test-convert-svn-branches.out b/tests/test-convert-svn-branches.out --- a/tests/test-convert-svn-branches.out +++ b/tests/test-convert-svn-branches.out @@ -5,7 +5,7 @@ sorting... 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=newbranch 11 branch trunk@1 in | | | | 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: diff --git a/tests/test-convert-svn-encoding b/tests/test-convert-svn-encoding new file mode 100755 --- /dev/null +++ b/tests/test-convert-svn-encoding @@ -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 .. diff --git a/tests/test-convert-svn-encoding.out b/tests/test-convert-svn-encoding.out new file mode 100644 --- /dev/null +++ b/tests/test-convert-svn-encoding.out @@ -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' diff --git a/tests/test-convert-svn-move.out b/tests/test-convert-svn-move.out --- a/tests/test-convert-svn-move.out +++ b/tests/test-convert-svn-move.out @@ -3,16 +3,22 @@ initializing destination A-hg repository 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 | 2 moved1 files: d1/b d1/c | o 0 createtrunk files: -default 9: +default 11: d1 6: diff --git a/tests/test-keyword.out b/tests/test-keyword.out --- a/tests/test-keyword.out +++ b/tests/test-keyword.out @@ -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 @@ list of commands: 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 diff --git a/tests/test-mq.out b/tests/test-mq.out --- a/tests/test-mq.out +++ b/tests/test-mq.out @@ -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 @@ list of commands: 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 diff --git a/tests/test-notify.out b/tests/test-notify.out --- a/tests/test-notify.out +++ b/tests/test-notify.out @@ -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.