# HG changeset patch # User Matt Mackall # Date 1405381983 18000 # Node ID cf599f8a2da8fc0f0221b0daa3494802eb94af16 # Parent abae1eb695c077fa21b6ef0b7056f36d63cf0302# Parent 3420346174b1cff51e6af2cffaa2756c68882dd8 merge with stable diff -r abae1eb695c0 -r cf599f8a2da8 hgext/bugzilla.py --- a/hgext/bugzilla.py Sat Jul 12 20:44:00 2014 -0700 +++ b/hgext/bugzilla.py Mon Jul 14 18:53:03 2014 -0500 @@ -777,32 +777,25 @@ r'(?P(?:#?\d+\s*(?:,?\s*(?:and)?)?\s*)+)' r'\.?\s*(?:h(?:ours?)?\s*(?P\d*(?:\.\d+)?))?') - _bz = None - def __init__(self, ui, repo): self.ui = ui self.repo = repo - def bz(self): - '''return object that knows how to talk to bugzilla version in - use.''' + bzversion = self.ui.config('bugzilla', 'version') + try: + bzclass = bugzilla._versions[bzversion] + except KeyError: + raise util.Abort(_('bugzilla version %s not supported') % + bzversion) + self.bzdriver = bzclass(self.ui) - if bugzilla._bz is None: - bzversion = self.ui.config('bugzilla', 'version') - try: - bzclass = bugzilla._versions[bzversion] - except KeyError: - raise util.Abort(_('bugzilla version %s not supported') % - bzversion) - bugzilla._bz = bzclass(self.ui) - return bugzilla._bz - - def __getattr__(self, key): - return getattr(self.bz(), key) - - _bug_re = None - _fix_re = None - _split_re = None + self.bug_re = re.compile( + self.ui.config('bugzilla', 'regexp', + bugzilla._default_bug_re), re.IGNORECASE) + self.fix_re = re.compile( + self.ui.config('bugzilla', 'fixregexp', + bugzilla._default_fix_re), re.IGNORECASE) + self.split_re = re.compile(r'\D+') def find_bugs(self, ctx): '''return bugs dictionary created from commit comment. @@ -811,19 +804,11 @@ not known to Bugzilla, and any that already have a reference to the given changeset in their comments. ''' - if bugzilla._bug_re is None: - bugzilla._bug_re = re.compile( - self.ui.config('bugzilla', 'regexp', - bugzilla._default_bug_re), re.IGNORECASE) - bugzilla._fix_re = re.compile( - self.ui.config('bugzilla', 'fixregexp', - bugzilla._default_fix_re), re.IGNORECASE) - bugzilla._split_re = re.compile(r'\D+') start = 0 hours = 0.0 bugs = {} - bugmatch = bugzilla._bug_re.search(ctx.description(), start) - fixmatch = bugzilla._fix_re.search(ctx.description(), start) + bugmatch = self.bug_re.search(ctx.description(), start) + fixmatch = self.fix_re.search(ctx.description(), start) while True: bugattribs = {} if not bugmatch and not fixmatch: @@ -839,11 +824,11 @@ m = fixmatch start = m.end() if m is bugmatch: - bugmatch = bugzilla._bug_re.search(ctx.description(), start) + bugmatch = self.bug_re.search(ctx.description(), start) if 'fix' in bugattribs: del bugattribs['fix'] else: - fixmatch = bugzilla._fix_re.search(ctx.description(), start) + fixmatch = self.fix_re.search(ctx.description(), start) bugattribs['fix'] = None try: @@ -860,14 +845,14 @@ except ValueError: self.ui.status(_("%s: invalid hours\n") % m.group('hours')) - for id in bugzilla._split_re.split(ids): + for id in self.split_re.split(ids): if not id: continue bugs[int(id)] = bugattribs if bugs: - self.filter_real_bug_ids(bugs) + self.bzdriver.filter_real_bug_ids(bugs) if bugs: - self.filter_cset_known_bug_ids(ctx.node(), bugs) + self.bzdriver.filter_cset_known_bug_ids(ctx.node(), bugs) return bugs def update(self, bugid, newstate, ctx): @@ -902,7 +887,11 @@ root=self.repo.root, webroot=webroot(self.repo.root)) data = self.ui.popbuffer() - self.updatebug(bugid, newstate, data, util.email(ctx.user())) + self.bzdriver.updatebug(bugid, newstate, data, util.email(ctx.user())) + + def notify(self, bugs, committer): + '''ensure Bugzilla users are notified of bug change.''' + self.bzdriver.notify(bugs, committer) def hook(ui, repo, hooktype, node=None, **kwargs): '''add comment to bugzilla for each changeset that refers to a diff -r abae1eb695c0 -r cf599f8a2da8 hgext/convert/git.py --- a/hgext/convert/git.py Sat Jul 12 20:44:00 2014 -0700 +++ b/hgext/convert/git.py Mon Jul 14 18:53:03 2014 -0500 @@ -133,6 +133,8 @@ return data def getfile(self, name, rev): + if rev == hex(nullid): + raise IOError if name == '.hgsub': data = '\n'.join([m.hgsub() for m in self.submoditer()]) mode = '' @@ -184,6 +186,7 @@ seen = set() entry = None subexists = False + subdeleted = False for l in fh.read().split('\x00'): if not entry: if not l.startswith(':'): @@ -200,7 +203,11 @@ if f == '.gitmodules': subexists = True - changes.append(('.hgsub', '')) + if entry[4] == 'D': + subdeleted = True + changes.append(('.hgsub', hex(nullid))) + else: + changes.append(('.hgsub', '')) elif entry[1] == '160000' or entry[0] == ':160000': subexists = True else: @@ -211,8 +218,11 @@ raise util.Abort(_('cannot read changes in %s') % version) if subexists: - self.retrievegitmodules(version) - changes.append(('.hgsubstate', '')) + if subdeleted: + changes.append(('.hgsubstate', hex(nullid))) + else: + self.retrievegitmodules(version) + changes.append(('.hgsubstate', '')) return (changes, {}) def getcommit(self, version): diff -r abae1eb695c0 -r cf599f8a2da8 mercurial/templatefilters.py --- a/mercurial/templatefilters.py Sat Jul 12 20:44:00 2014 -0700 +++ b/mercurial/templatefilters.py Mon Jul 14 18:53:03 2014 -0500 @@ -216,7 +216,7 @@ _escapes = [ ('\\', '\\\\'), ('"', '\\"'), ('\t', '\\t'), ('\n', '\\n'), ('\r', '\\r'), ('\f', '\\f'), ('\b', '\\b'), - ('<', '\\u003c'), ('>', '\\u003e') + ('<', '\\u003c'), ('>', '\\u003e'), ('\0', '\\u0000') ] def jsonescape(s): diff -r abae1eb695c0 -r cf599f8a2da8 tests/test-convert-git.t --- a/tests/test-convert-git.t Sat Jul 12 20:44:00 2014 -0700 +++ b/tests/test-convert-git.t Mon Jul 14 18:53:03 2014 -0500 @@ -363,6 +363,23 @@ $ cd ../.. +convert the revision removing '.gitmodules' itself (and related +submodules) + + $ cd git-repo6 + $ git rm .gitmodules + rm '.gitmodules' + $ git rm --cached git-repo5 + rm 'git-repo5' + $ commit -a -m 'remove .gitmodules and submodule git-repo5' + $ cd .. + + $ hg convert -q git-repo6 git-repo6-hg + $ hg -R git-repo6-hg tip -T "{desc|firstline}\n" + remove .gitmodules and submodule git-repo5 + $ hg -R git-repo6-hg tip -T "{file_dels}\n" + .hgsub .hgsubstate + damaged git repository tests: In case the hard-coded hashes change, the following commands can be used to list the hashes and their corresponding types in the repository: diff -r abae1eb695c0 -r cf599f8a2da8 tests/test-hgweb-commands.t --- a/tests/test-hgweb-commands.t Sat Jul 12 20:44:00 2014 -0700 +++ b/tests/test-hgweb-commands.t Mon Jul 14 18:53:03 2014 -0500 @@ -1730,7 +1730,7 @@