Mercurial > hg
view tests/test-commit-multiple.t @ 37153:f51c2780db3a
test-lfs-test-server: add a testcase for `hg serve`
I haven't figured out yet how to make the authentication checks work for a
specific list of users, so the 'web.allow-push' list is wildcarded. (It appears
that the client doesn't react to a 401 by sending authentication data, which may
be caused in part by not having all of the headers in httpbasicauthhandler's
http_error_auth_reqed(), compared to a run of test-http.t. But in any case, we
should probably have a separate set of tests for various authentication
scenarios. As it is, without the wildcard, no push access is granted.)
There are several deviations from the `lfs-test-server` case:
- `hg serve` emits a Server header. I think Gregory indicated that this isn't
easily suppressed.
- `hg serve` names the "basic" transfer handler in the Batch API response. Not
having to specify it was for backwards compatability, so this seems like the
right thing to do. (`lfs-test-server` doesn't name it, whether it was
explicitly requested by the client or not.)
- PUT status for a newly created file is 201, per RFC-2616 [1]. The Basic
Transfer API [2] shows an example upload transcript with a 200 response. It
doesn't make much sense to re-upload a file (unless it is corrupt) in an
example, but I wouldn't be surprised if some other implementations also
expect 200 because of this. But the RFC says MUST use 201 for creation.
- The Content-Type for the file transfers is "application/octet-stream", like
the sample transcript (though I don't see it explicitly called out in the
text elsewhere). Using "text/plain" seems clearly wrong.
- `lfs-test-server` isn't removing the action property and sending back an
error code like the spec calls out when a file is missing or corrupt. Doing
so on the `hg serve` side reveals a bug in our client code when handling the
response- it indicates the remote file is missing instead of corrupt around
line 452.
I'll probably glob over the Content-Length differences once this settles down.
Prior to the recent hgweb refactoring, the Batch API response was using chunked
encodings instead.
Back to the RFC, I have no idea if the python framework handles the "MUST NOT
ignore any Content-* (e.g. Content-Range) headers that it does not understand or
implement and MUST return a 501" for a PUT request.
[1] https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6
[2] https://github.com/git-lfs/git-lfs/blob/master/docs/api/basic-transfers.md#uploads
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Sat, 17 Mar 2018 02:37:46 -0400 |
parents | e2c0c0884b1f |
children | 5abc47d4ca6b |
line wrap: on
line source
# reproduce issue2264, issue2516 create test repo $ cat <<EOF >> $HGRCPATH > [extensions] > transplant = > EOF $ hg init repo $ cd repo $ template="{rev} {desc|firstline} [{branch}]\n" # we need to start out with two changesets on the default branch # in order to avoid the cute little optimization where transplant # pulls rather than transplants add initial changesets $ echo feature1 > file1 $ hg ci -Am"feature 1" adding file1 $ echo feature2 >> file2 $ hg ci -Am"feature 2" adding file2 # The changes to 'bugfix' are enough to show the bug: in fact, with only # those changes, it's a very noisy crash ("RuntimeError: nothing # committed after transplant"). But if we modify a second file in the # transplanted changesets, the bug is much more subtle: transplant # silently drops the second change to 'bugfix' on the floor, and we only # see it when we run 'hg status' after transplanting. Subtle data loss # bugs are worse than crashes, so reproduce the subtle case here. commit bug fixes on bug fix branch $ hg branch fixes marked working directory as branch fixes (branches are permanent and global, did you want a bookmark?) $ echo fix1 > bugfix $ echo fix1 >> file1 $ hg ci -Am"fix 1" adding bugfix $ echo fix2 > bugfix $ echo fix2 >> file1 $ hg ci -Am"fix 2" $ hg log -G --template="$template" @ 3 fix 2 [fixes] | o 2 fix 1 [fixes] | o 1 feature 2 [default] | o 0 feature 1 [default] transplant bug fixes onto release branch $ hg update 0 1 files updated, 0 files merged, 2 files removed, 0 files unresolved $ hg branch release marked working directory as branch release $ hg transplant 2 3 applying [0-9a-f]{12} (re) [0-9a-f]{12} transplanted to [0-9a-f]{12} (re) applying [0-9a-f]{12} (re) [0-9a-f]{12} transplanted to [0-9a-f]{12} (re) $ hg log -G --template="$template" @ 5 fix 2 [release] | o 4 fix 1 [release] | | o 3 fix 2 [fixes] | | | o 2 fix 1 [fixes] | | | o 1 feature 2 [default] |/ o 0 feature 1 [default] $ hg status $ hg status --rev 0:4 M file1 A bugfix $ hg status --rev 4:5 M bugfix M file1 now test that we fixed the bug for all scripts/extensions $ cat > $TESTTMP/committwice.py <<__EOF__ > from mercurial import ui, hg, match, node > from time import sleep > > def replacebyte(fn, b): > f = open(fn, "rb+") > f.seek(0, 0) > f.write(b) > f.close() > > def printfiles(repo, rev): > repo.ui.status(b"revision %d files: [%s]\n" > % (rev, b', '.join(b"'%s'" % f > for f in repo[rev].files()))) > > repo = hg.repository(ui.ui.load(), b'.') > assert len(repo) == 6, \ > "initial: len(repo): %d, expected: 6" % len(repo) > > replacebyte(b"bugfix", b"u") > sleep(2) > try: > repo.ui.status(b"PRE: len(repo): %d\n" % len(repo)) > wlock = repo.wlock() > lock = repo.lock() > replacebyte(b"file1", b"x") > repo.commit(text=b"x", user=b"test", date=(0, 0)) > replacebyte(b"file1", b"y") > repo.commit(text=b"y", user=b"test", date=(0, 0)) > repo.ui.status(b"POST: len(repo): %d\n" % len(repo)) > finally: > lock.release() > wlock.release() > printfiles(repo, 6) > printfiles(repo, 7) > __EOF__ $ $PYTHON $TESTTMP/committwice.py PRE: len(repo): 6 POST: len(repo): 8 revision 6 files: ['bugfix', 'file1'] revision 7 files: ['file1'] Do a size-preserving modification outside of that process $ echo abcd > bugfix $ hg status M bugfix $ hg log --template "{rev} {desc} {files}\n" -r5: 5 fix 2 bugfix file1 6 x bugfix file1 7 y file1 $ cd ..