def dumps(obj, paranoid=True): if obj is None: return "null" elif obj is False: return "false" elif obj is True: return "true" elif isinstance(obj, (int, long, float)): return pycompat.bytestr(obj) elif isinstance(obj, bytes): return '"%s"' % encoding.jsonescape(obj, paranoid=paranoid) elif isinstance(obj, str): return _sysjson.dumps(obj) elif util.safehasattr(obj, "keys"): out = [] for k, v in sorted(pycompat.iteritems(obj)): if isinstance(k, bytes): key = '"%s"' % encoding.jsonescape(k, paranoid=paranoid) else: key = _sysjson.dumps(k) out.append(key + ": %s" % dumps(v, paranoid)) return "{" + ", ".join(out) + "}" elif util.safehasattr(obj, "__iter__"): out = [dumps(i, paranoid) for i in obj] return "[" + ", ".join(out) + "]" else: raise TypeError("cannot encode type %s" % obj.__class__.__name__)
def dumps(obj, paranoid=True): if obj is None: return "null" elif obj is False: return "false" elif obj is True: return "true" elif isinstance(obj, (int, long, float)): return pycompat.bytestr(obj) elif isinstance(obj, bytes): return '"%s"' % encoding.jsonescape(obj, paranoid=paranoid) elif isinstance(obj, str): # This branch is unreachable on Python 2, because bytes == str # and we'll return in the next-earlier block in the elif # ladder. On Python 3, this helps us catch bugs before they # hurt someone. raise error.ProgrammingError( "Mercurial only does output with bytes on Python 3: %r" % obj) elif util.safehasattr(obj, "keys"): out = [ '"%s": %s' % (encoding.jsonescape(k, paranoid=paranoid), dumps(v, paranoid)) for k, v in sorted(obj.iteritems()) ] return "{" + ", ".join(out) + "}" elif util.safehasattr(obj, "__iter__"): out = [dumps(i, paranoid) for i in obj] return "[" + ", ".join(out) + "]" else: raise TypeError("cannot encode type %s" % obj.__class__.__name__)
def diffcmd(orig, ui, repo, *args, **opts): if not opts.get("per_file_stat_json"): return orig(ui, repo, *args, **opts) ui.pushbuffer() res = orig(ui, repo, *args, **opts) buffer = ui.popbuffer() difflines = util.iterlines([buffer]) diffstat = patch.diffstatdata(difflines) output = {} for filename, adds, removes, isbinary in diffstat: # use special encoding that allows non-utf8 filenames filename = encoding.jsonescape(filename, paranoid=True) output[filename] = { "adds": adds, "removes": removes, "isbinary": isbinary } ui.write("%s\n" % (json.dumps(output, sort_keys=True))) return res
def debugfillinfinitepushmetadata(ui, repo, **opts): """Special command that fills infinitepush metadata for a node""" nodes = opts["node"] if not nodes: raise error.Abort(_("nodes are not specified")) filelimit = ui.configint("infinitepush", "metadatafilelimit", 100) nodesmetadata = {} for node in nodes: index = repo.bundlestore.index if not bool(index.getbundle(node)): raise error.Abort(_("node %s is not found") % node) if node not in repo: newbundlefile = server.downloadbundle(repo, bin(node)) bundlepath = "bundle:%s+%s" % (repo.root, newbundlefile) bundlerepo = hg.repository(ui, bundlepath) repo = bundlerepo p1 = repo[node].p1().node() diffopts = patch.diffallopts(ui, {}) match = scmutil.matchall(repo) chunks = patch.diff(repo, p1, node, match, None, diffopts, relroot="") difflines = util.iterlines(chunks) states = "modified added removed deleted unknown ignored clean".split() status = repo.status(p1, node) status = zip(states, status) filestatus = {} for state, files in status: for f in files: filestatus[f] = state diffstat = patch.diffstatdata(difflines) changed_files = {} copies = copiesmod.pathcopies(repo[p1], repo[node]) for filename, adds, removes, isbinary in diffstat[:filelimit]: # use special encoding that allows non-utf8 filenames filename = pycompat.decodeutf8( encoding.jsonescape(pycompat.encodeutf8(filename), paranoid=True) ) changed_files[filename] = { "adds": adds, "removes": removes, "isbinary": isbinary, "status": filestatus.get(filename, "unknown"), } if filename in copies: changed_files[filename]["copies"] = copies[filename] output = {} output["changed_files"] = changed_files if len(diffstat) > filelimit: output["changed_files_truncated"] = True nodesmetadata[node] = output with index: for node, metadata in pycompat.iteritems(nodesmetadata): dumped = json.dumps(metadata, sort_keys=True) index.saveoptionaljsonmetadata(node, pycompat.encodeutf8(dumped))