hgext/largefiles/lfutil.py
author Pulkit Goyal <7895pulkit@gmail.com>
Wed, 10 Feb 2021 17:08:34 +0530
changeset 46526 67b5fafd3a46
parent 46113 59fa3890d40a
child 46780 6266d19556ad
permissions -rw-r--r--
upgrade: speed up when we have only nodemap to downgrade Similar to what we do on upgrade, if we have only persistent-nodemap to downgrade we will just delete the nodemap files and update repository requirements instead of processing all the revlogs. After downgrade, we are left with unrequired docket and transaction files which seems fine but can work on deleting them if someone feels we should. Differential Revision: https://phab.mercurial-scm.org/D9992
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     1
# Copyright 2009-2010 Gregory P. Ward
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     2
# Copyright 2009-2010 Intelerad Medical Systems Incorporated
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     3
# Copyright 2010-2011 Fog Creek Software
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     4
# Copyright 2010-2011 Unity Technologies
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     5
#
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     8
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     9
'''largefiles utility code: must not import other modules in this package.'''
29309
bfc1052570b6 py3: make largefiles/lfutil.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 28877
diff changeset
    10
from __future__ import absolute_import
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    11
43583
73e6d3346e4f largefiles: move lfstatus context manager to lfutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
    12
import contextlib
29309
bfc1052570b6 py3: make largefiles/lfutil.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 28877
diff changeset
    13
import copy
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    14
import os
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    15
import stat
29309
bfc1052570b6 py3: make largefiles/lfutil.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 28877
diff changeset
    16
bfc1052570b6 py3: make largefiles/lfutil.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 28877
diff changeset
    17
from mercurial.i18n import _
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    18
from mercurial.node import (
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    19
    hex,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    20
    nullid,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    21
)
43085
eef9a2d67051 py3: manually import pycompat.open into files that need it
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    22
from mercurial.pycompat import open
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    23
29309
bfc1052570b6 py3: make largefiles/lfutil.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 28877
diff changeset
    24
from mercurial import (
bfc1052570b6 py3: make largefiles/lfutil.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 28877
diff changeset
    25
    dirstate,
30820
6a70cf94d1b5 py3: replace pycompat.getenv with encoding.environ.get
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30664
diff changeset
    26
    encoding,
29309
bfc1052570b6 py3: make largefiles/lfutil.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 28877
diff changeset
    27
    error,
bfc1052570b6 py3: make largefiles/lfutil.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 28877
diff changeset
    28
    httpconnection,
29320
016a90152e9c largefiles: rename match_ to matchmod import in lfutil
liscju <piotr.listkiewicz@gmail.com>
parents: 29309
diff changeset
    29
    match as matchmod,
30640
7a3e67bfa417 py3: replace os.name with pycompat.osname (part 2 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30181
diff changeset
    30
    pycompat,
29309
bfc1052570b6 py3: make largefiles/lfutil.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 28877
diff changeset
    31
    scmutil,
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32309
diff changeset
    32
    sparse,
29309
bfc1052570b6 py3: make largefiles/lfutil.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 28877
diff changeset
    33
    util,
31247
04b4286278ec vfs: use 'vfs' module directly in 'hgext.largefile'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31216
diff changeset
    34
    vfs as vfsmod,
29309
bfc1052570b6 py3: make largefiles/lfutil.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 28877
diff changeset
    35
)
44062
2d49482d0dd4 hgext: replace references to hashlib.sha1 with hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43584
diff changeset
    36
from mercurial.utils import hashutil
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    37
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    38
shortname = b'.hglf'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    39
shortnameslash = shortname + b'/'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    40
longname = b'largefiles'
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    41
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    42
# -- Private worker functions ------------------------------------------
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    43
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    44
43583
73e6d3346e4f largefiles: move lfstatus context manager to lfutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
    45
@contextlib.contextmanager
43584
a02e4c12ae60 largefiles: allow "lfstatus" context manager to set value to False
Martin von Zweigbergk <martinvonz@google.com>
parents: 43583
diff changeset
    46
def lfstatus(repo, value=True):
43583
73e6d3346e4f largefiles: move lfstatus context manager to lfutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
    47
    oldvalue = getattr(repo, 'lfstatus', False)
43584
a02e4c12ae60 largefiles: allow "lfstatus" context manager to set value to False
Martin von Zweigbergk <martinvonz@google.com>
parents: 43583
diff changeset
    48
    repo.lfstatus = value
43583
73e6d3346e4f largefiles: move lfstatus context manager to lfutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
    49
    try:
73e6d3346e4f largefiles: move lfstatus context manager to lfutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
    50
        yield
73e6d3346e4f largefiles: move lfstatus context manager to lfutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
    51
    finally:
73e6d3346e4f largefiles: move lfstatus context manager to lfutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
    52
        repo.lfstatus = oldvalue
73e6d3346e4f largefiles: move lfstatus context manager to lfutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
    53
73e6d3346e4f largefiles: move lfstatus context manager to lfutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43085
diff changeset
    54
15227
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15226
diff changeset
    55
def getminsize(ui, assumelfiles, opt, default=10):
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15226
diff changeset
    56
    lfsize = opt
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15226
diff changeset
    57
    if not lfsize and assumelfiles:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    58
        lfsize = ui.config(longname, b'minsize', default=default)
15227
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15226
diff changeset
    59
    if lfsize:
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15226
diff changeset
    60
        try:
15228
ee625de3541e largefiles: allow minimum size to be a float
Greg Ward <greg@gerg.ca>
parents: 15227
diff changeset
    61
            lfsize = float(lfsize)
15227
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15226
diff changeset
    62
        except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    63
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    64
                _(b'largefiles: size must be number (not %s)\n') % lfsize
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    65
            )
15227
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15226
diff changeset
    66
    if lfsize is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    67
        raise error.Abort(_(b'minimum size for largefiles must be specified'))
15227
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15226
diff changeset
    68
    return lfsize
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15226
diff changeset
    69
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    70
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    71
def link(src, dest):
28576
33bd95443e7f largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents: 28575
diff changeset
    72
    """Try to create hardlink - if that fails, efficiently make a copy."""
18998
d035c3902111 largefiles: refactoring - create destination dir in lfutil.link
Mads Kiilerich <madski@unity3d.com>
parents: 18980
diff changeset
    73
    util.makedirs(os.path.dirname(dest))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    74
    try:
15206
f85c76b16f27 largefiles: fix commit of specified file on non-windows
Na'Tosha Bard <natosha@unity3d.com>
parents: 15188
diff changeset
    75
        util.oslink(src, dest)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    76
    except OSError:
15572
926bc23d0b6a largefiles: copy files into .hg/largefiles atomically
Martin Geisler <mg@aragost.com>
parents: 15571
diff changeset
    77
        # if hardlinks fail, fallback on atomic copy
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    78
        with open(src, b'rb') as srcf, util.atomictempfile(dest) as dstf:
33438
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33373
diff changeset
    79
            for chunk in util.filechunkiter(srcf):
8056481caa81 codemod: simplify nested withs
Jun Wu <quark@fb.com>
parents: 33373
diff changeset
    80
                dstf.write(chunk)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    81
        os.chmod(dest, os.stat(src).st_mode)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    82
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    83
15316
c65f5b6e26d4 largefiles: rename functions and methods to match desired behavior
Benjamin Pollack <benjamin@bitquabit.com>
parents: 15304
diff changeset
    84
def usercachepath(ui, hash):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
    85
    """Return the correct location in the "global" largefiles cache for a file
28574
7a4e1749cb07 largefiles: refactor usercachepath - extract user cache path function
Mads Kiilerich <madski@unity3d.com>
parents: 28560
diff changeset
    86
    with the given hash.
7a4e1749cb07 largefiles: refactor usercachepath - extract user cache path function
Mads Kiilerich <madski@unity3d.com>
parents: 28560
diff changeset
    87
    This cache is used for sharing of largefiles across repositories - both
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
    88
    to preserve download bandwidth and storage space."""
28575
78e4e558fa74 largefiles: drop partial support for not having a user cache
Mads Kiilerich <madski@unity3d.com>
parents: 28574
diff changeset
    89
    return os.path.join(_usercachedir(ui), hash)
28574
7a4e1749cb07 largefiles: refactor usercachepath - extract user cache path function
Mads Kiilerich <madski@unity3d.com>
parents: 28560
diff changeset
    90
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    91
35279
be4481d6222e largefiles: refactor _usercachedir() to allow reuse with lfs
Matt Harbison <matt_harbison@yahoo.com>
parents: 34757
diff changeset
    92
def _usercachedir(ui, name=longname):
28574
7a4e1749cb07 largefiles: refactor usercachepath - extract user cache path function
Mads Kiilerich <madski@unity3d.com>
parents: 28560
diff changeset
    93
    '''Return the location of the "global" largefiles cache.'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    94
    path = ui.configpath(name, b'usercache')
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    95
    if path:
28574
7a4e1749cb07 largefiles: refactor usercachepath - extract user cache path function
Mads Kiilerich <madski@unity3d.com>
parents: 28560
diff changeset
    96
        return path
44379
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
    97
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
    98
    hint = None
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
    99
34645
75979c8d4572 codemod: use pycompat.iswindows
Jun Wu <quark@fb.com>
parents: 34641
diff changeset
   100
    if pycompat.iswindows:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   101
        appdata = encoding.environ.get(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   102
            b'LOCALAPPDATA', encoding.environ.get(b'APPDATA')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   103
        )
28574
7a4e1749cb07 largefiles: refactor usercachepath - extract user cache path function
Mads Kiilerich <madski@unity3d.com>
parents: 28560
diff changeset
   104
        if appdata:
35279
be4481d6222e largefiles: refactor _usercachedir() to allow reuse with lfs
Matt Harbison <matt_harbison@yahoo.com>
parents: 34757
diff changeset
   105
            return os.path.join(appdata, name)
44379
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   106
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   107
        hint = _(b"define %s or %s in the environment, or set %s.usercache") % (
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   108
            b"LOCALAPPDATA",
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   109
            b"APPDATA",
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   110
            name,
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   111
        )
34647
dacfcdd8b94e codemod: use pycompat.isdarwin
Jun Wu <quark@fb.com>
parents: 34646
diff changeset
   112
    elif pycompat.isdarwin:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   113
        home = encoding.environ.get(b'HOME')
28574
7a4e1749cb07 largefiles: refactor usercachepath - extract user cache path function
Mads Kiilerich <madski@unity3d.com>
parents: 28560
diff changeset
   114
        if home:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   115
            return os.path.join(home, b'Library', b'Caches', name)
44379
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   116
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   117
        hint = _(b"define %s in the environment, or set %s.usercache") % (
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   118
            b"HOME",
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   119
            name,
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   120
        )
34646
238abf65a8ad codemod: use pycompat.isposix
Jun Wu <quark@fb.com>
parents: 34645
diff changeset
   121
    elif pycompat.isposix:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   122
        path = encoding.environ.get(b'XDG_CACHE_HOME')
28574
7a4e1749cb07 largefiles: refactor usercachepath - extract user cache path function
Mads Kiilerich <madski@unity3d.com>
parents: 28560
diff changeset
   123
        if path:
35279
be4481d6222e largefiles: refactor _usercachedir() to allow reuse with lfs
Matt Harbison <matt_harbison@yahoo.com>
parents: 34757
diff changeset
   124
            return os.path.join(path, name)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   125
        home = encoding.environ.get(b'HOME')
28574
7a4e1749cb07 largefiles: refactor usercachepath - extract user cache path function
Mads Kiilerich <madski@unity3d.com>
parents: 28560
diff changeset
   126
        if home:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   127
            return os.path.join(home, b'.cache', name)
44379
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   128
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   129
        hint = _(b"define %s or %s in the environment, or set %s.usercache") % (
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   130
            b"XDG_CACHE_HOME",
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   131
            b"HOME",
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   132
            name,
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   133
        )
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   134
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   135
        raise error.Abort(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   136
            _(b'unknown operating system: %s\n') % pycompat.osname
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   137
        )
44379
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   138
ca82929e433d lfutil: provide a hint if the largefiles/lfs cache path cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 44062
diff changeset
   139
    raise error.Abort(_(b'unknown %s usercache location') % name, hint=hint)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   140
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   141
15316
c65f5b6e26d4 largefiles: rename functions and methods to match desired behavior
Benjamin Pollack <benjamin@bitquabit.com>
parents: 15304
diff changeset
   142
def inusercache(ui, hash):
15658
971c55ce03b8 largefiles: don't require a user cache (issue3088) (issue3155)
Kevin Gessner <kevin@fogcreek.com>
parents: 15572
diff changeset
   143
    path = usercachepath(ui, hash)
28575
78e4e558fa74 largefiles: drop partial support for not having a user cache
Mads Kiilerich <madski@unity3d.com>
parents: 28574
diff changeset
   144
    return os.path.exists(path)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   145
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   146
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   147
def findfile(repo, hash):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   148
    """Return store path of the largefile with the specified hash.
28576
33bd95443e7f largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents: 28575
diff changeset
   149
    As a side effect, the file might be linked from user cache.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   150
    Return None if the file can't be found locally."""
24631
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   151
    path, exists = findstorepath(repo, hash)
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   152
    if exists:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   153
        repo.ui.note(_(b'found %s in store\n') % hash)
24631
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   154
        return path
15317
41f371150ccb largefiles: make the store primary, and the user cache secondary
Benjamin Pollack <benjamin@bitquabit.com>
parents: 15316
diff changeset
   155
    elif inusercache(repo.ui, hash):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   156
        repo.ui.note(_(b'found %s in system cache\n') % hash)
15408
db8b0ee74025 largefiles: ensure destination directory exists before findfile links to there
Hao Lian <hao@fogcreek.com>
parents: 15392
diff changeset
   157
        path = storepath(repo, hash)
db8b0ee74025 largefiles: ensure destination directory exists before findfile links to there
Hao Lian <hao@fogcreek.com>
parents: 15392
diff changeset
   158
        link(usercachepath(repo.ui, hash), path)
15913
c35dcde25174 largefiles: refactor lfutil.findfiles to be more logical
Na'Tosha Bard <natosha@unity3d.com>
parents: 15796
diff changeset
   159
        return path
c35dcde25174 largefiles: refactor lfutil.findfiles to be more logical
Na'Tosha Bard <natosha@unity3d.com>
parents: 15796
diff changeset
   160
    return None
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   161
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   162
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   163
class largefilesdirstate(dirstate.dirstate):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   164
    def __getitem__(self, key):
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   165
        return super(largefilesdirstate, self).__getitem__(unixpath(key))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   166
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   167
    def normal(self, f):
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   168
        return super(largefilesdirstate, self).normal(unixpath(f))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   169
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   170
    def remove(self, f):
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   171
        return super(largefilesdirstate, self).remove(unixpath(f))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   172
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   173
    def add(self, f):
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   174
        return super(largefilesdirstate, self).add(unixpath(f))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   175
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   176
    def drop(self, f):
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   177
        return super(largefilesdirstate, self).drop(unixpath(f))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   178
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   179
    def forget(self, f):
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   180
        return super(largefilesdirstate, self).forget(unixpath(f))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   181
15793
3ef07ecdb0d5 largefiles: correctly handle dirstate status when rebasing
Na'Tosha Bard <natosha@unity3d.com>
parents: 15700
diff changeset
   182
    def normallookup(self, f):
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   183
        return super(largefilesdirstate, self).normallookup(unixpath(f))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   184
21085
66c6da0bc7e2 largefiles: fix profile of unused largefilesdirstate._ignore
Mads Kiilerich <madski@unity3d.com>
parents: 21042
diff changeset
   185
    def _ignore(self, f):
18148
bf6252d12c34 largefiles: simplify lfdirstate ignore handling - it is only for tracking .hglf
Mads Kiilerich <madski@unity3d.com>
parents: 18147
diff changeset
   186
        return False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   187
26749
4a82cb5c1dc8 dirstate: show develwarn for write() invocation without transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26627
diff changeset
   188
    def write(self, tr=False):
4a82cb5c1dc8 dirstate: show develwarn for write() invocation without transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26627
diff changeset
   189
        # (1) disable PENDING mode always
4a82cb5c1dc8 dirstate: show develwarn for write() invocation without transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26627
diff changeset
   190
        #     (lfdirstate isn't yet managed as a part of the transaction)
4a82cb5c1dc8 dirstate: show develwarn for write() invocation without transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26627
diff changeset
   191
        # (2) avoid develwarn 'use dirstate.write with ....'
4a82cb5c1dc8 dirstate: show develwarn for write() invocation without transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26627
diff changeset
   192
        super(largefilesdirstate, self).write(None)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   193
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   194
17659
ae57920ac188 largefiles: enable islfilesrepo() prior to a commit (issue3541)
Matt Harbison <matt_harbison@yahoo.com>
parents: 17270
diff changeset
   195
def openlfdirstate(ui, repo, create=True):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   196
    """
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
   197
    Return a dirstate object that tracks largefiles: i.e. its root is
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
   198
    the repo root, but it is saved in .hg/largefiles/dirstate.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   199
    """
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   200
    vfs = repo.vfs
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   201
    lfstoredir = longname
31247
04b4286278ec vfs: use 'vfs' module directly in 'hgext.largefile'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31216
diff changeset
   202
    opener = vfsmod.vfs(vfs.join(lfstoredir))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   203
    lfdirstate = largefilesdirstate(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   204
        opener,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   205
        ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   206
        repo.root,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   207
        repo.dirstate._validate,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   208
        lambda: sparse.matcher(repo),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   209
    )
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   210
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
   211
    # If the largefiles dirstate does not exist, populate and create
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
   212
    # it. This ensures that we create it on the first meaningful
15794
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15793
diff changeset
   213
    # largefiles operation in a new clone.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   214
    if create and not vfs.exists(vfs.join(lfstoredir, b'dirstate')):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   215
        matcher = getstandinmatcher(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   216
        standins = repo.dirstate.walk(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   217
            matcher, subrepos=[], unknown=False, ignored=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   218
        )
21917
ac3b3a2d976d largefiles: avoid unnecessary creation of .hg/largefiles when opening lfdirstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 21085
diff changeset
   219
ac3b3a2d976d largefiles: avoid unnecessary creation of .hg/largefiles when opening lfdirstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 21085
diff changeset
   220
        if len(standins) > 0:
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   221
            vfs.makedirs(lfstoredir)
21917
ac3b3a2d976d largefiles: avoid unnecessary creation of .hg/largefiles when opening lfdirstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 21085
diff changeset
   222
ac3b3a2d976d largefiles: avoid unnecessary creation of .hg/largefiles when opening lfdirstate
Matt Harbison <matt_harbison@yahoo.com>
parents: 21085
diff changeset
   223
        for standin in standins:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   224
            lfile = splitstandin(standin)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   225
            lfdirstate.normallookup(lfile)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   226
    return lfdirstate
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   227
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   228
23039
1350b9170089 largefiles: remove confusing rev parameter for lfdirstatestatus
Mads Kiilerich <madski@unity3d.com>
parents: 22919
diff changeset
   229
def lfdirstatestatus(lfdirstate, repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   230
    pctx = repo[b'.']
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41397
diff changeset
   231
    match = matchmod.always()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   232
    unsure, s = lfdirstate.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   233
        match, subrepos=[], ignored=False, clean=False, unknown=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   234
    )
22919
1982bdb7e2cc largefiles: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22912
diff changeset
   235
    modified, clean = s.modified, s.clean
15794
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15793
diff changeset
   236
    for lfile in unsure:
18299
a7a88a458a4c largefiles: fix revert removing a largefile from a merge
Mads Kiilerich <madski@unity3d.com>
parents: 18154
diff changeset
   237
        try:
31657
641f3a6098d0 largefiles: rename local variable appropriately
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31652
diff changeset
   238
            fctx = pctx[standin(lfile)]
18299
a7a88a458a4c largefiles: fix revert removing a largefile from a merge
Mads Kiilerich <madski@unity3d.com>
parents: 18154
diff changeset
   239
        except LookupError:
a7a88a458a4c largefiles: fix revert removing a largefile from a merge
Mads Kiilerich <madski@unity3d.com>
parents: 18154
diff changeset
   240
            fctx = None
31740
a40e979b9d97 largefiles: use readasstandin() to read hex hash directly from filectx
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31739
diff changeset
   241
        if not fctx or readasstandin(fctx) != hashfile(repo.wjoin(lfile)):
15794
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15793
diff changeset
   242
            modified.append(lfile)
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15793
diff changeset
   243
        else:
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15793
diff changeset
   244
            clean.append(lfile)
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15793
diff changeset
   245
            lfdirstate.normal(lfile)
22912
3b8e6c095239 lfutil: avoid creating unnecessary copy of status tuple
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22911
diff changeset
   246
    return s
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   247
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   248
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   249
def listlfiles(repo, rev=None, matcher=None):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   250
    """return a list of largefiles in the working copy or the
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   251
    specified changeset"""
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   252
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   253
    if matcher is None:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   254
        matcher = getstandinmatcher(repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   255
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   256
    # ignore unknown files in working directory
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   257
    return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   258
        splitstandin(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   259
        for f in repo[rev].walk(matcher)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   260
        if rev is not None or repo.dirstate[f] != b'?'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   261
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   262
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   263
24631
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   264
def instore(repo, hash, forcelocal=False):
29419
01c0324acfec largefiles: fix misleading comments in lfutil instore and storepath
liscju <piotr.listkiewicz@gmail.com>
parents: 29349
diff changeset
   265
    '''Return true if a largefile with the given hash exists in the store'''
24631
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   266
    return os.path.exists(storepath(repo, hash, forcelocal))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   267
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   268
24631
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   269
def storepath(repo, hash, forcelocal=False):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   270
    """Return the correct location in the repository largefiles store for a
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   271
    file with the given hash."""
24631
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   272
    if not forcelocal and repo.shared():
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   273
        return repo.vfs.reljoin(repo.sharedpath, longname, hash)
31332
a5ae1d79e271 largefiles: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31247
diff changeset
   274
    return repo.vfs.join(longname, hash)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   275
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   276
24629
8dc2533f03ef largefiles: introduce lfutil.findstorepath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24627
diff changeset
   277
def findstorepath(repo, hash):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   278
    """Search through the local store path(s) to find the file for the given
24629
8dc2533f03ef largefiles: introduce lfutil.findstorepath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24627
diff changeset
   279
    hash.  If the file is not found, its path in the primary store is returned.
8dc2533f03ef largefiles: introduce lfutil.findstorepath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24627
diff changeset
   280
    The return value is a tuple of (path, exists(path)).
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   281
    """
24631
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   282
    # For shared repos, the primary store is in the share source.  But for
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   283
    # backward compatibility, force a lookup in the local store if it wasn't
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   284
    # found in the share source.
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   285
    path = storepath(repo, hash, False)
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   286
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   287
    if instore(repo, hash):
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   288
        return (path, True)
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   289
    elif repo.shared() and instore(repo, hash, True):
29329
f359cdc91e21 largefiles: fix support for local largefiles while using share extension
Henrik Stuart <henriks@unity3d.com>
parents: 28877
diff changeset
   290
        return storepath(repo, hash, True), True
24631
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   291
2a3f24786d09 largefiles: use the share source as the primary local store (issue4471)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24629
diff changeset
   292
    return (path, False)
24629
8dc2533f03ef largefiles: introduce lfutil.findstorepath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24627
diff changeset
   293
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   294
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   295
def copyfromcache(repo, hash, filename):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   296
    """Copy the specified largefile from the repo or system cache to
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
   297
    filename in the repository. Return true on success or false if the
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
   298
    file was not found in either cache (which should not happened:
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
   299
    this is meant to be called only after ensuring that the needed
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   300
    largefile exists in the cache)."""
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   301
    wvfs = repo.wvfs
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   302
    path = findfile(repo, hash)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   303
    if path is None:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   304
        return False
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   305
    wvfs.makedirs(wvfs.dirname(wvfs.join(filename)))
15570
0f208626d503 largefiles: add comment about non-atomic working directory
Martin Geisler <mg@aragost.com>
parents: 15553
diff changeset
   306
    # The write may fail before the file is fully written, but we
0f208626d503 largefiles: add comment about non-atomic working directory
Martin Geisler <mg@aragost.com>
parents: 15553
diff changeset
   307
    # don't use atomic writes in the working copy.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   308
    with open(path, b'rb') as srcfd, wvfs(filename, b'wb') as destfd:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   309
        gothash = copyandhash(util.filechunkiter(srcfd), destfd)
26823
45e8bd2f36f0 largefiles: check hash of files in the store before copying to working dir
Mads Kiilerich <madski@unity3d.com>
parents: 26817
diff changeset
   310
    if gothash != hash:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   311
        repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   312
            _(b'%s: data corruption in %s with hash %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   313
            % (filename, path, gothash)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   314
        )
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   315
        wvfs.unlink(filename)
26823
45e8bd2f36f0 largefiles: check hash of files in the store before copying to working dir
Mads Kiilerich <madski@unity3d.com>
parents: 26817
diff changeset
   316
        return False
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   317
    return True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   318
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   319
31738
068b06b43cdf largefiles: make copytostore() accept only changectx as the 2nd argument (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31737
diff changeset
   320
def copytostore(repo, ctx, file, fstandin):
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   321
    wvfs = repo.wvfs
31738
068b06b43cdf largefiles: make copytostore() accept only changectx as the 2nd argument (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31737
diff changeset
   322
    hash = readasstandin(ctx[fstandin])
15316
c65f5b6e26d4 largefiles: rename functions and methods to match desired behavior
Benjamin Pollack <benjamin@bitquabit.com>
parents: 15304
diff changeset
   323
    if instore(repo, hash):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   324
        return
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   325
    if wvfs.exists(file):
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   326
        copytostoreabsolute(repo, wvfs.join(file), hash)
27903
512a814c5595 largefiles: fix commit of missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 26823
diff changeset
   327
    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   328
        repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   329
            _(b"%s: largefile %s not available from local store\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   330
            % (file, hash)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   331
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   332
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   333
15796
3e5b6045ccfc largefiles: factor out a copyalltostore() function
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 15794
diff changeset
   334
def copyalltostore(repo, node):
3e5b6045ccfc largefiles: factor out a copyalltostore() function
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 15794
diff changeset
   335
    '''Copy all largefiles in a given revision to the store'''
3e5b6045ccfc largefiles: factor out a copyalltostore() function
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 15794
diff changeset
   336
3e5b6045ccfc largefiles: factor out a copyalltostore() function
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 15794
diff changeset
   337
    ctx = repo[node]
3e5b6045ccfc largefiles: factor out a copyalltostore() function
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 15794
diff changeset
   338
    for filename in ctx.files():
31613
5c1d3f1b8f44 largefiles: omit redundant isstandin() before splitstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31332
diff changeset
   339
        realfile = splitstandin(filename)
5c1d3f1b8f44 largefiles: omit redundant isstandin() before splitstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31332
diff changeset
   340
        if realfile is not None and filename in ctx.manifest():
31736
dd2079fae003 largefiles: add copytostore() fstandin argument to replace readstandin() (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31735
diff changeset
   341
            copytostore(repo, ctx, realfile, filename)
15796
3e5b6045ccfc largefiles: factor out a copyalltostore() function
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 15794
diff changeset
   342
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   343
15316
c65f5b6e26d4 largefiles: rename functions and methods to match desired behavior
Benjamin Pollack <benjamin@bitquabit.com>
parents: 15304
diff changeset
   344
def copytostoreabsolute(repo, file, hash):
c65f5b6e26d4 largefiles: rename functions and methods to match desired behavior
Benjamin Pollack <benjamin@bitquabit.com>
parents: 15304
diff changeset
   345
    if inusercache(repo.ui, hash):
c65f5b6e26d4 largefiles: rename functions and methods to match desired behavior
Benjamin Pollack <benjamin@bitquabit.com>
parents: 15304
diff changeset
   346
        link(usercachepath(repo.ui, hash), storepath(repo, hash))
23276
4be754832829 largefiles: move "copyalltostore" invocation into "markcommitted"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23274
diff changeset
   347
    else:
18998
d035c3902111 largefiles: refactoring - create destination dir in lfutil.link
Mads Kiilerich <madski@unity3d.com>
parents: 18980
diff changeset
   348
        util.makedirs(os.path.dirname(storepath(repo, hash)))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   349
        with open(file, b'rb') as srcf:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   350
            with util.atomictempfile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   351
                storepath(repo, hash), createmode=repo.store.createmode
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   352
            ) as dstf:
30142
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 29644
diff changeset
   353
                for chunk in util.filechunkiter(srcf):
3dcaf1c4e90d largefiles: use context for file closing
Mads Kiilerich <madski@unity3d.com>
parents: 29644
diff changeset
   354
                    dstf.write(chunk)
15316
c65f5b6e26d4 largefiles: rename functions and methods to match desired behavior
Benjamin Pollack <benjamin@bitquabit.com>
parents: 15304
diff changeset
   355
        linktousercache(repo, hash)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   356
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   357
15316
c65f5b6e26d4 largefiles: rename functions and methods to match desired behavior
Benjamin Pollack <benjamin@bitquabit.com>
parents: 15304
diff changeset
   358
def linktousercache(repo, hash):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   359
    """Link / copy the largefile with the specified hash from the store
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   360
    to the cache."""
15658
971c55ce03b8 largefiles: don't require a user cache (issue3088) (issue3155)
Kevin Gessner <kevin@fogcreek.com>
parents: 15572
diff changeset
   361
    path = usercachepath(repo.ui, hash)
28575
78e4e558fa74 largefiles: drop partial support for not having a user cache
Mads Kiilerich <madski@unity3d.com>
parents: 28574
diff changeset
   362
    link(storepath(repo, hash), path)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   363
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   364
25292
31d543cd7062 largefiles: pass in whole matcher to getstandinmatcher()
Martin von Zweigbergk <martinvonz@google.com>
parents: 25291
diff changeset
   365
def getstandinmatcher(repo, rmatcher=None):
31d543cd7062 largefiles: pass in whole matcher to getstandinmatcher()
Martin von Zweigbergk <martinvonz@google.com>
parents: 25291
diff changeset
   366
    '''Return a match object that applies rmatcher to the standin directory'''
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   367
    wvfs = repo.wvfs
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   368
    standindir = shortname
25470
378a8e700e02 largefiles: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25293
diff changeset
   369
378a8e700e02 largefiles: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25293
diff changeset
   370
    # no warnings about missing files or directories
378a8e700e02 largefiles: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25293
diff changeset
   371
    badfn = lambda f, msg: None
378a8e700e02 largefiles: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25293
diff changeset
   372
25293
ab618e52788a largefiles: avoid match.files() in conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 25292
diff changeset
   373
    if rmatcher and not rmatcher.always():
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   374
        pats = [wvfs.join(standindir, pat) for pat in rmatcher.files()]
26025
ba8089433090 largefiles: ensure lfutil.getstandinmatcher() only matches standins
Matt Harbison <matt_harbison@yahoo.com>
parents: 25470
diff changeset
   375
        if not pats:
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   376
            pats = [wvfs.join(standindir)]
25470
378a8e700e02 largefiles: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25293
diff changeset
   377
        match = scmutil.match(repo[None], pats, badfn=badfn)
18724
894a5897a9dd largefiles: getstandinmatcher should not depend on existence of directories
Mads Kiilerich <madski@unity3d.com>
parents: 18490
diff changeset
   378
    else:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   379
        # no patterns: relative to repo root
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   380
        match = scmutil.match(repo[None], [wvfs.join(standindir)], badfn=badfn)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   381
    return match
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   382
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   383
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   384
def composestandinmatcher(repo, rmatcher):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   385
    """Return a matcher that accepts standins corresponding to the
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
   386
    files accepted by rmatcher. Pass the list of files in the matcher
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   387
    as the paths specified by the user."""
25292
31d543cd7062 largefiles: pass in whole matcher to getstandinmatcher()
Martin von Zweigbergk <martinvonz@google.com>
parents: 25291
diff changeset
   388
    smatcher = getstandinmatcher(repo, rmatcher)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   389
    isstandin = smatcher.matchfn
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   390
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   391
    def composedmatchfn(f):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   392
        return isstandin(f) and rmatcher.matchfn(splitstandin(f))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   393
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   394
    smatcher.matchfn = composedmatchfn
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   395
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   396
    return smatcher
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   397
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   398
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   399
def standin(filename):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   400
    """Return the repo-relative path to the standin for the specified big
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   401
    file."""
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   402
    # Notes:
17425
e95ec38f86b0 fix wording and not-completely-trivial spelling errors and bad docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 17270
diff changeset
   403
    # 1) Some callers want an absolute path, but for instance addlargefiles
18154
93c697d9c158 largefiles: remove trivial portability wrappers
Mads Kiilerich <madski@unity3d.com>
parents: 18153
diff changeset
   404
    #    needs it repo-relative so it can be passed to repo[None].add().  So
93c697d9c158 largefiles: remove trivial portability wrappers
Mads Kiilerich <madski@unity3d.com>
parents: 18153
diff changeset
   405
    #    leave it up to the caller to use repo.wjoin() to get an absolute path.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   406
    # 2) Join with '/' because that's what dirstate always uses, even on
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   407
    #    Windows. Change existing separator to '/' first in case we are
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   408
    #    passed filenames from an external source (like the command line).
18151
90ad387d9245 largefiles: use constant for '.hglf/'
Mads Kiilerich <madski@unity3d.com>
parents: 18150
diff changeset
   409
    return shortnameslash + util.pconvert(filename)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   410
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   411
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   412
def isstandin(filename):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   413
    """Return true if filename is a big file standin. filename must be
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   414
    in Mercurial's internal form (slash-separated)."""
18151
90ad387d9245 largefiles: use constant for '.hglf/'
Mads Kiilerich <madski@unity3d.com>
parents: 18150
diff changeset
   415
    return filename.startswith(shortnameslash)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   416
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   417
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   418
def splitstandin(filename):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   419
    # Split on / because that's what dirstate always uses, even on Windows.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   420
    # Change local separator to / first just in case we are passed filenames
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   421
    # from an external source (like the command line).
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   422
    bits = util.pconvert(filename).split(b'/', 1)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   423
    if len(bits) == 2 and bits[0] == shortname:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   424
        return bits[1]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   425
    else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   426
        return None
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   427
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   428
31659
0eec36112e58 largefiles: add lfile argument to updatestandin() for efficiency (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31657
diff changeset
   429
def updatestandin(repo, lfile, standin):
0eec36112e58 largefiles: add lfile argument to updatestandin() for efficiency (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31657
diff changeset
   430
    """Re-calculate hash value of lfile and write it into standin
0eec36112e58 largefiles: add lfile argument to updatestandin() for efficiency (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31657
diff changeset
   431
0eec36112e58 largefiles: add lfile argument to updatestandin() for efficiency (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31657
diff changeset
   432
    This assumes that "lfutil.standin(lfile) == standin", for efficiency.
0eec36112e58 largefiles: add lfile argument to updatestandin() for efficiency (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31657
diff changeset
   433
    """
31615
f0f316cb8259 largefiles: omit redundant splitstandin() invocations
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31613
diff changeset
   434
    file = repo.wjoin(lfile)
f0f316cb8259 largefiles: omit redundant splitstandin() invocations
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31613
diff changeset
   435
    if repo.wvfs.exists(lfile):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   436
        hash = hashfile(file)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   437
        executable = getexecutable(file)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   438
        writestandin(repo, standin, hash, executable)
27947
571ba161f6be largefiles: prevent committing a missing largefile
Matt Harbison <matt_harbison@yahoo.com>
parents: 27942
diff changeset
   439
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   440
        raise error.Abort(_(b'%s: file not found!') % lfile)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   441
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   442
31734
44ff5e4ffc8c largefiles: introduce readasstandin() to read hex hash from given filectx
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31659
diff changeset
   443
def readasstandin(fctx):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   444
    """read hex hash from given filectx of standin file
31734
44ff5e4ffc8c largefiles: introduce readasstandin() to read hex hash from given filectx
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31659
diff changeset
   445
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   446
    This encapsulates how "standin" data is stored into storage layer."""
31734
44ff5e4ffc8c largefiles: introduce readasstandin() to read hex hash from given filectx
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31659
diff changeset
   447
    return fctx.data().strip()
44ff5e4ffc8c largefiles: introduce readasstandin() to read hex hash from given filectx
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31659
diff changeset
   448
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   449
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   450
def writestandin(repo, standin, hash, executable):
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
   451
    '''write hash to <repo.root>/<standin>'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   452
    repo.wwrite(standin, hash + b'\n', executable and b'x' or b'')
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   453
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   454
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   455
def copyandhash(instream, outfile):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   456
    """Read bytes from instream (iterable) and write them to outfile,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   457
    computing the SHA-1 hash of the data along the way. Return the hash."""
44062
2d49482d0dd4 hgext: replace references to hashlib.sha1 with hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43584
diff changeset
   458
    hasher = hashutil.sha1(b'')
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   459
    for data in instream:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   460
        hasher.update(data)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   461
        outfile.write(data)
36112
6426878f7f0f py3: use hex(hasher.digest())
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35279
diff changeset
   462
    return hex(hasher.digest())
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   463
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   464
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   465
def hashfile(file):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   466
    if not os.path.exists(file):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   467
        return b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   468
    with open(file, b'rb') as fd:
31652
d5cbbee542eb largefiles: reuse hexsha1() to centralize hash calculation logic into it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31618
diff changeset
   469
        return hexsha1(fd)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   470
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   471
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   472
def getexecutable(filename):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   473
    mode = os.stat(filename).st_mode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   474
    return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   475
        (mode & stat.S_IXUSR)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   476
        and (mode & stat.S_IXGRP)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   477
        and (mode & stat.S_IXOTH)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   478
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   479
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   480
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   481
def urljoin(first, second, *arg):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   482
    def join(left, right):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   483
        if not left.endswith(b'/'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   484
            left += b'/'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   485
        if right.startswith(b'/'):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   486
            right = right[1:]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   487
        return left + right
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   488
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   489
    url = join(first, second)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   490
    for a in arg:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   491
        url = join(url, a)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   492
    return url
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   493
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   494
31652
d5cbbee542eb largefiles: reuse hexsha1() to centralize hash calculation logic into it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31618
diff changeset
   495
def hexsha1(fileobj):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   496
    """hexsha1 returns the hex-encoded sha1 sum of the data in the file-like
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   497
    object data"""
44062
2d49482d0dd4 hgext: replace references to hashlib.sha1 with hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43584
diff changeset
   498
    h = hashutil.sha1()
31652
d5cbbee542eb largefiles: reuse hexsha1() to centralize hash calculation logic into it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31618
diff changeset
   499
    for chunk in util.filechunkiter(fileobj):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   500
        h.update(chunk)
36112
6426878f7f0f py3: use hex(hasher.digest())
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35279
diff changeset
   501
    return hex(h.digest())
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   502
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   503
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   504
def httpsendfile(ui, filename):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   505
    return httpconnection.httpsendfile(ui, filename, b'rb')
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   506
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   507
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   508
def unixpath(path):
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
   509
    '''Return a version of path normalized for use with the lfdirstate.'''
16066
6a42846cf769 i18n: use util.pconvert() instead of 'str.replace()' for problematic encoding
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15915
diff changeset
   510
    return util.pconvert(os.path.normpath(path))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   511
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   512
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   513
def islfilesrepo(repo):
28576
33bd95443e7f largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents: 28575
diff changeset
   514
    '''Return true if the repo is a largefile repo.'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   515
    if b'largefiles' in repo.requirements and any(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   516
        shortnameslash in f[0] for f in repo.store.datafiles()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   517
    ):
17659
ae57920ac188 largefiles: enable islfilesrepo() prior to a commit (issue3541)
Matt Harbison <matt_harbison@yahoo.com>
parents: 17270
diff changeset
   518
        return True
ae57920ac188 largefiles: enable islfilesrepo() prior to a commit (issue3541)
Matt Harbison <matt_harbison@yahoo.com>
parents: 17270
diff changeset
   519
25149
3f0744eeaeaf cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents: 24631
diff changeset
   520
    return any(openlfdirstate(repo.ui, repo, False))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   521
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   522
15333
f37b71fec602 largefiles: py2.4 doesn't have BaseException
Matt Mackall <mpm@selenic.com>
parents: 15320
diff changeset
   523
class storeprotonotcapable(Exception):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   524
    def __init__(self, storetypes):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   525
        self.storetypes = storetypes
16103
3e1efb458e8b largefiles: only cache largefiles in new heads
Na'Tosha Bard <natosha@unity3d.com>
parents: 16066
diff changeset
   526
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   527
16120
47ee41fcf42b largefiles: optimize update speed by only updating changed largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents: 16103
diff changeset
   528
def getstandinsstate(repo):
47ee41fcf42b largefiles: optimize update speed by only updating changed largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents: 16103
diff changeset
   529
    standins = []
47ee41fcf42b largefiles: optimize update speed by only updating changed largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents: 16103
diff changeset
   530
    matcher = getstandinmatcher(repo)
31735
3e37b479ce2f largefiles: replace readstandin() by readasstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31734
diff changeset
   531
    wctx = repo[None]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   532
    for standin in repo.dirstate.walk(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   533
        matcher, subrepos=[], unknown=False, ignored=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   534
    ):
16120
47ee41fcf42b largefiles: optimize update speed by only updating changed largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents: 16103
diff changeset
   535
        lfile = splitstandin(standin)
18300
745bc16ccef2 largefiles: fix update from a merge with removed files
Mads Kiilerich <madski@unity3d.com>
parents: 18299
diff changeset
   536
        try:
31735
3e37b479ce2f largefiles: replace readstandin() by readasstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31734
diff changeset
   537
            hash = readasstandin(wctx[standin])
18300
745bc16ccef2 largefiles: fix update from a merge with removed files
Mads Kiilerich <madski@unity3d.com>
parents: 18299
diff changeset
   538
        except IOError:
745bc16ccef2 largefiles: fix update from a merge with removed files
Mads Kiilerich <madski@unity3d.com>
parents: 18299
diff changeset
   539
            hash = None
745bc16ccef2 largefiles: fix update from a merge with removed files
Mads Kiilerich <madski@unity3d.com>
parents: 18299
diff changeset
   540
        standins.append((lfile, hash))
16120
47ee41fcf42b largefiles: optimize update speed by only updating changed largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents: 16103
diff changeset
   541
    return standins
16245
a18ad914aa21 largefiles: move calculation of largefiles for updating to utility function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16166
diff changeset
   542
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   543
22095
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   544
def synclfdirstate(repo, lfdirstate, lfile, normallookup):
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   545
    lfstandin = standin(lfile)
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   546
    if lfstandin in repo.dirstate:
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   547
        stat = repo.dirstate._map[lfstandin]
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   548
        state, mtime = stat[0], stat[3]
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   549
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   550
        state, mtime = b'?', -1
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   551
    if state == b'n':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   552
        if normallookup or mtime < 0 or not repo.wvfs.exists(lfile):
22095
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   553
            # state 'n' doesn't ensure 'clean' in this case
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   554
            lfdirstate.normallookup(lfile)
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   555
        else:
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   556
            lfdirstate.normal(lfile)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   557
    elif state == b'm':
22095
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   558
        lfdirstate.normallookup(lfile)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   559
    elif state == b'r':
22095
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   560
        lfdirstate.remove(lfile)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   561
    elif state == b'a':
22095
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   562
        lfdirstate.add(lfile)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   563
    elif state == b'?':
22095
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   564
        lfdirstate.drop(lfile)
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21917
diff changeset
   565
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   566
23184
3100d1cbce32 largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23039
diff changeset
   567
def markcommitted(orig, ctx, node):
24336
c9f4ef967a1d largefiles: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24158
diff changeset
   568
    repo = ctx.repo()
23184
3100d1cbce32 largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23039
diff changeset
   569
3100d1cbce32 largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23039
diff changeset
   570
    orig(node)
3100d1cbce32 largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23039
diff changeset
   571
23273
236c978bceca largefiles: avoid redundant "updatelfiles" invocation in "overridetransplant"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23188
diff changeset
   572
    # ATTENTION: "ctx.files()" may differ from "repo[node].files()"
236c978bceca largefiles: avoid redundant "updatelfiles" invocation in "overridetransplant"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23188
diff changeset
   573
    # because files coming from the 2nd parent are omitted in the latter.
236c978bceca largefiles: avoid redundant "updatelfiles" invocation in "overridetransplant"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23188
diff changeset
   574
    #
236c978bceca largefiles: avoid redundant "updatelfiles" invocation in "overridetransplant"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23188
diff changeset
   575
    # The former should be used to get targets of "synclfdirstate",
236c978bceca largefiles: avoid redundant "updatelfiles" invocation in "overridetransplant"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23188
diff changeset
   576
    # because such files:
236c978bceca largefiles: avoid redundant "updatelfiles" invocation in "overridetransplant"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23188
diff changeset
   577
    # - are marked as "a" by "patch.patch()" (e.g. via transplant), and
236c978bceca largefiles: avoid redundant "updatelfiles" invocation in "overridetransplant"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23188
diff changeset
   578
    # - have to be marked as "n" after commit, but
236c978bceca largefiles: avoid redundant "updatelfiles" invocation in "overridetransplant"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23188
diff changeset
   579
    # - aren't listed in "repo[node].files()"
236c978bceca largefiles: avoid redundant "updatelfiles" invocation in "overridetransplant"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23188
diff changeset
   580
23184
3100d1cbce32 largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23039
diff changeset
   581
    lfdirstate = openlfdirstate(repo.ui, repo)
3100d1cbce32 largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23039
diff changeset
   582
    for f in ctx.files():
31613
5c1d3f1b8f44 largefiles: omit redundant isstandin() before splitstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31332
diff changeset
   583
        lfile = splitstandin(f)
5c1d3f1b8f44 largefiles: omit redundant isstandin() before splitstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31332
diff changeset
   584
        if lfile is not None:
23184
3100d1cbce32 largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23039
diff changeset
   585
            synclfdirstate(repo, lfdirstate, lfile, False)
3100d1cbce32 largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23039
diff changeset
   586
    lfdirstate.write()
3100d1cbce32 largefiles: factor out procedures to update lfdirstate for post-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23039
diff changeset
   587
23276
4be754832829 largefiles: move "copyalltostore" invocation into "markcommitted"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23274
diff changeset
   588
    # As part of committing, copy all of the largefiles into the cache.
31616
10561eb97c7f largefiles: call readstandin() with changectx itself instead of rev or node
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31615
diff changeset
   589
    #
10561eb97c7f largefiles: call readstandin() with changectx itself instead of rev or node
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31615
diff changeset
   590
    # Using "node" instead of "ctx" implies additional "repo[node]"
10561eb97c7f largefiles: call readstandin() with changectx itself instead of rev or node
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31615
diff changeset
   591
    # lookup while copyalltostore(), but can omit redundant check for
10561eb97c7f largefiles: call readstandin() with changectx itself instead of rev or node
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31615
diff changeset
   592
    # files comming from the 2nd parent, which should exist in store
10561eb97c7f largefiles: call readstandin() with changectx itself instead of rev or node
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31615
diff changeset
   593
    # at merging.
23276
4be754832829 largefiles: move "copyalltostore" invocation into "markcommitted"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23274
diff changeset
   594
    copyalltostore(repo, node)
4be754832829 largefiles: move "copyalltostore" invocation into "markcommitted"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23274
diff changeset
   595
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   596
16245
a18ad914aa21 largefiles: move calculation of largefiles for updating to utility function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16166
diff changeset
   597
def getlfilestoupdate(oldstandins, newstandins):
a18ad914aa21 largefiles: move calculation of largefiles for updating to utility function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16166
diff changeset
   598
    changedstandins = set(oldstandins).symmetric_difference(set(newstandins))
a18ad914aa21 largefiles: move calculation of largefiles for updating to utility function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16166
diff changeset
   599
    filelist = []
a18ad914aa21 largefiles: move calculation of largefiles for updating to utility function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16166
diff changeset
   600
    for f in changedstandins:
a18ad914aa21 largefiles: move calculation of largefiles for updating to utility function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16166
diff changeset
   601
        if f[0] not in filelist:
a18ad914aa21 largefiles: move calculation of largefiles for updating to utility function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16166
diff changeset
   602
            filelist.append(f[0])
a18ad914aa21 largefiles: move calculation of largefiles for updating to utility function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16166
diff changeset
   603
    return filelist
21042
32b3331f18eb largefiles: centralize the logic to get outgoing largefiles
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19089
diff changeset
   604
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   605
21042
32b3331f18eb largefiles: centralize the logic to get outgoing largefiles
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19089
diff changeset
   606
def getlfilestoupload(repo, missing, addfunc):
39390
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   607
    makeprogress = repo.ui.makeprogress
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   608
    with makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   609
        _(b'finding outgoing largefiles'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   610
        unit=_(b'revisions'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   611
        total=len(missing),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   612
    ) as progress:
39390
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   613
        for i, n in enumerate(missing):
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   614
            progress.update(i)
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   615
            parents = [p for p in repo[n].parents() if p != nullid]
23657
95f238cafb32 largefiles: ensure that the standin files are available in getlfilestoupload()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23543
diff changeset
   616
43584
a02e4c12ae60 largefiles: allow "lfstatus" context manager to set value to False
Martin von Zweigbergk <martinvonz@google.com>
parents: 43583
diff changeset
   617
            with lfstatus(repo, value=False):
39390
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   618
                ctx = repo[n]
23657
95f238cafb32 largefiles: ensure that the standin files are available in getlfilestoupload()
Matt Harbison <matt_harbison@yahoo.com>
parents: 23543
diff changeset
   619
39390
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   620
            files = set(ctx.files())
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   621
            if len(parents) == 2:
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   622
                mc = ctx.manifest()
41397
0bd56c291359 cleanup: use p1() and p2() instead of parents()[0] and parents()[1]
Martin von Zweigbergk <martinvonz@google.com>
parents: 39390
diff changeset
   623
                mp1 = ctx.p1().manifest()
0bd56c291359 cleanup: use p1() and p2() instead of parents()[0] and parents()[1]
Martin von Zweigbergk <martinvonz@google.com>
parents: 39390
diff changeset
   624
                mp2 = ctx.p2().manifest()
39390
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   625
                for f in mp1:
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   626
                    if f not in mc:
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   627
                        files.add(f)
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   628
                for f in mp2:
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   629
                    if f not in mc:
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   630
                        files.add(f)
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   631
                for f in mc:
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   632
                    if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None):
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   633
                        files.add(f)
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   634
            for fn in files:
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   635
                if isstandin(fn) and fn in ctx:
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   636
                    addfunc(fn, readasstandin(ctx[fn]))
23185
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   637
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   638
23185
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   639
def updatestandinsbymatch(repo, match):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   640
    """Update standins in the working directory according to specified match
23185
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   641
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   642
    This returns (possibly modified) ``match`` object to be used for
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   643
    subsequent commit process.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   644
    """
23185
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   645
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   646
    ui = repo.ui
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   647
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   648
    # Case 1: user calls commit with no specific files or
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   649
    # include/exclude patterns: refresh and commit all files that
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   650
    # are "dirty".
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   651
    if match is None or match.always():
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   652
        # Spend a bit of time here to get a list of files we know
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   653
        # are modified so we can compare only against those.
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   654
        # It can cost a lot of time (several seconds)
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   655
        # otherwise to update all standins if the largefiles are
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   656
        # large.
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   657
        lfdirstate = openlfdirstate(ui, repo)
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41397
diff changeset
   658
        dirtymatch = matchmod.always()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   659
        unsure, s = lfdirstate.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   660
            dirtymatch, subrepos=[], ignored=False, clean=False, unknown=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   661
        )
23185
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   662
        modifiedfiles = unsure + s.modified + s.added + s.removed
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   663
        lfiles = listlfiles(repo)
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   664
        # this only loops through largefiles that exist (not
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   665
        # removed/renamed)
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   666
        for lfile in lfiles:
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   667
            if lfile in modifiedfiles:
31618
8228bc8fed8c largefiles: avoid redundant standin() invocations
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31617
diff changeset
   668
                fstandin = standin(lfile)
8228bc8fed8c largefiles: avoid redundant standin() invocations
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31617
diff changeset
   669
                if repo.wvfs.exists(fstandin):
23185
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   670
                    # this handles the case where a rebase is being
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   671
                    # performed and the working copy is not updated
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   672
                    # yet.
28560
bfbd3f02b442 largefiles: replace invocation of os.path module by vfs in lfutil.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   673
                    if repo.wvfs.exists(lfile):
31659
0eec36112e58 largefiles: add lfile argument to updatestandin() for efficiency (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31657
diff changeset
   674
                        updatestandin(repo, lfile, fstandin)
23185
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   675
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   676
        return match
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   677
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   678
    lfiles = listlfiles(repo)
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   679
    match._files = repo._subdirlfs(match.files(), lfiles)
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   680
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   681
    # Case 2: user calls commit with specified patterns: refresh
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   682
    # any matching big files.
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   683
    smatcher = composestandinmatcher(repo, match)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   684
    standins = repo.dirstate.walk(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   685
        smatcher, subrepos=[], unknown=False, ignored=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   686
    )
23185
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   687
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   688
    # No matching big files: get out of the way and pass control to
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   689
    # the usual commit() method.
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   690
    if not standins:
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   691
        return match
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   692
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   693
    # Refresh all matching big files.  It's possible that the
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   694
    # commit will end up failing, in which case the big files will
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   695
    # stay refreshed.  No harm done: the user modified them and
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   696
    # asked to commit them, so sooner or later we're going to
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   697
    # refresh the standins.  Might as well leave them refreshed.
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   698
    lfdirstate = openlfdirstate(ui, repo)
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   699
    for fstandin in standins:
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   700
        lfile = splitstandin(fstandin)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   701
        if lfdirstate[lfile] != b'r':
31659
0eec36112e58 largefiles: add lfile argument to updatestandin() for efficiency (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31657
diff changeset
   702
            updatestandin(repo, lfile, fstandin)
23185
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   703
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   704
    # Cook up a new matcher that only matches regular files or
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   705
    # standins corresponding to the big files requested by the
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   706
    # user.  Have to modify _files to prevent commit() from
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   707
    # complaining "not tracked" for big files.
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   708
    match = copy.copy(match)
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   709
    origmatchfn = match.matchfn
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   710
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   711
    # Check both the list of largefiles and the list of
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   712
    # standins because if a largefile was removed, it
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   713
    # won't be in the list of largefiles at this point
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   714
    match._files += sorted(standins)
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   715
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   716
    actualfiles = []
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   717
    for f in match._files:
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   718
        fstandin = standin(f)
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   719
26817
b68797f244e4 largefiles: fix explicit commit of normal/largefile switch
Mads Kiilerich <madski@unity3d.com>
parents: 26749
diff changeset
   720
        # For largefiles, only one of the normal and standin should be
27942
eb1135d5e688 largefiles: fix an explicit largefile commit after a remove (issue4969)
Matt Harbison <matt_harbison@yahoo.com>
parents: 27903
diff changeset
   721
        # committed (except if one of them is a remove).  In the case of a
eb1135d5e688 largefiles: fix an explicit largefile commit after a remove (issue4969)
Matt Harbison <matt_harbison@yahoo.com>
parents: 27903
diff changeset
   722
        # standin removal, drop the normal file if it is unknown to dirstate.
26817
b68797f244e4 largefiles: fix explicit commit of normal/largefile switch
Mads Kiilerich <madski@unity3d.com>
parents: 26749
diff changeset
   723
        # Thus, skip plain largefile names but keep the standin.
27942
eb1135d5e688 largefiles: fix an explicit largefile commit after a remove (issue4969)
Matt Harbison <matt_harbison@yahoo.com>
parents: 27903
diff changeset
   724
        if f in lfiles or fstandin in standins:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   725
            if repo.dirstate[fstandin] != b'r':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   726
                if repo.dirstate[f] != b'r':
27942
eb1135d5e688 largefiles: fix an explicit largefile commit after a remove (issue4969)
Matt Harbison <matt_harbison@yahoo.com>
parents: 27903
diff changeset
   727
                    continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   728
            elif repo.dirstate[f] == b'?':
27942
eb1135d5e688 largefiles: fix an explicit largefile commit after a remove (issue4969)
Matt Harbison <matt_harbison@yahoo.com>
parents: 27903
diff changeset
   729
                continue
23185
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   730
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   731
        actualfiles.append(f)
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   732
    match._files = actualfiles
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   733
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   734
    def matchfn(f):
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   735
        if origmatchfn(f):
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   736
            return f not in lfiles
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   737
        else:
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   738
            return f in standins
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   739
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   740
    match.matchfn = matchfn
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   741
9870173e0b48 largefiles: factor out procedures to update standins for pre-committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23184
diff changeset
   742
    return match
23187
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   743
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   744
23187
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   745
class automatedcommithook(object):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   746
    """Stateful hook to update standins at the 1st commit of resuming
23187
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   747
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   748
    For efficiency, updating standins in the working directory should
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   749
    be avoided while automated committing (like rebase, transplant and
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   750
    so on), because they should be updated before committing.
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   751
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   752
    But the 1st commit of resuming automated committing (e.g. ``rebase
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   753
    --continue``) should update them, because largefiles may be
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   754
    modified manually.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   755
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   756
23187
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   757
    def __init__(self, resuming):
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   758
        self.resuming = resuming
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   759
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   760
    def __call__(self, repo, match):
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   761
        if self.resuming:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   762
            self.resuming = False  # avoids updating at subsequent commits
23187
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   763
            return updatestandinsbymatch(repo, match)
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   764
        else:
f726b05ecfe6 largefiles: update standins only at the 1st commit of "hg rebase --continue"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23185
diff changeset
   765
            return match
23188
94ac64bcf6fe largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23187
diff changeset
   766
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   767
23188
94ac64bcf6fe largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23187
diff changeset
   768
def getstatuswriter(ui, repo, forcibly=None):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   769
    """Return the function to write largefiles specific status out
23188
94ac64bcf6fe largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23187
diff changeset
   770
94ac64bcf6fe largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23187
diff changeset
   771
    If ``forcibly`` is ``None``, this returns the last element of
23543
4dd8a6a1240d spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23276
diff changeset
   772
    ``repo._lfstatuswriters`` as "default" writer function.
23188
94ac64bcf6fe largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23187
diff changeset
   773
94ac64bcf6fe largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23187
diff changeset
   774
    Otherwise, this returns the function to always write out (or
94ac64bcf6fe largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23187
diff changeset
   775
    ignore if ``not forcibly``) status.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44379
diff changeset
   776
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   777
    if forcibly is None and util.safehasattr(repo, b'_largefilesenabled'):
23188
94ac64bcf6fe largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23187
diff changeset
   778
        return repo._lfstatuswriters[-1]
94ac64bcf6fe largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23187
diff changeset
   779
    else:
94ac64bcf6fe largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23187
diff changeset
   780
        if forcibly:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   781
            return ui.status  # forcibly WRITE OUT
23188
94ac64bcf6fe largefiles: introduce "_lfstatuswriters" to customize status reporting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23187
diff changeset
   782
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   783
            return lambda *msg, **opts: None  # forcibly IGNORE