##// END OF EJS Templates
wireprotov2: define and implement "manifestdata" command...
wireprotov2: define and implement "manifestdata" command The added command can be used for obtaining manifest data. Given a manifest path and set of manifest nodes, data about manifests can be retrieved. Unlike changeset data, we wish to emit deltas to describe manifest revisions. So the command uses the relatively new API for building delta requests and emitting them. The code calls into deltaparent(), which I'm not very keen of. There's still work to be done in delta generation land so implementation details of storage (e.g. exactly one delta is stored/available) don't creep into higher levels. But we can worry about this later (there is already a TODO on imanifestorage tracking this). On the subject of parent deltas, the server assumes parent revisions exist on the receiving end. This is obviously wrong for shallow clone. I've added TODOs to add a mechanism to the command to allow clients to specify desired behavior. This shouldn't be too difficult to implement. Another big change is that the client must explicitly request manifest nodes to retrieve. This is a major departure from "getbundle," where the server derives relevant manifests as it iterates changesets and sends them automatically. As implemented, the client must transmit each requested node to the server. At 20 bytes per node, we're looking at 2 MB per 100,000 nodes. Plus wire encoding overhead. This isn't ideal for clients with limited upload bandwidth. I plan to address this in the future by allowing alternate mechanisms for defining the revisions to retrieve. One idea is to define a range of changeset revisions whose manifest revisions to retrieve (similar to how "changesetdata" works). We almost certainly want an API to look up an individual manifest by node. And that's where I've chosen to start with the implementation. Again, a theme of this early exchangev2 work is I want to start by building primitives for accessing raw repository data first and see how far we can get with those before we need more complexity. Differential Revision: https://phab.mercurial-scm.org/D4488

File last commit:

r26736:143b52fc default
r39673:c7a7c7e8 default
Show More
test-mq-qdelete.t
197 lines | 3.5 KiB | text/troff | Tads3Lexer
$ echo "[extensions]" >> $HGRCPATH
$ echo "mq=" >> $HGRCPATH
$ hg init a
$ cd a
$ echo 'base' > base
$ hg ci -Ambase -d '1 0'
adding base
$ hg qnew -d '1 0' pa
$ hg qnew -d '1 0' pb
$ hg qnew -d '1 0' pc
$ hg qdel
abort: qdelete requires at least one revision or patch name
[255]
$ hg qdel pc
abort: cannot delete applied patch pc
[255]
$ hg qpop
popping pc
now at: pb
Delete the same patch twice in one command (issue2427)
$ hg qdel pc pc
$ hg qseries
pa
pb
$ ls .hg/patches
pa
pb
series
status
$ hg qpop
popping pb
now at: pa
$ hg qdel -k 1
$ ls .hg/patches
pa
pb
series
status
$ hg qdel -r pa
patch pa finalized without changeset message
$ hg qapplied
$ hg log --template '{rev} {desc}\n'
1 [mq]: pa
0 base
$ hg qnew pd
$ hg qnew pe
$ hg qnew pf
$ hg qdel -r pe
abort: cannot delete revision 3 above applied patches
[255]
$ hg qdel -r qbase:pe
patch pd finalized without changeset message
patch pe finalized without changeset message
$ hg qapplied
pf
$ hg log --template '{rev} {desc}\n'
4 [mq]: pf
3 [mq]: pe
2 [mq]: pd
1 [mq]: pa
0 base
$ cd ..
$ hg init b
$ cd b
$ echo 'base' > base
$ hg ci -Ambase -d '1 0'
adding base
$ hg qfinish
abort: no revisions specified
[255]
$ hg qfinish -a
no patches applied
$ hg qnew -d '1 0' pa
$ hg qnew -d '1 0' pb
$ hg qnew pc # XXX fails to apply by /usr/bin/patch if we put a date
$ hg qfinish 0
abort: revision 0 is not managed
[255]
$ hg qfinish pb
abort: cannot delete revision 2 above applied patches
[255]
$ hg qpop
popping pc
now at: pb
$ hg qfinish -a pc
abort: unknown revision 'pc'!
[255]
$ hg qpush
applying pc
patch pc is empty
now at: pc
$ hg qfinish qbase:pb
patch pa finalized without changeset message
patch pb finalized without changeset message
$ hg qapplied
pc
$ hg log --template '{rev} {desc}\n'
3 imported patch pc
2 [mq]: pb
1 [mq]: pa
0 base
$ hg qfinish -a pc
patch pc finalized without changeset message
$ hg qapplied
$ hg log --template '{rev} {desc}\n'
3 imported patch pc
2 [mq]: pb
1 [mq]: pa
0 base
$ ls .hg/patches
series
status
qdel -k X && hg qimp -e X used to trigger spurious output with versioned queues
$ hg init --mq
$ hg qimport -r 3
$ hg qpop
popping imported_patch_pc
patch queue now empty
$ hg qdel -k imported_patch_pc
$ hg qimp -e imported_patch_pc
adding imported_patch_pc to series file
$ hg qfinish -a
no patches applied
resilience to inconsistency: qfinish -a with applied patches not in series
$ hg qser
imported_patch_pc
$ hg qapplied
$ hg qpush
applying imported_patch_pc
patch imported_patch_pc is empty
now at: imported_patch_pc
$ echo next >> base
$ hg qrefresh -d '1 0'
$ echo > .hg/patches/series # remove 3.diff from series to confuse mq
$ hg qfinish -a
revision 47dfa8501675 refers to unknown patches: imported_patch_pc
more complex state 'both known and unknown patches
$ echo hip >> base
$ hg qnew -f -d '1 0' -m 4 4.diff
$ echo hop >> base
$ hg qnew -f -d '1 0' -m 5 5.diff
$ echo > .hg/patches/series # remove 4.diff and 5.diff from series to confuse mq
$ echo hup >> base
$ hg qnew -f -d '1 0' -m 6 6.diff
$ echo pup > base
$ hg qfinish -a
warning: uncommitted changes in the working directory
revision 2b1c98802260 refers to unknown patches: 5.diff
revision 33a6861311c0 refers to unknown patches: 4.diff
$ cd ..