##// END OF EJS Templates
wireproto: syntax for encoding CBOR into frames...
wireproto: syntax for encoding CBOR into frames We just vendored a library for encoding and decoding the CBOR data format. While the intent of that vendor was to support state files, CBOR is really a nice data format. It is extensible and compact. I've been feeling dirty inventing my own data formats for frame payloads. While custom formats can always beat out a generic format, there is a cost to be paid in terms of implementation, comprehension, etc. CBOR is compact enough that I'm not too worried about efficiency loss. I think the benefits of using a standardized format outweigh rolling our own formats. So I plan to make heavy use of CBOR in the wire protocol going forward. This commit introduces support for encoding CBOR data in frame payloads to our function to make a frame from a human string. We do need to employ some low-level Python code in order to evaluate a string as a Python expression. But other than that, this should hopefully be pretty straightforward. Unit tests for this function have been added. Differential Revision: https://phab.mercurial-scm.org/D2948

File last commit:

r35390:b963750b default
r37306:cc5a040f default
Show More
map
242 lines | 6.5 KiB | text/plain | TextLexer
mimetype = 'application/json'
filerevision = '\{
"node": {node|json},
"path": {file|json},
"date": {date|json},
"desc": {desc|utf8|json},
"branch": {if(branch, branch%changesetbranch, "default"|json)},
"bookmarks": [{join(bookmarks%changelistentryname, ", ")}],
"tags": [{join(tags%changelistentryname, ", ")}],
"user": {author|utf8|json},
"parents": [{join(parent%changesetparent, ", ")}],
"phase": {phase|json},
"lines": [{join(text%lineentry, ", ")}]
}'
lineentry = '\{
"line": {line|json}
}'
search = '\{
"node": {node|json},
"query": {query|json},
"entries": [{join(entries%searchentry, ", ")}]
}'
searchentry = '{changelistentry}'
# changelog and shortlog are the same web API but with different
# number of entries.
changelog = changelist.tmpl
shortlog = changelist.tmpl
graph = graph.tmpl
changelistentry = '\{
"node": {node|json},
"date": {date|json},
"desc": {desc|utf8|json},
"branch": {if(branch, branch%changesetbranch, "default"|json)},
"bookmarks": [{join(bookmarks%changelistentryname, ", ")}],
"tags": [{join(tags%changelistentryname, ", ")}],
"user": {author|utf8|json},
"phase": {phase|json},
"parents": [{if(allparents, join(allparents%changesetparent, ", "),
join(parent%changesetparent, ", "))}]
}'
graphentry = '\{
"node": {node|json},
"date": {date|json},
"desc": {desc|utf8|json},
"branch": {if(branch, branch%changesetbranch, "default"|json)},
"bookmarks": [{join(bookmarks%changelistentryname, ", ")}],
"tags": [{join(tags%changelistentryname, ", ")}],
"user": {author|utf8|json},
"phase": {phase|json},
"col": {col|json},
"row": {row|json},
"color": {color|json},
"edges": {edges|json},
"parents": [{if(allparents, join(allparents%changesetparent, ", "),
join(parent%changesetparent, ", "))}]
}'
changelistentryname = '{name|utf8|json}'
changeset = '\{
"node": {node|json},
"date": {date|json},
"desc": {desc|utf8|json},
"branch": {if(branch, branch%changesetbranch, "default"|json)},
"bookmarks": [{join(changesetbookmark, ", ")}],
"tags": [{join(changesettag, ", ")}],
"user": {author|utf8|json},
"parents": [{join(parent%changesetparent, ", ")}],
"phase": {phase|json}
}'
changesetbranch = '{name|utf8|json}'
changesetbookmark = '{bookmark|utf8|json}'
changesettag = '{tag|utf8|json}'
changesetparent = '{node|json}'
manifest = '\{
"node": {node|json},
"abspath": {path|json},
"directories": [{join(dentries%direntry, ", ")}],
"files": [{join(fentries%fileentry, ", ")}],
"bookmarks": [{join(bookmarks%name, ", ")}],
"tags": [{join(tags%name, ", ")}]
}'
name = '{name|utf8|json}'
direntry = '\{
"abspath": {path|json},
"basename": {basename|json},
"emptydirs": {emptydirs|json}
}'
fileentry = '\{
"abspath": {file|json},
"basename": {basename|json},
"date": {date|json},
"size": {size|json},
"flags": {permissions|json}
}'
tags = '\{
"node": {node|json},
"tags": [{join(entriesnotip%tagentry, ", ")}]
}'
tagentry = '\{
"tag": {tag|utf8|json},
"node": {node|json},
"date": {date|json}
}'
bookmarks = '\{
"node": {node|json},
"bookmarks": [{join(entries%bookmarkentry, ", ")}]
}'
bookmarkentry = '\{
"bookmark": {bookmark|utf8|json},
"node": {node|json},
"date": {date|json}
}'
branches = '\{
"branches": [{join(entries%branchentry, ", ")}]
}'
branchentry = '\{
"branch": {branch|utf8|json},
"node": {node|json},
"date": {date|json},
"status": {status|json}
}'
shortlogentry = '{changelistentry}'
summary = '\{
"node": {node|json},
"lastchange": {lastchange|json},
"bookmarks": [{join(bookmarks%bookmarkentry, ", ")}],
"branches": [{join(branches%branchentry, ", ")}],
"shortlog": [{join(shortlog%shortlogentry, ", ")}],
"tags": [{join(tags%tagentry, ", ")}],
"archives": [{join(archives%archiveentry, ", ")}],
"labels": {labels|json}
}'
archiveentry = '\{
"node": {node|json},
"extension": {extension|json},
"type": {type|json},
"url": {"{urlbase}{url}archive/{node}{extension}"|json}
}'
filediff = '\{
"path": {file|json},
"node": {node|json},
"date": {date|json},
"desc": {desc|utf8|json},
"author": {author|utf8|json},
"parents": [{join(parent%changesetparent, ", ")}],
"children": [{join(child%changesetparent, ", ")}],
"diff": [{join(diff%diffblock, ", ")}]
}'
diffblock = '\{
"blockno": {blockno|json},
"lines": [{join(lines, ", ")}]
}'
difflineplus = '\{
"t": "+",
"n": {lineno|json},
"l": {line|json}
}'
difflineminus = '\{
"t": "-",
"n": {lineno|json},
"l": {line|json}
}'
difflineat = '\{
"t": "@",
"n": {lineno|json},
"l": {line|json}
}'
diffline = '\{
"t": "",
"n": {lineno|json},
"l": {line|json}
}'
filecomparison = '\{
"path": {file|json},
"node": {node|json},
"date": {date|json},
"desc": {desc|utf8|json},
"author": {author|utf8|json},
"parents": [{join(parent%changesetparent, ", ")}],
"children": [{join(child%changesetparent, ", ")}],
"leftnode": {leftnode|json},
"rightnode": {rightnode|json},
"comparison": [{join(comparison, ", ")}]
}'
comparisonblock = '\{
"lines": [{join(lines, ", ")}]
}'
comparisonline = '\{
"t": {type|json},
"ln": {leftlineno|json},
"ll": {leftline|json},
"rn": {rightlineno|json},
"rl": {rightline|json}
}'
fileannotate = '\{
"abspath": {file|json},
"node": {node|json},
"author": {author|utf8|json},
"date": {date|json},
"desc": {desc|utf8|json},
"parents": [{join(parent%changesetparent, ", ")}],
"children": [{join(child%changesetparent, ", ")}],
"permissions": {permissions|json},
"annotate": [{join(annotate%fileannotation, ", ")}]
}'
fileannotation = '\{
"node": {node|json},
"author": {author|utf8|json},
"desc": {desc|utf8|json},
"abspath": {file|json},
"targetline": {targetline|json},
"line": {line|json},
"lineno": {lineno|json},
"revdate": {revdate|json}
}'
filelog = '\{
"entries": [{join(entries%changelistentry, ", ")}]
}'
helptopics = '\{
"topics": [{join(topics%helptopicentry, ", ")}],
"earlycommands": [{join(earlycommands%helptopicentry, ", ")}],
"othercommands": [{join(othercommands%helptopicentry, ", ")}]
}'
helptopicentry = '\{
"topic": {topic|utf8|json},
"summary": {summary|utf8|json}
}'
help = '\{
"topic": {topic|utf8|json},
"rawdoc": {doc|utf8|json}
}'
filenodelink = ''
filenolink = ''
index = '\{
"entries": [{join(entries%indexentry, ", ")}]
}'
indexentry = '\{
"name": {name|utf8|json},
"description": {description|utf8|json},
"contact": {contact|utf8|json},
"lastchange": {lastchange|json},
"labels": {labels|json}
}'