Show More
@@ -543,6 +543,10 b' def maketemplater(ui, tmpl, defaults=Non' | |||||
543 | t.cache[''] = tmpl |
|
543 | t.cache[''] = tmpl | |
544 | return t |
|
544 | return t | |
545 |
|
545 | |||
|
546 | # marker to denote a resource to be loaded on demand based on mapping values | |||
|
547 | # (e.g. (ctx, path) -> fctx) | |||
|
548 | _placeholder = object() | |||
|
549 | ||||
546 | class templateresources(templater.resourcemapper): |
|
550 | class templateresources(templater.resourcemapper): | |
547 | """Resource mapper designed for the default templatekw and function""" |
|
551 | """Resource mapper designed for the default templatekw and function""" | |
548 |
|
552 | |||
@@ -563,7 +567,10 b' class templateresources(templater.resour' | |||||
563 | def lookup(self, mapping, key): |
|
567 | def lookup(self, mapping, key): | |
564 | if key not in self.knownkeys(): |
|
568 | if key not in self.knownkeys(): | |
565 | return None |
|
569 | return None | |
566 |
|
|
570 | v = self._getsome(mapping, key) | |
|
571 | if v is _placeholder: | |||
|
572 | v = mapping[key] = self._loadermap[key](self, mapping) | |||
|
573 | return v | |||
567 |
|
574 | |||
568 | def populatemap(self, context, origmapping, newmapping): |
|
575 | def populatemap(self, context, origmapping, newmapping): | |
569 | mapping = {} |
|
576 | mapping = {} | |
@@ -572,6 +579,10 b' class templateresources(templater.resour' | |||||
572 | if self._hasnodespec(origmapping) and self._hasnodespec(newmapping): |
|
579 | if self._hasnodespec(origmapping) and self._hasnodespec(newmapping): | |
573 | orignode = templateutil.runsymbol(context, origmapping, 'node') |
|
580 | orignode = templateutil.runsymbol(context, origmapping, 'node') | |
574 | mapping['originalnode'] = orignode |
|
581 | mapping['originalnode'] = orignode | |
|
582 | # put marker to override 'fctx' in mapping if any, and flag | |||
|
583 | # its existence to be reported by availablekeys() | |||
|
584 | if 'fctx' not in newmapping and self._hasliteral(newmapping, 'path'): | |||
|
585 | mapping['fctx'] = _placeholder | |||
575 | return mapping |
|
586 | return mapping | |
576 |
|
587 | |||
577 | def _getsome(self, mapping, key): |
|
588 | def _getsome(self, mapping, key): | |
@@ -580,10 +591,35 b' class templateresources(templater.resour' | |||||
580 | return v |
|
591 | return v | |
581 | return self._resmap.get(key) |
|
592 | return self._resmap.get(key) | |
582 |
|
593 | |||
|
594 | def _hasliteral(self, mapping, key): | |||
|
595 | """Test if a literal value is set or unset in the given mapping""" | |||
|
596 | return key in mapping and not callable(mapping[key]) | |||
|
597 | ||||
|
598 | def _getliteral(self, mapping, key): | |||
|
599 | """Return value of the given name if it is a literal""" | |||
|
600 | v = mapping.get(key) | |||
|
601 | if callable(v): | |||
|
602 | return None | |||
|
603 | return v | |||
|
604 | ||||
583 | def _hasnodespec(self, mapping): |
|
605 | def _hasnodespec(self, mapping): | |
584 | """Test if context revision is set or unset in the given mapping""" |
|
606 | """Test if context revision is set or unset in the given mapping""" | |
585 | return 'node' in mapping or 'ctx' in mapping |
|
607 | return 'node' in mapping or 'ctx' in mapping | |
586 |
|
608 | |||
|
609 | def _loadfctx(self, mapping): | |||
|
610 | ctx = self._getsome(mapping, 'ctx') | |||
|
611 | path = self._getliteral(mapping, 'path') | |||
|
612 | if ctx is None or path is None: | |||
|
613 | return None | |||
|
614 | try: | |||
|
615 | return ctx[path] | |||
|
616 | except error.LookupError: | |||
|
617 | return None # maybe removed file? | |||
|
618 | ||||
|
619 | _loadermap = { | |||
|
620 | 'fctx': _loadfctx, | |||
|
621 | } | |||
|
622 | ||||
587 | def formatter(ui, out, topic, opts): |
|
623 | def formatter(ui, out, topic, opts): | |
588 | template = opts.get("template", "") |
|
624 | template = opts.get("template", "") | |
589 | if template == "json": |
|
625 | if template == "json": |
General Comments 0
You need to be logged in to leave comments.
Login now