view tests/test-revlog-ancestry.py @ 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 5a029f049854
children b14fdf1fb615
line wrap: on
line source

from __future__ import absolute_import, print_function
import os
from mercurial import (
    hg,
    merge,
    ui as uimod,
)

u = uimod.ui.load()

repo = hg.repository(u, b'test1', create=1)
os.chdir('test1')

def commit(text, time):
    repo.commit(text=text, date=b"%d 0" % time)

def addcommit(name, time):
    f = open(name, 'wb')
    f.write(b'%s\n' % name)
    f.close()
    repo[None].add([name])
    commit(name, time)

def update(rev):
    merge.update(repo, rev, False, True)

def merge_(rev):
    merge.update(repo, rev, True, False)

if __name__ == '__main__':
    addcommit(b"A", 0)
    addcommit(b"B", 1)

    update(0)
    addcommit(b"C", 2)

    merge_(1)
    commit(b"D", 3)

    update(2)
    addcommit(b"E", 4)
    addcommit(b"F", 5)

    update(3)
    addcommit(b"G", 6)

    merge_(5)
    commit(b"H", 7)

    update(5)
    addcommit(b"I", 8)

    # Ancestors
    print('Ancestors of 5')
    for r in repo.changelog.ancestors([5]):
        print(r, end=' ')

    print('\nAncestors of 6 and 5')
    for r in repo.changelog.ancestors([6, 5]):
        print(r, end=' ')

    print('\nAncestors of 5 and 4')
    for r in repo.changelog.ancestors([5, 4]):
        print(r, end=' ')

    print('\nAncestors of 7, stop at 6')
    for r in repo.changelog.ancestors([7], 6):
        print(r, end=' ')

    print('\nAncestors of 7, including revs')
    for r in repo.changelog.ancestors([7], inclusive=True):
        print(r, end=' ')

    print('\nAncestors of 7, 5 and 3, including revs')
    for r in repo.changelog.ancestors([7, 5, 3], inclusive=True):
        print(r, end=' ')

    # Descendants
    print('\n\nDescendants of 5')
    for r in repo.changelog.descendants([5]):
        print(r, end=' ')

    print('\nDescendants of 5 and 3')
    for r in repo.changelog.descendants([5, 3]):
        print(r, end=' ')

    print('\nDescendants of 5 and 4')
    print(*repo.changelog.descendants([5, 4]), sep=' ')