This patch drops infinitepushcommands.py and the tests which were related to the
command debugfillinfinitepushmetadata introduced in the commit.
The patch also drops a config option which was related to
debuginfinitepushmetadata command.
indygreg |
hg-reviewers |
This patch drops infinitepushcommands.py and the tests which were related to the
command debugfillinfinitepushmetadata introduced in the commit.
The patch also drops a config option which was related to
debuginfinitepushmetadata command.
Lint Skipped |
Unit Tests Skipped |
Path | Packages | |||
---|---|---|---|---|
M | hgext/infinitepush/__init__.py (3 lines) | |||
D | M | hgext/infinitepush/infinitepushcommands.py (101 lines) | ||
M | tests/test-infinitepush.t (77 lines) |
default='', | default='', | ||||
) | ) | ||||
configitem('scratchbranch', 'storepath', | configitem('scratchbranch', 'storepath', | ||||
default='', | default='', | ||||
) | ) | ||||
configitem('infinitepush', 'branchpattern', | configitem('infinitepush', 'branchpattern', | ||||
default='', | default='', | ||||
) | ) | ||||
configitem('infinitepush', 'metadatafilelimit', | |||||
default=100, | |||||
) | |||||
configitem('experimental', 'server-bundlestore-bookmark', | configitem('experimental', 'server-bundlestore-bookmark', | ||||
default='', | default='', | ||||
) | ) | ||||
configitem('experimental', 'infinitepush-scratchpush', | configitem('experimental', 'infinitepush-scratchpush', | ||||
default=False, | default=False, | ||||
) | ) | ||||
configitem('experimental', 'non-forward-move', | configitem('experimental', 'non-forward-move', | ||||
default=False, | default=False, |
# Copyright 2016 Facebook, Inc. | |||||
# | |||||
# This software may be used and distributed according to the terms of the | |||||
# GNU General Public License version 2 or any later version. | |||||
""" | |||||
config:: | |||||
[infinitepush] | |||||
# limit number of files in the node metadata. This is to make sure we don't | |||||
# waste too much space on huge codemod commits. | |||||
metadatafilelimit = 100 | |||||
""" | |||||
from __future__ import absolute_import | |||||
import json | |||||
from mercurial.node import bin | |||||
from mercurial.i18n import _ | |||||
from mercurial import ( | |||||
copies as copiesmod, | |||||
encoding, | |||||
error, | |||||
hg, | |||||
patch, | |||||
registrar, | |||||
scmutil, | |||||
util, | |||||
) | |||||
from . import ( | |||||
common, | |||||
) | |||||
downloadbundle = common.downloadbundle | |||||
cmdtable = {} | |||||
command = registrar.command(cmdtable) | |||||
@command('debugfillinfinitepushmetadata', | |||||
[('', 'node', [], 'node to fill metadata for')]) | |||||
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 = 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 = encoding.jsonescape(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 nodesmetadata.iteritems(): | |||||
dumped = json.dumps(metadata, sort_keys=True) | |||||
index.saveoptionaljsonmetadata(node, dumped) |
added 1 changesets with 1 changes to 2 files | added 1 changesets with 1 changes to 2 files | ||||
new changesets d8fde0ddfc96 | new changesets d8fde0ddfc96 | ||||
(run 'hg update' to get a working copy) | (run 'hg update' to get a working copy) | ||||
'scratch/mybranch' found remotely | 'scratch/mybranch' found remotely | ||||
2 files updated, 0 files merged, 1 files removed, 0 files unresolved | 2 files updated, 0 files merged, 1 files removed, 0 files unresolved | ||||
(activating bookmark scratch/mybranch) | (activating bookmark scratch/mybranch) | ||||
$ hg log -r scratch/mybranch -T '{node}' | $ hg log -r scratch/mybranch -T '{node}' | ||||
d8fde0ddfc962183977f92d2bc52d303b8840f9d (no-eol) | d8fde0ddfc962183977f92d2bc52d303b8840f9d (no-eol) | ||||
Test debugfillinfinitepushmetadata | |||||
$ cd ../repo | |||||
$ hg debugfillinfinitepushmetadata | |||||
abort: nodes are not specified | |||||
[255] | |||||
$ hg debugfillinfinitepushmetadata --node randomnode | |||||
abort: node randomnode is not found | |||||
[255] | |||||
$ hg debugfillinfinitepushmetadata --node d8fde0ddfc962183977f92d2bc52d303b8840f9d | |||||
$ cat .hg/scratchbranches/index/nodemetadatamap/d8fde0ddfc962183977f92d2bc52d303b8840f9d | |||||
{"changed_files": {"testpullbycommithash2": {"adds": 1, "isbinary": false, "removes": 0, "status": "added"}}} (no-eol) | |||||
$ cd ../client | |||||
$ hg up d8fde0ddfc962183977f92d2bc52d303b8840f9d | |||||
'd8fde0ddfc962183977f92d2bc52d303b8840f9d' does not exist locally - looking for it remotely... | |||||
pulling from ssh://user@dummy/repo | |||||
searching for changes | |||||
adding changesets | |||||
adding manifests | |||||
adding file changes | |||||
added 2 changesets with 2 changes to 2 files (+1 heads) | |||||
new changesets 33910bfe6ffe:d8fde0ddfc96 | |||||
(run 'hg heads .' to see heads, 'hg merge' to merge) | |||||
'd8fde0ddfc962183977f92d2bc52d303b8840f9d' found remotely | |||||
2 files updated, 0 files merged, 1 files removed, 0 files unresolved | |||||
$ echo file > file | |||||
$ hg add file | |||||
$ hg rm testpullbycommithash2 | |||||
$ hg ci -m 'add and rm files' | |||||
$ hg log -r . -T '{node}\n' | |||||
3edfe7e9089ab9f728eb8e0d0c62a5d18cf19239 | |||||
$ hg cp file cpfile | |||||
$ hg mv file mvfile | |||||
$ hg ci -m 'cpfile and mvfile' | |||||
$ hg log -r . -T '{node}\n' | |||||
c7ac39f638c6b39bcdacf868fa21b6195670f8ae | |||||
$ hg push -r . --bundle-store | |||||
pushing to ssh://user@dummy/repo | |||||
searching for changes | |||||
remote: pushing 4 commits: | |||||
remote: 33910bfe6ffe testpullbycommithash1 | |||||
remote: d8fde0ddfc96 testpullbycommithash2 | |||||
remote: 3edfe7e9089a add and rm files | |||||
remote: c7ac39f638c6 cpfile and mvfile | |||||
$ cd ../repo | |||||
$ hg debugfillinfinitepushmetadata --node 3edfe7e9089ab9f728eb8e0d0c62a5d18cf19239 --node c7ac39f638c6b39bcdacf868fa21b6195670f8ae | |||||
$ cat .hg/scratchbranches/index/nodemetadatamap/3edfe7e9089ab9f728eb8e0d0c62a5d18cf19239 | |||||
{"changed_files": {"file": {"adds": 1, "isbinary": false, "removes": 0, "status": "added"}, "testpullbycommithash2": {"adds": 0, "isbinary": false, "removes": 1, "status": "removed"}}} (no-eol) | |||||
$ cat .hg/scratchbranches/index/nodemetadatamap/c7ac39f638c6b39bcdacf868fa21b6195670f8ae | |||||
{"changed_files": {"cpfile": {"adds": 1, "copies": "file", "isbinary": false, "removes": 0, "status": "added"}, "file": {"adds": 0, "isbinary": false, "removes": 1, "status": "removed"}, "mvfile": {"adds": 1, "copies": "file", "isbinary": false, "removes": 0, "status": "added"}}} (no-eol) | |||||
Test infinitepush.metadatafilelimit number | |||||
$ cd ../client | |||||
$ echo file > file | |||||
$ hg add file | |||||
$ echo file1 > file1 | |||||
$ hg add file1 | |||||
$ echo file2 > file2 | |||||
$ hg add file2 | |||||
$ hg ci -m 'add many files' | |||||
$ hg log -r . -T '{node}' | |||||
09904fb20c53ff351bd3b1d47681f569a4dab7e5 (no-eol) | |||||
$ hg push -r . --bundle-store | |||||
pushing to ssh://user@dummy/repo | |||||
searching for changes | |||||
remote: pushing 5 commits: | |||||
remote: 33910bfe6ffe testpullbycommithash1 | |||||
remote: d8fde0ddfc96 testpullbycommithash2 | |||||
remote: 3edfe7e9089a add and rm files | |||||
remote: c7ac39f638c6 cpfile and mvfile | |||||
remote: 09904fb20c53 add many files | |||||
$ cd ../repo | |||||
$ hg debugfillinfinitepushmetadata --node 09904fb20c53ff351bd3b1d47681f569a4dab7e5 --config infinitepush.metadatafilelimit=2 | |||||
$ cat .hg/scratchbranches/index/nodemetadatamap/09904fb20c53ff351bd3b1d47681f569a4dab7e5 | |||||
{"changed_files": {"file": {"adds": 1, "isbinary": false, "removes": 0, "status": "added"}, "file1": {"adds": 1, "isbinary": false, "removes": 0, "status": "added"}}, "changed_files_truncated": true} (no-eol) |