Show More
@@ -3450,7 +3450,10 b' def log(ui, repo, *pats, **opts):' | |||||
3450 | getrenamed = templatekw.getrenamedfn(repo, endrev=endrev) |
|
3450 | getrenamed = templatekw.getrenamedfn(repo, endrev=endrev) | |
3451 |
|
3451 | |||
3452 | ui.pager('log') |
|
3452 | ui.pager('log') | |
3453 |
displayer = logcmdutil.changesetdisplayer(ui, repo, opts, |
|
3453 | displayer = logcmdutil.changesetdisplayer(ui, repo, opts, | |
|
3454 | makefilematcher=filematcher, | |||
|
3455 | makehunksfilter=hunksfilter, | |||
|
3456 | buffered=True) | |||
3454 | for rev in revs: |
|
3457 | for rev in revs: | |
3455 | ctx = repo[rev] |
|
3458 | ctx = repo[rev] | |
3456 | copies = None |
|
3459 | copies = None | |
@@ -3460,16 +3463,7 b' def log(ui, repo, *pats, **opts):' | |||||
3460 | rename = getrenamed(fn, rev) |
|
3463 | rename = getrenamed(fn, rev) | |
3461 | if rename: |
|
3464 | if rename: | |
3462 | copies.append((fn, rename[0])) |
|
3465 | copies.append((fn, rename[0])) | |
3463 | if filematcher: |
|
3466 | displayer.show(ctx, copies=copies) | |
3464 | revmatchfn = filematcher(ctx) |
|
|||
3465 | else: |
|
|||
3466 | revmatchfn = None |
|
|||
3467 | if hunksfilter: |
|
|||
3468 | revhunksfilter = hunksfilter(ctx) |
|
|||
3469 | else: |
|
|||
3470 | revhunksfilter = None |
|
|||
3471 | displayer.show(ctx, copies=copies, matchfn=revmatchfn, |
|
|||
3472 | hunksfilterfn=revhunksfilter) |
|
|||
3473 | displayer.flush(ctx) |
|
3467 | displayer.flush(ctx) | |
3474 |
|
3468 | |||
3475 | displayer.close() |
|
3469 | displayer.close() |
@@ -886,7 +886,8 b' def _incoming(displaychlist, subreporecu' | |||||
886 | ui.status(_("no changes found\n")) |
|
886 | ui.status(_("no changes found\n")) | |
887 | return subreporecurse() |
|
887 | return subreporecurse() | |
888 | ui.pager('incoming') |
|
888 | ui.pager('incoming') | |
889 |
displayer = logcmdutil.changesetdisplayer(ui, other, opts, |
|
889 | displayer = logcmdutil.changesetdisplayer(ui, other, opts, | |
|
890 | buffered=buffered) | |||
890 | displaychlist(other, chlist, displayer) |
|
891 | displaychlist(other, chlist, displayer) | |
891 | displayer.close() |
|
892 | displayer.close() | |
892 | finally: |
|
893 | finally: |
@@ -135,11 +135,13 b' def changesetlabels(ctx):' | |||||
135 | class changesetprinter(object): |
|
135 | class changesetprinter(object): | |
136 | '''show changeset information when templating not requested.''' |
|
136 | '''show changeset information when templating not requested.''' | |
137 |
|
137 | |||
138 |
def __init__(self, ui, repo, ma |
|
138 | def __init__(self, ui, repo, makefilematcher=None, makehunksfilter=None, | |
|
139 | diffopts=None, buffered=False): | |||
139 | self.ui = ui |
|
140 | self.ui = ui | |
140 | self.repo = repo |
|
141 | self.repo = repo | |
141 | self.buffered = buffered |
|
142 | self.buffered = buffered | |
142 | self.matchfn = matchfn |
|
143 | self._makefilematcher = makefilematcher or (lambda ctx: None) | |
|
144 | self._makehunksfilter = makehunksfilter or (lambda ctx: None) | |||
143 | self.diffopts = diffopts or {} |
|
145 | self.diffopts = diffopts or {} | |
144 | self.header = {} |
|
146 | self.header = {} | |
145 | self.hunk = {} |
|
147 | self.hunk = {} | |
@@ -163,17 +165,16 b' class changesetprinter(object):' | |||||
163 | if self.footer: |
|
165 | if self.footer: | |
164 | self.ui.write(self.footer) |
|
166 | self.ui.write(self.footer) | |
165 |
|
167 | |||
166 |
def show(self, ctx, copies=None, |
|
168 | def show(self, ctx, copies=None, **props): | |
167 | **props): |
|
|||
168 | props = pycompat.byteskwargs(props) |
|
169 | props = pycompat.byteskwargs(props) | |
169 | if self.buffered: |
|
170 | if self.buffered: | |
170 | self.ui.pushbuffer(labeled=True) |
|
171 | self.ui.pushbuffer(labeled=True) | |
171 |
self._show(ctx, copies, |
|
172 | self._show(ctx, copies, props) | |
172 | self.hunk[ctx.rev()] = self.ui.popbuffer() |
|
173 | self.hunk[ctx.rev()] = self.ui.popbuffer() | |
173 | else: |
|
174 | else: | |
174 |
self._show(ctx, copies, |
|
175 | self._show(ctx, copies, props) | |
175 |
|
176 | |||
176 |
def _show(self, ctx, copies, |
|
177 | def _show(self, ctx, copies, props): | |
177 | '''show a single changeset or file revision''' |
|
178 | '''show a single changeset or file revision''' | |
178 | changenode = ctx.node() |
|
179 | changenode = ctx.node() | |
179 | rev = ctx.rev() |
|
180 | rev = ctx.rev() | |
@@ -264,7 +265,7 b' class changesetprinter(object):' | |||||
264 | label='log.summary') |
|
265 | label='log.summary') | |
265 | self.ui.write("\n") |
|
266 | self.ui.write("\n") | |
266 |
|
267 | |||
267 | self._showpatch(ctx, matchfn, hunksfilterfn=hunksfilterfn) |
|
268 | self._showpatch(ctx) | |
268 |
|
269 | |||
269 | def _showobsfate(self, ctx): |
|
270 | def _showobsfate(self, ctx): | |
270 | obsfate = templatekw.showobsfate(repo=self.repo, ctx=ctx, ui=self.ui) |
|
271 | obsfate = templatekw.showobsfate(repo=self.repo, ctx=ctx, ui=self.ui) | |
@@ -278,9 +279,9 b' class changesetprinter(object):' | |||||
278 | '''empty method used by extension as a hook point |
|
279 | '''empty method used by extension as a hook point | |
279 | ''' |
|
280 | ''' | |
280 |
|
281 | |||
281 |
def _showpatch(self, ctx |
|
282 | def _showpatch(self, ctx): | |
282 | if not matchfn: |
|
283 | matchfn = self._makefilematcher(ctx) | |
283 | matchfn = self.matchfn |
|
284 | hunksfilterfn = self._makehunksfilter(ctx) | |
284 | if matchfn: |
|
285 | if matchfn: | |
285 | stat = self.diffopts.get('stat') |
|
286 | stat = self.diffopts.get('stat') | |
286 | diff = self.diffopts.get('patch') |
|
287 | diff = self.diffopts.get('patch') | |
@@ -303,8 +304,10 b' class changesetprinter(object):' | |||||
303 | class jsonchangeset(changesetprinter): |
|
304 | class jsonchangeset(changesetprinter): | |
304 | '''format changeset information.''' |
|
305 | '''format changeset information.''' | |
305 |
|
306 | |||
306 |
def __init__(self, ui, repo, ma |
|
307 | def __init__(self, ui, repo, makefilematcher=None, makehunksfilter=None, | |
307 | changesetprinter.__init__(self, ui, repo, matchfn, diffopts, buffered) |
|
308 | diffopts=None, buffered=False): | |
|
309 | changesetprinter.__init__(self, ui, repo, makefilematcher, | |||
|
310 | makehunksfilter, diffopts, buffered) | |||
308 | self.cache = {} |
|
311 | self.cache = {} | |
309 | self._first = True |
|
312 | self._first = True | |
310 |
|
313 | |||
@@ -314,7 +317,7 b' class jsonchangeset(changesetprinter):' | |||||
314 | else: |
|
317 | else: | |
315 | self.ui.write("[]\n") |
|
318 | self.ui.write("[]\n") | |
316 |
|
319 | |||
317 |
def _show(self, ctx, copies, |
|
320 | def _show(self, ctx, copies, props): | |
318 | '''show a single changeset or file revision''' |
|
321 | '''show a single changeset or file revision''' | |
319 | rev = ctx.rev() |
|
322 | rev = ctx.rev() | |
320 | if rev is None: |
|
323 | if rev is None: | |
@@ -379,7 +382,7 b' class jsonchangeset(changesetprinter):' | |||||
379 | ", ".join('"%s": "%s"' % (j(k), j(v)) |
|
382 | ", ".join('"%s": "%s"' % (j(k), j(v)) | |
380 | for k, v in copies)) |
|
383 | for k, v in copies)) | |
381 |
|
384 | |||
382 |
matchfn = self. |
|
385 | matchfn = self._makefilematcher(ctx) | |
383 | if matchfn: |
|
386 | if matchfn: | |
384 | stat = self.diffopts.get('stat') |
|
387 | stat = self.diffopts.get('stat') | |
385 | diff = self.diffopts.get('patch') |
|
388 | diff = self.diffopts.get('patch') | |
@@ -410,9 +413,10 b' class changesettemplater(changesetprinte' | |||||
410 |
|
413 | |||
411 | # Arguments before "buffered" used to be positional. Consider not |
|
414 | # Arguments before "buffered" used to be positional. Consider not | |
412 | # adding/removing arguments before "buffered" to not break callers. |
|
415 | # adding/removing arguments before "buffered" to not break callers. | |
413 |
def __init__(self, ui, repo, tmplspec, ma |
|
416 | def __init__(self, ui, repo, tmplspec, makefilematcher=None, | |
414 | buffered=False): |
|
417 | makehunksfilter=None, diffopts=None, buffered=False): | |
415 |
changesetprinter.__init__(self, ui, repo, ma |
|
418 | changesetprinter.__init__(self, ui, repo, makefilematcher, | |
|
419 | makehunksfilter, diffopts, buffered) | |||
416 | tres = formatter.templateresources(ui, repo) |
|
420 | tres = formatter.templateresources(ui, repo) | |
417 | self.t = formatter.loadtemplater(ui, tmplspec, |
|
421 | self.t = formatter.loadtemplater(ui, tmplspec, | |
418 | defaults=templatekw.keywords, |
|
422 | defaults=templatekw.keywords, | |
@@ -455,7 +459,7 b' class changesettemplater(changesetprinte' | |||||
455 | self.footer += templater.stringify(self.t(self._parts['docfooter'])) |
|
459 | self.footer += templater.stringify(self.t(self._parts['docfooter'])) | |
456 | return super(changesettemplater, self).close() |
|
460 | return super(changesettemplater, self).close() | |
457 |
|
461 | |||
458 |
def _show(self, ctx, copies, |
|
462 | def _show(self, ctx, copies, props): | |
459 | '''show a single changeset or file revision''' |
|
463 | '''show a single changeset or file revision''' | |
460 | props = props.copy() |
|
464 | props = props.copy() | |
461 | props['ctx'] = ctx |
|
465 | props['ctx'] = ctx | |
@@ -482,7 +486,7 b' class changesettemplater(changesetprinte' | |||||
482 | # write changeset metadata, then patch if requested |
|
486 | # write changeset metadata, then patch if requested | |
483 | key = self._parts[self._tref] |
|
487 | key = self._parts[self._tref] | |
484 | self.ui.write(templater.stringify(self.t(key, **props))) |
|
488 | self.ui.write(templater.stringify(self.t(key, **props))) | |
485 | self._showpatch(ctx, matchfn, hunksfilterfn=hunksfilterfn) |
|
489 | self._showpatch(ctx) | |
486 |
|
490 | |||
487 | if self._parts['footer']: |
|
491 | if self._parts['footer']: | |
488 | if not self.footer: |
|
492 | if not self.footer: | |
@@ -529,7 +533,8 b' def maketemplater(ui, repo, tmpl, buffer' | |||||
529 | spec = templatespec(tmpl, None) |
|
533 | spec = templatespec(tmpl, None) | |
530 | return changesettemplater(ui, repo, spec, buffered=buffered) |
|
534 | return changesettemplater(ui, repo, spec, buffered=buffered) | |
531 |
|
535 | |||
532 |
def changesetdisplayer(ui, repo, opts, |
|
536 | def changesetdisplayer(ui, repo, opts, makefilematcher=None, | |
|
537 | makehunksfilter=None, buffered=False): | |||
533 | """show one changeset using template or regular display. |
|
538 | """show one changeset using template or regular display. | |
534 |
|
539 | |||
535 | Display format will be the first non-empty hit of: |
|
540 | Display format will be the first non-empty hit of: | |
@@ -541,19 +546,20 b' def changesetdisplayer(ui, repo, opts, b' | |||||
541 | regular display via changesetprinter() is done. |
|
546 | regular display via changesetprinter() is done. | |
542 | """ |
|
547 | """ | |
543 | # options |
|
548 | # options | |
544 | match = None |
|
549 | if not makefilematcher and (opts.get('patch') or opts.get('stat')): | |
545 | if opts.get('patch') or opts.get('stat'): |
|
550 | def makefilematcher(ctx): | |
546 |
|
|
551 | return scmutil.matchall(repo) | |
547 |
|
552 | |||
|
553 | postargs = (makefilematcher, makehunksfilter, opts, buffered) | |||
548 | if opts.get('template') == 'json': |
|
554 | if opts.get('template') == 'json': | |
549 |
return jsonchangeset(ui, repo, |
|
555 | return jsonchangeset(ui, repo, *postargs) | |
550 |
|
556 | |||
551 | spec = _lookuptemplate(ui, opts.get('template'), opts.get('style')) |
|
557 | spec = _lookuptemplate(ui, opts.get('template'), opts.get('style')) | |
552 |
|
558 | |||
553 | if not spec.ref and not spec.tmpl and not spec.mapfile: |
|
559 | if not spec.ref and not spec.tmpl and not spec.mapfile: | |
554 |
return changesetprinter(ui, repo, |
|
560 | return changesetprinter(ui, repo, *postargs) | |
555 |
|
561 | |||
556 |
return changesettemplater(ui, repo, spec, |
|
562 | return changesettemplater(ui, repo, spec, *postargs) | |
557 |
|
563 | |||
558 | def _makematcher(repo, revs, pats, opts): |
|
564 | def _makematcher(repo, revs, pats, opts): | |
559 | """Build matcher and expanded patterns from log options |
|
565 | """Build matcher and expanded patterns from log options | |
@@ -861,8 +867,7 b' def _graphnodeformatter(ui, displayer):' | |||||
861 | return templ.render(props) |
|
867 | return templ.render(props) | |
862 | return formatnode |
|
868 | return formatnode | |
863 |
|
869 | |||
864 | def displaygraph(ui, repo, dag, displayer, edgefn, getrenamed=None, |
|
870 | def displaygraph(ui, repo, dag, displayer, edgefn, getrenamed=None, props=None): | |
865 | filematcher=None, props=None): |
|
|||
866 | props = props or {} |
|
871 | props = props or {} | |
867 | formatnode = _graphnodeformatter(ui, displayer) |
|
872 | formatnode = _graphnodeformatter(ui, displayer) | |
868 | state = graphmod.asciistate() |
|
873 | state = graphmod.asciistate() | |
@@ -897,13 +902,10 b' def displaygraph(ui, repo, dag, displaye' | |||||
897 | rename = getrenamed(fn, ctx.rev()) |
|
902 | rename = getrenamed(fn, ctx.rev()) | |
898 | if rename: |
|
903 | if rename: | |
899 | copies.append((fn, rename[0])) |
|
904 | copies.append((fn, rename[0])) | |
900 | revmatchfn = None |
|
|||
901 | if filematcher is not None: |
|
|||
902 | revmatchfn = filematcher(ctx) |
|
|||
903 | edges = edgefn(type, char, state, rev, parents) |
|
905 | edges = edgefn(type, char, state, rev, parents) | |
904 | firstedge = next(edges) |
|
906 | firstedge = next(edges) | |
905 | width = firstedge[2] |
|
907 | width = firstedge[2] | |
906 |
displayer.show(ctx, copies=copies, |
|
908 | displayer.show(ctx, copies=copies, | |
907 | _graphwidth=width, **pycompat.strkwargs(props)) |
|
909 | _graphwidth=width, **pycompat.strkwargs(props)) | |
908 | lines = displayer.hunk.pop(rev).split('\n') |
|
910 | lines = displayer.hunk.pop(rev).split('\n') | |
909 | if not lines[-1]: |
|
911 | if not lines[-1]: | |
@@ -926,9 +928,9 b' def graphlog(ui, repo, revs, filematcher' | |||||
926 | getrenamed = templatekw.getrenamedfn(repo, endrev=endrev) |
|
928 | getrenamed = templatekw.getrenamedfn(repo, endrev=endrev) | |
927 |
|
929 | |||
928 | ui.pager('log') |
|
930 | ui.pager('log') | |
929 |
displayer = changesetdisplayer(ui, repo, opts, |
|
931 | displayer = changesetdisplayer(ui, repo, opts, makefilematcher=filematcher, | |
930 | displaygraph(ui, repo, revdag, displayer, graphmod.asciiedges, getrenamed, |
|
932 | buffered=True) | |
931 | filematcher) |
|
933 | displaygraph(ui, repo, revdag, displayer, graphmod.asciiedges, getrenamed) | |
932 |
|
934 | |||
933 | def checkunsupportedgraphflags(pats, opts): |
|
935 | def checkunsupportedgraphflags(pats, opts): | |
934 | for op in ["newest_first"]: |
|
936 | for op in ["newest_first"]: |
General Comments 0
You need to be logged in to leave comments.
Login now