def _formatconflictmarker(repo, ctx, template, label, pad): """Applies the given template to the ctx, prefixed by the label. Pad is the minimum width of the label prefix, so that multiple markers can have aligned templated parts. """ if ctx.node() is None: ctx = ctx.p1() props = templatekw.keywords.copy() props['templ'] = template props['ctx'] = ctx props['repo'] = repo templateresult = template('conflictmarker', **props) label = ('%s:' % label).ljust(pad + 1) mark = '%s %s' % (label, templater.stringify(templateresult)) if mark: mark = mark.splitlines()[0] # split for safety # 8 for the prefix of conflict marker lines (e.g. '<<<<<<< ') return util.ellipsis(mark, 80 - 8)
def _show(self, rev, changenode, copies, props): '''show a single changeset or file revision''' log = self.repo.changelog if changenode is None: changenode = log.node(rev) elif not rev: rev = log.rev(changenode) changes = log.read(changenode) def showlist(name, values, plural=None, **args): '''expand set of values. name is name of key in template map. values is list of strings or dicts. plural is plural of name, if not simply name + 's'. expansion works like this, given name 'foo'. if values is empty, expand 'no_foos'. if 'foo' not in template map, return values as a string, joined by space. expand 'start_foos'. for each value, expand 'foo'. if 'last_foo' in template map, expand it instead of 'foo' for last key. expand 'end_foos'. ''' if plural: names = plural else: names = name + 's' if not values: noname = 'no_' + names if noname in self.t: yield self.t(noname, **args) return if name not in self.t: if isinstance(values[0], str): yield ' '.join(values) else: for v in values: yield dict(v, **args) return startname = 'start_' + names if startname in self.t: yield self.t(startname, **args) vargs = args.copy() def one(v, tag=name): try: vargs.update(v) except (AttributeError, ValueError): try: for a, b in v: vargs[a] = b except ValueError: vargs[name] = v return self.t(tag, **vargs) lastname = 'last_' + name if lastname in self.t: last = values.pop() else: last = None for v in values: yield one(v) if last is not None: yield one(last, tag=lastname) endname = 'end_' + names if endname in self.t: yield self.t(endname, **args) def showbranches(**args): branch = changes[5].get("branch") if branch != 'default': branch = util.tolocal(branch) return showlist('branch', [branch], plural='branches', **args) def showparents(**args): parents = [[('rev', p), ('node', hex(log.node(p)))] for p in self._meaningful_parentrevs(log, rev)] return showlist('parent', parents, **args) def showtags(**args): return showlist('tag', self.repo.nodetags(changenode), **args) def showextras(**args): extras = changes[5].items() extras.sort() for key, value in extras: args = args.copy() args.update(dict(key=key, value=value)) yield self.t('extra', **args) def showcopies(**args): c = [{'name': x[0], 'source': x[1]} for x in copies] return showlist('file_copy', c, plural='file_copies', **args) files = [] def getfiles(): if not files: files[:] = self.repo.status( log.parents(changenode)[0], changenode)[:3] return files def showfiles(**args): return showlist('file', changes[3], **args) def showmods(**args): return showlist('file_mod', getfiles()[0], **args) def showadds(**args): return showlist('file_add', getfiles()[1], **args) def showdels(**args): return showlist('file_del', getfiles()[2], **args) def showmanifest(**args): args = args.copy() args.update( dict(rev=self.repo.manifest.rev(changes[0]), node=hex(changes[0]))) return self.t('manifest', **args) defprops = { 'author': changes[1], 'branches': showbranches, 'date': changes[2], 'desc': changes[4].strip(), 'file_adds': showadds, 'file_dels': showdels, 'file_mods': showmods, 'files': showfiles, 'file_copies': showcopies, 'manifest': showmanifest, 'node': hex(changenode), 'parents': showparents, 'rev': rev, 'tags': showtags, 'extras': showextras, } props = props.copy() props.update(defprops) try: if self.ui.debugflag and 'header_debug' in self.t: key = 'header_debug' elif self.ui.quiet and 'header_quiet' in self.t: key = 'header_quiet' elif self.ui.verbose and 'header_verbose' in self.t: key = 'header_verbose' elif 'header' in self.t: key = 'header' else: key = '' if key: h = templater.stringify(self.t(key, **props)) if self.buffered: self.header[rev] = h else: self.ui.write(h) if self.ui.debugflag and 'changeset_debug' in self.t: key = 'changeset_debug' elif self.ui.quiet and 'changeset_quiet' in self.t: key = 'changeset_quiet' elif self.ui.verbose and 'changeset_verbose' in self.t: key = 'changeset_verbose' else: key = 'changeset' self.ui.write(templater.stringify(self.t(key, **props))) self.showpatch(changenode) except KeyError, inst: raise util.Abort( _("%s: no key named '%s'") % (self.t.mapfile, inst.args[0]))
def _show(self, ctx, copies, props): '''show a single changeset or file revision''' def showlist(name, values, plural=None, **args): '''expand set of values. name is name of key in template map. values is list of strings or dicts. plural is plural of name, if not simply name + 's'. expansion works like this, given name 'foo'. if values is empty, expand 'no_foos'. if 'foo' not in template map, return values as a string, joined by space. expand 'start_foos'. for each value, expand 'foo'. if 'last_foo' in template map, expand it instead of 'foo' for last key. expand 'end_foos'. ''' if plural: names = plural else: names = name + 's' if not values: noname = 'no_' + names if noname in self.t: yield self.t(noname, **args) return if name not in self.t: if isinstance(values[0], str): yield ' '.join(values) else: for v in values: yield dict(v, **args) return startname = 'start_' + names if startname in self.t: yield self.t(startname, **args) vargs = args.copy() def one(v, tag=name): try: vargs.update(v) except (AttributeError, ValueError): try: for a, b in v: vargs[a] = b except ValueError: vargs[name] = v return self.t(tag, **vargs) lastname = 'last_' + name if lastname in self.t: last = values.pop() else: last = None for v in values: yield one(v) if last is not None: yield one(last, tag=lastname) endname = 'end_' + names if endname in self.t: yield self.t(endname, **args) def showbranches(**args): branch = ctx.branch() if branch != 'default': branch = encoding.tolocal(branch) return showlist('branch', [branch], plural='branches', **args) def showparents(**args): parents = [[('rev', p.rev()), ('node', p.hex())] for p in self._meaningful_parentrevs(ctx)] return showlist('parent', parents, **args) def showtags(**args): return showlist('tag', ctx.tags(), **args) def showextras(**args): for key, value in sorted(ctx.extra().items()): args = args.copy() args.update(dict(key=key, value=value)) yield self.t('extra', **args) def showcopies(**args): c = [{'name': x[0], 'source': x[1]} for x in copies] return showlist('file_copy', c, plural='file_copies', **args) files = [] def getfiles(): if not files: files[:] = self.repo.status(ctx.parents()[0].node(), ctx.node())[:3] return files def showfiles(**args): return showlist('file', ctx.files(), **args) def showmods(**args): return showlist('file_mod', getfiles()[0], **args) def showadds(**args): return showlist('file_add', getfiles()[1], **args) def showdels(**args): return showlist('file_del', getfiles()[2], **args) def showmanifest(**args): args = args.copy() args.update( dict(rev=self.repo.manifest.rev(ctx.changeset()[0]), node=hex(ctx.changeset()[0]))) return self.t('manifest', **args) def showdiffstat(**args): diff = patch.diff(self.repo, ctx.parents()[0].node(), ctx.node()) files, adds, removes = 0, 0, 0 for i in patch.diffstatdata(util.iterlines(diff)): files += 1 adds += i[1] removes += i[2] return '%s: +%s/-%s' % (files, adds, removes) defprops = { 'author': ctx.user(), 'branches': showbranches, 'date': ctx.date(), 'desc': ctx.description().strip(), 'file_adds': showadds, 'file_dels': showdels, 'file_mods': showmods, 'files': showfiles, 'file_copies': showcopies, 'manifest': showmanifest, 'node': ctx.hex(), 'parents': showparents, 'rev': ctx.rev(), 'tags': showtags, 'extras': showextras, 'diffstat': showdiffstat, } props = props.copy() props.update(defprops) # find correct templates for current mode tmplmodes = [ (True, None), (self.ui.verbose, 'verbose'), (self.ui.quiet, 'quiet'), (self.ui.debugflag, 'debug'), ] types = {'header': '', 'changeset': 'changeset'} for mode, postfix in tmplmodes: for type in types: cur = postfix and ('%s_%s' % (type, postfix)) or type if mode and cur in self.t: types[type] = cur try: # write header if types['header']: h = templater.stringify(self.t(types['header'], **props)) if self.buffered: self.header[ctx.rev()] = h else: self.ui.write(h) # write changeset metadata, then patch if requested key = types['changeset'] self.ui.write(templater.stringify(self.t(key, **props))) self.showpatch(ctx.node()) except KeyError, inst: msg = _("%s: no key named '%s'") raise util.Abort(msg % (self.t.mapfile, inst.args[0]))
def _show(self, ctx, copies, props): '''show a single changeset or file revision''' showlist = templatekw.showlist # showparents() behaviour depends on ui trace level which # causes unexpected behaviours at templating level and makes # it harder to extract it in a standalone function. Its # behaviour cannot be changed so leave it here for now. def showparents(**args): ctx = args['ctx'] parents = [[('rev', p.rev()), ('node', p.hex())] for p in self._meaningful_parentrevs(ctx)] return showlist('parent', parents, **args) props = props.copy() props.update(templatekw.keywords) props['parents'] = showparents props['templ'] = self.t props['ctx'] = ctx props['repo'] = self.repo props['revcache'] = {'copies': copies} props['cache'] = self.cache # find correct templates for current mode tmplmodes = [ (True, None), (self.ui.verbose, 'verbose'), (self.ui.quiet, 'quiet'), (self.ui.debugflag, 'debug'), ] types = {'header': '', 'footer': '', 'changeset': 'changeset'} for mode, postfix in tmplmodes: for type in types: cur = postfix and ('%s_%s' % (type, postfix)) or type if mode and cur in self.t: types[type] = cur try: # write header if types['header']: h = templater.stringify(self.t(types['header'], **props)) if self.buffered: self.header[ctx.rev()] = h else: self.ui.write(h) # write changeset metadata, then patch if requested key = types['changeset'] self.ui.write(templater.stringify(self.t(key, **props))) self.showpatch(ctx.node()) if types['footer']: if not self.footer: self.footer = templater.stringify( self.t(types['footer'], **props)) except KeyError, inst: msg = _("%s: no key named '%s'") raise util.Abort(msg % (self.t.mapfile, inst.args[0]))
def _show(self, ctx, copies, matchfn, props): '''show a single changeset or file revision''' showlist = templatekw.showlist # showparents() behaviour depends on ui trace level which # causes unexpected behaviours at templating level and makes # it harder to extract it in a standalone function. Its # behaviour cannot be changed so leave it here for now. def showparents(**args): ctx = args['ctx'] parents = [[('rev', p.rev()), ('node', p.hex())] for p in self._meaningful_parentrevs(ctx)] return showlist('parent', parents, **args) props = props.copy() props.update(templatekw.keywords) props['parents'] = showparents props['templ'] = self.t props['ctx'] = ctx props['repo'] = self.repo props['revcache'] = {'copies': copies} props['cache'] = self.cache # find correct templates for current mode tmplmodes = [ (True, None), (self.ui.verbose, 'verbose'), (self.ui.quiet, 'quiet'), (self.ui.debugflag, 'debug'), ] types = {'header': '', 'footer':'', 'changeset': 'changeset'} for mode, postfix in tmplmodes: for type in types: cur = postfix and ('%s_%s' % (type, postfix)) or type if mode and cur in self.t: types[type] = cur try: # write header if types['header']: h = templater.stringify(self.t(types['header'], **props)) if self.buffered: self.header[ctx.rev()] = h else: if self.lastheader != h: self.lastheader = h self.ui.write(h) # write changeset metadata, then patch if requested key = types['changeset'] self.ui.write(templater.stringify(self.t(key, **props))) self.showpatch(ctx.node(), matchfn) if types['footer']: if not self.footer: self.footer = templater.stringify(self.t(types['footer'], **props)) except KeyError, inst: msg = _("%s: no key named '%s'") raise util.Abort(msg % (self.t.mapfile, inst.args[0]))
def _showitem(self): g = self._t(self._topic, **self._item) self._ui.write(templater.stringify(g))
def _show(self, rev, changenode, copies, props): '''show a single changeset or file revision''' log = self.repo.changelog if changenode is None: changenode = log.node(rev) elif not rev: rev = log.rev(changenode) changes = log.read(changenode) def showlist(name, values, plural=None, **args): '''expand set of values. name is name of key in template map. values is list of strings or dicts. plural is plural of name, if not simply name + 's'. expansion works like this, given name 'foo'. if values is empty, expand 'no_foos'. if 'foo' not in template map, return values as a string, joined by space. expand 'start_foos'. for each value, expand 'foo'. if 'last_foo' in template map, expand it instead of 'foo' for last key. expand 'end_foos'. ''' if plural: names = plural else: names = name + 's' if not values: noname = 'no_' + names if noname in self.t: yield self.t(noname, **args) return if name not in self.t: if isinstance(values[0], str): yield ' '.join(values) else: for v in values: yield dict(v, **args) return startname = 'start_' + names if startname in self.t: yield self.t(startname, **args) vargs = args.copy() def one(v, tag=name): try: vargs.update(v) except (AttributeError, ValueError): try: for a, b in v: vargs[a] = b except ValueError: vargs[name] = v return self.t(tag, **vargs) lastname = 'last_' + name if lastname in self.t: last = values.pop() else: last = None for v in values: yield one(v) if last is not None: yield one(last, tag=lastname) endname = 'end_' + names if endname in self.t: yield self.t(endname, **args) def showbranches(**args): branch = changes[5].get("branch") if branch != 'default': branch = util.tolocal(branch) return showlist('branch', [branch], plural='branches', **args) def showparents(**args): parents = [[('rev', p), ('node', hex(log.node(p)))] for p in self._meaningful_parentrevs(log, rev)] return showlist('parent', parents, **args) def showtags(**args): return showlist('tag', self.repo.nodetags(changenode), **args) def showextras(**args): extras = changes[5].items() extras.sort() for key, value in extras: args = args.copy() args.update(dict(key=key, value=value)) yield self.t('extra', **args) def showcopies(**args): c = [{'name': x[0], 'source': x[1]} for x in copies] return showlist('file_copy', c, plural='file_copies', **args) files = [] def getfiles(): if not files: files[:] = self.repo.status( log.parents(changenode)[0], changenode)[:3] return files def showfiles(**args): return showlist('file', changes[3], **args) def showmods(**args): return showlist('file_mod', getfiles()[0], **args) def showadds(**args): return showlist('file_add', getfiles()[1], **args) def showdels(**args): return showlist('file_del', getfiles()[2], **args) def showmanifest(**args): args = args.copy() args.update(dict(rev=self.repo.manifest.rev(changes[0]), node=hex(changes[0]))) return self.t('manifest', **args) defprops = { 'author': changes[1], 'branches': showbranches, 'date': changes[2], 'desc': changes[4].strip(), 'file_adds': showadds, 'file_dels': showdels, 'file_mods': showmods, 'files': showfiles, 'file_copies': showcopies, 'manifest': showmanifest, 'node': hex(changenode), 'parents': showparents, 'rev': rev, 'tags': showtags, 'extras': showextras, } props = props.copy() props.update(defprops) try: if self.ui.debugflag and 'header_debug' in self.t: key = 'header_debug' elif self.ui.quiet and 'header_quiet' in self.t: key = 'header_quiet' elif self.ui.verbose and 'header_verbose' in self.t: key = 'header_verbose' elif 'header' in self.t: key = 'header' else: key = '' if key: h = templater.stringify(self.t(key, **props)) if self.buffered: self.header[rev] = h else: self.ui.write(h) if self.ui.debugflag and 'changeset_debug' in self.t: key = 'changeset_debug' elif self.ui.quiet and 'changeset_quiet' in self.t: key = 'changeset_quiet' elif self.ui.verbose and 'changeset_verbose' in self.t: key = 'changeset_verbose' else: key = 'changeset' self.ui.write(templater.stringify(self.t(key, **props))) self.showpatch(changenode) except KeyError, inst: raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile, inst.args[0]))
def _show(self, ctx, copies, props): '''show a single changeset or file revision''' def showlist(name, values, plural=None, **args): '''expand set of values. name is name of key in template map. values is list of strings or dicts. plural is plural of name, if not simply name + 's'. expansion works like this, given name 'foo'. if values is empty, expand 'no_foos'. if 'foo' not in template map, return values as a string, joined by space. expand 'start_foos'. for each value, expand 'foo'. if 'last_foo' in template map, expand it instead of 'foo' for last key. expand 'end_foos'. ''' if plural: names = plural else: names = name + 's' if not values: noname = 'no_' + names if noname in self.t: yield self.t(noname, **args) return if name not in self.t: if isinstance(values[0], str): yield ' '.join(values) else: for v in values: yield dict(v, **args) return startname = 'start_' + names if startname in self.t: yield self.t(startname, **args) vargs = args.copy() def one(v, tag=name): try: vargs.update(v) except (AttributeError, ValueError): try: for a, b in v: vargs[a] = b except ValueError: vargs[name] = v return self.t(tag, **vargs) lastname = 'last_' + name if lastname in self.t: last = values.pop() else: last = None for v in values: yield one(v) if last is not None: yield one(last, tag=lastname) endname = 'end_' + names if endname in self.t: yield self.t(endname, **args) def showbranches(**args): branch = ctx.branch() if branch != 'default': branch = encoding.tolocal(branch) return showlist('branch', [branch], plural='branches', **args) def showparents(**args): parents = [[('rev', p.rev()), ('node', p.hex())] for p in self._meaningful_parentrevs(ctx)] return showlist('parent', parents, **args) def showtags(**args): return showlist('tag', ctx.tags(), **args) def showextras(**args): for key, value in sorted(ctx.extra().items()): args = args.copy() args.update(dict(key=key, value=value)) yield self.t('extra', **args) def showcopies(**args): c = [{'name': x[0], 'source': x[1]} for x in copies] return showlist('file_copy', c, plural='file_copies', **args) files = [] def getfiles(): if not files: files[:] = self.repo.status(ctx.parents()[0].node(), ctx.node())[:3] return files def showfiles(**args): return showlist('file', ctx.files(), **args) def showmods(**args): return showlist('file_mod', getfiles()[0], **args) def showadds(**args): return showlist('file_add', getfiles()[1], **args) def showdels(**args): return showlist('file_del', getfiles()[2], **args) def showmanifest(**args): args = args.copy() args.update(dict(rev=self.repo.manifest.rev(ctx.changeset()[0]), node=hex(ctx.changeset()[0]))) return self.t('manifest', **args) def showdiffstat(**args): diff = patch.diff(self.repo, ctx.parents()[0].node(), ctx.node()) files, adds, removes = 0, 0, 0 for i in patch.diffstatdata(util.iterlines(diff)): files += 1 adds += i[1] removes += i[2] return '%s: +%s/-%s' % (files, adds, removes) defprops = { 'author': ctx.user(), 'branches': showbranches, 'date': ctx.date(), 'desc': ctx.description().strip(), 'file_adds': showadds, 'file_dels': showdels, 'file_mods': showmods, 'files': showfiles, 'file_copies': showcopies, 'manifest': showmanifest, 'node': ctx.hex(), 'parents': showparents, 'rev': ctx.rev(), 'tags': showtags, 'extras': showextras, 'diffstat': showdiffstat, } props = props.copy() props.update(defprops) # find correct templates for current mode tmplmodes = [ (True, None), (self.ui.verbose, 'verbose'), (self.ui.quiet, 'quiet'), (self.ui.debugflag, 'debug'), ] types = {'header': '', 'changeset': 'changeset'} for mode, postfix in tmplmodes: for type in types: cur = postfix and ('%s_%s' % (type, postfix)) or type if mode and cur in self.t: types[type] = cur try: # write header if types['header']: h = templater.stringify(self.t(types['header'], **props)) if self.buffered: self.header[ctx.rev()] = h else: self.ui.write(h) # write changeset metadata, then patch if requested key = types['changeset'] self.ui.write(templater.stringify(self.t(key, **props))) self.showpatch(ctx.node()) except KeyError, inst: msg = _("%s: no key named '%s'") raise util.Abort(msg % (self.t.mapfile, inst.args[0]))