equal
deleted
inserted
replaced
15 from mercurial.pycompat import ( |
15 from mercurial.pycompat import ( |
16 getattr, |
16 getattr, |
17 open, |
17 open, |
18 setattr, |
18 setattr, |
19 ) |
19 ) |
|
20 from mercurial.node import ( |
|
21 bin, |
|
22 hex, |
|
23 short, |
|
24 ) |
20 from mercurial import ( |
25 from mercurial import ( |
21 error, |
26 error, |
22 linelog as linelogmod, |
27 linelog as linelogmod, |
23 lock as lockmod, |
28 lock as lockmod, |
24 mdiff, |
29 mdiff, |
25 node, |
|
26 pycompat, |
30 pycompat, |
27 scmutil, |
31 scmutil, |
28 util, |
32 util, |
29 ) |
33 ) |
30 from mercurial.utils import ( |
34 from mercurial.utils import ( |
148 |
152 |
149 def hashdiffopts(diffopts): |
153 def hashdiffopts(diffopts): |
150 diffoptstr = stringutil.pprint( |
154 diffoptstr = stringutil.pprint( |
151 sorted((k, getattr(diffopts, k)) for k in mdiff.diffopts.defaults) |
155 sorted((k, getattr(diffopts, k)) for k in mdiff.diffopts.defaults) |
152 ) |
156 ) |
153 return node.hex(hashutil.sha1(diffoptstr).digest())[:6] |
157 return hex(hashutil.sha1(diffoptstr).digest())[:6] |
154 |
158 |
155 |
159 |
156 _defaultdiffopthash = hashdiffopts(mdiff.defaultopts) |
160 _defaultdiffopthash = hashdiffopts(mdiff.defaultopts) |
157 |
161 |
158 |
162 |
306 # the fast path test requires commit hash, convert rev number to hash, |
310 # the fast path test requires commit hash, convert rev number to hash, |
307 # so it may hit the fast path. note: in the "fctx" mode, the "annotate" |
311 # so it may hit the fast path. note: in the "fctx" mode, the "annotate" |
308 # command could give us a revision number even if the user passes a |
312 # command could give us a revision number even if the user passes a |
309 # commit hash. |
313 # commit hash. |
310 if isinstance(rev, int): |
314 if isinstance(rev, int): |
311 rev = node.hex(self.repo.changelog.node(rev)) |
315 rev = hex(self.repo.changelog.node(rev)) |
312 |
316 |
313 # fast path: if rev is in the main branch already |
317 # fast path: if rev is in the main branch already |
314 directly, revfctx = self.canannotatedirectly(rev) |
318 directly, revfctx = self.canannotatedirectly(rev) |
315 if directly: |
319 if directly: |
316 if self.ui.debugflag: |
320 if self.ui.debugflag: |
491 from rev. |
495 from rev. |
492 """ |
496 """ |
493 result = True |
497 result = True |
494 f = None |
498 f = None |
495 if not isinstance(rev, int) and rev is not None: |
499 if not isinstance(rev, int) and rev is not None: |
496 hsh = {20: bytes, 40: node.bin}.get(len(rev), lambda x: None)(rev) |
500 hsh = {20: bytes, 40: bin}.get(len(rev), lambda x: None)(rev) |
497 if hsh is not None and (hsh, self.path) in self.revmap: |
501 if hsh is not None and (hsh, self.path) in self.revmap: |
498 f = hsh |
502 f = hsh |
499 if f is None: |
503 if f is None: |
500 adjustctx = b'linkrev' if self._perfhack else True |
504 adjustctx = b'linkrev' if self._perfhack else True |
501 f = self._resolvefctx(rev, adjustctx=adjustctx, resolverev=True) |
505 f = self._resolvefctx(rev, adjustctx=adjustctx, resolverev=True) |
596 hsh = annotateresult[idxs[0]][0] |
600 hsh = annotateresult[idxs[0]][0] |
597 if self.ui.debugflag: |
601 if self.ui.debugflag: |
598 self.ui.debug( |
602 self.ui.debug( |
599 b'fastannotate: reading %s line #%d ' |
603 b'fastannotate: reading %s line #%d ' |
600 b'to resolve lines %r\n' |
604 b'to resolve lines %r\n' |
601 % (node.short(hsh), linenum, idxs) |
605 % (short(hsh), linenum, idxs) |
602 ) |
606 ) |
603 fctx = self._resolvefctx(hsh, revmap.rev2path(rev)) |
607 fctx = self._resolvefctx(hsh, revmap.rev2path(rev)) |
604 lines = mdiff.splitnewlines(fctx.data()) |
608 lines = mdiff.splitnewlines(fctx.data()) |
605 revlines[rev] = lines |
609 revlines[rev] = lines |
606 for idx in idxs: |
610 for idx in idxs: |
608 assert all(x is not None for x in result) |
612 assert all(x is not None for x in result) |
609 return result |
613 return result |
610 |
614 |
611 # run the annotate and the lines should match to the file content |
615 # run the annotate and the lines should match to the file content |
612 self.ui.debug( |
616 self.ui.debug( |
613 b'fastannotate: annotate %s to resolve lines\n' |
617 b'fastannotate: annotate %s to resolve lines\n' % short(hsh) |
614 % node.short(hsh) |
|
615 ) |
618 ) |
616 linelog.annotate(rev) |
619 linelog.annotate(rev) |
617 fctx = self._resolvefctx(hsh, revmap.rev2path(rev)) |
620 fctx = self._resolvefctx(hsh, revmap.rev2path(rev)) |
618 annotated = linelog.annotateresult |
621 annotated = linelog.annotateresult |
619 lines = mdiff.splitnewlines(fctx.data()) |
622 lines = mdiff.splitnewlines(fctx.data()) |
638 hsh = f |
641 hsh = f |
639 else: |
642 else: |
640 hsh = f.node() |
643 hsh = f.node() |
641 llrev = self.revmap.hsh2rev(hsh) |
644 llrev = self.revmap.hsh2rev(hsh) |
642 if not llrev: |
645 if not llrev: |
643 raise faerror.CorruptedFileError( |
646 raise faerror.CorruptedFileError(b'%s is not in revmap' % hex(hsh)) |
644 b'%s is not in revmap' % node.hex(hsh) |
|
645 ) |
|
646 if (self.revmap.rev2flag(llrev) & revmapmod.sidebranchflag) != 0: |
647 if (self.revmap.rev2flag(llrev) & revmapmod.sidebranchflag) != 0: |
647 raise faerror.CorruptedFileError( |
648 raise faerror.CorruptedFileError( |
648 b'%s is not in revmap mainbranch' % node.hex(hsh) |
649 b'%s is not in revmap mainbranch' % hex(hsh) |
649 ) |
650 ) |
650 self.linelog.annotate(llrev) |
651 self.linelog.annotate(llrev) |
651 result = [ |
652 result = [ |
652 (self.revmap.rev2hsh(r), l) for r, l in self.linelog.annotateresult |
653 (self.revmap.rev2hsh(r), l) for r, l in self.linelog.annotateresult |
653 ] |
654 ] |