# HG changeset patch # User Martin Geisler # Date 1284142756 -7200 # Node ID 97e37994a6c365cd84b5430275e54343307d7031 # Parent 844d25bf65a33f80d8c6884126e81ed178b40fdd# Parent 0f61648062836dfc76f9a3cf7a7c4ea8dc9cad8f merge with stable diff -r 0f6164806283 -r 97e37994a6c3 contrib/bash_completion --- a/contrib/bash_completion Fri Sep 10 16:58:13 2010 +0200 +++ b/contrib/bash_completion Fri Sep 10 20:19:16 2010 +0200 @@ -462,6 +462,17 @@ return 1 } +_hg_cmd_qqueue() +{ + local q + local queues + local opts="--list --create --rename --delete --purge" + + queues=$( _hg_cmd qqueue --quiet ) + + COMPREPLY=( $( compgen -W "${opts} ${queues}" "${cur}" ) ) +} + # hbisect _hg_cmd_bisect() diff -r 0f6164806283 -r 97e37994a6c3 contrib/check-code.py --- a/contrib/check-code.py Fri Sep 10 16:58:13 2010 +0200 +++ b/contrib/check-code.py Fri Sep 10 20:19:16 2010 +0200 @@ -7,7 +7,7 @@ # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -import re, glob +import re, glob, os, sys import optparse def repquote(m): @@ -71,12 +71,20 @@ ] pypats = [ + (r'^\s*def\s*\w+\s*\(.*,\s*\(', + "tuple parameter unpacking not available in Python 3+"), + (r'lambda\s*\(.*,.*\)', + "tuple parameter unpacking not available in Python 3+"), + (r'(?]\w', "missing whitespace in expression"), (r'^\s+\w+=\w+[^,)]$', "missing whitespace in assignment"), (r'.{85}', "line too long"), + (r'.{81}', "warning: line over 80 characters"), (r'[^\n]\Z', "no trailing newline"), # (r'^\s+[^_ ][^_. ]+_[^_]+\s*=', "don't use underbars in identifiers"), # (r'\w*[a-z][A-Z]\w*\s*=', "don't use camelcase in identifiers"), @@ -155,7 +163,7 @@ def __init__(self): self._lastseen = None - def log(self, fname, lineno, line, msg): + def log(self, fname, lineno, line, msg, blame): """print error related a to given line of a given file. The faulty line will also be printed but only once in the case @@ -168,14 +176,26 @@ """ msgid = fname, lineno, line if msgid != self._lastseen: - print "%s:%d:" % (fname, lineno) + if blame: + print "%s:%d (%s):" % (fname, lineno, blame) + else: + print "%s:%d:" % (fname, lineno) print " > %s" % line self._lastseen = msgid print " " + msg _defaultlogger = norepeatlogger() -def checkfile(f, logfunc=_defaultlogger.log, maxerr=None, warnings=False): +def getblame(f): + lines = [] + for l in os.popen('hg annotate -un %s' % f): + start, line = l.split(':', 1) + user, rev = start.split() + lines.append((line[1:-1], user, rev)) + return lines + +def checkfile(f, logfunc=_defaultlogger.log, maxerr=None, warnings=False, + blame=False): """checks style and portability of a given file :f: filepath @@ -186,6 +206,7 @@ return True if no error is found, False otherwise. """ + blamecache = None result = True for name, match, filters, pats in checks: fc = 0 @@ -205,7 +226,16 @@ if not warnings and msg.startswith("warning"): continue if re.search(p, l[1]): - logfunc(f, n + 1, l[0], msg) + bd = "" + if blame: + bd = 'working directory' + if not blamecache: + blamecache = getblame(f) + if n < len(blamecache): + bl, bu, br = blamecache[n] + if bl == l[0]: + bd = '%s@%s' % (bu, br) + logfunc(f, n + 1, l[0], msg, bd) fc += 1 result = False if maxerr is not None and fc >= maxerr: @@ -214,15 +244,16 @@ break return result - if __name__ == "__main__": parser = optparse.OptionParser("%prog [options] [files]") parser.add_option("-w", "--warnings", action="store_true", help="include warning-level checks") parser.add_option("-p", "--per-file", type="int", help="max warnings per file") + parser.add_option("-b", "--blame", action="store_true", + help="use annotate to generate blame info") - parser.set_defaults(per_file=15, warnings=False) + parser.set_defaults(per_file=15, warnings=False, blame=False) (options, args) = parser.parse_args() if len(args) == 0: @@ -231,4 +262,8 @@ check = args for f in check: - checkfile(f, maxerr=options.per_file, warnings=options.warnings) + ret = 0 + if not checkfile(f, maxerr=options.per_file, warnings=options.warnings, + blame=options.blame): + ret = 1 + sys.exit(ret) diff -r 0f6164806283 -r 97e37994a6c3 contrib/compress.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/compress.py Fri Sep 10 20:19:16 2010 +0200 @@ -0,0 +1,62 @@ +# Copyright 2010 Pradeepkumar Gayam +# +# Author(s): +# Pradeepkumar Gayam +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2 or any later version. + + +from mercurial import hg, localrepo +from mercurial.lock import release +import weakref + +def _copyrevlog(ui, src, dst, tr, progress=None): + if progress: + desc = 'adding %s' % progress + total = len(src) + def progress(count): + ui.progress(desc, count, unit=('revisions'), total=total) + else: + progress = lambda x: None + for r in src: + p = [src.node(i) for i in src.parentrevs(r)] + dst.addrevision(src.revision(src.node(r)), tr, src.linkrev(r), + p[0], p[1]) + progress(r) + +def compress(ui, repo, dest): + # activate parentdelta + ui.setconfig('format', 'parentdelta', 'on') + dest = hg.localpath(ui.expandpath(dest)) + target = localrepo.instance(ui, dest, create=True) + + tr = lock = tlock = None + try: + lock = repo.lock() + tlock = target.lock() + tr = target.transaction("compress") + trp = weakref.proxy(tr) + + _copyrevlog(ui, repo.manifest, target.manifest, trp, 'manifest') + + # only keep indexes and filter "data/" prefix and ".i" suffix + datafiles = [fn[5:-2] for fn, f2, size in repo.store.datafiles() + if size and fn.endswith('.i')] + total = len(datafiles) + for cnt, f in enumerate(datafiles): + _copyrevlog(ui, repo.file(f), target.file(f), trp) + ui.progress(('adding files'), cnt, item=f, unit=('file'), + total=total) + + _copyrevlog(ui, repo.changelog, target.changelog, trp, 'changesets') + + tr.close() + finally: + if tr: + tr.release() + release(tlock, lock) + +cmdtable = { + "compress" : (compress, [], "DEST") + } diff -r 0f6164806283 -r 97e37994a6c3 contrib/debugshell.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/debugshell.py Fri Sep 10 20:19:16 2010 +0200 @@ -0,0 +1,21 @@ +# debugshell extension +"""a python shell with repo, changelog & manifest objects""" + +import mercurial +import code + +def debugshell(ui, repo, **opts): + objects = { + 'mercurial': mercurial, + 'repo': repo, + 'cl': repo.changelog, + 'mf': repo.manifest, + } + bannermsg = "loaded repo : %s\n" \ + "using source: %s" % (repo.root, + mercurial.__path__[0]) + code.interact(bannermsg, local=objects) + +cmdtable = { + "debugshell|dbsh": (debugshell, []) +} diff -r 0f6164806283 -r 97e37994a6c3 contrib/hgfixes/__init__.py diff -r 0f6164806283 -r 97e37994a6c3 contrib/hgfixes/fix_bytes.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/hgfixes/fix_bytes.py Fri Sep 10 20:19:16 2010 +0200 @@ -0,0 +1,97 @@ +"""Fixer that changes plain strings to bytes strings.""" + +import re + +from lib2to3 import fixer_base +from lib2to3.pgen2 import token +from lib2to3.fixer_util import Name +from lib2to3.pygram import python_symbols as syms + +_re = re.compile(r'[rR]?[\'\"]') + +# XXX: Implementing a blacklist in 2to3 turned out to be more troublesome than +# blacklisting some modules inside the fixers. So, this is what I came with. + +blacklist = ['mercurial/demandimport.py', + 'mercurial/py3kcompat.py', # valid python 3 already + 'mercurial/i18n.py', + ] + +def isdocstring(node): + def isclassorfunction(ancestor): + symbols = (syms.funcdef, syms.classdef) + # if the current node is a child of a function definition, a class + # definition or a file, then it is a docstring + if ancestor.type == syms.simple_stmt: + try: + while True: + if ancestor.type in symbols: + return True + ancestor = ancestor.parent + except AttributeError: + return False + return False + + def ismodule(ancestor): + # Our child is a docstring if we are a simple statement, and our + # ancestor is file_input. In other words, our child is a lone string in + # the source file. + try: + if (ancestor.type == syms.simple_stmt and + ancestor.parent.type == syms.file_input): + return True + except AttributeError: + return False + + def isdocassignment(ancestor): + # Assigning to __doc__, definitely a string + try: + while True: + if (ancestor.type == syms.expr_stmt and + Name('__doc__') in ancestor.children): + return True + ancestor = ancestor.parent + except AttributeError: + return False + + if ismodule(node.parent) or \ + isdocassignment(node.parent) or \ + isclassorfunction(node.parent): + return True + return False + +def shouldtransform(node): + specialnames = ['__main__'] + + if node.value in specialnames: + return False + + ggparent = node.parent.parent.parent + sggparent = str(ggparent) + + if 'getattr' in sggparent or \ + 'hasattr' in sggparent or \ + 'setattr' in sggparent or \ + 'encode' in sggparent or \ + 'decode' in sggparent: + return False + + return True + +class FixBytes(fixer_base.BaseFix): + + PATTERN = 'STRING' + + def transform(self, node, results): + if self.filename in blacklist: + return + if node.type == token.STRING: + if _re.match(node.value): + if isdocstring(node): + return + if not shouldtransform(node): + return + new = node.clone() + new.value = 'b' + new.value + return new + diff -r 0f6164806283 -r 97e37994a6c3 contrib/hgfixes/fix_bytesmod.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/hgfixes/fix_bytesmod.py Fri Sep 10 20:19:16 2010 +0200 @@ -0,0 +1,63 @@ +"""Fixer that changes bytes % whatever to a function that actually formats +it.""" + +from lib2to3 import fixer_base +from lib2to3.fixer_util import is_tuple, Call, Comma, Name, touch_import + +# XXX: Implementing a blacklist in 2to3 turned out to be more troublesome than +# blacklisting some modules inside the fixers. So, this is what I came with. + +blacklist = ['mercurial/demandimport.py', + 'mercurial/py3kcompat.py', + 'mercurial/i18n.py', + ] + +def isnumberremainder(formatstr, data): + try: + if data.value.isdigit(): + return True + except AttributeError: + return False + +class FixBytesmod(fixer_base.BaseFix): + # XXX: There's one case (I suppose) I can't handle: when a remainder + # operation like foo % bar is performed, I can't really know what the + # contents of foo and bar are. I believe the best approach is to "correct" + # the to-be-converted code and let bytesformatter handle that case in + # runtime. + PATTERN = ''' + term< formatstr=STRING '%' data=STRING > | + term< formatstr=STRING '%' data=atom > | + term< formatstr=NAME '%' data=any > | + term< formatstr=any '%' data=any > + ''' + + def transform(self, node, results): + if self.filename in blacklist: + return + elif self.filename == 'mercurial/util.py': + touch_import('.', 'py3kcompat', node=node) + + formatstr = results['formatstr'].clone() + data = results['data'].clone() + formatstr.prefix = '' # remove spaces from start + + if isnumberremainder(formatstr, data): + return + + # We have two possibilities: + # 1- An identifier or name is passed, it is going to be a leaf, thus, we + # just need to copy its value as an argument to the formatter; + # 2- A tuple is explicitly passed. In this case, we're gonna explode it + # to pass to the formatter + # TODO: Check for normal strings. They don't need to be translated + + if is_tuple(data): + args = [formatstr, Comma().clone()] + \ + [c.clone() for c in data.children[:]] + else: + args = [formatstr, Comma().clone(), data] + + call = Call(Name('bytesformatter', prefix = ' '), args) + return call + diff -r 0f6164806283 -r 97e37994a6c3 contrib/hgfixes/fix_leftover_imports.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/hgfixes/fix_leftover_imports.py Fri Sep 10 20:19:16 2010 +0200 @@ -0,0 +1,108 @@ +"Fixer that translates some APIs ignored by the default 2to3 fixers." + +# FIXME: This fixer has some ugly hacks. Its main design is based on that of +# fix_imports, from lib2to3. Unfortunately, the fix_imports framework only +# changes module names "without dots", meaning it won't work for some changes +# in the email module/package. Thus this fixer was born. I believe that with a +# bit more thinking, a more generic fixer can be implemented, but I'll leave +# that as future work. + +from lib2to3.fixer_util import Name +from lib2to3.fixes import fix_imports + +# This maps the old names to the new names. Note that a drawback of the current +# design is that the dictionary keys MUST have EXACTLY one dot (.) in them, +# otherwise things will break. (If you don't need a module hierarchy, you're +# better of just inherit from fix_imports and overriding the MAPPING dict.) + +MAPPING = {'email.Utils': 'email.utils', + 'email.Errors': 'email.errors', + 'email.Header': 'email.header', + 'email.Parser': 'email.parser', + 'email.Encoders': 'email.encoders', + 'email.MIMEText': 'email.mime.text', + 'email.MIMEBase': 'email.mime.base', + 'email.Generator': 'email.generator', + 'email.MIMEMultipart': 'email.mime.multipart', +} + +def alternates(members): + return "(" + "|".join(map(repr, members)) + ")" + +def build_pattern(mapping=MAPPING): + packages = {} + for key in mapping: + # What we are doing here is the following: with dotted names, we'll + # have something like package_name . Then, we are + # making a dictionary to copy this structure. For example, if + # mapping={'A.B': 'a.b', 'A.C': 'a.c'}, it will generate the dictionary + # {'A': ['b', 'c']} to, then, generate something like "A > + """ % mod_list + + yield """name_import=import_name< 'import' + multiple_imports=dotted_as_names< any* + module_name=dotted_name< %s > + any* > + >""" % mod_list + + packs = ' | '.join(["'%s' trailer<'.' ('%s')>" % (key, + "' | '".join(packages[key])) for key in packages]) + + yield "power< package=(%s) trailer<'.' any > any* >" % packs + +class FixLeftoverImports(fix_imports.FixImports): + # We want to run this fixer after fix_import has run (this shouldn't matter + # for hg, though, as setup3k prefers to run the default fixers first) + mapping = MAPPING + + def build_pattern(self): + return "|".join(build_pattern(self.mapping)) + + def transform(self, node, results): + # Mostly copied from fix_imports.py + import_mod = results.get("module_name") + if import_mod: + try: + mod_name = import_mod.value + except AttributeError: + # XXX: A hack to remove whitespace prefixes and suffixes + mod_name = str(import_mod).strip() + new_name = self.mapping[mod_name] + import_mod.replace(Name(new_name, prefix=import_mod.prefix)) + if "name_import" in results: + # If it's not a "from x import x, y" or "import x as y" import, + # marked its usage to be replaced. + self.replace[mod_name] = new_name + if "multiple_imports" in results: + # This is a nasty hack to fix multiple imports on a line (e.g., + # "import StringIO, urlparse"). The problem is that I can't + # figure out an easy way to make a pattern recognize the keys of + # MAPPING randomly sprinkled in an import statement. + results = self.match(node) + if results: + self.transform(node, results) + else: + # Replace usage of the module. + # Now this is, mostly, a hack + bare_name = results["package"][0] + bare_name_text = ''.join(map(str, results['package'])).strip() + new_name = self.replace.get(bare_name_text) + prefix = results['package'][0].prefix + if new_name: + bare_name.replace(Name(new_name, prefix=prefix)) + results["package"][1].replace(Name('')) + diff -r 0f6164806283 -r 97e37994a6c3 contrib/mergetools.hgrc --- a/contrib/mergetools.hgrc Fri Sep 10 16:58:13 2010 +0200 +++ b/contrib/mergetools.hgrc Fri Sep 10 20:19:16 2010 +0200 @@ -13,6 +13,9 @@ gvimdiff.regname=path gvimdiff.priority=-9 +vimdiff.args=$local $other $base +vimdiff.priority=-10 + merge.checkconflicts=True merge.priority=-100 diff -r 0f6164806283 -r 97e37994a6c3 contrib/perf.py --- a/contrib/perf.py Fri Sep 10 16:58:13 2010 +0200 +++ b/contrib/perf.py Fri Sep 10 20:19:16 2010 +0200 @@ -133,6 +133,16 @@ title = 'diffopts: %s' % (diffopt and ('-' + diffopt) or 'none') timer(d, title) +def perfrevlog(ui, repo, file_, **opts): + from mercurial import revlog + dist = opts['dist'] + def d(): + r = revlog.revlog(lambda fn: open(fn, 'rb'), file_) + for x in xrange(0, len(r), dist): + r.revision(r.node(x)) + + timer(d) + cmdtable = { 'perflookup': (perflookup, []), 'perfparents': (perfparents, []), @@ -149,4 +159,7 @@ [('', 'rename', False, 'ask log to follow renames')]), 'perftemplating': (perftemplating, []), 'perfdiffwd': (perfdiffwd, []), + 'perfrevlog': (perfrevlog, + [('d', 'dist', 100, 'distance between the revisions')], + "[INDEXFILE]"), } diff -r 0f6164806283 -r 97e37994a6c3 contrib/setup3k.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/setup3k.py Fri Sep 10 20:19:16 2010 +0200 @@ -0,0 +1,374 @@ +#!/usr/bin/env python +# +# This is an experimental py3k-enabled mercurial setup script. +# +# 'python setup.py install', or +# 'python setup.py --help' for more options + +from distutils.command.build_py import build_py_2to3 +from lib2to3.refactor import get_fixers_from_package as getfixers + +import sys +if not hasattr(sys, 'version_info') or sys.version_info < (2, 4, 0, 'final'): + raise SystemExit("Mercurial requires Python 2.4 or later.") + +if sys.version_info[0] >= 3: + def b(s): + '''A helper function to emulate 2.6+ bytes literals using string + literals.''' + return s.encode('latin1') +else: + def b(s): + '''A helper function to emulate 2.6+ bytes literals using string + literals.''' + return s + +# Solaris Python packaging brain damage +try: + import hashlib + sha = hashlib.sha1() +except: + try: + import sha + except: + raise SystemExit( + "Couldn't import standard hashlib (incomplete Python install).") + +try: + import zlib +except: + raise SystemExit( + "Couldn't import standard zlib (incomplete Python install).") + +try: + import bz2 +except: + raise SystemExit( + "Couldn't import standard bz2 (incomplete Python install).") + +import os, subprocess, time +import shutil +import tempfile +from distutils import log +from distutils.core import setup, Extension +from distutils.dist import Distribution +from distutils.command.build import build +from distutils.command.build_ext import build_ext +from distutils.command.build_py import build_py +from distutils.spawn import spawn, find_executable +from distutils.ccompiler import new_compiler +from distutils.errors import CCompilerError + +scripts = ['hg'] +if os.name == 'nt': + scripts.append('contrib/win32/hg.bat') + +# simplified version of distutils.ccompiler.CCompiler.has_function +# that actually removes its temporary files. +def hasfunction(cc, funcname): + tmpdir = tempfile.mkdtemp(prefix='hg-install-') + devnull = oldstderr = None + try: + try: + fname = os.path.join(tmpdir, 'funcname.c') + f = open(fname, 'w') + f.write('int main(void) {\n') + f.write(' %s();\n' % funcname) + f.write('}\n') + f.close() + # Redirect stderr to /dev/null to hide any error messages + # from the compiler. + # This will have to be changed if we ever have to check + # for a function on Windows. + devnull = open('/dev/null', 'w') + oldstderr = os.dup(sys.stderr.fileno()) + os.dup2(devnull.fileno(), sys.stderr.fileno()) + objects = cc.compile([fname], output_dir=tmpdir) + cc.link_executable(objects, os.path.join(tmpdir, "a.out")) + except: + return False + return True + finally: + if oldstderr is not None: + os.dup2(oldstderr, sys.stderr.fileno()) + if devnull is not None: + devnull.close() + shutil.rmtree(tmpdir) + +# py2exe needs to be installed to work +try: + import py2exe + py2exeloaded = True + + # Help py2exe to find win32com.shell + try: + import modulefinder + import win32com + for p in win32com.__path__[1:]: # Take the path to win32comext + modulefinder.AddPackagePath("win32com", p) + pn = "win32com.shell" + __import__(pn) + m = sys.modules[pn] + for p in m.__path__[1:]: + modulefinder.AddPackagePath(pn, p) + except ImportError: + pass + +except ImportError: + py2exeloaded = False + pass + +def runcmd(cmd, env): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, env=env) + out, err = p.communicate() + # If root is executing setup.py, but the repository is owned by + # another user (as in "sudo python setup.py install") we will get + # trust warnings since the .hg/hgrc file is untrusted. That is + # fine, we don't want to load it anyway. Python may warn about + # a missing __init__.py in mercurial/locale, we also ignore that. + err = [e for e in err.splitlines() + if not e.startswith(b('Not trusting file')) \ + and not e.startswith(b('warning: Not importing'))] + if err: + return '' + return out + +version = '' + +if os.path.isdir('.hg'): + # Execute hg out of this directory with a custom environment which + # includes the pure Python modules in mercurial/pure. We also take + # care to not use any hgrc files and do no localization. + pypath = ['mercurial', os.path.join('mercurial', 'pure')] + env = {'PYTHONPATH': os.pathsep.join(pypath), + 'HGRCPATH': '', + 'LANGUAGE': 'C'} + if 'LD_LIBRARY_PATH' in os.environ: + env['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH'] + if 'SystemRoot' in os.environ: + # Copy SystemRoot into the custom environment for Python 2.6 + # under Windows. Otherwise, the subprocess will fail with + # error 0xc0150004. See: http://bugs.python.org/issue3440 + env['SystemRoot'] = os.environ['SystemRoot'] + cmd = [sys.executable, 'hg', 'id', '-i', '-t'] + l = runcmd(cmd, env).split() + while len(l) > 1 and l[-1][0].isalpha(): # remove non-numbered tags + l.pop() + if len(l) > 1: # tag found + version = l[-1] + if l[0].endswith('+'): # propagate the dirty status to the tag + version += '+' + elif len(l) == 1: # no tag found + cmd = [sys.executable, 'hg', 'parents', '--template', + '{latesttag}+{latesttagdistance}-'] + version = runcmd(cmd, env) + l[0] + if version.endswith('+'): + version += time.strftime('%Y%m%d') +elif os.path.exists('.hg_archival.txt'): + kw = dict([[t.strip() for t in l.split(':', 1)] + for l in open('.hg_archival.txt')]) + if 'tag' in kw: + version = kw['tag'] + elif 'latesttag' in kw: + version = '%(latesttag)s+%(latesttagdistance)s-%(node).12s' % kw + else: + version = kw.get('node', '')[:12] + +if version: + f = open("mercurial/__version__.py", "w") + f.write('# this file is autogenerated by setup.py\n') + f.write('version = "%s"\n' % version) + f.close() + + +try: + from mercurial import __version__ + version = __version__.version +except ImportError: + version = 'unknown' + +class hgbuildmo(build): + + description = "build translations (.mo files)" + + def run(self): + if not find_executable('msgfmt'): + self.warn("could not find msgfmt executable, no translations " + "will be built") + return + + podir = 'i18n' + if not os.path.isdir(podir): + self.warn("could not find %s/ directory" % podir) + return + + join = os.path.join + for po in os.listdir(podir): + if not po.endswith('.po'): + continue + pofile = join(podir, po) + modir = join('locale', po[:-3], 'LC_MESSAGES') + mofile = join(modir, 'hg.mo') + mobuildfile = join('mercurial', mofile) + cmd = ['msgfmt', '-v', '-o', mobuildfile, pofile] + if sys.platform != 'sunos5': + # msgfmt on Solaris does not know about -c + cmd.append('-c') + self.mkpath(join('mercurial', modir)) + self.make_file([pofile], mobuildfile, spawn, (cmd,)) + +# Insert hgbuildmo first so that files in mercurial/locale/ are found +# when build_py is run next. +build.sub_commands.insert(0, ('build_mo', None)) +# We also need build_ext before build_py. Otherwise, when 2to3 is called (in +# build_py), it will not find osutil & friends, thinking that those modules are +# global and, consequently, making a mess, now that all module imports are +# global. +build.sub_commands.insert(1, ('build_ext', None)) + +Distribution.pure = 0 +Distribution.global_options.append(('pure', None, "use pure (slow) Python " + "code instead of C extensions")) + +class hgbuildext(build_ext): + + def build_extension(self, ext): + try: + build_ext.build_extension(self, ext) + except CCompilerError: + if not hasattr(ext, 'optional') or not ext.optional: + raise + log.warn("Failed to build optional extension '%s' (skipping)", + ext.name) + +class hgbuildpy(build_py_2to3): + fixer_names = sorted(set(getfixers("lib2to3.fixes") + + getfixers("hgfixes"))) + + def finalize_options(self): + build_py.finalize_options(self) + + if self.distribution.pure: + if self.py_modules is None: + self.py_modules = [] + for ext in self.distribution.ext_modules: + if ext.name.startswith("mercurial."): + self.py_modules.append("mercurial.pure.%s" % ext.name[10:]) + self.distribution.ext_modules = [] + + def find_modules(self): + modules = build_py.find_modules(self) + for module in modules: + if module[0] == "mercurial.pure": + if module[1] != "__init__": + yield ("mercurial", module[1], module[2]) + else: + yield module + + def run(self): + # In the build_py_2to3 class, self.updated_files = [], but I couldn't + # see when that variable was updated to point to the updated files, as + # its names suggests. Thus, I decided to just find_all_modules and feed + # them to 2to3. Unfortunately, subsequent calls to setup3k.py will + # incur in 2to3 analysis overhead. + self.updated_files = [i[2] for i in self.find_all_modules()] + + # Base class code + if self.py_modules: + self.build_modules() + if self.packages: + self.build_packages() + self.build_package_data() + + # 2to3 + self.run_2to3(self.updated_files) + + # Remaining base class code + self.byte_compile(self.get_outputs(include_bytecode=0)) + +cmdclass = {'build_mo': hgbuildmo, + 'build_ext': hgbuildext, + 'build_py': hgbuildpy} + +packages = ['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert', + 'hgext.highlight', 'hgext.zeroconf'] + +pymodules = [] + +extmodules = [ + Extension('mercurial.base85', ['mercurial/base85.c']), + Extension('mercurial.bdiff', ['mercurial/bdiff.c']), + Extension('mercurial.diffhelpers', ['mercurial/diffhelpers.c']), + Extension('mercurial.mpatch', ['mercurial/mpatch.c']), + Extension('mercurial.parsers', ['mercurial/parsers.c']), + ] + +# disable osutil.c under windows + python 2.4 (issue1364) +if sys.platform == 'win32' and sys.version_info < (2, 5, 0, 'final'): + pymodules.append('mercurial.pure.osutil') +else: + extmodules.append(Extension('mercurial.osutil', ['mercurial/osutil.c'])) + +if sys.platform == 'linux2' and os.uname()[2] > '2.6': + # The inotify extension is only usable with Linux 2.6 kernels. + # You also need a reasonably recent C library. + # In any case, if it fails to build the error will be skipped ('optional'). + cc = new_compiler() + if hasfunction(cc, 'inotify_add_watch'): + inotify = Extension('hgext.inotify.linux._inotify', + ['hgext/inotify/linux/_inotify.c'], + ['mercurial']) + inotify.optional = True + extmodules.append(inotify) + packages.extend(['hgext.inotify', 'hgext.inotify.linux']) + +packagedata = {'mercurial': ['locale/*/LC_MESSAGES/hg.mo', + 'help/*.txt']} + +def ordinarypath(p): + return p and p[0] != '.' and p[-1] != '~' + +for root in ('templates',): + for curdir, dirs, files in os.walk(os.path.join('mercurial', root)): + curdir = curdir.split(os.sep, 1)[1] + dirs[:] = filter(ordinarypath, dirs) + for f in filter(ordinarypath, files): + f = os.path.join(curdir, f) + packagedata['mercurial'].append(f) + +datafiles = [] +setupversion = version +extra = {} + +if py2exeloaded: + extra['console'] = [ + {'script':'hg', + 'copyright':'Copyright (C) 2005-2010 Matt Mackall and others', + 'product_version':version}] + +if os.name == 'nt': + # Windows binary file versions for exe/dll files must have the + # form W.X.Y.Z, where W,X,Y,Z are numbers in the range 0..65535 + setupversion = version.split('+', 1)[0] + +setup(name='mercurial', + version=setupversion, + author='Matt Mackall', + author_email='mpm@selenic.com', + url='http://mercurial.selenic.com/', + description='Scalable distributed SCM', + license='GNU GPLv2+', + scripts=scripts, + packages=packages, + py_modules=pymodules, + ext_modules=extmodules, + data_files=datafiles, + package_data=packagedata, + cmdclass=cmdclass, + options=dict(py2exe=dict(packages=['hgext', 'email']), + bdist_mpkg=dict(zipdist=True, + license='COPYING', + readme='contrib/macosx/Readme.html', + welcome='contrib/macosx/Welcome.html')), + **extra) diff -r 0f6164806283 -r 97e37994a6c3 contrib/zsh_completion --- a/contrib/zsh_completion Fri Sep 10 16:58:13 2010 +0200 +++ b/contrib/zsh_completion Fri Sep 10 20:19:16 2010 +0200 @@ -14,7 +14,7 @@ # compinit # # Copyright (C) 2005, 2006 Steve Borho -# Copyright (C) 2006-9 Brendan Cully +# Copyright (C) 2006-10 Brendan Cully # # Permission is hereby granted, without written agreement and without # licence or royalty fees, to use, copy, modify, and distribute this @@ -766,6 +766,31 @@ ':revision:_hg_tags' } +## extensions ## + +# bookmarks +_hg_bookmarks() { + typeset -a bookmark bookmarks + + _hg_cmd bookmarks | while read -A bookmark + do + if test -z ${bookmark[-1]:#[0-9]*} + then + bookmarks+=($bookmark[-2]) + fi + done + (( $#bookmarks )) && _describe -t bookmarks 'bookmarks' bookmarks +} + +_hg_cmd_bookmarks() { + _arguments -s -w : $_hg_global_opts \ + '(--force -f)'{-f,--force}'[force]' \ + '(--rev -r --delete -d --rename -m)'{-r+,--rev}'[revision]:revision:_hg_tags' \ + '(--rev -r --delete -d --rename -m)'{-d,--delete}'[delete a given bookmark]' \ + '(--rev -r --delete -d --rename -m)'{-m+,--rename}'[rename a given bookmark]:bookmark:_hg_bookmarks' \ + ':bookmark:_hg_bookmarks' +} + # HGK _hg_cmd_view() { _arguments -s -w : $_hg_global_opts \ @@ -901,6 +926,7 @@ '(--merge -m)'{-m+,--merge}'[merge from another queue]:' \ '(--name -n)'{-n+,--name}'[merge queue name]:' \ '(--force -f)'{-f,--force}'[apply if the patch has rejects]' \ + '--move[reorder patch series and apply only the patch]' \ ':patch:_hg_qunapplied' } @@ -947,4 +973,34 @@ ':revision:_hg_tags' } +# Patchbomb +_hg_cmd_email() { + _arguments -s -w : $_hg_global_opts $_hg_remote_opts \ + '(--git -g)'{-g,--git}'[use git extended diff format]' \ + '--plain[omit hg patch header]' \ + '(--outgoing -o)'{-o,--outgoing}'[send changes not found in the target repository]' \ + '(--bundle -b)'{-b,--bundle}'[send changes not in target as a binary bundle]' \ + '--bundlename[name of the bundle attachment file (default: bundle)]:' \ + '*'{-r+,--rev}'[search in given revision range]:revision:_hg_revrange' \ + '--force[run even when remote repository is unrelated (with -b/--bundle)]' \ + '*--base[a base changeset to specify instead of a destination (with -b/--bundle)]:revision:_hg_tags' \ + '--intro[send an introduction email for a single patch]' \ + '(--inline -i --attach -a)'{-a,--attach}'[send patches as attachments]' \ + '(--attach -a --inline -i)'{-i,--inline}'[send patches as inline attachments]' \ + '*--bcc[email addresses of blind carbon copy recipients]:email:' \ + '*'{-c+,--cc}'[email addresses of copy recipients]:email:' \ + '(--diffstat -d)'{-d,--diffstat}'[add diffstat output to messages]' \ + '--date[use the given date as the sending date]:date:' \ + '--desc[use the given file as the series description]:files:_files' \ + '(--from -f)'{-f,--from}'[email address of sender]:email:' \ + '(--test -n)'{-n,--test}'[print messages that would be sent]' \ + '(--mbox -m)'{-m,--mbox}'[write messages to mbox file instead of sending them]:file:' \ + '*--reply-to[email addresses replies should be sent to]:email:' \ + '(--subject -s)'{-s,--subject}'[subject of first message (intro or single patch)]:subject:' \ + '--in-reply-to[message identifier to reply to]:msgid:' \ + '*--flag[flags to add in subject prefixes]:flag:' \ + '*'{-t,--to}'[email addresses of recipients]:email:' \ + ':revision:_hg_revrange' +} + _hg "$@" diff -r 0f6164806283 -r 97e37994a6c3 hgext/bookmarks.py --- a/hgext/bookmarks.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/bookmarks.py Fri Sep 10 20:19:16 2010 +0200 @@ -299,7 +299,7 @@ self.ui.debug("checking for updated bookmarks\n") rb = remote.listkeys('bookmarks') - changes = 0 + changed = False for k in rb.keys(): if k in self._bookmarks: nr, nl = rb[k], self._bookmarks[k] @@ -310,12 +310,12 @@ continue if cr in cl.descendants(): self._bookmarks[k] = cr.node() - changes += 1 + changed = True self.ui.status(_("updating bookmark %s\n") % k) else: self.ui.warn(_("not updating divergent" " bookmark %s\n") % k) - if changes: + if changed: write(repo) return result @@ -469,7 +469,7 @@ lmarks = repo.listkeys('bookmarks') rmarks = remote.listkeys('bookmarks') - diff = set(rmarks) - set(lmarks) + diff = sorted(set(rmarks) - set(lmarks)) for k in diff: ui.write(" %-25s %s\n" % (k, rmarks[k][:12])) diff -r 0f6164806283 -r 97e37994a6c3 hgext/bugzilla.py --- a/hgext/bugzilla.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/bugzilla.py Fri Sep 10 20:19:16 2010 +0200 @@ -437,5 +437,5 @@ bz.update(id, ctx) bz.notify(ids, util.email(ctx.user())) except MySQLdb.MySQLError, err: - raise util.Abort(_('database error: %s') % err[1]) + raise util.Abort(_('database error: %s') % err.args[1]) diff -r 0f6164806283 -r 97e37994a6c3 hgext/churn.py --- a/hgext/churn.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/churn.py Fri Sep 10 20:19:16 2010 +0200 @@ -155,7 +155,8 @@ if opts.get('diffstat'): width -= 15 - def format(name, (added, removed)): + def format(name, diffstat): + added, removed = diffstat return "%s %15s %s%s\n" % (pad(name, maxname), '+%d/-%d' % (added, removed), ui.label('+' * charnum(added), diff -r 0f6164806283 -r 97e37994a6c3 hgext/color.py --- a/hgext/color.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/color.py Fri Sep 10 20:19:16 2010 +0200 @@ -62,6 +62,11 @@ bookmarks.current = green + branches.active = none + branches.closed = black bold + branches.current = green + branches.inactive = none + The color extension will try to detect whether to use ANSI codes or Win32 console APIs, unless it is made explicit:: @@ -72,9 +77,9 @@ ''' -import os, sys +import os -from mercurial import commands, dispatch, extensions, ui as uimod +from mercurial import commands, dispatch, extensions, ui as uimod, util from mercurial.i18n import _ # start and stop parameters for effects @@ -87,6 +92,10 @@ 'cyan_background': 46, 'white_background': 47} _styles = {'grep.match': 'red bold', + 'branches.active': 'none', + 'branches.closed': 'black bold', + 'branches.current': 'green', + 'branches.inactive': 'none', 'diff.changed': 'white', 'diff.deleted': 'red', 'diff.diffline': 'bold', @@ -200,9 +209,12 @@ elif mode != 'ansi': return def colorcmd(orig, ui_, opts, cmd, cmdfunc): - if (opts['color'] == 'always' or - (opts['color'] == 'auto' and (os.environ.get('TERM') != 'dumb' - and ui_.formatted()))): + coloropt = opts['color'] + auto = coloropt == 'auto' + always = util.parsebool(coloropt) + if (always or + (always is None and + (auto and (os.environ.get('TERM') != 'dumb' and ui_.formatted())))): colorui._colormode = mode colorui.__bases__ = (ui_.__class__,) ui_.__class__ = colorui @@ -211,41 +223,45 @@ return orig(ui_, opts, cmd, cmdfunc) extensions.wrapfunction(dispatch, '_runcommand', colorcmd) -commands.globalopts.append(('', 'color', 'auto', - _("when to colorize (always, auto, or never)"), - _('TYPE'))) +commands.globalopts.append( + ('', 'color', 'auto', + _("when to colorize (boolean, always, auto, or never)"), + _('TYPE'))) try: - import re, pywintypes - from win32console import * + import re, pywintypes, win32console as win32c # http://msdn.microsoft.com/en-us/library/ms682088%28VS.85%29.aspx w32effects = { 'none': 0, 'black': 0, - 'red': FOREGROUND_RED, - 'green': FOREGROUND_GREEN, - 'yellow': FOREGROUND_RED | FOREGROUND_GREEN, - 'blue': FOREGROUND_BLUE, - 'magenta': FOREGROUND_BLUE | FOREGROUND_RED, - 'cyan': FOREGROUND_BLUE | FOREGROUND_GREEN, - 'white': FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, - 'bold': FOREGROUND_INTENSITY, + 'red': win32c.FOREGROUND_RED, + 'green': win32c.FOREGROUND_GREEN, + 'yellow': win32c.FOREGROUND_RED | win32c.FOREGROUND_GREEN, + 'blue': win32c.FOREGROUND_BLUE, + 'magenta': win32c.FOREGROUND_BLUE | win32c.FOREGROUND_RED, + 'cyan': win32c.FOREGROUND_BLUE | win32c.FOREGROUND_GREEN, + 'white': (win32c.FOREGROUND_RED | win32c.FOREGROUND_GREEN | + win32c.FOREGROUND_BLUE), + 'bold': win32c.FOREGROUND_INTENSITY, 'black_background': 0, - 'red_background': BACKGROUND_RED, - 'green_background': BACKGROUND_GREEN, - 'yellow_background': BACKGROUND_RED | BACKGROUND_GREEN, - 'blue_background': BACKGROUND_BLUE, - 'purple_background': BACKGROUND_BLUE | BACKGROUND_RED, - 'cyan_background': BACKGROUND_BLUE | BACKGROUND_GREEN, - 'white_background': BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE, - 'bold_background': BACKGROUND_INTENSITY, - 'underline': COMMON_LVB_UNDERSCORE, # double-byte charsets only - 'inverse': COMMON_LVB_REVERSE_VIDEO, # double-byte charsets only + 'red_background': win32c.BACKGROUND_RED, + 'green_background': win32c.BACKGROUND_GREEN, + 'yellow_background': win32c.BACKGROUND_RED | win32c.BACKGROUND_GREEN, + 'blue_background': win32c.BACKGROUND_BLUE, + 'purple_background': win32c.BACKGROUND_BLUE | win32c.BACKGROUND_RED, + 'cyan_background': win32c.BACKGROUND_BLUE | win32c.BACKGROUND_GREEN, + 'white_background': (win32c.BACKGROUND_RED | win32c.BACKGROUND_GREEN | + win32c.BACKGROUND_BLUE), + 'bold_background': win32c.BACKGROUND_INTENSITY, + 'underline': win32c.COMMON_LVB_UNDERSCORE, # double-byte charsets only + 'inverse': win32c.COMMON_LVB_REVERSE_VIDEO, # double-byte charsets only } - stdout = GetStdHandle(STD_OUTPUT_HANDLE) try: + stdout = win32c.GetStdHandle(win32c.STD_OUTPUT_HANDLE) + if stdout is None: + raise ImportError() origattr = stdout.GetConsoleScreenBufferInfo()['Attributes'] except pywintypes.error: # stdout may be defined but not support diff -r 0f6164806283 -r 97e37994a6c3 hgext/convert/__init__.py --- a/hgext/convert/__init__.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/convert/__init__.py Fri Sep 10 20:19:16 2010 +0200 @@ -70,10 +70,10 @@ updated on each commit copied, so :hg:`convert` 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 authormap 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:: source author = destination author @@ -89,7 +89,7 @@ rename path/to/source path/to/destination - Comment lines start with ``#``. A specificed path matches if it + Comment lines start with ``#``. A specified path matches if it equals the full relative name of a file or one of its parent directories. The ``include`` or ``exclude`` directive with the longest matching path applies, so line order does not matter. @@ -99,8 +99,8 @@ exclusion of all other files and directories not explicitly included. The ``exclude`` directive causes files or directories to be omitted. The ``rename`` directive renames a file or directory if - is converted. To rename from a subdirectory into the root of the - repository, use ``.`` as the path to rename to. + it is converted. 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 @@ -274,16 +274,19 @@ cmdtable = { "convert": (convert, - [('A', 'authors', '', - _('username mapping filename'), _('FILE')), + [('', 'authors', '', + _('username mapping filename (DEPRECATED, use --authormap instead)'), + _('FILE')), + ('s', 'source-type', '', + _('source repository type'), _('TYPE')), ('d', 'dest-type', '', _('destination repository type'), _('TYPE')), + ('r', 'rev', '', + _('import up to target revision REV'), _('REV')), + ('A', 'authormap', '', + _('remap usernames using this file'), _('FILE')), ('', 'filemap', '', _('remap file names using contents of file'), _('FILE')), - ('r', 'rev', '', - _('import up to target revision REV'), _('REV')), - ('s', 'source-type', '', - _('source repository type'), _('TYPE')), ('', 'splicemap', '', _('splice synthesized history into place'), _('FILE')), ('', 'branchmap', '', diff -r 0f6164806283 -r 97e37994a6c3 hgext/convert/bzr.py --- a/hgext/convert/bzr.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/convert/bzr.py Fri Sep 10 20:19:16 2010 +0200 @@ -61,7 +61,7 @@ try: tree = dir.open_workingtree(recommend_upgrade=False) branch = tree.branch - except (errors.NoWorkingTree, errors.NotLocalUrl), e: + except (errors.NoWorkingTree, errors.NotLocalUrl): tree = None branch = dir.open_branch() if (tree is not None and tree.bzrdir.root_transport.base != diff -r 0f6164806283 -r 97e37994a6c3 hgext/convert/convcmd.py --- a/hgext/convert/convcmd.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/convert/convcmd.py Fri Sep 10 20:19:16 2010 +0200 @@ -112,8 +112,8 @@ if authorfile and os.path.exists(authorfile): self.readauthormap(authorfile) # Extend/Override with new author map if necessary - if opts.get('authors'): - self.readauthormap(opts.get('authors')) + if opts.get('authormap'): + self.readauthormap(opts.get('authormap')) self.authorfile = self.dest.authorfile() self.splicemap = mapfile(ui, opts.get('splicemap')) @@ -392,6 +392,10 @@ orig_encoding = encoding.encoding encoding.encoding = 'UTF-8' + # support --authors as an alias for --authormap + if not opts.get('authormap'): + opts['authormap'] = opts.get('authors') + if not dest: dest = hg.defaultdest(src) + "-hg" ui.status(_("assuming destination %s\n") % dest) diff -r 0f6164806283 -r 97e37994a6c3 hgext/convert/cvs.py --- a/hgext/convert/cvs.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/convert/cvs.py Fri Sep 10 20:19:16 2010 +0200 @@ -53,8 +53,6 @@ try: os.chdir(self.path) id = None - state = 0 - filerevids = {} cache = 'update' if not self.ui.configbool('convert', 'cvsps.cache', True): diff -r 0f6164806283 -r 97e37994a6c3 hgext/convert/filemap.py --- a/hgext/convert/filemap.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/convert/filemap.py Fri Sep 10 20:19:16 2010 +0200 @@ -33,10 +33,20 @@ def parse(self, path): errs = 0 def check(name, mapping, listname): + if not name: + self.ui.warn(_('%s:%d: path to %s is missing\n') % + (lex.infile, lex.lineno, listname)) + return 1 if name in mapping: self.ui.warn(_('%s:%d: %r already in %s list\n') % (lex.infile, lex.lineno, name, listname)) return 1 + if (name.startswith('/') or + name.endswith('/') or + '//' in name): + self.ui.warn(_('%s:%d: superfluous / in %s %r\n') % + (lex.infile, lex.lineno, listname, name)) + return 1 return 0 lex = shlex.shlex(open(path), path, True) lex.wordchars += '!@#$%^&*()-=+[]{}|;:,./<>?' @@ -298,7 +308,9 @@ self.origparents[rev] = parents - if len(mparents) < 2 and not self.wanted(rev, wp): + closed = 'close' in self.commits[rev].extra + + if len(mparents) < 2 and not closed and not self.wanted(rev, wp): # We don't want this revision. # Update our state and tell the convert process to map this # revision to the same revision its parent as mapped to. diff -r 0f6164806283 -r 97e37994a6c3 hgext/convert/git.py --- a/hgext/convert/git.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/convert/git.py Fri Sep 10 20:19:16 2010 +0200 @@ -7,6 +7,7 @@ import os from mercurial import util +from mercurial.node import hex, nullid from mercurial.i18n import _ from common import NoRepo, commit, converter_source, checktool @@ -59,7 +60,7 @@ return heads def catfile(self, rev, type): - if rev == "0" * 40: + if rev == hex(nullid): raise IOError() data, ret = self.gitread("git cat-file %s %s" % (type, rev)) if ret: diff -r 0f6164806283 -r 97e37994a6c3 hgext/convert/hg.py --- a/hgext/convert/hg.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/convert/hg.py Fri Sep 10 20:19:16 2010 +0200 @@ -175,7 +175,8 @@ if self.filemapmode and nparents == 1: man = self.repo.manifest mnode = self.repo.changelog.read(bin(p2))[0] - if not man.cmp(m1node, man.revision(mnode)): + closed = 'close' in commit.extra + if not closed and not man.cmp(m1node, man.revision(mnode)): self.ui.status(_("filtering out empty revision\n")) self.repo.rollback() return parent diff -r 0f6164806283 -r 97e37994a6c3 hgext/convert/transport.py --- a/hgext/convert/transport.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/convert/transport.py Fri Sep 10 20:19:16 2010 +0200 @@ -98,9 +98,8 @@ svn.ra.reparent(self.ra, self.svn_url.encode('utf8')) class Reporter(object): - def __init__(self, (reporter, report_baton)): - self._reporter = reporter - self._baton = report_baton + def __init__(self, reporter_data): + self._reporter, self._baton = reporter_data def set_path(self, path, revnum, start_empty, lock_token, pool=None): svn.ra.reporter2_invoke_set_path(self._reporter, self._baton, diff -r 0f6164806283 -r 97e37994a6c3 hgext/eol.py --- a/hgext/eol.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/eol.py Fri Sep 10 20:19:16 2010 +0200 @@ -66,7 +66,7 @@ """ from mercurial.i18n import _ -from mercurial import util, config, extensions, commands, match, cmdutil +from mercurial import util, config, extensions, match import re, os # Matches a lone LF, i.e., one that is not part of CRLF. diff -r 0f6164806283 -r 97e37994a6c3 hgext/hgcia.py --- a/hgext/hgcia.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/hgcia.py Fri Sep 10 20:19:16 2010 +0200 @@ -40,7 +40,7 @@ """ from mercurial.i18n import _ -from mercurial.node import * +from mercurial.node import bin, short from mercurial import cmdutil, patch, templater, util, mail import email.Parser diff -r 0f6164806283 -r 97e37994a6c3 hgext/inotify/client.py --- a/hgext/inotify/client.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/inotify/client.py Fri Sep 10 20:19:16 2010 +0200 @@ -21,18 +21,16 @@ Raise QueryFailed if something went wrong """ def decorated_function(self, *args): - result = None try: return function(self, *args) except (OSError, socket.error), err: autostart = self.ui.configbool('inotify', 'autostart', True) - if err[0] == errno.ECONNREFUSED: + if err.args[0] == errno.ECONNREFUSED: self.ui.warn(_('inotify-client: found dead inotify server ' 'socket; removing it\n')) os.unlink(os.path.join(self.root, '.hg', 'inotify.sock')) - if err[0] in (errno.ECONNREFUSED, errno.ENOENT) and autostart: - self.ui.debug('(starting inotify server)\n') + if err.args[0] in (errno.ECONNREFUSED, errno.ENOENT) and autostart: try: try: server.start(self.ui, self.dirstate, self.root, @@ -49,13 +47,13 @@ return function(self, *args) except socket.error, err: self.ui.warn(_('inotify-client: could not talk to new ' - 'inotify server: %s\n') % err[-1]) - elif err[0] in (errno.ECONNREFUSED, errno.ENOENT): + 'inotify server: %s\n') % err.args[-1]) + elif err.args[0] in (errno.ECONNREFUSED, errno.ENOENT): # silently ignore normal errors if autostart is False self.ui.debug('(inotify server not running)\n') else: self.ui.warn(_('inotify-client: failed to contact inotify ' - 'server: %s\n') % err[-1]) + 'server: %s\n') % err.args[-1]) self.ui.traceback() raise QueryFailed('inotify query failed') @@ -75,7 +73,7 @@ try: self.sock.connect(sockpath) except socket.error, err: - if err[0] == "AF_UNIX path too long": + if err.args[0] == "AF_UNIX path too long": sockpath = os.readlink(sockpath) self.sock.connect(sockpath) else: diff -r 0f6164806283 -r 97e37994a6c3 hgext/inotify/linux/_inotify.c --- a/hgext/inotify/linux/_inotify.c Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/inotify/linux/_inotify.c Fri Sep 10 20:19:16 2010 +0200 @@ -15,6 +15,15 @@ #include #include +#include + +/* Variables used in the event string representation */ +static PyObject *join; +static PyObject *er_wm; +static PyObject *er_wmc; +static PyObject *er_wmn; +static PyObject *er_wmcn; + static PyObject *init(PyObject *self, PyObject *args) { PyObject *ret = NULL; @@ -312,8 +321,8 @@ }; PyDoc_STRVAR( - event_doc, - "event: Structure describing an inotify event."); + event_doc, + "event: Structure describing an inotify event."); static PyObject *event_new(PyTypeObject *t, PyObject *a, PyObject *k) { @@ -327,20 +336,14 @@ Py_XDECREF(evt->cookie); Py_XDECREF(evt->name); - (*evt->ob_type->tp_free)(evt); + Py_TYPE(evt)->tp_free(evt); } static PyObject *event_repr(struct event *evt) { - int wd = PyInt_AsLong(evt->wd); int cookie = evt->cookie == Py_None ? -1 : PyInt_AsLong(evt->cookie); PyObject *ret = NULL, *pymasks = NULL, *pymask = NULL; - PyObject *join = NULL; - char *maskstr; - - join = PyString_FromString("|"); - if (join == NULL) - goto bail; + PyObject *tuple = NULL, *formatstr = NULL; pymasks = decode_mask(PyInt_AsLong(evt->mask)); if (pymasks == NULL) @@ -350,33 +353,35 @@ if (pymask == NULL) goto bail; - maskstr = PyString_AsString(pymask); - if (evt->name != Py_None) { - PyObject *pyname = PyString_Repr(evt->name, 1); - char *name = pyname ? PyString_AsString(pyname) : "???"; - - if (cookie == -1) - ret = PyString_FromFormat( - "event(wd=%d, mask=%s, name=%s)", - wd, maskstr, name); - else - ret = PyString_FromFormat("event(wd=%d, mask=%s, " - "cookie=0x%x, name=%s)", - wd, maskstr, cookie, name); - - Py_XDECREF(pyname); + if (cookie == -1) { + formatstr = er_wmn; + tuple = PyTuple_Pack(3, evt->wd, pymask, evt->name); + } + else { + formatstr = er_wmcn; + tuple = PyTuple_Pack(4, evt->wd, pymask, + evt->cookie, evt->name); + } } else { - if (cookie == -1) - ret = PyString_FromFormat("event(wd=%d, mask=%s)", - wd, maskstr); + if (cookie == -1) { + formatstr = er_wm; + tuple = PyTuple_Pack(2, evt->wd, pymask); + } else { - ret = PyString_FromFormat( - "event(wd=%d, mask=%s, cookie=0x%x)", - wd, maskstr, cookie); + formatstr = er_wmc; + tuple = PyTuple_Pack(3, evt->wd, pymask, evt->cookie); } } + if (tuple == NULL) + goto bail; + + ret = PyNumber_Remainder(formatstr, tuple); + + if (ret == NULL) + goto bail; + goto done; bail: Py_CLEAR(ret); @@ -384,14 +389,13 @@ done: Py_XDECREF(pymask); Py_XDECREF(pymasks); - Py_XDECREF(join); + Py_XDECREF(tuple); return ret; } static PyTypeObject event_type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT(NULL, 0) "_inotify.event", /*tp_name*/ sizeof(struct event), /*tp_basicsize*/ 0, /*tp_itemsize*/ @@ -561,6 +565,17 @@ return ret; } +static int init_globals(void) +{ + join = PyString_FromString("|"); + er_wm = PyString_FromString("event(wd=%d, mask=%s)"); + er_wmn = PyString_FromString("event(wd=%d, mask=%s, name=%s)"); + er_wmc = PyString_FromString("event(wd=%d, mask=%s, cookie=0x%x)"); + er_wmcn = PyString_FromString("event(wd=%d, mask=%s, cookie=0x%x, name=%s)"); + + return join && er_wm && er_wmn && er_wmc && er_wmcn; +} + PyDoc_STRVAR( read_doc, "read(fd, bufsize[=65536]) -> list_of_events\n" @@ -585,6 +600,35 @@ {NULL}, }; +#ifdef IS_PY3K +static struct PyModuleDef _inotify_module = { + PyModuleDef_HEAD_INIT, + "_inotify", + doc, + -1, + methods +}; + +PyMODINIT_FUNC PyInit__inotify(void) +{ + PyObject *mod, *dict; + + mod = PyModule_Create(&_inotify_module); + + if (mod == NULL) + return NULL; + + if (!init_globals()) + return; + + dict = PyModule_GetDict(mod); + + if (dict) + define_consts(dict); + + return mod; +} +#else void init_inotify(void) { PyObject *mod, *dict; @@ -592,6 +636,9 @@ if (PyType_Ready(&event_type) == -1) return; + if (!init_globals()) + return; + mod = Py_InitModule3("_inotify", methods, doc); dict = PyModule_GetDict(mod); @@ -599,3 +646,4 @@ if (dict) define_consts(dict); } +#endif diff -r 0f6164806283 -r 97e37994a6c3 hgext/inotify/linuxserver.py --- a/hgext/inotify/linuxserver.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/inotify/linuxserver.py Fri Sep 10 20:19:16 2010 +0200 @@ -117,7 +117,7 @@ try: events = cls.poll.poll(timeout) except select.error, err: - if err[0] == errno.EINTR: + if err.args[0] == errno.EINTR: continue raise if events: diff -r 0f6164806283 -r 97e37994a6c3 hgext/inotify/server.py --- a/hgext/inotify/server.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/inotify/server.py Fri Sep 10 20:19:16 2010 +0200 @@ -336,10 +336,10 @@ try: self.sock.bind(self.sockpath) except socket.error, err: - if err[0] == errno.EADDRINUSE: + if err.args[0] == errno.EADDRINUSE: raise AlreadyStartedException(_('cannot start: socket is ' 'already bound')) - if err[0] == "AF_UNIX path too long": + if err.args[0] == "AF_UNIX path too long": if os.path.islink(self.sockpath) and \ not os.path.exists(self.sockpath): raise util.Abort('inotify-server: cannot start: ' @@ -437,7 +437,7 @@ finally: sock.shutdown(socket.SHUT_WR) except socket.error, err: - if err[0] != errno.EPIPE: + if err.args[0] != errno.EPIPE: raise if sys.platform == 'linux2': @@ -484,5 +484,6 @@ appendpid = ui.configbool('inotify', 'appendpid', False) + ui.debug('starting inotify server: %s\n' % ' '.join(runargs)) cmdutil.service(opts, initfn=service.init, runfn=service.run, logfile=logfile, runargs=runargs, appendpid=appendpid) diff -r 0f6164806283 -r 97e37994a6c3 hgext/keyword.py --- a/hgext/keyword.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/keyword.py Fri Sep 10 20:19:16 2010 +0200 @@ -161,9 +161,9 @@ kwpat = r'\$(%s)(: [^$\n\r]*? )??\$' % '|'.join(escaped) self.re_kw = re.compile(kwpat) - templatefilters.filters['utcdate'] = utcdate - templatefilters.filters['svnisodate'] = svnisodate - templatefilters.filters['svnutcdate'] = svnutcdate + templatefilters.filters.update({'utcdate': utcdate, + 'svnisodate': svnisodate, + 'svnutcdate': svnutcdate}) def substitute(self, data, path, ctx, subfunc): '''Replaces keywords in data with expanded template.''' @@ -514,14 +514,14 @@ self.lines = kwt.shrinklines(self.fname, self.lines) def kw_diff(orig, repo, node1=None, node2=None, match=None, changes=None, - opts=None): + opts=None, prefix=''): '''Monkeypatch patch.diff to avoid expansion except when comparing against working dir.''' if node2 is not None: kwt.match = util.never elif node1 is not None and node1 != repo['.'].node(): kwt.restrict = True - return orig(repo, node1, node2, match, changes, opts) + return orig(repo, node1, node2, match, changes, opts, prefix) def kwweb_skip(orig, web, req, tmpl): '''Wraps webcommands.x turning off keyword expansion.''' diff -r 0f6164806283 -r 97e37994a6c3 hgext/mq.py --- a/hgext/mq.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/mq.py Fri Sep 10 20:19:16 2010 +0200 @@ -47,7 +47,7 @@ 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 +import os, sys, re, errno, shutil commands.norepo += " qclone" @@ -513,7 +513,7 @@ # apply failed, strip away that rev and merge. hg.clean(repo, head) - self.strip(repo, n, update=False, backup='strip') + self.strip(repo, [n], update=False, backup='strip') ctx = repo[rev] ret = hg.merge(repo, rev) @@ -895,7 +895,7 @@ finally: release(wlock) - def strip(self, repo, rev, update=True, backup="all", force=None): + def strip(self, repo, revs, update=True, backup="all", force=None): wlock = lock = None try: wlock = repo.wlock() @@ -903,12 +903,13 @@ if update: self.check_localchanges(repo, force=force, refresh=False) - urev = self.qparents(repo, rev) + urev = self.qparents(repo, revs[0]) hg.clean(repo, urev) repo.dirstate.write() self.removeundo(repo) - repair.strip(self.ui, repo, rev, backup) + for rev in revs: + repair.strip(self.ui, repo, rev, backup) # strip may have unbundled a set of backed up revisions after # the actual strip self.removeundo(repo) @@ -1197,7 +1198,7 @@ for patch in reversed(self.applied[start:end]): self.ui.status(_("popping %s\n") % patch.name) del self.applied[start:end] - self.strip(repo, rev, update=False, backup='strip') + self.strip(repo, [rev], update=False, backup='strip') if self.applied: self.ui.write(_("now at: %s\n") % self.applied[-1].name) else: @@ -1377,7 +1378,7 @@ repo.dirstate.setparents(*cparents) self.applied.pop() self.applied_dirty = 1 - self.strip(repo, top, update=False, + self.strip(repo, [top], update=False, backup='strip') except: repo.dirstate.invalidate() @@ -1535,7 +1536,7 @@ update = True else: update = False - self.strip(repo, rev, update=update, backup='strip') + self.strip(repo, [rev], update=update, backup='strip') if qpp: self.ui.warn(_("saved queue repository parents: %s %s\n") % (short(qpp[0]), short(qpp[1]))) @@ -1694,11 +1695,22 @@ if existing: if filename == '-': raise util.Abort(_('-e is incompatible with import from -')) - if not patchname: - patchname = normname(filename) - self.check_reserved_name(patchname) - if not os.path.isfile(self.join(patchname)): - raise util.Abort(_("patch %s does not exist") % patchname) + filename = normname(filename) + self.check_reserved_name(filename) + originpath = self.join(filename) + if not os.path.isfile(originpath): + raise util.Abort(_("patch %s does not exist") % filename) + + if patchname: + self.check_reserved_name(patchname) + checkfile(patchname) + + self.ui.write(_('renaming %s to %s\n') + % (filename, patchname)) + util.rename(originpath, self.join(patchname)) + else: + patchname = filename + else: try: if filename == '-': @@ -1744,7 +1756,6 @@ """print the patches already applied""" q = repo.mq - l = len(q.applied) if patch: if patch not in q.series: @@ -1813,6 +1824,10 @@ 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. + + To import an existing patch while renaming it:: + + hg qimport -e existing-patch -n new-name """ q = repo.mq try: @@ -1922,7 +1937,7 @@ if qbase: ui.note(_('stripping applied patches from destination ' 'repository\n')) - dr.mq.strip(dr, qbase, update=False, backup=None) + dr.mq.strip(dr, [qbase], update=False, backup=None) if not opts['noupdate']: ui.note(_('updating destination repository\n')) hg.update(dr, dr.changelog.tip()) @@ -2006,7 +2021,7 @@ """ msg = cmdutil.logmessage(opts) def getmsg(): - return ui.edit(msg, ui.username()) + return ui.edit(msg, opts['user'] or ui.username()) q = repo.mq opts['msg'] = msg if opts.get('edit'): @@ -2028,6 +2043,10 @@ If -s/--short is specified, files currently included in the patch will be refreshed just like matched files and remain in the patch. + If -e/--edit is specified, Mercurial will start your configured editor for + you to enter a message. In case qrefresh fails, you will find a backup of + your message in ``.hg/last-message.txt``. + 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 @@ -2044,6 +2063,10 @@ patch = q.applied[-1].name ph = patchheader(q.join(patch), q.plainmode) message = ui.edit('\n'.join(ph.message), ph.user or ui.username()) + # We don't want to lose the patch message if qrefresh fails (issue2062) + msgfile = repo.opener('last-message.txt', 'wb') + msgfile.write(message) + msgfile.close() setupheaderopts(ui, opts) ret = q.refresh(repo, pats, msg=message, **opts) q.save_dirty() @@ -2159,7 +2182,15 @@ ''' def status(idx): guards = q.series_guards[idx] or ['unguarded'] - ui.write('%s: ' % ui.label(q.series[idx], 'qguard.patch')) + if q.series[idx] in applied: + state = 'applied' + elif q.pushable(idx)[0]: + state = 'unapplied' + else: + state = 'guarded' + label = 'qguard.patch qguard.%s qseries.%s' % (state, state) + ui.write('%s: ' % ui.label(q.series[idx], label)) + for i, guard in enumerate(guards): if guard.startswith('+'): ui.write(guard, label='qguard.positive') @@ -2171,6 +2202,7 @@ ui.write(' ') ui.write('\n') q = repo.mq + applied = set(p.name for p in q.applied) patch = None args = list(args) if opts['list']: @@ -2384,14 +2416,12 @@ pass return 0 -def strip(ui, repo, rev, **opts): - """strip a changeset and all its descendants from the repository - - The strip command removes all changesets whose local revision - number is greater than or equal to REV, and then restores any - changesets that are not descendants of REV. If the working - directory has uncommitted changes, the operation is aborted unless - the --force flag is supplied. +def strip(ui, repo, *revs, **opts): + """strip changesets and all their descendants from the repository + + The strip command removes the specified changesets and all their + descendants. If the working directory has uncommitted changes, + the operation is aborted unless the --force flag is supplied. If a parent of the working directory is stripped, then the working directory will automatically be updated to the most recent @@ -2414,30 +2444,42 @@ elif opts['nobackup']: backup = 'none' - rev = repo.lookup(rev) - p = repo.dirstate.parents() cl = repo.changelog - update = True - if p[0] == nullid: - update = False - elif p[1] == nullid and rev != cl.ancestor(p[0], rev): - update = False - elif rev not in (cl.ancestor(p[0], rev), cl.ancestor(p[1], rev)): - update = False + revs = set(cl.rev(repo.lookup(r)) for r in revs) + + descendants = set(cl.descendants(*revs)) + strippedrevs = revs.union(descendants) + roots = revs.difference(descendants) + + update = False + # if one of the wdir parent is stripped we'll need + # to update away to an earlier revision + for p in repo.dirstate.parents(): + if p != nullid and cl.rev(p) in strippedrevs: + update = True + break + + rootnodes = set(cl.node(r) for r in roots) q = repo.mq if q.applied: - if rev == cl.ancestor(repo.lookup('qtip'), rev): + # refresh queue state if we're about to strip + # applied patches + if cl.rev(repo.lookup('qtip')) in strippedrevs: q.applied_dirty = True start = 0 end = len(q.applied) - applied_list = [i.node for i in q.applied] - if rev in applied_list: - start = applied_list.index(rev) + for i, statusentry in enumerate(q.applied): + if statusentry.node in rootnodes: + # if one of the stripped roots is an applied + # patch, only part of the queue is stripped + start = i + break del q.applied[start:end] q.save_dirty() - repo.mq.strip(repo, rev, backup=backup, update=update, force=opts['force']) + repo.mq.strip(repo, list(rootnodes), backup=backup, update=update, + force=opts['force']) return 0 def select(ui, repo, *args, **opts): @@ -2562,7 +2604,7 @@ if not opts['applied'] and not revrange: raise util.Abort(_('no revisions specified')) elif opts['applied']: - revrange = ('qbase:qtip',) + revrange + revrange = ('qbase::qtip',) + revrange q = repo.mq if not q.applied: @@ -2630,7 +2672,9 @@ def _setactive(name): if q.applied: raise util.Abort(_('patches applied - cannot set new queue active')) - + _setactivenocheck(name) + + def _setactivenocheck(name): fh = repo.opener(_activequeue, 'w') if name != 'patches': fh.write(name) @@ -2641,17 +2685,40 @@ fh.write('%s\n' % (name,)) fh.close() + def _queuedir(name): + if name == 'patches': + return repo.join('patches') + else: + return repo.join('patches-' + name) + def _validname(name): for n in name: if n in ':\\/.': return False return True + def _delete(name): + if name not in existing: + raise util.Abort(_('cannot delete queue that does not exist')) + + current = _getcurrent() + + if name == current: + raise util.Abort(_('cannot delete currently active queue')) + + fh = repo.opener('patches.queues.new', 'w') + for queue in existing: + if queue == name: + continue + fh.write('%s\n' % (queue,)) + fh.close() + util.rename(repo.join('patches.queues.new'), repo.join(_allqueues)) + if not name or opts.get('list'): current = _getcurrent() for queue in _getqueues(): ui.write('%s' % (queue,)) - if queue == current: + if queue == current and not ui.quiet: ui.write(_(' (active)\n')) else: ui.write('\n') @@ -2670,22 +2737,39 @@ _addqueue(_defaultqueue) _addqueue(name) _setactive(name) - elif opts.get('delete'): - if name not in existing: - raise util.Abort(_('cannot delete queue that does not exist')) - + elif opts.get('rename'): current = _getcurrent() - if name == current: - raise util.Abort(_('cannot delete currently active queue')) + raise util.Abort(_('can\'t rename "%s" to its current name') % name) + if name in existing: + raise util.Abort(_('queue "%s" already exists') % name) + + olddir = _queuedir(current) + newdir = _queuedir(name) + + if os.path.exists(newdir): + raise util.Abort(_('non-queue directory "%s" already exists') % + newdir) fh = repo.opener('patches.queues.new', 'w') for queue in existing: - if queue == name: - continue - fh.write('%s\n' % (queue,)) + if queue == current: + fh.write('%s\n' % (name,)) + if os.path.exists(olddir): + util.rename(olddir, newdir) + else: + fh.write('%s\n' % (queue,)) fh.close() util.rename(repo.join('patches.queues.new'), repo.join(_allqueues)) + _setactivenocheck(name) + elif opts.get('delete'): + _delete(name) + elif opts.get('purge'): + if name in existing: + _delete(name) + qdir = _queuedir(name) + if os.path.exists(qdir): + shutil.rmtree(qdir) else: if name not in existing: raise util.Abort(_('use --create to create a new queue')) @@ -2843,13 +2927,21 @@ entry = extensions.wrapcommand(commands.table, 'init', mqinit) entry[1].extend(mqopt) - norepo = commands.norepo.split(" ") - for cmd in commands.table.keys(): - cmd = cmdutil.parsealiases(cmd)[0] - if cmd in norepo: - continue - entry = extensions.wrapcommand(commands.table, cmd, mqcommand) - entry[1].extend(mqopt) + nowrap = set(commands.norepo.split(" ") + ['qrecord']) + + def dotable(cmdtable): + for cmd in cmdtable.keys(): + cmd = cmdutil.parsealiases(cmd)[0] + if cmd in nowrap: + continue + entry = extensions.wrapcommand(cmdtable, cmd, mqcommand) + entry[1].extend(mqopt) + + dotable(commands.table) + + for extname, extmodule in extensions.extensions(): + if extmodule.__file__ != __file__: + dotable(getattr(extmodule, 'cmdtable', {})) seriesopts = [('s', 'summary', None, _('print first line of patch header'))] @@ -2996,7 +3088,7 @@ ' number greater than REV which are not' ' descendants of REV (DEPRECATED)')), ('n', 'nobackup', None, _('no backups'))], - _('hg strip [-f] [-n] REV')), + _('hg strip [-f] [-n] REV...')), "qtop": (top, [] + seriesopts, _('hg qtop [-s]')), "qunapplied": (unapplied, @@ -3011,7 +3103,9 @@ [ ('l', 'list', False, _('list all available queues')), ('c', 'create', False, _('create new queue')), + ('', 'rename', False, _('rename active queue')), ('', 'delete', False, _('delete reference to queue')), + ('', 'purge', False, _('delete queue, and remove patch dir')), ], _('[OPTION] [QUEUE]')), } diff -r 0f6164806283 -r 97e37994a6c3 hgext/patchbomb.py --- a/hgext/patchbomb.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/patchbomb.py Fri Sep 10 20:19:16 2010 +0200 @@ -22,9 +22,9 @@ and References headers, so they will show up as a sequence in threaded mail and news readers, and in mail archives. -With the -d/--diffstat option, you will be prompted for each changeset -with a diffstat summary and the changeset summary, so you can be sure -you are sending the right changes. +With the -d/--diffstat or -c/--confirm options, you will be presented +with a final summary of all messages and asked for confirmation before +the messages are sent. To configure other defaults, add a section like this to your hgrc file:: @@ -81,9 +81,7 @@ from mercurial.node import bin def prompt(ui, prompt, default=None, rest=':'): - if not ui.interactive(): - if default is not None: - return default + if not ui.interactive() and default is None: raise util.Abort(_("%s Please enter a valid value" % (prompt + rest))) if default: prompt += ' [%s]' % default @@ -96,27 +94,18 @@ return default ui.warn(_('Please enter a valid value.\n')) -def cdiffstat(ui, summary, patchlines): - s = patch.diffstat(patchlines) - if summary: - ui.write(summary, '\n') - ui.write(s, '\n') - ans = prompt(ui, _('does the diffstat above look okay?'), 'y') - if not ans.lower().startswith('y'): - raise util.Abort(_('diffstat rejected')) - return s - def introneeded(opts, number): '''is an introductory message required?''' return number > 1 or opts.get('intro') or opts.get('desc') -def makepatch(ui, repo, patch, opts, _charsets, idx, total, patchname=None): +def makepatch(ui, repo, patchlines, opts, _charsets, idx, total, + patchname=None): desc = [] node = None body = '' - for line in patch: + for line in patchlines: if line.startswith('#'): if line.startswith('# Node ID'): node = line.split()[-1] @@ -134,21 +123,22 @@ body += '\n\n\n' if opts.get('plain'): - while patch and patch[0].startswith('# '): - patch.pop(0) - if patch: - patch.pop(0) - while patch and not patch[0].strip(): - patch.pop(0) + while patchlines and patchlines[0].startswith('# '): + patchlines.pop(0) + if patchlines: + patchlines.pop(0) + while patchlines and not patchlines[0].strip(): + patchlines.pop(0) + ds = patch.diffstat(patchlines) if opts.get('diffstat'): - body += cdiffstat(ui, '\n'.join(desc), patch) + '\n\n' + body += ds + '\n\n' if opts.get('attach') or opts.get('inline'): msg = email.MIMEMultipart.MIMEMultipart() if body: msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test'))) - p = mail.mimetextpatch('\n'.join(patch), 'x-patch', opts.get('test')) + p = mail.mimetextpatch('\n'.join(patchlines), 'x-patch', opts.get('test')) binnode = bin(node) # if node is mq patch, it will have the patch file's name as a tag if not patchname: @@ -167,7 +157,7 @@ p['Content-Disposition'] = disposition + '; filename=' + patchname msg.attach(p) else: - body += '\n'.join(patch) + body += '\n'.join(patchlines) msg = mail.mimetextpatch(body, display=opts.get('test')) flag = ' '.join(opts.get('flag')) @@ -182,7 +172,7 @@ subj = '[PATCH %0*d of %d%s] %s' % (tlen, idx, total, flag, subj) msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test')) msg['X-Mercurial-Node'] = node - return msg, subj + return msg, subj, ds def patchbomb(ui, repo, *revs, **opts): '''send changesets by email @@ -352,17 +342,16 @@ prompt(ui, 'Subject: ', rest=subj)) body = '' - if opts.get('diffstat'): - d = cdiffstat(ui, _('Final summary:\n'), jumbo) - if d: - body = '\n' + d + ds = patch.diffstat(jumbo) + if ds and opts.get('diffstat'): + body = '\n' + ds body = getdescription(body, sender) msg = mail.mimeencode(ui, body, _charsets, opts.get('test')) msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test')) - msgs.insert(0, (msg, subj)) + msgs.insert(0, (msg, subj, ds)) return msgs def getbundlemsgs(bundle): @@ -381,7 +370,7 @@ email.Encoders.encode_base64(datapart) msg.attach(datapart) msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test')) - return [(msg, subj)] + return [(msg, subj, None)] sender = (opts.get('from') or ui.config('email', 'from') or ui.config('patchbomb', 'from') or @@ -394,17 +383,28 @@ else: msgs = getpatchmsgs(list(getpatches(revs))) + showaddrs = [] + def getaddrs(opt, prpt=None, default=None): addrs = opts.get(opt.replace('-', '_')) + if opt != 'reply-to': + showaddr = '%s:' % opt.capitalize() + else: + showaddr = 'Reply-To:' + if addrs: + showaddrs.append('%s %s' % (showaddr, ', '.join(addrs))) return mail.addrlistencode(ui, addrs, _charsets, opts.get('test')) - addrs = (ui.config('email', opt) or - ui.config('patchbomb', opt) or '') + addrs = ui.config('email', opt) or ui.config('patchbomb', opt) or '' if not addrs and prpt: addrs = prompt(ui, prpt, default) + if addrs: + showaddr = '%s %s' % (showaddr, addrs) + showaddrs.append(showaddr) + return mail.addrlistencode(ui, [addrs], _charsets, opts.get('test')) to = getaddrs('to', 'To') @@ -412,6 +412,20 @@ bcc = getaddrs('bcc') replyto = getaddrs('reply-to') + if opts.get('diffstat') or opts.get('confirm'): + ui.write(_('\nFinal summary:\n\n')) + ui.write('From: %s\n' % sender) + for addr in showaddrs: + ui.write('%s\n' % addr) + for m, subj, ds in msgs: + ui.write('Subject: %s\n' % subj) + if ds: + ui.write(ds) + ui.write('\n') + if ui.promptchoice(_('are you sure you want to send (yn)?'), + (_('&Yes'), _('&No'))): + raise util.Abort(_('patchbomb canceled')) + ui.write('\n') parent = opts.get('in_reply_to') or None @@ -427,7 +441,7 @@ sender_addr = email.Utils.parseaddr(sender)[1] sender = mail.addressencode(ui, sender, _charsets, opts.get('test')) sendmail = None - for m, subj in msgs: + for m, subj, ds in msgs: try: m['Message-Id'] = genmsgid(m['X-Mercurial-Node']) except TypeError: @@ -495,6 +509,7 @@ ('i', 'inline', None, _('send patches as inline attachments')), ('', 'bcc', [], _('email addresses of blind carbon copy recipients')), ('c', 'cc', [], _('email addresses of copy recipients')), + ('', 'confirm', None, _('ask for confirmation before sending')), ('d', 'diffstat', None, _('add diffstat output to messages')), ('', 'date', '', _('use the given date as the sending date')), ('', 'desc', '', _('use the given file as the series description')), diff -r 0f6164806283 -r 97e37994a6c3 hgext/rebase.py --- a/hgext/rebase.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/rebase.py Fri Sep 10 20:19:16 2010 +0200 @@ -14,7 +14,7 @@ http://mercurial.selenic.com/wiki/RebaseExtension ''' -from mercurial import hg, util, repair, merge, cmdutil, commands, error +from mercurial import hg, util, repair, merge, cmdutil, commands from mercurial import extensions, ancestor, copies, patch from mercurial.commands import templateopts from mercurial.node import nullrev @@ -148,9 +148,14 @@ targetancestors = set(repo.changelog.ancestors(target)) targetancestors.add(target) - for rev in sorted(state): + sortedstate = sorted(state) + total = len(sortedstate) + pos = 0 + for rev in sortedstate: + pos += 1 if state[rev] == -1: - ui.debug("rebasing %d:%s\n" % (rev, repo[rev])) + ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, repo[rev])), + _(' changesets'), total) storestatus(repo, originalwd, target, state, collapsef, keepf, keepbranchesf, external) p1, p2 = defineparents(repo, rev, target, state, @@ -179,6 +184,7 @@ skipped.add(rev) state[rev] = p1 + ui.progress(_('rebasing'), None) ui.note(_('rebase merging completed\n')) if collapsef and not keepopen: diff -r 0f6164806283 -r 97e37994a6c3 hgext/record.py --- a/hgext/record.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/record.py Fri Sep 10 20:19:16 2010 +0200 @@ -10,7 +10,7 @@ from mercurial.i18n import gettext, _ from mercurial import cmdutil, commands, extensions, hg, mdiff, patch from mercurial import util -import copy, cStringIO, errno, operator, os, re, tempfile +import copy, cStringIO, errno, os, re, tempfile lines_re = re.compile(r'@@ -(\d+),(\d+) \+(\d+),(\d+) @@\s*(.*)') @@ -97,7 +97,7 @@ if h.startswith('---'): fp.write(_('%d hunks, %d lines changed\n') % (len(self.hunks), - sum([h.added + h.removed for h in self.hunks]))) + sum([max(h.added, h.removed) for h in self.hunks]))) break fp.write(h) @@ -186,7 +186,8 @@ self.hunk = [] self.stream = [] - def addrange(self, (fromstart, fromend, tostart, toend, proc)): + def addrange(self, limits): + fromstart, fromend, tostart, toend, proc = limits self.fromline = int(fromstart) self.toline = int(tostart) self.proc = proc @@ -354,8 +355,8 @@ applied[chunk.filename()].append(chunk) else: fixoffset += chunk.removed - chunk.added - return reduce(operator.add, [h for h in applied.itervalues() - if h[0].special() or len(h) > 1], []) + return sum([h for h in applied.itervalues() + if h[0].special() or len(h) > 1], []) def record(ui, repo, *pats, **opts): '''interactively select changes to commit @@ -485,7 +486,8 @@ # 3a. apply filtered patch to clean repo (clean) if backups: - hg.revert(repo, repo.dirstate.parents()[0], backups.has_key) + hg.revert(repo, repo.dirstate.parents()[0], + lambda key: key in backups) # 3b. (apply) if dopatch: diff -r 0f6164806283 -r 97e37994a6c3 hgext/relink.py --- a/hgext/relink.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/relink.py Fri Sep 10 20:19:16 2010 +0200 @@ -7,7 +7,7 @@ """recreates hardlinks between repository clones""" -from mercurial import cmdutil, hg, util +from mercurial import hg, util from mercurial.i18n import _ import os, stat diff -r 0f6164806283 -r 97e37994a6c3 hgext/zeroconf/__init__.py --- a/hgext/zeroconf/__init__.py Fri Sep 10 16:58:13 2010 +0200 +++ b/hgext/zeroconf/__init__.py Fri Sep 10 20:19:16 2010 +0200 @@ -27,7 +27,7 @@ import socket, time, os import Zeroconf -from mercurial import ui, hg, encoding +from mercurial import ui, hg, encoding, util from mercurial import extensions from mercurial.hgweb import hgweb_mod from mercurial.hgweb import hgwebdir_mod @@ -107,7 +107,7 @@ path = self.repo.ui.config("web", "prefix", "").strip('/') desc = self.repo.ui.config("web", "description", name) publish(name, desc, path, - int(self.repo.ui.config("web", "port", 8000))) + util.getport(self.repo.ui.config("web", "port", 8000))) class hgwebdirzc(hgwebdir_mod.hgwebdir): def __init__(self, conf, baseui=None): @@ -119,7 +119,7 @@ name = os.path.basename(repo) path = (prefix + repo).strip('/') desc = u.config('web', 'description', name) - publish(name, desc, path, int(u.config("web", "port", 8000))) + publish(name, desc, path, util.getport(u.config("web", "port", 8000))) # listen diff -r 0f6164806283 -r 97e37994a6c3 i18n/da.po --- a/i18n/da.po Fri Sep 10 16:58:13 2010 +0200 +++ b/i18n/da.po Fri Sep 10 20:19:16 2010 +0200 @@ -17,10 +17,11 @@ msgstr "" "Project-Id-Version: Mercurial\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-01 14:56+0200\n" -"PO-Revision-Date: 2010-07-01 15:23+0200\n" +"POT-Creation-Date: 2010-08-15 17:28+0200\n" +"PO-Revision-Date: 2010-08-15 18:57+0200\n" "Last-Translator: \n" "Language-Team: Danish\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -345,6 +346,9 @@ msgid "bookmark name cannot contain newlines" msgstr "bogmærkenavn kan ikke indeholde linieskift" +msgid "bookmark names cannot consist entirely of whitespace" +msgstr "bogmærkenavne kan ikke bestå udelukkende af tomrum" + msgid "a bookmark cannot have the name of an existing branch" msgstr "et bogmærke kan ikke hedde det samme som en eksisterende gren" @@ -1082,17 +1086,24 @@ msgid "" " 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::" -msgstr "" - -msgid " include path/to/file" -msgstr "" - -msgid " exclude path/to/file" -msgstr "" - -msgid " rename from/file to/file" +" and directories. Each line can contain one of the following\n" +" directives::" +msgstr "" + +msgid " include path/to/file-or-dir" +msgstr "" + +msgid " exclude path/to/file-or-dir" +msgstr "" + +msgid " rename path/to/source path/to/destination" +msgstr "" + +msgid "" +" Comment lines start with '#'. A specified path matches if it\n" +" equals the full relative name of a file or one of its parent\n" +" directories. The 'include' or 'exclude' directive with the longest\n" +" matching path applies, so line order does not matter." msgstr "" msgid "" @@ -1100,9 +1111,9 @@ " directory, to be included in the destination repository, and the\n" " exclusion of all other files and directories not explicitly\n" " included. The 'exclude' directive causes files or directories to\n" -" be omitted. The 'rename' directive renames a file or directory. To\n" -" rename from a subdirectory into the root of the repository, use\n" -" '.' as the path to rename to." +" be omitted. The 'rename' directive renames a file or directory if\n" +" it is converted. To rename from a subdirectory into the root of\n" +" the repository, use '.' as the path to rename to." msgstr "" msgid "" @@ -1432,8 +1443,8 @@ msgid "%s: unknown repository type" msgstr "%s: ukendt depottype" -msgid "retrieving file" -msgstr "henter fil" +msgid "getting files" +msgstr "henter filer" msgid "revisions" msgstr "revisioner" @@ -1615,10 +1626,18 @@ msgstr "fejl i filafbildning" #, python-format +msgid "%s:%d: path to %s is missing\n" +msgstr "" + +#, python-format msgid "%s:%d: %r already in %s list\n" msgstr "%s:%d: %r er allerede i %s listen\n" #, python-format +msgid "%s:%d: superfluous / in %s %r\n" +msgstr "" + +#, python-format msgid "%s:%d: unknown directive %r\n" msgstr "%s:%d: ukendt direktiv %r\n" @@ -1802,8 +1821,8 @@ msgid "unable to cope with svn output" msgstr "kan ikke håndtere svn output" -msgid "XXX TAGS NOT IMPLEMENTED YET\n" -msgstr "XXX MÆRKATER ER IKKE IMPLEMENTERET ENDNU\n" +msgid "writing Subversion tags is not yet implemented\n" +msgstr "" msgid "automatically manage newlines in repository files" msgstr "automatisk håndtering af linieskift i depotfiler" @@ -2629,8 +2648,8 @@ #, python-format msgid "*** the current per-user limit on the number of inotify watches is %s\n" msgstr "" -"*** den nuværende grænse pr bruger for antallet af inotify overvågninger er %" -"s\n" +"*** den nuværende grænse pr bruger for antallet af inotify overvågninger er " +"%s\n" msgid "*** this limit is too low to watch every directory in this repository\n" msgstr "" @@ -3298,9 +3317,8 @@ msgid "patch series already fully applied\n" msgstr "serien af rettelser er allerede anvendt fuldt ud\n" -#, python-format -msgid "patch '%s' not found" -msgstr "gren '%s' blev ikke fundet" +msgid "please specify the patch to move" +msgstr "angiv venligst lappen der skal flyttes" msgid "cleaning up working directory..." msgstr "rydder op i arbejdskataloget..." @@ -3436,10 +3454,18 @@ msgid "patch %s does not exist" msgstr "rettelsen %s eksisterer ikke" +#, python-format +msgid "renaming %s to %s\n" +msgstr "omdøber %s til %s\n" + msgid "need --name to import a patch from -" msgstr "har brug for --name for at importere rettelse fra -" #, python-format +msgid "unable to read file %s" +msgstr "kan ikke læse filen %s" + +#, python-format msgid "adding %s to series file\n" msgstr "tilføjer %s til series filen\n" @@ -3520,14 +3546,21 @@ msgid "" " To import a patch from standard input, pass - as the patch file.\n" " When importing from standard input, a patch name must be specified\n" -" using the --name flag.\n" -" " +" using the --name flag." msgstr "" " Brug - som patch filnavn for at importere en patch fra standard\n" " indput. Når der importeres fra standard indput skal der angivet et\n" " patchnavn med --name tilvalget.\n" " " +msgid " To import an existing patch while renaming it::" +msgstr "" + +msgid "" +" hg qimport -e existing-patch -n new-name\n" +" " +msgstr "" + msgid "init a new queue repository (DEPRECATED)" msgstr "opret et nyt kø-depot (FORÆLDET)" @@ -3845,10 +3878,6 @@ msgid "A patch named %s already exists in the series file" msgstr "En rettelse ved navn %s eksisterer allerede i serien" -#, python-format -msgid "renaming %s to %s\n" -msgstr "omdøber %s til %s\n" - msgid "restore the queue state saved by a revision (DEPRECATED)" msgstr "" @@ -3870,15 +3899,13 @@ msgid "copy %s to %s\n" msgstr "kopier %s til %s\n" -msgid "strip a changeset and all its descendants from the repository" -msgstr "strip en ændring og alle dens efterkommere fra depotet" - -msgid "" -" The strip command removes all changesets whose local revision\n" -" number is greater than or equal to REV, and then restores any\n" -" changesets that are not descendants of REV. If the working\n" -" directory has uncommitted changes, the operation is aborted unless\n" -" the --force flag is supplied." +msgid "strip changesets and all their descendants from the repository" +msgstr "strip ændringer og alle deres efterkommere fra depotet" + +msgid "" +" The strip command removes the specified changesets and all their\n" +" descendants. If the working directory has uncommitted changes,\n" +" the operation is aborted unless the --force flag is supplied." msgstr "" msgid "" @@ -4366,8 +4393,8 @@ msgid "no backups" msgstr "ingen backupper" -msgid "hg strip [-f] [-n] REV" -msgstr "hg strip [-f] [-n] REV" +msgid "hg strip [-f] [-n] REV..." +msgstr "hg strip [-f] [-n] REV..." msgid "hg qtop [-s]" msgstr "hg qtop [-s]" @@ -5115,6 +5142,12 @@ msgid "cannot use both keepbranches and extrafn" msgstr "man kan ikke bruge både keepbranches og extrafn" +msgid "rebasing" +msgstr "" + +msgid " changesets" +msgstr " ændringer" + msgid "fix unresolved conflicts with hg resolve then run hg rebase --continue" msgstr "ret uløste konflikter med hg resolve og kør så hg rebase --continue" @@ -5867,14 +5900,14 @@ msgstr "" msgid "" -"Zeroconf enabled repositories will be announced in a network without\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." msgstr "" msgid "" -"To allow other people to discover your repository using run \"hg serve\"\n" -"in your repository::" +"To allow other people to discover your repository using run\n" +":hg:`serve` in your repository::" msgstr "" msgid "" @@ -5885,7 +5918,8 @@ " $ hg serve" msgid "" -"You can discover zeroconf enabled repositories by running \"hg paths\"::" +"You can discover Zeroconf-enabled repositories by running\n" +":hg:`paths`::" msgstr "" msgid "" @@ -6020,8 +6054,8 @@ #, python-format msgid "%s has not been committed yet, so no copy data will be stored for %s.\n" msgstr "" -"%s er endnu ikke comitted, så der vil ikke blive gemt kopieringsdata for %" -"s.\n" +"%s er endnu ikke comitted, så der vil ikke blive gemt kopieringsdata for " +"%s.\n" msgid "no source or destination specified" msgstr "ingen kilde eller destination angivet" @@ -6198,8 +6232,7 @@ " $ hg add\n" " adding foo.c\n" " $ hg status\n" -" A foo.c\n" -" " +" A foo.c" msgstr "" " $ ls\n" " foo.c\n" @@ -6208,8 +6241,12 @@ " $ hg add\n" " adding foo.c\n" " $ hg status\n" -" A foo.c\n" +" A foo.c" + +msgid "" +" Returns 0 if all files are successfully added.\n" " " +msgstr "" msgid "add all new files, delete all missing files" msgstr "tilføj alle nye filer, fjern alle manglende filer" @@ -6234,19 +6271,16 @@ " every added file and records those similar enough as renames. This\n" " option takes a percentage between 0 (disabled) and 100 (files must\n" " be identical) as its parameter. Detecting renamed files this way\n" -" can be expensive." +" can be expensive. After using this option, :hg:`status -C` can be\n" +" used to check which files were identified as moved or renamed." msgstr "" " Brug -s/--similarity tilvalget for at opdage omdøbte filer. Med en\n" " parameter større end 0 bliver hver fjernet fil sammenlignet med\n" " enhver tilføjet fil og filer der er tilstrækkelig ens bliver\n" " opført som omdøbte. Dette tilvalg tager et procenttal mellem 0\n" " (slået fra) og 100 (filer skal være identiske) som parameter. At\n" -" opdage omdøbninger på denne måde kan være dyrt." - -msgid "" -" Returns 0 if all files are successfully added.\n" -" " -msgstr "" +" opdage omdøbninger på denne måde kan være dyrt. Brug :hg:`status\n" +" -C` for at kontrollere hvilke filer der blev markeret som omdøbt." msgid "similarity must be a number" msgstr "lighedsgrad skal være et tal" @@ -7217,20 +7251,20 @@ msgid "" " :``%%``: literal \"%\" character\n" -" :``%H``: changeset hash (40 bytes of hexadecimal)\n" +" :``%H``: changeset hash (40 hexadecimal digits)\n" " :``%N``: number of patches being generated\n" " :``%R``: changeset revision number\n" " :``%b``: basename of the exporting repository\n" -" :``%h``: short-form changeset hash (12 bytes of hexadecimal)\n" +" :``%h``: short-form changeset hash (12 hexadecimal digits)\n" " :``%n``: zero-padded sequence number, starting at 1\n" " :``%r``: zero-padded changeset revision number" msgstr "" " :``%%``: litteral \"%\" tegn\n" -" :``%H``: ændringshash (40 byte heksadecimal)\n" +" :``%H``: ændringshash (40 hexadecimale cifre)\n" " :``%N``: antallet af rettelser som bliver genereret\n" " :``%R``: revisionnummer for ændringen\n" " :``%b``: grundnavn for det eksporterede depot\n" -" :``%h``: kortform ændringshash (12 byte heksadecimal)\n" +" :``%h``: kortform ændringshash (12 hexadecimale cifre)\n" " :``%n``: nul-fyldt sekvensnummer, startende ved 1\n" " :``%r``: nul-fyldt revisionsnummer for ændringen" @@ -7427,6 +7461,14 @@ msgstr "(ingen hjælpetekst tilgængelig)" #, python-format +msgid "shell alias for::" +msgstr "shellalias for::" + +#, python-format +msgid " %s" +msgstr " %s" + +#, python-format msgid "alias for: hg %s" msgstr "alias for: hg %s" @@ -7859,12 +7901,8 @@ " :hg:`bundle`) operations." msgstr "" -msgid "" -" See :hg:`help urls` for more information.\n" -" " -msgstr "" -" Se :hg:`help urls` for mere information.\n" -" " +msgid " See :hg:`help urls` for more information." +msgstr " Se :hg:`help urls` for mere information." msgid "not found!\n" msgstr "ikke fundet!\n" @@ -8517,6 +8555,9 @@ msgid "tag names must be unique" msgstr "mærkatnavne skal være unikke" +msgid "tag names cannot consist entirely of whitespace" +msgstr "mærkater kan ikke bestå udelukkende af tomrum" + msgid "--rev and --remove are incompatible" msgstr "--rev og --remove er inkompatible" @@ -8584,12 +8625,12 @@ msgstr " Opdater depotets arbejdskatalog til den angivne ændring." msgid "" -" If no changeset is specified, attempt to update to the head of the\n" -" current branch. If this head is a descendant of the working\n" +" If no changeset is specified, attempt to update to the tip of the\n" +" current branch. If this changeset is a descendant of the working\n" " directory's parent, update to it, otherwise abort." msgstr "" " Hvis der ikke er angivet nogen ændring, forsøg da at opdatere til\n" -" spidsen af den nuværende gren. Hvis dette hoved nedstammer fra\n" +" spidsen af den nuværende gren. Hvis denne ændring nedstammer fra\n" " arbejdskatalogets forælder, da opdateres der til det, ellers\n" " afbrydes der." @@ -9109,7 +9150,7 @@ msgid "show topological heads only" msgstr "" -msgid "show active branchheads only [DEPRECATED]" +msgid "show active branchheads only (DEPRECATED)" msgstr "vis kun aktive gren-hoveder (FORÆLDET)" msgid "show normal and closed branch heads" @@ -9564,24 +9605,24 @@ msgstr "depotet er urelateret" #, python-format -msgid "abort: push creates new remote heads on branch '%s'!\n" -msgstr "afbrudt: skub laver nye hoveder på grenen '%s'!\n" - -msgid "abort: push creates new remote heads!\n" -msgstr "afbrudt: skub laver nye fjern-hoveder!\n" - -msgid "(you should pull and merge or use push -f to force)\n" -msgstr "(du skal hive og sammenføje eller bruge -f for at gennemtvinge)\n" - -msgid "(did you forget to merge? use push -f to force)\n" -msgstr "(glemte du at sammenføje? brug push -f for at gennemtvinge)\n" - -#, python-format -msgid "abort: push creates new remote branches: %s!\n" -msgstr "afbrudt: skub laver nye grene i fjerndepotet: %s!\n" - -msgid "(use 'hg push --new-branch' to create new remote branches)\n" -msgstr "(brug 'hg push --new-branch' for at lave nye grene i fjerndepotet)\n" +msgid "push creates new remote branches: %s!" +msgstr "skub laver nye grene i fjerndepotet: %s!" + +msgid "use 'hg push --new-branch' to create new remote branches" +msgstr "brug 'hg push --new-branch' for at lave nye grene i fjerndepotet" + +#, python-format +msgid "push creates new remote heads on branch '%s'!" +msgstr "skub laver nye fjern-hoveder på grenen '%s'!" + +msgid "push creates new remote heads!" +msgstr "skub laver nye fjern-hoveder!" + +msgid "you should pull and merge or use push -f to force" +msgstr "du bør hive og sammenføje eller bruge -f for at gennemtvinge" + +msgid "did you forget to merge? use push -f to force" +msgstr "glemte du at sammenføje? brug push -f for at gennemtvinge" msgid "note: unsynced remote changes!\n" msgstr "bemærk: usynkroniserede ændringer i fjernsystemet!\n" @@ -9591,6 +9632,10 @@ msgstr "afbrudt: %s\n" #, python-format +msgid "(%s)\n" +msgstr "" + +#, python-format msgid "hg: parse error at %s: %s\n" msgstr "hg: konfigurationsfejl på %s: %s\n" @@ -9598,6 +9643,9 @@ msgid "hg: parse error: %s\n" msgstr "hg: parse fejl: %s\n" +msgid "entering debugger - type c to continue starting hg or h for help\n" +msgstr "" + #, python-format msgid "" "hg: command '%s' is ambiguous:\n" @@ -9700,6 +9748,12 @@ msgstr "ingen definition for alias '%s'\n" #, python-format +msgid "" +"error in definition for alias '%s': %s may only be given on the command " +"line\n" +msgstr "" + +#, python-format msgid "alias '%s' resolves to unknown command '%s'\n" msgstr "alias '%s' oversætter til ukendt kommando '%s'\n" @@ -9712,6 +9766,10 @@ msgstr "misdannet --config tilvalg: %r (brug --config sektion.navn=værdi)" #, python-format +msgid "error getting current working directory: %s" +msgstr "fejl ved opslag af nuværende arbejdskatalog: %s" + +#, python-format msgid "extension '%s' overrides commands: %s\n" msgstr "udvidelse '%s' overskriver kommandoer: %s\n" @@ -9736,6 +9794,9 @@ msgid "repository '%s' is not local" msgstr "depot '%s' er ikke lokalt" +msgid "warning: --repository ignored\n" +msgstr "advarsel: --repository ignoreret\n" + msgid "invalid arguments" msgstr "ugyldige parametre" @@ -9928,7 +9989,9 @@ msgid "" " not trusting file /.hg/hgrc from untrusted user USER, group GROUP" -msgstr " stoler ikke på filen /.hg/hgrc fra ubetroet bruger BRUGER, gruppe GRUPPE" +msgstr "" +" stoler ikke på filen /.hg/hgrc fra ubetroet bruger BRUGER, gruppe " +"GRUPPE" msgid "" "If this bothers you, the warning can be silenced (the file would still\n" @@ -10304,7 +10367,7 @@ " a remote repository, since new heads may be created by these\n" " operations. Note that the term branch can also be used informally\n" " to describe a development process in which certain development is\n" -" done independently of other development.This is sometimes done\n" +" done independently of other development. This is sometimes done\n" " explicitly with a named branch, but it can also be done locally,\n" " using bookmarks or clones and anonymous branches." msgstr "" @@ -10399,8 +10462,8 @@ msgid "" "Changeset id\n" " A SHA-1 hash that uniquely identifies a changeset. It may be\n" -" represented as either a \"long\" 40-byte hexadecimal string, or a\n" -" \"short\" 12-byte hexadecimal string." +" represented as either a \"long\" 40 hexadecimal digit string, or a\n" +" \"short\" 12 hexadecimal digit string." msgstr "" msgid "" @@ -10547,7 +10610,7 @@ " Mercurial, that will be recorded in the next commit. The working\n" " directory initially corresponds to the snapshot at an existing\n" " changeset, known as the parent of the working directory. See\n" -" 'Parents, working directory'. The state may be modified by changes\n" +" 'Parent, working directory'. The state may be modified by changes\n" " to the files introduced manually or by a merge. The repository\n" " metadata exists in the .hg directory inside the working directory." msgstr "" @@ -11101,8 +11164,7 @@ msgid "" "``branch(set)``\n" -" The branch names are found for changesets in set, and the result is\n" -" all changesets belonging to one those branches." +" All changesets belonging to the branches of changesets in set." msgstr "" msgid "" @@ -11127,12 +11189,12 @@ msgid "" "``descendants(set)``\n" -" Changesets which are decendants of changesets in set." +" Changesets which are descendants of changesets in set." msgstr "" msgid "" "``file(pattern)``\n" -" Changesets which manually affected files matching pattern." +" Changesets affecting files matched by pattern." msgstr "" msgid "" @@ -11172,18 +11234,24 @@ msgstr "" msgid "" +"``min(set)``\n" +" Changeset with lowest revision number in set." +msgstr "" + +msgid "" "``merge()``\n" " Changeset is a merge changeset." msgstr "" msgid "" "``modifies(pattern)``\n" -" Changesets which modify files matching pattern." +" Changesets modifying files matched by pattern." msgstr "" msgid "" "``outgoing([path])``\n" -" Changesets missing in path." +" Changesets not found in the specified destination repository, or the\n" +" default push location." msgstr "" msgid "" @@ -11329,6 +11397,9 @@ " committed. Will be empty if the branch name was default." msgstr "" +msgid ":children: List of strings. The children of the changeset." +msgstr "" + msgid ":date: Date information. The date when the changeset was committed." msgstr "" @@ -11365,8 +11436,8 @@ msgstr "" msgid "" -":node: String. The changeset identification hash, as a 40-character\n" -" hexadecimal string." +":node: String. The changeset identification hash, as a 40 hexadecimal\n" +" digit string." msgstr "" msgid ":parents: List of strings. The parents of the changeset." @@ -11500,7 +11571,7 @@ msgid "" ":short: Changeset hash. Returns the short form of a changeset hash,\n" -" i.e. a 12-byte hexadecimal string." +" i.e. a 12 hexadecimal digit string." msgstr "" msgid ":shortdate: Date. Returns a date like \"2006-09-18\"." @@ -11799,21 +11870,6 @@ msgid "'%s' uses newer protocol %s" msgstr "'%s' bruger nyere protokol %s" -msgid "look up remote revision" -msgstr "" - -msgid "unexpected response:" -msgstr "uventet svar:" - -msgid "look up remote changes" -msgstr "" - -msgid "push failed (unexpected response):" -msgstr "skub fejlede (uventet svar):" - -msgid "remote: " -msgstr "fjernsystem: " - #, python-format msgid "push failed: %s" msgstr "skub fejlede: %s" @@ -11912,6 +11968,9 @@ "kan ikke deponere en sammenføjning partielt (undgå at specificere filer " "eller mønstre)" +msgid "can't commit subrepos without .hgsub" +msgstr "kan ikke deponere underdepoter uden .hgsub" + msgid "file not found!" msgstr "filen blev ikke fundet!" @@ -12117,6 +12176,9 @@ msgid "&Deleted" msgstr "" +msgid "updating" +msgstr "opdaterer" + #, python-format msgid "update failed to remove %s: %s!\n" msgstr "opdatering kunne ikke fjerne %s: %s!\n" @@ -12264,6 +12326,14 @@ msgstr "tilføjer gren\n" #, python-format +msgid "strip failed, full bundle stored in '%s'\n" +msgstr "" + +#, python-format +msgid "strip failed, partial bundle stored in '%s'\n" +msgstr "" + +#, python-format msgid "cannot %s; remote repository does not support the %r capability" msgstr "kan ikke %s: fjerdepotet understøtter ikke %r egenskaben" @@ -12322,9 +12392,6 @@ msgid "missing argument" msgstr "manglende parameter" -msgid "can't negate that" -msgstr "" - #, python-format msgid "can't use %s here" msgstr "" @@ -12409,6 +12476,9 @@ msgid "tagged takes no arguments" msgstr "" +msgid "can't negate that" +msgstr "" + msgid "not a symbol" msgstr "" @@ -12441,13 +12511,16 @@ msgid "no suitable response from remote hg" msgstr "intet brugbart svar fra fjernsystemets hg" +msgid "remote: " +msgstr "fjernsystem: " + +msgid "unexpected response:" +msgstr "uventet svar:" + #, python-format msgid "push refused: %s" msgstr "skub afvist: %s" -msgid "unsynced changes" -msgstr "" - #, python-format msgid "'%s' does not appear to be an hg repository" msgstr "'%s' ser ikke ud til at være et hg depot" @@ -12470,6 +12543,10 @@ msgstr "manglende ] i underdepot kilde" #, python-format +msgid "bad subrepository pattern in %s: %s" +msgstr "" + +#, python-format msgid "" " subrepository sources for %s differ\n" "use (l)ocal source (%s) or (r)emote source (%s)?" @@ -12589,6 +12666,10 @@ msgid "username %s contains a newline\n" msgstr "brugernavn %s indeholder et linieskift\n" +#, python-format +msgid "(deprecated '%%' in path %s=%s from %s)\n" +msgstr "" + msgid "response expected" msgstr "svar forventet" @@ -12881,8 +12962,14 @@ msgid "user name not available - set USERNAME environment variable" msgstr "der er ikke noget brugernavn - sæt USERNAME miljøvariabel" -#~ msgid "failed to update bookmark %s!\n" -#~ msgstr "kunne ikke opdatere bogmærke %s!\n" - -#~ msgid "can't merge with ancestor" -#~ msgstr "kan ikke sammenføje med forfader" +msgid "look up remote revision" +msgstr "" + +msgid "look up remote changes" +msgstr "" + +msgid "push failed:" +msgstr "skub fejlede:" + +msgid "push failed (unexpected response):" +msgstr "skub fejlede (uventet svar):" diff -r 0f6164806283 -r 97e37994a6c3 i18n/ro.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/i18n/ro.po Fri Sep 10 20:19:16 2010 +0200 @@ -0,0 +1,12277 @@ +# Romanian translation for Mercurial +# Traducerea în limba română pentru Mercurial +# +# Copyright (C) 2010 Matt Mackall and others +# +# +# Glosar de traduceri +# =================== +# abort a întrerupe, a renunța +# branch ramură +# bundle pachet (fascicul), a crea un pachet +# change modificare +# changeset set de modificări +# changegroup grup de modificări +# check out a actualiza, a extrage, checkout +# commit depozitare, predare, încredințare, commit +# commit (v) a depozita, a preda, a încredința, commit +# consistency consistență (termen informatic; sens general: coerență) +# deprecated învechit +# discard a înlătura, a renunța la +# head capăt +# hook hook, acțiune, ancoră +# merge a fuziona (a contopi, a îmbina) +# notation notație +# remove a elimina +# repository depozit (magazie) +# resolve a determina [[a rezolva]] +# manage a gestiona +# manifest manifest (și în română, ca "declarație/listă de mărfuri") +# pull (pull), a aduce, a trage, a extrage, +# push (push), a duce, a împinge, a difuza, a distribui +# retrieve a recupera, a regăsi +# switch a comuta +# tag etichetă / a eticheta +# tip vârf +# track a urmări +# update a actualiza +# +# +# NOTĂ: - Terminologia de mai sus este departe de a fi completă sau perfectă. +# De completat și ameliorat +# - Primul termen este cel considerat momentan cel mai potrivit. +# - Măcar pentru primele versiuni, se recomandă păstrarea în paranteze +# a termenului englezesc, mai ales în cazul comenzilor. +# +# Câteva reguli: +# - în ajutorul pentru o comandă, primul rând începe cu un verb +# la prezent fără majusculă +# - în ajutorul pentru o comandă, descrierea opțiunilor se face +# printr-un verb la prezent, pers. a 3-a singular +# +# Dicționar de termeni curenți: +# - a patch queue/stack o stivă de patch-uri (mq) +# - the patch series seria/suita (completă) de patch-uri +# - rejects respingeri, rejectări +# - to revert a reveni +# - the topmost patch ultimul patch aplicat +# - an unrelated repository un depozit neînrudit +# - unversioned neversionat +# unmanaged negestionat +# untracked neurmărit +# - the working directory directorul de lucru +# +# Termeni de păstrat din engleză: +# - a diff un diff +# - a hook un hook +# - a patch un patch +# +# Daniel Dumitriu , 2010. +msgid "" +msgstr "" +"Project-Id-Version: Mercurial\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-08-05 16:06+0200\n" +"PO-Revision-Date: 2010-08-05 15:49+0200\n" +"Last-Translator: Daniel Dumitriu \n" +"Language-Team: Romanian <>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > " +"0 && n%100 < 20)) ? 1 : 2;\n" +"X-Generator: Lokalize 1.0\n" + +#, python-format +msgid " (default: %s)" +msgstr "(implicit: %s)" + +msgid "Options" +msgstr "Opțiuni" + +msgid "Commands" +msgstr "Comenzi" + +msgid " options:" +msgstr " opțiuni:" + +#, python-format +msgid " aliases: %s" +msgstr " alias: %s" + +msgid "hooks for controlling repository access" +msgstr "hook-uri pentru controlul accesului la depozit" + +msgid "" +"This hook makes it possible to allow or deny write access to given\n" +"branches and paths of a repository when receiving incoming changesets\n" +"via pretxnchangegroup and pretxncommit." +msgstr "" +"Acest hook realizează permiterea sau interzicerea accesului\n" +"în scriere la anumite ramuri și căi ale unui depozit, atunci când \n" +"se primesc seturi de modificări prin pretxnchangegroup și pretxncommit." + +msgid "" +"The authorization is matched based on the local user name on the\n" +"system where the hook runs, and not the committer of the original\n" +"changeset (since the latter is merely informative)." +msgstr "" +"Autorizația este căutată pe baza numelui de utilizator local\n" +"de pe sistemul unde rulează hook-ul, nu pe baza numelui celui care a\n" +"publicat setul de modificări original (pentru că acesta e pur informativ)." + +msgid "" +"The acl hook is best used along with a restricted shell like hgsh,\n" +"preventing authenticating users from doing anything other than pushing\n" +"or pulling. The hook is not safe to use if users have interactive\n" +"shell access, as they can then disable the hook. Nor is it safe if\n" +"remote users share an account, because then there is no way to\n" +"distinguish them." +msgstr "" +"Hook-ul acl e folosit optim împreună cu un shell restrictiv precum\n" +"hgsh, care împiedică utilizatorii care doresc să se autentifice să aibă " +"alte\n" +"acțiuni în afară de push și pull. Hook-ul nu prezintă siguranță dacă\n" +"utilizatorii au acces la shell interactiv, deoarece astfel ei pot dezactiva\n" +"hook-ul. De asemenea, nu prezintă siguranță situația în care utilizatorii\n" +"de la distanță partajează un cont, deoarece nu există posibilitatea de\n" +"a-i distinge." + +msgid "The order in which access checks are performed is:" +msgstr "Ordinea în care se fac verificările de acces este:" + +msgid "" +"1) Deny list for branches (section ``acl.deny.branches``)\n" +"2) Allow list for branches (section ``acl.allow.branches``)\n" +"3) Deny list for paths (section ``acl.deny``)\n" +"4) Allow list for paths (section ``acl.allow``)" +msgstr "" +"1) Lista cu interdicții pentru ramuri (secțiunea ``acl.deny.branches``)\n" +"2) Lista cu permisiuni pentru ramuri (secțiunea ``acl.allow.branches``)\n" +"3) Lista cu interdicții pentru căi (secțiunea ``acl.deny``)\n" +"4) Lista cu permisiuni pentru căi (secțiunea ``acl.allow``)" + +msgid "The allow and deny sections take key-value pairs." +msgstr "Secțiunile cu permisiuni și interdicții conțin perechi cheie-valoare." + +msgid "" +"Branch-based Access Control\n" +"---------------------------" +msgstr "" +"Controlul accesului pe bază de ramură\n" +"-------------------------------------" + +msgid "" +"Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to\n" +"have branch-based access control. Keys in these sections can be\n" +"either:" +msgstr "" +"Utilizați secțiunile ``acl.deny.branches`` și ``acl.allow.branches``\n" +"pentru a avea controlul accesului pe baza ramurii. În aceste secțiuni,\n" +"cheile pot fi:" + +msgid "" +"- a branch name, or\n" +"- an asterisk, to match any branch;" +msgstr "" +"- un nume de ramură, sau\n" +"- un asterisc, însemnând orice ramură;" + +msgid "The corresponding values can be either:" +msgstr "Valorile corespunzatoare pot fi:" + +msgid "" +"- a comma-separated list containing users and groups, or\n" +"- an asterisk, to match anyone;" +msgstr "" +"- o listă separată prin virgule conținând utilizatori și grupuri, sau\n" +"- un asterisc, însemnând oricine;" + +msgid "" +"Path-based Access Control\n" +"-------------------------" +msgstr "" + +msgid "" +"Use the ``acl.deny`` and ``acl.allow`` sections to have path-based\n" +"access control. Keys in these sections accept a subtree pattern (with\n" +"a glob syntax by default). The corresponding values follow the same\n" +"syntax as the other sections above." +msgstr "" + +msgid "" +"Groups\n" +"------" +msgstr "" + +msgid "" +"Group names must be prefixed with an ``@`` symbol. Specifying a group\n" +"name has the same effect as specifying all the users in that group." +msgstr "" + +msgid "" +"You can define group members in the ``acl.groups`` section.\n" +"If a group name is not defined there, and Mercurial is running under\n" +"a Unix-like system, the list of users will be taken from the OS.\n" +"Otherwise, an exception will be raised." +msgstr "" + +msgid "" +"Example Configuration\n" +"---------------------" +msgstr "" + +msgid "::" +msgstr "" + +msgid " [hooks]" +msgstr "" + +msgid "" +" # Use this if you want to check access restrictions at commit time\n" +" pretxncommit.acl = python:hgext.acl.hook" +msgstr "" + +msgid "" +" # Use this if you want to check access restrictions for pull, push,\n" +" # bundle and serve.\n" +" pretxnchangegroup.acl = python:hgext.acl.hook" +msgstr "" + +msgid "" +" [acl]\n" +" # Allow or deny access for incoming changes only if their source is\n" +" # listed here, let them pass otherwise. Source is \"serve\" for all\n" +" # remote access (http or ssh), \"push\", \"pull\" or \"bundle\" when the\n" +" # related commands are run locally.\n" +" # Default: serve\n" +" sources = serve" +msgstr "" + +msgid " [acl.deny.branches]" +msgstr "" + +msgid "" +" # Everyone is denied to the frozen branch:\n" +" frozen-branch = *" +msgstr "" + +msgid "" +" # A bad user is denied on all branches:\n" +" * = bad-user" +msgstr "" + +msgid " [acl.allow.branches]" +msgstr "" + +msgid "" +" # A few users are allowed on branch-a:\n" +" branch-a = user-1, user-2, user-3" +msgstr "" + +msgid "" +" # Only one user is allowed on branch-b:\n" +" branch-b = user-1" +msgstr "" + +msgid "" +" # The super user is allowed on any branch:\n" +" * = super-user" +msgstr "" + +msgid "" +" # Everyone is allowed on branch-for-tests:\n" +" branch-for-tests = *" +msgstr "" + +msgid "" +" [acl.deny]\n" +" # This list is checked first. If a match is found, acl.allow is not\n" +" # checked. All users are granted access if acl.deny is not present.\n" +" # Format for both lists: glob pattern = user, ..., @group, ..." +msgstr "" + +msgid "" +" # To match everyone, use an asterisk for the user:\n" +" # my/glob/pattern = *" +msgstr "" + +msgid "" +" # user6 will not have write access to any file:\n" +" ** = user6" +msgstr "" + +msgid "" +" # Group \"hg-denied\" will not have write access to any file:\n" +" ** = @hg-denied" +msgstr "" + +msgid "" +" # Nobody will be able to change \"DONT-TOUCH-THIS.txt\", despite\n" +" # everyone being able to change all other files. See below.\n" +" src/main/resources/DONT-TOUCH-THIS.txt = *" +msgstr "" + +msgid "" +" [acl.allow]\n" +" # if acl.allow is not present, all users are allowed by default\n" +" # empty acl.allow = no users allowed" +msgstr "" + +msgid "" +" # User \"doc_writer\" has write access to any file under the \"docs\"\n" +" # folder:\n" +" docs/** = doc_writer" +msgstr "" + +msgid "" +" # User \"jack\" and group \"designers\" have write access to any file\n" +" # under the \"images\" folder:\n" +" images/** = jack, @designers" +msgstr "" + +msgid "" +" # Everyone (except for \"user6\" - see acl.deny above) will have write\n" +" # access to any file under the \"resources\" folder (except for 1\n" +" # file. See acl.deny):\n" +" src/main/resources/** = *" +msgstr "" + +msgid " .hgtags = release_engineer" +msgstr "" + +#, python-format +msgid "group '%s' is undefined" +msgstr "" + +#, python-format +msgid "" +"config error - hook type \"%s\" cannot stop incoming changesets nor commits" +msgstr "" + +#, python-format +msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")" +msgstr "" + +#, python-format +msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")" +msgstr "" + +#, python-format +msgid "acl: access denied for changeset %s" +msgstr "" + +msgid "track a line of development with movable markers" +msgstr "" + +msgid "" +"Bookmarks are local movable markers to changesets. Every bookmark\n" +"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 shifts to the new changeset." +msgstr "" + +msgid "" +"It is possible to use bookmark names in every revision lookup (e.g.\n" +":hg:`merge`, :hg:`update`)." +msgstr "" + +msgid "" +"By default, when several bookmarks point to the same changeset, they\n" +"will all move forward together. It is possible to obtain a more\n" +"git-like experience by adding the following configuration option to\n" +"your .hgrc::" +msgstr "" + +msgid "" +" [bookmarks]\n" +" track.current = True" +msgstr "" + +msgid "" +"This will cause Mercurial to track the bookmark that you are currently\n" +"using, and only update it. This is similar to git's approach to\n" +"branching.\n" +msgstr "" + +msgid "" +" Bookmarks are pointers to certain commits that move when\n" +" committing. 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 merge and update respectively to a given bookmark." +msgstr "" + +msgid "" +" You can use :hg:`bookmark NAME` to set a bookmark on the working\n" +" directory's parent revision with the given name. If you specify\n" +" a revision using -r REV (where REV may be an existing bookmark),\n" +" the bookmark is assigned to that revision.\n" +" " +msgstr "" + +msgid "a bookmark of this name does not exist" +msgstr "" + +msgid "a bookmark of the same name already exists" +msgstr "" + +msgid "new bookmark name required" +msgstr "" + +msgid "bookmark name required" +msgstr "" + +msgid "bookmark name cannot contain newlines" +msgstr "" + +msgid "bookmark names cannot consist entirely of whitespace" +msgstr "" + +msgid "a bookmark cannot have the name of an existing branch" +msgstr "" + +msgid "no bookmarks set\n" +msgstr "" + +#, python-format +msgid "updating bookmark %s\n" +msgstr "" + +#, python-format +msgid "not updating divergent bookmark %s\n" +msgstr "" + +#, python-format +msgid "updating bookmark %s failed!\n" +msgstr "" + +#, python-format +msgid "remote bookmark %s not found!" +msgstr "" + +#, python-format +msgid "importing bookmark %s\n" +msgstr "" + +#, python-format +msgid "exporting bookmark %s\n" +msgstr "" + +#, python-format +msgid "deleting remote bookmark %s\n" +msgstr "" + +msgid "searching for changes\n" +msgstr "se caută modificări\n" + +msgid "no changes found\n" +msgstr "" + +#, python-format +msgid "comparing with %s\n" +msgstr "" + +msgid "bookmark to import" +msgstr "" + +msgid "bookmark to export" +msgstr "" + +msgid "compare bookmark" +msgstr "" + +msgid "force" +msgstr "" + +msgid "REV" +msgstr "REV" + +msgid "revision" +msgstr "revizia" + +msgid "delete a given bookmark" +msgstr "" + +msgid "NAME" +msgstr "NUME" + +msgid "rename a given bookmark" +msgstr "" + +msgid "hg bookmarks [-f] [-d] [-m NAME] [-r REV] [NAME]" +msgstr "" + +msgid "hooks for integrating with the Bugzilla bug tracker" +msgstr "" + +msgid "" +"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." +msgstr "" + +msgid "" +"The hook updates the Bugzilla database directly. Only Bugzilla\n" +"installations using MySQL are supported." +msgstr "" + +msgid "" +"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." +msgstr "" + +msgid "" +"The extension is configured through three different configuration\n" +"sections. These keys are recognized in the [bugzilla] section:" +msgstr "" + +msgid "" +"host\n" +" Hostname of the MySQL server holding the Bugzilla database." +msgstr "" + +msgid "" +"db\n" +" Name of the Bugzilla database in MySQL. Default 'bugs'." +msgstr "" + +msgid "" +"user\n" +" Username to use to access MySQL server. Default 'bugs'." +msgstr "" + +msgid "" +"password\n" +" Password to use to access MySQL server." +msgstr "" + +msgid "" +"timeout\n" +" Database connection timeout (seconds). Default 5." +msgstr "" + +msgid "" +"version\n" +" Bugzilla version. Specify '3.0' for Bugzilla versions 3.0 and later,\n" +" '2.18' for Bugzilla versions from 2.18 and '2.16' for versions prior\n" +" to 2.18." +msgstr "" + +msgid "" +"bzuser\n" +" Fallback Bugzilla user name to record comments with, if changeset\n" +" committer cannot be found as a Bugzilla user." +msgstr "" + +msgid "" +"bzdir\n" +" Bugzilla install directory. Used by default notify. Default\n" +" '/var/www/html/bugzilla'." +msgstr "" + +msgid "" +"notify\n" +" The command to run to get Bugzilla to send bug change notification\n" +" emails. Substitutes from a map with 3 keys, 'bzdir', 'id' (bug id)\n" +" and 'user' (committer bugzilla email). Default depends on version;\n" +" from 2.18 it is \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl\n" +" %(id)s %(user)s\"." +msgstr "" + +msgid "" +"regexp\n" +" Regular expression to match bug IDs in changeset commit message.\n" +" Must contain one \"()\" group. The default expression matches 'Bug\n" +" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n" +" 1234 and 5678' and variations thereof. Matching is case insensitive." +msgstr "" + +msgid "" +"style\n" +" The style file to use when formatting comments." +msgstr "" + +msgid "" +"template\n" +" Template to use when formatting comments. Overrides style if\n" +" specified. In addition to the usual Mercurial keywords, the\n" +" extension specifies::" +msgstr "" + +msgid "" +" {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." +msgstr "" + +msgid "" +" Default 'changeset {node|short} in repo {root} refers '\n" +" 'to bug {bug}.\\ndetails:\\n\\t{desc|tabindent}'" +msgstr "" + +msgid "" +"strip\n" +" The number of slashes to strip from the front of {root} to produce\n" +" {webroot}. Default 0." +msgstr "" + +msgid "" +"usermap\n" +" Path of file containing Mercurial committer ID to Bugzilla user ID\n" +" mappings. If specified, the file should contain one mapping per\n" +" line, \"committer\"=\"Bugzilla user\". See also the [usermap] section." +msgstr "" + +msgid "" +"The [usermap] section is used to specify mappings of Mercurial\n" +"committer ID to Bugzilla user ID. See also [bugzilla].usermap.\n" +"\"committer\"=\"Bugzilla user\"" +msgstr "" + +msgid "Finally, the [web] section supports one entry:" +msgstr "" + +msgid "" +"baseurl\n" +" Base URL for browsing Mercurial repositories. Reference from\n" +" templates as {hgweb}." +msgstr "" + +msgid "Activating the extension::" +msgstr "" + +msgid "" +" [extensions]\n" +" bugzilla =" +msgstr "" + +msgid "" +" [hooks]\n" +" # run bugzilla hook on every change pulled or pushed in here\n" +" incoming.bugzilla = python:hgext.bugzilla.hook" +msgstr "" + +msgid "Example configuration:" +msgstr "" + +msgid "" +"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. ::" +msgstr "" + +msgid "" +" [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" +msgstr "" + +msgid "" +" [web]\n" +" baseurl=http://dev.domain.com/hg" +msgstr "" + +msgid "" +" [usermap]\n" +" user@emaildomain.com=user.name@bugzilladomain.com" +msgstr "" + +msgid "Commits add a comment to the Bugzilla bug record of the form::" +msgstr "" + +msgid "" +" Changeset 3b16791d6642 in repository-name.\n" +" http://dev.domain.com/hg/repository-name/rev/3b16791d6642" +msgstr "" + +msgid " Changeset commit comment. Bug 1234.\n" +msgstr "" + +#, python-format +msgid "connecting to %s:%s as %s, password %s\n" +msgstr "" + +#, python-format +msgid "query: %s %s\n" +msgstr "" + +#, python-format +msgid "failed query: %s %s\n" +msgstr "" + +msgid "unknown database schema" +msgstr "" + +#, python-format +msgid "bug %d already knows about changeset %s\n" +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 "" + +#, python-format +msgid "looking up user %s\n" +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 "" + +#, python-format +msgid "bugzilla version %s not supported" +msgstr "" + +msgid "" +"changeset {node|short} in repo {root} refers to bug {bug}.\n" +"details:\n" +"\t{desc|tabindent}" +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 "command to display child changesets" +msgstr "" + +msgid "show the children of the given or working directory revision" +msgstr "" + +msgid "" +" Print the children of the working directory's revisions. If a\n" +" revision is given via -r/--rev, the children of that revision will\n" +" be printed. If a file argument is given, revision in which the\n" +" file was last changed (after the working directory revision or the\n" +" argument to --rev if given) is printed.\n" +" " +msgstr "" + +msgid "show children of the specified revision" +msgstr "" + +msgid "hg children [-r REV] [FILE]" +msgstr "" + +msgid "command to display statistics about repository history" +msgstr "" + +#, python-format +msgid "Revision %d is a merge, ignoring...\n" +msgstr "" + +msgid "analyzing" +msgstr "" + +msgid "histogram of changes to the repository" +msgstr "" + +msgid "" +" This command will display a histogram representing the number\n" +" of changed lines or revisions, grouped according to the given\n" +" template. The default template will group changes by author.\n" +" The --dateformat option may be used to group the results by\n" +" date instead." +msgstr "" + +msgid "" +" Statistics are based on the number of changed lines, or\n" +" alternatively the number of matching revisions if the\n" +" --changesets option is specified." +msgstr "" + +msgid " Examples::" +msgstr "" + +msgid "" +" # display count of changed lines for every committer\n" +" hg churn -t '{author|email}'" +msgstr "" + +msgid "" +" # display daily activity graph\n" +" hg churn -f '%H' -s -c" +msgstr "" + +msgid "" +" # display activity of developers by month\n" +" hg churn -f '%Y-%m' -s -c" +msgstr "" + +msgid "" +" # display count of lines changed in every year\n" +" hg churn -f '%Y' -s" +msgstr "" + +msgid "" +" It is possible to map alternate email addresses to a main address\n" +" by providing a file using the following format::" +msgstr "" + +msgid " = " +msgstr " = " + +msgid "" +" Such a file may be specified with the --aliases option, otherwise\n" +" a .hgchurn file will be looked for in the working directory root.\n" +" " +msgstr "" + +msgid "count rate for the specified revision or range" +msgstr "" + +msgid "DATE" +msgstr "" + +msgid "count rate for revisions matching date spec" +msgstr "" + +msgid "TEMPLATE" +msgstr "" + +msgid "template to group changesets" +msgstr "" + +msgid "FORMAT" +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 "display added/removed lines separately" +msgstr "" + +msgid "FILE" +msgstr "" + +msgid "file with email aliases" +msgstr "" + +msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]" +msgstr "" + +msgid "colorize output from some commands" +msgstr "" + +msgid "" +"This extension modifies the status and resolve commands to add color to " +"their\n" +"output 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." +msgstr "" + +msgid "" +"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." +msgstr "" + +msgid "Default effects may be overridden from the .hgrc file::" +msgstr "" + +msgid "" +" [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" +msgstr "" + +msgid "" +" # 'none' turns off all effects\n" +" status.clean = none\n" +" status.copied = none" +msgstr "" + +msgid "" +" qseries.applied = blue bold underline\n" +" qseries.unapplied = black bold\n" +" qseries.missing = red bold" +msgstr "" + +msgid "" +" 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" +msgstr "" + +msgid "" +" resolve.unresolved = red bold\n" +" resolve.resolved = green bold" +msgstr "" + +msgid " bookmarks.current = green" +msgstr "" + +msgid "" +"The color extension will try to detect whether to use ANSI codes or\n" +"Win32 console APIs, unless it is made explicit::" +msgstr "" + +msgid "" +" [color]\n" +" mode = ansi" +msgstr "" + +msgid "Any value other than 'ansi', 'win32', or 'auto' will disable color." +msgstr "" + +#, python-format +msgid "ignoring unknown color/effect %r (configured in color.%s)\n" +msgstr "" + +msgid "win32console not found, please install pywin32\n" +msgstr "" + +msgid "when to colorize (always, auto, or never)" +msgstr "când să se coloreze (întotdeauna, auto, sau niciodată)" + +msgid "TYPE" +msgstr "" + +msgid "import revisions from foreign VCS repositories into Mercurial" +msgstr "" + +msgid "convert a foreign SCM repository to a Mercurial one." +msgstr "" + +msgid " Accepted source formats [identifiers]:" +msgstr "" + +msgid "" +" - 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]" +msgstr "" + +msgid " Accepted destination formats [identifiers]:" +msgstr "" + +msgid "" +" - Mercurial [hg]\n" +" - Subversion [svn] (history on branches is not preserved)" +msgstr "" + +msgid "" +" 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)." +msgstr "" + +msgid "" +" 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." +msgstr "" + +msgid "" +" By default, all sources except Mercurial will use --branchsort.\n" +" Mercurial uses --sourcesort to preserve original revision numbers\n" +" order. Sort modes have the following effects:" +msgstr "" + +msgid "" +" --branchsort convert from parent to child revision when possible,\n" +" which means branches are usually converted one after\n" +" the other. It generates more compact repositories." +msgstr "" + +msgid "" +" --datesort sort revisions by date. Converted repositories have\n" +" good-looking changelogs but are often an order of\n" +" magnitude larger than the same ones generated by\n" +" --branchsort." +msgstr "" + +msgid "" +" --sourcesort try to preserve source revisions order, only\n" +" supported by Mercurial sources." +msgstr "" + +msgid "" +" 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::" +msgstr "" + +msgid " " +msgstr "" + +msgid "" +" 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." +msgstr "" + +msgid "" +" 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" +msgstr "" + +msgid "" +" The filemap is a file that allows filtering and remapping of files\n" +" and directories. Each line can contain one of the following\n" +" directives::" +msgstr "" + +msgid " include path/to/file-or-dir" +msgstr "" + +msgid " exclude path/to/file-or-dir" +msgstr "" + +msgid " rename path/to/source path/to/destination" +msgstr "" + +msgid "" +" Comment lines start with '#'. A specified path matches if it\n" +" equals the full relative name of a file or one of its parent\n" +" directories. The 'include' or 'exclude' directive with the longest\n" +" matching path applies, so line order does not matter." +msgstr "" + +msgid "" +" 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 explicitly\n" +" included. The 'exclude' directive causes files or directories to\n" +" be omitted. The 'rename' directive renames a file or directory if\n" +" it is converted. To rename from a subdirectory into the root of\n" +" the repository, use '.' as the path to rename to." +msgstr "" + +msgid "" +" 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. For example, if\n" +" you have merged \"release-1.0\" into \"trunk\", then you should\n" +" specify the revision on \"trunk\" as the first parent and the one on\n" +" the \"release-1.0\" branch as the second." +msgstr "" + +msgid "" +" The branchmap is a file that allows you to rename a branch when it is\n" +" being brought in from whatever external repository. When used in\n" +" conjunction with a splicemap, it allows for a powerful combination\n" +" to help fix even the most badly mismanaged repositories and turn them\n" +" into nicely structured Mercurial repositories. The branchmap contains\n" +" lines of the form \"original_branch_name new_branch_name\".\n" +" \"original_branch_name\" is the name of the branch in the source\n" +" repository, and \"new_branch_name\" is the name of the branch is the\n" +" destination repository. This can be used to (for instance) move code\n" +" in one repository from \"default\" to a named branch." +msgstr "" + +msgid "" +" Mercurial Source\n" +" ----------------" +msgstr "" + +msgid "" +" --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" +msgstr "" + +msgid "" +" CVS Source\n" +" ----------" +msgstr "" + +msgid "" +" 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 reorganization in the CVS\n" +" sandbox is ignored." +msgstr "" + +msgid " The options shown are the defaults." +msgstr "" + +msgid "" +" --config convert.cvsps.cache=True (boolean)\n" +" Set to False to disable remote log caching, for testing and\n" +" debugging purposes.\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 of a\n" +" changeset then the default may not be long 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" +" --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" +" --config hook.cvslog\n" +" Specify a Python function to be called at the end of gathering\n" +" the CVS log. The function is passed a list with the log entries,\n" +" and can modify the entries in-place, or add or delete them.\n" +" --config hook.cvschangesets\n" +" Specify a Python function to be called after the changesets\n" +" are calculated from the the CVS log. The function is passed\n" +" a list with the changeset entries, and can modify the changesets\n" +" in-place, or add or delete them." +msgstr "" + +msgid "" +" An additional \"debugcvsps\" Mercurial command 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. Please see\n" +" the command help for more details." +msgstr "" + +msgid "" +" Subversion Source\n" +" -----------------" +msgstr "" + +msgid "" +" 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 overridden with following options. Set them to paths\n" +" relative to the source URL, or leave them blank to disable auto\n" +" detection." +msgstr "" + +msgid "" +" --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" +msgstr "" + +msgid "" +" Source history can be retrieved starting at a specific revision,\n" +" instead of being integrally converted. Only single branch\n" +" conversions are supported." +msgstr "" + +msgid "" +" --config convert.svn.startrev=0 (svn revision number)\n" +" specify start Subversion revision." +msgstr "" + +msgid "" +" Perforce Source\n" +" ---------------" +msgstr "" + +msgid "" +" 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." +msgstr "" + +msgid "" +" It is possible to limit the amount of source history to be\n" +" converted by specifying an initial Perforce revision." +msgstr "" + +msgid "" +" --config convert.p4.startrev=0 (perforce changelist number)\n" +" specify initial Perforce revision." +msgstr "" + +msgid "" +" Mercurial Destination\n" +" ---------------------" +msgstr "" + +msgid "" +" --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" +msgstr "" + +msgid " " +msgstr "" + +msgid "create changeset information from CVS" +msgstr "" + +msgid "" +" 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." +msgstr "" + +msgid "" +" 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 "change branch names while converting" +msgstr "" + +msgid "try to sort changesets by branches" +msgstr "" + +msgid "try to sort changesets by date" +msgstr "" + +msgid "preserve source changesets order" +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 does not look like a Bazaar repository" +msgstr "" + +msgid "Bazaar modules could not be loaded" +msgstr "" + +msgid "" +"warning: lightweight checkouts may cause conversion failures, try with a " +"regular branch instead.\n" +msgstr "" + +msgid "bzr source type could not be determined\n" +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 "%s.%s symlink has no target" +msgstr "" + +#, python-format +msgid "cannot find required \"%s\" tool" +msgstr "" + +#, python-format +msgid "%s error:\n" +msgstr "" + +#, python-format +msgid "syntax error in %s(%d): key/value pair expected" +msgstr "" + +#, python-format +msgid "could not open map file %r: %s" +msgstr "" + +#, python-format +msgid "%s: invalid source repository type" +msgstr "" + +#, python-format +msgid "%s: missing or unsupported repository" +msgstr "" + +#, python-format +msgid "%s: invalid destination repository type" +msgstr "" + +#, python-format +msgid "convert: %s\n" +msgstr "" + +#, python-format +msgid "%s: unknown repository type" +msgstr "" + +#, fuzzy +msgid "getting files" +msgstr "se primește %s\n" + +msgid "revisions" +msgstr "" + +msgid "scanning" +msgstr "" + +#, python-format +msgid "unknown sort mode: %s" +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 "" + +msgid "converting" +msgstr "" + +#, python-format +msgid "assuming destination %s\n" +msgstr "" + +msgid "more than one sort mode specified" +msgstr "" + +msgid "--sourcesort is not supported by this data source" +msgstr "" + +#, python-format +msgid "%s does not look like a CVS checkout" +msgstr "" + +#, python-format +msgid "revision %s is not a patchset number" +msgstr "" + +#, python-format +msgid "connecting to %s\n" +msgstr "" + +msgid "CVS pserver authentication failed" +msgstr "" + +#, python-format +msgid "" +"unexpected response from CVS server (expected \"Valid-requests\", but got %r)" +msgstr "" + +#, python-format +msgid "%d bytes missing from remote file" +msgstr "" + +msgid "malformed response from CVS" +msgstr "" + +#, python-format +msgid "cvs server: %s\n" +msgstr "" + +#, python-format +msgid "unknown CVS response: %s" +msgstr "" + +msgid "collecting CVS rlog\n" +msgstr "" + +msgid "not a CVS sandbox" +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 "" + +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 "" + +msgid "log cache overlaps with new log entries, re-run without cache." +msgstr "" + +#, 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 "" +"warning: CVS commit message references non-existent branch %r:\n" +"%s\n" +msgstr "" + +#, python-format +msgid "%d changeset entries\n" +msgstr "" + +#, python-format +msgid "%s does not look like a darcs repository" +msgstr "" + +#, python-format +msgid "darcs version 2.1 or newer needed (found %r)" +msgstr "" + +msgid "Python ElementTree module is not available" +msgstr "" + +msgid "internal calling inconsistency" +msgstr "" + +msgid "errors in filemap" +msgstr "" + +#, python-format +msgid "%s:%d: path to %s is missing\n" +msgstr "" + +#, python-format +msgid "%s:%d: %r already in %s list\n" +msgstr "" + +#, python-format +msgid "%s:%d: superfluous / in %s %r\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 Git repository" +msgstr "" + +msgid "cannot retrieve git heads" +msgstr "" + +#, python-format +msgid "cannot read %r object at %s" +msgstr "" + +#, python-format +msgid "cannot read changes in %s" +msgstr "" + +#, python-format +msgid "cannot read tags from %s" +msgstr "" + +#, python-format +msgid "%s does not look like a GNU Arch repository" +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 "could not parse cat-log of %s" +msgstr "" + +#, python-format +msgid "%s is not a local Mercurial repository" +msgstr "" + +#, python-format +msgid "initializing destination %s repository\n" +msgstr "" + +#, python-format +msgid "could not create hg repository %s as sink" +msgstr "" + +#, python-format +msgid "pulling from %s into %s\n" +msgstr "" + +msgid "filtering out empty revision\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 "" + +#, python-format +msgid "%s does not look like a monotone repository" +msgstr "" + +#, python-format +msgid "copying file in renamed directory from '%s' to '%s'" +msgstr "" + +#, python-format +msgid "%s does not look like a P4 repository" +msgstr "" + +msgid "reading p4 views\n" +msgstr "" + +msgid "collecting p4 changelists\n" +msgstr "" + +msgid "Mercurial failed to run itself, check hg executable is in PATH" +msgstr "" + +msgid "" +"svn: cannot probe remote repository, assume it could be a subversion " +"repository. Use --source-type if you know better.\n" +msgstr "" + +#, python-format +msgid "%s does not look like a Subversion repository" +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 more than one branch" +msgstr "" + +#, python-format +msgid "svn: no revision found after start revision %d" +msgstr "" + +#, python-format +msgid "%s not found up to revision %d" +msgstr "" + +msgid "scanning paths" +msgstr "" + +#, python-format +msgid "found parent of branch %s at %d: %s\n" +msgstr "" + +#, python-format +msgid "fetching revision log for \"%s\" from %d to %d\n" +msgstr "" + +#, python-format +msgid "svn: branch has no revision %s" +msgstr "" + +#, python-format +msgid "initializing svn repository %r\n" +msgstr "" + +#, python-format +msgid "initializing svn working copy %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 "automatically manage newlines in repository files" +msgstr "" + +msgid "" +"This extension allows you to manage the type of line endings (CRLF or\n" +"LF) that are used in the repository and in the local working\n" +"directory. That way you can get CRLF line endings on Windows and LF on\n" +"Unix/Mac, thereby letting everybody use their OS native line endings." +msgstr "" + +msgid "" +"The extension reads its configuration from a versioned ``.hgeol``\n" +"configuration file every time you run an ``hg`` command. The\n" +"``.hgeol`` file use the same syntax as all other Mercurial\n" +"configuration files. It uses two sections, ``[patterns]`` and\n" +"``[repository]``." +msgstr "" + +msgid "" +"The ``[patterns]`` section specifies the line endings used in the\n" +"working directory. The format is specified by a file pattern. The\n" +"first match is used, so put more specific patterns first. The\n" +"available line endings are ``LF``, ``CRLF``, and ``BIN``." +msgstr "" + +msgid "" +"Files with the declared format of ``CRLF`` or ``LF`` are always\n" +"checked out in that format and files declared to be binary (``BIN``)\n" +"are left unchanged. Additionally, ``native`` is an alias for the\n" +"platform's default line ending: ``LF`` on Unix (including Mac OS X)\n" +"and ``CRLF`` on Windows. Note that ``BIN`` (do nothing to line\n" +"endings) is Mercurial's default behaviour; it is only needed if you\n" +"need to override a later, more general pattern." +msgstr "" + +msgid "" +"The optional ``[repository]`` section specifies the line endings to\n" +"use for files stored in the repository. It has a single setting,\n" +"``native``, which determines the storage line endings for files\n" +"declared as ``native`` in the ``[patterns]`` section. It can be set to\n" +"``LF`` or ``CRLF``. The default is ``LF``. For example, this means\n" +"that on Windows, files configured as ``native`` (``CRLF`` by default)\n" +"will be converted to ``LF`` when stored in the repository. Files\n" +"declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section\n" +"are always stored as-is in the repository." +msgstr "" + +msgid "Example versioned ``.hgeol`` file::" +msgstr "" + +msgid "" +" [patterns]\n" +" **.py = native\n" +" **.vcproj = CRLF\n" +" **.txt = native\n" +" Makefile = LF\n" +" **.jpg = BIN" +msgstr "" + +msgid "" +" [repository]\n" +" native = LF" +msgstr "" + +msgid "" +"The extension uses an optional ``[eol]`` section in your hgrc file\n" +"(not the ``.hgeol`` file) for settings that control the overall\n" +"behavior. There are two settings:" +msgstr "" + +msgid "" +"- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or\n" +" ``CRLF`` override the default interpretation of ``native`` for\n" +" checkout. This can be used with :hg:`archive` on Unix, say, to\n" +" generate an archive where files have line endings for Windows." +msgstr "" + +msgid "" +"- ``eol.only-consistent`` (default True) can be set to False to make\n" +" the extension convert files with inconsistent EOLs. Inconsistent\n" +" means that there is both ``CRLF`` and ``LF`` present in the file.\n" +" Such files are normally not touched under the assumption that they\n" +" have mixed EOLs on purpose." +msgstr "" + +msgid "" +"See :hg:`help patterns` for more information about the glob patterns\n" +"used.\n" +msgstr "" + +#, python-format +msgid "%s should not have CRLF line endings" +msgstr "" + +#, python-format +msgid "%s should not have LF line endings" +msgstr "" + +msgid "the eol extension is incompatible with the win32text extension" +msgstr "" + +#, python-format +msgid "ignoring unknown EOL style '%s' from %s\n" +msgstr "" + +#, python-format +msgid "inconsistent newline style in %s\n" +msgstr "" + +msgid "command to allow external programs to compare revisions" +msgstr "" + +msgid "" +"The extdiff Mercurial extension allows you to use external programs\n" +"to compare revisions, or revision with working directory. The external\n" +"diff 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." +msgstr "" + +msgid "" +"The extdiff extension also allows to configure new diff commands, so\n" +"you do not need to type :hg:`extdiff -p kdiff3` always. ::" +msgstr "" + +msgid "" +" [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" +msgstr "" + +msgid "" +" # add new command called vdiff, runs kdiff3\n" +" vdiff = kdiff3" +msgstr "" + +msgid "" +" # add new command called meld, runs meld (no need to name twice)\n" +" meld =" +msgstr "" + +msgid "" +" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n" +" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n" +" # 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)'" +msgstr "" + +msgid "Tool arguments can include variables that are expanded at runtime::" +msgstr "" + +msgid "" +" $parent1, $plabel1 - filename, descriptive label of first parent\n" +" $child, $clabel - filename, descriptive label of child revision\n" +" $parent2, $plabel2 - filename, descriptive label of second parent\n" +" $parent is an alias for $parent1." +msgstr "" + +msgid "" +"The extdiff extension will look in your [diff-tools] and [merge-tools]\n" +"sections for diff tool arguments, when none are specified in [extdiff]." +msgstr "" + +msgid "" +" [extdiff]\n" +" kdiff3 =" +msgstr "" + +msgid "" +" [diff-tools]\n" +" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child" +msgstr "" + +msgid "" +"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" +msgstr "" + +#, python-format +msgid "making snapshot of %d files from rev %s\n" +msgstr "" + +#, python-format +msgid "making snapshot of %d files from working directory\n" +msgstr "" + +msgid "cannot specify --rev and --change at the same time" +msgstr "" + +msgid "cleaning up temp directory\n" +msgstr "" + +msgid "use external program to diff repository (or selected files)" +msgstr "" + +msgid "" +" Show differences between revisions for the specified files, using\n" +" an external program. The default program used is diff, with\n" +" default options \"-Npru\"." +msgstr "" + +msgid "" +" To select a different program, use the -p/--program option. The\n" +" program will be passed the names of two directories to compare. To\n" +" pass additional options to the program, use -o/--option. These\n" +" will be passed before the names of the directories to compare." +msgstr "" + +msgid "" +" 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 "CMD" +msgstr "CMD" + +msgid "comparison program to run" +msgstr "" + +msgid "OPT" +msgstr "" + +msgid "pass option to comparison program" +msgstr "" + +msgid "change made by revision" +msgstr "" + +msgid "hg extdiff [OPT]... [FILE]..." +msgstr "" + +#, python-format +msgid "use %(path)s to diff repository (or selected files)" +msgstr "" + +#, python-format +msgid "" +" Show differences between revisions for the specified files, using\n" +" the %(path)s program." +msgstr "" + +#, python-format +msgid "hg %s [OPTION]... [FILE]..." +msgstr "" + +msgid "pull, update and merge in one command" +msgstr "" + +msgid "pull changes from a remote repository, merge new changes if needed." +msgstr "" + +msgid "" +" This finds all changes from the repository at the specified path\n" +" or URL and adds them to the local repository." +msgstr "" + +msgid "" +" 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." +msgstr "" + +msgid "" +" 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." +msgstr "" + +msgid "" +" See :hg:`help dates` for a list of formats valid for -d/--date.\n" +" " +msgstr "" +" Vezi :hg:`help dates` pentru o listă de formate valide cu d/--date.\n" +" " + +msgid "" +"working dir not at branch tip (use \"hg update\" to check out branch tip)" +msgstr "" + +msgid "outstanding uncommitted merge" +msgstr "" + +msgid "outstanding uncommitted changes" +msgstr "" + +msgid "working directory is missing some files" +msgstr "" + +msgid "" +"multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)" +msgstr "" + +#, python-format +msgid "pulling from %s\n" +msgstr "" + +msgid "" +"Other repository doesn't support revision lookup, so a rev cannot be " +"specified." +msgstr "" + +#, python-format +msgid "" +"not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge" +"\" to merge them)\n" +msgstr "" + +#, python-format +msgid "updating to %d:%s\n" +msgstr "" + +#, python-format +msgid "merging with %d:%s\n" +msgstr "" + +#, python-format +msgid "new changeset %d:%s merges remote changes with local\n" +msgstr "" + +msgid "a specific revision you would like to pull" +msgstr "" + +msgid "edit commit message" +msgstr "" + +msgid "edit commit message (DEPRECATED)" +msgstr "" + +msgid "switch parents when merging" +msgstr "" + +msgid "hg fetch [SOURCE]" +msgstr "" + +msgid "commands to sign and verify changesets" +msgstr "" + +msgid "error while verifying signature" +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 "add a signature for the current or given revision" +msgstr "" + +msgid "" +" If no revision is given, the parent of the working directory is used,\n" +" or tip if no revision is checked out." +msgstr "" + +msgid "uncommitted merge - please provide a specific revision" +msgstr "" + +#, python-format +msgid "Signing %d:%s\n" +msgstr "" + +msgid "Error while signing" +msgstr "" + +msgid "" +"working copy of .hgsigs is changed (please commit .hgsigs manually or use --" +"force)" +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 "ID" +msgstr "" + +msgid "the key id to sign with" +msgstr "" + +msgid "TEXT" +msgstr "" + +msgid "commit message" +msgstr "" + +msgid "hg sign [OPTION]... [REVISION]..." +msgstr "" + +msgid "hg sigcheck REVISION" +msgstr "" + +msgid "hg sigs" +msgstr "" + +msgid "command to view revision graphs from a shell" +msgstr "" + +msgid "" +"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 "" + +#, python-format +msgid "--graph option is incompatible with --%s" +msgstr "" + +msgid "show revision history alongside an ASCII revision graph" +msgstr "" + +msgid "" +" Print a revision history alongside a revision graph drawn with\n" +" ASCII characters." +msgstr "" + +msgid "" +" Nodes printed as an @ character are parents of the working\n" +" directory.\n" +" " +msgstr "" + +msgid "show the revision DAG" +msgstr "afișează graful (DAG) reviziilor" + +msgid "NUM" +msgstr "" + +msgid "limit number of changes displayed" +msgstr "limitează numărul de modificări afișat" + +msgid "show patch" +msgstr "afișează patch-ul" + +msgid "show the specified revision or range" +msgstr "afișează revizia sau intervalul specificat" + +msgid "hg glog [OPTION]... [FILE]" +msgstr "" + +msgid "hooks for integrating with the CIA.vc notification service" +msgstr "" + +msgid "" +"This is meant to be run as a changegroup or incoming hook. To\n" +"configure it, set the following options in your hgrc::" +msgstr "" + +msgid "" +" [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" +msgstr "" + +msgid "" +" [hooks]\n" +" # one of these:\n" +" changegroup.cia = python:hgcia.hook\n" +" #incoming.cia = python:hgcia.hook" +msgstr "" + +msgid "" +" [web]\n" +" # If you want hyperlinks (optional)\n" +" baseurl = http://server/path/to/repo\n" +msgstr "" + +#, python-format +msgid "%s returned an error: %s" +msgstr "" + +#, python-format +msgid "hgcia: sending update to %s\n" +msgstr "" + +msgid "email.from must be defined when sending by email" +msgstr "" + +msgid "browse the repository in a graphical way" +msgstr "" + +msgid "" +"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.)" +msgstr "" + +msgid "" +"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 the extension is shipped in the hgext\n" +"repository, and needs to be enabled." +msgstr "" + +msgid "" +"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::" +msgstr "" + +msgid "" +" [hgk]\n" +" path=/location/of/hgk" +msgstr "" + +msgid "" +"hgk can make use of the extdiff extension to visualize revisions.\n" +"Assuming you had already configured extdiff vdiff command, just add::" +msgstr "" + +msgid "" +" [hgk]\n" +" vdiff=vdiff" +msgstr "" + +msgid "" +"Revisions context menu will now display additional entries to fire\n" +"vdiff on hovered and selected revisions.\n" +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 REV REV" +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 [OPTION]... REV..." +msgstr "" + +msgid "syntax highlighting for hgweb (requires Pygments)" +msgstr "" + +msgid "" +"It depends on the Pygments syntax highlighting library:\n" +"http://pygments.org/" +msgstr "" + +msgid "There is a single configuration option::" +msgstr "" + +msgid "" +" [web]\n" +" pygments_style =