view tests/test-bookmarks-push-race.t @ 51871:cfd30df0f8e4

bundlerepo: fix mismatches with repository and revlog classes Both pytype and PyCharm complained that `write()` and `_write()` in the bundlephasecache class aren't proper overrides- indeed they seem to be missing an argument that the base class has. PyCharm and pytype also complained that the `revlog.revlog` class doesn't have a `_chunk()` method. That looks like it was moved from revlog to `_InnerRevlog` back in e8ad6d8de8b8, and wasn't caught because this module wasn't type checked. However, I couldn't figure out a syntax with `revlog.revlog._inner._chunk(self, rev)`, as it complained about passing too many args. `bundlerevlog._rawtext()` uses this `super(...)` style to call the super class, so hopefully that works, even with the wonky dynamic subclassing. The revlog class needed the `_InnerRevlog` field typed because it isn't set in the constructor. Finally, the vfs type hints look broken. This initially failed with: File "/mnt/c/Users/Matt/hg/mercurial/bundlerepo.py", line 65, in __init__: Function readonlyvfs.__init__ was called with the wrong arguments [wrong-arg-types] Expected: (self, vfs: mercurial.vfs.vfs) Actually passed: (self, vfs: Callable) Called from (traceback): line 232, in dirlog line 214, in __init__ I don't see a raw Callable, but I tried changing some of the vfs args to be typed as `vfsmod.abstractvfs`, but that class doesn't have `options`, so it failed elsewhere. `readonlyvfs` isn't a subclass of `vfs` (it's a subclass of `abstractvfs`), so I'm not sure how to handle that. It would be a shame to have to make a union of vfs subclasses (but not all of them have `options` either).
author Matt Harbison <matt_harbison@yahoo.com>
date Sat, 03 Aug 2024 01:33:13 -0400
parents 553eb132366f
children
line wrap: on
line source

============================================
Testing various race condition while pushing
============================================

  $ cat << EOF >> $HGRCPATH
  > [command-templates]
  > log={rev}:{node|short} {desc|firstline} {bookmarks}
  > [ui]
  > timeout = 20
  > [phases]
  > publish=False
  > EOF

Initial Setup
=============

  $ hg init dst
  $ echo a > dst/a-file
  $ hg --cwd dst add a-file
  $ hg --cwd dst commit -m root
  $ hg --cwd dst bookmark my-book
  $ hg --cwd dst bookmarks
   * my-book                   0:a64e49638499
  $ hg --cwd dst log -G
  @  0:a64e49638499 root my-book
  

  $ hg clone ssh://user@dummy/dst src
  requesting all changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files
  new changesets a64e49638499 (1 drafts)
  updating to branch default
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ hg --cwd src update my-book
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  (activating bookmark my-book)
  $ hg --cwd src log -G
  @  0:a64e49638499 root my-book
  

  $ echo b > src/a-file
  $ hg --cwd src commit -m cA0_
  $ hg --cwd src log -G
  @  1:e89d3a6ed79b cA0_ my-book
  |
  o  0:a64e49638499 root
  

Race condition while pushing a forward moving bookmarks
=======================================================

This is currently slightly broken as we eventually don't push the bookmark.
However at least we do not delete the remote one.

  $ echo c > src/a-file
  $ hg --cwd src push -B my-book --config hooks.prelock="hg commit -m cA1_"
  pushing to ssh://user@dummy/dst
  searching for changes
  remote: adding changesets
  remote: adding manifests
  remote: adding file changes
  remote: added 1 changesets with 1 changes to 1 files
  $ hg --cwd src log -G
  @  2:08d837bbfe8d cA1_ my-book
  |
  o  1:e89d3a6ed79b cA0_
  |
  o  0:a64e49638499 root
  
  $ hg --cwd dst log -G
  o  1:e89d3a6ed79b cA0_
  |
  @  0:a64e49638499 root my-book
  

create a side-moving bookmark
Race condition while pushing a side moving bookmarks
=======================================================

resynchronize the repo and setup test
-------------------------------------

  $ hg --cwd src push -B my-book
  pushing to ssh://user@dummy/dst
  searching for changes
  remote: adding changesets
  remote: adding manifests
  remote: adding file changes
  remote: added 1 changesets with 1 changes to 1 files
  updating bookmark my-book
  $ hg --cwd dst log -G
  o  2:08d837bbfe8d cA1_ my-book
  |
  o  1:e89d3a6ed79b cA0_
  |
  @  0:a64e49638499 root
  

  $ hg --cwd src up 'desc("root")'
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  (leaving bookmark my-book)
  $ echo d > src/a-file
  $ hg --cwd src commit -m cB0_
  created new head
  $ hg --cwd src bookmark --force my-book
  $ echo e > src/a-file
  $ hg --cwd src log -G
  @  3:726401661fe5 cB0_ my-book
  |
  | o  2:08d837bbfe8d cA1_
  | |
  | o  1:e89d3a6ed79b cA0_
  |/
  o  0:a64e49638499 root
  

Push the bookmark while a commit is being made
----------------------------------------------

This is currently slightly broken as we eventually don't push the bookmark.
However at least we do not delete the remote one.

  $ hg --cwd src push -f -r 'desc("cB0_")' -B my-book --config hooks.prelock="hg commit -m cB1_"
  pushing to ssh://user@dummy/dst
  searching for changes
  remote: adding changesets
  remote: adding manifests
  remote: adding file changes
  remote: added 1 changesets with 1 changes to 1 files (+1 heads)
  $ hg --cwd src log -G
  @  4:a7f9cbf631a0 cB1_ my-book
  |
  o  3:726401661fe5 cB0_
  |
  | o  2:08d837bbfe8d cA1_
  | |
  | o  1:e89d3a6ed79b cA0_
  |/
  o  0:a64e49638499 root
  

  $ hg --cwd dst log -G
  o  3:726401661fe5 cB0_
  |
  | o  2:08d837bbfe8d cA1_ my-book
  | |
  | o  1:e89d3a6ed79b cA0_
  |/
  @  0:a64e49638499 root