diff --git a/mercurial/templater.py b/mercurial/templater.py --- a/mercurial/templater.py +++ b/mercurial/templater.py @@ -8,7 +8,7 @@ from demandload import demandload from i18n import gettext as _ from node import * -demandload(globals(), "cStringIO cgi re sys os time urllib util textwrap") +demandload(globals(), "cgi re sys os time urllib util textwrap") def parsestring(s, quoted=True): '''parse a string using simple c-like syntax. @@ -290,204 +290,3 @@ def templatepath(name=None): if (name and os.path.exists(p)) or os.path.isdir(p): return os.path.normpath(p) -class changeset_templater(object): - '''format changeset information.''' - - def __init__(self, ui, repo, mapfile, dest=None): - self.t = templater(mapfile, common_filters, - cache={'parent': '{rev}:{node|short} ', - 'manifest': '{rev}:{node|short}', - 'filecopy': '{name} ({source})'}) - self.ui = ui - self.dest = dest - self.repo = repo - - def use_template(self, t): - '''set template string to use''' - self.t.cache['changeset'] = t - - def show(self, rev=0, changenode=None, brinfo=None, 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: - yield showlist('branch', [branch], plural='branches', **args) - # add old style branches if requested - if brinfo and changenode in brinfo: - yield showlist('branch', brinfo[changenode], - plural='branches', **args) - - def showparents(**args): - parents = [[('rev', log.rev(p)), ('node', hex(p))] - for p in log.parents(changenode) - if self.ui.debugflag or p != nullid] - if (not self.ui.debugflag and len(parents) == 1 and - parents[0][0][1] == rev - 1): - return - 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) - - if self.ui.debugflag: - files = self.repo.status(log.parents(changenode)[0], changenode)[:3] - def showfiles(**args): - return showlist('file', files[0], **args) - def showadds(**args): - return showlist('file_add', files[1], **args) - def showdels(**args): - return showlist('file_del', files[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) - else: - def showfiles(**args): - yield showlist('file', changes[3], **args) - showadds = '' - showdels = '' - showmanifest = '' - - defprops = { - 'author': changes[1], - 'branches': showbranches, - 'date': changes[2], - 'desc': changes[4], - 'file_adds': showadds, - 'file_dels': showdels, - '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: - dest = self.dest or self.ui - 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: - dest.write_header(stringify(self.t(key, **props))) - 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' - dest.write(stringify(self.t(key, **props))) - except KeyError, inst: - raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile, - inst.args[0])) - except SyntaxError, inst: - raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0])) - -class stringio(object): - '''wrap cStringIO for use by changeset_templater.''' - def __init__(self): - self.fp = cStringIO.StringIO() - - def write(self, *args): - for a in args: - self.fp.write(a) - - write_header = write - - def __getattr__(self, key): - return getattr(self.fp, key)