hgext/largefiles/wirestore.py
author Martin von Zweigbergk <martinvonz@google.com>
Tue, 28 Oct 2014 22:47:22 -0700
changeset 25233 9789b4a7c595
parent 19008 9d33d6e0d442
child 28439 b6e71f8af5b8
permissions -rw-r--r--
match: introduce boolean prefix() method tl;dr: This is another step towards a (previously unstated) goal of eliminating match.files() in conditions. There are four types of matchers: * always: Matches everything, checked with always(), files() is empty * exact: Matches exact set of files, checked with isexact(), files() contains the files to match * patterns: Matches more complex patterns, checked with anypats(), files() contains roots of the matched patterns * prefix: Matches simple 'path:' patterns as prefixes ('foo' matches both 'foo' and 'foo/bar'), no single method to check, files() contains the prefixes to match For completeness, it would be nice to have a method for checking for the "prefix" type of matcher as well, so let's add that, making it return True simply when none of the others do. The larger goal here is to eliminate uses of match.files() in conditions (i.e. bool(match.files())). The reason for this is that there are scenarios when you would like to create a "prefix" matcher that happens to match no files. One example is for 'hg files -I foo bar'. The narrowmatcher also restricts the set of files given and it would not surprise me if have bugs caused by that already. Note that 'if m.files() and not m.anypats()' and similar is sometimes used to catch the "exact" and "prefix" cases above.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     1
# Copyright 2010-2011 Fog Creek Software
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     2
#
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     3
# This software may be used and distributed according to the terms of the
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     4
# GNU General Public License version 2 or any later version.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     5
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15168
diff changeset
     6
'''largefile store working over Mercurial's wire protocol'''
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     7
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     8
import lfutil
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     9
import remotestore
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    10
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    11
class wirestore(remotestore.remotestore):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    12
    def __init__(self, ui, repo, remote):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    13
        cap = remote.capable('largefiles')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    14
        if not cap:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    15
            raise lfutil.storeprotonotcapable([])
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    16
        storetypes = cap.split(',')
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 15252
diff changeset
    17
        if 'serve' not in storetypes:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    18
            raise lfutil.storeprotonotcapable(storetypes)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    19
        self.remote = remote
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    20
        super(wirestore, self).__init__(ui, repo, remote.url())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    21
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    22
    def _put(self, hash, fd):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    23
        return self.remote.putlfile(hash, fd)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    24
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    25
    def _get(self, hash):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    26
        return self.remote.getlfile(hash)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    27
17127
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16686
diff changeset
    28
    def _stat(self, hashes):
19008
9d33d6e0d442 largefiles: stat all largefiles in one batch before downloading
Mads Kiilerich <madski@unity3d.com>
parents: 18481
diff changeset
    29
        '''For each hash, return 0 if it is available, other values if not.
9d33d6e0d442 largefiles: stat all largefiles in one batch before downloading
Mads Kiilerich <madski@unity3d.com>
parents: 18481
diff changeset
    30
        It is usually 2 if the largefile is missing, but might be 1 the server
9d33d6e0d442 largefiles: stat all largefiles in one batch before downloading
Mads Kiilerich <madski@unity3d.com>
parents: 18481
diff changeset
    31
        has a corrupted copy.'''
17127
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16686
diff changeset
    32
        batch = self.remote.batch()
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16686
diff changeset
    33
        futures = {}
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16686
diff changeset
    34
        for hash in hashes:
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16686
diff changeset
    35
            futures[hash] = batch.statlfile(hash)
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16686
diff changeset
    36
        batch.submit()
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16686
diff changeset
    37
        retval = {}
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16686
diff changeset
    38
        for hash in hashes:
18481
ed647c59753b largefiles: let wirestore._stat return stats as expected by remotestore verify
Mads Kiilerich <madski@unity3d.com>
parents: 17127
diff changeset
    39
            retval[hash] = futures[hash].value
17127
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16686
diff changeset
    40
        return retval