tests/test-single-head.t
author Gregory Szorc <gregory.szorc@gmail.com>
Tue, 18 Sep 2018 17:51:43 -0700
changeset 39794 a6b3c4c1019f
parent 35778 128dd940bedc
child 39960 43d3b09b3e5a
permissions -rw-r--r--
revlog: move censor logic out of censor extension The censor extension is doing very low-level things with revlogs. It is fundamentally impossible for this logic to remain in the censor extension while support multiple storage backends: we need each storage backend to implement censor in its own storage-specific way. This commit effectively moves the revlog-specific censoring code to be a method of revlogs themselves. We've defined a new API on the file storage interface for censoring an individual node. Even though the current censoring code doesn't use it, the API requires a transaction instance because it logically makes sense for storage backends to require an active transaction (which implies a held write lock) in order to rewrite storage. After this commit, the censor extension has been reduced to boilerplate precondition checking before invoking the generic storage API. I tried to keep the code as similar as possible. But some minor changes were made: * We use self._io instead of instantiating a new revlogio instance. * We compare self.version against REVLOGV0 instead of != REVLOGV1 because presumably all future revlog versions will support censoring. * We use self.opener instead of going through repo.svfs (we don't have a handle on the repo instance from a revlog). * "revlog" dropped * Replace "flog" with "self". Differential Revision: https://phab.mercurial-scm.org/D4656

=====================
Test workflow options
=====================

  $ . "$TESTDIR/testlib/obsmarker-common.sh"

Test single head enforcing - Setup
=============================================

  $ cat << EOF >> $HGRCPATH
  > [experimental]
  > evolution = all
  > EOF
  $ hg init single-head-server
  $ cd single-head-server
  $ cat <<EOF >> .hg/hgrc
  > [phases]
  > publish = no
  > [experimental]
  > single-head-per-branch = yes
  > EOF
  $ mkcommit ROOT
  $ mkcommit c_dA0
  $ cd ..

  $ hg clone single-head-server client
  updating to branch default
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved

Test single head enforcing - with branch only
---------------------------------------------

  $ cd client

continuing the current defaultbranch

  $ mkcommit c_dB0
  $ hg push
  pushing to $TESTTMP/single-head-server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files

creating a new branch

  $ hg up 'desc("ROOT")'
  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
  $ hg branch branch_A
  marked working directory as branch branch_A
  (branches are permanent and global, did you want a bookmark?)
  $ mkcommit c_aC0
  $ hg push --new-branch
  pushing to $TESTTMP/single-head-server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files (+1 heads)

Create a new head on the default branch

  $ hg up 'desc("c_dA0")'
  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
  $ mkcommit c_dD0
  created new head
  $ hg push -f
  pushing to $TESTTMP/single-head-server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files (+1 heads)
  transaction abort!
  rollback completed
  abort: rejecting multiple heads on branch "default"
  (2 heads: 286d02a6e2a2 9bf953aa81f6)
  [255]

remerge them

  $ hg merge
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  (branch merge, don't forget to commit)
  $ mkcommit c_dE0
  $ hg push
  pushing to $TESTTMP/single-head-server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 2 changes to 2 files

Test single head enforcing - after rewrite
------------------------------------------

  $ mkcommit c_dF0
  $ hg push
  pushing to $TESTTMP/single-head-server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files
  $ hg commit --amend -m c_dF1
  $ hg push
  pushing to $TESTTMP/single-head-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

Check it does to interfer with strip
------------------------------------

setup

  $ hg branch branch_A --force
  marked working directory as branch branch_A
  $ mkcommit c_aG0
  created new head
  $ hg update 'desc("c_dF1")'
  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
  $ mkcommit c_dH0
  $ hg update 'desc("c_aG0")'
  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
  $ hg merge
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  (branch merge, don't forget to commit)
  $ mkcommit c_aI0
  $ hg log -G
  @    changeset:   10:49003e504178
  |\   branch:      branch_A
  | |  tag:         tip
  | |  parent:      8:a33fb808fb4b
  | |  parent:      3:840af1c6bc88
  | |  user:        test
  | |  date:        Thu Jan 01 00:00:00 1970 +0000
  | |  summary:     c_aI0
  | |
  | | o  changeset:   9:fe47ea669cea
  | | |  parent:      7:99a2dc242c5d
  | | |  user:        test
  | | |  date:        Thu Jan 01 00:00:00 1970 +0000
  | | |  summary:     c_dH0
  | | |
  | o |  changeset:   8:a33fb808fb4b
  | |/   branch:      branch_A
  | |    user:        test
  | |    date:        Thu Jan 01 00:00:00 1970 +0000
  | |    summary:     c_aG0
  | |
  | o  changeset:   7:99a2dc242c5d
  | |  parent:      5:6ed1df20edb1
  | |  user:        test
  | |  date:        Thu Jan 01 00:00:00 1970 +0000
  | |  summary:     c_dF1
  | |
  | o    changeset:   5:6ed1df20edb1
  | |\   parent:      4:9bf953aa81f6
  | | |  parent:      2:286d02a6e2a2
  | | |  user:        test
  | | |  date:        Thu Jan 01 00:00:00 1970 +0000
  | | |  summary:     c_dE0
  | | |
  | | o  changeset:   4:9bf953aa81f6
  | | |  parent:      1:134bc3852ad2
  | | |  user:        test
  | | |  date:        Thu Jan 01 00:00:00 1970 +0000
  | | |  summary:     c_dD0
  | | |
  o | |  changeset:   3:840af1c6bc88
  | | |  branch:      branch_A
  | | |  parent:      0:ea207398892e
  | | |  user:        test
  | | |  date:        Thu Jan 01 00:00:00 1970 +0000
  | | |  summary:     c_aC0
  | | |
  | o |  changeset:   2:286d02a6e2a2
  | |/   user:        test
  | |    date:        Thu Jan 01 00:00:00 1970 +0000
  | |    summary:     c_dB0
  | |
  | o  changeset:   1:134bc3852ad2
  |/   user:        test
  |    date:        Thu Jan 01 00:00:00 1970 +0000
  |    summary:     c_dA0
  |
  o  changeset:   0:ea207398892e
     user:        test
     date:        Thu Jan 01 00:00:00 1970 +0000
     summary:     ROOT
  

actual stripping

  $ hg strip --config extensions.strip= --rev 'desc("c_dH0")'
  saved backup bundle to $TESTTMP/client/.hg/strip-backup/fe47ea669cea-a41bf5a9-backup.hg
  warning: ignoring unknown working parent 49003e504178!