##// END OF EJS Templates
revert: distinguish between "check" and "backup" strategy...
revert: distinguish between "check" and "backup" strategy "check" behaves as backup did before. We check if the current file differs from destination and we create a backup if it does. This is used for untracked files that will be overwritten by formerly-deleted files. We have to do the manual check since no status output can provide the content comparison. "backup" is now doing unconditional backup. This can be used for files seen as modified compared to both the target and the working directory. In such a case, we know that the file differs from target without actually comparing any content. This new "backup" strategy will be especially useful in the case of files added between the target and the working directory -parent- with additional modifications in the working directory -itself-. In that case we know we need to back it up, but we cannot run the content check as the files does not exists in target.

File last commit:

r22476:a0829ec3 default
r22609:3760ebf7 default
Show More
formatter.py
137 lines | 4.5 KiB | text/x-python | PythonLexer
Matt Mackall
formatter: add basic formatters
r16134 # formatter.py - generic output formatting for mercurial
#
# Copyright 2012 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
Matt Mackall
formatter: add pickle format...
r22430 import cPickle
Matt Mackall
formatter: add json formatter
r22428 from i18n import _
import encoding, util
Matt Mackall
formatter: add basic formatters
r16134 class baseformatter(object):
def __init__(self, ui, topic, opts):
self._ui = ui
self._topic = topic
self._style = opts.get("style")
self._template = opts.get("template")
self._item = None
Yuya Nishihara
formatter: correct bool testing which should be __nonzero__ in Python 2
r22447 def __nonzero__(self):
Matt Mackall
formatter: add basic formatters
r16134 '''return False if we're not doing real templating so we can
skip extra work'''
return True
def _showitem(self):
'''show a formatted item once all data is collected'''
pass
def startitem(self):
'''begin an item in the format list'''
if self._item is not None:
self._showitem()
self._item = {}
def data(self, **data):
'''insert data into item that's not shown in default output'''
David M. Carr
formatter: improve implementation of data method...
r17630 self._item.update(data)
Matt Mackall
formatter: add basic formatters
r16134 def write(self, fields, deftext, *fielddata, **opts):
'''do default text output while assigning data to item'''
for k, v in zip(fields.split(), fielddata):
self._item[k] = v
Matt Mackall
formatter: add condwrite method...
r17909 def condwrite(self, cond, fields, deftext, *fielddata, **opts):
'''do conditional write (primarily for plain formatter)'''
for k, v in zip(fields.split(), fielddata):
self._item[k] = v
Matt Mackall
formatter: add basic formatters
r16134 def plain(self, text, **opts):
'''show raw text for non-templated mode'''
pass
def end(self):
'''end output for the formatter'''
if self._item is not None:
self._showitem()
class plainformatter(baseformatter):
'''the default text output scheme'''
def __init__(self, ui, topic, opts):
baseformatter.__init__(self, ui, topic, opts)
Yuya Nishihara
formatter: correct bool testing which should be __nonzero__ in Python 2
r22447 def __nonzero__(self):
Matt Mackall
formatter: add basic formatters
r16134 return False
def startitem(self):
pass
def data(self, **data):
pass
def write(self, fields, deftext, *fielddata, **opts):
self._ui.write(deftext % fielddata, **opts)
Matt Mackall
formatter: add condwrite method...
r17909 def condwrite(self, cond, fields, deftext, *fielddata, **opts):
'''do conditional write'''
if cond:
self._ui.write(deftext % fielddata, **opts)
Matt Mackall
formatter: add basic formatters
r16134 def plain(self, text, **opts):
self._ui.write(text, **opts)
def end(self):
pass
class debugformatter(baseformatter):
def __init__(self, ui, topic, opts):
baseformatter.__init__(self, ui, topic, opts)
Matt Mackall
formatter: make debug style match Python syntax
r22424 self._ui.write("%s = [\n" % self._topic)
Matt Mackall
formatter: add basic formatters
r16134 def _showitem(self):
self._ui.write(" " + repr(self._item) + ",\n")
def end(self):
baseformatter.end(self)
Matt Mackall
formatter: make debug style match Python syntax
r22424 self._ui.write("]\n")
Matt Mackall
formatter: add basic formatters
r16134
Matt Mackall
formatter: add pickle format...
r22430 class pickleformatter(baseformatter):
def __init__(self, ui, topic, opts):
baseformatter.__init__(self, ui, topic, opts)
self._data = []
def _showitem(self):
self._data.append(self._item)
def end(self):
baseformatter.end(self)
self._ui.write(cPickle.dumps(self._data))
Yuya Nishihara
formatter: extract function that encode values to json string...
r22474 def _jsonifyobj(v):
Yuya Nishihara
formatter: have jsonformatter accept tuple as value...
r22475 if isinstance(v, tuple):
return '[' + ', '.join(_jsonifyobj(e) for e in v) + ']'
Yuya Nishihara
formatter: convert float value to json...
r22476 elif isinstance(v, (int, float)):
return str(v)
Yuya Nishihara
formatter: extract function that encode values to json string...
r22474 else:
return '"%s"' % encoding.jsonescape(v)
Matt Mackall
formatter: add json formatter
r22428 class jsonformatter(baseformatter):
def __init__(self, ui, topic, opts):
baseformatter.__init__(self, ui, topic, opts)
self._ui.write("[")
self._ui._first = True
def _showitem(self):
if self._ui._first:
self._ui._first = False
else:
self._ui.write(",")
self._ui.write("\n {\n")
first = True
for k, v in sorted(self._item.items()):
if first:
first = False
else:
self._ui.write(",\n")
Yuya Nishihara
formatter: extract function that encode values to json string...
r22474 self._ui.write(' "%s": %s' % (k, _jsonifyobj(v)))
Matt Mackall
formatter: add json formatter
r22428 self._ui.write("\n }")
def end(self):
baseformatter.end(self)
self._ui.write("\n]\n")
Matt Mackall
formatter: add basic formatters
r16134 def formatter(ui, topic, opts):
Matt Mackall
formatter: add json formatter
r22428 template = opts.get("template", "")
if template == "json":
return jsonformatter(ui, topic, opts)
Matt Mackall
formatter: add pickle format...
r22430 elif template == "pickle":
return pickleformatter(ui, topic, opts)
Matt Mackall
formatter: add json formatter
r22428 elif template == "debug":
Matt Mackall
formatter: add basic formatters
r16134 return debugformatter(ui, topic, opts)
Matt Mackall
formatter: add json formatter
r22428 elif template != "":
raise util.Abort(_("custom templates not yet supported"))
elif ui.configbool('ui', 'formatdebug'):
return debugformatter(ui, topic, opts)
elif ui.configbool('ui', 'formatjson'):
return jsonformatter(ui, topic, opts)
Matt Mackall
formatter: add basic formatters
r16134 return plainformatter(ui, topic, opts)