hgext/largefiles/lfcommands.py
author Augie Fackler <augie@google.com>
Sun, 06 Oct 2019 09:45:02 -0400
changeset 43076 2372284d9457
parent 41775 a86e22007b54
child 43077 687b865b95ad
permissions -rw-r--r--
formatting: blacken the codebase This is using my patch to black (https://github.com/psf/black/pull/826) so we don't un-wrap collection literals. Done with: hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**"' | xargs black -S # skip-blame mass-reformatting only # no-check-commit reformats foo_bar functions Differential Revision: https://phab.mercurial-scm.org/D6971
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
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15230
diff changeset
     9
'''High-level command function for lfconvert, plus the cmdtable.'''
29308
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    10
from __future__ import absolute_import
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    11
29308
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    12
import errno
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29317
diff changeset
    13
import hashlib
29308
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    14
import os
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    15
import shutil
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    16
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    17
from mercurial.i18n import _
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    18
29308
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    19
from mercurial import (
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    20
    cmdutil,
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    21
    context,
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    22
    error,
41061
98681293c890 largefiles: port commands to exthelper
Matt Harbison <matt_harbison@yahoo.com>
parents: 40675
diff changeset
    23
    exthelper,
29308
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    24
    hg,
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    25
    lock,
29317
5ec25534ef4f largefiles: rename match_ to matchmod import in lfcommands
liscju <piotr.listkiewicz@gmail.com>
parents: 29308
diff changeset
    26
    match as matchmod,
29308
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    27
    node,
35348
576ba8194fa8 py3: handle keyword arguments correctly in hgext/largefiles/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35186
diff changeset
    28
    pycompat,
29308
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    29
    scmutil,
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    30
    util,
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    31
)
25325
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
    32
29308
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    33
from ..convert import (
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    34
    convcmd,
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    35
    filemap,
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    36
)
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    37
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    38
from . import lfutil, storefactory
29308
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    39
8c378a7d2aa6 py3: make largefiles/lfcommands.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents: 29305
diff changeset
    40
release = lock.release
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    41
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    42
# -- Commands ----------------------------------------------------------
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    43
41061
98681293c890 largefiles: port commands to exthelper
Matt Harbison <matt_harbison@yahoo.com>
parents: 40675
diff changeset
    44
eh = exthelper.exthelper()
21242
4c94229c51fb largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21088
diff changeset
    45
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    46
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    47
@eh.command(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    48
    'lfconvert',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    49
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    50
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    51
            's',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    52
            'size',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    53
            '',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    54
            _('minimum size (MB) for files to be converted as largefiles'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    55
            'SIZE',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    56
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    57
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    58
            '',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    59
            'to-normal',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    60
            False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    61
            _('convert from a largefiles repo to a normal repo'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    62
        ),
21242
4c94229c51fb largefiles: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21088
diff changeset
    63
    ],
21770
15d434bee41c largefiles: define norepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21689
diff changeset
    64
    _('hg lfconvert SOURCE DEST [FILE ...]'),
21785
a730b002c5db largefiles: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21770
diff changeset
    65
    norepo=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    66
    inferrepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
    67
)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    68
def lfconvert(ui, src, dest, *pats, **opts):
15230
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    69
    '''convert a normal repository to a largefiles repository
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    70
15230
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    71
    Convert repository SOURCE to a new repository DEST, identical to
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    72
    SOURCE except that certain files will be converted as largefiles:
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    73
    specifically, any file that matches any PATTERN *or* whose size is
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    74
    above the minimum size threshold is converted as a largefile. The
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    75
    size used to determine whether or not to track a file as a
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    76
    largefile is the size of the first version of the file. The
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    77
    minimum size can be specified either with --size or in
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    78
    configuration as ``largefiles.size``.
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    79
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    80
    After running this command you will need to make sure that
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    81
    largefiles is enabled anywhere you intend to push the new
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    82
    repository.
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    83
15332
0db47b8d025f largefiles: rename lfconvert --tonormal option to --to-normal
Greg Ward <greg@gerg.ca>
parents: 15317
diff changeset
    84
    Use --to-normal to convert largefiles back to normal files; after
15230
697289c5d415 largefiles: improve help
Greg Ward <greg@gerg.ca>
parents: 15228
diff changeset
    85
    this, the DEST repository can be used without largefiles at all.'''
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    86
35348
576ba8194fa8 py3: handle keyword arguments correctly in hgext/largefiles/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35186
diff changeset
    87
    opts = pycompat.byteskwargs(opts)
15332
0db47b8d025f largefiles: rename lfconvert --tonormal option to --to-normal
Greg Ward <greg@gerg.ca>
parents: 15317
diff changeset
    88
    if opts['to_normal']:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    89
        tolfile = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    90
    else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    91
        tolfile = True
15227
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15224
diff changeset
    92
        size = lfutil.getminsize(ui, True, opts.get('size'), default=None)
15340
0e58513cc59a largefiles: rearrange how lfconvert detects non-local repos
Greg Ward <greg@gerg.ca>
parents: 15339
diff changeset
    93
0e58513cc59a largefiles: rearrange how lfconvert detects non-local repos
Greg Ward <greg@gerg.ca>
parents: 15339
diff changeset
    94
    if not hg.islocal(src):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
    95
        raise error.Abort(_('%s is not a local Mercurial repo') % src)
15340
0e58513cc59a largefiles: rearrange how lfconvert detects non-local repos
Greg Ward <greg@gerg.ca>
parents: 15339
diff changeset
    96
    if not hg.islocal(dest):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
    97
        raise error.Abort(_('%s is not a local Mercurial repo') % dest)
15340
0e58513cc59a largefiles: rearrange how lfconvert detects non-local repos
Greg Ward <greg@gerg.ca>
parents: 15339
diff changeset
    98
15339
be1377d19018 largefiles: test lfconvert error handling; remove redundant code
Greg Ward <greg@gerg.ca>
parents: 15332
diff changeset
    99
    rsrc = hg.repository(ui, src)
be1377d19018 largefiles: test lfconvert error handling; remove redundant code
Greg Ward <greg@gerg.ca>
parents: 15332
diff changeset
   100
    ui.status(_('initializing destination %s\n') % dest)
be1377d19018 largefiles: test lfconvert error handling; remove redundant code
Greg Ward <greg@gerg.ca>
parents: 15332
diff changeset
   101
    rdst = hg.repository(ui, dest, create=True)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   102
15171
547da6115d1d largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents: 15170
diff changeset
   103
    success = False
16717
1eede2ea2041 largefiles: use wlock for lfconvert (issue3444)
Mads Kiilerich <mads@kiilerich.com>
parents: 16551
diff changeset
   104
    dstwlock = dstlock = None
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   105
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   106
        # Get a list of all changesets in the source.  The easy way to do this
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17299
diff changeset
   107
        # is to simply walk the changelog, using changelog.nodesbetween().
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   108
        # Take a look at mercurial/revlog.py:639 for more details.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   109
        # Use a generator instead of a list to decrease memory usage
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   110
        ctxs = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   111
            rsrc[ctx]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   112
            for ctx in rsrc.changelog.nodesbetween(None, rsrc.heads())[0]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   113
        )
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   114
        revmap = {node.nullid: node.nullid}
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   115
        if tolfile:
25325
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   116
            # Lock destination to prevent modification while it is converted to.
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   117
            # Don't need to lock src because we are just reading from its
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   118
            # history which can't change.
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   119
            dstwlock = rdst.wlock()
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   120
            dstlock = rdst.lock()
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   121
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   122
            lfiles = set()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   123
            normalfiles = set()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   124
            if not pats:
34756
3f3c6d12095d configitems: register the 'largefiles.patterns' config
Boris Feld <boris.feld@octobus.net>
parents: 34083
diff changeset
   125
                pats = ui.configlist(lfutil.longname, 'patterns')
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   126
            if pats:
29317
5ec25534ef4f largefiles: rename match_ to matchmod import in lfcommands
liscju <piotr.listkiewicz@gmail.com>
parents: 29308
diff changeset
   127
                matcher = matchmod.match(rsrc.root, '', list(pats))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   128
            else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   129
                matcher = None
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   130
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   131
            lfiletohash = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   132
            with ui.makeprogress(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   133
                _('converting revisions'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   134
                unit=_('revisions'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   135
                total=rsrc['tip'].rev(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   136
            ) 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
   137
                for ctx in ctxs:
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   138
                    progress.update(ctx.rev())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   139
                    _lfconvert_addchangeset(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   140
                        rsrc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   141
                        rdst,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   142
                        ctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   143
                        revmap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   144
                        lfiles,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   145
                        normalfiles,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   146
                        matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   147
                        size,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   148
                        lfiletohash,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   149
                    )
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   150
28559
30863ca01c6b largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   151
            if rdst.wvfs.exists(lfutil.shortname):
30863ca01c6b largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   152
                rdst.wvfs.rmtree(lfutil.shortname)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   153
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   154
            for f in lfiletohash.keys():
28559
30863ca01c6b largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   155
                if rdst.wvfs.isfile(f):
30863ca01c6b largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   156
                    rdst.wvfs.unlink(f)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   157
                try:
28559
30863ca01c6b largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   158
                    rdst.wvfs.removedirs(rdst.wvfs.dirname(f))
15171
547da6115d1d largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents: 15170
diff changeset
   159
                except OSError:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   160
                    pass
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   161
15303
07811b3b119b largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents: 15255
diff changeset
   162
            # If there were any files converted to largefiles, add largefiles
07811b3b119b largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents: 15255
diff changeset
   163
            # to the destination repository's requirements.
07811b3b119b largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents: 15255
diff changeset
   164
            if lfiles:
07811b3b119b largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents: 15255
diff changeset
   165
                rdst.requirements.add('largefiles')
07811b3b119b largefiles: include 'largefiles' in converted repository requirements
Eli Carter <eli.carter@tektronix.com>
parents: 15255
diff changeset
   166
                rdst._writerequirements()
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   167
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   168
25325
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   169
            class lfsource(filemap.filemap_source):
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   170
                def __init__(self, ui, source):
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   171
                    super(lfsource, self).__init__(ui, source, None)
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   172
                    self.filemapper.rename[lfutil.shortname] = '.'
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   173
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   174
                def getfile(self, name, rev):
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   175
                    realname, realrev = rev
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   176
                    f = super(lfsource, self).getfile(name, rev)
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   177
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   178
                    if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   179
                        not realname.startswith(lfutil.shortnameslash)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   180
                        or f[0] is None
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   181
                    ):
25325
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   182
                        return f
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   183
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   184
                    # Substitute in the largefile data for the hash
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   185
                    hash = f[0].strip()
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   186
                    path = lfutil.findfile(rsrc, hash)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   187
25325
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   188
                    if path is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   189
                        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   190
                            _("missing largefile for '%s' in %s")
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   191
                            % (realname, realrev)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   192
                        )
27774
8ceaaf63ca80 largefiles: use util.readfile in lfconvert
Bryan O'Sullivan <bryano@fb.com>
parents: 27651
diff changeset
   193
                    return util.readfile(path), f[1]
25325
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   194
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   195
            class converter(convcmd.converter):
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   196
                def __init__(self, ui, source, dest, revmapfile, opts):
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   197
                    src = lfsource(ui, source)
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   198
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   199
                    super(converter, self).__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   200
                        ui, src, dest, revmapfile, opts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   201
                    )
25325
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   202
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   203
            found, missing = downloadlfiles(ui, rsrc)
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   204
            if missing != 0:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   205
                raise error.Abort(_("all largefiles must be present locally"))
25325
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   206
25560
2b2108c35bfc largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents: 25508
diff changeset
   207
            orig = convcmd.converter
25325
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   208
            convcmd.converter = converter
25560
2b2108c35bfc largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents: 25508
diff changeset
   209
2b2108c35bfc largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents: 25508
diff changeset
   210
            try:
35179
4abfe4169259 largefiles: explicitly set the source and sink types to 'hg' for lfconvert
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   211
                convcmd.convert(ui, src, dest, source_type='hg', dest_type='hg')
25560
2b2108c35bfc largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents: 25508
diff changeset
   212
            finally:
2b2108c35bfc largefiles: restore the original converter class after lfconvert --to-normal
Matt Harbison <matt_harbison@yahoo.com>
parents: 25508
diff changeset
   213
                convcmd.converter = orig
15171
547da6115d1d largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents: 15170
diff changeset
   214
        success = True
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   215
    finally:
25325
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   216
        if tolfile:
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   217
            rdst.dirstate.clear()
fcd2f9b06629 largefiles: use the convert extension for 'lfconvert --to-normal'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24788
diff changeset
   218
            release(dstlock, dstwlock)
15171
547da6115d1d largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents: 15170
diff changeset
   219
        if not success:
547da6115d1d largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents: 15170
diff changeset
   220
            # we failed, remove the new directory
547da6115d1d largefiles: eliminate naked exceptions
Matt Mackall <mpm@selenic.com>
parents: 15170
diff changeset
   221
            shutil.rmtree(rdst.root)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   222
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   223
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   224
def _lfconvert_addchangeset(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   225
    rsrc, rdst, ctx, revmap, lfiles, normalfiles, matcher, size, lfiletohash
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   226
):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   227
    # Convert src parents to dst parents
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   228
    parents = _convertparents(ctx, revmap)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   229
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   230
    # Generate list of changed files
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   231
    files = _getchangedfiles(ctx, parents)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   232
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   233
    dstfiles = []
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   234
    for f in files:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   235
        if f not in lfiles and f not in normalfiles:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   236
            islfile = _islfile(f, ctx, matcher, size)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   237
            # If this file was renamed or copied then copy
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17299
diff changeset
   238
            # the largefile-ness of its predecessor
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   239
            if f in ctx.manifest():
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   240
                fctx = ctx.filectx(f)
41775
a86e22007b54 largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents: 41598
diff changeset
   241
                renamed = fctx.copysource()
39710
7375a9ab0149 filectx: fix return of renamed
Sean Farley <sean@farley.io>
parents: 39390
diff changeset
   242
                if renamed is None:
7375a9ab0149 filectx: fix return of renamed
Sean Farley <sean@farley.io>
parents: 39390
diff changeset
   243
                    # the code below assumes renamed to be a boolean or a list
7375a9ab0149 filectx: fix return of renamed
Sean Farley <sean@farley.io>
parents: 39390
diff changeset
   244
                    # and won't quite work with the value None
7375a9ab0149 filectx: fix return of renamed
Sean Farley <sean@farley.io>
parents: 39390
diff changeset
   245
                    renamed = False
41775
a86e22007b54 largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents: 41598
diff changeset
   246
                renamedlfile = renamed and renamed in lfiles
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   247
                islfile |= renamedlfile
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   248
                if 'l' in fctx.flags():
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   249
                    if renamedlfile:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   250
                        raise error.Abort(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   251
                            _('renamed/copied largefile %s becomes symlink') % f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   252
                        )
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   253
                    islfile = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   254
            if islfile:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   255
                lfiles.add(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   256
            else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   257
                normalfiles.add(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   258
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   259
        if f in lfiles:
31618
8228bc8fed8c largefiles: avoid redundant standin() invocations
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31613
diff changeset
   260
            fstandin = lfutil.standin(f)
8228bc8fed8c largefiles: avoid redundant standin() invocations
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31613
diff changeset
   261
            dstfiles.append(fstandin)
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15253
diff changeset
   262
            # largefile in manifest if it has not been removed/renamed
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   263
            if f in ctx.manifest():
15808
62098aeb1e15 largefiles: don't reference uninitialized variable (issue3092)
Levi Bard <levi@unity3d.com>
parents: 15793
diff changeset
   264
                fctx = ctx.filectx(f)
62098aeb1e15 largefiles: don't reference uninitialized variable (issue3092)
Levi Bard <levi@unity3d.com>
parents: 15793
diff changeset
   265
                if 'l' in fctx.flags():
41775
a86e22007b54 largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents: 41598
diff changeset
   266
                    renamed = fctx.copysource()
a86e22007b54 largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents: 41598
diff changeset
   267
                    if renamed and renamed in lfiles:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   268
                        raise error.Abort(_('largefile %s becomes symlink') % f)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   269
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15253
diff changeset
   270
                # largefile was modified, update standins
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29317
diff changeset
   271
                m = hashlib.sha1('')
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   272
                m.update(ctx[f].data())
40675
9fcf8084ada8 py3: use node.hex(m.digest()) instead of m.hexdigest()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39710
diff changeset
   273
                hash = node.hex(m.digest())
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   274
                if f not in lfiletohash or lfiletohash[f] != hash:
19089
0509ae083ec1 largefiles: use repo.wwrite for writing standins (issue3909)
Mads Kiilerich <madski@unity3d.com>
parents: 18976
diff changeset
   275
                    rdst.wwrite(f, ctx[f].data(), ctx[f].flags())
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   276
                    executable = 'x' in ctx[f].flags()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   277
                    lfutil.writestandin(rdst, fstandin, hash, executable)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   278
                    lfiletohash[f] = hash
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   279
        else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   280
            # normal file
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   281
            dstfiles.append(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   282
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   283
    def getfilectx(repo, memctx, f):
31613
5c1d3f1b8f44 largefiles: omit redundant isstandin() before splitstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31612
diff changeset
   284
        srcfname = lfutil.splitstandin(f)
5c1d3f1b8f44 largefiles: omit redundant isstandin() before splitstandin()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31612
diff changeset
   285
        if srcfname is not None:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   286
            # if the file isn't in the manifest then it was removed
31612
c93cdfa131a8 misc: update descriptions about removed file for filectxfn
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30269
diff changeset
   287
            # or renamed, return None to indicate this
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   288
            try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   289
                fctx = ctx.filectx(srcfname)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   290
            except error.LookupError:
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22197
diff changeset
   291
                return None
41775
a86e22007b54 largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents: 41598
diff changeset
   292
            renamed = fctx.copysource()
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   293
            if renamed:
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15253
diff changeset
   294
                # standin is always a largefile because largefile-ness
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   295
                # doesn't change after rename or copy
41775
a86e22007b54 largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents: 41598
diff changeset
   296
                renamed = lfutil.standin(renamed)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   297
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   298
            return context.memfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   299
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   300
                memctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   301
                f,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   302
                lfiletohash[srcfname] + '\n',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   303
                'l' in fctx.flags(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   304
                'x' in fctx.flags(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   305
                renamed,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   306
            )
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   307
        else:
21689
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21242
diff changeset
   308
            return _getnormalcontext(repo, ctx, f, revmap)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   309
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   310
    # Commit
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   311
    _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap)
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   312
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   313
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   314
def _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   315
    mctx = context.memctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   316
        rdst,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   317
        parents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   318
        ctx.description(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   319
        dstfiles,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   320
        getfilectx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   321
        ctx.user(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   322
        ctx.date(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   323
        ctx.extra(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   324
    )
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   325
    ret = rdst.commitctx(mctx)
23276
4be754832829 largefiles: move "copyalltostore" invocation into "markcommitted"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23189
diff changeset
   326
    lfutil.copyalltostore(rdst, ret)
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16439
diff changeset
   327
    rdst.setparents(ret)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   328
    revmap[ctx.node()] = rdst.changelog.tip()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   329
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   330
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   331
# Generate list of changed files
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   332
def _getchangedfiles(ctx, parents):
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   333
    files = set(ctx.files())
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   334
    if node.nullid not in parents:
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   335
        mc = ctx.manifest()
41400
4a409c19831f largefiles: avoid walking full manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 41397
diff changeset
   336
        for pctx in ctx.parents():
4a409c19831f largefiles: avoid walking full manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 41397
diff changeset
   337
            for fn in pctx.manifest().diff(mc):
4a409c19831f largefiles: avoid walking full manifest
Martin von Zweigbergk <martinvonz@google.com>
parents: 41397
diff changeset
   338
                files.add(fn)
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   339
    return files
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   340
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   341
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   342
# Convert src parents to dst parents
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   343
def _convertparents(ctx, revmap):
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   344
    parents = []
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   345
    for p in ctx.parents():
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   346
        parents.append(revmap[p.node()])
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   347
    while len(parents) < 2:
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   348
        parents.append(node.nullid)
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   349
    return parents
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   350
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   351
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   352
# Get memfilectx for a normal file
21689
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21242
diff changeset
   353
def _getnormalcontext(repo, ctx, f, revmap):
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   354
    try:
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   355
        fctx = ctx.filectx(f)
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   356
    except error.LookupError:
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22197
diff changeset
   357
        return None
41775
a86e22007b54 largefiles: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents: 41598
diff changeset
   358
    renamed = fctx.copysource()
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   359
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   360
    data = fctx.data()
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   361
    if f == '.hgtags':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   362
        data = _converttags(repo.ui, revmap, data)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   363
    return context.memfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   364
        repo, ctx, f, data, 'l' in fctx.flags(), 'x' in fctx.flags(), renamed
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   365
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   366
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   367
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   368
# Remap tag data using a revision map
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   369
def _converttags(ui, revmap, data):
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   370
    newdata = []
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   371
    for line in data.splitlines():
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   372
        try:
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   373
            id, name = line.split(' ', 1)
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   374
        except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   375
            ui.warn(_('skipping incorrectly formatted tag %s\n') % line)
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   376
            continue
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   377
        try:
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   378
            newid = node.bin(id)
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   379
        except TypeError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   380
            ui.warn(_('skipping incorrectly formatted id %s\n') % id)
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   381
            continue
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   382
        try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   383
            newdata.append('%s %s\n' % (node.hex(revmap[newid]), name))
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   384
        except KeyError:
16231
ce292f1379ba i18n: fix all remaining uses of % inside _()
Matt Mackall <mpm@selenic.com>
parents: 15909
diff changeset
   385
            ui.warn(_('no mapping for id %s\n') % id)
15811
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   386
            continue
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   387
    return ''.join(newdata)
b9886dde3649 largefiles: remove pasted code
Levi Bard <levi@unity3d.com>
parents: 15809
diff changeset
   388
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   389
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   390
def _islfile(file, ctx, matcher, size):
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15230
diff changeset
   391
    '''Return true if file should be considered a largefile, i.e.
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15230
diff changeset
   392
    matcher matches it or it is larger than size.'''
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15230
diff changeset
   393
    # never store special .hg* files as largefiles
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   394
    if file == '.hgtags' or file == '.hgignore' or file == '.hgsigs':
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   395
        return False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   396
    if matcher and matcher(file):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   397
        return True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   398
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   399
        return ctx.filectx(file).size() >= size * 1024 * 1024
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   400
    except error.LookupError:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   401
        return False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   402
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   403
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   404
def uploadlfiles(ui, rsrc, rdst, files):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   405
    '''upload largefiles to the central store'''
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   406
15317
41f371150ccb largefiles: make the store primary, and the user cache secondary
Benjamin Pollack <benjamin@bitquabit.com>
parents: 15313
diff changeset
   407
    if not files:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   408
        return
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   409
29355
85868ecf2c0d largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents: 29341
diff changeset
   410
    store = storefactory.openstore(rsrc, rdst, put=True)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   411
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   412
    at = 0
17127
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16727
diff changeset
   413
    ui.debug("sending statlfile command for %d largefiles\n" % len(files))
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16727
diff changeset
   414
    retval = store.exists(files)
36311
b9da10f310f4 largfiles: replace filter() with listcomp when result needs to be a list
Augie Fackler <augie@google.com>
parents: 35563
diff changeset
   415
    files = [h for h in files if not retval[h]]
17127
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16727
diff changeset
   416
    ui.debug("%d largefiles need to be uploaded\n" % len(files))
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16727
diff changeset
   417
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   418
    with ui.makeprogress(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   419
        _('uploading largefiles'), unit=_('files'), total=len(files)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   420
    ) 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
   421
        for hash in files:
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   422
            progress.update(at)
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   423
            source = lfutil.findfile(rsrc, hash)
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   424
            if not source:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   425
                raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   426
                    _(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   427
                        'largefile %s missing from store'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   428
                        ' (needs to be uploaded)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   429
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   430
                    % hash
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   431
                )
39390
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   432
            # XXX check for errors here
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   433
            store.put(source, hash)
a65ad9b22a00 largefiles: use a context manager to control the progress bar lifetime
Matt Harbison <matt_harbison@yahoo.com>
parents: 38407
diff changeset
   434
            at += 1
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   435
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   436
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   437
def verifylfiles(ui, repo, all=False, contents=False):
18574
4db9e31ae605 largefiles: docstrings for verify methods
Mads Kiilerich <mads@kiilerich.com>
parents: 18294
diff changeset
   438
    '''Verify that every largefile revision in the current changeset
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   439
    exists in the central store.  With --contents, also verify that
18574
4db9e31ae605 largefiles: docstrings for verify methods
Mads Kiilerich <mads@kiilerich.com>
parents: 18294
diff changeset
   440
    the contents of each local largefile file revision are correct (SHA-1 hash
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   441
    matches the revision ID).  With --all, check every changeset in
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   442
    this repository.'''
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   443
    if all:
25508
b8fd605b0c88 largefiles: ignore hidden changesets with 'verify --large --lfa'
Matt Harbison <matt_harbison@yahoo.com>
parents: 25326
diff changeset
   444
        revs = repo.revs('all()')
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   445
    else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   446
        revs = ['.']
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   447
29355
85868ecf2c0d largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents: 29341
diff changeset
   448
    store = storefactory.openstore(repo)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   449
    return store.verify(revs, contents=contents)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   450
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   451
16700
28001e8a5149 largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16691
diff changeset
   452
def cachelfiles(ui, repo, node, filelist=None):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   453
    '''cachelfiles ensures that all largefiles needed by the specified revision
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   454
    are present in the repository's largefile cache.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   455
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   456
    returns a tuple (cached, missing).  cached is the list of files downloaded
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   457
    by this operation; missing is the list of files that were needed but could
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   458
    not be found.'''
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   459
    lfiles = lfutil.listlfiles(repo, node)
16700
28001e8a5149 largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16691
diff changeset
   460
    if filelist:
28001e8a5149 largefiles: optimize performance when updating (issue3440)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16691
diff changeset
   461
        lfiles = set(lfiles) & set(filelist)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   462
    toget = []
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   463
31654
1af4a1641bdb largefiles: avoid redundant changectx looking up at each repetitions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31618
diff changeset
   464
    ctx = repo[node]
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   465
    for lfile in lfiles:
18728
1e636f7b1cfe largefiles: simplify cachelfiles - don't spend a lot of time checking hashes
Mads Kiilerich <madski@unity3d.com>
parents: 18727
diff changeset
   466
        try:
31740
a40e979b9d97 largefiles: use readasstandin() to read hex hash directly from filectx
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31735
diff changeset
   467
            expectedhash = lfutil.readasstandin(ctx[lfutil.standin(lfile)])
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25560
diff changeset
   468
        except IOError as err:
18728
1e636f7b1cfe largefiles: simplify cachelfiles - don't spend a lot of time checking hashes
Mads Kiilerich <madski@unity3d.com>
parents: 18727
diff changeset
   469
            if err.errno == errno.ENOENT:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   470
                continue  # node must be None and standin wasn't found in wctx
18728
1e636f7b1cfe largefiles: simplify cachelfiles - don't spend a lot of time checking hashes
Mads Kiilerich <madski@unity3d.com>
parents: 18727
diff changeset
   471
            raise
1e636f7b1cfe largefiles: simplify cachelfiles - don't spend a lot of time checking hashes
Mads Kiilerich <madski@unity3d.com>
parents: 18727
diff changeset
   472
        if not lfutil.findfile(repo, expectedhash):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   473
            toget.append((lfile, expectedhash))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   474
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   475
    if toget:
29355
85868ecf2c0d largefiles: make storefactory._openstore public
liscju <piotr.listkiewicz@gmail.com>
parents: 29341
diff changeset
   476
        store = storefactory.openstore(repo)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   477
        ret = store.get(toget)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   478
        return ret
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   479
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   480
    return ([], [])
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   481
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   482
16691
7d6a660ca151 largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16687
diff changeset
   483
def downloadlfiles(ui, repo, rev=None):
34083
08346a8fa65f cleanup: rename "matchfn" to "match" where obviously a matcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 32375
diff changeset
   484
    match = scmutil.match(repo[None], [repo.wjoin(lfutil.shortname)], {})
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   485
16691
7d6a660ca151 largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16687
diff changeset
   486
    def prepare(ctx, fns):
7d6a660ca151 largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16687
diff changeset
   487
        pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   488
16691
7d6a660ca151 largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16687
diff changeset
   489
    totalsuccess = 0
7d6a660ca151 largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16687
diff changeset
   490
    totalmissing = 0
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   491
    if rev != []:  # walkchangerevs on empty list would return all revs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   492
        for ctx in cmdutil.walkchangerevs(repo, match, {'rev': rev}, prepare):
18722
f0aa8bbffe60 largefiles: fix download of largefiles from an empty list of changesets
Mads Kiilerich <madski@unity3d.com>
parents: 18294
diff changeset
   493
            success, missing = cachelfiles(ui, repo, ctx.node())
f0aa8bbffe60 largefiles: fix download of largefiles from an empty list of changesets
Mads Kiilerich <madski@unity3d.com>
parents: 18294
diff changeset
   494
            totalsuccess += len(success)
f0aa8bbffe60 largefiles: fix download of largefiles from an empty list of changesets
Mads Kiilerich <madski@unity3d.com>
parents: 18294
diff changeset
   495
            totalmissing += len(missing)
16691
7d6a660ca151 largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16687
diff changeset
   496
    ui.status(_("%d additional largefiles cached\n") % totalsuccess)
7d6a660ca151 largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16687
diff changeset
   497
    if totalmissing > 0:
7d6a660ca151 largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16687
diff changeset
   498
        ui.status(_("%d largefiles failed to download\n") % totalmissing)
7d6a660ca151 largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16687
diff changeset
   499
    return totalsuccess, totalmissing
7d6a660ca151 largefiles: refactor downloading of all largefiles to generic function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16687
diff changeset
   500
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   501
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   502
def updatelfiles(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   503
    ui, repo, filelist=None, printmessage=None, normallookup=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   504
):
23189
fb139f5553d6 largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23139
diff changeset
   505
    '''Update largefiles according to standins in the working directory
fb139f5553d6 largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23139
diff changeset
   506
fb139f5553d6 largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23139
diff changeset
   507
    If ``printmessage`` is other than ``None``, it means "print (or
fb139f5553d6 largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23139
diff changeset
   508
    ignore, for false) message forcibly".
fb139f5553d6 largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23139
diff changeset
   509
    '''
fb139f5553d6 largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23139
diff changeset
   510
    statuswriter = lfutil.getstatuswriter(ui, repo, printmessage)
27820
d2e9cc9edc08 with: use context manager for wlock in updatelfiles
Bryan O'Sullivan <bryano@fb.com>
parents: 27774
diff changeset
   511
    with repo.wlock():
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   512
        lfdirstate = lfutil.openlfdirstate(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   513
        lfiles = set(lfutil.listlfiles(repo)) | set(lfdirstate)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   514
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   515
        if filelist is not None:
22197
f72d73937853 largefiles: update lfdirstate for unchanged largefiles during linear merging
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22095
diff changeset
   516
            filelist = set(filelist)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   517
            lfiles = [f for f in lfiles if f in filelist]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   518
20063
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   519
        update = {}
35168
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   520
        dropped = set()
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   521
        updated, removed = 0, 0
28559
30863ca01c6b largefiles: replace invocation of os.path module by vfs in lfcommands.py
liscju <piotr.listkiewicz@gmail.com>
parents: 28464
diff changeset
   522
        wvfs = repo.wvfs
31654
1af4a1641bdb largefiles: avoid redundant changectx looking up at each repetitions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31618
diff changeset
   523
        wctx = repo[None]
20062
452f68738f69 largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 20061
diff changeset
   524
        for lfile in lfiles:
41568
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   525
            lfileorig = os.path.relpath(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   526
                scmutil.backuppath(ui, repo, lfile), start=repo.root
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   527
            )
41568
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   528
            standin = lfutil.standin(lfile)
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   529
            standinorig = os.path.relpath(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   530
                scmutil.backuppath(ui, repo, standin), start=repo.root
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   531
            )
41568
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   532
            if wvfs.exists(standin):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   533
                if wvfs.exists(standinorig) and wvfs.exists(lfile):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   534
                    shutil.copyfile(wvfs.join(lfile), wvfs.join(lfileorig))
41568
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   535
                    wvfs.unlinkpath(standinorig)
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   536
                expecthash = lfutil.readasstandin(wctx[standin])
24788
b8c3a0994b37 largefiles: always consider updatelfiles 'checked' parameter set
Mads Kiilerich <madski@unity3d.com>
parents: 24180
diff changeset
   537
                if expecthash != '':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   538
                    if lfile not in wctx:  # not switched to normal file
41568
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   539
                        if repo.dirstate[standin] != '?':
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   540
                            wvfs.unlinkpath(lfile, ignoremissing=True)
35168
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   541
                        else:
41568
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   542
                            dropped.add(lfile)
35168
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   543
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   544
                    # use normallookup() to allocate an entry in largefiles
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23893
diff changeset
   545
                    # dirstate to prevent lfilesrepo.status() from reporting
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23893
diff changeset
   546
                    # missing files as removed.
20063
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   547
                    lfdirstate.normallookup(lfile)
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   548
                    update[lfile] = expecthash
20062
452f68738f69 largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 20061
diff changeset
   549
            else:
452f68738f69 largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 20061
diff changeset
   550
                # Remove lfiles for which the standin is deleted, unless the
452f68738f69 largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 20061
diff changeset
   551
                # lfile is added to the repository again. This happens when a
452f68738f69 largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 20061
diff changeset
   552
                # largefile is converted back to a normal file: the standin
452f68738f69 largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 20061
diff changeset
   553
                # disappears, but a new (normal) file appears as the lfile.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   554
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   555
                    wvfs.exists(lfile)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   556
                    and repo.dirstate.normalize(lfile) not in wctx
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   557
                ):
41568
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   558
                    wvfs.unlinkpath(lfile)
20062
452f68738f69 largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich <madski@unity3d.com>
parents: 20061
diff changeset
   559
                    removed += 1
20063
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   560
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   561
        # largefile processing might be slow and be interrupted - be prepared
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   562
        lfdirstate.write()
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   563
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   564
        if lfiles:
35168
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   565
            lfiles = [f for f in lfiles if f not in dropped]
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   566
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   567
            for f in dropped:
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   568
                repo.wvfs.unlinkpath(lfutil.standin(f))
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   569
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   570
                # This needs to happen for dropped files, otherwise they stay in
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   571
                # the M state.
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   572
                lfutil.synclfdirstate(repo, lfdirstate, f, normallookup)
b175e54c1103 largefiles: pay attention to dropped standin files when updating largefiles
Matt Harbison <matt_harbison@yahoo.com>
parents: 34756
diff changeset
   573
23189
fb139f5553d6 largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23139
diff changeset
   574
            statuswriter(_('getting changed largefiles\n'))
20063
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   575
            cachelfiles(ui, repo, None, lfiles)
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   576
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   577
        for lfile in lfiles:
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   578
            update1 = 0
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   579
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   580
            expecthash = update.get(lfile)
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   581
            if expecthash:
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   582
                if not lfutil.copyfromcache(repo, expecthash, lfile):
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   583
                    # failed ... but already removed and set to normallookup
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   584
                    continue
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   585
                # Synchronize largefile dirstate to the last modified
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   586
                # time of the file
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   587
                lfdirstate.normal(lfile)
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   588
                update1 = 1
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   589
30269
d71db0e3b7b9 largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents: 30141
diff changeset
   590
            # copy the exec mode of largefile standin from the repository's
20063
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   591
            # dirstate to its state in the lfdirstate.
41568
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   592
            standin = lfutil.standin(lfile)
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   593
            if wvfs.exists(standin):
30269
d71db0e3b7b9 largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents: 30141
diff changeset
   594
                # exec is decided by the users permissions using mask 0o100
41568
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   595
                standinexec = wvfs.stat(standin).st_mode & 0o100
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   596
                st = wvfs.stat(lfile)
30269
d71db0e3b7b9 largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents: 30141
diff changeset
   597
                mode = st.st_mode
d71db0e3b7b9 largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents: 30141
diff changeset
   598
                if standinexec != mode & 0o100:
d71db0e3b7b9 largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents: 30141
diff changeset
   599
                    # first remove all X bits, then shift all R bits to X
d71db0e3b7b9 largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents: 30141
diff changeset
   600
                    mode &= ~0o111
30141
c01acee367ec largefiles: when setting/clearing x bit on largefiles, don't change other bits
Mads Kiilerich <madski@unity3d.com>
parents: 29355
diff changeset
   601
                    if standinexec:
30269
d71db0e3b7b9 largefiles: clarify variable name holding file mode
Mads Kiilerich <madski@unity3d.com>
parents: 30141
diff changeset
   602
                        mode |= (mode >> 2) & 0o111 & ~util.umask
41568
641c8b66a825 largefiles: drop "rel" prefix from filename variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41400
diff changeset
   603
                    wvfs.chmod(lfile, mode)
20063
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   604
                    update1 = 1
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   605
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   606
            updated += update1
8a021cd38719 largefiles: update in two steps, handle interrupted updates better
Mads Kiilerich <madski@unity3d.com>
parents: 20062
diff changeset
   607
22095
cb62d77c7a01 largefiles: factor out synchronization of lfdirstate for future use
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21934
diff changeset
   608
            lfutil.synclfdirstate(repo, lfdirstate, lfile, normallookup)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   609
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   610
        lfdirstate.write()
23189
fb139f5553d6 largefiles: get function to write status messages via "getstatuswriter()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23139
diff changeset
   611
        if lfiles:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   612
            statuswriter(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   613
                _('%d largefiles updated, %d removed\n') % (updated, removed)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   614
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   615
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   616
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   617
@eh.command(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   618
    'lfpull',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   619
    [('r', 'rev', [], _('pull largefiles for these revisions'))]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   620
    + cmdutil.remoteopts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   621
    _('-r REV... [-e CMD] [--remotecmd CMD] [SOURCE]'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   622
)
18976
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   623
def lfpull(ui, repo, source="default", **opts):
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   624
    """pull largefiles for the specified revisions from the specified source
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   625
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   626
    Pull largefiles that are referenced from local changesets but missing
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   627
    locally, pulling from a remote repository to the local cache.
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   628
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   629
    If SOURCE is omitted, the 'default' path will be used.
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   630
    See :hg:`help urls` for more information.
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   631
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   632
    .. container:: verbose
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   633
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   634
      Some examples:
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   635
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   636
      - pull largefiles for all branch heads::
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   637
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   638
          hg lfpull -r "head() and not closed()"
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   639
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   640
      - pull largefiles on the default branch::
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   641
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   642
          hg lfpull -r "branch(default)"
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   643
    """
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   644
    repo.lfpullsource = source
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   645
35348
576ba8194fa8 py3: handle keyword arguments correctly in hgext/largefiles/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35186
diff changeset
   646
    revs = opts.get(r'rev', [])
18976
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   647
    if not revs:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
   648
        raise error.Abort(_('no revisions specified'))
18976
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   649
    revs = scmutil.revrange(repo, revs)
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   650
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   651
    numcached = 0
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   652
    for rev in revs:
37743
25136e03012e lfcommands: use %d on known-int in format string
Augie Fackler <augie@google.com>
parents: 36311
diff changeset
   653
        ui.note(_('pulling largefiles for revision %d\n') % rev)
18976
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   654
        (cached, missing) = cachelfiles(ui, repo, rev)
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   655
        numcached += len(cached)
6734951e2d24 largefiles: introduce lfpull command for pulling missing largefiles
Mads Kiilerich <madski@unity3d.com>
parents: 18974
diff changeset
   656
    ui.status(_("%d largefiles cached\n") % numcached)
35563
4aa6ed598323 largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents: 35400
diff changeset
   657
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   658
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41775
diff changeset
   659
@eh.command('debuglfput', [] + cmdutil.remoteopts, _('FILE'))
35563
4aa6ed598323 largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents: 35400
diff changeset
   660
def debuglfput(ui, repo, filepath, **kwargs):
4aa6ed598323 largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents: 35400
diff changeset
   661
    hash = lfutil.hashfile(filepath)
4aa6ed598323 largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents: 35400
diff changeset
   662
    storefactory.openstore(repo).put(filepath, hash)
4aa6ed598323 largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents: 35400
diff changeset
   663
    ui.write('%s\n' % hash)
4aa6ed598323 largefiles: add a 'debuglfput' command to put largefile into the store
Boris Feld <boris.feld@octobus.net>
parents: 35400
diff changeset
   664
    return 0