tests/test-newercgi.t
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Wed, 02 Dec 2015 03:12:07 +0900
changeset 27192 a01d3d32b53a
parent 22046 7a9cbb315d84
child 32938 b6776b34e44e
permissions -rw-r--r--
commands: make commit acquire locks before processing (issue4368) Before this patch, "hg commit" (process A) executes steps below: 1. get current branch heads via 'repo.branchheads()' - cache 'repo.changelog' 2. invoke 'repo.commit()' 3. acquire wlock - invalidate 'repo.dirstate' 4. access 'repo.dirstate' - re-read '.hg/dirstate' - check validity of parent revisions with 'repo.changelog' 5. invoke 'repo.commitctx()' 6. acquire store lock (slock) - invalidate 'repo.changelog' 7. do committing 8. release slock 9. release wlock 10. check new branch head (via 'cmdutil.commitstatus()') If acquisition of wlock at (3) above waits for another "hg commit" (process B) or so running parallelly to release wlock, process A causes creating orphan revision, because: - '.hg/dirstate' refers the revision, which is newly added by process B, as its parent - but already cached 'repo.changelog' doesn't contain such revision - therefore, validating parents of '.hg/dirstate' at (4) above replaces such revision with 'nullid' Then, process A creates "orphan" revision, of which parent is "null" revision. In addition to it, "created new head" may be shown at the end of process A unintentionally, if store is updated parallelly, because both getting branch heads (1) and checking new branch head (10) are executed outside slock scope. To avoid this issue, this patch makes "hg commit" acquire wlock and slock before processing. This patch resolves the issue between "hg commit" processes, but not one between "hg commit" and other commands. Subsequent patches resolve the latter. Even after this patch, there are still corner case problems below: - filecache may overlook changes of '.hg/dirstate', and it causes similar issue (see below for detail) https://bz.mercurial-scm.org/show_bug.cgi?id=4368#c10 - 3rd party extension may cause similar issue, if it directly uses 'repo.commit()' without acquisition of wlock and slock This can be fixed by acquisition of slock at the beginning of 'repo.commit()', but it seems suitable for "default" branch In fact, acquisition of slock itself is already introduced at "default" branch by 4414d500604f, but acquisition is not at the beginning of 'repo.commit()'. This patch also changes some tests: - test-fncache.t needs this tricky wrapping, to release (= forced failure of) wlock certainly - order of "hg commit" output is changed by widening scope of locks, because some hooks are fired after releasing wlock
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22046
7a9cbb315d84 tests: replace exit 80 with #require
Matt Mackall <mpm@selenic.com>
parents: 15567
diff changeset
     1
#require no-msys # MSYS will translate web paths as if they were file paths
15567
8b84d040d9f9 tests: introduce 'hghave msys' to skip tests that would fail because of msys
Mads Kiilerich <mads@kiilerich.com>
parents: 13269
diff changeset
     2
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
     3
This is a rudimentary test of the CGI files as of d74fc8dec2b4.
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     4
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
     5
  $ hg init test
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     6
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
     7
  $ cat >hgweb.cgi <<HGWEB
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
     8
  > #!/usr/bin/env python
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
     9
  > #
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    10
  > # An example CGI script to use hgweb, edit as necessary
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    11
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    12
  > import cgitb
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    13
  > cgitb.enable()
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    14
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    15
  > from mercurial import demandimport; demandimport.enable()
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    16
  > from mercurial.hgweb import hgweb
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    17
  > from mercurial.hgweb import wsgicgi
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    18
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    19
  > application = hgweb("test", "Empty test repository")
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    20
  > wsgicgi.launch(application)
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    21
  > HGWEB
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    22
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    23
  $ chmod 755 hgweb.cgi
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    24
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    25
  $ cat >hgweb.config <<HGWEBDIRCONF
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    26
  > [paths]
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    27
  > test = test
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    28
  > HGWEBDIRCONF
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    29
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    30
  $ cat >hgwebdir.cgi <<HGWEBDIR
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    31
  > #!/usr/bin/env python
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    32
  > #
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    33
  > # An example CGI script to export multiple hgweb repos, edit as necessary
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    34
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    35
  > import cgitb
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    36
  > cgitb.enable()
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    37
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    38
  > from mercurial import demandimport; demandimport.enable()
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    39
  > from mercurial.hgweb import hgwebdir
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    40
  > from mercurial.hgweb import wsgicgi
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    41
  > 
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    42
  > application = hgwebdir("hgweb.config")
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    43
  > wsgicgi.launch(application)
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    44
  > HGWEBDIR
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    45
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    46
  $ chmod 755 hgwebdir.cgi
5577
e0173902c813 CGI compatibility fix for d74fc8dec2b4.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    47
13269
aa3f726a2bdb tests: remove duplication of the CGI environment variables
StevenGBrown
parents: 12471
diff changeset
    48
  $ . "$TESTDIR/cgienv"
12471
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    49
  $ python hgweb.cgi > page1
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    50
  $ python hgwebdir.cgi > page2
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    51
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    52
  $ PATH_INFO="/test/"
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    53
  $ PATH_TRANSLATED="/var/something/test.cgi"
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    54
  $ REQUEST_URI="/test/test/"
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    55
  $ SCRIPT_URI="http://hg.omnifarious.org/test/test/"
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    56
  $ SCRIPT_URL="/test/test/"
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    57
  $ python hgwebdir.cgi > page3
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    58
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    59
  $ grep -i error page1 page2 page3
d86dc8b1ffc3 tests: unify test-newercgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
    60
  [1]