hgext/largefiles/storefactory.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 01 Sep 2022 15:49:14 +0200
branchstable
changeset 49469 b5c8524827d2
parent 48875 6000f5b25c9b
child 49733 8d0a220caee5
permissions -rw-r--r--
dirstate-v2: no longer register the data-file during transaction If the data file change during the transaction, we cannot truncate it. The content of the file itself is fine as it will get backed up at the same time as the docket. Leaving the trailing data at the end of failed transaction is fine. The dirstate-v2 format supports it. The dead data will simply we written over if necessary.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     1
# This software may be used and distributed according to the terms of the
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     2
# GNU General Public License version 2 or any later version.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     3
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     4
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     5
import re
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     6
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     7
from mercurial.i18n import _
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
     8
from mercurial.pycompat import getattr
29305
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
     9
from mercurial import (
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    10
    error,
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    11
    hg,
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    12
    util,
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    13
)
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43089
diff changeset
    14
from mercurial.utils import (
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43089
diff changeset
    15
    urlutil,
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43089
diff changeset
    16
)
19918
ae65192fd6b4 largefiles: refactor basestore, extract _gethash method
Mads Kiilerich <madski@unity3d.com>
parents: 19008
diff changeset
    17
29305
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    18
from . import (
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    19
    lfutil,
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    20
    localstore,
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    21
    wirestore,
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    22
)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    23
46947
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    24
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    25
# During clone this function is passed the src's ui object
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    26
# but it needs the dest's ui object so it can read out of
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    27
# the config file. Use repo.ui instead.
35564
cf841f2b5a72 largefiles: add support for 'largefiles://' url scheme
Boris Feld <boris.feld@octobus.net>
parents: 29355
diff changeset
    28
def openstore(repo=None, remote=None, put=False, ui=None):
cf841f2b5a72 largefiles: add support for 'largefiles://' url scheme
Boris Feld <boris.feld@octobus.net>
parents: 29355
diff changeset
    29
    if ui is None:
cf841f2b5a72 largefiles: add support for 'largefiles://' url scheme
Boris Feld <boris.feld@octobus.net>
parents: 29355
diff changeset
    30
        ui = repo.ui
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    31
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    32
    if not remote:
15943
f9efb325ea32 largefiles: fix caching largefiles from an aliased repo (issue3212)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15319
diff changeset
    33
        lfpullsource = getattr(repo, 'lfpullsource', None)
46947
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    34
        if put:
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    35
            path = urlutil.get_unique_push_path(
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    36
                b'lfpullsource', repo, ui, lfpullsource
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    37
            )
15943
f9efb325ea32 largefiles: fix caching largefiles from an aliased repo (issue3212)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15319
diff changeset
    38
        else:
46947
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    39
            path, _branches = urlutil.get_unique_pull_path(
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    40
                b'lfpullsource', repo, ui, lfpullsource
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    41
            )
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15169
diff changeset
    42
46947
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    43
        # XXX we should not explicitly pass b'default', as this will result in
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    44
        # b'default' being returned if no `paths.default` was defined. We
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    45
        # should explicitely handle the lack of value instead.
35564
cf841f2b5a72 largefiles: add support for 'largefiles://' url scheme
Boris Feld <boris.feld@octobus.net>
parents: 29355
diff changeset
    46
        if repo is None:
46947
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    47
            path, _branches = urlutil.get_unique_pull_path(
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    48
                b'lfs', repo, ui, b'default'
3f29765e0d95 lfs: use the new APIs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46908
diff changeset
    49
            )
35564
cf841f2b5a72 largefiles: add support for 'largefiles://' url scheme
Boris Feld <boris.feld@octobus.net>
parents: 29355
diff changeset
    50
            remote = hg.peer(repo or ui, {}, path)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    51
        elif path == b'default-push' or path == b'default':
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    52
            remote = repo
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    53
        else:
46908
4452cb788404 urlutil: extract `parseurl` from `hg` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
    54
            path, _branches = urlutil.parseurl(path)
35564
cf841f2b5a72 largefiles: add support for 'largefiles://' url scheme
Boris Feld <boris.feld@octobus.net>
parents: 29355
diff changeset
    55
            remote = hg.peer(repo or ui, {}, path)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    56
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    57
    # The path could be a scheme so use Mercurial's normal functionality
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    58
    # to resolve the scheme to a repository and use its path
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    59
    path = util.safehasattr(remote, b'url') and remote.url() or remote.path
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    60
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    61
    match = _scheme_re.match(path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
    62
    if not match:  # regular filesystem path
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    63
        scheme = b'file'
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    64
    else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    65
        scheme = match.group(1)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    66
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    67
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    68
        storeproviders = _storeprovider[scheme]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    69
    except KeyError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    70
        raise error.Abort(_(b'unsupported URL scheme %r') % scheme)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    71
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16154
diff changeset
    72
    for classobj in storeproviders:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    73
        try:
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16154
diff changeset
    74
            return classobj(ui, repo, remote)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    75
        except lfutil.storeprotonotcapable:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    76
            pass
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    77
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
    78
    raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    79
        _(b'%s does not appear to be a largefile store')
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43089
diff changeset
    80
        % urlutil.hidepassword(path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
    81
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
    82
29305
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    83
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    84
_storeprovider = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    85
    b'file': [localstore.localstore],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    86
    b'http': [wirestore.wirestore],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    87
    b'https': [wirestore.wirestore],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    88
    b'ssh': [wirestore.wirestore],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
    89
}
29305
814076f4ace3 largefiles: move basestore._openstore into new module to remove cycle
liscju <piotr.listkiewicz@gmail.com>
parents: 29067
diff changeset
    90
36310
ea62c2df882d largefiles: make scheme regex a bytes regex
Augie Fackler <augie@google.com>
parents: 35564
diff changeset
    91
_scheme_re = re.compile(br'^([a-zA-Z0-9+-.]+)://')
35564
cf841f2b5a72 largefiles: add support for 'largefiles://' url scheme
Boris Feld <boris.feld@octobus.net>
parents: 29355
diff changeset
    92
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
    93
35564
cf841f2b5a72 largefiles: add support for 'largefiles://' url scheme
Boris Feld <boris.feld@octobus.net>
parents: 29355
diff changeset
    94
def getlfile(ui, hash):
cf841f2b5a72 largefiles: add support for 'largefiles://' url scheme
Boris Feld <boris.feld@octobus.net>
parents: 29355
diff changeset
    95
    return util.chunkbuffer(openstore(ui=ui)._get(hash))