# HG changeset patch # User Patrick Mezard # Date 1240739357 -7200 # Node ID 56719b1aa6f44bd24a022e6f3cdf29a91e3783b6 # Parent aaec1f65926e6355c8aebc2d60e7664dbfbb7edd# Parent 78658990c7254a08c1339d1e50bed48b6b666de2 Merge with crew-stable diff -r 78658990c725 -r 56719b1aa6f4 .hgignore --- a/.hgignore Sun Apr 26 11:35:53 2009 +0200 +++ b/.hgignore Sun Apr 26 11:49:17 2009 +0200 @@ -11,6 +11,8 @@ *.pyc *.swp *.prof +\#*\# +.\#* tests/.coverage* tests/annotated tests/*.err diff -r 78658990c725 -r 56719b1aa6f4 Makefile --- a/Makefile Sun Apr 26 11:35:53 2009 +0200 +++ b/Makefile Sun Apr 26 11:49:17 2009 +0200 @@ -2,6 +2,7 @@ export PREFIX PYTHON=python PURE= +PYTHON_FILES:=$(shell find mercurial hgext doc -name '*.py') help: @echo 'Commonly used make targets:' @@ -76,7 +77,9 @@ test-%: cd tests && $(PYTHON) run-tests.py $(TESTFLAGS) $@ -update-pot: +update-pot: i18n/hg.pot + +i18n/hg.pot: $(PYTHON_FILES) mkdir -p i18n pygettext -d hg -p i18n --docstrings \ mercurial/commands.py hgext/*.py hgext/*/__init__.py @@ -86,10 +89,13 @@ # parse these them even though they are not marked for # translation. Extracting with an explicit encoding of # ISO-8859-1 will make xgettext "parse" and ignore them. - find mercurial hgext doc -name '*.py' | xargs \ + echo $^ | xargs \ xgettext --from-code ISO-8859-1 --join --sort-by-file \ -d hg -p i18n -o hg.pot +%.po: i18n/hg.pot + msgmerge --no-location --update $@ $^ + .PHONY: help all local build doc clean install install-bin install-doc \ install-home install-home-bin install-home-doc dist dist-notests tests \ update-pot diff -r 78658990c725 -r 56719b1aa6f4 contrib/perf.py --- a/contrib/perf.py Sun Apr 26 11:35:53 2009 +0200 +++ b/contrib/perf.py Sun Apr 26 11:49:17 2009 +0200 @@ -1,7 +1,7 @@ # perf.py - performance test routines from mercurial.i18n import _ -from mercurial import cmdutil, match +from mercurial import cmdutil, match, commands import time, os, sys def timer(func): @@ -101,6 +101,18 @@ def perflookup(ui, repo, rev): timer(lambda: len(repo.lookup(rev))) +def perflog(ui, repo): + ui.pushbuffer() + timer(lambda: commands.log(ui, repo, rev=[], date='', user='')) + ui.popbuffer() + +def perftemplating(ui, repo): + ui.pushbuffer() + timer(lambda: commands.log(ui, repo, rev=[], date='', user='', + template='{date|shortdate} [{rev}:{node|short}]' + ' {author|person}: {desc|firstline}\n')) + ui.popbuffer() + cmdtable = { 'perflookup': (perflookup, []), 'perfparents': (perfparents, []), @@ -113,5 +125,7 @@ 'perftags': (perftags, []), 'perfdirstate': (perfdirstate, []), 'perfdirstatedirs': (perfdirstate, []), + 'perflog': (perflog, []), + 'perftemplating': (perftemplating, []), } diff -r 78658990c725 -r 56719b1aa6f4 contrib/python-hook-examples.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/python-hook-examples.py Sun Apr 26 11:49:17 2009 +0200 @@ -0,0 +1,22 @@ +''' +Examples of useful python hooks for Mercurial. +''' +from mercurial import patch, util + +def diffstat(ui, repo, **kwargs): + '''Example usage: + + [hooks] + commit.diffstat = python:/path/to/this/file.py:diffstat + changegroup.diffstat = python:/path/to/this/file.py:diffstat + ''' + if kwargs.get('parent2'): + return + node = kwargs['node'] + first = repo[node].parents()[0].node() + if 'url' in kwargs: + last = repo['tip'].node() + else: + last = node + diff = patch.diff(repo, first, last) + ui.write(patch.diffstat(util.iterlines(diff))) diff -r 78658990c725 -r 56719b1aa6f4 contrib/win32/mercurial.iss --- a/contrib/win32/mercurial.iss Sun Apr 26 11:35:53 2009 +0200 +++ b/contrib/win32/mercurial.iss Sun Apr 26 11:49:17 2009 +0200 @@ -36,9 +36,12 @@ Source: contrib\win32\mercurial.ini; DestDir: {app}; DestName: Mercurial.ini; Check: CheckFile; AfterInstall: ConcatenateFiles; Source: contrib\win32\postinstall.txt; DestDir: {app}; DestName: ReleaseNotes.txt Source: dist\hg.exe; DestDir: {app}; AfterInstall: Touch('{app}\hg.exe.local') +Source: dist\python*.dll; Destdir: {app}; Flags: skipifsourcedoesntexist Source: dist\library.zip; DestDir: {app} -Source: dist\mfc71.dll; DestDir: {app} -Source: dist\msvcr71.dll; DestDir: {app} +Source: dist\mfc*.dll; DestDir: {app} +Source: dist\msvc*.dll; DestDir: {app} +Source: dist\Microsoft.VC*.CRT.manifest; DestDir: {app}; Flags: skipifsourcedoesntexist +Source: dist\Microsoft.VC*.MFC.manifest; DestDir: {app}; Flags: skipifsourcedoesntexist Source: dist\w9xpopen.exe; DestDir: {app} Source: dist\add_path.exe; DestDir: {app} Source: doc\*.html; DestDir: {app}\Docs @@ -56,6 +59,8 @@ [Icons] Name: {group}\Uninstall Mercurial; Filename: {uninstallexe} Name: {group}\Mercurial Command Reference; Filename: {app}\Docs\hg.1.html +Name: {group}\Mercurial Configuration Files; Filename: {app}\Docs\hgrc.5.html +Name: {group}\Mercurial Ignore Files; Filename: {app}\Docs\hgignore.5.html Name: {group}\Mercurial Web Site; Filename: {app}\Mercurial.url [Run] diff -r 78658990c725 -r 56719b1aa6f4 contrib/win32/win32-build.txt --- a/contrib/win32/win32-build.txt Sun Apr 26 11:35:53 2009 +0200 +++ b/contrib/win32/win32-build.txt Sun Apr 26 11:49:17 2009 +0200 @@ -12,9 +12,12 @@ Python for Windows Extensions http://sourceforge.net/projects/pywin32/ - mfc71.dll (just download, don't install) + mfc71.dll (just download, don't install; not needed for Python 2.6) http://starship.python.net/crew/mhammond/win32/ + Visual C++ 2008 redistributable package (needed for Python 2.6) + http://www.microsoft.com/downloads/details.aspx?familyid=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en + The py2exe distutils extension http://sourceforge.net/projects/py2exe/ @@ -52,7 +55,25 @@ you can skip the first build step. -Copy mfc71.dll and add_path.exe into the dist directory that just got created. +Copy add_path.exe into the dist directory that just got created. + +If you are using Python up to version 2.5.4, copy mfc71.dll into the dist +directory that just got created. + +If you are using Python 2.6 or later, after installing the Visual C++ 2008 +redistributable package copy into the dist directory that just got created the +following files: + - from the directory starting with + Windows/WinSxS/x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8 + the files named: msvcm90.dll, msvcp90.dll and msvcr90.dll + - from the directory starting with + Windows/WinSxS/x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.21022.8 + the files named: mfc90.dll, mfc90u.dll, mfcm90.dll and mfcm90u.dll + - from the directory named Windows/WinSxS/Manifests, the manifest file + starting with x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8 + (rename it to Microsoft.VC90.CRT.manifest) and the manifest file starting + with x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.21022.8 (rename it to + Microsoft.VC90.MFC.manifest) Before building the installer, you have to build Mercurial HTML documentation (or fix mercurial.iss to not reference the doc directory). Assuming you have an diff -r 78658990c725 -r 56719b1aa6f4 doc/hgrc.5.txt --- a/doc/hgrc.5.txt Sun Apr 26 11:35:53 2009 +0200 +++ b/doc/hgrc.5.txt Sun Apr 26 11:49:17 2009 +0200 @@ -475,6 +475,7 @@ The syntax for Python hooks is as follows: hookname = python:modulename.submodule.callable + hookname = python:/path/to/python/module.py:callable Python hooks are run within the Mercurial process. Each hook is called with at least three keyword arguments: a ui object (keyword @@ -537,6 +538,29 @@ Optional. Directory or URL to use when pushing if no destination is specified. +[[profiling]] +profiling:: + Specifies profiling format and file output. + In this section description, 'profiling data' stands for the raw data + collected during profiling, while 'profiling report' stands for a + statistical text report generated from the profiling data. + The profiling is done using lsprof. + format;; + Profiling format. + Default: text. + text;; + Generate a profiling report. + When saving to a file, it should be noted that only the report is saved, + and the profiling data is not kept. + kcachegrind;; + Format profiling data for kcachegrind use: + when saving to a file, the generated file can directly be loaded + into kcachegrind. + output;; + File path where profiling data or report should be saved. + If the file exists, it is replaced. + Default: None, data is printed on stderr + [[server]] server:: Controls generic server settings. diff -r 78658990c725 -r 56719b1aa6f4 hgext/acl.py --- a/hgext/acl.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/acl.py Sun Apr 26 11:49:17 2009 +0200 @@ -74,7 +74,7 @@ user = getpass.getuser() cfg = ui.config('acl', 'config') if cfg: - ui.readsections(cfg, 'acl.allow', 'acl.deny') + ui.readconfig(cfg, sections = ['acl.allow', 'acl.deny']) allow = buildmatch(ui, repo, user, 'acl.allow') deny = buildmatch(ui, repo, user, 'acl.deny') diff -r 78658990c725 -r 56719b1aa6f4 hgext/bookmarks.py --- a/hgext/bookmarks.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/bookmarks.py Sun Apr 26 11:49:17 2009 +0200 @@ -15,14 +15,15 @@ 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: +The bookmark extension offers the possiblity to have a more git-like +experience by adding the following configuration option to your .hgrc: [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 of branching. +This will cause bookmarks to track the bookmark that you are currently +on, and just updates it. This is similar to git's approach of +branching. ''' from mercurial.i18n import _ @@ -92,7 +93,7 @@ '''Set the name of the bookmark that we are currently on Set the name of the bookmark that we are on (hg update ). - The name is recoreded in .hg/bookmarks.current + The name is recorded in .hg/bookmarks.current ''' if current(repo) == mark: return @@ -115,8 +116,8 @@ Bookmarks are pointers to certain commits that move when commiting. Bookmarks are local. They can be renamed, copied and - deleted. It is possible to use bookmark names in 'hg merge' and 'hg - update' to update to a given bookmark. + deleted. It is possible to use bookmark names in 'hg merge' and + 'hg update' to update to a given bookmark. You can use 'hg bookmark NAME' to set a bookmark on the current tip with the given name. If you specify a revision using -r REV diff -r 78658990c725 -r 56719b1aa6f4 hgext/bugzilla.py --- a/hgext/bugzilla.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/bugzilla.py Sun Apr 26 11:49:17 2009 +0200 @@ -8,69 +8,76 @@ '''Bugzilla integration 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 bug -status. +that refer to bugs by Bugzilla ID are seen. The hook does not change +bug status. -The hook updates the Bugzilla database directly. Only Bugzilla installations -using MySQL are supported. +The hook updates the Bugzilla database directly. Only Bugzilla +installations using MySQL are supported. -The hook relies on a Bugzilla script to send bug change notification emails. -That script changes between Bugzilla versions; the 'processmail' script used -prior to 2.18 is replaced in 2.18 and subsequent versions by -'config/sendbugmail.pl'. Note that these will be run by Mercurial as the user -pushing the change; you will need to ensure the Bugzilla install file -permissions are set appropriately. +The hook relies on a Bugzilla script to send bug change notification +emails. That script changes between Bugzilla versions; the +'processmail' script used prior to 2.18 is replaced in 2.18 and +subsequent versions by 'config/sendbugmail.pl'. Note that these will +be run by Mercurial as the user pushing the change; you will need to +ensure the Bugzilla install file permissions are set appropriately. Configuring the extension: [bugzilla] - host Hostname of the MySQL server holding the Bugzilla database. + + host Hostname of the MySQL server holding the Bugzilla + database. db Name of the Bugzilla database in MySQL. Default 'bugs'. user Username to use to access MySQL server. Default 'bugs'. password Password to use to access MySQL server. timeout Database connection timeout (seconds). Default 5. - version Bugzilla version. Specify '3.0' for Bugzilla versions 3.0 and - later, '2.18' for Bugzilla versions from 2.18 and '2.16' for - versions prior to 2.18. + version Bugzilla version. Specify '3.0' for Bugzilla versions + 3.0 and later, '2.18' for Bugzilla versions from 2.18 + and '2.16' for versions prior to 2.18. bzuser Fallback Bugzilla user name to record comments with, if changeset committer cannot be found as a Bugzilla user. bzdir Bugzilla install directory. Used by default notify. Default '/var/www/html/bugzilla'. notify The command to run to get Bugzilla to send bug change - notification emails. Substitutes from a map with 3 keys, - 'bzdir', 'id' (bug id) and 'user' (committer bugzilla email). - Default depends on version; from 2.18 it is - "cd %(bzdir)s && perl -T contrib/sendbugmail.pl %(id)s %(user)s". - regexp Regular expression to match bug IDs in changeset commit message. - Must contain one "()" group. The default expression matches - 'Bug 1234', 'Bug no. 1234', 'Bug number 1234', - 'Bugs 1234,5678', 'Bug 1234 and 5678' and variations thereof. - Matching is case insensitive. + notification emails. Substitutes from a map with 3 + keys, 'bzdir', 'id' (bug id) and 'user' (committer + bugzilla email). Default depends on version; from 2.18 + it is "cd %(bzdir)s && perl -T contrib/sendbugmail.pl + %(id)s %(user)s". + regexp Regular expression to match bug IDs in changeset commit + message. Must contain one "()" group. The default + expression matches 'Bug 1234', 'Bug no. 1234', 'Bug + number 1234', 'Bugs 1234,5678', 'Bug 1234 and 5678' and + variations thereof. Matching is case insensitive. style The style file to use when formatting comments. template Template to use when formatting comments. Overrides style if specified. In addition to the usual Mercurial keywords, the extension specifies: {bug} The Bugzilla bug ID. - {root} The full pathname of the Mercurial repository. - {webroot} Stripped pathname of the Mercurial repository. - {hgweb} Base URL for browsing Mercurial repositories. + {root} The full pathname of the Mercurial + repository. + {webroot} Stripped pathname of the Mercurial + repository. + {hgweb} Base URL for browsing Mercurial + repositories. Default 'changeset {node|short} in repo {root} refers ' 'to bug {bug}.\\ndetails:\\n\\t{desc|tabindent}' strip The number of slashes to strip from the front of {root} to produce {webroot}. Default 0. - usermap Path of file containing Mercurial committer ID to Bugzilla user - ID mappings. If specified, the file should contain one mapping - per line, "committer"="Bugzilla user". See also the - [usermap] section. + usermap Path of file containing Mercurial committer ID to + Bugzilla user ID mappings. If specified, the file + should contain one mapping per line, + "committer"="Bugzilla user". See also the [usermap] + section. [usermap] - Any entries in this section specify mappings of Mercurial committer ID - to Bugzilla user ID. See also [bugzilla].usermap. + Any entries in this section specify mappings of Mercurial + committer ID to Bugzilla user ID. See also [bugzilla].usermap. "committer"="Bugzilla user" [web] - baseurl Base URL for browsing Mercurial repositories. Reference from - templates as {hgweb}. + baseurl Base URL for browsing Mercurial repositories. Reference + from templates as {hgweb}. Activating the extension: @@ -83,9 +90,9 @@ Example configuration: -This example configuration is for a collection of Mercurial repositories -in /var/local/hg/repos/ used with a local Bugzilla 3.2 installation in -/opt/bugzilla-3.2. +This example configuration is for a collection of Mercurial +repositories in /var/local/hg/repos/ used with a local Bugzilla 3.2 +installation in /opt/bugzilla-3.2. [bugzilla] host=localhost @@ -132,7 +139,7 @@ timeout = int(self.ui.config('bugzilla', 'timeout', 5)) usermap = self.ui.config('bugzilla', 'usermap') if usermap: - self.ui.readsections(usermap, 'usermap') + self.ui.readconfig(usermap, 'usermap') self.ui.note(_('connecting to %s:%s as %s, password %s\n') % (host, db, user, '*' * len(passwd))) self.conn = MySQLdb.connect(host=host, user=user, passwd=passwd, @@ -170,12 +177,12 @@ self.run('''select bug_id from longdescs where bug_id in %s and thetext like "%%%s%%"''' % (buglist(ids), short(node))) - unknown = dict.fromkeys(ids) + unknown = set(ids) for (id,) in self.cursor.fetchall(): self.ui.status(_('bug %d already knows about changeset %s\n') % (id, short(node))) - unknown.pop(id, None) - return util.sort(unknown.keys()) + unknown.discard(id) + return util.sort(unknown) def notify(self, ids, committer): '''tell bugzilla to send mail.''' diff -r 78658990c725 -r 56719b1aa6f4 hgext/children.py --- a/hgext/children.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/children.py Sun Apr 26 11:49:17 2009 +0200 @@ -13,13 +13,13 @@ def children(ui, repo, file_=None, **opts): - """show the children of the given or working dir revision + """show the children of the given or working directory revision - Print the children of the working directory's revisions. - If a revision is given via --rev, the children of that revision - will be printed. If a file argument is given, revision in - which the file was last changed (after the working directory - revision or the argument to --rev if given) is printed. + Print the children of the working directory's revisions. If a + revision is given via --rev/-r, the children of that revision will + be printed. If a file argument is given, revision in which the + file was last changed (after the working directory revision or the + argument to --rev if given) is printed. """ rev = opts.get('rev') if file_: @@ -35,7 +35,7 @@ cmdtable = { "children": (children, - [('r', 'rev', '', _('show children of the specified rev')), + [('r', 'rev', '', _('show children of the specified revision')), ] + templateopts, _('hg children [-r REV] [FILE]')), } diff -r 78658990c725 -r 56719b1aa6f4 hgext/churn.py --- a/hgext/churn.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/churn.py Sun Apr 26 11:49:17 2009 +0200 @@ -9,7 +9,7 @@ from mercurial.i18n import _ from mercurial import patch, cmdutil, util, templater -import os, sys +import sys import time, datetime def maketemplater(ui, repo, tmpl): @@ -21,9 +21,10 @@ t.use_template(tmpl) return t -def changedlines(ui, repo, ctx1, ctx2): +def changedlines(ui, repo, ctx1, ctx2, fns): lines = 0 - diff = ''.join(patch.diff(repo, ctx1.node(), ctx2.node())) + fmatch = cmdutil.match(repo, pats=fns) + diff = ''.join(patch.diff(repo, ctx1.node(), ctx2.node(), fmatch)) for l in diff.split('\n'): if (l.startswith("+") and not l.startswith("+++ ") or l.startswith("-") and not l.startswith("--- ")): @@ -71,7 +72,7 @@ continue ctx1 = parents[0] - lines = changedlines(ui, repo, ctx1, ctx) + lines = changedlines(ui, repo, ctx1, ctx, fns) rate[key] = rate.get(key, 0) + lines if opts.get('progress'): @@ -79,7 +80,7 @@ newpct = int(100.0 * count / max(len(repo), 1)) if pct < newpct: pct = newpct - ui.write(_("\rgenerating stats: %d%%") % pct) + ui.write("\r" + _("generating stats: %d%%") % pct) sys.stdout.flush() if opts.get('progress'): @@ -92,9 +93,9 @@ def churn(ui, repo, *pats, **opts): '''graph count of revisions grouped by template - Will graph count of changed lines or revisions grouped by template or - alternatively by date, if dateformat is used. In this case it will override - template. + Will graph count of changed lines or revisions grouped by template + or alternatively by date, if dateformat is used. In this case it + will override template. By default statistics are counted for number of changed lines. @@ -149,7 +150,7 @@ "churn": (churn, [('r', 'rev', [], _('count rate for the specified revision or range')), - ('d', 'date', '', _('count rate for revs matching date spec')), + ('d', 'date', '', _('count rate for revisions matching date spec')), ('t', 'template', '{author|email}', _('template to group changesets')), ('f', 'dateformat', '', _('strftime-compatible format for grouping by date')), diff -r 78658990c725 -r 56719b1aa6f4 hgext/color.py --- a/hgext/color.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/color.py Sun Apr 26 11:49:17 2009 +0200 @@ -18,15 +18,16 @@ '''add color output to status, qseries, and diff-related 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 patch status -(applied, unapplied, missing), and to diff-related commands to highlight -additions, removals, diff headers, and trailing whitespace. +This extension modifies the status command to add color to its output +to reflect file status, the qseries command to add color to reflect +patch status (applied, unapplied, missing), and to diff-related +commands to highlight additions, removals, diff headers, and trailing +whitespace. -Other effects in addition to color, like bold and underlined text, are also -available. Effects are rendered with the ECMA-48 SGR control function (aka -ANSI escape codes). This module also provides the render_text function, -which can be used to add effects to any text. +Other effects in addition to color, like bold and underlined text, are +also available. Effects are rendered with the ECMA-48 SGR control +function (aka ANSI escape codes). This module also provides the +render_text function, which can be used to add effects to any text. To enable this extension, add this to your .hgrc file: [extensions] diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/__init__.py --- a/hgext/convert/__init__.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/__init__.py Sun Apr 26 11:49:17 2009 +0200 @@ -8,6 +8,7 @@ import convcmd import cvsps +import subversion from mercurial import commands from mercurial.i18n import _ @@ -31,32 +32,32 @@ - Mercurial [hg] - Subversion [svn] (history on branches is not preserved) - If no revision is given, all revisions will be converted. Otherwise, - convert will only import up to the named revision (given in a format - understood by the source). + If no revision is given, all revisions will be converted. + Otherwise, convert will only import up to the named revision + (given in a format understood by the source). If no destination directory name is specified, it defaults to the - basename of the source with '-hg' appended. If the destination + basename of the source with '-hg' appended. If the destination repository doesn't exist, it will be created. If isn't given, it will be put in a default location - (/.hg/shamap by default). The is a simple text - file that maps each source commit ID to the destination ID for - that revision, like so: + (/.hg/shamap by default). The is a simple text file + that maps each source commit ID to the destination ID for that + revision, like so: - If the file doesn't exist, it's automatically created. It's updated - on each commit copied, so convert-repo can be interrupted and can - be run repeatedly to copy new commits. + If the file doesn't exist, it's automatically created. It's + updated on each commit copied, so convert-repo can be interrupted + and can be run repeatedly to copy new commits. - The [username mapping] file is a simple text file that maps each source - commit author to a destination commit author. It is handy for source SCMs - that use unix logins to identify authors (eg: CVS). One line per author - mapping and the line format is: + The [username mapping] file is a simple text file that maps each + source commit author to a destination commit author. It is handy + for source SCMs that use unix logins to identify authors (eg: + CVS). One line per author mapping and the line format is: srcauthor=whatever string you want The filemap is a file that allows filtering and remapping of files - and directories. Comment lines start with '#'. Each line can + and directories. Comment lines start with '#'. Each line can contain one of the following directives: include path/to/file @@ -67,32 +68,33 @@ The 'include' directive causes a file, or all files under a directory, to be included in the destination repository, and the - exclusion of all other files and dirs not explicitely included. + exclusion of all other files and directories not explicitely included. The 'exclude' directive causes files or directories to be omitted. - The 'rename' directive renames a file or directory. To rename from a - subdirectory into the root of the repository, use '.' as the path to - rename to. + The 'rename' directive renames a file or directory. To rename from + a subdirectory into the root of the repository, use '.' as the + path to rename to. The splicemap is a file that allows insertion of synthetic - history, letting you specify the parents of a revision. This is + history, letting you specify the parents of a revision. This is useful if you want to e.g. give a Subversion merge two parents, or - graft two disconnected series of history together. Each entry + graft two disconnected series of history together. Each entry contains a key, followed by a space, followed by one or two - values, separated by spaces. The key is the revision ID in the - source revision control system whose parents should be modified - (same format as a key in .hg/shamap). The values are the revision - IDs (in either the source or destination revision control system) - that should be used as the new parents for that node. + comma-separated values. The key is the revision ID in the source + revision control system whose parents should be modified (same + format as a key in .hg/shamap). The values are the revision IDs + (in either the source or destination revision control system) that + should be used as the new parents for that node. Mercurial Source ----------------- - --config convert.hg.ignoreerrors=False (boolean) + --config convert.hg.ignoreerrors=False (boolean) ignore integrity errors when reading. Use it to fix Mercurial repositories with missing revlogs, by converting from and to Mercurial. - --config convert.hg.saverev=False (boolean) - store original revision ID in changeset (forces target IDs to change) + --config convert.hg.saverev=False (boolean) + store original revision ID in changeset (forces target IDs to + change) --config convert.hg.startrev=0 (hg revision identifier) convert start revision and its descendants @@ -101,11 +103,11 @@ CVS source will use a sandbox (i.e. a checked-out copy) from CVS to indicate the starting point of what will be converted. Direct - access to the repository files is not needed, unless of course - the repository is :local:. The conversion uses the top level - directory in the sandbox to find the CVS repository, and then uses - CVS rlog commands to find files to convert. This means that unless - a filemap is given, all files under the starting directory will be + access to the repository files is not needed, unless of course the + repository is :local:. The conversion uses the top level directory + in the sandbox to find the CVS repository, and then uses CVS rlog + commands to find files to convert. This means that unless a + filemap is given, all files under the starting directory will be converted, and that any directory reorganisation in the CVS sandbox is ignored. @@ -121,34 +123,37 @@ Internal cvsps is selected by setting --config convert.cvsps=builtin and has a few more configurable options: - --config convert.cvsps.fuzz=60 (integer) - Specify the maximum time (in seconds) that is allowed between - commits with identical user and log message in a single - changeset. When very large files were checked in as part - of a changeset then the default may not be long enough. + --config convert.cvsps.fuzz=60 (integer) + Specify the maximum time (in seconds) that is allowed + between commits with identical user and log message in a + single changeset. When very large files were checked in as + part of a changeset then the default may not be long + enough. --config convert.cvsps.mergeto='{{mergetobranch ([-\w]+)}}' - Specify a regular expression to which commit log messages are - matched. If a match occurs, then the conversion process will - insert a dummy revision merging the branch on which this log - message occurs to the branch indicated in the regex. + Specify a regular expression to which commit log messages + are matched. If a match occurs, then the conversion + process will insert a dummy revision merging the branch on + which this log message occurs to the branch indicated in + the regex. --config convert.cvsps.mergefrom='{{mergefrombranch ([-\w]+)}}' - Specify a regular expression to which commit log messages are - matched. If a match occurs, then the conversion process will - add the most recent revision on the branch indicated in the - regex as the second parent of the changeset. + Specify a regular expression to which commit log messages + are matched. If a match occurs, then the conversion + process will add the most recent revision on the branch + indicated in the regex as the second parent of the + changeset. - The hgext/convert/cvsps wrapper script allows the builtin changeset - merging code to be run without doing a conversion. Its parameters and - output are similar to that of cvsps 2.1. + The hgext/convert/cvsps wrapper script allows the builtin + changeset merging code to be run without doing a conversion. Its + parameters and output are similar to that of cvsps 2.1. Subversion Source ----------------- Subversion source detects classical trunk/branches/tags layouts. By default, the supplied "svn://repo/path/" source URL is - converted as a single branch. If "svn://repo/path/trunk" exists - it replaces the default branch. If "svn://repo/path/branches" - exists, its subdirectories are listed as possible branches. If + converted as a single branch. If "svn://repo/path/trunk" exists it + replaces the default branch. If "svn://repo/path/branches" exists, + its subdirectories are listed as possible branches. If "svn://repo/path/tags" exists, it is looked for tags referencing converted branches. Default "trunk", "branches" and "tags" values can be overriden with following options. Set them to paths @@ -172,16 +177,17 @@ Perforce Source --------------- - The Perforce (P4) importer can be given a p4 depot path or a client - specification as source. It will convert all files in the source to - a flat Mercurial repository, ignoring labels, branches and integrations. - Note that when a depot path is given you then usually should specify a - target directory, because otherwise the target may be named ...-hg. + The Perforce (P4) importer can be given a p4 depot path or a + client specification as source. It will convert all files in the + source to a flat Mercurial repository, ignoring labels, branches + and integrations. Note that when a depot path is given you then + usually should specify a target directory, because otherwise the + target may be named ...-hg. - It is possible to limit the amount of source history to be converted - by specifying an initial Perforce revision. + It is possible to limit the amount of source history to be + converted by specifying an initial Perforce revision. - --config convert.p4.startrev=0 (perforce changelist number) + --config convert.p4.startrev=0 (perforce changelist number) specify initial Perforce revision. @@ -199,17 +205,19 @@ return convcmd.convert(ui, src, dest, revmapfile, **opts) def debugsvnlog(ui, **opts): - return convcmd.debugsvnlog(ui, **opts) + return subversion.debugsvnlog(ui, **opts) def debugcvsps(ui, *args, **opts): '''create changeset information from CVS - This command is intended as a debugging tool for the CVS to Mercurial - converter, and can be used as a direct replacement for cvsps. + This command is intended as a debugging tool for the CVS to + Mercurial converter, and can be used as a direct replacement for + cvsps. - Hg debugcvsps reads the CVS rlog for current directory (or any named - directory) in the CVS repository, and converts the log to a series of - changesets based on matching commit log entries and dates.''' + Hg debugcvsps reads the CVS rlog for current directory (or any + named directory) in the CVS repository, and converts the log to a + series of changesets based on matching commit log entries and + dates.''' return cvsps.debugcvsps(ui, *args, **opts) commands.norepo += " convert debugsvnlog debugcvsps" diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/bzr.py --- a/hgext/convert/bzr.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/bzr.py Sun Apr 26 11:49:17 2009 +0200 @@ -29,15 +29,15 @@ def __init__(self, ui, path, rev=None): super(bzr_source, self).__init__(ui, path, rev=rev) + if not os.path.exists(os.path.join(path, '.bzr')): + raise NoRepo('%s does not look like a Bazaar repo' % path) + try: # access bzrlib stuff branch except NameError: raise NoRepo('Bazaar modules could not be loaded') - if not os.path.exists(os.path.join(path, '.bzr')): - raise NoRepo('%s does not look like a Bazaar repo' % path) - path = os.path.abspath(path) self.branch = branch.Branch.open(path) self.sourcerepo = self.branch.repository diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/common.py --- a/hgext/convert/common.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/common.py Sun Apr 26 11:49:17 2009 +0200 @@ -333,8 +333,12 @@ if err.errno != errno.ENOENT: raise return - for line in fp: - key, value = strutil.rsplit(line[:-1], ' ', 1) + for i, line in enumerate(fp): + try: + key, value = line[:-1].rsplit(' ', 1) + except ValueError: + raise util.Abort(_('syntax error in %s(%d): key/value pair expected') + % (self.path, i+1)) if key not in self: self.order.append(key) super(mapfile, self).__setitem__(key, value) diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/convcmd.py --- a/hgext/convert/convcmd.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/convcmd.py Sun Apr 26 11:49:17 2009 +0200 @@ -10,7 +10,7 @@ from darcs import darcs_source from git import convert_git from hg import mercurial_source, mercurial_sink -from subversion import debugsvnlog, svn_source, svn_sink +from subversion import svn_source, svn_sink from monotone import monotone_source from gnuarch import gnuarch_source from bzr import bzr_source @@ -18,7 +18,7 @@ import filemap import os, shutil -from mercurial import hg, util +from mercurial import hg, util, encoding from mercurial.i18n import _ orig_encoding = 'ascii' @@ -188,33 +188,38 @@ def writeauthormap(self): authorfile = self.authorfile if authorfile: - self.ui.status(_('Writing author map file %s\n') % authorfile) - ofile = open(authorfile, 'w+') - for author in self.authors: - ofile.write("%s=%s\n" % (author, self.authors[author])) - ofile.close() + self.ui.status(_('Writing author map file %s\n') % authorfile) + ofile = open(authorfile, 'w+') + for author in self.authors: + ofile.write("%s=%s\n" % (author, self.authors[author])) + ofile.close() def readauthormap(self, authorfile): afile = open(authorfile, 'r') for line in afile: - if line.strip() == '': + + line = line.strip() + if not line or line.startswith('#'): continue + try: srcauthor, dstauthor = line.split('=', 1) - srcauthor = srcauthor.strip() - dstauthor = dstauthor.strip() - if srcauthor in self.authors and dstauthor != self.authors[srcauthor]: - self.ui.status( - _('Overriding mapping for author %s, was %s, will be %s\n') - % (srcauthor, self.authors[srcauthor], dstauthor)) - else: - self.ui.debug(_('mapping author %s to %s\n') - % (srcauthor, dstauthor)) - self.authors[srcauthor] = dstauthor - except IndexError: - self.ui.warn( - _('Ignoring bad line in author map file %s: %s\n') - % (authorfile, line.rstrip())) + except ValueError: + msg = _('Ignoring bad line in author map file %s: %s\n') + self.ui.warn(msg % (authorfile, line.rstrip())) + continue + + srcauthor = srcauthor.strip() + dstauthor = dstauthor.strip() + if self.authors.get(srcauthor) in (None, dstauthor): + msg = _('mapping author %s to %s\n') + self.ui.debug(msg % (srcauthor, dstauthor)) + self.authors[srcauthor] = dstauthor + continue + + m = _('overriding mapping for author %s, was %s, will be %s\n') + self.ui.status(m % (srcauthor, self.authors[srcauthor], dstauthor)) + afile.close() def cachecommit(self, rev): @@ -275,7 +280,7 @@ if "\n" in desc: desc = desc.splitlines()[0] # convert log message to local encoding without using - # tolocal() because util._encoding conver() use it as + # tolocal() because encoding.encoding conver() use it as # 'utf-8' self.ui.status("%d %s\n" % (num, recode(desc))) self.ui.note(_("source: %s\n") % recode(c)) @@ -308,8 +313,8 @@ def convert(ui, src, dest=None, revmapfile=None, **opts): global orig_encoding - orig_encoding = util._encoding - util._encoding = 'UTF-8' + orig_encoding = encoding.encoding + encoding.encoding = 'UTF-8' if not dest: dest = hg.defaultdest(src) + "-hg" diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/cvs.py --- a/hgext/convert/cvs.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/cvs.py Sun Apr 26 11:49:17 2009 +0200 @@ -24,7 +24,7 @@ if not self.builtin: checktool(cvspsexe) - self.changeset = {} + self.changeset = None self.files = {} self.tags = {} self.lastbranch = {} @@ -34,12 +34,12 @@ self.cvsrepo = file(os.path.join(cvs, "Repository")).read()[:-1] self.encoding = locale.getpreferredencoding() - self._parse(ui) self._connect() - def _parse(self, ui): - if self.changeset: + def _parse(self): + if self.changeset is not None: return + self.changeset = {} maxrev = 0 cmd = self.cmd @@ -65,13 +65,13 @@ if self.builtin: # builtin cvsps code - ui.status(_('using builtin cvsps\n')) + self.ui.status(_('using builtin cvsps\n')) - db = cvsps.createlog(ui, cache='update') - db = cvsps.createchangeset(ui, db, - fuzz=int(ui.config('convert', 'cvsps.fuzz', 60)), - mergeto=ui.config('convert', 'cvsps.mergeto', None), - mergefrom=ui.config('convert', 'cvsps.mergefrom', None)) + db = cvsps.createlog(self.ui, cache='update') + db = cvsps.createchangeset(self.ui, db, + fuzz=int(self.ui.config('convert', 'cvsps.fuzz', 60)), + mergeto=self.ui.config('convert', 'cvsps.mergeto', None), + mergefrom=self.ui.config('convert', 'cvsps.mergefrom', None)) for cs in db: if maxrev and cs.id>maxrev: @@ -278,6 +278,7 @@ r = self.readp.readline() def getheads(self): + self._parse() return self.heads def _getfile(self, name, rev): @@ -327,11 +328,12 @@ elif line.startswith("E "): self.ui.warn(_("cvs server: %s\n") % line[2:]) elif line.startswith("Remove"): - l = self.readp.readline() + self.readp.readline() else: raise util.Abort(_("unknown CVS response: %s") % line) def getfile(self, file, rev): + self._parse() data, mode = self._getfile(file, rev) self.modecache[(file, rev)] = mode return data @@ -340,14 +342,18 @@ return self.modecache[(file, rev)] def getchanges(self, rev): + self._parse() self.modecache = {} return util.sort(self.files[rev].items()), {} def getcommit(self, rev): + self._parse() return self.changeset[rev] def gettags(self): + self._parse() return self.tags def getchangedfiles(self, rev, i): + self._parse() return util.sort(self.files[rev].keys()) diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/cvsps.py --- a/hgext/convert/cvsps.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/cvsps.py Sun Apr 26 11:49:17 2009 +0200 @@ -34,10 +34,17 @@ .revision - revision number as tuple .tags - list of tags on the file .synthetic - is this a synthetic "file ... added on ..." revision? + .mergepoint- the branch that has been merged from (if present in rlog output) ''' def __init__(self, **entries): self.__dict__.update(entries) + def __repr__(self): + return "<%s at 0x%x: %s %s>" % (self.__class__.__name__, + id(self), + self.file, + ".".join(map(str, self.revision))) + class logerror(Exception): pass @@ -105,7 +112,7 @@ re_31 = re.compile('----------------------------$') re_32 = re.compile('=============================================================================$') re_50 = re.compile('revision ([\\d.]+)(\s+locked by:\s+.+;)?$') - re_60 = re.compile(r'date:\s+(.+);\s+author:\s+(.+);\s+state:\s+(.+?);(\s+lines:\s+(\+\d+)?\s+(-\d+)?;)?') + re_60 = re.compile(r'date:\s+(.+);\s+author:\s+(.+);\s+state:\s+(.+?);(\s+lines:\s+(\+\d+)?\s+(-\d+)?;)?(.*mergepoint:\s+([^;]+);)?') re_70 = re.compile('branches: (.+);$') file_added_re = re.compile(r'file [^/]+ was (initially )?added on branch') @@ -187,6 +194,7 @@ # state machine begins here tags = {} # dictionary of revisions on current file with their tags + branchmap = {} # mapping between branch names and revision numbers state = 0 store = False # set when a new record can be appended @@ -244,6 +252,7 @@ elif state == 2: # expect 'symbolic names' if re_20.match(line): + branchmap = {} state = 3 elif state == 3: @@ -261,6 +270,7 @@ if rev not in tags: tags[rev] = [] tags[rev].append(match.group(1)) + branchmap[match.group(1)] = match.group(2) elif re_31.match(line): state = 5 @@ -311,6 +321,18 @@ e.lines = (0, int(match.group(6))) else: e.lines = None + + if match.group(7): # cvsnt mergepoint + myrev = match.group(8).split('.') + if len(myrev) == 2: # head + e.mergepoint = 'HEAD' + else: + myrev = '.'.join(myrev[:-2] + ['0', myrev[-2]]) + branches = [b for b in branchmap if branchmap[b] == myrev] + assert len(branches) == 1, 'unknown branch: %s' % e.mergepoint + e.mergepoint = branches[0] + else: + e.mergepoint = None e.comment = [] state = 7 @@ -354,7 +376,7 @@ e.revision[-1] == 1 and # 1.1 or 1.1.x.1 len(e.comment) == 1 and file_added_re.match(e.comment[0])): - ui.debug(_('found synthetic rev in %s: %r\n') + ui.debug(_('found synthetic revision in %s: %r\n') % (e.rcs, e.comment[0])) e.synthetic = True @@ -412,6 +434,7 @@ class changeset(object): '''Class changeset has the following attributes: + .id - integer identifying this changeset (list index) .author - author name as CVS knows it .branch - name of branch this changeset is on, or None .comment - commit message @@ -420,10 +443,16 @@ .parents - list of one or two parent changesets .tags - list of tags on this changeset .synthetic - from synthetic revision "file ... added on branch ..." + .mergepoint- the branch that has been merged from (if present in rlog output) ''' def __init__(self, **entries): self.__dict__.update(entries) + def __repr__(self): + return "<%s at 0x%x: %s>" % (self.__class__.__name__, + id(self), + getattr(self, 'id', "(no id)")) + def createchangeset(ui, log, fuzz=60, mergefrom=None, mergeto=None): '''Convert log into changesets.''' @@ -448,7 +477,8 @@ (c.date[0] + c.date[1]) + fuzz) and e.file not in files): c = changeset(comment=e.comment, author=e.author, - branch=e.branch, date=e.date, entries=[]) + branch=e.branch, date=e.date, entries=[], + mergepoint=getattr(e, 'mergepoint', None)) changesets.append(c) files = {} if len(changesets) % 100 == 0: @@ -470,7 +500,8 @@ # "File file4 was added on branch ..." (synthetic, 1 entry) # "Add file3 and file4 to fix ..." (real, 2 entries) # Hence the check for 1 entry here. - c.synthetic = (len(c.entries) == 1 and c.entries[0].synthetic) + synth = getattr(c.entries[0], 'synthetic', None) + c.synthetic = (len(c.entries) == 1 and synth) # Sort files in each changeset @@ -595,14 +626,20 @@ if p is not None: c.parents.append(p) + if c.mergepoint: + if c.mergepoint == 'HEAD': + c.mergepoint = None + c.parents.append(changesets[branches[c.mergepoint]]) + if mergefrom: m = mergefrom.search(c.comment) if m: m = m.group(1) if m == 'HEAD': m = None - if m in branches and c.branch != m: - c.parents.append(changesets[branches[m]]) + candidate = changesets[branches[m]] + if m in branches and c.branch != m and not candidate.synthetic: + c.parents.append(candidate) if mergeto: m = mergeto.search(c.comment) diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/darcs.py --- a/hgext/convert/darcs.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/darcs.py Sun Apr 26 11:49:17 2009 +0200 @@ -24,6 +24,9 @@ # check for _darcs, ElementTree, _darcs/inventory so that we can # easily skip test-convert-darcs if ElementTree is not around + if not os.path.exists(os.path.join(path, '_darcs', 'inventories')): + raise NoRepo("%s does not look like a darcs repo" % path) + if not os.path.exists(os.path.join(path, '_darcs')): raise NoRepo("%s does not look like a darcs repo" % path) @@ -32,9 +35,6 @@ if ElementTree is None: raise util.Abort(_("Python ElementTree module is not available")) - if not os.path.exists(os.path.join(path, '_darcs', 'inventories')): - raise NoRepo("%s does not look like a darcs repo" % path) - self.path = os.path.realpath(path) self.lastrev = None diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/filemap.py --- a/hgext/convert/filemap.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/filemap.py Sun Apr 26 11:49:17 2009 +0200 @@ -69,7 +69,7 @@ for pre, suf in rpairs(name): try: return mapping[pre], pre, suf - except KeyError, err: + except KeyError: pass return '', name, '' @@ -148,7 +148,7 @@ # wanted by previous runs. self._rebuilt = not revmap seen = {SKIPREV: SKIPREV} - dummyset = util.set() + dummyset = set() converted = [] for rev in revmap.order: mapped = revmap[rev] @@ -237,7 +237,7 @@ # map to any revision in the restricted graph. Put SKIPREV # in the set of wanted ancestors to simplify code elsewhere self.parentmap[rev] = SKIPREV - self.wantedancestors[rev] = util.set((SKIPREV,)) + self.wantedancestors[rev] = set((SKIPREV,)) return # Reuse the data from our parent. @@ -254,7 +254,7 @@ # The set of wanted ancestors of rev is the union of the sets # of wanted ancestors of its parents. Plus rev itself. - wrev = util.set() + wrev = set() for p in parents: wrev.update(self.wantedancestors[p]) wrev.add(rev) diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/git.py --- a/hgext/convert/git.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/git.py Sun Apr 26 11:49:17 2009 +0200 @@ -84,7 +84,6 @@ message = c[end+2:] message = self.recode(message) l = c[:end].splitlines() - manifest = l[0].split()[1] parents = [] for e in l[1:]: n, v = e.split(" ", 1) diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/gnuarch.py --- a/hgext/convert/gnuarch.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/gnuarch.py Sun Apr 26 11:49:17 2009 +0200 @@ -168,7 +168,7 @@ copies.update(cps) self.lastrev = rev - return util.sort(util.unique(changes)), copies + return util.sort(set(changes)), copies def getcommit(self, rev): changes = self.changes[rev] @@ -279,7 +279,7 @@ # Commit revision origin when dealing with a branch or tag if catlog.has_key('Continuation-of'): self.changes[rev].continuationof = self.recode(catlog['Continuation-of']) - except Exception, err: + except Exception: raise util.Abort(_('could not parse cat-log of %s') % rev) def _parsechangeset(self, data, rev): diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/hg.py --- a/hgext/convert/hg.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/hg.py Sun Apr 26 11:49:17 2009 +0200 @@ -42,7 +42,7 @@ if not self.repo.local(): raise NoRepo(_('%s is not a local Mercurial repo') % path) self.created.append(path) - except error.RepoError, err: + except error.RepoError: ui.print_exc() raise NoRepo("could not create hg repo %s as sink" % path) self.lock = None @@ -56,8 +56,8 @@ def after(self): self.ui.debug(_('run hg sink post-conversion action\n')) - self.lock = None - self.wlock = None + self.lock.release() + self.wlock.release() def revmapfile(self): return os.path.join(self.path, ".hg", "shamap") @@ -142,7 +142,7 @@ p2 = parents.pop(0) ctx = context.memctx(self.repo, (p1, p2), text, files.keys(), getfilectx, commit.author, commit.date, extra) - a = self.repo.commitctx(ctx) + self.repo.commitctx(ctx) text = "(octopus merge fixup)\n" p2 = hex(self.repo.changelog.tip()) @@ -155,35 +155,33 @@ return p2 def puttags(self, tags): - try: - parentctx = self.repo[self.tagsbranch] - tagparent = parentctx.node() - except error.RepoError, inst: - parentctx = None - tagparent = nullid + try: + parentctx = self.repo[self.tagsbranch] + tagparent = parentctx.node() + except error.RepoError: + parentctx = None + tagparent = nullid - try: - oldlines = util.sort(parentctx['.hgtags'].data().splitlines(1)) - except: - oldlines = [] + try: + oldlines = util.sort(parentctx['.hgtags'].data().splitlines(1)) + except: + oldlines = [] - newlines = util.sort([("%s %s\n" % (tags[tag], tag)) for tag in tags]) - - if newlines == oldlines: - return None - data = "".join(newlines) - - def getfilectx(repo, memctx, f): + newlines = util.sort([("%s %s\n" % (tags[tag], tag)) for tag in tags]) + if newlines == oldlines: + return None + data = "".join(newlines) + def getfilectx(repo, memctx, f): return context.memfilectx(f, data, False, False, None) - self.ui.status(_("updating tags\n")) - date = "%s 0" % int(time.mktime(time.gmtime())) - extra = {'branch': self.tagsbranch} - ctx = context.memctx(self.repo, (tagparent, None), "update tags", - [".hgtags"], getfilectx, "convert-repo", date, - extra) - self.repo.commitctx(ctx) - return hex(self.repo.changelog.tip()) + self.ui.status(_("updating tags\n")) + date = "%s 0" % int(time.mktime(time.gmtime())) + extra = {'branch': self.tagsbranch} + ctx = context.memctx(self.repo, (tagparent, None), "update tags", + [".hgtags"], getfilectx, "convert-repo", date, + extra) + self.repo.commitctx(ctx) + return hex(self.repo.changelog.tip()) def setfilemapmode(self, active): self.filemapmode = active diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/monotone.py --- a/hgext/convert/monotone.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/monotone.py Sun Apr 26 11:49:17 2009 +0200 @@ -1,8 +1,8 @@ # monotone support for the convert extension -import os, re, time +import os, re from mercurial import util -from common import NoRepo, MissingTool, commit, converter_source, checktool +from common import NoRepo, commit, converter_source, checktool from common import commandline from mercurial.i18n import _ @@ -14,6 +14,16 @@ self.ui = ui self.path = path + norepo = NoRepo (_("%s does not look like a monotone repo") % path) + if not os.path.exists(os.path.join(path, '_MTN')): + # Could be a monotone repository (SQLite db file) + try: + header = file(path, 'rb').read(16) + except: + header = '' + if header != 'SQLite format 3\x00': + raise norepo + # regular expressions for parsing monotone output space = r'\s*' name = r'\s+"((?:\\"|[^"])*)"\s*' @@ -39,10 +49,6 @@ self.files = None self.dirs = None - norepo = NoRepo (_("%s does not look like a monotone repo") % path) - if not os.path.exists(path): - raise norepo - checktool('mtn', abort=False) # test if there are any revisions @@ -166,7 +172,8 @@ # d2 => d3 ignoremove[tofile] = 1 for tofile, fromfile in renamed.items(): - self.ui.debug (_("copying file in renamed dir from '%s' to '%s'") + self.ui.debug (_("copying file in renamed directory " + "from '%s' to '%s'") % (fromfile, tofile), '\n') files[tofile] = rev copies[tofile] = fromfile diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/p4.py --- a/hgext/convert/p4.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/p4.py Sun Apr 26 11:49:17 2009 +0200 @@ -10,7 +10,7 @@ from mercurial import util from mercurial.i18n import _ -from common import commit, converter_source, checktool +from common import commit, converter_source, checktool, NoRepo import marshal def loaditer(f): @@ -28,7 +28,10 @@ def __init__(self, ui, path, rev=None): super(p4_source, self).__init__(ui, path, rev=rev) - checktool('p4') + if not path.startswith('//'): + raise NoRepo('%s does not look like a P4 repo' % path) + + checktool('p4', abort=False) self.p4changes = {} self.heads = {} diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/subversion.py --- a/hgext/convert/subversion.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/subversion.py Sun Apr 26 11:49:17 2009 +0200 @@ -134,6 +134,38 @@ self._stdout.close() self._stdout = None + +# Check to see if the given path is a local Subversion repo. Verify this by +# looking for several svn-specific files and directories in the given +# directory. +def filecheck(path, proto): + for x in ('locks', 'hooks', 'format', 'db', ): + if not os.path.exists(os.path.join(path, x)): + return False + return True + +# Check to see if a given path is the root of an svn repo over http. We verify +# this by requesting a version-controlled URL we know can't exist and looking +# for the svn-specific "not found" XML. +def httpcheck(path, proto): + return ('' in + urllib.urlopen('%s://%s/!svn/ver/0/.svn' % (proto, path)).read()) + +protomap = {'http': httpcheck, + 'https': httpcheck, + 'file': filecheck, + } +def issvnurl(url): + if not '://' in url: + return False + proto, path = url.split('://', 1) + check = protomap.get(proto, lambda p, p2: False) + while '/' in path: + if check(path, proto): + return True + path = path.rsplit('/', 1)[0] + return False + # SVN conversion code stolen from bzr-svn and tailor # # Subversion looks like a versioned filesystem, branches structures @@ -152,6 +184,12 @@ def __init__(self, ui, url, rev=None): super(svn_source, self).__init__(ui, url, rev=rev) + if not (url.startswith('svn://') or url.startswith('svn+ssh://') or + (os.path.exists(url) and + os.path.exists(os.path.join(url, '.svn'))) or + issvnurl(url)): + raise NoRepo("%s does not look like a Subversion repo" % url) + try: SubversionException except NameError: @@ -177,7 +215,7 @@ if at >= 0: latest = int(url[at+1:]) url = url[:at] - except ValueError, e: + except ValueError: pass self.url = geturl(url) self.encoding = 'UTF-8' # Subversion is always nominal UTF-8 @@ -194,7 +232,7 @@ self.commits = {} self.paths = {} self.uuid = svn.ra.get_uuid(self.ra).decode(self.encoding) - except SubversionException, e: + except SubversionException: ui.print_exc() raise NoRepo("%s does not look like a Subversion repo" % self.url) @@ -215,7 +253,7 @@ try: self.get_blacklist() - except IOError, e: + except IOError: pass self.head = self.latest(self.module, latest) @@ -246,7 +284,7 @@ svn.client.ls(self.url.rstrip('/') + '/' + urllib.quote(path), optrev, False, self.ctx) return True - except SubversionException, err: + except SubversionException: return False def getheads(self): @@ -309,7 +347,7 @@ if self.startrev and self.heads: if len(self.heads) > 1: - raise util.Abort(_('svn: start revision is not supported with ' + raise util.Abort(_('svn: start revision is not supported ' 'with more than one branch')) revnum = self.revnum(self.heads[0]) if revnum < self.startrev: @@ -438,7 +476,7 @@ pendings = remainings tagspath = srctagspath - except SubversionException, (inst, num): + except SubversionException: self.ui.note(_('no tags found at revision %d\n') % start) return tags @@ -463,7 +501,7 @@ return int(rev.split('@')[-1]) def revsplit(self, rev): - url, revnum = strutil.rsplit(rev.encode(self.encoding), '@', 1) + url, revnum = rev.encode(self.encoding).rsplit('@', 1) revnum = int(revnum) parts = url.split('/', 1) uuid = parts.pop(0)[4:] @@ -526,14 +564,14 @@ 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 = util.set() + 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, e: + except ValueError: pass # not an integer or a comment def is_blacklisted(self, svn_rev): @@ -716,7 +754,7 @@ copytopath = self.getrelpath(copytopath) copies[self.recode(copytopath)] = self.recode(entry, pmodule) - return (util.unique(entries), copies) + return (list(set(entries)), copies) def _fetch_revisions(self, from_revnum, to_revnum): if from_revnum < to_revnum: @@ -735,7 +773,7 @@ rev = self.revid(revnum) # branch log might return entries for a parent we already have - if (rev in self.commits or revnum < to_revnum): + if rev in self.commits or revnum < to_revnum: return None, branched parents = [] @@ -1061,7 +1099,7 @@ os.rename(tempname, wdest) def dirs_of(self, files): - dirs = util.set() + dirs = set() for f in files: if os.path.isdir(self.wjoin(f)): dirs.add(f) @@ -1103,7 +1141,7 @@ for f, v in files: try: data = source.getfile(f, v) - except IOError, inst: + except IOError: self.delete.append(f) else: e = source.getmode(f, v) @@ -1117,8 +1155,8 @@ return self.revid(self.childmap[parent]) except KeyError: pass - entries = util.set(self.delete) - files = util.frozenset(files) + entries = set(self.delete) + files = frozenset(files) entries.update(self.add_dirs(files.difference(entries))) if self.copies: for s, d in self.copies: diff -r 78658990c725 -r 56719b1aa6f4 hgext/convert/transport.py --- a/hgext/convert/transport.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/convert/transport.py Sun Apr 26 11:49:17 2009 +0200 @@ -44,8 +44,18 @@ svn.client.get_ssl_server_trust_file_provider(pool), ] # Platform-dependant authentication methods - if hasattr(svn.client, 'get_windows_simple_provider'): - providers.append(svn.client.get_windows_simple_provider(pool)) + getprovider = getattr(svn.core, 'svn_auth_get_platform_specific_provider', + None) + if getprovider: + # Available in svn >= 1.6 + for name in ('gnome_keyring', 'keychain', 'kwallet', 'windows'): + for type in ('simple', 'ssl_client_cert_pw', 'ssl_server_trust'): + p = getprovider(name, type, pool) + if p: + providers.append(p) + else: + if hasattr(svn.client, 'get_windows_simple_provider'): + providers.append(svn.client.get_windows_simple_provider(pool)) return svn.core.svn_auth_open(providers, pool) diff -r 78658990c725 -r 56719b1aa6f4 hgext/extdiff.py --- a/hgext/extdiff.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/extdiff.py Sun Apr 26 11:49:17 2009 +0200 @@ -7,7 +7,7 @@ ''' The `extdiff' Mercurial extension allows you to use external programs -to compare revisions, or revision with working dir. The external diff +to compare revisions, or revision with working directory. The external diff programs are called with a configurable set of options and two non-option arguments: paths to directories containing snapshots of files to compare. @@ -34,15 +34,15 @@ meld = # add new command called vimdiff, runs gvimdiff with DirDiff plugin - #(see http://www.vim.org/scripts/script.php?script_id=102) + # (see http://www.vim.org/scripts/script.php?script_id=102) # Non english user, be sure to put "let g:DirDiffDynamicDiffText = 1" in # your .vimrc vimdiff = gvim -f '+next' '+execute "DirDiff" argv(0) argv(1)' -You can use -I/-X and list of file or directory names like normal -"hg diff" command. The `extdiff' extension makes snapshots of only -needed files, so running the external diff program will actually be -pretty fast (at least faster than having to compare the entire tree). +You can use -I/-X and list of file or directory names like normal "hg +diff" command. The `extdiff' extension makes snapshots of only needed +files, so running the external diff program will actually be pretty +fast (at least faster than having to compare the entire tree). ''' from mercurial.i18n import _ @@ -65,7 +65,7 @@ ui.note(_('making snapshot of %d files from rev %s\n') % (len(files), short(node))) else: - ui.note(_('making snapshot of %d files from working dir\n') % + ui.note(_('making snapshot of %d files from working directory\n') % (len(files))) wopener = util.opener(base) fns_and_mtime = [] @@ -164,19 +164,19 @@ '''use external program to diff repository (or selected files) Show differences between revisions for the specified files, using - an external program. The default program used is diff, with + an external program. The default program used is diff, with default options "-Npru". - To select a different program, use the -p option. The program - will be passed the names of two directories to compare. To pass - additional options to the program, use the -o option. These will - be passed before the names of the directories to compare. + To select a different program, use the -p/--program option. The + program will be passed the names of two directories to compare. To + pass additional options to the program, use -o/--option. These + will be passed before the names of the directories to compare. - When two revision arguments are given, then changes are - shown between those revisions. If only one revision is - specified then that revision is compared to the working - directory, and, when no revisions are specified, the - working directory files are compared to its parent.''' + When two revision arguments are given, then changes are shown + between those revisions. If only one revision is specified then + that revision is compared to the working directory, and, when no + revisions are specified, the working directory files are compared + to its parent.''' program = opts['program'] or 'diff' if opts['program']: option = opts['option'] diff -r 78658990c725 -r 56719b1aa6f4 hgext/fetch.py --- a/hgext/fetch.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/fetch.py Sun Apr 26 11:49:17 2009 +0200 @@ -9,6 +9,7 @@ from mercurial.i18n import _ from mercurial.node import nullid, short from mercurial import commands, cmdutil, hg, util, url +from mercurial.lock import release def fetch(ui, repo, source='default', **opts): '''pull changes from a remote repository, merge new changes if needed. @@ -16,13 +17,14 @@ This finds all changes from the repository at the specified path or URL and adds them to the local repository. - If the pulled changes add a new branch head, the head is automatically - merged, and the result of the merge is committed. Otherwise, the - working directory is updated to include the new changes. + If the pulled changes add a new branch head, the head is + automatically merged, and the result of the merge is committed. + Otherwise, the working directory is updated to include the new + changes. When a merge occurs, the newly pulled changes are assumed to be - "authoritative". The head of the new changes is used as the first - parent, with local changes as the second. To switch the merge + "authoritative". The head of the new changes is used as the first + parent, with local changes as the second. To switch the merge order, use --switch-parent. See 'hg help dates' for a list of formats valid for -d/--date. @@ -131,7 +133,7 @@ short(n))) finally: - del lock, wlock + release(lock, wlock) cmdtable = { 'fetch': diff -r 78658990c725 -r 56719b1aa6f4 hgext/graphlog.py --- a/hgext/graphlog.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/graphlog.py Sun Apr 26 11:49:17 2009 +0200 @@ -12,13 +12,12 @@ ''' import os -import sys from mercurial.cmdutil import revrange, show_changeset -from mercurial.commands import templateopts, logopts, remoteopts +from mercurial.commands import templateopts from mercurial.i18n import _ from mercurial.node import nullrev from mercurial import bundlerepo, changegroup, cmdutil, commands, extensions -from mercurial import hg, ui, url, util +from mercurial import hg, url, util def revisions(repo, start, stop): """cset DAG generator yielding (rev, node, [parents]) tuples @@ -287,7 +286,7 @@ def graphrevs(repo, nodes, opts): nodes.reverse() - include = util.set(nodes) + include = set(nodes) limit = cmdutil.loglimit(opts) count = 0 for node in nodes: @@ -385,8 +384,6 @@ chlist = other.changelog.nodesbetween(incoming, revs)[0] revdag = graphrevs(other, chlist, opts) - other_parents = [] - displayer = show_changeset(ui, other, opts, buffered=True) graphdag = graphabledag(ui, repo, revdag, opts) ascii(ui, grapher(graphdag)) diff -r 78658990c725 -r 56719b1aa6f4 hgext/hgk.py --- a/hgext/hgk.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/hgk.py Sun Apr 26 11:49:17 2009 +0200 @@ -7,17 +7,17 @@ '''browsing 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 distributed with Mercurial.) +graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not +distributed with Mercurial.) hgk consists of two parts: a Tcl script that does the displaying and querying of information, and an extension to mercurial named hgk.py, which provides hooks for hgk to get information. hgk can be found in the contrib directory, and hgk.py can be found in the hgext directory. -To load the hgext.py extension, add it to your .hgrc file (you have -to use your global $HOME/.hgrc file, not one in a repository). You -can specify an absolute path: +To load the hgext.py extension, add it to your .hgrc file (you have to +use your global $HOME/.hgrc file, not one in a repository). You can +specify an absolute path: [extensions] hgk=/usr/local/lib/hgk.py @@ -29,8 +29,8 @@ hgk= The hg view command will launch the hgk Tcl script. For this command -to work, hgk must be in your search path. Alternately, you can -specify the path to hgk in your .hgrc file: +to work, hgk must be in your search path. Alternately, you can specify +the path to hgk in your .hgrc file: [hgk] path=/location/of/hgk diff -r 78658990c725 -r 56719b1aa6f4 hgext/highlight/highlight.py --- a/hgext/highlight/highlight.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/highlight/highlight.py Sun Apr 26 11:49:17 2009 +0200 @@ -6,7 +6,7 @@ from mercurial import demandimport demandimport.ignore.extend(['pkgutil', 'pkg_resources', '__main__',]) -from mercurial import util +from mercurial import util, encoding from mercurial.templatefilters import filters from pygments import highlight @@ -30,19 +30,19 @@ return # avoid UnicodeDecodeError in pygments - text = util.tolocal(text) + text = encoding.tolocal(text) # To get multi-line strings right, we can't format line-by-line try: lexer = guess_lexer_for_filename(fctx.path(), text[:1024], - encoding=util._encoding) + encoding=encoding.encoding) except (ClassNotFound, ValueError): try: - lexer = guess_lexer(text[:1024], encoding=util._encoding) + lexer = guess_lexer(text[:1024], encoding=encoding.encoding) except (ClassNotFound, ValueError): - lexer = TextLexer(encoding=util._encoding) + lexer = TextLexer(encoding=encoding.encoding) - formatter = HtmlFormatter(style=style, encoding=util._encoding) + formatter = HtmlFormatter(style=style, encoding=encoding.encoding) colorized = highlight(text, lexer, formatter) # strip wrapping div diff -r 78658990c725 -r 56719b1aa6f4 hgext/inotify/__init__.py --- a/hgext/inotify/__init__.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/inotify/__init__.py Sun Apr 26 11:49:17 2009 +0200 @@ -58,7 +58,7 @@ if not ignored and not self.inotifyserver: result = client.query(ui, repo, files, match, False, clean, unknown) - if ui.config('inotify', 'debug'): + if result and ui.config('inotify', 'debug'): r2 = super(inotifydirstate, self).status( match, False, clean, unknown) for c,a,b in zip('LMARDUIC', result, r2): @@ -80,23 +80,21 @@ 'removing it)\n')) os.unlink(repo.join('inotify.sock')) if err[0] in (errno.ECONNREFUSED, errno.ENOENT) and autostart: - query = None ui.debug(_('(starting inotify server)\n')) try: try: server.start(ui, repo) - query = client.query except server.AlreadyStartedException, inst: # another process may have started its own # inotify server while this one was starting. ui.debug(str(inst)) - query = client.query except Exception, inst: ui.warn(_('could not start inotify server: ' '%s\n') % inst) - if query: + else: + # server is started, send query again try: - return query(ui, repo, files or [], match, + return client.query(ui, repo, files, match, ignored, clean, unknown) except socket.error, err: ui.warn(_('could not talk to new inotify ' diff -r 78658990c725 -r 56719b1aa6f4 hgext/inotify/client.py --- a/hgext/inotify/client.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/inotify/client.py Sun Apr 26 11:49:17 2009 +0200 @@ -23,7 +23,7 @@ raise def genquery(): - for n in names or []: + for n in names: yield n states = 'almrx!' if ignored: diff -r 78658990c725 -r 56719b1aa6f4 hgext/inotify/linux/__init__.py --- a/hgext/inotify/linux/__init__.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/inotify/linux/__init__.py Sun Apr 26 11:49:17 2009 +0200 @@ -27,7 +27,7 @@ def read_value(): try: return int(open(procfs_path + '/' + name).read()) - except OSError, err: + except OSError: return None read_value.__doc__ = '''Return the value of the %s setting from /proc. diff -r 78658990c725 -r 56719b1aa6f4 hgext/inotify/server.py --- a/hgext/inotify/server.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/inotify/server.py Sun Apr 26 11:49:17 2009 +0200 @@ -304,6 +304,11 @@ dd[fn] = status else: d.pop(fn, None) + elif not status: + # a directory is being removed, check its contents + for subfile, b in oldstatus.copy().iteritems(): + self.updatestatus(wfn + '/' + subfile, None) + def check_deleted(self, key): # Files that had been deleted but were present in the dirstate @@ -473,8 +478,7 @@ if evt.mask & inotify.IN_ISDIR: self.scan(wpath) - else: - self.schedule_work(wpath, 'd') + self.schedule_work(wpath, 'd') def process_modify(self, wpath, evt): if self.ui.debugflag: diff -r 78658990c725 -r 56719b1aa6f4 hgext/keyword.py --- a/hgext/keyword.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/keyword.py Sun Apr 26 11:49:17 2009 +0200 @@ -11,8 +11,8 @@ # # There are many good reasons why this is not needed in a distributed # SCM, still it may be useful in very small projects based on single -# files (like LaTeX packages), that are mostly addressed to an audience -# not running a version control system. +# files (like LaTeX packages), that are mostly addressed to an +# audience not running a version control system. # # For in-depth discussion refer to # . @@ -34,15 +34,15 @@ '''keyword expansion in local repositories -This extension expands RCS/CVS-like or self-customized $Keywords$ -in tracked text files selected by your configuration. +This extension expands RCS/CVS-like or self-customized $Keywords$ in +tracked text files selected by your configuration. -Keywords are only expanded in local repositories and not stored in -the change history. The mechanism can be regarded as a convenience -for the current user or for archive distribution. +Keywords are only expanded in local repositories and not stored in the +change history. The mechanism can be regarded as a convenience for the +current user or for archive distribution. -Configuration is done in the [keyword] and [keywordmaps] sections -of hgrc files. +Configuration is done in the [keyword] and [keywordmaps] sections of +hgrc files. Example: @@ -52,26 +52,28 @@ x* = ignore Note: the more specific you are in your filename patterns - the less you lose speed in huge repos. + the less you lose speed in huge repositories. For [keywordmaps] template mapping and expansion demonstration and control run "hg kwdemo". An additional date template filter {date|utcdate} is provided. -The default template mappings (view with "hg kwdemo -d") can be replaced -with customized keywords and templates. -Again, run "hg kwdemo" to control the results of your config changes. +The default template mappings (view with "hg kwdemo -d") can be +replaced with customized keywords and templates. Again, run "hg +kwdemo" to control the results of your config changes. Before changing/disabling active keywords, run "hg kwshrink" to avoid -the risk of inadvertedly storing expanded keywords in the change history. +the risk of inadvertedly storing expanded keywords in the change +history. To force expansion after enabling it, or a configuration change, run "hg kwexpand". -Also, when committing with the record extension or using mq's qrecord, be aware -that keywords cannot be updated. Again, run "hg kwexpand" on the files in -question to update keyword expansions after all changes have been checked in. +Also, when committing with the record extension or using mq's qrecord, +be aware that keywords cannot be updated. Again, run "hg kwexpand" on +the files in question to update keyword expansions after all changes +have been checked in. Expansions spanning more than one line and incremental expansions, like CVS' $Log$, are not supported. A keyword template map @@ -81,6 +83,7 @@ from mercurial import commands, cmdutil, dispatch, filelog, revlog, extensions from mercurial import patch, localrepo, templater, templatefilters, util from mercurial.hgweb import webcommands +from mercurial.lock import release from mercurial.node import nullid, hex from mercurial.i18n import _ import re, shutil, tempfile, time @@ -175,7 +178,8 @@ candidates = [f for f in files if self.iskwfile(f, ctx.flags)] if candidates: self.restrict = True # do not expand when reading - action = expand and 'expanding' or 'shrinking' + msg = (expand and _('overwriting %s expanding keywords\n') + or _('overwriting %s shrinking keywords\n')) for f in candidates: fp = self.repo.file(f) data = fp.read(mf[f]) @@ -189,7 +193,7 @@ else: found = self.re_kw.search(data) if found: - notify(_('overwriting %s %s keywords\n') % (f, action)) + notify(msg % f) self.repo.wwrite(f, data, mf.flags(f)) self.repo.dirstate.normal(f) self.restrict = False @@ -270,17 +274,16 @@ lock = repo.lock() kwt.overwrite(None, expand, status[6]) finally: - del wlock, lock - + release(lock, wlock) def demo(ui, repo, *args, **opts): '''print [keywordmaps] configuration and an expansion example - Show current, custom, or default keyword template maps - and their expansion. + Show current, custom, or default keyword template maps and their + expansion. - Extend current configuration by specifying maps as arguments - and optionally by reading from an additional hgrc file. + Extend current configuration by specifying maps as arguments and + optionally by reading from an additional hgrc file. Override current keyword template maps with "default" option. ''' @@ -297,7 +300,7 @@ fn = 'demo.txt' branchname = 'demobranch' tmpdir = tempfile.mkdtemp('', 'kwdemo.') - ui.note(_('creating temporary repo at %s\n') % tmpdir) + ui.note(_('creating temporary repository at %s\n') % tmpdir) repo = localrepo.localrepository(ui, tmpdir, True) ui.setconfig('keyword', fn, '') if args or opts.get('rcfile'): @@ -351,7 +354,7 @@ fmt = ui.verbose and ' in %s' % path or '' demostatus('%s keywords expanded%s' % (kwstatus, fmt)) ui.write(repo.wread(fn)) - ui.debug(_('\nremoving temporary repo %s\n') % tmpdir) + ui.debug(_('\nremoving temporary repository %s\n') % tmpdir) shutil.rmtree(tmpdir, ignore_errors=True) def expand(ui, repo, *pats, **opts): @@ -367,9 +370,9 @@ def files(ui, repo, *pats, **opts): '''print files currently configured for keyword expansion - Crosscheck which files in working directory are potential targets for - keyword expansion. - That is, files matched by [keyword] config patterns but not symlinks. + Crosscheck which files in working directory are potential targets + for keyword expansion. That is, files matched by [keyword] config + patterns but not symlinks. ''' kwt = kwtools['templater'] status = _status(ui, repo, kwt, opts.get('untracked'), *pats, **opts) @@ -389,8 +392,8 @@ def shrink(ui, repo, *pats, **opts): '''revert expanded keywords in working directory - Run before changing/disabling active keywords - or if you experience problems with "hg import" or "hg merge". + Run before changing/disabling active keywords or if you experience + problems with "hg import" or "hg merge". kwshrink refuses to run if given files contain local changes. ''' @@ -484,7 +487,7 @@ repo.hook('commit', node=n, parent1=_p1, parent2=_p2) return n finally: - del wlock, lock + release(lock, wlock) # monkeypatches def kwpatchfile_init(orig, self, ui, fname, opener, missing=False): diff -r 78658990c725 -r 56719b1aa6f4 hgext/mq.py --- a/hgext/mq.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/mq.py Sun Apr 26 11:49:17 2009 +0200 @@ -8,11 +8,11 @@ '''patch management and development This extension lets you work with a stack of patches in a Mercurial -repository. It manages two stacks of patches - all known patches, and +repository. It manages two stacks of patches - all known patches, and applied patches (subset of known patches). Known patches are represented as patch files in the .hg/patches -directory. Applied patches are both patch files and changesets. +directory. Applied patches are both patch files and changesets. Common tasks (use "hg help command" for more details): @@ -31,6 +31,7 @@ from mercurial.i18n import _ from mercurial.node import bin, hex, short, nullid, nullrev +from mercurial.lock import release from mercurial import commands, cmdutil, hg, patch, util from mercurial import repair, extensions, url, error import os, sys, re, errno @@ -203,7 +204,7 @@ bad = self.check_guard(guard) if bad: raise util.Abort(bad) - guards = util.sort(util.unique(guards)) + guards = util.sort(set(guards)) self.ui.debug(_('active guards: %s\n') % ' '.join(guards)) self.active_guards = guards self.guards_dirty = True @@ -518,7 +519,8 @@ repo.dirstate.invalidate() raise finally: - del tr, lock, wlock + del tr + release(lock, wlock) self.removeundo(repo) def _apply(self, repo, series, list=False, update_status=True, @@ -766,6 +768,7 @@ for chunk in chunks: p.write(chunk) p.close() + wlock.release() wlock = None r = self.qrepo() if r: r.add([patchfn]) @@ -781,7 +784,7 @@ raise self.removeundo(repo) finally: - del wlock + release(wlock) def strip(self, repo, rev, update=True, backup="all", force=None): wlock = lock = None @@ -801,7 +804,7 @@ # the actual strip self.removeundo(repo) finally: - del lock, wlock + release(lock, wlock) def isapplied(self, patch): """returns (index, rev, patch)""" @@ -968,7 +971,7 @@ self.ui.write(_("now at: %s\n") % top) return ret[0] finally: - del wlock + wlock.release() def pop(self, repo, patch=None, force=False, update=True, all=False): def getfile(f, rev, flags): @@ -1070,7 +1073,7 @@ else: self.ui.write(_("patch queue now empty\n")) finally: - del wlock + wlock.release() def diff(self, repo, pats, opts): top = self.check_toppatch(repo) @@ -1187,11 +1190,11 @@ del mm[mm.index(x)] dd.append(x) - m = util.unique(mm) - r = util.unique(dd) - a = util.unique(aa) + m = list(set(mm)) + r = list(set(dd)) + a = list(set(aa)) c = [filter(matchfn, l) for l in (m, a, r)] - match = cmdutil.matchfiles(repo, util.unique(c[0] + c[1] + c[2])) + match = cmdutil.matchfiles(repo, set(c[0] + c[1] + c[2])) chunks = patch.diff(repo, patchparent, match=match, changes=c, opts=self.diffopts()) for chunk in chunks: @@ -1295,7 +1298,7 @@ self.pop(repo, force=True) self.push(repo, force=True) finally: - del wlock + wlock.release() self.removeundo(repo) def init(self, repo, create=False): @@ -1335,7 +1338,7 @@ msg = '' return '%s%s' % (patchname, msg) - applied = dict.fromkeys([p.name for p in self.applied]) + applied = set([p.name for p in self.applied]) if length is None: length = len(self.series) - start if not missing: @@ -1624,14 +1627,16 @@ def delete(ui, repo, *patches, **opts): """remove patches from queue - The patches must not be applied, unless they are arguments to - the --rev parameter. At least one patch or revision is required. + The patches must not be applied, unless they are arguments to the + -r/--rev parameter. At least one patch or revision is required. With --rev, mq will stop managing the named revisions (converting - them to regular mercurial changesets). The qfinish command should be - used as an alternative for qdel -r, as the latter option is deprecated. + them to regular mercurial changesets). The qfinish command should + be used as an alternative for qdelete -r, as the latter option is + deprecated. - With --keep, the patch files are preserved in the patch directory.""" + With -k/--keep, the patch files are preserved in the patch + directory.""" q = repo.mq q.delete(repo, patches, opts) q.save_dirty() @@ -1662,23 +1667,29 @@ def qimport(ui, repo, *filename, **opts): """import a patch - The patch is inserted into the series after the last applied patch. - If no patches have been applied, qimport prepends the patch + The patch is inserted into the series after the last applied + patch. If no patches have been applied, qimport prepends the patch to the series. The patch will have the same name as its source file unless you - give it a new one with --name. + give it a new one with -n/--name. - You can register an existing patch inside the patch directory - with the --existing flag. + You can register an existing patch inside the patch directory with + the -e/--existing flag. + + With -f/--force, an existing patch of the same name will be + overwritten. - With --force, an existing patch of the same name will be overwritten. - - An existing changeset may be placed under mq control with --rev + An existing changeset may be placed under mq control with -r/--rev (e.g. qimport --rev tip -n patch will place tip under mq control). - With --git, patches imported with --rev will use the git diff + With -g/--git, patches imported with --rev will use the git diff format. See the diffs help topic for information on why this is - important for preserving rename/copy information and permission changes. + important for preserving rename/copy information and permission + changes. + + To import a patch from standard input, pass - as the patch file. + When importing from standard input, a patch name must be specified + using the --name flag. """ q = repo.mq q.qimport(repo, filename, patchname=opts['name'], @@ -1690,11 +1701,11 @@ def init(ui, repo, **opts): """init a new queue repository - The queue repository is unversioned by default. If -c is - specified, qinit will create a separate nested repository - for patches (qinit -c may also be run later to convert - an unversioned patch repository into a versioned one). - You can use qcommit to commit changes to this queue repository.""" + The queue repository is unversioned by default. If + -c/--create-repo is specified, qinit will create a separate nested + repository for patches (qinit -c may also be run later to convert + an unversioned patch repository into a versioned one). You can use + qcommit to commit changes to this queue repository.""" q = repo.mq r = q.init(repo, create=opts['create_repo']) q.save_dirty() @@ -1716,14 +1727,14 @@ def clone(ui, source, dest=None, **opts): '''clone main and patch repository at same time - If source is local, destination will have no patches applied. If + If source is local, destination will have no patches applied. If source is remote, this command can not check if patches are applied in source, so cannot guarantee that patches are not - applied in destination. If you clone remote repository, be sure + applied in destination. If you clone remote repository, be sure before that it has no patches applied. Source patch repository is looked for in /.hg/patches by - default. Use -p to change. + default. Use -p to change. The patch directory must be a nested mercurial repository, as would be created by qinit -c. @@ -1742,7 +1753,7 @@ else: patchespath = patchdir(sr) try: - pr = hg.repository(ui, patchespath) + hg.repository(ui, patchespath) except error.RepoError: raise util.Abort(_('versioned patch repository not found' ' (see qinit -c)')) @@ -1751,32 +1762,31 @@ if sr.mq.applied: qbase = bin(sr.mq.applied[0].rev) if not hg.islocal(dest): - heads = dict.fromkeys(sr.heads()) - for h in sr.heads(qbase): - del heads[h] - destrev = heads.keys() + heads = set(sr.heads()) + destrev = list(heads.difference(sr.heads(qbase))) destrev.append(sr.changelog.parents(qbase)[0]) elif sr.capable('lookup'): try: qbase = sr.lookup('qbase') except error.RepoError: pass - ui.note(_('cloning main repo\n')) + ui.note(_('cloning main repository\n')) sr, dr = hg.clone(ui, sr.url(), dest, pull=opts['pull'], rev=destrev, update=False, stream=opts['uncompressed']) - ui.note(_('cloning patch repo\n')) - spr, dpr = hg.clone(ui, opts['patches'] or patchdir(sr), patchdir(dr), - pull=opts['pull'], update=not opts['noupdate'], - stream=opts['uncompressed']) + ui.note(_('cloning patch repository\n')) + hg.clone(ui, opts['patches'] or patchdir(sr), patchdir(dr), + pull=opts['pull'], update=not opts['noupdate'], + stream=opts['uncompressed']) if dr.local(): if qbase: - ui.note(_('stripping applied patches from destination repo\n')) + ui.note(_('stripping applied patches from destination ' + 'repository\n')) dr.mq.strip(dr, qbase, update=False, backup=None) if not opts['noupdate']: - ui.note(_('updating destination repo\n')) + ui.note(_('updating destination repository\n')) hg.update(dr, dr.changelog.tip()) def commit(ui, repo, *pats, **opts): @@ -1834,20 +1844,23 @@ def new(ui, repo, patch, *args, **opts): """create a new patch - qnew creates a new patch on top of the currently-applied patch (if any). - It will refuse to run if there are any outstanding changes unless -f is - specified, in which case the patch will be initialized with them. You - may also use -I, -X, and/or a list of files after the patch name to add - only changes to matching files to the new patch, leaving the rest as - uncommitted modifications. + qnew creates a new patch on top of the currently-applied patch (if + any). It will refuse to run if there are any outstanding changes + unless -f/--force is specified, in which case the patch will be + initialized with them. You may also use -I/--include, + -X/--exclude, and/or a list of files after the patch name to add + only changes to matching files to the new patch, leaving the rest + as uncommitted modifications. - -u and -d can be used to set the (given) user and date, respectively. - -U and -D set user to current user and date to current date. + -u/--user and -d/--date can be used to set the (given) user and + date, respectively. -U/--currentuser and -D/--currentdate set user + to current user and date to current date. - -e, -m or -l set the patch header as well as the commit message. If none - is specified, the header is empty and the commit message is '[mq]: PATCH'. + -e/--edit, -m/--message or -l/--logfile set the patch header as + well as the commit message. If none is specified, the header is + empty and the commit message is '[mq]: PATCH'. - Use the --git option to keep the patch in the git extended diff + Use the -g/--git option to keep the patch in the git extended diff format. Read the diffs help topic for more information on why this is important for preserving permission changes and copy/rename information. @@ -1868,16 +1881,17 @@ def refresh(ui, repo, *pats, **opts): """update the current patch - If any file patterns are provided, the refreshed patch will contain only - the modifications that match those patterns; the remaining modifications - will remain in the working directory. + If any file patterns are provided, the refreshed patch will + contain only the modifications that match those patterns; the + remaining modifications will remain in the working directory. - If --short is specified, files currently included in the patch will - be refreshed just like matched files and remain in the patch. + If -s/--short is specified, files currently included in the patch + will be refreshed just like matched files and remain in the patch. - hg add/remove/copy/rename work as usual, though you might want to use - git-style patches (--git or [diff] git=1) to track copies and renames. - See the diffs help topic for more information on the git diff format. + hg add/remove/copy/rename work as usual, though you might want to + use git-style patches (-g/--git or [diff] git=1) to track copies + and renames. See the diffs help topic for more information on the + git diff format. """ q = repo.mq message = cmdutil.logmessage(opts) @@ -1898,13 +1912,15 @@ def diff(ui, repo, *pats, **opts): """diff of the current patch and subsequent modifications - Shows a diff which includes the current patch as well as any changes which - have been made in the working directory since the last refresh (thus - showing what the current patch would become after a qrefresh). + Shows a diff which includes the current patch as well as any + changes which have been made in the working directory since the + last refresh (thus showing what the current patch would become + after a qrefresh). - Use 'hg diff' if you only want to see the changes made since the last - qrefresh, or 'hg export qtip' if you want to see changes made by the - current patch without including changes made since the qrefresh. + Use 'hg diff' if you only want to see the changes made since the + last qrefresh, or 'hg export qtip' if you want to see changes made + by the current patch without including changes made since the + qrefresh. """ repo.mq.diff(repo, pats, opts) return 0 @@ -1915,12 +1931,12 @@ Patches must not yet be applied. Each patch will be successively applied to the current patch in the order given. If all the patches apply successfully, the current patch will be refreshed - with the new cumulative patch, and the folded patches will - be deleted. With -k/--keep, the folded patch files will not - be removed afterwards. + with the new cumulative patch, and the folded patches will be + deleted. With -k/--keep, the folded patch files will not be + removed afterwards. - The header for each folded patch will be concatenated with - the current patch header, separated by a line of '* * *'.""" + The header for each folded patch will be concatenated with the + current patch header, separated by a line of '* * *'.""" q = repo.mq @@ -2069,7 +2085,8 @@ def push(ui, repo, patch=None, **opts): """push the next patch onto the stack - When --force is applied, all local changes in patched files will be lost. + When -f/--force is applied, all local changes in patched files + will be lost. """ q = repo.mq mergeq = None @@ -2091,8 +2108,9 @@ def pop(ui, repo, patch=None, **opts): """pop the current patch off the stack - By default, pops off the top of the patch stack. If given a patch name, - keeps popping off patches until the named patch is at the top of the stack. + By default, pops off the top of the patch stack. If given a patch + name, keeps popping off patches until the named patch is at the + top of the stack. """ localupdate = True if opts['name']: @@ -2162,12 +2180,12 @@ r.copy(patch, name) r.remove([patch], False) finally: - del wlock + wlock.release() q.save_dirty() def restore(ui, repo, rev, **opts): - """restore the queue state saved by a rev""" + """restore the queue state saved by a revision""" rev = repo.lookup(rev) q = repo.mq q.restore(repo, rev, delete=opts['delete'], @@ -2208,8 +2226,9 @@ def strip(ui, repo, rev, **opts): """strip a revision and all its descendants from the repository - If one of the working dir's parent revisions is stripped, the working - directory will be updated to the parent of the stripped revision. + If one of the working directory's parent revisions is stripped, the + working directory will be updated to the parent of the stripped + revision. """ backup = 'all' if opts['backup']: @@ -2235,33 +2254,34 @@ '''set or print guarded patches to push Use the qguard command to set or print guards on patch, then use - qselect to tell mq which guards to use. A patch will be pushed if it - has no guards or any positive guards match the currently selected guard, - but will not be pushed if any negative guards match the current guard. - For example: + qselect to tell mq which guards to use. A patch will be pushed if + it has no guards or any positive guards match the currently + selected guard, but will not be pushed if any negative guards + match the current guard. For example: qguard foo.patch -stable (negative guard) qguard bar.patch +stable (positive guard) qselect stable This activates the "stable" guard. mq will skip foo.patch (because - it has a negative match) but push bar.patch (because it - has a positive match). + it has a negative match) but push bar.patch (because it has a + positive match). With no arguments, prints the currently active guards. With one argument, sets the active guard. Use -n/--none to deactivate guards (no other arguments needed). - When no guards are active, patches with positive guards are skipped - and patches with negative guards are pushed. + When no guards are active, patches with positive guards are + skipped and patches with negative guards are pushed. qselect can change the guards on applied patches. It does not pop - guarded patches by default. Use --pop to pop back to the last applied - patch that is not guarded. Use --reapply (which implies --pop) to push - back to the current patch afterwards, but skip guarded patches. + guarded patches by default. Use --pop to pop back to the last + applied patch that is not guarded. Use --reapply (which implies + --pop) to push back to the current patch afterwards, but skip + guarded patches. - Use -s/--series to print a list of all guards in the series file (no - other arguments needed). Use -v for more information.''' + Use -s/--series to print a list of all guards in the series file + (no other arguments needed). Use -v for more information.''' q = repo.mq guards = q.active() @@ -2336,16 +2356,18 @@ def finish(ui, repo, *revrange, **opts): """move applied patches into repository history - Finishes the specified revisions (corresponding to applied patches) by - moving them out of mq control into regular repository history. + Finishes the specified revisions (corresponding to applied + patches) by moving them out of mq control into regular repository + history. - Accepts a revision range or the --applied option. If --applied is - specified, all applied mq revisions are removed from mq control. - Otherwise, the given revisions must be at the base of the stack of - applied patches. + Accepts a revision range or the -a/--applied option. If --applied + is specified, all applied mq revisions are removed from mq + control. Otherwise, the given revisions must be at the base of the + stack of applied patches. - This can be especially useful if your changes have been applied to an - upstream repository, or if you are about to push your changes to upstream. + This can be especially useful if your changes have been applied to + an upstream repository, or if you are about to push your changes + to upstream. """ if not opts['applied'] and not revrange: raise util.Abort(_('no revisions specified')) @@ -2466,7 +2488,7 @@ ('U', 'noupdate', None, _('do not update the new working directories')), ('', 'uncompressed', None, _('use uncompressed transfer (fast over LAN)')), - ('p', 'patches', '', _('location of source patch repo')), + ('p', 'patches', '', _('location of source patch repository')), ] + commands.remoteopts, _('hg qclone [OPTION]... SOURCE [DEST]')), "qcommit|qci": @@ -2500,7 +2522,7 @@ 'qheader': (header, [], _('hg qheader [PATCH]')), "^qimport": (qimport, - [('e', 'existing', None, _('import file in patch dir')), + [('e', 'existing', None, _('import file in patch directory')), ('n', 'name', '', _('patch file name')), ('f', 'force', None, _('overwrite existing files')), ('r', 'rev', [], _('place existing revisions under mq control')), @@ -2553,7 +2575,7 @@ "qrestore": (restore, [('d', 'delete', None, _('delete save entry')), - ('u', 'update', None, _('update queue working dir'))], + ('u', 'update', None, _('update queue working directory'))], _('hg qrestore [-d] [-u] REV')), "qsave": (save, diff -r 78658990c725 -r 56719b1aa6f4 hgext/notify.py --- a/hgext/notify.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/notify.py Sun Apr 26 11:49:17 2009 +0200 @@ -59,13 +59,12 @@ # key is glob pattern, value is ","-separated list of subscriber emails pattern = user@host - glob patterns are matched against path to repo root. + glob patterns are matched against path to repository root. - if you like, you can put notify config file in repo that users can - push changes to, they can manage their own subscriptions.''' + if you like, you can put notify config file in repository that users + can push changes to, they can manage their own subscriptions.''' from mercurial.i18n import _ -from mercurial.node import bin, short from mercurial import patch, cmdutil, templater, util, mail import email.Parser, fnmatch, socket, time @@ -100,7 +99,7 @@ self.ui = ui cfg = self.ui.config('notify', 'config') if cfg: - self.ui.readsections(cfg, 'usersubs', 'reposubs') + self.ui.readconfig(cfg, sections=['usersubs', 'reposubs']) self.repo = repo self.stripcount = int(self.ui.config('notify', 'strip', 0)) self.root = self.strip(self.repo.root) @@ -147,18 +146,17 @@ def subscribers(self): '''return list of email addresses of subscribers to this repo.''' - subs = {} + subs = set() for user, pats in self.ui.configitems('usersubs'): for pat in pats.split(','): if fnmatch.fnmatch(self.repo.root, pat.strip()): - subs[self.fixmail(user)] = 1 + subs.add(self.fixmail(user)) for pat, users in self.ui.configitems('reposubs'): if fnmatch.fnmatch(self.repo.root, pat): for user in users.split(','): - subs[self.fixmail(user)] = 1 - subs = util.sort(subs) + subs.add(self.fixmail(user)) return [mail.addressencode(self.ui, s, self.charsets, self.test) - for s in subs] + for s in sorted(subs)] def url(self, path=None): return self.ui.config('web', 'baseurl') + (path or self.root) @@ -269,7 +267,7 @@ ctx = repo[node] if not n.subs: - ui.debug(_('notify: no subscribers to repo %s\n') % n.root) + ui.debug(_('notify: no subscribers to repository %s\n') % n.root) return if n.skipsource(source): ui.debug(_('notify: changes have source "%s" - skipping\n') % source) diff -r 78658990c725 -r 56719b1aa6f4 hgext/pager.py --- a/hgext/pager.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/pager.py Sun Apr 26 11:49:17 2009 +0200 @@ -19,12 +19,11 @@ [pager] pager = LESS='FSRX' less -If no pager is set, the pager extensions uses the environment -variable $PAGER. If neither pager.pager, nor $PAGER is set, no pager -is used. +If no pager is set, the pager extensions uses the environment variable +$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used. -If you notice "BROKEN PIPE" error messages, you can disable them -by setting: +If you notice "BROKEN PIPE" error messages, you can disable them by +setting: [pager] quiet = True @@ -35,15 +34,16 @@ [pager] ignore = version, help, update -You can also enable the pager only for certain commands using pager.attend: +You can also enable the pager only for certain commands using +pager.attend: [pager] attend = log If pager.attend is present, pager.ignore will be ignored. -To ignore global commands like "hg version" or "hg help", you have to specify -them in the global .hgrc +To ignore global commands like "hg version" or "hg help", you have to +specify them in the global .hgrc ''' import sys, os, signal diff -r 78658990c725 -r 56719b1aa6f4 hgext/parentrevspec.py --- a/hgext/parentrevspec.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/parentrevspec.py Sun Apr 26 11:49:17 2009 +0200 @@ -7,8 +7,8 @@ '''\ use suffixes to refer to ancestor revisions -This extension allows you to use git-style suffixes to refer to -the ancestors of a specific revision. +This extension allows you to use git-style suffixes to refer to the +ancestors of a specific revision. For example, if you can refer to a revision as "foo", then: @@ -23,7 +23,6 @@ foo~1 = foo^1 = foo^ = first parent of foo foo~2 = foo^1^1 = foo^^ = first parent of first parent of foo ''' -import mercurial.repo from mercurial import error def reposetup(ui, repo): diff -r 78658990c725 -r 56719b1aa6f4 hgext/patchbomb.py --- a/hgext/patchbomb.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/patchbomb.py Sun Apr 26 11:49:17 2009 +0200 @@ -1,11 +1,11 @@ '''sending Mercurial changesets as a series of patch emails -The series is started off with a "[PATCH 0 of N]" introduction, -which describes the series as a whole. +The series is started off with a "[PATCH 0 of N]" introduction, which +describes the series as a whole. -Each patch email has a Subject line of "[PATCH M of N] ...", using -the first line of the changeset description as the subject text. -The message contains two or three body parts: +Each patch email has a Subject line of "[PATCH M of N] ...", using the +first line of the changeset description as the subject text. The +message contains two or three body parts: The remainder of the changeset description. @@ -14,18 +14,20 @@ The patch itself, as generated by "hg export". Each message refers to all of its predecessors using the In-Reply-To -and References headers, so they will show up as a sequence in -threaded mail and news readers, and in mail archives. +and References headers, so they will show up as a sequence in threaded +mail and news readers, and in mail archives. For each changeset, you will be prompted with a diffstat summary and -the changeset summary, so you can be sure you are sending the right changes. +the changeset summary, so you can be sure you are sending the right +changes. To enable this extension: [extensions] hgext.patchbomb = -To configure other defaults, add a section like this to your hgrc file: +To configure other defaults, add a section like this to your hgrc +file: [email] from = My Name @@ -37,24 +39,24 @@ as a patchbomb. To avoid sending patches prematurely, it is a good idea to first run -the "email" command with the "-n" option (test only). You will be +the "email" command with the "-n" option (test only). You will be prompted for an email recipient address, a subject an an introductory -message describing the patches of your patchbomb. Then when all is +message describing the patches of your patchbomb. Then when all is done, patchbomb messages are displayed. If PAGER environment variable -is set, your pager will be fired up once for each patchbomb message, so -you can verify everything is alright. +is set, your pager will be fired up once for each patchbomb message, +so you can verify everything is alright. -The "-m" (mbox) option is also very useful. Instead of previewing -each patchbomb message in a pager or sending the messages directly, -it will create a UNIX mailbox file with the patch emails. This -mailbox file can be previewed with any mail user agent which supports -UNIX mbox files, e.g. with mutt: +The -m/--mbox option is also very useful. Instead of previewing each +patchbomb message in a pager or sending the messages directly, it will +create a UNIX mailbox file with the patch emails. This mailbox file +can be previewed with any mail user agent which supports UNIX mbox +files, e.g. with mutt: % mutt -R -f mbox When you are previewing the patchbomb messages, you can use `formail' -(a utility that is commonly installed as part of the procmail package), -to send each message out: +(a utility that is commonly installed as part of the procmail +package), to send each message out: % formail -s sendmail -bm -t < mbox @@ -62,9 +64,9 @@ You can also either configure the method option in the email section to be a sendmail compatable mailer or fill out the [smtp] section so -that the patchbomb extension can automatically send patchbombs directly -from the commandline. See the [email] and [smtp] sections in hgrc(5) -for details.''' +that the patchbomb extension can automatically send patchbombs +directly from the commandline. See the [email] and [smtp] sections in +hgrc(5) for details.''' import os, errno, socket, tempfile, cStringIO import email.MIMEMultipart, email.MIMEBase @@ -173,23 +175,23 @@ '''send changesets by email By default, diffs are sent in the format generated by hg export, - one per message. The series starts with a "[PATCH 0 of N]" + one per message. The series starts with a "[PATCH 0 of N]" introduction, which describes the series as a whole. Each patch email has a Subject line of "[PATCH M of N] ...", using the first line of the changeset description as the subject text. - The message contains two or three body parts. First, the rest of - the changeset description. Next, (optionally) if the diffstat + The message contains two or three body parts. First, the rest of + the changeset description. Next, (optionally) if the diffstat program is installed, the result of running diffstat on the patch. Finally, the patch itself, as generated by "hg export". - With --outgoing, emails will be generated for patches not - found in the destination repository (or only those which are - ancestors of the specified revisions if any are provided) + With -o/--outgoing, emails will be generated for patches not found + in the destination repository (or only those which are ancestors + of the specified revisions if any are provided) - With --bundle, changesets are selected as for --outgoing, - but a single email containing a binary Mercurial bundle as an - attachment will be sent. + With -b/--bundle, changesets are selected as for --outgoing, but a + single email containing a binary Mercurial bundle as an attachment + will be sent. Examples: @@ -208,8 +210,8 @@ hg email -b -r 3000 # bundle of all ancestors of 3000 not in default hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST - Before using this command, you will need to enable email in your hgrc. - See the [email] section in hgrc(5) for details. + Before using this command, you will need to enable email in your + hgrc. See the [email] section in hgrc(5) for details. ''' _charsets = mail._charsets(ui) @@ -230,8 +232,8 @@ def getpatches(revs): for r in cmdutil.revrange(repo, revs): output = cStringIO.StringIO() - p = patch.export(repo, [r], fp=output, - opts=patch.diffopts(ui, opts)) + patch.export(repo, [r], fp=output, + opts=patch.diffopts(ui, opts)) yield output.getvalue().split('\n') def getbundle(dest): @@ -344,8 +346,9 @@ msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test'))) datapart = email.MIMEBase.MIMEBase('application', 'x-mercurial-bundle') datapart.set_payload(bundle) + bundlename = '%s.hg' % opts.get('bundlename', 'bundle') datapart.add_header('Content-Disposition', 'attachment', - filename='bundle.hg') + filename=bundlename) email.Encoders.encode_base64(datapart) msg.attach(datapart) msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test')) @@ -381,7 +384,7 @@ ui.write('\n') - parent = None + parent = opts.get('in_reply_to') or None sender_addr = email.Utils.parseaddr(sender)[1] sender = mail.addressencode(ui, sender, _charsets, opts.get('test')) @@ -396,6 +399,7 @@ m['References'] = parent else: parent = m['Message-Id'] + m['User-Agent'] = 'Mercurial-patchbomb/%s' % util.version() m['Date'] = util.datestr(start_time, "%a, %d %b %Y %H:%M:%S %1%2") start_time = (start_time[0] + 1, start_time[1]) @@ -455,6 +459,8 @@ _('write messages to mbox file instead of sending them')), ('s', 'subject', '', _('subject of first message (intro or single patch)')), + ('', 'in-reply-to', '', + _('"message identifier to reply to"')), ('t', 'to', [], _('email addresses of recipients')), ] @@ -468,11 +474,15 @@ _('send changes not found in the target repository')), ('b', 'bundle', None, _('send changes not in target as a binary bundle')), + ('', 'bundlename', 'bundle', + _('file name of the bundle attachment')), ('r', 'rev', [], _('a revision to send')), ('', 'force', None, - _('run even when remote repository is unrelated (with -b)')), + _('run even when remote repository is unrelated ' + '(with -b/--bundle)')), ('', 'base', [], - _('a base changeset to specify instead of a destination (with -b)')), + _('a base changeset to specify instead of a destination ' + '(with -b/--bundle)')), ('', 'intro', None, _('send an introduction email for a single patch')), ] + emailopts + commands.remoteopts, diff -r 78658990c725 -r 56719b1aa6f4 hgext/purge.py --- a/hgext/purge.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/purge.py Sun Apr 26 11:49:17 2009 +0200 @@ -29,18 +29,18 @@ from mercurial import util, commands, cmdutil from mercurial.i18n import _ -import os +import os, stat def purge(ui, repo, *dirs, **opts): '''removes files not tracked by Mercurial - Delete files not known to Mercurial. This is useful to test local and - uncommitted changes in an otherwise-clean source tree. + Delete files not known to Mercurial. This is useful to test local + and uncommitted changes in an otherwise-clean source tree. This means that purge will delete: - Unknown files: files marked with "?" by "hg status" - - Empty directories: in fact Mercurial ignores directories unless they - contain files under source control managment + - Empty directories: in fact Mercurial ignores directories unless + they contain files under source control managment But it will leave untouched: - Modified and unmodified tracked files - Ignored files (unless --all is specified) @@ -49,9 +49,10 @@ If directories are given on the command line, only files in these directories are considered. - Be careful with purge, as you could irreversibly delete some files you - forgot to add to the repository. If you only want to print the list of - files that this program would delete, use the --print option. + Be careful with purge, as you could irreversibly delete some files + you forgot to add to the repository. If you only want to print the + list of files that this program would delete, use the --print + option. ''' act = not opts['print'] eol = '\n' @@ -71,6 +72,17 @@ else: ui.write('%s%s' % (name, eol)) + def removefile(path): + try: + os.remove(path) + except OSError: + # read-only files cannot be unlinked under Windows + s = os.stat(path) + if (s.st_mode & stat.S_IWRITE) != 0: + raise + os.chmod(path, stat.S_IMODE(s.st_mode) | stat.S_IWRITE) + os.remove(path) + directories = [] match = cmdutil.match(repo, dirs, opts) match.dir = directories.append @@ -78,7 +90,7 @@ for f in util.sort(status[4] + status[5]): ui.note(_('Removing file %s\n') % f) - remove(os.remove, f) + remove(removefile, f) for f in util.sort(directories)[::-1]: if match(f) and not os.listdir(repo.wjoin(f)): @@ -92,7 +104,7 @@ ('', 'all', None, _('purge ignored files too')), ('p', 'print', None, _('print the file names instead of deleting them')), ('0', 'print0', None, _('end filenames with NUL, for use with xargs' - ' (implies -p)')), + ' (implies -p/--print)')), ] + commands.walkopts, _('hg purge [OPTION]... [DIR]...')) } diff -r 78658990c725 -r 56719b1aa6f4 hgext/rebase.py --- a/hgext/rebase.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/rebase.py Sun Apr 26 11:49:17 2009 +0200 @@ -7,16 +7,18 @@ '''move sets of revisions to a different ancestor -This extension lets you rebase changesets in an existing Mercurial repository. +This extension lets you rebase changesets in an existing Mercurial +repository. For more information: http://www.selenic.com/mercurial/wiki/index.cgi/RebaseProject ''' from mercurial import util, repair, merge, cmdutil, commands, error -from mercurial import extensions, ancestor +from mercurial import extensions, ancestor, copies, patch from mercurial.commands import templateopts from mercurial.node import nullrev +from mercurial.lock import release from mercurial.i18n import _ import os, errno @@ -26,7 +28,6 @@ def newancestor(a, b, pfunc): ancestor.ancestor = oldancestor - anc = ancestor.ancestor(a, b, pfunc) if b == rev: return repo[rev].parents()[0].rev() return ancestor.ancestor(a, b, pfunc) @@ -41,12 +42,12 @@ def rebase(ui, repo, **opts): """move changeset (and descendants) to a different branch - Rebase uses repeated merging to graft changesets from one part of history - onto another. This can be useful for linearizing local changes relative to - a master development tree. + Rebase uses repeated merging to graft changesets from one part of + history onto another. This can be useful for linearizing local + changes relative to a master development tree. - If a rebase is interrupted to manually resolve a merge, it can be continued - with --continue or aborted with --abort. + If a rebase is interrupted to manually resolve a merge, it can be + continued with --continue/-c or aborted with --abort/-a. """ originalwd = target = None external = nullrev @@ -65,12 +66,8 @@ abortf = opts.get('abort') collapsef = opts.get('collapse', False) extrafn = opts.get('extrafn') - if opts.get('keepbranches', None): - if extrafn: - raise error.ParseError( - 'rebase', _('cannot use both keepbranches and extrafn')) - def extrafn(ctx, extra): - extra['branch'] = ctx.branch() + keepf = opts.get('keep', False) + keepbranchesf = opts.get('keepbranches', False) if contf or abortf: if contf and abortf: @@ -80,11 +77,12 @@ raise error.ParseError( 'rebase', _('cannot use collapse with continue or abort')) - if (srcf or basef or destf): + if srcf or basef or destf: raise error.ParseError('rebase', _('abort and continue do not allow specifying revisions')) - originalwd, target, state, collapsef, external = restorestatus(repo) + (originalwd, target, state, collapsef, keepf, + keepbranchesf, external) = restorestatus(repo) if abortf: abort(repo, originalwd, target, state) return @@ -100,14 +98,21 @@ repo.ui.status(_('nothing to rebase\n')) return + if keepbranchesf: + if extrafn: + raise error.ParseError( + 'rebase', _('cannot use both keepbranches and extrafn')) + def extrafn(ctx, extra): + extra['branch'] = ctx.branch() + # Rebase targetancestors = list(repo.changelog.ancestors(target)) targetancestors.append(target) for rev in util.sort(state): if state[rev] == -1: - storestatus(repo, originalwd, target, state, collapsef, - external) + storestatus(repo, originalwd, target, state, collapsef, keepf, + keepbranchesf, external) rebasenode(repo, rev, target, state, skipped, targetancestors, collapsef, extrafn) ui.note(_('rebase merging completed\n')) @@ -121,10 +126,9 @@ if 'qtip' in repo.tags(): updatemq(repo, state, skipped, **opts) - if not opts.get('keep'): + if not keepf: # Remove no more useful revisions - if (util.set(repo.changelog.descendants(min(state))) - - util.set(state.keys())): + if set(repo.changelog.descendants(min(state))) - set(state): ui.warn(_("warning: new changesets detected on source branch, " "not stripping\n")) else: @@ -137,7 +141,7 @@ if skipped: ui.note(_("%d revisions have been skipped\n") % len(skipped)) finally: - del lock, wlock + release(lock, wlock) def concludenode(repo, rev, p1, p2, state, collapse, last=False, skipped={}, extrafn=None): @@ -207,7 +211,18 @@ else: # we have an interrupted rebase repo.ui.debug(_('resuming interrupted rebase\n')) - + # Keep track of renamed files in the revision that is going to be rebased + # Here we simulate the copies and renames in the source changeset + cop, diver = copies.copies(repo, repo[rev], repo[target], repo[p2], True) + m1 = repo[rev].manifest() + m2 = repo[target].manifest() + for k, v in cop.iteritems(): + if k in m1: + if v in m1 or v in m2: + repo.dirstate.copy(v, k) + if v in m2 and v not in m1: + repo.dirstate.remove(v) + newrev = concludenode(repo, rev, p1, p2, state, collapse, extrafn=extrafn) @@ -250,6 +265,14 @@ p2 = P2n return p1, p2 +def isagitpatch(repo, patchname): + 'Return true if the given patch is in git format' + mqpatch = os.path.join(repo.mq.path, patchname) + for line in patch.linereader(file(mqpatch, 'rb')): + if line.startswith('diff --git'): + return True + return False + def updatemq(repo, state, skipped, **opts): 'Update rebased mq patches - finalize and then import them' mqrebase = {} @@ -257,7 +280,7 @@ if repo[p.rev].rev() in state: repo.ui.debug(_('revision %d is an mq patch (%s), finalize it.\n') % (repo[p.rev].rev(), p.name)) - mqrebase[repo[p.rev].rev()] = p.name + mqrebase[repo[p.rev].rev()] = (p.name, isagitpatch(repo, p.name)) if mqrebase: repo.mq.finish(repo, mqrebase.keys()) @@ -269,18 +292,21 @@ for rev in mq: if rev not in skipped: repo.ui.debug(_('import mq patch %d (%s)\n') - % (state[rev], mqrebase[rev])) - repo.mq.qimport(repo, (), patchname=mqrebase[rev], - git=opts.get('git', False),rev=[str(state[rev])]) + % (state[rev], mqrebase[rev][0])) + repo.mq.qimport(repo, (), patchname=mqrebase[rev][0], + git=mqrebase[rev][1],rev=[str(state[rev])]) repo.mq.save_dirty() -def storestatus(repo, originalwd, target, state, collapse, external): +def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches, + external): 'Store the current status to allow recovery' f = repo.opener("rebasestate", "w") f.write(repo[originalwd].hex() + '\n') f.write(repo[target].hex() + '\n') f.write(repo[external].hex() + '\n') f.write('%d\n' % int(collapse)) + f.write('%d\n' % int(keep)) + f.write('%d\n' % int(keepbranches)) for d, v in state.iteritems(): oldrev = repo[d].hex() newrev = repo[v].hex() @@ -310,11 +336,15 @@ external = repo[l].rev() elif i == 3: collapse = bool(int(l)) + elif i == 4: + keep = bool(int(l)) + elif i == 5: + keepbranches = bool(int(l)) else: oldrev, newrev = l.split(':') state[repo[oldrev].rev()] = repo[newrev].rev() repo.ui.debug(_('rebase status resumed\n')) - return originalwd, target, state, collapse, external + return originalwd, target, state, collapse, keep, keepbranches, external except IOError, err: if err.errno != errno.ENOENT: raise @@ -322,7 +352,7 @@ def abort(repo, originalwd, target, state): 'Restore the repository to its original state' - if util.set(repo.changelog.descendants(target)) - util.set(state.values()): + if set(repo.changelog.descendants(target)) - set(state.values()): repo.ui.warn(_("warning: new changesets detected on target branch, " "not stripping\n")) else: @@ -337,11 +367,10 @@ def buildstate(repo, dest, src, base, collapse): 'Define which revisions are going to be rebased and where' - state = {} - targetancestors = util.set() + targetancestors = set() if not dest: - # Destination defaults to the latest revision in the current branch + # Destination defaults to the latest revision in the current branch branch = repo[None].branch() dest = repo[branch].rev() else: @@ -367,12 +396,12 @@ repo.ui.debug(_('already working on current\n')) return None - targetancestors = util.set(repo.changelog.ancestors(dest)) + targetancestors = set(repo.changelog.ancestors(dest)) if cwd in targetancestors: repo.ui.debug(_('already working on the current branch\n')) return None - cwdancestors = util.set(repo.changelog.ancestors(cwd)) + cwdancestors = set(repo.changelog.ancestors(cwd)) cwdancestors.add(cwd) rebasingbranch = cwdancestors - targetancestors source = min(rebasingbranch) @@ -382,7 +411,7 @@ external = nullrev if collapse: if not targetancestors: - targetancestors = util.set(repo.changelog.ancestors(dest)) + targetancestors = set(repo.changelog.ancestors(dest)) for rev in state: # Check externals and fail if there are more than one for p in repo[rev].parents(): @@ -429,15 +458,15 @@ "rebase": (rebase, [ - ('', 'keep', False, _('keep original revisions')), - ('', 'keepbranches', False, _('keep original branches')), ('s', 'source', '', _('rebase from a given revision')), ('b', 'base', '', _('rebase from the base of a given revision')), ('d', 'dest', '', _('rebase onto a given revision')), ('', 'collapse', False, _('collapse the rebased revisions')), + ('', 'keep', False, _('keep original revisions')), + ('', 'keepbranches', False, _('keep original branches')), ('c', 'continue', False, _('continue an interrupted rebase')), ('a', 'abort', False, _('abort an interrupted rebase')),] + templateopts, - _('hg rebase [-s rev | -b rev] [-d rev] [--collapse] | [-c] | [-a] | ' - '[--keep]')), + _('hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--keep] ' + '[--keepbranches] | [-c] | [-a]')), } diff -r 78658990c725 -r 56719b1aa6f4 hgext/record.py --- a/hgext/record.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/record.py Sun Apr 26 11:49:17 2009 +0200 @@ -302,6 +302,7 @@ elif r == _('q'): raise util.Abort(_('user quit')) return r + pos, total = 0, len(chunks) - 1 while chunks: chunk = chunks.pop() if isinstance(chunk, header): @@ -327,8 +328,10 @@ # new hunk if resp_file[0] is None and resp_all[0] is None: chunk.pretty(ui) - r = prompt(_('record this change to %r?') % - chunk.filename()) + r = total == 1 and prompt(_('record this change to %r?') % + chunk.filename()) \ + or prompt(_('record change %d/%d to %r?') % + (pos, total, chunk.filename())) if r == _('y'): if fixoffset: chunk = copy.copy(chunk) @@ -336,6 +339,7 @@ applied[chunk.filename()].append(chunk) else: fixoffset += chunk.removed - chunk.added + pos = pos + 1 return reduce(operator.add, [h for h in applied.itervalues() if h[0].special() or len(h) > 1], []) @@ -349,7 +353,7 @@ You will be prompted for whether to record changes to each modified file, and for files with multiple changes, for each - change to use. For each query, the following responses are + change to use. For each query, the following responses are possible: y - record this change @@ -418,9 +422,9 @@ chunks = filterpatch(ui, parsepatch(fp)) del fp - contenders = {} + contenders = set() for h in chunks: - try: contenders.update(dict.fromkeys(h.files())) + try: contenders.update(set(h.files())) except AttributeError: pass changed = changes[0] + changes[1] + changes[2] @@ -429,7 +433,7 @@ ui.status(_('no changes to record\n')) return 0 - modified = dict.fromkeys(changes[0]) + modified = set(changes[0]) # 2. backup changed files, so we can restore them in the end backups = {} diff -r 78658990c725 -r 56719b1aa6f4 hgext/transplant.py --- a/hgext/transplant.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/transplant.py Sun Apr 26 11:49:17 2009 +0200 @@ -9,8 +9,8 @@ This extension allows you to transplant patches from another branch. -Transplanted patches are recorded in .hg/transplant/transplants, as a map -from a changeset hash to its hash in the source repository. +Transplanted patches are recorded in .hg/transplant/transplants, as a +map from a changeset hash to its hash in the source repository. ''' from mercurial.i18n import _ @@ -168,7 +168,8 @@ finally: self.saveseries(revmap, merges) self.transplants.write() - del lock, wlock + lock.release() + wlock.release() def filter(self, filter, changelog, patchfile): '''arbitrarily rewrite changeset before applying it''' @@ -216,8 +217,8 @@ try: files = {} try: - fuzz = patch.patch(patchfile, self.ui, cwd=repo.root, - files=files) + patch.patch(patchfile, self.ui, cwd=repo.root, + files=files) if not files: self.ui.warn(_('%s: empty changeset') % revlog.hex(node)) @@ -293,7 +294,7 @@ return n, node finally: - del wlock + wlock.release() def readseries(self): nodes = [] @@ -439,28 +440,31 @@ (transplanted from CHANGESETHASH) You can rewrite the changelog message with the --filter option. - Its argument will be invoked with the current changelog message - as $1 and the patch as $2. + Its argument will be invoked with the current changelog message as + $1 and the patch as $2. - If --source is specified, selects changesets from the named - repository. If --branch is specified, selects changesets from the - branch holding the named revision, up to that revision. If --all - is specified, all changesets on the branch will be transplanted, - otherwise you will be prompted to select the changesets you want. + If --source/-s is specified, selects changesets from the named + repository. If --branch/-b is specified, selects changesets from + the branch holding the named revision, up to that revision. If + --all/-a is specified, all changesets on the branch will be + transplanted, otherwise you will be prompted to select the + changesets you want. - hg transplant --branch REVISION --all will rebase the selected branch - (up to the named revision) onto your current working directory. + hg transplant --branch REVISION --all will rebase the selected + branch (up to the named revision) onto your current working + directory. - You can optionally mark selected transplanted changesets as - merge changesets. You will not be prompted to transplant any - ancestors of a merged transplant, and you can merge descendants - of them normally instead of transplanting them. + You can optionally mark selected transplanted changesets as merge + changesets. You will not be prompted to transplant any ancestors + of a merged transplant, and you can merge descendants of them + normally instead of transplanting them. If no merges or revisions are provided, hg transplant will start an interactive changeset browser. - If a changeset application fails, you can fix the merge by hand and - then resume where you left off by calling hg transplant --continue. + If a changeset application fails, you can fix the merge by hand + and then resume where you left off by calling hg transplant + --continue/-c. ''' def getremotechanges(repo, url): sourcerepo = ui.expandpath(url) diff -r 78658990c725 -r 56719b1aa6f4 hgext/win32mbcs.py --- a/hgext/win32mbcs.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/win32mbcs.py Sun Apr 26 11:49:17 2009 +0200 @@ -10,18 +10,18 @@ # """allow to use MBCS path 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 such a encoding (i.e. shift_jis and big5) as "problematic -encoding". This extension can be used to fix the issue with those -encodings by wrapping some functions to convert to unicode string -before path operation. +Some MBCS encodings are not good for some path operations (i.e. +splitting path, case conversion, etc.) with its encoded bytes. We call +such a encoding (i.e. shift_jis and big5) as "problematic encoding". +This extension can be used to fix the issue with those encodings by +wrapping some functions to convert to unicode string before path +operation. This extension is usefull for: * Japanese Windows users using shift_jis encoding. * Chinese Windows users using big5 encoding. - * All users who use a repository with one of problematic encodings - on case-insensitive file system. + * All users who use a repository with one of problematic encodings on + case-insensitive file system. This extension is not needed for: * Any user who use only ascii chars in path. @@ -29,71 +29,73 @@ Note that there are some limitations on using this extension: * You should use single encoding in one repository. - * You should set same encoding for the repository by locale or HGENCODING. + * You should set same encoding for the repository by locale or + HGENCODING. To use this extension, enable the extension in .hg/hgrc or ~/.hgrc: [extensions] hgext.win32mbcs = -Path encoding conversion are done between unicode and util._encoding -which is decided by mercurial from current locale setting or HGENCODING. +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 _ -from mercurial import util +from mercurial import util, encoding def decode(arg): - if isinstance(arg, str): - uarg = arg.decode(util._encoding) - if arg == uarg.encode(util._encoding): - return uarg - raise UnicodeError("Not local encoding") - elif isinstance(arg, tuple): - return tuple(map(decode, arg)) - elif isinstance(arg, list): - return map(decode, arg) - return arg + if isinstance(arg, str): + uarg = arg.decode(encoding.encoding) + if arg == uarg.encode(encoding.encoding): + return uarg + raise UnicodeError("Not local encoding") + elif isinstance(arg, tuple): + return tuple(map(decode, arg)) + elif isinstance(arg, list): + return map(decode, arg) + return arg def encode(arg): - if isinstance(arg, unicode): - return arg.encode(util._encoding) - elif isinstance(arg, tuple): - return tuple(map(encode, arg)) - elif isinstance(arg, list): - return map(encode, arg) - return arg + if isinstance(arg, unicode): + return arg.encode(encoding.encoding) + elif isinstance(arg, tuple): + return tuple(map(encode, arg)) + elif isinstance(arg, list): + return map(encode, arg) + return arg def wrapper(func, args): - # check argument is unicode, then call original - for arg in args: - if isinstance(arg, unicode): - return func(*args) + # check argument is unicode, then call original + for arg in args: + if isinstance(arg, unicode): + return func(*args) - try: - # convert arguments to unicode, call func, then convert back - return encode(func(*decode(args))) - except UnicodeError: - # If not encoded with util._encoding, report it then - # continue with calling original function. - raise util.Abort(_("[win32mbcs] filename conversion fail with" - " %s encoding\n") % (util._encoding)) + try: + # convert arguments to unicode, call func, then convert back + return encode(func(*decode(args))) + except UnicodeError: + # If not encoded with encoding.encoding, report it then + # continue with calling original function. + raise util.Abort(_("[win32mbcs] filename conversion fail with" + " %s encoding\n") % (encoding.encoding)) def wrapname(name): - idx = name.rfind('.') - module = name[:idx] - name = name[idx+1:] - module = eval(module) - func = getattr(module, name) - def f(*args): - return wrapper(func, args) - try: - f.__name__ = func.__name__ # fail with python23 - except Exception: - pass - setattr(module, name, f) + idx = name.rfind('.') + module = name[:idx] + name = name[idx+1:] + module = eval(module) + func = getattr(module, name) + def f(*args): + return wrapper(func, args) + try: + f.__name__ = func.__name__ # fail with python23 + except Exception: + pass + setattr(module, name, f) # List of functions to be wrapped. # NOTE: os.path.dirname() and os.path.basename() are safe because @@ -109,14 +111,15 @@ shift_jisx0213 shiftjisx0213 sjisx0213 s_jisx0213''' def reposetup(ui, repo): - # TODO: decide use of config section for this extension - if not os.path.supports_unicode_filenames: - ui.warn(_("[win32mbcs] cannot activate on this platform.\n")) - return + # TODO: decide use of config section for this extension + if not os.path.supports_unicode_filenames: + ui.warn(_("[win32mbcs] cannot activate on this platform.\n")) + return - # fake is only for relevant environment. - if util._encoding.lower() in problematic_encodings.split(): - for f in funcs.split(): - wrapname(f) - ui.debug(_("[win32mbcs] activated with encoding: %s\n") % util._encoding) + # fake is only for relevant environment. + if encoding.encoding.lower() in problematic_encodings.split(): + for f in funcs.split(): + wrapname(f) + ui.debug(_("[win32mbcs] activated with encoding: %s\n") + % encoding.encoding) diff -r 78658990c725 -r 56719b1aa6f4 hgext/win32text.py --- a/hgext/win32text.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/win32text.py Sun Apr 26 11:49:17 2009 +0200 @@ -14,21 +14,22 @@ # ** = cleverdecode: # # or ** = macdecode: # -# If not doing conversion, to make sure you do not commit CRLF/CR by accident: +# If not doing conversion, to make sure you do not commit CRLF/CR by +# accident: # # [hooks] # pretxncommit.crlf = python:hgext.win32text.forbidcrlf # # or pretxncommit.cr = python:hgext.win32text.forbidcr # -# To do the same check on a server to prevent CRLF/CR from being pushed or -# pulled: +# To do the same check on a server to prevent CRLF/CR from being +# pushed or pulled: # # [hooks] # pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf # # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr from mercurial.i18n import _ -from mercurial.node import bin, short +from mercurial.node import short from mercurial import util import re @@ -98,11 +99,19 @@ def forbidnewline(ui, repo, hooktype, node, newline, **kwargs): halt = False - for rev in xrange(repo[node].rev(), len(repo)): + seen = set() + # we try to walk changesets in reverse order from newest to + # oldest, so that if we see a file multiple times, we take the + # newest version as canonical. this prevents us from blocking a + # changegroup that contains an unacceptable commit followed later + # by a commit that fixes the problem. + tip = repo['tip'] + for rev in xrange(len(repo)-1, repo[node].rev()-1, -1): c = repo[rev] for f in c.files(): - if f not in c: + if f in seen or f not in tip or f not in c: continue + seen.add(f) data = c[f].data() if not util.binary(data) and newline in data: if not halt: diff -r 78658990c725 -r 56719b1aa6f4 hgext/zeroconf/Zeroconf.py --- a/hgext/zeroconf/Zeroconf.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/zeroconf/Zeroconf.py Sun Apr 26 11:49:17 2009 +0200 @@ -19,7 +19,7 @@ You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - + """ """0.12 update - allow selection of binding interface @@ -101,7 +101,7 @@ _BROWSER_TIME = 500 # Some DNS constants - + _MDNS_ADDR = '224.0.0.251' _MDNS_PORT = 5353; _DNS_PORT = 53; @@ -208,7 +208,7 @@ class DNSEntry(object): """A DNS entry""" - + def __init__(self, name, type, clazz): self.key = string.lower(name) self.name = name @@ -256,10 +256,10 @@ class DNSQuestion(DNSEntry): """A DNS question entry""" - + def __init__(self, name, type, clazz): if not name.endswith(".local."): - raise NonLocalNameException + raise NonLocalNameException(name) DNSEntry.__init__(self, name, type, clazz) def answeredBy(self, rec): @@ -273,7 +273,7 @@ class DNSRecord(DNSEntry): """A DNS record - like a DNS entry, but has a TTL""" - + def __init__(self, name, type, clazz, ttl): DNSEntry.__init__(self, name, type, clazz) self.ttl = ttl @@ -334,7 +334,7 @@ class DNSAddress(DNSRecord): """A DNS address record""" - + def __init__(self, name, type, clazz, ttl, address): DNSRecord.__init__(self, name, type, clazz, ttl) self.address = address @@ -378,10 +378,10 @@ def __repr__(self): """String representation""" return self.cpu + " " + self.os - + class DNSPointer(DNSRecord): """A DNS pointer record""" - + def __init__(self, name, type, clazz, ttl, alias): DNSRecord.__init__(self, name, type, clazz, ttl) self.alias = alias @@ -402,7 +402,7 @@ class DNSText(DNSRecord): """A DNS text record""" - + def __init__(self, name, type, clazz, ttl, text): DNSRecord.__init__(self, name, type, clazz, ttl) self.text = text @@ -426,7 +426,7 @@ class DNSService(DNSRecord): """A DNS service record""" - + def __init__(self, name, type, clazz, ttl, priority, weight, port, server): DNSRecord.__init__(self, name, type, clazz, ttl) self.priority = priority @@ -453,7 +453,7 @@ class DNSIncoming(object): """Object representation of an incoming DNS packet""" - + def __init__(self, data): """Constructor from string holding bytes of packet""" self.offset = 0 @@ -464,7 +464,7 @@ self.numAnswers = 0 self.numAuthorities = 0 self.numAdditionals = 0 - + self.readHeader() self.readQuestions() self.readOthers() @@ -491,9 +491,12 @@ name = self.readName() info = struct.unpack(format, self.data[self.offset:self.offset+length]) self.offset += length - - question = DNSQuestion(name, info[0], info[1]) - self.questions.append(question) + + try: + question = DNSQuestion(name, info[0], info[1]) + self.questions.append(question) + except NonLocalNameException: + pass def readInt(self): """Reads an integer from the packet""" @@ -561,7 +564,7 @@ if rec is not None: self.answers.append(rec) - + def isQuery(self): """Returns true if this is a query""" return (self.flags & _FLAGS_QR_MASK) == _FLAGS_QR_QUERY @@ -574,7 +577,7 @@ """Reads a UTF-8 string of a given length from the packet""" result = self.data[offset:offset+len].decode('utf-8') return result - + def readName(self): """Reads a domain name from the packet""" result = '' @@ -607,11 +610,11 @@ self.offset = off return result - - + + class DNSOutgoing(object): """Object representation of an outgoing packet""" - + def __init__(self, flags, multicast = 1): self.finished = 0 self.id = 0 @@ -620,7 +623,7 @@ self.names = {} self.data = [] self.size = 12 - + self.questions = [] self.answers = [] self.authorities = [] @@ -660,7 +663,7 @@ format = '!H' self.data.insert(index, struct.pack(format, value)) self.size += 2 - + def writeShort(self, value): """Writes an unsigned short to the packet""" format = '!H' @@ -739,7 +742,7 @@ self.size += 2 record.write(self) self.size -= 2 - + length = len(''.join(self.data[index:])) self.insertShort(index, length) # Here is the short we adjusted for @@ -758,7 +761,7 @@ self.writeRecord(authority, 0) for additional in self.additionals: self.writeRecord(additional, 0) - + self.insertShort(0, len(self.additionals)) self.insertShort(0, len(self.authorities)) self.insertShort(0, len(self.answers)) @@ -773,7 +776,7 @@ class DNSCache(object): """A cache of DNS entries""" - + def __init__(self): self.cache = {} @@ -866,12 +869,11 @@ pass def getReaders(self): - result = [] self.condition.acquire() result = self.readers.keys() self.condition.release() return result - + def addReader(self, reader, socket): self.condition.acquire() self.readers[socket] = reader @@ -896,7 +898,7 @@ It requires registration with an Engine object in order to have the read() method called when a socket is availble for reading.""" - + def __init__(self, zeroconf): self.zeroconf = zeroconf self.zeroconf.engine.addReader(self, self.zeroconf.socket) @@ -923,7 +925,7 @@ class Reaper(threading.Thread): """A Reaper is used by this module to remove cache entries that have expired.""" - + def __init__(self, zeroconf): threading.Thread.__init__(self) self.zeroconf = zeroconf @@ -947,7 +949,7 @@ The listener object will have its addService() and removeService() methods called when this browser discovers changes in the services availability.""" - + def __init__(self, zeroconf, type, listener): """Creates a browser for a specific type""" threading.Thread.__init__(self) @@ -958,7 +960,7 @@ self.nextTime = currentTimeMillis() self.delay = _BROWSER_TIME self.list = [] - + self.done = 0 self.zeroconf.addListener(self, DNSQuestion(self.type, _TYPE_PTR, _CLASS_IN)) @@ -1018,11 +1020,11 @@ if event is not None: event(self.zeroconf) - + class ServiceInfo(object): """Service information""" - + def __init__(self, type, name, address=None, port=None, weight=0, priority=0, properties=None, server=None): """Create a service description. @@ -1088,7 +1090,7 @@ index += 1 strs.append(text[index:index+length]) index += length - + for s in strs: eindex = s.find('=') if eindex == -1: @@ -1111,7 +1113,7 @@ except: traceback.print_exc() self.properties = None - + def getType(self): """Type accessor""" return self.type @@ -1201,7 +1203,7 @@ result = 1 finally: zeroconf.removeListener(self) - + return result def __eq__(self, other): @@ -1226,7 +1228,7 @@ result += self.text[:17] + "..." result += "]" return result - + class Zeroconf(object): """Implementation of Zeroconf Multicast DNS Service Discovery @@ -1266,7 +1268,7 @@ # the SO_REUSE* options have been set, so ignore it # pass - #self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(self.intf) + socket.inet_aton('0.0.0.0')) + #self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(self.intf) + socket.inet_aton('0.0.0.0')) self.socket.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0')) self.listeners = [] @@ -1277,7 +1279,7 @@ self.cache = DNSCache() self.condition = threading.Condition() - + self.engine = Engine(self) self.listener = Listener(self) self.reaper = Reaper(self) @@ -1472,7 +1474,7 @@ record = entry else: self.cache.add(record) - + self.updateRecord(now, record) def handleQuery(self, msg, addr, port): @@ -1486,14 +1488,14 @@ out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA, 0) for question in msg.questions: out.addQuestion(question) - + for question in msg.questions: if question.type == _TYPE_PTR: if question.name == "_services._dns-sd._udp.local.": for stype in self.servicetypes.keys(): if out is None: out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA) - out.addAnswer(msg, DNSPointer("_services._dns-sd._udp.local.", _TYPE_PTR, _CLASS_IN, _DNS_TTL, stype)) + out.addAnswer(msg, DNSPointer("_services._dns-sd._udp.local.", _TYPE_PTR, _CLASS_IN, _DNS_TTL, stype)) for service in self.services.values(): if question.name == service.type: if out is None: @@ -1503,16 +1505,16 @@ try: if out is None: out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA) - + # Answer A record queries for any service addresses we know if question.type == _TYPE_A or question.type == _TYPE_ANY: for service in self.services.values(): if service.server == question.name.lower(): out.addAnswer(msg, DNSAddress(question.name, _TYPE_A, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.address)) - + service = self.services.get(question.name.lower(), None) if not service: continue - + if question.type == _TYPE_SRV or question.type == _TYPE_ANY: out.addAnswer(msg, DNSService(question.name, _TYPE_SRV, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.priority, service.weight, service.port, service.server)) if question.type == _TYPE_TXT or question.type == _TYPE_ANY: @@ -1521,7 +1523,7 @@ out.addAdditionalAnswer(DNSAddress(service.server, _TYPE_A, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.address)) except: traceback.print_exc() - + if out is not None and out.answers: out.id = msg.id self.send(out, addr, port) @@ -1531,7 +1533,7 @@ # This is a quick test to see if we can parse the packets we generate #temp = DNSIncoming(out.packet()) try: - bytes_sent = self.socket.sendto(out.packet(), 0, (addr, port)) + self.socket.sendto(out.packet(), 0, (addr, port)) except: # Ignore this, it may be a temporary loss of network connection pass @@ -1546,11 +1548,11 @@ self.unregisterAllServices() self.socket.setsockopt(socket.SOL_IP, socket.IP_DROP_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0')) self.socket.close() - + # Test a few module features, including service registration, service # query (for Zoe), and service unregistration. -if __name__ == '__main__': +if __name__ == '__main__': print "Multicast DNS Service Discovery for Python, version", __version__ r = Zeroconf() print "1. Testing registration of a service..." diff -r 78658990c725 -r 56719b1aa6f4 hgext/zeroconf/__init__.py --- a/hgext/zeroconf/__init__.py Sun Apr 26 11:35:53 2009 +0200 +++ b/hgext/zeroconf/__init__.py Sun Apr 26 11:49:17 2009 +0200 @@ -8,17 +8,18 @@ '''zeroconf support for mercurial repositories -Zeroconf enabled repositories will be announced in a network without the need -to configure a server or a service. They can be discovered without knowing -their actual IP address. +Zeroconf enabled repositories will be announced in a network without +the need to configure a server or a service. They can be discovered +without knowing their actual IP address. -To use the zeroconf extension add the following entry to your hgrc file: +To use the zeroconf extension add the following entry to your hgrc +file: [extensions] hgext.zeroconf = -To allow other people to discover your repository using run "hg serve" in your -repository. +To allow other people to discover your repository using run "hg serve" +in your repository. $ cd test $ hg serve @@ -77,8 +78,9 @@ ip = getip() localip = socket.inet_aton(ip) - parts = socket.gethostname().split('.') - host = parts[0] + ".local" + hostname = socket.gethostname().split('.')[0] + host = hostname + ".local" + name = "%s-%s" % (hostname, name) # advertise to browsers svc = Zeroconf.ServiceInfo('_http._tcp.local.', @@ -130,7 +132,7 @@ def getzcpaths(): server = Zeroconf.Zeroconf() l = listener() - browser = Zeroconf.ServiceBrowser(server, "_hg._tcp.local.", l) + Zeroconf.ServiceBrowser(server, "_hg._tcp.local.", l) time.sleep(1) server.close() for v in l.found.values(): diff -r 78658990c725 -r 56719b1aa6f4 i18n/da.po --- a/i18n/da.po Sun Apr 26 11:35:53 2009 +0200 +++ b/i18n/da.po Sun Apr 26 11:49:17 2009 +0200 @@ -4,19 +4,21 @@ # # Translation dictionary: # -# changeset ændring -# merge sammenføje -# patch rettelse -# repo(sitory) arkiv -# revision revision -# tag mærkat +# changeset ændring +# commit arkivering +# merge sammenføje +# patch rettelse +# repo(sitory) arkiv +# revision revision +# tag mærkat +# working directory arbejdskatalog # msgid "" msgstr "" "Project-Id-Version: Mercurial\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-02-22 22:02+0100\n" -"PO-Revision-Date: 2009-02-22 22:05+0100\n" +"POT-Creation-Date: 2009-04-08 00:41+0200\n" +"PO-Revision-Date: 2009-04-08 00:44+0200\n" "Last-Translator: \n" "Language-Team: Danish\n" "MIME-Version: 1.0\n" @@ -123,16 +125,15 @@ "It is possible to use bookmark names in every revision lookup (e.g. hg\n" "merge, hg update).\n" "\n" -"The bookmark extension offers the possiblity to have a more git-like " -"experience\n" -"by adding the following configuration option to your .hgrc:\n" +"The bookmark extension offers the possiblity to have a more git-like\n" +"experience by adding the following configuration option to your .hgrc:\n" "\n" "[bookmarks]\n" "track.current = True\n" "\n" -"This will cause bookmarks to track the bookmark that you are currently on, " -"and\n" -"just updates it. This is similar to git's approach of branching.\n" +"This will cause bookmarks to track the bookmark that you are currently\n" +"on, and just updates it. This is similar to git's approach of\n" +"branching.\n" msgstr "" msgid "" @@ -179,8 +180,8 @@ "\n" " Bookmarks are pointers to certain commits that move when\n" " commiting. Bookmarks are local. They can be renamed, copied and\n" -" deleted. It is possible to use bookmark names in 'hg merge' and 'hg\n" -" update' to update to a given bookmark.\n" +" deleted. It is possible to use bookmark names in 'hg merge' and\n" +" 'hg update' to update to a given bookmark.\n" "\n" " You can use 'hg bookmark NAME' to set a bookmark on the current\n" " tip with the given name. If you specify a revision using -r REV\n" @@ -241,91 +242,83 @@ msgid "rename a given bookmark" msgstr "" -msgid "hg bookmarks [-d] [-m NAME] [-r NAME] [NAME]" +msgid "hg bookmarks [-f] [-d] [-m NAME] [-r REV] [NAME]" msgstr "" msgid "" "Bugzilla integration\n" "\n" "This hook extension adds comments on bugs in Bugzilla when changesets\n" -"that refer to bugs by Bugzilla ID are seen. The hook does not change bug\n" -"status.\n" -"\n" -"The hook updates the Bugzilla database directly. Only Bugzilla " -"installations\n" -"using MySQL are supported.\n" -"\n" -"The hook relies on a Bugzilla script to send bug change notification " -"emails.\n" -"That script changes between Bugzilla versions; the 'processmail' script " -"used\n" -"prior to 2.18 is replaced in 2.18 and subsequent versions by\n" -"'config/sendbugmail.pl'. Note that these will be run by Mercurial as the " -"user\n" -"pushing the change; you will need to ensure the Bugzilla install file\n" -"permissions are set appropriately.\n" +"that refer to bugs by Bugzilla ID are seen. The hook does not change\n" +"bug status.\n" +"\n" +"The hook updates the Bugzilla database directly. Only Bugzilla\n" +"installations using MySQL are supported.\n" +"\n" +"The hook relies on a Bugzilla script to send bug change notification\n" +"emails. That script changes between Bugzilla versions; the\n" +"'processmail' script used prior to 2.18 is replaced in 2.18 and\n" +"subsequent versions by 'config/sendbugmail.pl'. Note that these will\n" +"be run by Mercurial as the user pushing the change; you will need to\n" +"ensure the Bugzilla install file permissions are set appropriately.\n" "\n" "Configuring the extension:\n" "\n" " [bugzilla]\n" -" host Hostname of the MySQL server holding the Bugzilla database.\n" +"\n" +" host Hostname of the MySQL server holding the Bugzilla\n" +" database.\n" " db Name of the Bugzilla database in MySQL. Default 'bugs'.\n" " user Username to use to access MySQL server. Default 'bugs'.\n" " password Password to use to access MySQL server.\n" " timeout Database connection timeout (seconds). Default 5.\n" -" version Bugzilla version. Specify '3.0' for Bugzilla versions 3.0 " -"and\n" -" later, '2.18' for Bugzilla versions from 2.18 and '2.16' for\n" -" versions prior to 2.18.\n" +" version Bugzilla version. Specify '3.0' for Bugzilla versions\n" +" 3.0 and later, '2.18' for Bugzilla versions from 2.18\n" +" and '2.16' for versions prior to 2.18.\n" " bzuser Fallback Bugzilla user name to record comments with, if\n" " changeset committer cannot be found as a Bugzilla user.\n" " bzdir Bugzilla install directory. Used by default notify.\n" " Default '/var/www/html/bugzilla'.\n" " notify The command to run to get Bugzilla to send bug change\n" -" notification emails. Substitutes from a map with 3 keys,\n" -" 'bzdir', 'id' (bug id) and 'user' (committer bugzilla " -"email).\n" -" Default depends on version; from 2.18 it is\n" -" \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl %(id)s %" -"(user)s\".\n" -" regexp Regular expression to match bug IDs in changeset commit " -"message.\n" -" Must contain one \"()\" group. The default expression " -"matches\n" -" 'Bug 1234', 'Bug no. 1234', 'Bug number 1234',\n" -" 'Bugs 1234,5678', 'Bug 1234 and 5678' and variations " -"thereof.\n" -" Matching is case insensitive.\n" +" notification emails. Substitutes from a map with 3\n" +" keys, 'bzdir', 'id' (bug id) and 'user' (committer\n" +" bugzilla email). Default depends on version; from 2.18\n" +" it is \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl\n" +" %(id)s %(user)s\".\n" +" regexp Regular expression to match bug IDs in changeset commit\n" +" message. Must contain one \"()\" group. The default\n" +" expression matches 'Bug 1234', 'Bug no. 1234', 'Bug\n" +" number 1234', 'Bugs 1234,5678', 'Bug 1234 and 5678' and\n" +" variations thereof. Matching is case insensitive.\n" " style The style file to use when formatting comments.\n" " template Template to use when formatting comments. Overrides\n" " style if specified. In addition to the usual Mercurial\n" " keywords, the extension specifies:\n" " {bug} The Bugzilla bug ID.\n" -" {root} The full pathname of the Mercurial " -"repository.\n" -" {webroot} Stripped pathname of the Mercurial " -"repository.\n" -" {hgweb} Base URL for browsing Mercurial " -"repositories.\n" +" {root} The full pathname of the Mercurial\n" +" repository.\n" +" {webroot} Stripped pathname of the Mercurial\n" +" repository.\n" +" {hgweb} Base URL for browsing Mercurial\n" +" repositories.\n" " Default 'changeset {node|short} in repo {root} refers '\n" " 'to bug {bug}.\\ndetails:\\n\\t{desc|tabindent}'\n" " strip The number of slashes to strip from the front of {root}\n" " to produce {webroot}. Default 0.\n" -" usermap Path of file containing Mercurial committer ID to Bugzilla " -"user\n" -" ID mappings. If specified, the file should contain one " -"mapping\n" -" per line, \"committer\"=\"Bugzilla user\". See also the\n" -" [usermap] section.\n" +" usermap Path of file containing Mercurial committer ID to\n" +" Bugzilla user ID mappings. If specified, the file\n" +" should contain one mapping per line,\n" +" \"committer\"=\"Bugzilla user\". See also the [usermap]\n" +" section.\n" "\n" " [usermap]\n" -" Any entries in this section specify mappings of Mercurial committer ID\n" -" to Bugzilla user ID. See also [bugzilla].usermap.\n" +" Any entries in this section specify mappings of Mercurial\n" +" committer ID to Bugzilla user ID. See also [bugzilla].usermap.\n" " \"committer\"=\"Bugzilla user\"\n" "\n" " [web]\n" -" baseurl Base URL for browsing Mercurial repositories. Reference from\n" -" templates as {hgweb}.\n" +" baseurl Base URL for browsing Mercurial repositories. Reference\n" +" from templates as {hgweb}.\n" "\n" "Activating the extension:\n" "\n" @@ -338,9 +331,9 @@ "\n" "Example configuration:\n" "\n" -"This example configuration is for a collection of Mercurial repositories\n" -"in /var/local/hg/repos/ used with a local Bugzilla 3.2 installation in\n" -"/opt/bugzilla-3.2.\n" +"This example configuration is for a collection of Mercurial\n" +"repositories in /var/local/hg/repos/ used with a local Bugzilla 3.2\n" +"installation in /opt/bugzilla-3.2.\n" "\n" " [bugzilla]\n" " host=localhost\n" @@ -504,17 +497,25 @@ msgstr "" msgid "" -"show the children of the given or working dir revision\n" -"\n" -" Print the children of the working directory's revisions.\n" -" If a revision is given via --rev, the children of that revision\n" -" will be printed. If a file argument is given, revision in\n" -" which the file was last changed (after the working directory\n" -" revision or the argument to --rev if given) is printed.\n" -" " -msgstr "" - -msgid "show children of the specified rev" +"show the children of the given or working directory revision\n" +"\n" +" Print the children of the working directory's revisions. If a\n" +" revision is given via --rev, the children of that revision will be\n" +" printed. If a file argument is given, revision in which the file\n" +" was last changed (after the working directory revision or the\n" +" argument to --rev if given) is printed.\n" +" " +msgstr "" +"vis forældrene til arbejdskataloget eller en revision\n" +"\n" +" Udskriv arbejdskatalogets forældrerevisioner. Hvis en revision\n" +" angivet med --rev, så udskrives forældren til denne revision. Hvis\n" +" en fil er angivet, udskrives revisionen i hvilken filen sidst blev\n" +" ændret (før arbejdskatalogets revision eller argumentet til --rev,\n" +" hvis givet).\n" +" " + +msgid "show children of the specified revision" msgstr "" msgid "hg children [-r REV] [FILE]" @@ -537,10 +538,9 @@ msgid "" "graph count of revisions grouped by template\n" "\n" -" Will graph count of changed lines or revisions grouped by template or\n" -" alternatively by date, if dateformat is used. In this case it will " -"override\n" -" template.\n" +" Will graph count of changed lines or revisions grouped by template\n" +" or alternatively by date, if dateformat is used. In this case it\n" +" will override template.\n" "\n" " By default statistics are counted for number of changed lines.\n" "\n" @@ -596,7 +596,7 @@ msgid "count rate for the specified revision or range" msgstr "lav statistik for de specificerede revisioner" -msgid "count rate for revs matching date spec" +msgid "count rate for revisions matching date spec" msgstr "lav statistik for revisioner som matcher dato specifikationen" msgid "template to group changesets" @@ -623,16 +623,16 @@ msgid "" "add color output to status, qseries, and diff-related commands\n" "\n" -"This extension modifies the status command to add color to its output to\n" -"reflect file status, the qseries command to add color to reflect patch " -"status\n" -"(applied, unapplied, missing), and to diff-related commands to highlight\n" -"additions, removals, diff headers, and trailing whitespace.\n" -"\n" -"Other effects in addition to color, like bold and underlined text, are also\n" -"available. Effects are rendered with the ECMA-48 SGR control function (aka\n" -"ANSI escape codes). This module also provides the render_text function,\n" -"which can be used to add effects to any text.\n" +"This extension modifies the status command to add color to its output\n" +"to reflect file status, the qseries command to add color to reflect\n" +"patch status (applied, unapplied, missing), and to diff-related\n" +"commands to highlight additions, removals, diff headers, and trailing\n" +"whitespace.\n" +"\n" +"Other effects in addition to color, like bold and underlined text, are\n" +"also available. Effects are rendered with the ECMA-48 SGR control\n" +"function (aka ANSI escape codes). This module also provides the\n" +"render_text function, which can be used to add effects to any text.\n" "\n" "To enable this extension, add this to your .hgrc file:\n" "[extensions]\n" @@ -712,38 +712,38 @@ " - Monotone [mtn]\n" " - GNU Arch [gnuarch]\n" " - Bazaar [bzr]\n" +" - Perforce [p4]\n" "\n" " Accepted destination formats [identifiers]:\n" " - Mercurial [hg]\n" " - Subversion [svn] (history on branches is not preserved)\n" "\n" -" If no revision is given, all revisions will be converted. Otherwise,\n" -" convert will only import up to the named revision (given in a format\n" -" understood by the source).\n" +" If no revision is given, all revisions will be converted.\n" +" Otherwise, convert will only import up to the named revision\n" +" (given in a format understood by the source).\n" "\n" " If no destination directory name is specified, it defaults to the\n" -" basename of the source with '-hg' appended. If the destination\n" +" basename of the source with '-hg' appended. If the destination\n" " repository doesn't exist, it will be created.\n" "\n" " If isn't given, it will be put in a default location\n" -" (/.hg/shamap by default). The is a simple text\n" -" file that maps each source commit ID to the destination ID for\n" -" that revision, like so:\n" +" (/.hg/shamap by default). The is a simple text file\n" +" that maps each source commit ID to the destination ID for that\n" +" revision, like so:\n" " \n" "\n" -" If the file doesn't exist, it's automatically created. It's updated\n" -" on each commit copied, so convert-repo can be interrupted and can\n" -" be run repeatedly to copy new commits.\n" -"\n" -" The [username mapping] file is a simple text file that maps each source\n" -" commit author to a destination commit author. It is handy for source " -"SCMs\n" -" that use unix logins to identify authors (eg: CVS). One line per author\n" -" mapping and the line format is:\n" +" If the file doesn't exist, it's automatically created. It's\n" +" updated on each commit copied, so convert-repo can be interrupted\n" +" and can be run repeatedly to copy new commits.\n" +"\n" +" The [username mapping] file is a simple text file that maps each\n" +" source commit author to a destination commit author. It is handy\n" +" for source SCMs that use unix logins to identify authors (eg:\n" +" CVS). One line per author mapping and the line format is:\n" " srcauthor=whatever string you want\n" "\n" " The filemap is a file that allows filtering and remapping of files\n" -" and directories. Comment lines start with '#'. Each line can\n" +" and directories. Comment lines start with '#'. Each line can\n" " contain one of the following directives:\n" "\n" " include path/to/file\n" @@ -754,32 +754,33 @@ "\n" " The 'include' directive causes a file, or all files under a\n" " directory, to be included in the destination repository, and the\n" -" exclusion of all other files and dirs not explicitely included.\n" +" exclusion of all other files and directories not explicitely included.\n" " The 'exclude' directive causes files or directories to be omitted.\n" -" The 'rename' directive renames a file or directory. To rename from a\n" -" subdirectory into the root of the repository, use '.' as the path to\n" -" rename to.\n" +" The 'rename' directive renames a file or directory. To rename from\n" +" a subdirectory into the root of the repository, use '.' as the\n" +" path to rename to.\n" "\n" " The splicemap is a file that allows insertion of synthetic\n" -" history, letting you specify the parents of a revision. This is\n" +" history, letting you specify the parents of a revision. This is\n" " useful if you want to e.g. give a Subversion merge two parents, or\n" -" graft two disconnected series of history together. Each entry\n" +" graft two disconnected series of history together. Each entry\n" " contains a key, followed by a space, followed by one or two\n" -" values, separated by spaces. The key is the revision ID in the\n" -" source revision control system whose parents should be modified\n" -" (same format as a key in .hg/shamap). The values are the revision\n" -" IDs (in either the source or destination revision control system)\n" -" that should be used as the new parents for that node.\n" +" comma-separated values. The key is the revision ID in the source\n" +" revision control system whose parents should be modified (same\n" +" format as a key in .hg/shamap). The values are the revision IDs\n" +" (in either the source or destination revision control system) that\n" +" should be used as the new parents for that node.\n" "\n" " Mercurial Source\n" " -----------------\n" "\n" -" --config convert.hg.ignoreerrors=False (boolean)\n" +" --config convert.hg.ignoreerrors=False (boolean)\n" " ignore integrity errors when reading. Use it to fix Mercurial\n" " repositories with missing revlogs, by converting from and to\n" " Mercurial.\n" -" --config convert.hg.saverev=True (boolean)\n" -" allow target to preserve source revision ID\n" +" --config convert.hg.saverev=False (boolean)\n" +" store original revision ID in changeset (forces target IDs to\n" +" change)\n" " --config convert.hg.startrev=0 (hg revision identifier)\n" " convert start revision and its descendants\n" "\n" @@ -788,11 +789,11 @@ "\n" " CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n" " to indicate the starting point of what will be converted. Direct\n" -" access to the repository files is not needed, unless of course\n" -" the repository is :local:. The conversion uses the top level\n" -" directory in the sandbox to find the CVS repository, and then uses\n" -" CVS rlog commands to find files to convert. This means that unless\n" -" a filemap is given, all files under the starting directory will be\n" +" access to the repository files is not needed, unless of course the\n" +" repository is :local:. The conversion uses the top level directory\n" +" in the sandbox to find the CVS repository, and then uses CVS rlog\n" +" commands to find files to convert. This means that unless a\n" +" filemap is given, all files under the starting directory will be\n" " converted, and that any directory reorganisation in the CVS\n" " sandbox is ignored.\n" "\n" @@ -808,34 +809,37 @@ " Internal cvsps is selected by setting\n" " --config convert.cvsps=builtin\n" " and has a few more configurable options:\n" -" --config convert.cvsps.fuzz=60 (integer)\n" -" Specify the maximum time (in seconds) that is allowed between\n" -" commits with identical user and log message in a single\n" -" changeset. When very large files were checked in as part\n" -" of a changeset then the default may not be long enough.\n" +" --config convert.cvsps.fuzz=60 (integer)\n" +" Specify the maximum time (in seconds) that is allowed\n" +" between commits with identical user and log message in a\n" +" single changeset. When very large files were checked in as\n" +" part of a changeset then the default may not be long\n" +" enough.\n" " --config convert.cvsps.mergeto='{{mergetobranch ([-\\w]+)}}'\n" -" Specify a regular expression to which commit log messages are\n" -" matched. If a match occurs, then the conversion process will\n" -" insert a dummy revision merging the branch on which this log\n" -" message occurs to the branch indicated in the regex.\n" +" Specify a regular expression to which commit log messages\n" +" are matched. If a match occurs, then the conversion\n" +" process will insert a dummy revision merging the branch on\n" +" which this log message occurs to the branch indicated in\n" +" the regex.\n" " --config convert.cvsps.mergefrom='{{mergefrombranch ([-\\w]+)}}'\n" -" Specify a regular expression to which commit log messages are\n" -" matched. If a match occurs, then the conversion process will\n" -" add the most recent revision on the branch indicated in the\n" -" regex as the second parent of the changeset.\n" -"\n" -" The hgext/convert/cvsps wrapper script allows the builtin changeset\n" -" merging code to be run without doing a conversion. Its parameters and\n" -" output are similar to that of cvsps 2.1.\n" +" Specify a regular expression to which commit log messages\n" +" are matched. If a match occurs, then the conversion\n" +" process will add the most recent revision on the branch\n" +" indicated in the regex as the second parent of the\n" +" changeset.\n" +"\n" +" The hgext/convert/cvsps wrapper script allows the builtin\n" +" changeset merging code to be run without doing a conversion. Its\n" +" parameters and output are similar to that of cvsps 2.1.\n" "\n" " Subversion Source\n" " -----------------\n" "\n" " Subversion source detects classical trunk/branches/tags layouts.\n" " By default, the supplied \"svn://repo/path/\" source URL is\n" -" converted as a single branch. If \"svn://repo/path/trunk\" exists\n" -" it replaces the default branch. If \"svn://repo/path/branches\"\n" -" exists, its subdirectories are listed as possible branches. If\n" +" converted as a single branch. If \"svn://repo/path/trunk\" exists it\n" +" replaces the default branch. If \"svn://repo/path/branches\" exists,\n" +" its subdirectories are listed as possible branches. If\n" " \"svn://repo/path/tags\" exists, it is looked for tags referencing\n" " converted branches. Default \"trunk\", \"branches\" and \"tags\" values\n" " can be overriden with following options. Set them to paths\n" @@ -856,6 +860,23 @@ " --config convert.svn.startrev=0 (svn revision number)\n" " specify start Subversion revision.\n" "\n" +" Perforce Source\n" +" ---------------\n" +"\n" +" The Perforce (P4) importer can be given a p4 depot path or a\n" +" client specification as source. It will convert all files in the\n" +" source to a flat Mercurial repository, ignoring labels, branches\n" +" and integrations. Note that when a depot path is given you then\n" +" usually should specify a target directory, because otherwise the\n" +" target may be named ...-hg.\n" +"\n" +" It is possible to limit the amount of source history to be\n" +" converted by specifying an initial Perforce revision.\n" +"\n" +" --config convert.p4.startrev=0 (perforce changelist number)\n" +" specify initial Perforce revision.\n" +"\n" +"\n" " Mercurial Destination\n" " ---------------------\n" "\n" @@ -872,12 +893,14 @@ msgid "" "create changeset information from CVS\n" "\n" -" This command is intended as a debugging tool for the CVS to Mercurial\n" -" converter, and can be used as a direct replacement for cvsps.\n" -"\n" -" Hg debugcvsps reads the CVS rlog for current directory (or any named\n" -" directory) in the CVS repository, and converts the log to a series of\n" -" changesets based on matching commit log entries and dates." +" This command is intended as a debugging tool for the CVS to\n" +" Mercurial converter, and can be used as a direct replacement for\n" +" cvsps.\n" +"\n" +" Hg debugcvsps reads the CVS rlog for current directory (or any\n" +" named directory) in the CVS repository, and converts the log to a\n" +" series of changesets based on matching commit log entries and\n" +" dates." msgstr "" msgid "username mapping filename" @@ -989,7 +1012,7 @@ msgstr "" #, python-format -msgid "Overriding mapping for author %s, was %s, will be %s\n" +msgid "Ignoring bad line in author map file %s: %s\n" msgstr "" #, python-format @@ -997,7 +1020,7 @@ msgstr "" #, python-format -msgid "Ignoring bad line in author map file %s: %s\n" +msgid "overriding mapping for author %s, was %s, will be %s\n" msgstr "" #, python-format @@ -1086,6 +1109,10 @@ msgstr "" #, python-format +msgid "found synthetic revision in %s: %r\n" +msgstr "" + +#, python-format msgid "writing cvs log cache %s\n" msgstr "" @@ -1096,6 +1123,9 @@ msgid "creating changesets\n" msgstr "opretter ændringer\n" +msgid "synthetic changeset cannot have multiple parents" +msgstr "" + #, python-format msgid "%d changeset entries\n" msgstr "%d ændringer\n" @@ -1200,7 +1230,13 @@ msgstr "" #, python-format -msgid "copying file in renamed dir from '%s' to '%s'" +msgid "copying file in renamed directory from '%s' to '%s'" +msgstr "" + +msgid "reading p4 views\n" +msgstr "" + +msgid "collecting p4 changelists\n" msgstr "" msgid "Subversion python bindings could not be loaded" @@ -1350,7 +1386,7 @@ msgid "" "\n" "The `extdiff' Mercurial extension allows you to use external programs\n" -"to compare revisions, or revision with working dir. The external diff\n" +"to compare revisions, or revision with working directory. The external diff\n" "programs are called with a configurable set of options and two\n" "non-option arguments: paths to directories containing snapshots of\n" "files to compare.\n" @@ -1377,16 +1413,16 @@ " meld =\n" "\n" " # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n" -" #(see http://www.vim.org/scripts/script.php?script_id=102)\n" +" # (see http://www.vim.org/scripts/script.php?script_id=102)\n" " # Non english user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" " "in\n" " # your .vimrc\n" " vimdiff = gvim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)'\n" "\n" -"You can use -I/-X and list of file or directory names like normal\n" -"\"hg diff\" command. The `extdiff' extension makes snapshots of only\n" -"needed files, so running the external diff program will actually be\n" -"pretty fast (at least faster than having to compare the entire tree).\n" +"You can use -I/-X and list of file or directory names like normal \"hg\n" +"diff\" command. The `extdiff' extension makes snapshots of only needed\n" +"files, so running the external diff program will actually be pretty\n" +"fast (at least faster than having to compare the entire tree).\n" msgstr "" msgid "snapshot files as of some revision" @@ -1403,7 +1439,7 @@ msgstr "" #, python-format -msgid "making snapshot of %d files from working dir\n" +msgid "making snapshot of %d files from working directory\n" msgstr "" msgid "" @@ -1434,19 +1470,19 @@ "use external program to diff repository (or selected files)\n" "\n" " Show differences between revisions for the specified files, using\n" -" an external program. The default program used is diff, with\n" +" an external program. The default program used is diff, with\n" " default options \"-Npru\".\n" "\n" -" To select a different program, use the -p option. The program\n" -" will be passed the names of two directories to compare. To pass\n" -" additional options to the program, use the -o option. These will\n" +" To select a different program, use the -p option. The program will\n" +" be passed the names of two directories to compare. To pass\n" +" additional options to the program, use the -o option. These will\n" " be passed before the names of the directories to compare.\n" "\n" -" When two revision arguments are given, then changes are\n" -" shown between those revisions. If only one revision is\n" -" specified then that revision is compared to the working\n" -" directory, and, when no revisions are specified, the\n" -" working directory files are compared to its parent." +" When two revision arguments are given, then changes are shown\n" +" between those revisions. If only one revision is specified then\n" +" that revision is compared to the working directory, and, when no\n" +" revisions are specified, the working directory files are compared\n" +" to its parent." msgstr "" msgid "comparison program to run" @@ -1477,13 +1513,14 @@ " This finds all changes from the repository at the specified path\n" " or URL and adds them to the local repository.\n" "\n" -" If the pulled changes add a new branch head, the head is automatically\n" -" merged, and the result of the merge is committed. Otherwise, the\n" -" working directory is updated to include the new changes.\n" +" If the pulled changes add a new branch head, the head is\n" +" automatically merged, and the result of the merge is committed.\n" +" Otherwise, the working directory is updated to include the new\n" +" changes.\n" "\n" " When a merge occurs, the newly pulled changes are assumed to be\n" -" \"authoritative\". The head of the new changes is used as the first\n" -" parent, with local changes as the second. To switch the merge\n" +" \"authoritative\". The head of the new changes is used as the first\n" +" parent, with local changes as the second. To switch the merge\n" " order, use --switch-parent.\n" "\n" " See 'hg help dates' for a list of formats valid for -d/--date.\n" @@ -1501,7 +1538,7 @@ msgstr "" msgid "working directory is missing some files" -msgstr "arbejdsbiblioteket mangler nogle filer" +msgstr "arbejdskataloget mangler nogle filer" msgid "" "multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)" @@ -1835,17 +1872,17 @@ "browsing the repository in a graphical way\n" "\n" "The hgk extension allows browsing the history of a repository in a\n" -"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is\n" -"not distributed with Mercurial.)\n" +"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n" +"distributed with Mercurial.)\n" "\n" "hgk consists of two parts: a Tcl script that does the displaying and\n" "querying of information, and an extension to mercurial named hgk.py,\n" "which provides hooks for hgk to get information. hgk can be found in\n" "the contrib directory, and hgk.py can be found in the hgext directory.\n" "\n" -"To load the hgext.py extension, add it to your .hgrc file (you have\n" -"to use your global $HOME/.hgrc file, not one in a repository). You\n" -"can specify an absolute path:\n" +"To load the hgext.py extension, add it to your .hgrc file (you have to\n" +"use your global $HOME/.hgrc file, not one in a repository). You can\n" +"specify an absolute path:\n" "\n" " [extensions]\n" " hgk=/usr/local/lib/hgk.py\n" @@ -1857,8 +1894,8 @@ " hgk=\n" "\n" "The hg view command will launch the hgk Tcl script. For this command\n" -"to work, hgk must be in your search path. Alternately, you can\n" -"specify the path to hgk in your .hgrc file:\n" +"to work, hgk must be in your search path. Alternately, you can specify\n" +"the path to hgk in your .hgrc file:\n" "\n" " [hgk]\n" " path=/location/of/hgk\n" @@ -2150,15 +2187,15 @@ msgid "" "keyword expansion in local repositories\n" "\n" -"This extension expands RCS/CVS-like or self-customized $Keywords$\n" -"in tracked text files selected by your configuration.\n" -"\n" -"Keywords are only expanded in local repositories and not stored in\n" -"the change history. The mechanism can be regarded as a convenience\n" -"for the current user or for archive distribution.\n" -"\n" -"Configuration is done in the [keyword] and [keywordmaps] sections\n" -"of hgrc files.\n" +"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n" +"tracked text files selected by your configuration.\n" +"\n" +"Keywords are only expanded in local repositories and not stored in the\n" +"change history. The mechanism can be regarded as a convenience for the\n" +"current user or for archive distribution.\n" +"\n" +"Configuration is done in the [keyword] and [keywordmaps] sections of\n" +"hgrc files.\n" "\n" "Example:\n" "\n" @@ -2168,28 +2205,28 @@ " x* = ignore\n" "\n" "Note: the more specific you are in your filename patterns\n" -" the less you lose speed in huge repos.\n" +" the less you lose speed in huge repositories.\n" "\n" "For [keywordmaps] template mapping and expansion demonstration and\n" "control run \"hg kwdemo\".\n" "\n" "An additional date template filter {date|utcdate} is provided.\n" "\n" -"The default template mappings (view with \"hg kwdemo -d\") can be replaced\n" -"with customized keywords and templates.\n" -"Again, run \"hg kwdemo\" to control the results of your config changes.\n" +"The default template mappings (view with \"hg kwdemo -d\") can be\n" +"replaced with customized keywords and templates. Again, run \"hg\n" +"kwdemo\" to control the results of your config changes.\n" "\n" "Before changing/disabling active keywords, run \"hg kwshrink\" to avoid\n" -"the risk of inadvertedly storing expanded keywords in the change history.\n" +"the risk of inadvertedly storing expanded keywords in the change\n" +"history.\n" "\n" "To force expansion after enabling it, or a configuration change, run\n" "\"hg kwexpand\".\n" "\n" -"Also, when committing with the record extension or using mq's qrecord, be " -"aware\n" -"that keywords cannot be updated. Again, run \"hg kwexpand\" on the files in\n" -"question to update keyword expansions after all changes have been checked " -"in.\n" +"Also, when committing with the record extension or using mq's qrecord,\n" +"be aware that keywords cannot be updated. Again, run \"hg kwexpand\" on\n" +"the files in question to update keyword expansions after all changes\n" +"have been checked in.\n" "\n" "Expansions spanning more than one line and incremental expansions,\n" "like CVS' $Log$, are not supported. A keyword template map\n" @@ -2272,11 +2309,11 @@ msgid "" "print [keywordmaps] configuration and an expansion example\n" "\n" -" Show current, custom, or default keyword template maps\n" -" and their expansion.\n" -"\n" -" Extend current configuration by specifying maps as arguments\n" -" and optionally by reading from an additional hgrc file.\n" +" Show current, custom, or default keyword template maps and their\n" +" expansion.\n" +"\n" +" Extend current configuration by specifying maps as arguments and\n" +" optionally by reading from an additional hgrc file.\n" "\n" " Override current keyword template maps with \"default\" option.\n" " " @@ -2289,7 +2326,7 @@ msgstr "" #, python-format -msgid "creating temporary repo at %s\n" +msgid "creating temporary repository at %s\n" msgstr "" #, python-format @@ -2304,7 +2341,7 @@ #, python-format msgid "" "\n" -"removing temporary repo %s\n" +"removing temporary repository %s\n" msgstr "" msgid "" @@ -2319,17 +2356,17 @@ msgid "" "print files currently configured for keyword expansion\n" "\n" -" Crosscheck which files in working directory are potential targets for\n" -" keyword expansion.\n" -" That is, files matched by [keyword] config patterns but not symlinks.\n" +" Crosscheck which files in working directory are potential targets\n" +" for keyword expansion. That is, files matched by [keyword] config\n" +" patterns but not symlinks.\n" " " msgstr "" msgid "" "revert expanded keywords in working directory\n" "\n" -" Run before changing/disabling active keywords\n" -" or if you experience problems with \"hg import\" or \"hg merge\".\n" +" Run before changing/disabling active keywords or if you experience\n" +" problems with \"hg import\" or \"hg merge\".\n" "\n" " kwshrink refuses to run if given files contain local changes.\n" " " @@ -2396,11 +2433,11 @@ "patch management and development\n" "\n" "This extension lets you work with a stack of patches in a Mercurial\n" -"repository. It manages two stacks of patches - all known patches, and\n" +"repository. It manages two stacks of patches - all known patches, and\n" "applied patches (subset of known patches).\n" "\n" "Known patches are represented as patch files in the .hg/patches\n" -"directory. Applied patches are both patch files and changesets.\n" +"directory. Applied patches are both patch files and changesets.\n" "\n" "Common tasks (use \"hg help command\" for more details):\n" "\n" @@ -2659,7 +2696,7 @@ msgstr "" msgid "cleaning up working directory..." -msgstr "rydder op i arbejdsbiblioteket..." +msgstr "rydder op i arbejdskataloget..." #, python-format msgid "errors during apply, please fix and refresh %s\n" @@ -2806,14 +2843,16 @@ msgid "" "remove patches from queue\n" "\n" -" The patches must not be applied, unless they are arguments to\n" -" the --rev parameter. At least one patch or revision is required.\n" +" The patches must not be applied, unless they are arguments to the\n" +" --rev parameter. At least one patch or revision is required.\n" "\n" " With --rev, mq will stop managing the named revisions (converting\n" -" them to regular mercurial changesets). The qfinish command should be\n" -" used as an alternative for qdel -r, as the latter option is deprecated.\n" -"\n" -" With --keep, the patch files are preserved in the patch directory." +" them to regular mercurial changesets). The qfinish command should\n" +" be used as an alternative for qdel -r, as the latter option is\n" +" deprecated.\n" +"\n" +" With --keep, the patch files are preserved in the patch\n" +" directory." msgstr "" msgid "print the patches already applied" @@ -2825,24 +2864,25 @@ msgid "" "import a patch\n" "\n" -" The patch is inserted into the series after the last applied patch.\n" -" If no patches have been applied, qimport prepends the patch\n" +" The patch is inserted into the series after the last applied\n" +" patch. If no patches have been applied, qimport prepends the patch\n" " to the series.\n" "\n" " The patch will have the same name as its source file unless you\n" " give it a new one with --name.\n" "\n" -" You can register an existing patch inside the patch directory\n" -" with the --existing flag.\n" -"\n" -" With --force, an existing patch of the same name will be overwritten.\n" +" You can register an existing patch inside the patch directory with\n" +" the --existing flag.\n" +"\n" +" With --force, an existing patch of the same name will be\n" +" overwritten.\n" "\n" " An existing changeset may be placed under mq control with --rev\n" " (e.g. qimport --rev tip -n patch will place tip under mq control).\n" " With --git, patches imported with --rev will use the git diff\n" " format. See the diffs help topic for information on why this is\n" -" important for preserving rename/copy information and permission " -"changes.\n" +" important for preserving rename/copy information and permission\n" +" changes.\n" " " msgstr "" @@ -2850,23 +2890,23 @@ "init a new queue repository\n" "\n" " The queue repository is unversioned by default. If -c is\n" -" specified, qinit will create a separate nested repository\n" -" for patches (qinit -c may also be run later to convert\n" -" an unversioned patch repository into a versioned one).\n" -" You can use qcommit to commit changes to this queue repository." +" specified, qinit will create a separate nested repository for\n" +" patches (qinit -c may also be run later to convert an unversioned\n" +" patch repository into a versioned one). You can use qcommit to\n" +" commit changes to this queue repository." msgstr "" msgid "" "clone main and patch repository at same time\n" "\n" -" If source is local, destination will have no patches applied. If\n" +" If source is local, destination will have no patches applied. If\n" " source is remote, this command can not check if patches are\n" " applied in source, so cannot guarantee that patches are not\n" -" applied in destination. If you clone remote repository, be sure\n" +" applied in destination. If you clone remote repository, be sure\n" " before that it has no patches applied.\n" "\n" " Source patch repository is looked for in /.hg/patches by\n" -" default. Use -p to change.\n" +" default. Use -p to change.\n" "\n" " The patch directory must be a nested mercurial repository, as\n" " would be created by qinit -c.\n" @@ -2876,16 +2916,16 @@ msgid "versioned patch repository not found (see qinit -c)" msgstr "versionsstyret arkiv til rettelser blev ikke fundet (se qinit -c)" -msgid "cloning main repo\n" +msgid "cloning main repository\n" msgstr "kloner hovedarkiv\n" -msgid "cloning patch repo\n" +msgid "cloning patch repository\n" msgstr "kloner rettelsesarkiv\n" -msgid "stripping applied patches from destination repo\n" -msgstr "" - -msgid "updating destination repo\n" +msgid "stripping applied patches from destination repository\n" +msgstr "" + +msgid "updating destination repository\n" msgstr "" msgid "commit changes in the queue repository" @@ -2912,21 +2952,19 @@ msgid "" "create a new patch\n" "\n" -" qnew creates a new patch on top of the currently-applied patch (if " -"any).\n" -" It will refuse to run if there are any outstanding changes unless -f is\n" -" specified, in which case the patch will be initialized with them. You\n" -" may also use -I, -X, and/or a list of files after the patch name to add\n" -" only changes to matching files to the new patch, leaving the rest as\n" -" uncommitted modifications.\n" +" qnew creates a new patch on top of the currently-applied patch (if\n" +" any). It will refuse to run if there are any outstanding changes\n" +" unless -f is specified, in which case the patch will be\n" +" initialized with them. You may also use -I, -X, and/or a list of\n" +" files after the patch name to add only changes to matching files\n" +" to the new patch, leaving the rest as uncommitted modifications.\n" "\n" " -u and -d can be used to set the (given) user and date, respectively.\n" " -U and -D set user to current user and date to current date.\n" "\n" -" -e, -m or -l set the patch header as well as the commit message. If " -"none\n" -" is specified, the header is empty and the commit message is '[mq]: " -"PATCH'.\n" +" -e, -m or -l set the patch header as well as the commit message.\n" +" If none is specified, the header is empty and the commit message\n" +" is '[mq]: PATCH'.\n" "\n" " Use the --git option to keep the patch in the git extended diff\n" " format. Read the diffs help topic for more information on why this\n" @@ -2938,18 +2976,17 @@ msgid "" "update the current patch\n" "\n" -" If any file patterns are provided, the refreshed patch will contain " -"only\n" -" the modifications that match those patterns; the remaining " -"modifications\n" -" will remain in the working directory.\n" -"\n" -" If --short is specified, files currently included in the patch will\n" -" be refreshed just like matched files and remain in the patch.\n" -"\n" -" hg add/remove/copy/rename work as usual, though you might want to use\n" -" git-style patches (--git or [diff] git=1) to track copies and renames.\n" -" See the diffs help topic for more information on the git diff format.\n" +" If any file patterns are provided, the refreshed patch will\n" +" contain only the modifications that match those patterns; the\n" +" remaining modifications will remain in the working directory.\n" +"\n" +" If --short is specified, files currently included in the patch\n" +" will be refreshed just like matched files and remain in the patch.\n" +"\n" +" hg add/remove/copy/rename work as usual, though you might want to\n" +" use git-style patches (--git or [diff] git=1) to track copies and\n" +" renames. See the diffs help topic for more information on the git\n" +" diff format.\n" " " msgstr "" @@ -2959,14 +2996,15 @@ msgid "" "diff of the current patch and subsequent modifications\n" "\n" -" Shows a diff which includes the current patch as well as any changes " -"which\n" -" have been made in the working directory since the last refresh (thus\n" -" showing what the current patch would become after a qrefresh).\n" -"\n" -" Use 'hg diff' if you only want to see the changes made since the last\n" -" qrefresh, or 'hg export qtip' if you want to see changes made by the\n" -" current patch without including changes made since the qrefresh.\n" +" Shows a diff which includes the current patch as well as any\n" +" changes which have been made in the working directory since the\n" +" last refresh (thus showing what the current patch would become\n" +" after a qrefresh).\n" +"\n" +" Use 'hg diff' if you only want to see the changes made since the\n" +" last qrefresh, or 'hg export qtip' if you want to see changes made\n" +" by the current patch without including changes made since the\n" +" qrefresh.\n" " " msgstr "" @@ -2976,12 +3014,12 @@ " Patches must not yet be applied. Each patch will be successively\n" " applied to the current patch in the order given. If all the\n" " patches apply successfully, the current patch will be refreshed\n" -" with the new cumulative patch, and the folded patches will\n" -" be deleted. With -k/--keep, the folded patch files will not\n" -" be removed afterwards.\n" -"\n" -" The header for each folded patch will be concatenated with\n" -" the current patch header, separated by a line of '* * *'." +" with the new cumulative patch, and the folded patches will be\n" +" deleted. With -k/--keep, the folded patch files will not be\n" +" removed afterwards.\n" +"\n" +" The header for each folded patch will be concatenated with the\n" +" current patch header, separated by a line of '* * *'." msgstr "" msgid "qfold requires at least one patch name" @@ -3039,8 +3077,8 @@ msgid "" "push the next patch onto the stack\n" "\n" -" When --force is applied, all local changes in patched files will be " -"lost.\n" +" When --force is applied, all local changes in patched files will\n" +" be lost.\n" " " msgstr "" @@ -3054,9 +3092,9 @@ msgid "" "pop the current patch off the stack\n" "\n" -" By default, pops off the top of the patch stack. If given a patch name,\n" -" keeps popping off patches until the named patch is at the top of the " -"stack.\n" +" By default, pops off the top of the patch stack. If given a patch\n" +" name, keeps popping off patches until the named patch is at the\n" +" top of the stack.\n" " " msgstr "" @@ -3079,7 +3117,7 @@ msgid "A patch named %s already exists in the series file" msgstr "" -msgid "restore the queue state saved by a rev" +msgid "restore the queue state saved by a revision" msgstr "" msgid "save current queue state" @@ -3100,8 +3138,9 @@ msgid "" "strip a revision and all its descendants from the repository\n" "\n" -" If one of the working dir's parent revisions is stripped, the working\n" -" directory will be updated to the parent of the stripped revision.\n" +" If one of the working directory's parent revisions is stripped, the\n" +" working directory will be updated to the parent of the stripped\n" +" revision.\n" " " msgstr "" @@ -3109,34 +3148,34 @@ "set or print guarded patches to push\n" "\n" " Use the qguard command to set or print guards on patch, then use\n" -" qselect to tell mq which guards to use. A patch will be pushed if it\n" -" has no guards or any positive guards match the currently selected " -"guard,\n" -" but will not be pushed if any negative guards match the current guard.\n" -" For example:\n" +" qselect to tell mq which guards to use. A patch will be pushed if\n" +" it has no guards or any positive guards match the currently\n" +" selected guard, but will not be pushed if any negative guards\n" +" match the current guard. For example:\n" "\n" " qguard foo.patch -stable (negative guard)\n" " qguard bar.patch +stable (positive guard)\n" " qselect stable\n" "\n" " This activates the \"stable\" guard. mq will skip foo.patch (because\n" -" it has a negative match) but push bar.patch (because it\n" -" has a positive match).\n" +" it has a negative match) but push bar.patch (because it has a\n" +" positive match).\n" "\n" " With no arguments, prints the currently active guards.\n" " With one argument, sets the active guard.\n" "\n" " Use -n/--none to deactivate guards (no other arguments needed).\n" -" When no guards are active, patches with positive guards are skipped\n" -" and patches with negative guards are pushed.\n" +" When no guards are active, patches with positive guards are\n" +" skipped and patches with negative guards are pushed.\n" "\n" " qselect can change the guards on applied patches. It does not pop\n" -" guarded patches by default. Use --pop to pop back to the last applied\n" -" patch that is not guarded. Use --reapply (which implies --pop) to push\n" -" back to the current patch afterwards, but skip guarded patches.\n" -"\n" -" Use -s/--series to print a list of all guards in the series file (no\n" -" other arguments needed). Use -v for more information." +" guarded patches by default. Use --pop to pop back to the last\n" +" applied patch that is not guarded. Use --reapply (which implies\n" +" --pop) to push back to the current patch afterwards, but skip\n" +" guarded patches.\n" +"\n" +" Use -s/--series to print a list of all guards in the series file\n" +" (no other arguments needed). Use -v for more information." msgstr "" msgid "guards deactivated\n" @@ -3171,17 +3210,18 @@ msgid "" "move applied patches into repository history\n" "\n" -" Finishes the specified revisions (corresponding to applied patches) by\n" -" moving them out of mq control into regular repository history.\n" +" Finishes the specified revisions (corresponding to applied\n" +" patches) by moving them out of mq control into regular repository\n" +" history.\n" "\n" " Accepts a revision range or the --applied option. If --applied is\n" " specified, all applied mq revisions are removed from mq control.\n" " Otherwise, the given revisions must be at the base of the stack of\n" " applied patches.\n" "\n" -" This can be especially useful if your changes have been applied to an\n" -" upstream repository, or if you are about to push your changes to " -"upstream.\n" +" This can be especially useful if your changes have been applied to\n" +" an upstream repository, or if you are about to push your changes\n" +" to upstream.\n" " " msgstr "" @@ -3220,7 +3260,7 @@ msgid "use uncompressed transfer (fast over LAN)" msgstr "" -msgid "location of source patch repo" +msgid "location of source patch repository" msgstr "" msgid "hg qclone [OPTION]... SOURCE [DEST]" @@ -3268,7 +3308,7 @@ msgid "hg qheader [PATCH]" msgstr "" -msgid "import file in patch dir" +msgid "import file in patch directory" msgstr "" msgid "patch file name" @@ -3370,7 +3410,7 @@ msgid "delete save entry" msgstr "" -msgid "update queue working dir" +msgid "update queue working directory" msgstr "" msgid "hg qrestore [-d] [-u] REV" @@ -3494,10 +3534,10 @@ "emails\n" " pattern = user@host\n" "\n" -" glob patterns are matched against path to repo root.\n" -"\n" -" if you like, you can put notify config file in repo that users can\n" -" push changes to, they can manage their own subscriptions." +" glob patterns are matched against path to repository root.\n" +"\n" +" if you like, you can put notify config file in repository that users\n" +" can push changes to, they can manage their own subscriptions." msgstr "" msgid "email notification class." @@ -3551,7 +3591,7 @@ msgstr "" #, python-format -msgid "notify: no subscribers to repo %s\n" +msgid "notify: no subscribers to repository %s\n" msgstr "" #, python-format @@ -3566,12 +3606,11 @@ " [pager]\n" " pager = LESS='FSRX' less\n" "\n" -"If no pager is set, the pager extensions uses the environment\n" -"variable $PAGER. If neither pager.pager, nor $PAGER is set, no pager\n" -"is used.\n" -"\n" -"If you notice \"BROKEN PIPE\" error messages, you can disable them\n" -"by setting:\n" +"If no pager is set, the pager extensions uses the environment variable\n" +"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used.\n" +"\n" +"If you notice \"BROKEN PIPE\" error messages, you can disable them by\n" +"setting:\n" "\n" " [pager]\n" " quiet = True\n" @@ -3582,23 +3621,23 @@ " [pager]\n" " ignore = version, help, update\n" "\n" -"You can also enable the pager only for certain commands using pager.attend:\n" +"You can also enable the pager only for certain commands using\n" +"pager.attend:\n" "\n" " [pager]\n" " attend = log\n" "\n" "If pager.attend is present, pager.ignore will be ignored.\n" "\n" -"To ignore global commands like \"hg version\" or \"hg help\", you have to " -"specify\n" -"them in the global .hgrc\n" +"To ignore global commands like \"hg version\" or \"hg help\", you have to\n" +"specify them in the global .hgrc\n" msgstr "" msgid "" "use suffixes to refer to ancestor revisions\n" "\n" -"This extension allows you to use git-style suffixes to refer to\n" -"the ancestors of a specific revision.\n" +"This extension allows you to use git-style suffixes to refer to the\n" +"ancestors of a specific revision.\n" "\n" "For example, if you can refer to a revision as \"foo\", then:\n" "\n" @@ -3617,12 +3656,12 @@ msgid "" "sending Mercurial changesets as a series of patch emails\n" "\n" -"The series is started off with a \"[PATCH 0 of N]\" introduction,\n" -"which describes the series as a whole.\n" -"\n" -"Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n" -"the first line of the changeset description as the subject text.\n" -"The message contains two or three body parts:\n" +"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n" +"describes the series as a whole.\n" +"\n" +"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n" +"first line of the changeset description as the subject text. The\n" +"message contains two or three body parts:\n" "\n" " The remainder of the changeset description.\n" "\n" @@ -3631,11 +3670,11 @@ " The patch itself, as generated by \"hg export\".\n" "\n" "Each message refers to all of its predecessors using the In-Reply-To\n" -"and References headers, so they will show up as a sequence in\n" -"threaded mail and news readers, and in mail archives.\n" +"and References headers, so they will show up as a sequence in threaded\n" +"mail and news readers, and in mail archives.\n" "\n" "For each changeset, you will be prompted with a diffstat summary and\n" -"the changeset summary, so you can be sure you are sending the right " +"the changeset summary, so you can be sure you are sending the right\n" "changes.\n" "\n" "To enable this extension:\n" @@ -3643,7 +3682,8 @@ " [extensions]\n" " hgext.patchbomb =\n" "\n" -"To configure other defaults, add a section like this to your hgrc file:\n" +"To configure other defaults, add a section like this to your hgrc\n" +"file:\n" "\n" " [email]\n" " from = My Name \n" @@ -3655,24 +3695,24 @@ "as a patchbomb.\n" "\n" "To avoid sending patches prematurely, it is a good idea to first run\n" -"the \"email\" command with the \"-n\" option (test only). You will be\n" +"the \"email\" command with the \"-n\" option (test only). You will be\n" "prompted for an email recipient address, a subject an an introductory\n" -"message describing the patches of your patchbomb. Then when all is\n" +"message describing the patches of your patchbomb. Then when all is\n" "done, patchbomb messages are displayed. If PAGER environment variable\n" -"is set, your pager will be fired up once for each patchbomb message, so\n" -"you can verify everything is alright.\n" -"\n" -"The \"-m\" (mbox) option is also very useful. Instead of previewing\n" -"each patchbomb message in a pager or sending the messages directly,\n" -"it will create a UNIX mailbox file with the patch emails. This\n" -"mailbox file can be previewed with any mail user agent which supports\n" -"UNIX mbox files, i.e. with mutt:\n" +"is set, your pager will be fired up once for each patchbomb message,\n" +"so you can verify everything is alright.\n" +"\n" +"The \"-m\" (mbox) option is also very useful. Instead of previewing each\n" +"patchbomb message in a pager or sending the messages directly, it will\n" +"create a UNIX mailbox file with the patch emails. This mailbox file\n" +"can be previewed with any mail user agent which supports UNIX mbox\n" +"files, e.g. with mutt:\n" "\n" " % mutt -R -f mbox\n" "\n" "When you are previewing the patchbomb messages, you can use `formail'\n" -"(a utility that is commonly installed as part of the procmail package),\n" -"to send each message out:\n" +"(a utility that is commonly installed as part of the procmail\n" +"package), to send each message out:\n" "\n" " % formail -s sendmail -bm -t < mbox\n" "\n" @@ -3680,9 +3720,9 @@ "\n" "You can also either configure the method option in the email section\n" "to be a sendmail compatable mailer or fill out the [smtp] section so\n" -"that the patchbomb extension can automatically send patchbombs directly\n" -"from the commandline. See the [email] and [smtp] sections in hgrc(5)\n" -"for details." +"that the patchbomb extension can automatically send patchbombs\n" +"directly from the commandline. See the [email] and [smtp] sections in\n" +"hgrc(5) for details." msgstr "" msgid "Please enter a valid value.\n" @@ -3698,23 +3738,23 @@ "send changesets by email\n" "\n" " By default, diffs are sent in the format generated by hg export,\n" -" one per message. The series starts with a \"[PATCH 0 of N]\"\n" +" one per message. The series starts with a \"[PATCH 0 of N]\"\n" " introduction, which describes the series as a whole.\n" "\n" " Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n" " the first line of the changeset description as the subject text.\n" -" The message contains two or three body parts. First, the rest of\n" -" the changeset description. Next, (optionally) if the diffstat\n" +" The message contains two or three body parts. First, the rest of\n" +" the changeset description. Next, (optionally) if the diffstat\n" " program is installed, the result of running diffstat on the patch.\n" " Finally, the patch itself, as generated by \"hg export\".\n" "\n" -" With --outgoing, emails will be generated for patches not\n" -" found in the destination repository (or only those which are\n" -" ancestors of the specified revisions if any are provided)\n" -"\n" -" With --bundle, changesets are selected as for --outgoing,\n" -" but a single email containing a binary Mercurial bundle as an\n" -" attachment will be sent.\n" +" With --outgoing, emails will be generated for patches not found in\n" +" the destination repository (or only those which are ancestors of\n" +" the specified revisions if any are provided)\n" +"\n" +" With --bundle, changesets are selected as for --outgoing, but a\n" +" single email containing a binary Mercurial bundle as an attachment\n" +" will be sent.\n" "\n" " Examples:\n" "\n" @@ -3734,8 +3774,8 @@ "default\n" " hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST\n" "\n" -" Before using this command, you will need to enable email in your hgrc.\n" -" See the [email] section in hgrc(5) for details.\n" +" Before using this command, you will need to enable email in your\n" +" hgrc. See the [email] section in hgrc(5) for details.\n" " " msgstr "" @@ -3784,7 +3824,7 @@ msgid "send patches as inline attachments" msgstr "" -msgid "email addresses of blind copy recipients" +msgid "email addresses of blind carbon copy recipients" msgstr "" msgid "email addresses of copy recipients" @@ -3823,6 +3863,9 @@ msgid "send changes not in target as a binary bundle" msgstr "" +msgid "file name of the bundle attachment" +msgstr "" + msgid "a revision to send" msgstr "" @@ -3841,13 +3884,13 @@ msgid "" "removes files not tracked by Mercurial\n" "\n" -" Delete files not known to Mercurial. This is useful to test local and\n" -" uncommitted changes in an otherwise-clean source tree.\n" +" Delete files not known to Mercurial. This is useful to test local\n" +" and uncommitted changes in an otherwise-clean source tree.\n" "\n" " This means that purge will delete:\n" " - Unknown files: files marked with \"?\" by \"hg status\"\n" -" - Empty directories: in fact Mercurial ignores directories unless they\n" -" contain files under source control managment\n" +" - Empty directories: in fact Mercurial ignores directories unless\n" +" they contain files under source control managment\n" " But it will leave untouched:\n" " - Modified and unmodified tracked files\n" " - Ignored files (unless --all is specified)\n" @@ -3856,9 +3899,10 @@ " If directories are given on the command line, only files in these\n" " directories are considered.\n" "\n" -" Be careful with purge, as you could irreversibly delete some files you\n" -" forgot to add to the repository. If you only want to print the list of\n" -" files that this program would delete, use the --print option.\n" +" Be careful with purge, as you could irreversibly delete some files\n" +" you forgot to add to the repository. If you only want to print the\n" +" list of files that this program would delete, use the --print\n" +" option.\n" " " msgstr "" @@ -3896,7 +3940,7 @@ msgid "" "move sets of revisions to a different ancestor\n" "\n" -"This extension lets you rebase changesets in an existing Mercurial " +"This extension lets you rebase changesets in an existing Mercurial\n" "repository.\n" "\n" "For more information:\n" @@ -3912,19 +3956,13 @@ msgid "" "move changeset (and descendants) to a different branch\n" "\n" -" Rebase uses repeated merging to graft changesets from one part of " -"history\n" -" onto another. This can be useful for linearizing local changes relative " -"to\n" -" a master development tree.\n" -"\n" -" If a rebase is interrupted to manually resolve a merge, it can be " -"continued\n" -" with --continue or aborted with --abort.\n" -" " -msgstr "" - -msgid "cannot use both keepbranches and extrafn" +" Rebase uses repeated merging to graft changesets from one part of\n" +" history onto another. This can be useful for linearizing local\n" +" changes relative to a master development tree.\n" +"\n" +" If a rebase is interrupted to manually resolve a merge, it can be\n" +" continued with --continue or aborted with --abort.\n" +" " msgstr "" msgid "cannot use both abort and continue" @@ -3942,6 +3980,9 @@ msgid "nothing to rebase\n" msgstr "" +msgid "cannot use both keepbranches and extrafn" +msgstr "" + msgid "rebase merging completed\n" msgstr "" @@ -4007,6 +4048,9 @@ msgid "cannot use revision %d as base, result would have 3 parents" msgstr "" +msgid "Return true if the given patch is in git format" +msgstr "" + msgid "Update rebased mq patches - finalize and then import them" msgstr "" @@ -4082,12 +4126,6 @@ msgid "rebase working directory to branch head" msgstr "" -msgid "keep original revisions" -msgstr "" - -msgid "keep original branches" -msgstr "" - msgid "rebase from a given revision" msgstr "" @@ -4100,6 +4138,12 @@ msgid "collapse the rebased revisions" msgstr "" +msgid "keep original revisions" +msgstr "" + +msgid "keep original branches" +msgstr "" + msgid "continue an interrupted rebase" msgstr "" @@ -4107,7 +4151,8 @@ msgstr "" msgid "" -"hg rebase [-s rev | -b rev] [-d rev] [--collapse] | [-c] | [-a] | [--keep]" +"hg rebase [-s rev | -b rev] [-d rev] [--collapse] [--keep] [--keepbranches] " +"| [-c] | [-a]" msgstr "" msgid "interactive change selection during commit or qrefresh" @@ -4221,6 +4266,10 @@ msgid "record this change to %r?" msgstr "" +#, python-format +msgid "record change %d/%d to %r?" +msgstr "" + msgid "" "interactively select changes to commit\n" "\n" @@ -4231,7 +4280,7 @@ "\n" " You will be prompted for whether to record changes to each\n" " modified file, and for files with multiple changes, for each\n" -" change to use. For each query, the following responses are\n" +" change to use. For each query, the following responses are\n" " possible:\n" "\n" " y - record this change\n" @@ -4305,8 +4354,8 @@ "\n" "This extension allows you to transplant patches from another branch.\n" "\n" -"Transplanted patches are recorded in .hg/transplant/transplants, as a map\n" -"from a changeset hash to its hash in the source repository.\n" +"Transplanted patches are recorded in .hg/transplant/transplants, as a\n" +"map from a changeset hash to its hash in the source repository.\n" msgstr "" msgid "" @@ -4398,8 +4447,8 @@ " (transplanted from CHANGESETHASH)\n" "\n" " You can rewrite the changelog message with the --filter option.\n" -" Its argument will be invoked with the current changelog message\n" -" as $1 and the patch as $2.\n" +" Its argument will be invoked with the current changelog message as\n" +" $1 and the patch as $2.\n" "\n" " If --source is specified, selects changesets from the named\n" " repository. If --branch is specified, selects changesets from the\n" @@ -4407,19 +4456,21 @@ " is specified, all changesets on the branch will be transplanted,\n" " otherwise you will be prompted to select the changesets you want.\n" "\n" -" hg transplant --branch REVISION --all will rebase the selected branch\n" -" (up to the named revision) onto your current working directory.\n" -"\n" -" You can optionally mark selected transplanted changesets as\n" -" merge changesets. You will not be prompted to transplant any\n" -" ancestors of a merged transplant, and you can merge descendants\n" -" of them normally instead of transplanting them.\n" +" hg transplant --branch REVISION --all will rebase the selected\n" +" branch (up to the named revision) onto your current working\n" +" directory.\n" +"\n" +" You can optionally mark selected transplanted changesets as merge\n" +" changesets. You will not be prompted to transplant any ancestors\n" +" of a merged transplant, and you can merge descendants of them\n" +" normally instead of transplanting them.\n" "\n" " If no merges or revisions are provided, hg transplant will start\n" " an interactive changeset browser.\n" "\n" -" If a changeset application fails, you can fix the merge by hand and\n" -" then resume where you left off by calling hg transplant --continue.\n" +" If a changeset application fails, you can fix the merge by hand\n" +" and then resume where you left off by calling hg transplant\n" +" --continue.\n" " " msgstr "" @@ -4475,18 +4526,18 @@ msgid "" "allow to use MBCS path with problematic encoding.\n" "\n" -"Some MBCS encodings are not good for some path operations\n" -"(i.e. splitting path, case conversion, etc.) with its encoded bytes.\n" -"We call such a encoding (i.e. shift_jis and big5) as \"problematic\n" -"encoding\". This extension can be used to fix the issue with those\n" -"encodings by wrapping some functions to convert to unicode string\n" -"before path operation.\n" +"Some MBCS encodings are not good for some path operations (i.e.\n" +"splitting path, case conversion, etc.) with its encoded bytes. We call\n" +"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n" +"This extension can be used to fix the issue with those encodings by\n" +"wrapping some functions to convert to unicode string before path\n" +"operation.\n" "\n" "This extension is usefull for:\n" " * Japanese Windows users using shift_jis encoding.\n" " * Chinese Windows users using big5 encoding.\n" -" * All users who use a repository with one of problematic encodings\n" -" on case-insensitive file system.\n" +" * All users who use a repository with one of problematic encodings on\n" +" case-insensitive file system.\n" "\n" "This extension is not needed for:\n" " * Any user who use only ascii chars in path.\n" @@ -4494,15 +4545,17 @@ "\n" "Note that there are some limitations on using this extension:\n" " * You should use single encoding in one repository.\n" -" * You should set same encoding for the repository by locale or HGENCODING.\n" +" * You should set same encoding for the repository by locale or\n" +" HGENCODING.\n" "\n" "To use this extension, enable the extension in .hg/hgrc or ~/.hgrc:\n" "\n" " [extensions]\n" " hgext.win32mbcs =\n" "\n" -"Path encoding conversion are done between unicode and util._encoding\n" -"which is decided by mercurial from current locale setting or HGENCODING.\n" +"Path encoding conversion are done between unicode and\n" +"encoding.encoding which is decided by mercurial from current locale\n" +"setting or HGENCODING.\n" "\n" msgstr "" @@ -4555,19 +4608,18 @@ msgid "" "zeroconf support for mercurial repositories\n" "\n" -"Zeroconf enabled repositories will be announced in a network without the " -"need\n" -"to configure a server or a service. They can be discovered without knowing\n" -"their actual IP address.\n" -"\n" -"To use the zeroconf extension add the following entry to your hgrc file:\n" +"Zeroconf enabled repositories will be announced in a network without\n" +"the need to configure a server or a service. They can be discovered\n" +"without knowing their actual IP address.\n" +"\n" +"To use the zeroconf extension add the following entry to your hgrc\n" +"file:\n" "\n" "[extensions]\n" "hgext.zeroconf =\n" "\n" -"To allow other people to discover your repository using run \"hg serve\" in " -"your\n" -"repository.\n" +"To allow other people to discover your repository using run \"hg serve\"\n" +"in your repository.\n" "\n" " $ cd test\n" " $ hg serve\n" @@ -4626,7 +4678,7 @@ #, python-format msgid "can't read commit message '%s': %s" -msgstr "Kan ikke lase commit besked '%s': %s" +msgstr "Kan ikke læse arkiveringsbesked '%s': %s" msgid "limit must be a positive integer" msgstr "" @@ -4678,8 +4730,12 @@ msgstr "%s: kan ikke kopiere - %s\n" #, python-format -msgid "%s %s to %s\n" -msgstr "%s: %s til %s\n" +msgid "moving %s to %s\n" +msgstr "" + +#, python-format +msgid "copying %s to %s\n" +msgstr "" #, python-format msgid "%s has not been committed yet, so no copy data will be stored for %s.\n" @@ -4808,33 +4864,35 @@ msgid "" "add the specified files on the next commit\n" "\n" -" Schedule files to be version controlled and added to the repository.\n" +" Schedule files to be version controlled and added to the\n" +" repository.\n" "\n" " The files will be added to the repository at the next commit. To\n" " undo an add before that, see hg revert.\n" "\n" -" If no names are given, add all files in the repository.\n" -" " -msgstr "" -"tilføj de angivne filer ved næste commit\n" +" If no names are given, add all files to the repository.\n" +" " +msgstr "" +"tilføj de angivne filer ved næste arkivering\n" "\n" " Opskriv filer til at blive versionsstyret og tilføjet til arkivet.\n" "\n" -" Filerne vil bliver tilføjet til arkivet ved næste commit. For at\n" -" omgøre en tilføjelse før det, se hg revert.\n" -"\n" -" Hvis der ikke er angivet nogen navne tilføjes alle filer i\n" +" Filerne vil bliver tilføjet til arkivet ved næste arkivering. For\n" +" at omgøre en tilføjelse før det, se hg revert.\n" +"\n" +" Hvis der ikke er angivet nogen navne tilføjes alle filer til\n" " arkivet.\n" " " msgid "" "add all new files, delete all missing files\n" "\n" -" Add all new files and remove all missing files from the repository.\n" -"\n" -" New files are ignored if they match any of the patterns in .hgignore. " -"As\n" -" with add, these changes take effect at the next commit.\n" +" Add all new files and remove all missing files from the\n" +" repository.\n" +"\n" +" New files are ignored if they match any of the patterns in\n" +" .hgignore. As with add, these changes take effect at the next\n" +" commit.\n" "\n" " Use the -s option to detect renamed files. With a parameter > 0,\n" " this compares every removed file with every added file and records\n" @@ -4853,18 +4911,28 @@ msgid "" "show changeset information per file line\n" "\n" -" List changes in files, showing the revision id responsible for each " -"line\n" -"\n" -" This command is useful to discover who did a change or when a change " -"took\n" -" place.\n" +" List changes in files, showing the revision id responsible for\n" +" each line\n" +"\n" +" This command is useful to discover who did a change or when a\n" +" change took place.\n" "\n" " Without the -a option, annotate will avoid processing files it\n" " detects as binary. With -a, annotate will generate an annotation\n" " anyway, probably with undesirable results.\n" " " msgstr "" +"vis information om ændringer pr linie\n" +"\n" +" Vis ændringer i filer ved at vise revisions ID'et som er\n" +" ansvarligt for hver linie\n" +"\n" +" Denne kommando er nyttig til at opdage hvem der lavede en ændring\n" +" og hvornår en ændring blev foretaget.\n" +"\n" +" Uden -a tilvalget vil annotate undgå at behandle filer som den\n" +" detekterer som binære. Med -a vil annotate generere en annotering\n" +" alligevel, sandsynligvis med et uønsket resultat." msgid "at least one file name or pattern required" msgstr "" @@ -4882,8 +4950,8 @@ " By default, the revision used is the parent of the working\n" " directory; use \"-r\" to specify a different revision.\n" "\n" -" To specify the type of archive to create, use \"-t\". Valid\n" -" types are:\n" +" To specify the type of archive to create, use \"-t\". Valid types\n" +" are:\n" "\n" " \"files\" (default): a directory full of files\n" " \"tar\": tar archive, uncompressed\n" @@ -4893,11 +4961,11 @@ " \"zip\": zip archive, compressed using deflate\n" "\n" " The exact name of the destination archive or directory is given\n" -" using a format string; see \"hg help export\" for details.\n" +" using a format string; see 'hg help export' for details.\n" "\n" " Each member added to an archive file has a directory prefix\n" -" prepended. Use \"-p\" to specify a format string for the prefix.\n" -" The default is the basename of the archive, with suffixes removed.\n" +" prepended. Use \"-p\" to specify a format string for the prefix. The\n" +" default is the basename of the archive, with suffixes removed.\n" " " msgstr "" @@ -4922,13 +4990,30 @@ "\n" " The --merge option remembers the parent of the working directory\n" " before starting the backout, then merges the new head with that\n" -" changeset afterwards. This saves you from doing the merge by\n" -" hand. The result of this merge is not committed, as for a normal\n" -" merge.\n" +" changeset afterwards. This saves you from doing the merge by hand.\n" +" The result of this merge is not committed, as with a normal merge.\n" "\n" " See 'hg help dates' for a list of formats valid for -d/--date.\n" " " msgstr "" +"omgør effekten af tidligere ændringer\n" +"\n" +" Arkiverer de omgjorte ændringer som en ny ændring. Den nye ændring\n" +" er et barn af den omgjorte ændring.\n" +"\n" +" Hvis du omgør en ændring som ikke er spidsen, så vil et der blive\n" +" lavet et nyt hoved. Dette hoved vil være den nye spids og du bør\n" +" sammenføje denne omgjorte ændring med et andet hoved (det\n" +" nuværende hoved som standard).\n" +"\n" +" Med --merge tilvalget vil forældren til arbejdskataloget bliver\n" +" husket og det nye hoved vil blive sammenføjet med denne ændring\n" +" bagefter. Dette sparer dig for at lave sammenføjningen selv.\n" +" Resultatet af denne sammenføjning er ikke arkiveret, som ved en\n" +" normal sammenføjning.\n" +"\n" +" Se 'hg help dates' for en liste af gyldige formater til -d/--date.\n" +" " msgid "please specify just one revision" msgstr "angiv venligst kun en revision" @@ -4973,27 +5058,23 @@ msgid "" "subdivision search of changesets\n" "\n" -" This command helps to find changesets which introduce problems.\n" -" To use, mark the earliest changeset you know exhibits the problem\n" -" as bad, then mark the latest changeset which is free from the\n" -" problem as good. Bisect will update your working directory to a\n" -" revision for testing (unless the --noupdate option is specified).\n" -" Once you have performed tests, mark the working directory as bad\n" -" or good and bisect will either update to another candidate changeset\n" -" or announce that it has found the bad revision.\n" +" This command helps to find changesets which introduce problems. To\n" +" use, mark the earliest changeset you know exhibits the problem as\n" +" bad, then mark the latest changeset which is free from the problem\n" +" as good. Bisect will update your working directory to a revision\n" +" for testing (unless the --noupdate option is specified). Once you\n" +" have performed tests, mark the working directory as bad or good\n" +" and bisect will either update to another candidate changeset or\n" +" announce that it has found the bad revision.\n" "\n" " As a shortcut, you can also use the revision argument to mark a\n" " revision as good or bad without checking it out first.\n" "\n" -" If you supply a command it will be used for automatic bisection. Its " -"exit\n" -" status will be used as flag to mark revision as bad or good. In case " -"exit\n" -" status is 0 the revision is marked as good, 125 - skipped, 127 (command " -"not\n" -" found) - bisection will be aborted and any other status bigger than 0 " -"will\n" -" mark revision as bad.\n" +" If you supply a command it will be used for automatic bisection.\n" +" Its exit status will be used as flag to mark revision as bad or\n" +" good. In case exit status is 0 the revision is marked as good, 125\n" +" - skipped, 127 (command not found) - bisection will be aborted;\n" +" any other status bigger than 0 will mark revision as bad.\n" " " msgstr "" @@ -5037,14 +5118,16 @@ "set or show the current branch name\n" "\n" " With no argument, show the current branch name. With one argument,\n" -" set the working directory branch name (the branch does not exist in\n" -" the repository until the next commit).\n" -"\n" -" Unless --force is specified, branch will not let you set a\n" -" branch name that shadows an existing branch.\n" +" set the working directory branch name (the branch does not exist\n" +" in the repository until the next commit). It is recommended to use\n" +" the 'default' branch as your primary development branch.\n" +"\n" +" Unless --force is specified, branch will not let you set a branch\n" +" name that shadows an existing branch.\n" "\n" " Use --clean to reset the working directory branch to that of the\n" -" parent of the working directory, negating a previous branch change.\n" +" parent of the working directory, negating a previous branch\n" +" change.\n" "\n" " Use the command 'hg update' to switch to an existing branch.\n" " " @@ -5077,7 +5160,7 @@ "create a changegroup file\n" "\n" " Generate a compressed changegroup file collecting changesets not\n" -" found in the other repository.\n" +" known to be in another repository.\n" "\n" " If no destination repository is specified the destination is\n" " assumed to have all the nodes specified by one or more --base\n" @@ -5085,10 +5168,10 @@ " --all (or --base null). To change the compression method applied,\n" " use the -t option (by default, bundles are compressed using bz2).\n" "\n" -" The bundle file can then be transferred using conventional means and\n" -" applied to another repository with the unbundle or pull command.\n" -" This is useful when direct push and pull are not available or when\n" -" exporting an entire repository is undesirable.\n" +" The bundle file can then be transferred using conventional means\n" +" and applied to another repository with the unbundle or pull\n" +" command. This is useful when direct push and pull are not\n" +" available or when exporting an entire repository is undesirable.\n" "\n" " Applying bundles preserves all changeset contents including\n" " permissions, copy/rename information, and revision history.\n" @@ -5104,8 +5187,8 @@ msgid "" "output the current or given revision of files\n" "\n" -" Print the specified files as they were at the given revision.\n" -" If no revision is given, the parent of the working directory is used,\n" +" Print the specified files as they were at the given revision. If\n" +" no revision is given, the parent of the working directory is used,\n" " or tip if no revision is checked out.\n" "\n" " Output may be to a file, in which case the name of the file is\n" @@ -5113,7 +5196,7 @@ " for the export command, with the following additions:\n" "\n" " %s basename of file being printed\n" -" %d dirname of file being printed, or '.' if in repo root\n" +" %d dirname of file being printed, or '.' if in repository root\n" " %p root-relative path name of file being printed\n" " " msgstr "" @@ -5129,6 +5212,23 @@ " The location of the source is added to the new repository's\n" " .hg/hgrc file, as the default to be used for future pulls.\n" "\n" +" If you use the -r option to clone up to a specific revision, no\n" +" subsequent revisions (including subsequent tags) will be present\n" +" in the cloned repository. This option implies --pull, even on\n" +" local repositories.\n" +"\n" +" By default, clone will check out the head of the 'default' branch.\n" +" If the -U option is used, the new clone will contain only a\n" +" repository (.hg) and no working copy (the working copy parent is\n" +" the null revision).\n" +"\n" +" See 'hg help urls' for valid source format details.\n" +"\n" +" It is possible to specify an ssh:// URL as the destination, but no\n" +" .hg/hgrc and working directory will be created on the remote side.\n" +" Look at the help text for URLs for important details about ssh://\n" +" URLs.\n" +"\n" " For efficiency, hardlinks are used for cloning whenever the source\n" " and destination are on the same filesystem (note this applies only\n" " to the repository data, not to the checked out files). Some\n" @@ -5141,33 +5241,69 @@ "\n" " $ cp -al REPO REPOCLONE\n" "\n" -" This is the fastest way to clone, but it is not always safe. The\n" +" This is the fastest way to clone, but it is not always safe. The\n" " operation is not atomic (making sure REPO is not modified during\n" " the operation is up to you) and you have to make sure your editor\n" -" breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,\n" +" breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,\n" " this is not compatible with certain extensions that place their\n" " metadata under the .hg directory, such as mq.\n" "\n" -" If you use the -r option to clone up to a specific revision, no\n" -" subsequent revisions will be present in the cloned repository.\n" -" This option implies --pull, even on local repositories.\n" -"\n" -" If the -U option is used, the new clone will contain only a repository\n" -" (.hg) and no working copy (the working copy parent is the null " -"revision).\n" -"\n" -" See 'hg help urls' for valid source format details.\n" -"\n" -" It is possible to specify an ssh:// URL as the destination, but no\n" -" .hg/hgrc and working directory will be created on the remote side.\n" -" Look at the help text for urls for important details about ssh:// URLs.\n" -" " -msgstr "" +" " +msgstr "" +"lav en kopi af et eksisterende arkiv\n" +"\n" +" Lav en kopi af et eksisterende arkiv i en ny mappe.\n" +"\n" +" Hvis der ikke angivet et navn til destinationen, så bruges\n" +" grundnavnet for kilden.\n" +"\n" +" Placeringen af kilden tilføjes til det nye arkivs .hg/hgrc fil som\n" +" den nye standard for fremtidige kald til 'hg pull'.\n" +"\n" +" Hvis du bruger -r tilvalget for at klone op til en specifik\n" +" revision, så vil ingen efterfølgende revisioner (inklusiv\n" +" efterfølgende mærkater) findes i det klonede arkiv. Denne\n" +" valgmulighed medfører --pull, selv ved lokale arkiver.\n" +"\n" +" Som udgangspunkt vil clone hente hovedet af 'default' grenen. Hvis\n" +" -U tilvalget bruges vil den nye klon kun indeholde et arkiv (.hg)\n" +" og intet arbejdskatalog (arbejdskatalogets forældre er sat til nul\n" +" revisionen).\n" +"\n" +" Se 'hg help urls' for detaljer om gyldige formatter for kilden.\n" +"\n" +" Det er muligt at specificere en ssh:// URL som destination, men\n" +" der vil ikke bliver oprettet nogen .hg/hgrc fil eller noget\n" +" arbejdskatalog på den anden side. Se hjælpeteksten for URLer for\n" +" vigtige detaljer om ssh:// URLer.\n" +"\n" +" Af effektivitetsgrunde bruges hårde lænker ved kloning når kilden\n" +" og destinationen er på det samme filsystem (bemærk at dette kun\n" +" gælder for arkivdata og ikke for de udhentede filer). Nogle\n" +" filsystemer, såsom AFS, implementerer ikke hårde lænker korrekt,\n" +" men rapporterer ingen fejl. I disse tilfælde skal --pull bruges\n" +" for at undgå hårde lænker.\n" +"\n" +" I nogle tilfælde kan man klone arkiver og udhentede filer med\n" +"\n" +" $ cp -al ARKIV ARKIVKLON\n" +"\n" +" Dette er den hurtigste måde at klone på, men det er ikke altid\n" +" sikkert. Operationen er ikke atomisk (det er op til dig at sikre\n" +" at ARKIV ikke bliver modificeret undervejs) og du skal selv sørge\n" +" for at din tekstbehandler bryder hårde lænker (Emacs og de fleste\n" +" Linux Kernel værktøjer gør det). Dette er desuden ikke kompatibelt\n" +" med visse udvidelser som placerer deres metadata under .hg mappen,\n" +" såsom mq.\n" +"\n" +" " msgid "" "commit the specified files or all outstanding changes\n" "\n" -" Commit changes to the given files into the repository.\n" +" Commit changes to the given files into the repository. Unlike a\n" +" centralized RCS, this operation is a local operation. See hg push\n" +" for means to actively distribute your changes.\n" "\n" " If a list of files is omitted, all changes reported by \"hg status\"\n" " will be committed.\n" @@ -5175,12 +5311,29 @@ " If you are committing the result of a merge, do not provide any\n" " file names or -I/-X filters.\n" "\n" -" If no commit message is specified, the configured editor is started to\n" -" enter a message.\n" +" If no commit message is specified, the configured editor is\n" +" started to prompt you for a message.\n" "\n" " See 'hg help dates' for a list of formats valid for -d/--date.\n" " " msgstr "" +"arkiver de specificerede filer eller alle udestående ændringer\n" +"\n" +" Arkiver ændringer i de angivne filer ind i arkivet. Dette er en\n" +" lokal operation, i modsætning til et centraliseret RCS. Se hg push\n" +" for en måde til aktivt distribuere dine ændringer.\n" +"\n" +" Hvis en liste af filer udelades vil alle ændringer rapporteret af\n" +" \"hg status\" blive arkiveret.\n" +"\n" +" Hvis du arkiverer resultatet af en sammenføjning, undlad da at\n" +" angive filnavne eller -I/-X filtre.\n" +"\n" +" Hvis der ikke angives en arkiveringsbesked, så starten den\n" +" konfigurerede editor for at bede dig om en besked.\n" +"\n" +" Se 'hg help dates' for en liste af gyldige formater til -d/--date.\n" +" " msgid "created new head\n" msgstr "lavede et nyt hoved\n" @@ -5194,13 +5347,13 @@ "\n" " Mark dest as having copies of source files. If dest is a\n" " directory, copies are put in that directory. If dest is a file,\n" -" there can only be one source.\n" +" the source must be a single file.\n" "\n" " By default, this command copies the contents of files as they\n" " stand in the working directory. If invoked with --after, the\n" " operation is recorded, but no copying is performed.\n" "\n" -" This command takes effect in the next commit. To undo a copy\n" +" This command takes effect with the next commit. To undo a copy\n" " before that, see hg revert.\n" " " msgstr "" @@ -5397,9 +5550,32 @@ " probably with undesirable results.\n" "\n" " Use the --git option to generate diffs in the git extended diff\n" -" format. Read the diffs help topic for more information.\n" -" " -msgstr "" +" format. For more information, read 'hg help diffs'.\n" +" " +msgstr "" +"find ændringer i hele arkivet (eller udvalgte filer)\n" +"\n" +" Vis ændringer mellem revisioner for de udvalgte filer.\n" +"\n" +" Ændringerne mellem filerne vises i unified diff-formatet.\n" +"\n" +" BEMÆRK: diff kan generere overraskende resultater for\n" +" sammenføjninger, idet den som udgangspunkt vil sammenligne med\n" +" arbejdskatalogets første forældre, hvis der ikke angivet en\n" +" revision.\n" +"\n" +" Når der gives to revisioner som argumenter, så vises ændringer\n" +" mellem disse. Hvis der kun angives en revision, så sammenlignes\n" +" denne revision med arbejdskataloget, og når der ikke angives nogen\n" +" revisioner, så sammenlignes arbejdskataloget med dennes forældre.\n" +"\n" +" Uden -a tilvalget vil diff undgå at generere ændringer for filer\n" +" som den detekterer som binære. Med -a vil diff generere ændringer\n" +" alligevel, sandsynligvis med uønskede resultater.\n" +"\n" +" Brug --git tilvalget for at generere ændringer i det udvidede git\n" +" diff-format. For mere information, læs hg help diffs.\n" +" " msgid "" "dump the header and diffs for one or more changesets\n" @@ -5409,8 +5585,9 @@ " The information shown in the changeset header is: author,\n" " changeset hash, parent(s) and commit comment.\n" "\n" -" NOTE: export may generate unexpected diff output for merge changesets,\n" -" as it will compare the merge changeset against its first parent only.\n" +" NOTE: export may generate unexpected diff output for merge\n" +" changesets, as it will compare the merge changeset against its\n" +" first parent only.\n" "\n" " Output may be to a file, in which case the name of the file is\n" " given using a format string. The formatting rules are as follows:\n" @@ -5431,10 +5608,45 @@ " Use the --git option to generate diffs in the git extended diff\n" " format. Read the diffs help topic for more information.\n" "\n" -" With the --switch-parent option, the diff will be against the second\n" -" parent. It can be useful to review a merge.\n" -" " -msgstr "" +" With the --switch-parent option, the diff will be against the\n" +" second parent. It can be useful to review a merge.\n" +" " +msgstr "" +"dump hovedet og ændringerne for en eller flere ændringer\n" +"\n" +" Udskriv ændrings-hovedet og ændringerne for en eller flere\n" +" revisioner.\n" +"\n" +" Informationen som vises i ændrings-hovedet er: forfatter,\n" +" ændringshash, forældrene og arkiveringsbeskeden.\n" +"\n" +" BEMÆRK: export kan generere uventet diff uddata for\n" +" sammenføjningsændringer idet den kun vil sammenligne\n" +" sammenføjningsændringen med dennes første forældre.\n" +"\n" +" Uddata kan gemmes i en fil, og filnavnet er givet ved en\n" +" format-streng. Formatteringsreglerne er som følger:\n" +"\n" +" %% litteral % tegn\n" +" %H ændringshash (40 byte heksadecimal)\n" +" %N antallet af rettelser som bliver genereret\n" +" %R revisionnummer for ændringen\n" +" %b grundnavn for det eksporterede arkiv\n" +" %h kortform ændringshash (12 byte heksadecimal)\n" +" %n nul-fyldt sekvensnummer, startende ved 1\n" +" %r nul-fyldt revisionsnummer for ændringen\n" +"\n" +" Uden -a tilvalget vil annotate undgå at behandle filer som den\n" +" detekterer som binære. Med -a vil annotate generere en annotering\n" +" alligevel, sandsynligvis med et uønsket resultat.\n" +"\n" +" Brug --git tilvalget for at generere ændringer i det udvidede git\n" +" diff-format. For mere information, læs hg help diffs.\n" +"\n" +" Med --switch-parent tilvalget vil ændringerne blive beregnet i\n" +" forhold til den anden forældre. Dette kan være nyttigt til at\n" +" gennemse en sammenføjning.\n" +" " msgid "export requires at least one changeset" msgstr "" @@ -5452,8 +5664,8 @@ "\n" " This command behaves differently than Unix grep. It only accepts\n" " Python/Perl regexps. It searches repository history, not the\n" -" working directory. It always prints the revision number in which\n" -" a match appears.\n" +" working directory. It always prints the revision number in which a\n" +" match appears.\n" "\n" " By default, grep only prints output for the first revision of a\n" " file in which it finds a match. To get it to print every revision\n" @@ -5499,7 +5711,8 @@ "\n" " With no arguments, print a list of commands and short help.\n" "\n" -" Given a topic, extension, or command name, print help for that topic." +" Given a topic, extension, or command name, print help for that\n" +" topic." msgstr "" msgid "global options:" @@ -5587,14 +5800,15 @@ msgid "" "identify the working copy or specified revision\n" "\n" -" With no revision, print a summary of the current state of the repo.\n" +" With no revision, print a summary of the current state of the\n" +" repository.\n" "\n" " With a path, do a lookup in another repository.\n" "\n" -" This summary identifies the repository state using one or two parent\n" -" hash identifiers, followed by a \"+\" if there are uncommitted changes\n" -" in the working directory, a list of tags for this revision and a branch\n" -" name for non-default branches.\n" +" This summary identifies the repository state using one or two\n" +" parent hash identifiers, followed by a \"+\" if there are\n" +" uncommitted changes in the working directory, a list of tags for\n" +" this revision and a branch name for non-default branches.\n" " " msgstr "" @@ -5613,21 +5827,21 @@ " text/plain body parts before first diff are added to commit\n" " message.\n" "\n" -" If the imported patch was generated by hg export, user and description\n" -" from patch override values from message headers and body. Values\n" -" given on command line with -m and -u override these.\n" -"\n" -" If --exact is specified, import will set the working directory\n" -" to the parent of each patch before applying it, and will abort\n" -" if the resulting changeset has a different ID than the one\n" -" recorded in the patch. This may happen due to character set\n" -" problems or other deficiencies in the text patch format.\n" +" If the imported patch was generated by hg export, user and\n" +" description from patch override values from message headers and\n" +" body. Values given on command line with -m and -u override these.\n" +"\n" +" If --exact is specified, import will set the working directory to\n" +" the parent of each patch before applying it, and will abort if the\n" +" resulting changeset has a different ID than the one recorded in\n" +" the patch. This may happen due to character set problems or other\n" +" deficiencies in the text patch format.\n" "\n" " With --similarity, hg will attempt to discover renames and copies\n" " in the patch in the same way as 'addremove'.\n" "\n" -" To read a patch from standard input, use patch name \"-\".\n" -" See 'hg help dates' for a list of formats valid for -d/--date.\n" +" To read a patch from standard input, use patch name \"-\". See 'hg\n" +" help dates' for a list of formats valid for -d/--date.\n" " " msgstr "" @@ -5655,11 +5869,11 @@ "show new changesets found in source\n" "\n" " Show new changesets found in the specified path/URL or the default\n" -" pull location. These are the changesets that would be pulled if a pull\n" -" was requested.\n" -"\n" -" For remote repository, using --bundle avoids downloading the changesets\n" -" twice if the incoming is followed by a pull.\n" +" pull location. These are the changesets that would be pulled if a\n" +" pull was requested.\n" +"\n" +" For remote repository, using --bundle avoids downloading the\n" +" changesets twice if the incoming is followed by a pull.\n" "\n" " See pull for valid source format details.\n" " " @@ -5677,6 +5891,17 @@ " See 'hg help urls' for more information.\n" " " msgstr "" +"opret et nyt arkiv i det givne katalog\n" +"\n" +" Initialiser et nyt arkiv i det givne katalog. Hvis det givne\n" +" katalog ikke findes vil det blive oprettet.\n" +"\n" +" Hvis intet katalog er angivet vil det nuværende katalog bliver\n" +" anvendt.\n" +"\n" +" Det er muligt at angive en ssh:// URL som destination.\n" +" Se 'hg help urls' for mere information.\n" +" " msgid "" "locate files matching specific patterns\n" @@ -5722,8 +5947,8 @@ " files and full commit message is shown.\n" "\n" " NOTE: log -p may generate unexpected diff output for merge\n" -" changesets, as it will compare the merge changeset against its\n" -" first parent only. Also, the files: list will only reflect files\n" +" changesets, as it will only compare the merge changeset against\n" +" its first parent. Also, the files: list will only reflect files\n" " that are different from BOTH parents.\n" "\n" " " @@ -5740,32 +5965,47 @@ "output the current or given revision of the project manifest\n" "\n" " Print a list of version controlled files for the given revision.\n" -" If no revision is given, the parent of the working directory is used,\n" -" or tip if no revision is checked out.\n" -"\n" -" The manifest is the list of files being version controlled. If no " -"revision\n" -" is given then the first parent of the working directory is used.\n" -"\n" -" With -v flag, print file permissions, symlink and executable bits. With\n" -" --debug flag, print file revision hashes.\n" +" If no revision is given, the first parent of the working directory\n" +" is used, or tip if no revision is checked out.\n" +"\n" +" With -v flag, print file permissions, symlink and executable bits.\n" +" With --debug flag, print file revision hashes.\n" " " msgstr "" msgid "" "merge working directory with another revision\n" "\n" -" Merge the contents of the current working directory and the\n" -" requested revision. Files that changed between either parent are\n" -" marked as changed for the next commit and a commit must be\n" -" performed before any further updates are allowed.\n" +" The contents of the current working directory is updated with all\n" +" changes made in the requested revision since the last common\n" +" predecessor revision.\n" +"\n" +" Files that changed between either parent are marked as changed for\n" +" the next commit and a commit must be performed before any further\n" +" updates are allowed. The next commit has two parents.\n" "\n" " If no revision is specified, the working directory's parent is a\n" -" head revision, and the current branch contains exactly one other head,\n" -" the other head is merged with by default. Otherwise, an explicit\n" -" revision to merge with must be provided.\n" -" " -msgstr "" +" head revision, and the current branch contains exactly one other\n" +" head, the other head is merged with by default. Otherwise, an\n" +" explicit revision to merge with must be provided.\n" +" " +msgstr "" +"sammenføj arbejdskataloget med en anden revision\n" +"\n" +" Indholdet af det nuværende arbejdskatalog opdateres med alle\n" +" ændringer lavet i den ønskede revision siden den sidste fælles\n" +" foregående revision.\n" +"\n" +" Filer som ændrede sig i forhold til en af forældrene bliver\n" +" markeret som ændret med hensyn til næste arkivering, og\n" +" arkiveringen skal laves før yderligere opdateringer er tilladt.\n" +" Den næste arkiverede ændring får to forældre.\n" +"\n" +" Hvis ingen revision angives og arbejdskatalogets forældre er en\n" +" hovedrevision og den nuværende gren indeholder præcis et andet\n" +" hoved, så sammenføjes der med dette hoved som standard. Ellers\n" +" skal en eksplicit revision angives.\n" +" " #, python-format msgid "branch '%s' has %d heads - please merge with an explicit rev" @@ -5790,25 +6030,32 @@ msgid "" "show changesets not found in destination\n" "\n" -" Show changesets not found in the specified destination repository or\n" -" the default push location. These are the changesets that would be " -"pushed\n" -" if a push was requested.\n" +" Show changesets not found in the specified destination repository\n" +" or the default push location. These are the changesets that would\n" +" be pushed if a push was requested.\n" "\n" " See pull for valid destination format details.\n" " " msgstr "" msgid "" -"show the parents of the working dir or revision\n" -"\n" -" Print the working directory's parent revisions. If a\n" -" revision is given via --rev, the parent of that revision\n" -" will be printed. If a file argument is given, revision in\n" -" which the file was last changed (before the working directory\n" -" revision or the argument to --rev if given) is printed.\n" -" " -msgstr "" +"show the parents of the working directory or revision\n" +"\n" +" Print the working directory's parent revisions. If a revision is\n" +" given via --rev, the parent of that revision will be printed. If a\n" +" file argument is given, revision in which the file was last\n" +" changed (before the working directory revision or the argument to\n" +" --rev if given) is printed.\n" +" " +msgstr "" +"vis forældrene til arbejdskataloget eller en revision\n" +"\n" +" Udskriv arbejdskatalogets forældrerevisioner. Hvis en revision\n" +" angivet med --rev, så udskrives forældren til denne revision. Hvis\n" +" en fil er angivet, udskrives revisionen i hvilken filen sidst blev\n" +" ændret (før arbejdskatalogets revision eller argumentet til --rev,\n" +" hvis givet).\n" +" " msgid "can only specify an explicit file name" msgstr "" @@ -5820,8 +6067,8 @@ msgid "" "show aliases for remote repositories\n" "\n" -" Show definition of symbolic path name NAME. If no name is given, show\n" -" definition of available names.\n" +" Show definition of symbolic path name NAME. If no name is given,\n" +" show definition of available names.\n" "\n" " Path names are defined in the [paths] section of /etc/mercurial/hgrc\n" " and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too.\n" @@ -5845,16 +6092,34 @@ msgid "" "pull changes from the specified source\n" "\n" -" Pull changes from a remote repository to a local one.\n" +" Pull changes from a remote repository to the local one.\n" "\n" " This finds all changes from the repository at the specified path\n" " or URL and adds them to the local repository. By default, this\n" " does not update the copy of the project in the working directory.\n" "\n" +" Use hg incoming if you want to see what will be added by the next\n" +" pull without actually adding the changes to the repository.\n" +"\n" " If SOURCE is omitted, the 'default' path will be used.\n" " See 'hg help urls' for more information.\n" " " msgstr "" +"hent ændringer fra den angivne kilde\n" +"\n" +" Hiver ændringer fra et fjert arkiv til det lokale.\n" +"\n" +" Dette finder alle ændringer fra arkivet på den specificerede sti\n" +" eller URL og tilføjer dem til det lokale arkiv. Som standard\n" +" opdateres arbejdskataloget ikke.\n" +"\n" +" Brug hg incoming hvis du vil se hvad der vil blive tilføjet til\n" +" arkivet ved næste pull, men uden rent faktisk at tilføje\n" +" ændringerne til arkivet.\n" +"\n" +" Hvis KILDE udelades, så bruges 'default' stien.\n" +" Se 'hg help urls' for mere information.\n" +" " msgid "" "Other repository doesn't support revision lookup, so a rev cannot be " @@ -5866,23 +6131,44 @@ "\n" " Push changes from the local repository to the given destination.\n" "\n" -" This is the symmetrical operation for pull. It helps to move\n" -" changes from the current repository to a different one. If the\n" -" destination is local this is identical to a pull in that directory\n" -" from the current one.\n" +" This is the symmetrical operation for pull. It moves changes from\n" +" the current repository to a different one. If the destination is\n" +" local this is identical to a pull in that directory from the\n" +" current one.\n" "\n" " By default, push will refuse to run if it detects the result would\n" " increase the number of remote heads. This generally indicates the\n" " the client has forgotten to pull and merge before pushing.\n" "\n" -" If -r is used, the named changeset and all its ancestors will be pushed\n" -" to the remote repository.\n" -"\n" -" Look at the help text for urls for important details about ssh:// URLs.\n" -" If DESTINATION is omitted, a default path will be used.\n" +" If -r is used, the named revision and all its ancestors will be\n" +" pushed to the remote repository.\n" +"\n" +" Look at the help text for URLs for important details about ssh://\n" +" URLs. If DESTINATION is omitted, a default path will be used.\n" " See 'hg help urls' for more information.\n" " " msgstr "" +"skub ændringer til den angivne destination\n" +"\n" +" Skubber ændringer fra det lokale arkiv til den givne destination.\n" +"\n" +" Dette er den symmetriske operation for pull. Den flytter ændringer\n" +" fra det nuværende arkiv til et andet. Hvis destinationen er lokal,\n" +" så er dette identisk til et pull i destinationen af det nuværende\n" +" arkiv.\n" +"\n" +" Som standard vil push nægte af køre hvis den detekterer at den vil\n" +" øge antallet af hoveder i destinationen. Dette indikerer normalt\n" +" at klienten har glemt at henge og sammenføje ændringerne før\n" +" skubningen.\n" +"\n" +" Hvis -r bruges, så vil den navngivne revision og alle dets\n" +" forfædre bliver skubbet til det andet arkiv.\n" +"\n" +" Se hjælpeteksten for URL'er for vigtige detaljer om ssh:// URL'er.\n" +" Hvis DESTINATION udelades vil en standard sti blive brugt.\n" +" Se 'hg help urls' for mere information.\n" +" " #, python-format msgid "pushing to %s\n" @@ -5910,8 +6196,9 @@ "\n" " Recover from an interrupted commit or pull.\n" "\n" -" This command tries to fix the repository status after an interrupted\n" -" operation. It should only be necessary when Mercurial suggests it.\n" +" This command tries to fix the repository status after an\n" +" interrupted operation. It should only be necessary when Mercurial\n" +" suggests it.\n" " " msgstr "" @@ -5920,15 +6207,17 @@ "\n" " Schedule the indicated files for removal from the repository.\n" "\n" -" This only removes files from the current branch, not from the entire\n" -" project history. -A can be used to remove only files that have already\n" -" been deleted, -f can be used to force deletion, and -Af can be used\n" -" to remove files from the next revision without deleting them.\n" -"\n" -" The following table details the behavior of remove for different file\n" -" states (columns) and option combinations (rows). The file states are\n" -" Added, Clean, Modified and Missing (as reported by hg status). The\n" -" actions are Warn, Remove (from branch) and Delete (from disk).\n" +" This only removes files from the current branch, not from the\n" +" entire project history. -A can be used to remove only files that\n" +" have already been deleted, -f can be used to force deletion, and\n" +" -Af can be used to remove files from the next revision without\n" +" deleting them.\n" +"\n" +" The following table details the behavior of remove for different\n" +" file states (columns) and option combinations (rows). The file\n" +" states are Added, Clean, Modified and Missing (as reported by hg\n" +" status). The actions are Warn, Remove (from branch) and Delete\n" +" (from disk).\n" "\n" " A C M !\n" " none W RD W R\n" @@ -5940,6 +6229,31 @@ " To undo a remove before that, see hg revert.\n" " " msgstr "" +"fjern de angivne filer ved næste arkivering\n" +"\n" +" Planlæg de angivne filer til sletning fra arkivet.\n" +"\n" +" Dette fjerner kun filerne fra den nuværende gren, ikke fra hele\n" +" projektets historie. -A kan bruges til kun at fjerne filer som\n" +" allerede er slettet, -f kan bruges for at gennemtvinge en\n" +" sletning, og -Af kan bruges til at fjerne filer fra næste revision\n" +" uden at slette dem.\n" +"\n" +" Den følgende tabel viser opførslen af remove for forskellige\n" +" tilstande af filer (søjler) og kombinationer af tilvalg (rækker).\n" +" Filtilstandene er Added, Clean, Modified og Missing (som\n" +" rapporteret af hg status). Handlingerne er Warn, Remove (fra gren)\n" +" og Delete (fra disk).\n" +"\n" +" A C M !\n" +" none W RD W R\n" +" -f R RD RD R\n" +" -A W W W R\n" +" -Af R R R R\n" +"\n" +" Denne kommando planlægger filerne til at blive fjernet ved næste\n" +" arkivering. For at omgøre en fjernelse før det, se hg revert.\n" +" " msgid "no files specified" msgstr "" @@ -5960,15 +6274,15 @@ msgid "" "rename files; equivalent of copy + remove\n" "\n" -" Mark dest as copies of sources; mark sources for deletion. If\n" -" dest is a directory, copies are put in that directory. If dest is\n" -" a file, there can only be one source.\n" +" Mark dest as copies of sources; mark sources for deletion. If dest\n" +" is a directory, copies are put in that directory. If dest is a\n" +" file, there can only be one source.\n" "\n" " By default, this command copies the contents of files as they\n" -" stand in the working directory. If invoked with --after, the\n" +" exist in the working directory. If invoked with --after, the\n" " operation is recorded, but no copying is performed.\n" "\n" -" This command takes effect in the next commit. To undo a rename\n" +" This command takes effect at the next commit. To undo a rename\n" " before that, see hg revert.\n" " " msgstr "" @@ -5980,8 +6294,13 @@ " revisions preserved from the last update or merge. To attempt to\n" " resolve all unresolved files, use the -a switch.\n" "\n" +" If a conflict is resolved manually, please note that the changes\n" +" will be overwritten if the merge is retried with resolve. The -m\n" +" switch should be used to mark the file as resolved.\n" +"\n" " This command will also allow listing resolved files and manually\n" -" marking and unmarking files as resolved.\n" +" marking and unmarking files as resolved. All files must be marked\n" +" as resolved before the new commits are permitted.\n" "\n" " The codes used to show the status of files are:\n" " U = unresolved\n" @@ -6001,10 +6320,10 @@ "filerne" msgid "" -"restore individual files or dirs to an earlier state\n" +"restore individual files or directories to an earlier state\n" "\n" " (use update -r to check out earlier revisions, revert does not\n" -" change the working dir parents)\n" +" change the working directory parents)\n" "\n" " With no revision specified, revert the named files or directories\n" " to the contents they had in the parent of the working directory.\n" @@ -6013,10 +6332,10 @@ " working directory has two parents, you must explicitly specify the\n" " revision to revert to.\n" "\n" -" Using the -r option, revert the given files or directories to their\n" -" contents as of a specific revision. This can be helpful to \"roll\n" -" back\" some or all of an earlier change.\n" -" See 'hg help dates' for a list of formats valid for -d/--date.\n" +" Using the -r option, revert the given files or directories to\n" +" their contents as of a specific revision. This can be helpful to\n" +" \"roll back\" some or all of an earlier change. See 'hg help dates'\n" +" for a list of formats valid for -d/--date.\n" "\n" " Revert modifies the working directory. It does not commit any\n" " changes, or change the parent of the working directory. If you\n" @@ -6024,8 +6343,8 @@ " directory, the reverted files will thus appear modified\n" " afterwards.\n" "\n" -" If a file has been deleted, it is restored. If the executable\n" -" mode of a file was changed, it is reset.\n" +" If a file has been deleted, it is restored. If the executable mode\n" +" of a file was changed, it is reset.\n" "\n" " If names are given, all files matching the names are reverted.\n" " If no arguments are given, no files are reverted.\n" @@ -6096,7 +6415,7 @@ msgstr "" msgid "" -"print the root (top) of the current working dir\n" +"print the root (top) of the current working directory\n" "\n" " Print the root directory of the current repository.\n" " " @@ -6111,6 +6430,13 @@ " stderr. Use the \"-A\" and \"-E\" options to log to files.\n" " " msgstr "" +"eksporter arkivet via HTTP\n" +"\n" +" Start en lokal HTTP arkivbrowser og -server.\n" +"\n" +" Som standard logger serveren forespørgsler til stdout og fejl til\n" +" stderr. Brug \"-A\" og \"-E\" tilvalgene til at logge til filer.\n" +" " #, python-format msgid "listening at http://%s%s/%s (bound to %s:%d)\n" @@ -6126,7 +6452,7 @@ " with \"show only ...\" are given, the options -mardu are used.\n" "\n" " Option -q/--quiet hides untracked (unknown and ignored) files\n" -" unless explicitly requested with -u/--unknown or -i/-ignored.\n" +" unless explicitly requested with -u/--unknown or -i/--ignored.\n" "\n" " NOTE: status may appear to disagree with diff if permissions have\n" " changed or a merge has occurred. The standard diff format does not\n" @@ -6141,12 +6467,44 @@ " A = added\n" " R = removed\n" " C = clean\n" -" ! = deleted, but still tracked\n" +" ! = missing, but still tracked\n" " ? = not tracked\n" " I = ignored\n" " = the previous added file was copied from here\n" " " msgstr "" +"vis ændrede filer i arbejdskataloget\n" +"\n" +" Vis status for filer i arkivet. Hvis der angivet navne, så vil kun\n" +" disse filer blive vist. Filer som er rene eller ignorerede eller\n" +" kilden i en kopierings/flytnings operation vises ikke med mindre\n" +" -c (clean), -i (ignored), -C (copies) eller -A er angivet. Med\n" +" mindre tilvalgene beskrevet med \"vis kun ...\" bruges, så bruges\n" +" -mardu tilvalgene.\n" +"\n" +" Tilvalget -q/--quiet skjuler filer som ikke bliver fulgt (ukendte\n" +" eller ignorerede filer) med mindre disse eksplicit vælges med\n" +" -u/--unknown eller -i/--ignored.\n" +"\n" +" BEMÆRK: status kan tilsyneladende være forskellig fra diff hvis\n" +" rettigheder er blevet ændret eller hvis en sammenføjning har\n" +" fundet sted. Det normale diff-format rapporterer ikke ændringer i\n" +" rettigheder og diff rapporterer kun ænringer relativt til en\n" +" sammenføjningsforældre.\n" +"\n" +" Hvis der angivet en revision bruges denne som en basisrevision.\n" +" Hvis der angives to revisioner, da vises forskellene mellem dem.\n" +"\n" +" Koderne som bruges til at vise status for filerne er:\n" +" M = ændret\n" +" A = tilføjet\n" +" R = fjernet\n" +" C = ren\n" +" ! = mangler, men følges stadig\n" +" ? = følges ikke\n" +" I = ignoreret\n" +" = den foregående fil blev kopieret herfra\n" +" " msgid "" "add one or more tags for the current or given revision\n" @@ -6157,8 +6515,8 @@ " very useful to compare different revisions, to go back to significant\n" " earlier versions or to mark branch points as releases, etc.\n" "\n" -" If no revision is given, the parent of the working directory is used,\n" -" or tip if no revision is checked out.\n" +" If no revision is given, the parent of the working directory is\n" +" used, or tip if no revision is checked out.\n" "\n" " To facilitate version control, distribution, and merging of tags,\n" " they are stored as a file named \".hgtags\" which is managed\n" @@ -6185,7 +6543,11 @@ msgstr "" #, python-format -msgid "tag '%s' is not a %s tag" +msgid "tag '%s' is not a global tag" +msgstr "" + +#, python-format +msgid "tag '%s' is not a local tag" msgstr "" #, python-format @@ -6203,8 +6565,8 @@ msgid "" "list repository tags\n" "\n" -" This lists both regular and local tags. When the -v/--verbose switch\n" -" is used, a third column \"local\" is printed for local tags.\n" +" This lists both regular and local tags. When the -v/--verbose\n" +" switch is used, a third column \"local\" is printed for local tags.\n" " " msgstr "" "vis arkivmærkater\n" @@ -6238,31 +6600,62 @@ msgid "" "update working directory\n" "\n" -" Update the repository's working directory to the specified revision,\n" -" or the tip of the current branch if none is specified. Use null as\n" -" the revision to remove the working copy (like 'hg clone -U').\n" -"\n" -" When the working dir contains no uncommitted changes, it will be\n" -" replaced by the state of the requested revision from the repo. When\n" -" the requested revision is on a different branch, the working dir\n" -" will additionally be switched to that branch.\n" +" Update the repository's working directory to the specified\n" +" revision, or the tip of the current branch if none is specified.\n" +" Use null as the revision to remove the working copy (like 'hg\n" +" clone -U').\n" +"\n" +" When the working directory contains no uncommitted changes, it\n" +" will be replaced by the state of the requested revision from the\n" +" repository. When the requested revision is on a different branch,\n" +" the working directory will additionally be switched to that\n" +" branch.\n" "\n" " When there are uncommitted changes, use option -C to discard them,\n" -" forcibly replacing the state of the working dir with the requested\n" -" revision.\n" +" forcibly replacing the state of the working directory with the\n" +" requested revision.\n" "\n" " When there are uncommitted changes and option -C is not used, and\n" " the parent revision and requested revision are on the same branch,\n" " and one of them is an ancestor of the other, then the new working\n" " directory will contain the requested revision merged with the\n" -" uncommitted changes. Otherwise, the update will fail with a\n" +" uncommitted changes. Otherwise, the update will fail with a\n" " suggestion to use 'merge' or 'update -C' instead.\n" "\n" -" If you want to update just one file to an older revision, use revert.\n" +" If you want to update just one file to an older revision, use\n" +" revert.\n" "\n" " See 'hg help dates' for a list of formats valid for --date.\n" " " msgstr "" +"opdater arbejdskataloget\n" +"\n" +" Opdater arkivets arbejdskatalog til den angivne revision, eller\n" +" spidsen af den nuværende gren hvis ingen revision er angivet. Brug\n" +" null som revision for at fjerne arbejdskataloget (ligesom 'hg\n" +" clone -U').\n" +"\n" +" Hvis arbejdskataloget ikke indeholder nogen uarkiverede ændringer,\n" +" da vil det blive erstattet af den ønskede revision fra arkivet.\n" +" Hvis den ønskede revision er på en anden gren, så vil\n" +" arbejdskataloget yderligere blive skiftet til denne gren.\n" +"\n" +" Hvis der er uarkiverede ændringer kan -C tilvalget bruges for at\n" +" kassere dem og sætte tilstanden af arbejdskataloget lig tilstanden\n" +" i den ønskede revision.\n" +"\n" +" Hvis der er uarkiverede ændringer, og -C tilvalget ikke bruges, og\n" +" forældrerevisionen og den ønskede revision begge er på samme gren,\n" +" og en af dem er en forfar til den anden, så vil det nye\n" +" arbejdskatalog indeholde den ønskede revision sammenføjet med de\n" +" uarkiverede ændringer. Ellers vil opdateringen fejle med et\n" +" forslag til at bruge 'merge' eller 'update -C' i stedet.\n" +"\n" +" Hvis du vil opdatere blot en enkelt fil til en ældre revision,\n" +" brug da revert.\n" +"\n" +" Se 'hg help dates' for en liste af gyldige formater til --date.\n" +" " msgid "" "verify the integrity of the repository\n" @@ -6285,7 +6678,7 @@ msgid "" "\n" -"Copyright (C) 2005-2008 Matt Mackall and others\n" +"Copyright (C) 2005-2009 Matt Mackall and others\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" msgstr "" @@ -6294,7 +6687,7 @@ msgstr "" msgid "change working directory" -msgstr "skift arbejdsbibliotek" +msgstr "skift arbejdskatalog" msgid "do not prompt, assume 'yes' for any required answers" msgstr "spørg ikke, antag alle svar er 'ja'" @@ -6354,10 +6747,10 @@ msgstr "ekskluder navne som matcher det givne mønster" msgid "use as commit message" -msgstr "brug som commit-besked" +msgstr "brug som arkiveringsbesked" msgid "read commit message from " -msgstr "læs commit-beskeden fra " +msgstr "læs arkiveringsbeskeden fra " msgid "record datecode as commit date" msgstr "" @@ -6545,6 +6938,9 @@ msgid "[INDEX] REV1 REV2" msgstr "" +msgid "[COMMAND]" +msgstr "[KOMMANDO]" + msgid "show the command options" msgstr "" @@ -6614,7 +7010,7 @@ msgid "ignore case when matching" msgstr "" -msgid "print only filenames and revs that match" +msgid "print only filenames and revisions that match" msgstr "" msgid "print matching line numbers" @@ -6638,7 +7034,7 @@ msgid "[TOPIC]" msgstr "" -msgid "identify the specified rev" +msgid "identify the specified revision" msgstr "" msgid "show local revision number" @@ -6709,7 +7105,7 @@ msgid "only follow the first parent of merge changesets" msgstr "" -msgid "show revs matching date spec" +msgid "show revisions matching date spec" msgstr "" msgid "show copied files" @@ -6718,13 +7114,13 @@ msgid "do case-insensitive search for a keyword" msgstr "" -msgid "include revs where files were removed" +msgid "include revisions where files were removed" msgstr "" msgid "show only merges" msgstr "" -msgid "revs committed by user" +msgid "revisions committed by user" msgstr "" msgid "show only changesets within the given named branch" @@ -6757,7 +7153,7 @@ msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]" msgstr "" -msgid "show parents from the specified rev" +msgid "show parents from the specified revision" msgstr "" msgid "hg parents [-r REV] [FILE]" @@ -6832,10 +7228,10 @@ msgid "prefix path to serve from (default: server root)" msgstr "" -msgid "name to show in web pages (default: working dir)" -msgstr "" - -msgid "name of the webdir config file (serve more than one repo)" +msgid "name to show in web pages (default: working directory)" +msgstr "" + +msgid "name of the webdir config file (serve more than one repository)" msgstr "" msgid "for remote clients" @@ -7243,15 +7639,15 @@ " \"1165432709 0\" (Wed Dec 6 13:18:29 2006 UTC)\n" "\n" " This is the internal representation format for dates. unixtime is\n" -" the number of seconds since the epoch (1970-01-01 00:00 UTC). offset\n" -" is the offset of the local timezone, in seconds west of UTC (negative\n" -" if the timezone is east of UTC).\n" +" the number of seconds since the epoch (1970-01-01 00:00 UTC).\n" +" offset is the offset of the local timezone, in seconds west of UTC\n" +" (negative if the timezone is east of UTC).\n" "\n" " The log command also accepts date ranges:\n" "\n" -" \"<{date}\" - on or before a given date\n" -" \">{date}\" - on or after a given date\n" -" \"{date} to {date}\" - a date range, inclusive\n" +" \"<{datetime}\" - at or before a given date/time\n" +" \">{datetime}\" - on or after a given date/time\n" +" \"{datetime} to {datetime}\" - a date range, inclusive\n" " \"-{days}\" - within a given number of days of today\n" " " msgstr "" @@ -7287,8 +7683,8 @@ "\n" " Kommandoen log accepterer også datointervaller:\n" "\n" -" \"<{date}\" - på eller før den angivne dato\n" -" \">{date}\" - på eller efter den angivne dato\n" +" \"<{date}\" - på eller før den angivne dato/tidspunkt\n" +" \">{date}\" - på eller efter den angivne dato/tidspunkt\n" " \"{date} to {date}\" - et datointerval, inklusiv endepunkterne\n" " \"-{days}\" - indenfor et angivet antal dage, fra dags dato\n" " " @@ -7306,16 +7702,16 @@ "\n" " Alternate pattern notations must be specified explicitly.\n" "\n" -" To use a plain path name without any pattern matching, start a\n" -" name with \"path:\". These path names must match completely, from\n" -" the root of the current repository.\n" -"\n" -" To use an extended glob, start a name with \"glob:\". Globs are\n" -" rooted at the current directory; a glob such as \"*.c\" will match\n" -" files ending in \".c\" in the current directory only.\n" +" To use a plain path name without any pattern matching, start it\n" +" with \"path:\". These path names must completely match starting at\n" +" the current repository root.\n" +"\n" +" To use an extended glob, start a name with \"glob:\". Globs are\n" +" rooted at the current directory; a glob such as \"*.c\" will only\n" +" match files in the current directory ending with \".c\".\n" "\n" " The supported glob syntax extensions are \"**\" to match any string\n" -" across path separators, and \"{a,b}\" to mean \"a or b\".\n" +" across path separators and \"{a,b}\" to mean \"a or b\".\n" "\n" " To use a Perl/Python regular expression, start a name with \"re:\".\n" " Regexp pattern matching is anchored at the root of the repository.\n" @@ -7330,11 +7726,11 @@ "\n" " glob:*.c any name ending in \".c\" in the current directory\n" " *.c any name ending in \".c\" in the current directory\n" -" **.c any name ending in \".c\" in the current directory, or\n" -" any subdirectory\n" +" **.c any name ending in \".c\" in any subdirectory of the\n" +" current directory including itself.\n" " foo/*.c any name ending in \".c\" in the directory foo\n" -" foo/**.c any name ending in \".c\" in the directory foo, or any\n" -" subdirectory\n" +" foo/**.c any name ending in \".c\" in any subdirectory of foo\n" +" including itself.\n" "\n" " Regexp examples:\n" "\n" @@ -7349,12 +7745,14 @@ msgid "" "\n" "HG::\n" -" Path to the 'hg' executable, automatically passed when running hooks,\n" -" extensions or external tools. If unset or empty, an executable named\n" -" 'hg' (with com/exe/bat/cmd extension on Windows) is searched.\n" +" Path to the 'hg' executable, automatically passed when running\n" +" hooks, extensions or external tools. If unset or empty, this is\n" +" the hg executable's name if it's frozen, or an executable named\n" +" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n" +" Windows) is searched.\n" "\n" "HGEDITOR::\n" -" This is the name of the editor to use when committing. See EDITOR.\n" +" This is the name of the editor to run when committing. See EDITOR.\n" "\n" " (deprecated, use .hgrc)\n" "\n" @@ -7366,8 +7764,8 @@ "\n" "HGENCODINGMODE::\n" " This sets Mercurial's behavior for handling unknown characters\n" -" while transcoding user inputs. The default is \"strict\", which\n" -" causes Mercurial to abort if it can't translate a character. Other\n" +" while transcoding user input. The default is \"strict\", which\n" +" causes Mercurial to abort if it can't map a character. Other\n" " settings include \"replace\", which replaces unknown characters, and\n" " \"ignore\", which drops them. This setting can be overridden with\n" " the --encodingmode command-line option.\n" @@ -7380,41 +7778,47 @@ " (deprecated, use .hgrc)\n" "\n" "HGRCPATH::\n" -" A list of files or directories to search for hgrc files. Item\n" -" separator is \":\" on Unix, \";\" on Windows. If HGRCPATH is not set,\n" -" platform default search path is used. If empty, only .hg/hgrc of\n" -" current repository is read.\n" -"\n" -" For each element in path, if a directory, all entries in directory\n" -" ending with \".rc\" are added to path. Else, element itself is\n" -" added to path.\n" +" A list of files or directories to search for hgrc files. Item\n" +" separator is \":\" on Unix, \";\" on Windows. If HGRCPATH is not set,\n" +" platform default search path is used. If empty, only the .hg/hgrc\n" +" from the current repository is read.\n" +"\n" +" For each element in HGRCPATH:\n" +" * if it's a directory, all files ending with .rc are added\n" +" * otherwise, the file itself will be added\n" "\n" "HGUSER::\n" -" This is the string used for the author of a commit.\n" +" This is the string used as the author of a commit. If not set,\n" +" available values will be considered in this order:\n" +"\n" +" * HGUSER (deprecated)\n" +" * hgrc files from the HGRCPATH\n" +" * EMAIL\n" +" * interactive prompt\n" +" * LOGNAME (with '@hostname' appended)\n" "\n" " (deprecated, use .hgrc)\n" "\n" "EMAIL::\n" -" If HGUSER is not set, this will be used as the author for a commit.\n" +" May be used as the author of a commit; see HGUSER.\n" "\n" "LOGNAME::\n" -" If neither HGUSER nor EMAIL is set, LOGNAME will be used (with\n" -" '@hostname' appended) as the author value for a commit.\n" +" May be used as the author of a commit; see HGUSER.\n" "\n" "VISUAL::\n" " This is the name of the editor to use when committing. See EDITOR.\n" "\n" "EDITOR::\n" -" Sometimes Mercurial needs to open a text file in an editor\n" -" for a user to modify, for example when writing commit messages.\n" -" The editor it uses is determined by looking at the environment\n" +" Sometimes Mercurial needs to open a text file in an editor for a\n" +" user to modify, for example when writing commit messages. The\n" +" editor it uses is determined by looking at the environment\n" " variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n" " non-empty one is chosen. If all of them are empty, the editor\n" " defaults to 'vi'.\n" "\n" "PYTHONPATH::\n" -" This is used by Python to find imported modules and may need to be set\n" -" appropriately if Mercurial is not installed system-wide.\n" +" This is used by Python to find imported modules and may need to be\n" +" set appropriately if this Mercurial is not installed system-wide.\n" " " msgstr "" @@ -7423,12 +7827,13 @@ msgid "" "\n" -" Mercurial accepts several notations for identifying individual\n" -" revisions.\n" -"\n" -" A plain integer is treated as a revision number. Negative\n" -" integers are treated as offsets from the tip, with -1 denoting the\n" -" tip.\n" +" Mercurial supports several ways to specify individual revisions.\n" +"\n" +" A plain integer is treated as a revision number. Negative integers\n" +" are treated as topological offsets from the tip, with -1 denoting\n" +" the tip. As such, negative numbers are only useful if you've\n" +" memorized your local tree numbers and want to save typing a single\n" +" digit. This editor suggests copy and paste.\n" "\n" " A 40-digit hexadecimal string is treated as a unique revision\n" " identifier.\n" @@ -7436,7 +7841,7 @@ " A hexadecimal string less than 40 characters long is treated as a\n" " unique revision identifier, and referred to as a short-form\n" " identifier. A short-form identifier is only valid if it is the\n" -" prefix of one full-length identifier.\n" +" prefix of exactly one full-length identifier.\n" "\n" " Any other string is treated as a tag name, which is a symbolic\n" " name associated with a revision identifier. Tag names may not\n" @@ -7449,9 +7854,9 @@ " revision of an empty repository, and the parent of revision 0.\n" "\n" " The reserved name \".\" indicates the working directory parent. If\n" -" no working directory is checked out, it is equivalent to null.\n" -" If an uncommitted merge is in progress, \".\" is the revision of\n" -" the first parent.\n" +" no working directory is checked out, it is equivalent to null. If\n" +" an uncommitted merge is in progress, \".\" is the revision of the\n" +" first parent.\n" " " msgstr "" @@ -7461,20 +7866,20 @@ msgid "" "\n" " When Mercurial accepts more than one revision, they may be\n" -" specified individually, or provided as a continuous range,\n" -" separated by the \":\" character.\n" +" specified individually, or provided as a topologically continuous\n" +" range, separated by the \":\" character.\n" "\n" " The syntax of range notation is [BEGIN]:[END], where BEGIN and END\n" " are revision identifiers. Both BEGIN and END are optional. If\n" " BEGIN is not specified, it defaults to revision number 0. If END\n" -" is not specified, it defaults to the tip. The range \":\" thus\n" -" means \"all revisions\".\n" +" is not specified, it defaults to the tip. The range \":\" thus means\n" +" \"all revisions\".\n" "\n" " If BEGIN is greater than END, revisions are treated in reverse\n" " order.\n" "\n" " A range acts as a closed interval. This means that a range of 3:5\n" -" gives 3, 4 and 5. Similarly, a range of 4:2 gives 4, 3, and 2.\n" +" gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n" " " msgstr "" @@ -7483,35 +7888,37 @@ msgid "" "\n" -" Mercurial's default format for showing changes between two versions\n" -" of a file is compatible with the unified format of GNU diff, which\n" -" can be used by GNU patch and many other standard tools.\n" +" Mercurial's default format for showing changes between two\n" +" versions of a file is compatible with the unified format of GNU\n" +" diff, which can be used by GNU patch and many other standard\n" +" tools.\n" "\n" " While this standard format is often enough, it does not encode the\n" " following information:\n" "\n" -" - executable status\n" +" - executable status and other permission bits\n" " - copy or rename information\n" " - changes in binary files\n" " - creation or deletion of empty files\n" "\n" " Mercurial also supports the extended diff format from the git VCS\n" " which addresses these limitations. The git diff format is not\n" -" produced by default because there are very few tools which\n" +" produced by default because a few widespread tools still do not\n" " understand this format.\n" "\n" " This means that when generating diffs from a Mercurial repository\n" " (e.g. with \"hg export\"), you should be careful about things like\n" " file copies and renames or other things mentioned above, because\n" -" when applying a standard diff to a different repository, this extra\n" -" information is lost. Mercurial's internal operations (like push and\n" -" pull) are not affected by this, because they use an internal binary\n" -" format for communicating changes.\n" +" when applying a standard diff to a different repository, this\n" +" extra information is lost. Mercurial's internal operations (like\n" +" push and pull) are not affected by this, because they use an\n" +" internal binary format for communicating changes.\n" "\n" " To make Mercurial produce the git extended diff format, use the\n" -" --git option available for many commands, or set 'git = True' in the\n" -" [diff] section of your hgrc. You do not need to set this option when\n" -" importing diffs in this format or using them in the mq extension.\n" +" --git option available for many commands, or set 'git = True' in\n" +" the [diff] section of your hgrc. You do not need to set this\n" +" option when importing diffs in this format or using them in the mq\n" +" extension.\n" " " msgstr "" @@ -7521,49 +7928,52 @@ msgid "" "\n" " Mercurial allows you to customize output of commands through\n" -" templates. You can either pass in a template from the command line,\n" -" via the --template option, or select an existing template-style (--" -"style).\n" -"\n" -" You can customize output for any \"log-like\" command: log, outgoing,\n" -" incoming, tip, parents, heads and glog are all template-enabled.\n" +" templates. You can either pass in a template from the command\n" +" line, via the --template option, or select an existing\n" +" template-style (--style).\n" +"\n" +" You can customize output for any \"log-like\" command: log,\n" +" outgoing, incoming, tip, parents, heads and glog.\n" "\n" " Three styles are packaged with Mercurial: default (the style used\n" -" when no explicit preference is passed), compact and changelog. Usage:\n" +" when no explicit preference is passed), compact and changelog.\n" +" Usage:\n" "\n" " $ hg log -r1 --style changelog\n" "\n" -" A template is a piece of text, with markup to invoke variable " -"expansion:\n" +" A template is a piece of text, with markup to invoke variable\n" +" expansion:\n" "\n" " $ hg log -r1 --template \"{node}\\n\"\n" " b56ce7b07c52de7d5fd79fb89701ea538af65746\n" "\n" " Strings in curly braces are called keywords. The availability of\n" -" keywords depends on the exact context of the templater. These keywords\n" -" are usually available for templating a log-like command:\n" +" keywords depends on the exact context of the templater. These\n" +" keywords are usually available for templating a log-like command:\n" "\n" " - author: String. The unmodified author of the changeset.\n" " - branches: String. The name of the branch on which the changeset\n" " was committed. Will be empty if the branch name was default.\n" " - date: Date information. The date when the changeset was committed.\n" " - desc: String. The text of the changeset description.\n" +" - diffstat: String. Statistics of changes with the following\n" +" format: \"modified files: +added/-removed lines\"\n" " - files: List of strings. All files modified, added, or removed by\n" " this changeset.\n" " - file_adds: List of strings. Files added by this changeset.\n" " - file_mods: List of strings. Files modified by this changeset.\n" " - file_dels: List of strings. Files removed by this changeset.\n" -" - node: String. The changeset identification hash, as a 40-character\n" -" hexadecimal string.\n" +" - node: String. The changeset identification hash, as a\n" +" 40-character hexadecimal string.\n" " - parents: List of strings. The parents of the changeset.\n" " - rev: Integer. The repository-local changeset revision number.\n" " - tags: List of strings. Any tags associated with the changeset.\n" "\n" " The \"date\" keyword does not produce human-readable output. If you\n" -" want to use a date in your output, you can use a filter to process it.\n" -" Filters are functions which return a string based on the input " -"variable.\n" -" You can also use a chain of filters to get the wanted output:\n" +" want to use a date in your output, you can use a filter to process\n" +" it. Filters are functions which return a string based on the input\n" +" variable. You can also use a chain of filters to get the desired\n" +" output:\n" "\n" " $ hg tip --template \"{date|isodate}\\n\"\n" " 2008-08-21 18:22 +0000\n" @@ -7572,15 +7982,21 @@ "\n" " - addbreaks: Any text. Add an XHTML \"
\" tag before the end of\n" " every line except the last.\n" -" - age: Date. Returns a human-readable age for the given date.\n" +" - age: Date. Returns a human-readable date/time difference between\n" +" the given date/time and the current date/time.\n" " - basename: Any text. Treats the text as a path, and returns the\n" -" basename. For example, \"foo/bar/baz\" becomes \"baz\".\n" -" - date: Date. Returns a date in a Unix date command format, including\n" +" last component of the path after splitting by the path\n" +" separator (ignoring trailing seprators). For example,\n" +" \"foo/bar/baz\" becomes \"baz\" and \"foo/bar//\" becomes \"bar" +"\".\n" +" - date: Date. Returns a date in a Unix date format, including\n" " the timezone: \"Mon Sep 04 15:13:13 2006 0700\".\n" -" - domain: Any text. Finds the first string that looks like an email\n" -" address, and extracts just the domain component.\n" -" - email: Any text. Extracts the first string that looks like an email\n" -" address.\n" +" - domain: Any text. Finds the first string that looks like an\n" +" email address, and extracts just the domain component.\n" +" Example: 'User ' becomes 'example.com'.\n" +" - email: Any text. Extracts the first string that looks like an\n" +" email address. Example: 'User ' becomes\n" +" 'user@example.com'.\n" " - escape: Any text. Replaces the special XML/XHTML characters \"&\",\n" " \"<\" and \">\" with XML entities.\n" " - fill68: Any text. Wraps the text to fit in 68 columns.\n" @@ -7589,24 +8005,24 @@ " - hgdate: Date. Returns the date as a pair of numbers:\n" " \"1157407993 25200\" (Unix timestamp, timezone offset).\n" " - isodate: Date. Returns the date in ISO 8601 format.\n" -" - obfuscate: Any text. Returns the input text rendered as a sequence\n" -" of XML entities.\n" +" - obfuscate: Any text. Returns the input text rendered as a\n" +" sequence of XML entities.\n" " - person: Any text. Returns the text before an email address.\n" " - rfc822date: Date. Returns a date using the same format used\n" " in email headers.\n" -" - short: Changeset hash. Returns the short form of a changeset hash,\n" -" i.e. a 12-byte hexadecimal string.\n" -" - shortdate: Date. Returns a date like \"2006-09-04\".\n" +" - short: Changeset hash. Returns the short form of a changeset\n" +" hash, i.e. a 12-byte hexadecimal string.\n" +" - shortdate: Date. Returns a date like \"2006-09-18\".\n" " - strip: Any text. Strips all leading and trailing whitespace.\n" -" - tabindent: Any text. Returns the text, with every line except the\n" -" first starting with a tab character.\n" -" - urlescape: Any text. Escapes all \"special\" characters. For example,\n" -" \"foo bar\" becomes \"foo%20bar\".\n" +" - tabindent: Any text. Returns the text, with every line except\n" +" the first starting with a tab character.\n" +" - urlescape: Any text. Escapes all \"special\" characters. For\n" +" example, \"foo bar\" becomes \"foo%20bar\".\n" " - user: Any text. Returns the user portion of an email address.\n" " " msgstr "" -msgid "Url Paths" +msgid "URL Paths" msgstr "URL-stier" msgid "" @@ -7623,45 +8039,48 @@ " 'hg incoming --bundle').\n" "\n" " An optional identifier after # indicates a particular branch, tag,\n" -" or changeset to deal with in the remote repository.\n" +" or changeset to use from the remote repository.\n" "\n" " Some features, such as pushing to http:// and https:// URLs are\n" -" only possible if the feature is explicitly enabled on the\n" -" remote Mercurial server.\n" +" only possible if the feature is explicitly enabled on the remote\n" +" Mercurial server.\n" "\n" " Some notes about using SSH with Mercurial:\n" -" - SSH requires an accessible shell account on the destination machine\n" -" and a copy of hg in the remote path or specified with as remotecmd.\n" +" - SSH requires an accessible shell account on the destination\n" +" machine and a copy of hg in the remote path or specified with as\n" +" remotecmd.\n" " - path is relative to the remote user's home directory by default.\n" " Use an extra slash at the start of a path to specify an absolute " "path:\n" " ssh://example.com//tmp/repository\n" -" - Mercurial doesn't use its own compression via SSH; the right thing\n" -" to do is to configure it in your ~/.ssh/config, e.g.:\n" +" - Mercurial doesn't use its own compression via SSH; the right\n" +" thing to do is to configure it in your ~/.ssh/config, e.g.:\n" " Host *.mylocalnetwork.example.com\n" " Compression no\n" " Host *\n" " Compression yes\n" -" Alternatively specify \"ssh -C\" as your ssh command in your hgrc or\n" -" with the --ssh command line option.\n" -"\n" -" These urls can all be stored in your hgrc with path aliases under the\n" -" [paths] section like so:\n" +" Alternatively specify \"ssh -C\" as your ssh command in your hgrc\n" +" or with the --ssh command line option.\n" +"\n" +" These URLs can all be stored in your hgrc with path aliases under\n" +" the [paths] section like so:\n" " [paths]\n" " alias1 = URL1\n" " alias2 = URL2\n" " ...\n" "\n" -" You can then use the alias for any command that uses a url (for example\n" -" 'hg pull alias1' would pull from the 'alias1' path).\n" -"\n" -" Two path aliases are more important because they are used as defaults\n" -" when you do not provide the url to a command:\n" +" You can then use the alias for any command that uses a URL (for\n" +" example 'hg pull alias1' would pull from the 'alias1' path).\n" +"\n" +" Two path aliases are special because they are used as defaults\n" +" when you do not provide the URL to a command:\n" "\n" " default:\n" -" When you create a repository with hg clone, the clone command saves\n" -" the location of the source repository as the 'default' path. This is\n" -" then used when you omit a path from the push and pull commands.\n" +" When you create a repository with hg clone, the clone command\n" +" saves the location of the source repository as the new\n" +" repository's 'default' path. This is then used when you omit\n" +" path from push- and pull-like commands (including incoming and\n" +" outgoing).\n" "\n" " default-push:\n" " The push command will look for a path named 'default-push', and\n" @@ -7677,6 +8096,10 @@ msgid "destination '%s' already exists" msgstr "" +#, python-format +msgid "destination '%s' is not empty" +msgstr "" + msgid "" "src repository does not support revision lookup and so doesn't support clone " "by revision" @@ -7686,7 +8109,7 @@ msgstr "" msgid "updating working directory\n" -msgstr "opdaterer arbejdsbibliotek\n" +msgstr "opdaterer arbejdskatalog\n" msgid "updated" msgstr "opdateret" @@ -7707,6 +8130,11 @@ msgid "use 'hg resolve' to retry unresolved file merges\n" msgstr "" +msgid "" +"use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to " +"abandon\n" +msgstr "" + msgid "(branch merge, don't forget to commit)\n" msgstr "" @@ -7717,7 +8145,7 @@ msgid "SSL support is unavailable" msgstr "understøttelse for SSL er ikke tilstede" -msgid "IPv6 not available on this system" +msgid "IPv6 is not available on this system" msgstr "IPv6 er ikke til rådighed på dette system" #, python-format @@ -7813,8 +8241,8 @@ msgstr "den rigtige URL er %s\n" #, python-format -msgid "Requested URL: '%s'\n" -msgstr "" +msgid "requested URL: '%s'\n" +msgstr "forespurgt URL: '%s'\n" #, python-format msgid "'%s' does not appear to be an hg repository" @@ -7929,7 +8357,7 @@ #, python-format msgid "working directory of %s" -msgstr "arbejdsbibliotek for %s" +msgstr "arbejdskatalog for %s" #, python-format msgid " %s: searching for copy revision for %s\n" @@ -8251,10 +8679,6 @@ msgstr "henter %s\n" #, python-format -msgid "moving %s to %s\n" -msgstr "" - -#, python-format msgid "getting %s to %s\n" msgstr "" @@ -8363,6 +8787,21 @@ msgstr "" #, python-format +msgid "exited with status %d" +msgstr "afsluttede med status %d" + +#, python-format +msgid "killed by signal %d" +msgstr "dræbt af signal %d" + +#, python-format +msgid "stopped by signal %d" +msgstr "stoppet af signal %d" + +msgid "invalid exit code" +msgstr "ugyldig returkode" + +#, python-format msgid "saving bundle to %s\n" msgstr "" @@ -8389,6 +8828,10 @@ msgid "index %s unknown format %d" msgstr "" +#, python-format +msgid "index %s is corrupted" +msgstr "indeks %s er ødelagt" + msgid "no node" msgstr "" @@ -8533,7 +8976,7 @@ msgstr "" msgid "enter a commit username:" -msgstr "angiv et commit brugernavn:" +msgstr "angiv et arkiveringsbrugernavn:" #, python-format msgid "No username found, using '%s' instead\n" @@ -8584,10 +9027,6 @@ msgstr "http godkendelse: bruger %s, kodeord %s\n" #, python-format -msgid "%s, please check your locale settings" -msgstr "%s, tjek venligst dine sprogindstillinger" - -#, python-format msgid "command '%s' failed: %s" msgstr "kommandoen '%s' fejlede: %s" @@ -8606,24 +9045,6 @@ msgid "Hardlinks not supported" msgstr "Hardlinks er ikke supporteret" -msgid "user name not available - set USERNAME environment variable" -msgstr "der er ikke noget brugernavn - sæt USERNAME miljøvariabel" - -#, python-format -msgid "exited with status %d" -msgstr "afsluttede med status %d" - -#, python-format -msgid "killed by signal %d" -msgstr "dræbt af signal %d" - -#, python-format -msgid "stopped by signal %d" -msgstr "stoppet af signal %d" - -msgid "invalid exit code" -msgstr "ugyldig returkode" - #, python-format msgid "could not symlink to %r: %s" msgstr "kunne ikke lave et symbolsk link til %r: %s" @@ -8711,7 +9132,11 @@ msgstr "advarsel: '%s' bruger revlog format 0" #, python-format -msgid "rev %d point to %s changeset %d" +msgid "rev %d points to nonexistent changeset %d" +msgstr "" + +#, python-format +msgid "rev %d points to unexpected changeset %d" msgstr "" #, python-format @@ -8775,6 +9200,10 @@ msgid "cannot decode filename '%s'" msgstr "kan ikke dekode filnavn '%s'" +#, python-format +msgid "broken revlog! (%s)" +msgstr "" + msgid "missing revlog!" msgstr "manglende revlog!" @@ -8825,3 +9254,6 @@ #, python-format msgid "(first damaged changeset appears to be %d)\n" msgstr "(første beskadigede ændring er tilsyneladende %d)\n" + +msgid "user name not available - set USERNAME environment variable" +msgstr "der er ikke noget brugernavn - sæt USERNAME miljøvariabel" diff -r 78658990c725 -r 56719b1aa6f4 i18n/de.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/i18n/de.po Sun Apr 26 11:49:17 2009 +0200 @@ -0,0 +1,10121 @@ +# German translations for Mercurial +# Deutsche Übersetzungen für Mercurial +# Copyright (C) 2009 Matt Mackall and others +# +# Übersetzungen +# ============= +# branch Zweig/Verzweigung +# bundle Bündel +# change Änderung +# changeset Änderungssatz +# check out auschecken +# commit Version +# commit (v) übertragen +# deprecated veraltet +# hook Aktion +# merge zusammenführen +# notation Schreibweise +# repository Projektarchiv +# +# Die Koordination der Übersetzung erfolgt auf http://bitbucket.org/tobidope/mercurial-german-translation +msgid "" +msgstr "" +"Project-Id-Version: Mercurial\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-04-10 10:49+0200\n" +"PO-Revision-Date: 2009-04-22 08:04+0200\n" +"Last-Translator: Tobias Bell \n" +"Language-Team: German (Tobias Bell, Fabian Kreutz, Lutz Horn)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid " (default: %s)" +msgstr " (Standard: %s)" + +msgid "OPTIONS" +msgstr "OPTIONEN" + +msgid "COMMANDS" +msgstr "BEFEHLE" + +msgid " options:\n" +msgstr " Optionen:\n" + +#, python-format +msgid "" +" aliases: %s\n" +"\n" +msgstr "" +" Aliase: %s\n" +"\n" + +# Nicht übersetzen +msgid "return tuple of (match function, list enabled)." +msgstr "" + +#, python-format +msgid "acl: %s not enabled\n" +msgstr "acl: %s nicht aktiviert\n" + +#, python-format +msgid "acl: %s enabled, %d entries for user %s\n" +msgstr "acl: %s aktiviert, %d Einträge für Nutzer %s\n" + +#, python-format +msgid "config error - hook type \"%s\" cannot stop incoming changesets" +msgstr "" +"Konfigurationsfehler - Aktionstyp \"%s\" kann hereinkommende Änderungssätze\n" +"nicht stoppen" + +#, python-format +msgid "acl: changes have source \"%s\" - skipping\n" +msgstr "acl: Änderungen haben die Quelle \"%s\" - überspringe\n" + +#, python-format +msgid "acl: user %s denied on %s\n" +msgstr "acl: Benutzer %s nicht berechtigt für %s\n" + +#, python-format +msgid "acl: access denied for changeset %s" +msgstr "acl: Zugriff verweigert auf die Version %s" + +#, python-format +msgid "acl: user %s not allowed on %s\n" +msgstr "acl: Benutzer %s hat keinen Zugriff auf %s\n" + +#, python-format +msgid "acl: allowing changeset %s\n" +msgstr "acl: Gestatte Version %s\n" + +msgid "" +"allow user-defined command aliases\n" +"\n" +"To use, create entries in your hgrc of the form\n" +"\n" +"[alias]\n" +"mycmd = cmd --args\n" +msgstr "" +"Ermöglicht benutzerdefinierte Befehls-Aliase\n" +"\n" +"Um sie zu nutzen, erzeuge Einträge folgender Form in deiner hgrc\n" +"\n" +"[alias]\n" +"mycmd = cmd --args\n" + +# Nicht übersetzen +msgid "" +"defer command lookup until needed, so that extensions loaded\n" +" after alias can be aliased" +msgstr "" + +#, python-format +msgid "*** [alias] %s: command %s is unknown" +msgstr "*** [alias] %s: Befehl %s ist unbekannt" + +#, python-format +msgid "*** [alias] %s: command %s is ambiguous" +msgstr "*** [alias] %s: Befehl %s ist zweideutig" + +#, python-format +msgid "*** [alias] %s: circular dependency on %s" +msgstr "*** [alias] %s: zirkuläre Abhängigkeit auf %s" + +#, python-format +msgid "*** [alias] %s: no definition\n" +msgstr "*** [alias] %s: nicht definiert\n" + +msgid "" +"mercurial bookmarks\n" +"\n" +"Mercurial bookmarks are local moveable pointers to changesets. Every\n" +"bookmark points to a changeset identified by its hash. If you commit a\n" +"changeset that is based on a changeset that has a bookmark on it, the\n" +"bookmark is forwarded to the new changeset.\n" +"\n" +"It is possible to use bookmark names in every revision lookup (e.g. hg\n" +"merge, hg update).\n" +"\n" +"The bookmark extension offers the possiblity to have a more git-like\n" +"experience by adding the following configuration option to your .hgrc:\n" +"\n" +"[bookmarks]\n" +"track.current = True\n" +"\n" +"This will cause bookmarks to track the bookmark that you are currently\n" +"on, and just updates it. This is similar to git's approach of\n" +"branching.\n" +msgstr "" + +# Nicht übersetzen +msgid "" +"Parse .hg/bookmarks file and return a dictionary\n" +"\n" +" Bookmarks are stored as {HASH}\\s{NAME}\\n (localtags format) values\n" +" in the .hg/bookmarks file. They are read by the parse() method and\n" +" returned as a dictionary with name => hash values.\n" +"\n" +" The parsed dictionary is cached until a write() operation is done.\n" +" " +msgstr "" + +# Nicht übersetzen +msgid "" +"Write bookmarks\n" +"\n" +" Write the given bookmark => hash dictionary to the .hg/bookmarks file\n" +" in a format equal to those of localtags.\n" +"\n" +" We also store a backup of the previous state in undo.bookmarks that\n" +" can be copied back on rollback.\n" +" " +msgstr "" + +# Nicht übersetzen +msgid "" +"Get the current bookmark\n" +"\n" +" If we use gittishsh branches we have a current bookmark that\n" +" we are on. This function returns the name of the bookmark. It\n" +" is stored in .hg/bookmarks.current\n" +" " +msgstr "" + +# Nicht übersetzen +msgid "" +"Set the name of the bookmark that we are currently on\n" +"\n" +" Set the name of the bookmark that we are on (hg update ).\n" +" The name is recoreded in .hg/bookmarks.current\n" +" " +msgstr "" + +msgid "" +"mercurial bookmarks\n" +"\n" +" Bookmarks are pointers to certain commits that move when\n" +" commiting. Bookmarks are local. They can be renamed, copied and\n" +" deleted. It is possible to use bookmark names in 'hg merge' and\n" +" 'hg update' to update to a given bookmark.\n" +"\n" +" You can use 'hg bookmark NAME' to set a bookmark on the current\n" +" tip with the given name. If you specify a revision using -r REV\n" +" (where REV may be an existing bookmark), the bookmark is set to\n" +" that revision.\n" +" " +msgstr "" +"Mercurial Lesezeichen\n" +"\n" +" Lesezeichen sind Zeiger auf bestimmte Versionen, die mitwandern,\n" +" wenn eine neuen Version erzeugt wird. Lesezeichen sind nur lokal.\n" +" Sie können umbenannt, kopiert und gelöscht werden. Es ist möglich\n" +" Lesezeichen bei 'hg merge' und 'hg update' zu nutzen, um auf das\n" +" angegebene Lesezeichen zu aktualisieren.\n" +"\n" +" Du kannst 'hg bookmark NAME' aufrufen, um ein Lesezeichen mit dem\n" +" angegeben Namen auf der aktuellen Spitze (tip) zu setzen. Bei Angabe " +"einer\n" +" Revision mit -r REV (REV kann ein vorhandenes Lesezeichen sein) wird " +"das\n" +" Lesezeichen auf dieser Revision gesetzt.\n" +" " + +msgid "a bookmark of this name does not exist" +msgstr "Es existiert kein Lesezeichen mit diesem Namen" + +msgid "a bookmark of the same name already exists" +msgstr "Ein Lesezeichen mit diesem Namen existiert bereits" + +msgid "new bookmark name required" +msgstr "Ein neuer Name für das Lesezeichen muss übergeben werden" + +msgid "bookmark name required" +msgstr "Ein Name für das Lesezeichen muss übergeben werden" + +msgid "bookmark name cannot contain newlines" +msgstr "Ein Lesezeichenname darf keine Zeilenumbrüche enthalten" + +msgid "a bookmark cannot have the name of an existing branch" +msgstr "" +"Ein Lesezeichen darf nicht denselben Namen wie ein existierender Zweig haben" + +# Nicht übersetzen +msgid "" +"Strip bookmarks if revisions are stripped using\n" +" the mercurial.strip method. This usually happens during\n" +" qpush and qpop" +msgstr "" + +# Nicht übersetzen +msgid "" +"Add a revision to the repository and\n" +" move the bookmark" +msgstr "" + +# Nicht übersetzen +msgid "Merge bookmarks with normal tags" +msgstr "" + +# Nicht übersetzen +msgid "" +"Set the current bookmark\n" +"\n" +" If the user updates to a bookmark we update the .hg/bookmarks.current\n" +" file.\n" +" " +msgstr "" + +msgid "force" +msgstr "erzwinge" + +msgid "revision" +msgstr "Revision" + +msgid "delete a given bookmark" +msgstr "Löscht ein gegebenes Lesezeichen" + +msgid "rename a given bookmark" +msgstr "Benennt ein gegebenes Lesezeichen um" + +msgid "hg bookmarks [-f] [-d] [-m NAME] [-r REV] [NAME]" +msgstr "" + +msgid "" +"Bugzilla integration\n" +"\n" +"This hook extension adds comments on bugs in Bugzilla when changesets\n" +"that refer to bugs by Bugzilla ID are seen. The hook does not change\n" +"bug status.\n" +"\n" +"The hook updates the Bugzilla database directly. Only Bugzilla\n" +"installations using MySQL are supported.\n" +"\n" +"The hook relies on a Bugzilla script to send bug change notification\n" +"emails. That script changes between Bugzilla versions; the\n" +"'processmail' script used prior to 2.18 is replaced in 2.18 and\n" +"subsequent versions by 'config/sendbugmail.pl'. Note that these will\n" +"be run by Mercurial as the user pushing the change; you will need to\n" +"ensure the Bugzilla install file permissions are set appropriately.\n" +"\n" +"Configuring the extension:\n" +"\n" +" [bugzilla]\n" +"\n" +" host Hostname of the MySQL server holding the Bugzilla\n" +" database.\n" +" db Name of the Bugzilla database in MySQL. Default 'bugs'.\n" +" user Username to use to access MySQL server. Default 'bugs'.\n" +" password Password to use to access MySQL server.\n" +" timeout Database connection timeout (seconds). Default 5.\n" +" version Bugzilla version. Specify '3.0' for Bugzilla versions\n" +" 3.0 and later, '2.18' for Bugzilla versions from 2.18\n" +" and '2.16' for versions prior to 2.18.\n" +" bzuser Fallback Bugzilla user name to record comments with, if\n" +" changeset committer cannot be found as a Bugzilla user.\n" +" bzdir Bugzilla install directory. Used by default notify.\n" +" Default '/var/www/html/bugzilla'.\n" +" notify The command to run to get Bugzilla to send bug change\n" +" notification emails. Substitutes from a map with 3\n" +" keys, 'bzdir', 'id' (bug id) and 'user' (committer\n" +" bugzilla email). Default depends on version; from 2.18\n" +" it is \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl\n" +" %(id)s %(user)s\".\n" +" regexp Regular expression to match bug IDs in changeset commit\n" +" message. Must contain one \"()\" group. The default\n" +" expression matches 'Bug 1234', 'Bug no. 1234', 'Bug\n" +" number 1234', 'Bugs 1234,5678', 'Bug 1234 and 5678' and\n" +" variations thereof. Matching is case insensitive.\n" +" style The style file to use when formatting comments.\n" +" template Template to use when formatting comments. Overrides\n" +" style if specified. In addition to the usual Mercurial\n" +" keywords, the extension specifies:\n" +" {bug} The Bugzilla bug ID.\n" +" {root} The full pathname of the Mercurial\n" +" repository.\n" +" {webroot} Stripped pathname of the Mercurial\n" +" repository.\n" +" {hgweb} Base URL for browsing Mercurial\n" +" repositories.\n" +" Default 'changeset {node|short} in repo {root} refers '\n" +" 'to bug {bug}.\\ndetails:\\n\\t{desc|tabindent}'\n" +" strip The number of slashes to strip from the front of {root}\n" +" to produce {webroot}. Default 0.\n" +" usermap Path of file containing Mercurial committer ID to\n" +" Bugzilla user ID mappings. If specified, the file\n" +" should contain one mapping per line,\n" +" \"committer\"=\"Bugzilla user\". See also the [usermap]\n" +" section.\n" +"\n" +" [usermap]\n" +" Any entries in this section specify mappings of Mercurial\n" +" committer ID to Bugzilla user ID. See also [bugzilla].usermap.\n" +" \"committer\"=\"Bugzilla user\"\n" +"\n" +" [web]\n" +" baseurl Base URL for browsing Mercurial repositories. Reference\n" +" from templates as {hgweb}.\n" +"\n" +"Activating the extension:\n" +"\n" +" [extensions]\n" +" hgext.bugzilla =\n" +"\n" +" [hooks]\n" +" # run bugzilla hook on every change pulled or pushed in here\n" +" incoming.bugzilla = python:hgext.bugzilla.hook\n" +"\n" +"Example configuration:\n" +"\n" +"This example configuration is for a collection of Mercurial\n" +"repositories in /var/local/hg/repos/ used with a local Bugzilla 3.2\n" +"installation in /opt/bugzilla-3.2.\n" +"\n" +" [bugzilla]\n" +" host=localhost\n" +" password=XYZZY\n" +" version=3.0\n" +" bzuser=unknown@domain.com\n" +" bzdir=/opt/bugzilla-3.2\n" +" template=Changeset {node|short} in {root|basename}.\\n{hgweb}/{webroot}/" +"rev/{node|short}\\n\\n{desc}\\n\n" +" strip=5\n" +"\n" +" [web]\n" +" baseurl=http://dev.domain.com/hg\n" +"\n" +" [usermap]\n" +" user@emaildomain.com=user.name@bugzilladomain.com\n" +"\n" +"Commits add a comment to the Bugzilla bug record of the form:\n" +"\n" +" Changeset 3b16791d6642 in repository-name.\n" +" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n" +"\n" +" Changeset commit comment. Bug 1234.\n" +msgstr "" + +msgid "support for bugzilla version 2.16." +msgstr "Unterstützung für Bugzilla-Version 2.16" + +#, python-format +msgid "connecting to %s:%s as %s, password %s\n" +msgstr "Verbinde mit %s:%s als %s, Passwort %s\n" + +msgid "run a query." +msgstr "" + +#, python-format +msgid "query: %s %s\n" +msgstr "" + +#, python-format +msgid "failed query: %s %s\n" +msgstr "" + +msgid "get identity of longdesc field" +msgstr "" + +msgid "unknown database schema" +msgstr "" + +msgid "filter not-existing bug ids from list." +msgstr "" + +msgid "filter bug ids from list that already refer to this changeset." +msgstr "" + +#, python-format +msgid "bug %d already knows about changeset %s\n" +msgstr "" + +msgid "tell bugzilla to send mail." +msgstr "" + +msgid "telling bugzilla to send mail:\n" +msgstr "" + +#, python-format +msgid " bug %s\n" +msgstr "" + +#, python-format +msgid "running notify command %s\n" +msgstr "" + +#, python-format +msgid "bugzilla notify command %s" +msgstr "" + +msgid "done\n" +msgstr "erledigt\n" + +msgid "look up numeric bugzilla user id." +msgstr "" + +#, python-format +msgid "looking up user %s\n" +msgstr "" + +msgid "map name of committer to bugzilla user name." +msgstr "" + +msgid "" +"see if committer is a registered bugzilla user. Return\n" +" bugzilla username and userid if so. If not, return default\n" +" bugzilla username and userid." +msgstr "" + +#, python-format +msgid "cannot find bugzilla user id for %s" +msgstr "" + +#, python-format +msgid "cannot find bugzilla user id for %s or %s" +msgstr "" + +msgid "" +"add comment to bug. try adding comment as committer of\n" +" changeset, otherwise as default bugzilla user." +msgstr "" + +msgid "support for bugzilla 2.18 series." +msgstr "" + +msgid "support for bugzilla 3.0 series." +msgstr "" + +msgid "" +"return object that knows how to talk to bugzilla version in\n" +" use." +msgstr "" + +#, python-format +msgid "bugzilla version %s not supported" +msgstr "" + +msgid "" +"find valid bug ids that are referred to in changeset\n" +" comments and that do not already have references to this\n" +" changeset." +msgstr "" + +msgid "update bugzilla bug with reference to changeset." +msgstr "" + +msgid "" +"strip leading prefix of repo root and turn into\n" +" url-safe path." +msgstr "" + +msgid "" +"changeset {node|short} in repo {root} refers to bug {bug}.\n" +"details:\n" +"\t{desc|tabindent}" +msgstr "" + +msgid "" +"add comment to bugzilla for each changeset that refers to a\n" +" bugzilla bug id. only add a comment once per bug, so same change\n" +" seen multiple times does not fill bug with duplicate data." +msgstr "" + +#, python-format +msgid "python mysql support not available: %s" +msgstr "" + +#, python-format +msgid "hook type %s does not pass a changeset id" +msgstr "" + +#, python-format +msgid "database error: %s" +msgstr "" + +msgid "" +"show the children of the given or working directory revision\n" +"\n" +" Print the children of the working directory's revisions. If a\n" +" revision is given via --rev, the children of that revision will be\n" +" printed. If a file argument is given, revision in which the file\n" +" was last changed (after the working directory revision or the\n" +" argument to --rev if given) is printed.\n" +" " +msgstr "" +"Zeigt die Kinder der übergebenen Revision oder des Arbeitsverzeichnisses an\n" +"\n" +" Zeigt die Kinder der Revision des Arbeitsverzeichnisses an.\n" +" Wenn eine Revision durch --rev angegeben wird, werden die Kinder dieser\n" +" Revision angezeigt. Wenn eine Datei als Argument angegeben wird, zeige " +"die\n" +" Revision an, in der die Datei zuletzt geändert wurde (nachfolgend der\n" +" Revision des Arbeitsverzeichnisses oder wenn angegeben dem Argument von\n" +" --rev).\n" +" " + +msgid "show children of the specified revision" +msgstr "Zeigt die Kinder der übergebenen Revision" + +msgid "hg children [-r REV] [FILE]" +msgstr "hg children [-r REV] [DATEI]" + +msgid "command to show certain statistics about revision history" +msgstr "" + +msgid "Calculate stats" +msgstr "" + +#, python-format +msgid "Revision %d is a merge, ignoring...\n" +msgstr "Revision %d ist eine Zusammenführung, wird ignoriert...\n" + +#, python-format +msgid "\rgenerating stats: %d%%" +msgstr "" + +msgid "" +"graph count of revisions grouped by template\n" +"\n" +" Will graph count of changed lines or revisions grouped by template\n" +" or alternatively by date, if dateformat is used. In this case it\n" +" will override template.\n" +"\n" +" By default statistics are counted for number of changed lines.\n" +"\n" +" Examples:\n" +"\n" +" # display count of changed lines for every committer\n" +" hg churn -t '{author|email}'\n" +"\n" +" # display daily activity graph\n" +" hg churn -f '%H' -s -c\n" +"\n" +" # display activity of developers by month\n" +" hg churn -f '%Y-%m' -s -c\n" +"\n" +" # display count of lines changed in every year\n" +" hg churn -f '%Y' -s\n" +"\n" +" The map file format used to specify aliases is fairly simple:\n" +"\n" +" " +msgstr "" + +#, python-format +msgid "assuming %i character terminal\n" +msgstr "" + +msgid "count rate for the specified revision or range" +msgstr "" + +msgid "count rate for revisions matching date spec" +msgstr "Zeigt Revisionen passend zur Datums-Spezifikation" + +msgid "template to group changesets" +msgstr "" + +msgid "strftime-compatible format for grouping by date" +msgstr "" + +msgid "count rate by number of changesets" +msgstr "" + +msgid "sort by key (default: sort by count)" +msgstr "" + +msgid "file with email aliases" +msgstr "" + +msgid "show progress" +msgstr "" + +msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [--progress] [FILE]" +msgstr "" + +msgid "" +"add color output to status, qseries, and diff-related commands\n" +"\n" +"This extension modifies the status command to add color to its output\n" +"to reflect file status, the qseries command to add color to reflect\n" +"patch status (applied, unapplied, missing), and to diff-related\n" +"commands to highlight additions, removals, diff headers, and trailing\n" +"whitespace.\n" +"\n" +"Other effects in addition to color, like bold and underlined text, are\n" +"also available. Effects are rendered with the ECMA-48 SGR control\n" +"function (aka ANSI escape codes). This module also provides the\n" +"render_text function, which can be used to add effects to any text.\n" +"\n" +"To enable this extension, add this to your .hgrc file:\n" +"[extensions]\n" +"color =\n" +"\n" +"Default effects my be overriden from the .hgrc file:\n" +"\n" +"[color]\n" +"status.modified = blue bold underline red_background\n" +"status.added = green bold\n" +"status.removed = red bold blue_background\n" +"status.deleted = cyan bold underline\n" +"status.unknown = magenta bold underline\n" +"status.ignored = black bold\n" +"\n" +"# 'none' turns off all effects\n" +"status.clean = none\n" +"status.copied = none\n" +"\n" +"qseries.applied = blue bold underline\n" +"qseries.unapplied = black bold\n" +"qseries.missing = red bold\n" +"\n" +"diff.diffline = bold\n" +"diff.extended = cyan bold\n" +"diff.file_a = red bold\n" +"diff.file_b = green bold\n" +"diff.hunk = magenta\n" +"diff.deleted = red\n" +"diff.inserted = green\n" +"diff.changed = white\n" +"diff.trailingwhitespace = bold red_background\n" +msgstr "" + +msgid "Wrap text in commands to turn on each effect." +msgstr "" + +msgid "run the status command with colored output" +msgstr "" + +msgid "run the qseries command with colored output" +msgstr "" + +msgid "wrap ui.write for colored diff output" +msgstr "" + +msgid "wrap cmdutil.changeset_printer.showpatch with colored output" +msgstr "" + +msgid "run the diff command with colored output" +msgstr "" + +msgid "Initialize the extension." +msgstr "" + +msgid "patch in command to command table and load effect map" +msgstr "" + +msgid "when to colorize (always, auto, or never)" +msgstr "Wann soll eingefärbt werden (always, auto oder never)" + +msgid "don't colorize output" +msgstr "Keine Färbung der Ausgabe" + +msgid "converting foreign VCS repositories to Mercurial" +msgstr "" + +msgid "" +"convert a foreign SCM repository to a Mercurial one.\n" +"\n" +" Accepted source formats [identifiers]:\n" +" - Mercurial [hg]\n" +" - CVS [cvs]\n" +" - Darcs [darcs]\n" +" - git [git]\n" +" - Subversion [svn]\n" +" - Monotone [mtn]\n" +" - GNU Arch [gnuarch]\n" +" - Bazaar [bzr]\n" +" - Perforce [p4]\n" +"\n" +" Accepted destination formats [identifiers]:\n" +" - Mercurial [hg]\n" +" - Subversion [svn] (history on branches is not preserved)\n" +"\n" +" If no revision is given, all revisions will be converted.\n" +" Otherwise, convert will only import up to the named revision\n" +" (given in a format understood by the source).\n" +"\n" +" If no destination directory name is specified, it defaults to the\n" +" basename of the source with '-hg' appended. If the destination\n" +" repository doesn't exist, it will be created.\n" +"\n" +" If isn't given, it will be put in a default location\n" +" (/.hg/shamap by default). The is a simple text file\n" +" that maps each source commit ID to the destination ID for that\n" +" revision, like so:\n" +" \n" +"\n" +" If the file doesn't exist, it's automatically created. It's\n" +" updated on each commit copied, so convert-repo can be interrupted\n" +" and can be run repeatedly to copy new commits.\n" +"\n" +" The [username mapping] file is a simple text file that maps each\n" +" source commit author to a destination commit author. It is handy\n" +" for source SCMs that use unix logins to identify authors (eg:\n" +" CVS). One line per author mapping and the line format is:\n" +" srcauthor=whatever string you want\n" +"\n" +" The filemap is a file that allows filtering and remapping of files\n" +" and directories. Comment lines start with '#'. Each line can\n" +" contain one of the following directives:\n" +"\n" +" include path/to/file\n" +"\n" +" exclude path/to/file\n" +"\n" +" rename from/file to/file\n" +"\n" +" The 'include' directive causes a file, or all files under a\n" +" directory, to be included in the destination repository, and the\n" +" exclusion of all other files and directories not explicitely included.\n" +" The 'exclude' directive causes files or directories to be omitted.\n" +" The 'rename' directive renames a file or directory. To rename from\n" +" a subdirectory into the root of the repository, use '.' as the\n" +" path to rename to.\n" +"\n" +" The splicemap is a file that allows insertion of synthetic\n" +" history, letting you specify the parents of a revision. This is\n" +" useful if you want to e.g. give a Subversion merge two parents, or\n" +" graft two disconnected series of history together. Each entry\n" +" contains a key, followed by a space, followed by one or two\n" +" comma-separated values. The key is the revision ID in the source\n" +" revision control system whose parents should be modified (same\n" +" format as a key in .hg/shamap). The values are the revision IDs\n" +" (in either the source or destination revision control system) that\n" +" should be used as the new parents for that node.\n" +"\n" +" Mercurial Source\n" +" -----------------\n" +"\n" +" --config convert.hg.ignoreerrors=False (boolean)\n" +" ignore integrity errors when reading. Use it to fix Mercurial\n" +" repositories with missing revlogs, by converting from and to\n" +" Mercurial.\n" +" --config convert.hg.saverev=False (boolean)\n" +" store original revision ID in changeset (forces target IDs to\n" +" change)\n" +" --config convert.hg.startrev=0 (hg revision identifier)\n" +" convert start revision and its descendants\n" +"\n" +" CVS Source\n" +" ----------\n" +"\n" +" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n" +" to indicate the starting point of what will be converted. Direct\n" +" access to the repository files is not needed, unless of course the\n" +" repository is :local:. The conversion uses the top level directory\n" +" in the sandbox to find the CVS repository, and then uses CVS rlog\n" +" commands to find files to convert. This means that unless a\n" +" filemap is given, all files under the starting directory will be\n" +" converted, and that any directory reorganisation in the CVS\n" +" sandbox is ignored.\n" +"\n" +" Because CVS does not have changesets, it is necessary to collect\n" +" individual commits to CVS and merge them into changesets. CVS\n" +" source uses its internal changeset merging code by default but can\n" +" be configured to call the external 'cvsps' program by setting:\n" +" --config convert.cvsps='cvsps -A -u --cvs-direct -q'\n" +" This is a legacy option and may be removed in future.\n" +"\n" +" The options shown are the defaults.\n" +"\n" +" Internal cvsps is selected by setting\n" +" --config convert.cvsps=builtin\n" +" and has a few more configurable options:\n" +" --config convert.cvsps.fuzz=60 (integer)\n" +" Specify the maximum time (in seconds) that is allowed\n" +" between commits with identical user and log message in a\n" +" single changeset. When very large files were checked in as\n" +" part of a changeset then the default may not be long\n" +" enough.\n" +" --config convert.cvsps.mergeto='{{mergetobranch ([-\\w]+)}}'\n" +" Specify a regular expression to which commit log messages\n" +" are matched. If a match occurs, then the conversion\n" +" process will insert a dummy revision merging the branch on\n" +" which this log message occurs to the branch indicated in\n" +" the regex.\n" +" --config convert.cvsps.mergefrom='{{mergefrombranch ([-\\w]+)}}'\n" +" Specify a regular expression to which commit log messages\n" +" are matched. If a match occurs, then the conversion\n" +" process will add the most recent revision on the branch\n" +" indicated in the regex as the second parent of the\n" +" changeset.\n" +"\n" +" The hgext/convert/cvsps wrapper script allows the builtin\n" +" changeset merging code to be run without doing a conversion. Its\n" +" parameters and output are similar to that of cvsps 2.1.\n" +"\n" +" Subversion Source\n" +" -----------------\n" +"\n" +" Subversion source detects classical trunk/branches/tags layouts.\n" +" By default, the supplied \"svn://repo/path/\" source URL is\n" +" converted as a single branch. If \"svn://repo/path/trunk\" exists it\n" +" replaces the default branch. If \"svn://repo/path/branches\" exists,\n" +" its subdirectories are listed as possible branches. If\n" +" \"svn://repo/path/tags\" exists, it is looked for tags referencing\n" +" converted branches. Default \"trunk\", \"branches\" and \"tags\" values\n" +" can be overriden with following options. Set them to paths\n" +" relative to the source URL, or leave them blank to disable\n" +" autodetection.\n" +"\n" +" --config convert.svn.branches=branches (directory name)\n" +" specify the directory containing branches\n" +" --config convert.svn.tags=tags (directory name)\n" +" specify the directory containing tags\n" +" --config convert.svn.trunk=trunk (directory name)\n" +" specify the name of the trunk branch\n" +"\n" +" Source history can be retrieved starting at a specific revision,\n" +" instead of being integrally converted. Only single branch\n" +" conversions are supported.\n" +"\n" +" --config convert.svn.startrev=0 (svn revision number)\n" +" specify start Subversion revision.\n" +"\n" +" Perforce Source\n" +" ---------------\n" +"\n" +" The Perforce (P4) importer can be given a p4 depot path or a\n" +" client specification as source. It will convert all files in the\n" +" source to a flat Mercurial repository, ignoring labels, branches\n" +" and integrations. Note that when a depot path is given you then\n" +" usually should specify a target directory, because otherwise the\n" +" target may be named ...-hg.\n" +"\n" +" It is possible to limit the amount of source history to be\n" +" converted by specifying an initial Perforce revision.\n" +"\n" +" --config convert.p4.startrev=0 (perforce changelist number)\n" +" specify initial Perforce revision.\n" +"\n" +"\n" +" Mercurial Destination\n" +" ---------------------\n" +"\n" +" --config convert.hg.clonebranches=False (boolean)\n" +" dispatch source branches in separate clones.\n" +" --config convert.hg.tagsbranch=default (branch name)\n" +" tag revisions branch name\n" +" --config convert.hg.usebranchnames=True (boolean)\n" +" preserve branch names\n" +"\n" +" " +msgstr "" + +msgid "" +"create changeset information from CVS\n" +"\n" +" This command is intended as a debugging tool for the CVS to\n" +" Mercurial converter, and can be used as a direct replacement for\n" +" cvsps.\n" +"\n" +" Hg debugcvsps reads the CVS rlog for current directory (or any\n" +" named directory) in the CVS repository, and converts the log to a\n" +" series of changesets based on matching commit log entries and\n" +" dates." +msgstr "" + +msgid "username mapping filename" +msgstr "" + +msgid "destination repository type" +msgstr "" + +msgid "remap file names using contents of file" +msgstr "" + +msgid "import up to target revision REV" +msgstr "" + +msgid "source repository type" +msgstr "" + +msgid "splice synthesized history into place" +msgstr "" + +msgid "try to sort changesets by date" +msgstr "" + +msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]" +msgstr "" + +msgid "only return changes on specified branches" +msgstr "" + +msgid "prefix to remove from file names" +msgstr "" + +msgid "only return changes after or between specified tags" +msgstr "" + +msgid "update cvs log cache" +msgstr "" + +msgid "create new cvs log cache" +msgstr "" + +msgid "set commit time fuzz in seconds" +msgstr "" + +msgid "specify cvsroot" +msgstr "" + +msgid "show parent changesets" +msgstr "" + +msgid "show current changeset in ancestor branches" +msgstr "" + +msgid "ignored for compatibility" +msgstr "" + +msgid "hg debugcvsps [OPTION]... [PATH]..." +msgstr "" + +#, python-format +msgid "%s is not a valid revision in current branch" +msgstr "" + +#, python-format +msgid "%s is not available in %s anymore" +msgstr "" + +#, python-format +msgid "cannot find required \"%s\" tool" +msgstr "" + +#, python-format +msgid "running: %s\n" +msgstr "" + +#, python-format +msgid "%s error:\n" +msgstr "" + +#, python-format +msgid "%s %s" +msgstr "" + +#, python-format +msgid "could not open map file %r: %s" +msgstr "" + +#, python-format +msgid "%s: missing or unsupported repository" +msgstr "" + +#, python-format +msgid "convert: %s\n" +msgstr "" + +#, python-format +msgid "%s: unknown repository type" +msgstr "" + +#, python-format +msgid "cycle detected between %s and %s" +msgstr "" + +msgid "not all revisions were sorted" +msgstr "" + +#, python-format +msgid "Writing author map file %s\n" +msgstr "" + +#, python-format +msgid "Ignoring bad line in author map file %s: %s\n" +msgstr "" + +#, python-format +msgid "mapping author %s to %s\n" +msgstr "" + +#, python-format +msgid "overriding mapping for author %s, was %s, will be %s\n" +msgstr "" + +#, python-format +msgid "spliced in %s as parents of %s\n" +msgstr "" + +msgid "scanning source...\n" +msgstr "" + +msgid "sorting...\n" +msgstr "" + +msgid "converting...\n" +msgstr "" + +#, python-format +msgid "source: %s\n" +msgstr "" + +#, python-format +msgid "assuming destination %s\n" +msgstr "" + +#, python-format +msgid "revision %s is not a patchset number or date" +msgstr "" + +msgid "using builtin cvsps\n" +msgstr "" + +#, python-format +msgid "connecting to %s\n" +msgstr "" + +msgid "CVS pserver authentication failed" +msgstr "" + +msgid "server sucks" +msgstr "" + +#, python-format +msgid "%d bytes missing from remote file" +msgstr "" + +#, python-format +msgid "cvs server: %s\n" +msgstr "" + +#, python-format +msgid "unknown CVS response: %s" +msgstr "" + +msgid "collecting CVS rlog\n" +msgstr "" + +#, python-format +msgid "reading cvs log cache %s\n" +msgstr "" + +#, python-format +msgid "cache has %d log entries\n" +msgstr "" + +#, python-format +msgid "error reading cache: %r\n" +msgstr "" + +#, python-format +msgid "running %s\n" +msgstr "" + +#, python-format +msgid "prefix=%r directory=%r root=%r\n" +msgstr "" + +msgid "RCS file must be followed by working file" +msgstr "" + +msgid "must have at least some revisions" +msgstr "" + +msgid "expected revision number" +msgstr "" + +msgid "revision must be followed by date line" +msgstr "" + +#, python-format +msgid "found synthetic revision in %s: %r\n" +msgstr "Synthetische Revision gefundein in %s: %r\n" + +#, python-format +msgid "writing cvs log cache %s\n" +msgstr "" + +#, python-format +msgid "%d log entries\n" +msgstr "" + +msgid "creating changesets\n" +msgstr "" + +msgid "synthetic changeset cannot have multiple parents" +msgstr "" + +#, python-format +msgid "%d changeset entries\n" +msgstr "" + +msgid "Python ElementTree module is not available" +msgstr "" + +#, python-format +msgid "cleaning up %s\n" +msgstr "" + +msgid "internal calling inconsistency" +msgstr "" + +msgid "errors in filemap" +msgstr "" + +#, python-format +msgid "%s:%d: %r already in %s list\n" +msgstr "" + +#, python-format +msgid "%s:%d: unknown directive %r\n" +msgstr "" + +msgid "source repository doesn't support --filemap" +msgstr "" + +#, python-format +msgid "%s does not look like a GNU Arch repo" +msgstr "" + +msgid "cannot find a GNU Arch tool" +msgstr "" + +#, python-format +msgid "analyzing tree version %s...\n" +msgstr "" + +#, python-format +msgid "" +"tree analysis stopped because it points to an unregistered archive %s...\n" +msgstr "" + +#, python-format +msgid "applying revision %s...\n" +msgstr "" + +#, python-format +msgid "computing changeset between %s and %s...\n" +msgstr "" + +#, python-format +msgid "obtaining revision %s...\n" +msgstr "" + +#, python-format +msgid "analysing revision %s...\n" +msgstr "" + +#, python-format +msgid "could not parse cat-log of %s" +msgstr "" + +#, python-format +msgid "%s is not a local Mercurial repo" +msgstr "" + +#, python-format +msgid "initializing destination %s repository\n" +msgstr "" + +msgid "run hg sink pre-conversion action\n" +msgstr "" + +msgid "run hg sink post-conversion action\n" +msgstr "" + +#, python-format +msgid "pulling from %s into %s\n" +msgstr "" + +msgid "updating tags\n" +msgstr "" + +#, python-format +msgid "%s is not a valid start revision" +msgstr "" + +#, python-format +msgid "ignoring: %s\n" +msgstr "" + +msgid "run hg source pre-conversion action\n" +msgstr "" + +msgid "run hg source post-conversion action\n" +msgstr "" + +#, python-format +msgid "%s does not look like a monotone repo" +msgstr "" + +#, python-format +msgid "copying file in renamed directory from '%s' to '%s'" +msgstr "" + +msgid "reading p4 views\n" +msgstr "" + +msgid "collecting p4 changelists\n" +msgstr "" + +msgid "Subversion python bindings could not be loaded" +msgstr "" + +#, python-format +msgid "Subversion python bindings %d.%d found, 1.4 or later required" +msgstr "" + +msgid "Subversion python bindings are too old, 1.4 or later required" +msgstr "" + +#, python-format +msgid "svn: revision %s is not an integer" +msgstr "" + +#, python-format +msgid "svn: start revision %s is not an integer" +msgstr "" + +#, python-format +msgid "no revision found in module %s" +msgstr "" + +#, python-format +msgid "expected %s to be at %r, but not found" +msgstr "" + +#, python-format +msgid "found %s at %r\n" +msgstr "" + +#, python-format +msgid "ignoring empty branch %s\n" +msgstr "" + +#, python-format +msgid "found branch %s at %d\n" +msgstr "" + +msgid "svn: start revision is not supported with with more than one branch" +msgstr "" + +#, python-format +msgid "svn: no revision found after start revision %d" +msgstr "" + +#, python-format +msgid "no tags found at revision %d\n" +msgstr "" + +#, python-format +msgid "ignoring foreign branch %r\n" +msgstr "" + +#, python-format +msgid "%s not found up to revision %d" +msgstr "" + +#, python-format +msgid "branch renamed from %s to %s at %d\n" +msgstr "" + +#, python-format +msgid "reparent to %s\n" +msgstr "" + +#, python-format +msgid "copied to %s from %s@%s\n" +msgstr "" + +#, python-format +msgid "gone from %s\n" +msgstr "" + +#, python-format +msgid "found parent directory %s\n" +msgstr "" + +#, python-format +msgid "base, entry %s %s\n" +msgstr "" + +msgid "munge-o-matic\n" +msgstr "" + +#, python-format +msgid "info: %s %s %s %s\n" +msgstr "" + +#, python-format +msgid "unknown path in revision %d: %s\n" +msgstr "" + +#, python-format +msgid "mark %s came from %s:%d\n" +msgstr "" + +#, python-format +msgid "parsing revision %d (%d changes)\n" +msgstr "" + +#, python-format +msgid "found parent of branch %s at %d: %s\n" +msgstr "" + +msgid "no copyfrom path, don't know what to do.\n" +msgstr "" + +#, python-format +msgid "fetching revision log for \"%s\" from %d to %d\n" +msgstr "" + +#, python-format +msgid "skipping blacklisted revision %d\n" +msgstr "" + +#, python-format +msgid "revision %d has no entries\n" +msgstr "" + +#, python-format +msgid "svn: branch has no revision %s" +msgstr "" + +#, python-format +msgid "%r is not under %r, ignoring\n" +msgstr "" + +#, python-format +msgid "initializing svn repo %r\n" +msgstr "" + +#, python-format +msgid "initializing svn wc %r\n" +msgstr "" + +msgid "unexpected svn output:\n" +msgstr "" + +msgid "unable to cope with svn output" +msgstr "" + +msgid "XXX TAGS NOT IMPLEMENTED YET\n" +msgstr "" + +msgid "" +"\n" +"The `extdiff' Mercurial extension allows you to use external programs\n" +"to compare revisions, or revision with working directory. The external diff\n" +"programs are called with a configurable set of options and two\n" +"non-option arguments: paths to directories containing snapshots of\n" +"files to compare.\n" +"\n" +"To enable this extension:\n" +"\n" +" [extensions]\n" +" hgext.extdiff =\n" +"\n" +"The `extdiff' extension also allows to configure new diff commands, so\n" +"you do not need to type \"hg extdiff -p kdiff3\" always.\n" +"\n" +" [extdiff]\n" +" # add new command that runs GNU diff(1) in 'context diff' mode\n" +" cdiff = gdiff -Nprc5\n" +" ## or the old way:\n" +" #cmd.cdiff = gdiff\n" +" #opts.cdiff = -Nprc5\n" +"\n" +" # add new command called vdiff, runs kdiff3\n" +" vdiff = kdiff3\n" +"\n" +" # add new command called meld, runs meld (no need to name twice)\n" +" meld =\n" +"\n" +" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n" +" # (see http://www.vim.org/scripts/script.php?script_id=102)\n" +" # Non english user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" " +"in\n" +" # your .vimrc\n" +" vimdiff = gvim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)'\n" +"\n" +"You can use -I/-X and list of file or directory names like normal \"hg\n" +"diff\" command. The `extdiff' extension makes snapshots of only needed\n" +"files, so running the external diff program will actually be pretty\n" +"fast (at least faster than having to compare the entire tree).\n" +msgstr "" + +msgid "snapshot files as of some revision" +msgstr "" + +#, python-format +msgid "making snapshot of %d files from rev %s\n" +msgstr "" + +msgid "" +"snapshot files from working directory.\n" +" if not using snapshot, -I/-X does not work and recursive diff\n" +" in tools like kdiff3 and meld displays too many files." +msgstr "" + +#, python-format +msgid "making snapshot of %d files from working directory\n" +msgstr "" + +msgid "" +"Do the actuall diff:\n" +"\n" +" - copy to a temp structure if diffing 2 internal revisions\n" +" - copy to a temp structure if diffing working revision with\n" +" another one and more than 1 file is changed\n" +" - just invoke the diff for a single file in the working dir\n" +" " +msgstr "" + +msgid "cannot specify --rev and --change at the same time" +msgstr "--rev und --change können nicht gleichzeitig angegeben werden" + +#, python-format +msgid "running %r in %s\n" +msgstr "" + +#, python-format +msgid "file changed while diffing. Overwriting: %s (src: %s)\n" +msgstr "" + +msgid "cleaning up temp directory\n" +msgstr "" + +msgid "" +"use external program to diff repository (or selected files)\n" +"\n" +" Show differences between revisions for the specified files, using\n" +" an external program. The default program used is diff, with\n" +" default options \"-Npru\".\n" +"\n" +" To select a different program, use the -p option. The program will\n" +" be passed the names of two directories to compare. To pass\n" +" additional options to the program, use the -o option. These will\n" +" be passed before the names of the directories to compare.\n" +"\n" +" When two revision arguments are given, then changes are shown\n" +" between those revisions. If only one revision is specified then\n" +" that revision is compared to the working directory, and, when no\n" +" revisions are specified, the working directory files are compared\n" +" to its parent." +msgstr "" + +msgid "comparison program to run" +msgstr "" + +msgid "pass option to comparison program" +msgstr "" + +msgid "change made by revision" +msgstr "Von dieser Revision erzeugte Änderungen" + +msgid "hg extdiff [OPT]... [FILE]..." +msgstr "" + +msgid "use closure to save diff command to use" +msgstr "" + +#, python-format +msgid "hg %s [OPTION]... [FILE]..." +msgstr "" + +msgid "pulling, updating and merging in one command" +msgstr "Hole, aktualisiere und führe zusammen in einem Befehl" + + +msgid "" +"pull changes from a remote repository, merge new changes if needed.\n" +"\n" +" This finds all changes from the repository at the specified path\n" +" or URL and adds them to the local repository.\n" +"\n" +" If the pulled changes add a new branch head, the head is\n" +" automatically merged, and the result of the merge is committed.\n" +" Otherwise, the working directory is updated to include the new\n" +" changes.\n" +"\n" +" When a merge occurs, the newly pulled changes are assumed to be\n" +" \"authoritative\". The head of the new changes is used as the first\n" +" parent, with local changes as the second. To switch the merge\n" +" order, use --switch-parent.\n" +"\n" +" See 'hg help dates' for a list of formats valid for -d/--date.\n" +" " +msgstr "" +"Holt Änderungen aus einem entfernten Projektarchiv, führt neue Änderungen " +"zusammen wenn nötig.\n" +"\n" +" Dies selektiert alle Änderungen des Projektarchivs am angegebenen Pfad\n" +" oder der URL und fügt sie dem lokalen Projektarchiv hinzu.\n" +"\n" +" Wenn die geholten Änderungen einen neuen Zweigkopf erzeugen, wird " +"dieser\n" +" Kopf automatisch zusammengeführt, und das Resultat der Zusammenführung\n" +" wird eine neue Version. Andernfalls wird das Arbeitsverzeichnis mit den\n" +" geholten Änderungen aktualisiert.\n" +"\n" +" Sollte eine Zusammenführung ausgelöst werden, gelten die neu geholten\n" +" Änderungen als \"führend\"· Der Kopf der neuen Änderungen wird als\n" +" erste Vorgängerversion genutzt, die lokalen Änderungen darauffolgend.\n" +" Um die Reihenfolge der Zusammenführung zu ändern kann --switch-parent\n" +" genutzt werden.\n" +"\n" +" Siehe 'hg help dates' für eine Liste gültiger Datumsformate für -d/--" +"date.\n" +" " + +msgid "" +"working dir not at branch tip (use \"hg update\" to check out branch tip)" +msgstr "" +"Arbeitsverzeichnis ist nicht Spitze (tip) des Zweiges (nutze 'hg update' um\n" +"auf die Zweigspitze zu wechseln)" + +msgid "outstanding uncommitted merge" +msgstr "Ausstehende nicht versionierte Zusammenführung" + +msgid "outstanding uncommitted changes" +msgstr "Ausstehende nicht versionierte Änderungen" + +msgid "working directory is missing some files" +msgstr "Im Arbeitsverzeichnis fehlen Dateien" + +msgid "" +"multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)" +msgstr "" +"Mehrere Kopfversionen in diesem Zweig (Nutze \"hg heads .\" und \"hg merge" +"\"\n" +"um zusammenzuführen)" + +#, python-format +msgid "pulling from %s\n" +msgstr "Hole von %s\n" + +msgid "fetch -r doesn't work for remote repositories yet" +msgstr "fetch -r funktioniert noch nicht auf entfernten Archiven" + +#, python-format +msgid "" +"not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge" +"\" to merge them)\n" +msgstr "" +"Führe %d andere neue Zweigköpfe nicht zusammen (Nutze \"hg heads .\" und " +"\"hg merge\" um sie zusammenzuführen)\n" + +#, python-format +msgid "updating to %d:%s\n" +msgstr "Aktualisiere auf %d:%s\n" + +#, python-format +msgid "merging with %d:%s\n" +msgstr "Führe zusammen mit %d:%s\n" + +#, python-format +msgid "Automated merge with %s" +msgstr "Automatisierte Zusammenführung mit %s" + +#, python-format +msgid "new changeset %d:%s merges remote changes with local\n" +msgstr "" +"Neuer Änderungssatz %d:%s führt entfernte Änderungen mit lokalen zusammen\n" + +msgid "a specific revision you would like to pull" +msgstr "Revision die geholt werden soll" + +msgid "edit commit message" +msgstr "Editiere Versionsmeldung" + +msgid "edit commit message (DEPRECATED)" +msgstr "Editiere Versionsmeldung (VERALTET)" + +msgid "switch parents when merging" +msgstr "Vertauscht Vorgänger bei Zusammenführung" + +msgid "hg fetch [SOURCE]" +msgstr "hg fetch [QUELLE]" + +msgid " returns of the good and bad signatures" +msgstr "" + +msgid "error while verifying signature" +msgstr "" + +msgid "create a new gpg instance" +msgstr "" + +msgid "" +"\n" +" walk over every sigs, yields a couple\n" +" ((node, version, sig), (filename, linenumber))\n" +" " +msgstr "" + +msgid "get the keys who signed a data" +msgstr "" + +#, python-format +msgid "%s Bad signature from \"%s\"\n" +msgstr "" + +#, python-format +msgid "%s Note: Signature has expired (signed by: \"%s\")\n" +msgstr "" + +#, python-format +msgid "%s Note: This key has expired (signed by: \"%s\")\n" +msgstr "" + +msgid "list signed changesets" +msgstr "" + +#, python-format +msgid "%s:%d node does not exist\n" +msgstr "" + +msgid "verify all the signatures there may be for a particular revision" +msgstr "" + +#, python-format +msgid "No valid signature for %s\n" +msgstr "" + +msgid "associate a string to a key (username, comment)" +msgstr "" + +msgid "" +"add a signature for the current or given revision\n" +"\n" +" If no revision is given, the parent of the working directory is used,\n" +" or tip if no revision is checked out.\n" +"\n" +" See 'hg help dates' for a list of formats valid for -d/--date.\n" +" " +msgstr "" + +msgid "uncommitted merge - please provide a specific revision" +msgstr "Nicht versionierte Zusammenführung - bitte gib eine Revision an" + +msgid "Error while signing" +msgstr "" + +msgid "" +"working copy of .hgsigs is changed (please commit .hgsigs manually or use --" +"force)" +msgstr "" + +#, python-format +msgid "Added signature for changeset %s" +msgstr "" + +msgid "map a manifest into some text" +msgstr "" + +msgid "unknown signature version" +msgstr "" + +msgid "make the signature local" +msgstr "" + +msgid "sign even if the sigfile is modified" +msgstr "" + +msgid "do not commit the sigfile after signing" +msgstr "" + +msgid "the key id to sign with" +msgstr "" + +msgid "commit message" +msgstr "" + +msgid "hg sign [OPTION]... [REVISION]..." +msgstr "" + +msgid "hg sigcheck REVISION" +msgstr "" + +msgid "hg sigs" +msgstr "" + +msgid "" +"show revision graphs in terminal windows\n" +"\n" +"This extension adds a --graph option to the incoming, outgoing and log\n" +"commands. When this options is given, an ascii representation of the\n" +"revision graph is also shown.\n" +msgstr "" + +msgid "" +"cset DAG generator yielding (rev, node, [parents]) tuples\n" +"\n" +" This generator function walks through the revision history from " +"revision\n" +" start to revision stop (which must be less than or equal to start).\n" +" " +msgstr "" + +msgid "" +"file cset DAG generator yielding (rev, node, [parents]) tuples\n" +"\n" +" This generator function walks through the revision history of a single\n" +" file from revision start to revision stop (which must be less than or\n" +" equal to start).\n" +" " +msgstr "" + +msgid "" +"grapher for asciigraph on a list of nodes and their parents\n" +"\n" +" nodes must generate tuples (node, parents, char, lines) where\n" +" - parents must generate the parents of node, in sorted order,\n" +" and max length 2,\n" +" - char is the char to print as the node symbol, and\n" +" - lines are the lines to display next to the node.\n" +" " +msgstr "" + +msgid "" +"prints an ASCII graph of the DAG returned by the grapher\n" +"\n" +" grapher is a generator that emits tuples with the following elements:\n" +"\n" +" - Character to use as node's symbol.\n" +" - List of lines to display as the node's text.\n" +" - Column of the current node in the set of ongoing edges.\n" +" - Edges; a list of (col, next_col) indicating the edges between\n" +" the current node and its parents.\n" +" - Number of columns (ongoing edges) in the current revision.\n" +" - The difference between the number of columns (ongoing edges)\n" +" in the next revision and the number of columns (ongoing edges)\n" +" in the current revision. That is: -1 means one column removed;\n" +" 0 means no columns added or removed; 1 means one column added.\n" +" " +msgstr "" + +#, python-format +msgid "--graph option is incompatible with --%s" +msgstr "" + +msgid "" +"show revision history alongside an ASCII revision graph\n" +"\n" +" Print a revision history alongside a revision graph drawn with\n" +" ASCII characters.\n" +"\n" +" Nodes printed as an @ character are parents of the working\n" +" directory.\n" +" " +msgstr "" + +msgid "" +"show the outgoing changesets alongside an ASCII revision graph\n" +"\n" +" Print the outgoing changesets alongside a revision graph drawn with\n" +" ASCII characters.\n" +"\n" +" Nodes printed as an @ character are parents of the working\n" +" directory.\n" +" " +msgstr "" + +#, python-format +msgid "comparing with %s\n" +msgstr "Vergleiche mit %s\n" + +msgid "no changes found\n" +msgstr "Keine Änderungen gefunden\n" + +msgid "" +"show the incoming changesets alongside an ASCII revision graph\n" +"\n" +" Print the incoming changesets alongside a revision graph drawn with\n" +" ASCII characters.\n" +"\n" +" Nodes printed as an @ character are parents of the working\n" +" directory.\n" +" " +msgstr "" + +msgid "wrap the command" +msgstr "" + +msgid "show the revision DAG" +msgstr "" + +msgid "limit number of changes displayed" +msgstr "Begrenzt die Anzahl der angezeigten Änderungen" + +msgid "show patch" +msgstr "Patch anzeigen" + +msgid "show the specified revision or range" +msgstr "Zeigt die angegebene Revision oder Revisionsfolge" + +msgid "hg glog [OPTION]... [FILE]" +msgstr "" + +msgid "" +"CIA notification\n" +"\n" +"This is meant to be run as a changegroup or incoming hook.\n" +"To configure it, set the following options in your hgrc:\n" +"\n" +"[cia]\n" +"# your registered CIA user name\n" +"user = foo\n" +"# the name of the project in CIA\n" +"project = foo\n" +"# the module (subproject) (optional)\n" +"#module = foo\n" +"# Append a diffstat to the log message (optional)\n" +"#diffstat = False\n" +"# Template to use for log messages (optional)\n" +"#template = {desc}\n" +"{baseurl}/rev/{node}-- {diffstat}\n" +"# Style to use (optional)\n" +"#style = foo\n" +"# The URL of the CIA notification service (optional)\n" +"# You can use mailto: URLs to send by email, eg\n" +"# mailto:cia@cia.vc\n" +"# Make sure to set email.from if you do this.\n" +"#url = http://cia.vc/\n" +"# print message instead of sending it (optional)\n" +"#test = False\n" +"\n" +"[hooks]\n" +"# one of these:\n" +"changegroup.cia = python:hgcia.hook\n" +"#incoming.cia = python:hgcia.hook\n" +"\n" +"[web]\n" +"# If you want hyperlinks (optional)\n" +"baseurl = http://server/path/to/repo\n" +msgstr "" + +msgid " A CIA message " +msgstr "" + +msgid " CIA notification class " +msgstr "" + +#, python-format +msgid "hgcia: sending update to %s\n" +msgstr "" + +msgid " send CIA notification " +msgstr "" + +msgid "email.from must be defined when sending by email" +msgstr "" + +msgid "cia: no user specified" +msgstr "" + +msgid "cia: no project specified" +msgstr "" + +msgid "" +"browsing the repository in a graphical way\n" +"\n" +"The hgk extension allows browsing the history of a repository in a\n" +"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n" +"distributed with Mercurial.)\n" +"\n" +"hgk consists of two parts: a Tcl script that does the displaying and\n" +"querying of information, and an extension to mercurial named hgk.py,\n" +"which provides hooks for hgk to get information. hgk can be found in\n" +"the contrib directory, and hgk.py can be found in the hgext directory.\n" +"\n" +"To load the hgext.py extension, add it to your .hgrc file (you have to\n" +"use your global $HOME/.hgrc file, not one in a repository). You can\n" +"specify an absolute path:\n" +"\n" +" [extensions]\n" +" hgk=/usr/local/lib/hgk.py\n" +"\n" +"Mercurial can also scan the default python library path for a file\n" +"named 'hgk.py' if you set hgk empty:\n" +"\n" +" [extensions]\n" +" hgk=\n" +"\n" +"The hg view command will launch the hgk Tcl script. For this command\n" +"to work, hgk must be in your search path. Alternately, you can specify\n" +"the path to hgk in your .hgrc file:\n" +"\n" +" [hgk]\n" +" path=/location/of/hgk\n" +"\n" +"hgk can make use of the extdiff extension to visualize revisions.\n" +"Assuming you had already configured extdiff vdiff command, just add:\n" +"\n" +" [hgk]\n" +" vdiff=vdiff\n" +"\n" +"Revisions context menu will now display additional entries to fire\n" +"vdiff on hovered and selected revisions." +msgstr "" + +msgid "diff trees from two commits" +msgstr "" + +msgid "output common ancestor information" +msgstr "" + +msgid "cat a specific revision" +msgstr "" + +msgid "cat-file: type or revision not supplied\n" +msgstr "" + +msgid "aborting hg cat-file only understands commits\n" +msgstr "" + +msgid "parse given revisions" +msgstr "" + +msgid "print revisions" +msgstr "" + +msgid "print extension options" +msgstr "" + +msgid "start interactive history viewer" +msgstr "" + +msgid "hg view [-l LIMIT] [REVRANGE]" +msgstr "" + +msgid "generate patch" +msgstr "" + +msgid "recursive" +msgstr "" + +msgid "pretty" +msgstr "" + +msgid "stdin" +msgstr "" + +msgid "detect copies" +msgstr "" + +msgid "search" +msgstr "" + +msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..." +msgstr "" + +msgid "hg debug-cat-file [OPTION]... TYPE FILE" +msgstr "" + +msgid "hg debug-config" +msgstr "" + +msgid "hg debug-merge-base node node" +msgstr "" + +msgid "ignored" +msgstr "" + +msgid "hg debug-rev-parse REV" +msgstr "" + +msgid "header" +msgstr "" + +msgid "topo-order" +msgstr "" + +msgid "parents" +msgstr "" + +msgid "max-count" +msgstr "" + +msgid "hg debug-rev-list [options] revs" +msgstr "" + +msgid "" +"syntax highlighting in hgweb, based on Pygments\n" +"\n" +"It depends on the pygments syntax highlighting library:\n" +"http://pygments.org/\n" +"\n" +"To enable the extension add this to hgrc:\n" +"\n" +"[extensions]\n" +"hgext.highlight =\n" +"\n" +"There is a single configuration option:\n" +"\n" +"[web]\n" +"pygments_style =