tests/test-hgweb-raw.t
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Wed, 24 Feb 2016 06:10:46 +0900
changeset 28265 332926212ef8
parent 25472 4d2b9b304ad0
child 31008 636cf3f7620d
permissions -rw-r--r--
repoview: discard filtered changelog if index isn't shared with unfiltered Before this patch, revisions rollbacked at failure of previous transaction might be visible at subsequent operations unintentionally, if repoview object is reused even after failure of transaction: e.g. command server and HTTP server are typical cases. 'repoview' uses the tuple of values below of unfiltered changelog as "the key" to examine validity of filtered changelog cache. - length - tip node - filtered revisions (as hashed value) - '_delayed' field 'repoview' compares between "the key" of unfiltered changelog at previous caching and now, and reuses filtered changelog cache if no change is detected. But this comparison indicates only that there is no change between unfiltered 'repo.changelog' at last caching and now, but not that filtered changelog cache is valid for current unfiltered one. 'repoview' uses "shallow copy" of unfiltered changelog to create filtered changelog cache. In this case, 'index' buffer of unfiltered changelog is also referred by filtered changelog. At failure of transaction, unfiltered changelog itself is invalidated (= un-referred) on the 'repo' side (see 0a7610758c42 also). But 'index' of it still contains revisions to be rollbacked at this failure, and is referred by filtered changelog. Therefore, even if there is no change between unfiltered 'repo.changelog' at last caching and now, steps below makes rollbacked revisions visible via filtered changelog unintentionally. 1. instantiate unfiltered changelog as 'repo.changelog' (call it CL1) 2. make filtered (= shallow copy of) CL1 (call it FCL1) 3. cache FCL1 with "the key" of CL1 4. revisions are appended to 'index', which is shared by CL1 and FCL1 5. invalidate 'repo.changelog' (= CL1) at failure of transaction 6. instantiate 'repo.changelog' again at next operation (call it CL2) CL2 doesn't have revisions added at (4), because it is instantiated from '00changelog.i', which isn't changed while failed transaction. 7. compare between "the key" of CL1 and CL2 8. FCL1 cached at (3) is reused, because comparison at (7) doesn't detect change between CL1 at (1) and CL2 9. revisions rollbacked at (5) are visible via FCL1 unintentionally, because FCL1 still refers 'index' changed at (4) The root cause of this issue is that there is no examination about validity of filtered changelog cache against current unfiltered one. This patch discards filtered changelog cache, if its 'index' object isn't shared with unfiltered one. BTW, at the time of this patch, redundant truncation of '00changelog.i' at failure of transaction (see 0a7610758c42 for detail) often prevents "hg serve" from making already rollbacked revisions visible, because updating timestamps of '00changelog.i' by truncation makes "hg serve" discard old repoview object with invalid filtered changelog cache. This is reason why this issue is overlooked before this patch, even though test-bundle2-exchange.t has tests in similar situation: failure of "hg push" via HTTP by pretxnclose hook on server side doesn't prevent subsequent commands from looking up outgoing revisions correctly. But timestamp on the filesystem doesn't have enough resolution for recent computation power, and it can't be assumed that this avoidance always works as expected. Therefore, without this patch, this issue might appear occasionally.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22046
7a9cbb315d84 tests: replace exit 80 with #require
Matt Mackall <mpm@selenic.com>
parents: 18589
diff changeset
     1
#require serve
15446
c5c9ca3719f9 tests: use 'hghave serve' to guard tests that requires serve daemon management
Mads Kiilerich <mads@kiilerich.com>
parents: 15004
diff changeset
     2
12441
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
     3
Test raw style of hgweb
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
     4
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
     5
  $ hg init test
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
     6
  $ cd test
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
     7
  $ mkdir sub
16973
3d71807c3a48 tests: use a different evil name in test-hgweb-raw.t
Mads Kiilerich <mads@kiilerich.com>
parents: 16913
diff changeset
     8
  $ cat >'sub/some text%.txt' <<ENDSOME
12441
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
     9
  > This is just some random text
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    10
  > that will go inside the file and take a few lines.
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    11
  > It is very boring to read, but computers don't
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    12
  > care about things like that.
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    13
  > ENDSOME
16973
3d71807c3a48 tests: use a different evil name in test-hgweb-raw.t
Mads Kiilerich <mads@kiilerich.com>
parents: 16913
diff changeset
    14
  $ hg add 'sub/some text%.txt'
12441
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    15
  $ hg commit -d "1 0" -m "Just some text"
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    16
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    17
  $ hg serve -p $HGPORT -A access.log -E error.log -d --pid-file=hg.pid
2532
84655f721f39 Add a test for getting raw files via the web UI.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    18
12441
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    19
  $ cat hg.pid >> $DAEMON_PIDS
25472
4d2b9b304ad0 tests: drop explicit $TESTDIR from executables
Matt Mackall <mpm@selenic.com>
parents: 22046
diff changeset
    20
  $ (get-with-headers.py localhost:$HGPORT '?f=bf0ff59095c9;file=sub/some%20text%25.txt;style=raw' content-type content-length content-disposition) >getoutput.txt
16298
0eefd118f27e tests: fix shutdown race in test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 15446
diff changeset
    21
25472
4d2b9b304ad0 tests: drop explicit $TESTDIR from executables
Matt Mackall <mpm@selenic.com>
parents: 22046
diff changeset
    22
  $ killdaemons.py hg.pid
16298
0eefd118f27e tests: fix shutdown race in test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 15446
diff changeset
    23
12441
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    24
  $ cat getoutput.txt
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    25
  200 Script output follows
15004
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    26
  content-type: application/binary
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    27
  content-length: 157
16973
3d71807c3a48 tests: use a different evil name in test-hgweb-raw.t
Mads Kiilerich <mads@kiilerich.com>
parents: 16913
diff changeset
    28
  content-disposition: inline; filename="some text%.txt"
15004
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    29
  
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    30
  This is just some random text
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    31
  that will go inside the file and take a few lines.
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    32
  It is very boring to read, but computers don't
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    33
  care about things like that.
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    34
  $ cat access.log error.log
16973
3d71807c3a48 tests: use a different evil name in test-hgweb-raw.t
Mads Kiilerich <mads@kiilerich.com>
parents: 16913
diff changeset
    35
  127.0.0.1 - - [*] "GET /?f=bf0ff59095c9;file=sub/some%20text%25.txt;style=raw HTTP/1.1" 200 - (glob)
15004
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    36
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    37
  $ rm access.log error.log
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    38
  $ hg serve -p $HGPORT -A access.log -E error.log -d --pid-file=hg.pid \
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    39
  > --config web.guessmime=True
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    40
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    41
  $ cat hg.pid >> $DAEMON_PIDS
25472
4d2b9b304ad0 tests: drop explicit $TESTDIR from executables
Matt Mackall <mpm@selenic.com>
parents: 22046
diff changeset
    42
  $ (get-with-headers.py localhost:$HGPORT '?f=bf0ff59095c9;file=sub/some%20text%25.txt;style=raw' content-type content-length content-disposition) >getoutput.txt
4d2b9b304ad0 tests: drop explicit $TESTDIR from executables
Matt Mackall <mpm@selenic.com>
parents: 22046
diff changeset
    43
  $ killdaemons.py hg.pid
16298
0eefd118f27e tests: fix shutdown race in test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 15446
diff changeset
    44
15004
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    45
  $ cat getoutput.txt
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 13962
diff changeset
    46
  200 Script output follows
12441
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    47
  content-type: text/plain; charset="ascii"
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    48
  content-length: 157
16973
3d71807c3a48 tests: use a different evil name in test-hgweb-raw.t
Mads Kiilerich <mads@kiilerich.com>
parents: 16913
diff changeset
    49
  content-disposition: inline; filename="some text%.txt"
12441
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    50
  
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    51
  This is just some random text
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    52
  that will go inside the file and take a few lines.
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    53
  It is very boring to read, but computers don't
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    54
  care about things like that.
cb1e33a41d13 tests: unify test-hgweb-raw
Matt Mackall <mpm@selenic.com>
parents: 11617
diff changeset
    55
  $ cat access.log error.log
16973
3d71807c3a48 tests: use a different evil name in test-hgweb-raw.t
Mads Kiilerich <mads@kiilerich.com>
parents: 16913
diff changeset
    56
  127.0.0.1 - - [*] "GET /?f=bf0ff59095c9;file=sub/some%20text%25.txt;style=raw HTTP/1.1" 200 - (glob)
2532
84655f721f39 Add a test for getting raw files via the web UI.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    57
16913
f2719b387380 tests: add missing trailing 'cd ..'
Mads Kiilerich <mads@kiilerich.com>
parents: 16496
diff changeset
    58
  $ cd ..