On 7/24/20 2:25 PM, Manuel Jacob wrote:
On 2020-07-24 14:07, Pierre-Yves David wrote:
On 7/24/20 8:19 AM, Manuel Jacob wrote:
Overall, I’m fine to backout this for now and solve the problem
during the Mercurial 5.6 development cycle.
Thanks, let do that.
I still think that this check is not the right place for preventing
the cases you were raising. The message refers to changesets included
in the push, which I read as "transferred to the server", and
including non-missing changesets in the check causes e.g. issue6372.
For situations where the changesets are already on the server, the
old check missed many cases (the new doesn’t attempt to catch them).
If you find it important to retain the shotgun that misses part of
the target and hits the wall behind it (to use a different metaphor
than the holey safety net ;)), backing this out and taking a bit more
time to fix it during the 5.6 development cycle seems reasonable.
Yeah the existing code was very ra, it is some very old code setup
quickly when there was more pressing matters. The assumption was "with
a simple but wide net, we can probably catch most of the problems, but
the problem space was not really fully mapped and tested at that time
(because other focus) hence the various flaw. Lets fix it in 5.6, even
if we dont handle every corner case having a good map of the problem
space would be very helpful.
A good start would be to define what are the limits of what we can
detect. If two clients are involved, there are situations where we can’t
really detect anything without server support. Example (I hope my email
client doesn’t mangle it, otherwise see https://dpaste.com/E8J72RMLT):
$ cat >> $HGRCPATH << EOF
> [phases]
> publish = False
> [experimental]
> evolution = all
> EOF
$ hg init server
$ cd server
$ echo root > root; hg add root; hg ci -m root
$ hg phase --public
$ echo a > a; hg add a; hg ci -m a
$ cd ..
$ hg clone server client1
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg clone server client2
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd client1
$ hg branch foo -r 1
changed branch on 1 changesets
$ hg push --new-branch
pushing to $TESTTMP/server
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 0 changes to 1 files (+1 heads)
1 new obsolescence markers
obsoleted 1 changesets
$ cd ../client2
$ echo b > b; hg add b; hg ci -m b
$ hg push
pushing to $TESTTMP/server
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
1 new orphan changesets
Client 1 amends A and client 2 adds B on top of A. At each client, it
looks good, but when both push, we have an orphan on the server. Should
the server reject this if the client doesn’t explicitly force it?
The second push will create the orphan, we should detect the situation
at this time. (and point it to the user instead of letting him push
silently).
Backing out will reintroduce the bug that non-head outgoing
content-divergent and phase-divergent changesets are not detected. I
can send another patch that checks them.
That seems like a good idea.
About the tests in the following patches: I’ve put some small
modifications on top in
https://foss.heptapod.net/octobus/mercurial-devel/-/commits/topic/stable/push-obscheck--small-modifications.
If you like them, you can absorb them in your patches, or prune them
otherwise.
All three are great, got ahead in folding them at the appropriate
location.
If you want them to be committed like this, you’ll probably need to send
a V2. ;)
Let me know once they are folded. I'll email the V2
The current test structure is:
* case 1: test pushing
* case 2: test pushing
* case 1: test publishing
* case 2: test publishing
An alternative structure would make it easier to add more cases later:
* case 1: test pushing
* case 1: test publishing
* case 2: test pushing
* case 2: test publishing
I considered each approach. I think the "publishing" check will be a
different layer of check eventually with different sub case so it make
sense to group them. (but I don't have a super strong opinion on
that).
Yes, leaving the structure as-is might be a good idea. We can relatively
easily add a separate check for "do we publish obsolete changesets?", as
we know both the published changesets and the obsolete changesets. If
it’s a simple effective check, we don’t have to test it for every case
where we test the obsolete / unstable check.
Maybe it would make sense to factor out the setup more so that each run
is more independant (but that comes with extra runtime cost)
--
Pierre-Yves David
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel