hgext/largefiles/overrides.py
author Na'Tosha Bard <natosha@unity3d.com>
Mon, 16 Apr 2012 17:03:39 +0200
changeset 16439 290850e7aa43
parent 16248 51e6f318bdf1
child 16449 874a680a3e23
permissions -rw-r--r--
largefiles: fix cat for largefiles (issue3352) This is a fix to largefiles so that 'hg cat' will work correctly when a largefile is specified. As per discussion on Issue 3352: 1) The file will be printed regardless if it is binary or large. 2) The file is downloaded if it is not readily available (not found in the system cache), so that it can be printed. If the download fails, then we abort.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     1
# Copyright 2009-2010 Gregory P. Ward
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     2
# Copyright 2009-2010 Intelerad Medical Systems Incorporated
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     3
# Copyright 2010-2011 Fog Creek Software
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     4
# Copyright 2010-2011 Unity Technologies
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     5
#
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     8
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     9
'''Overridden Mercurial commands and functions for the largefiles extension'''
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    10
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    11
import os
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    12
import copy
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    13
15305
683f417fa538 largefiles: tidy imports
Greg Ward <greg@gerg.ca>
parents: 15294
diff changeset
    14
from mercurial import hg, commands, util, cmdutil, scmutil, match as match_, \
683f417fa538 largefiles: tidy imports
Greg Ward <greg@gerg.ca>
parents: 15294
diff changeset
    15
    node, archival, error, merge
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    16
from mercurial.i18n import _
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    17
from mercurial.node import hex
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    18
from hgext import rebase
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    19
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    20
import lfutil
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    21
import lfcommands
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    22
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
    23
# -- Utility functions: commonly/repeatedly needed functionality ---------------
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
    24
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    25
def installnormalfilesmatchfn(manifest):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    26
    '''overrides scmutil.match so that the matcher it returns will ignore all
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    27
    largefiles'''
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    28
    oldmatch = None # for the closure
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
    29
    def overridematch(ctx, pats=[], opts={}, globbed=False,
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    30
            default='relpath'):
15306
94527d67f3da largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents: 15305
diff changeset
    31
        match = oldmatch(ctx, pats, opts, globbed, default)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    32
        m = copy.copy(match)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    33
        notlfile = lambda f: not (lfutil.isstandin(f) or lfutil.standin(f) in
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    34
                manifest)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    35
        m._files = filter(notlfile, m._files)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    36
        m._fmap = set(m._files)
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
    37
        origmatchfn = m.matchfn
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
    38
        m.matchfn = lambda f: notlfile(f) and origmatchfn(f) or None
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    39
        return m
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
    40
    oldmatch = installmatchfn(overridematch)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    41
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    42
def installmatchfn(f):
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
    43
    oldmatch = scmutil.match
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    44
    setattr(f, 'oldmatch', oldmatch)
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
    45
    scmutil.match = f
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    46
    return oldmatch
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    47
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    48
def restorematchfn():
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    49
    '''restores scmutil.match to what it was before installnormalfilesmatchfn
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    50
    was called.  no-op if scmutil.match is its original function.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    51
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    52
    Note that n calls to installnormalfilesmatchfn will require n calls to
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    53
    restore matchfn to reverse'''
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
    54
    scmutil.match = getattr(scmutil.match, 'oldmatch', scmutil.match)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    55
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
    56
def addlargefiles(ui, repo, *pats, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    57
    large = opts.pop('large', None)
15227
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15224
diff changeset
    58
    lfsize = lfutil.getminsize(
a7686abf73a6 largefiles: factor out lfutil.getminsize()
Greg Ward <greg@gerg.ca>
parents: 15224
diff changeset
    59
        ui, lfutil.islfilesrepo(repo), opts.pop('lfsize', None))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    60
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    61
    lfmatcher = None
15739
be55285470cf largefiles: tiny code clean up
Michal Sznajder <michalsznajder@gmail.com>
parents: 15674
diff changeset
    62
    if lfutil.islfilesrepo(repo):
15229
89e19ca2a90e largefiles: use ui.configlist() to split largefiles.patterns
Greg Ward <greg@gerg.ca>
parents: 15227
diff changeset
    63
        lfpats = ui.configlist(lfutil.longname, 'patterns', default=[])
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    64
        if lfpats:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    65
            lfmatcher = match_.match(repo.root, '', list(lfpats))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    66
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    67
    lfnames = []
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
    68
    m = scmutil.match(repo[None], pats, opts)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    69
    m.bad = lambda x, y: None
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    70
    wctx = repo[None]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    71
    for f in repo.walk(m):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    72
        exact = m.exact(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    73
        lfile = lfutil.standin(f) in wctx
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    74
        nfile = f in wctx
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    75
        exists = lfile or nfile
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    76
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    77
        # Don't warn the user when they attempt to add a normal tracked file.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    78
        # The normal add code will do that for us.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    79
        if exact and exists:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    80
            if lfile:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    81
                ui.warn(_('%s already a largefile\n') % f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    82
            continue
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    83
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    84
        if exact or not exists:
15255
7ab05d752405 largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents: 15254
diff changeset
    85
            abovemin = (lfsize and
15369
b4ea79f88268 largefiles: bugfix for symlink handling with testcase
Eli Carter <eli.carter@tektronix.com>
parents: 15323
diff changeset
    86
                        os.lstat(repo.wjoin(f)).st_size >= lfsize * 1024 * 1024)
15255
7ab05d752405 largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents: 15254
diff changeset
    87
            if large or abovemin or (lfmatcher and lfmatcher(f)):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    88
                lfnames.append(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    89
                if ui.verbose or not exact:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    90
                    ui.status(_('adding %s as a largefile\n') % m.rel(f))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    91
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    92
    bad = []
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    93
    standins = []
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    94
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
    95
    # Need to lock, otherwise there could be a race condition between
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
    96
    # when standins are created and added to the repo.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    97
    wlock = repo.wlock()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    98
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    99
        if not opts.get('dry_run'):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   100
            lfdirstate = lfutil.openlfdirstate(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   101
            for f in lfnames:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   102
                standinname = lfutil.standin(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   103
                lfutil.writestandin(repo, standinname, hash='',
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   104
                    executable=lfutil.getexecutable(repo.wjoin(f)))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   105
                standins.append(standinname)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   106
                if lfdirstate[f] == 'r':
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   107
                    lfdirstate.normallookup(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   108
                else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   109
                    lfdirstate.add(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   110
            lfdirstate.write()
15255
7ab05d752405 largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents: 15254
diff changeset
   111
            bad += [lfutil.splitstandin(f)
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   112
                    for f in lfutil.repoadd(repo, standins)
15255
7ab05d752405 largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents: 15254
diff changeset
   113
                    if f in m.files()]
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   114
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   115
        wlock.release()
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   116
    return bad
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   117
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   118
def removelargefiles(ui, repo, *pats, **opts):
15786
aca0f2b3c7e3 largefiles: fix confusion upon removal of added largefile (issue3176)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15663
diff changeset
   119
    after = opts.get('after')
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   120
    if not pats and not after:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   121
        raise util.Abort(_('no files specified'))
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   122
    m = scmutil.match(repo[None], pats, opts)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   123
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   124
        repo.lfstatus = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   125
        s = repo.status(match=m, clean=True)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   126
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   127
        repo.lfstatus = False
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   128
    manifest = repo[None].manifest()
15255
7ab05d752405 largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents: 15254
diff changeset
   129
    modified, added, deleted, clean = [[f for f in list
7ab05d752405 largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents: 15254
diff changeset
   130
                                        if lfutil.standin(f) in manifest]
7ab05d752405 largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents: 15254
diff changeset
   131
                                       for list in [s[0], s[1], s[3], s[6]]]
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   132
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   133
    def warn(files, reason):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   134
        for f in files:
15786
aca0f2b3c7e3 largefiles: fix confusion upon removal of added largefile (issue3176)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15663
diff changeset
   135
            ui.warn(_('not removing %s: %s (use forget to undo)\n')
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   136
                    % (m.rel(f), reason))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   137
15786
aca0f2b3c7e3 largefiles: fix confusion upon removal of added largefile (issue3176)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15663
diff changeset
   138
    if after:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   139
        remove, forget = deleted, []
15294
db7b09e689f1 largefiles: make parameter more i18n-friendly
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15279
diff changeset
   140
        warn(modified + added + clean, _('file still exists'))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   141
    else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   142
        remove, forget = deleted + clean, []
15294
db7b09e689f1 largefiles: make parameter more i18n-friendly
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15279
diff changeset
   143
        warn(modified, _('file is modified'))
db7b09e689f1 largefiles: make parameter more i18n-friendly
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15279
diff changeset
   144
        warn(added, _('file has been marked for add'))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   145
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   146
    for f in sorted(remove + forget):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   147
        if ui.verbose or not m.exact(f):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   148
            ui.status(_('removing %s\n') % m.rel(f))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   149
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   150
    # Need to lock because standin files are deleted then removed from the
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   151
    # repository and we could race inbetween.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   152
    wlock = repo.wlock()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   153
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   154
        lfdirstate = lfutil.openlfdirstate(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   155
        for f in remove:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   156
            if not after:
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   157
                # If this is being called by addremove, notify the user that we
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   158
                # are removing the file.
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   159
                if getattr(repo, "_isaddremove", False):
16231
ce292f1379ba i18n: fix all remaining uses of % inside _()
Matt Mackall <mpm@selenic.com>
parents: 16103
diff changeset
   160
                    ui.status(_('removing %s\n') % f)
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   161
                if os.path.exists(repo.wjoin(f)):
15930
2dc599583ebe largefiles: test and simplify empty directory removal in remove
Patrick Mezard <pmezard@gmail.com>
parents: 15916
diff changeset
   162
                    util.unlinkpath(repo.wjoin(f))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   163
            lfdirstate.remove(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   164
        lfdirstate.write()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   165
        forget = [lfutil.standin(f) for f in forget]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   166
        remove = [lfutil.standin(f) for f in remove]
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   167
        lfutil.repoforget(repo, forget)
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   168
        # If this is being called by addremove, let the original addremove
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   169
        # function handle this.
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   170
        if not getattr(repo, "_isaddremove", False):
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   171
            lfutil.reporemove(repo, remove, unlink=True)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   172
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   173
        wlock.release()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   174
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   175
# -- Wrappers: modify existing commands --------------------------------
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   176
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   177
# Add works by going through the files that the user wanted to add and
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   178
# checking if they should be added as largefiles. Then it makes a new
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   179
# matcher which matches only the normal files and runs the original
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   180
# version of add.
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   181
def overrideadd(orig, ui, repo, *pats, **opts):
15944
f19d5c852f9b largefiles: add --normal option to hg add (issue3061)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15930
diff changeset
   182
    normal = opts.pop('normal')
f19d5c852f9b largefiles: add --normal option to hg add (issue3061)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15930
diff changeset
   183
    if normal:
f19d5c852f9b largefiles: add --normal option to hg add (issue3061)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15930
diff changeset
   184
        if opts.get('large'):
f19d5c852f9b largefiles: add --normal option to hg add (issue3061)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15930
diff changeset
   185
            raise util.Abort(_('--normal cannot be used with --large'))
f19d5c852f9b largefiles: add --normal option to hg add (issue3061)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15930
diff changeset
   186
        return orig(ui, repo, *pats, **opts)
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   187
    bad = addlargefiles(ui, repo, *pats, **opts)
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   188
    installnormalfilesmatchfn(repo[None].manifest())
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   189
    result = orig(ui, repo, *pats, **opts)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   190
    restorematchfn()
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   191
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   192
    return (result == 1 or bad) and 1 or 0
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   193
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   194
def overrideremove(orig, ui, repo, *pats, **opts):
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   195
    installnormalfilesmatchfn(repo[None].manifest())
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   196
    orig(ui, repo, *pats, **opts)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   197
    restorematchfn()
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   198
    removelargefiles(ui, repo, *pats, **opts)
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   199
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   200
def overridestatus(orig, ui, repo, *pats, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   201
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   202
        repo.lfstatus = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   203
        return orig(ui, repo, *pats, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   204
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   205
        repo.lfstatus = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   206
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   207
def overridelog(orig, ui, repo, *pats, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   208
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   209
        repo.lfstatus = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   210
        orig(ui, repo, *pats, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   211
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   212
        repo.lfstatus = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   213
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   214
def overrideverify(orig, ui, repo, *pats, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   215
    large = opts.pop('large', False)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   216
    all = opts.pop('lfa', False)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   217
    contents = opts.pop('lfc', False)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   218
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   219
    result = orig(ui, repo, *pats, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   220
    if large:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   221
        result = result or lfcommands.verifylfiles(ui, repo, all, contents)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   222
    return result
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   223
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   224
# Override needs to refresh standins so that update's normal merge
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   225
# will go through properly. Then the other update hook (overriding repo.update)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   226
# will get the new files. Filemerge is also overriden so that the merge
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   227
# will merge standins correctly.
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   228
def overrideupdate(orig, ui, repo, *pats, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   229
    lfdirstate = lfutil.openlfdirstate(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   230
    s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   231
        False, False)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   232
    (unsure, modified, added, removed, missing, unknown, ignored, clean) = s
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   233
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
   234
    # Need to lock between the standins getting updated and their
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
   235
    # largefiles getting updated
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   236
    wlock = repo.wlock()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   237
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   238
        if opts['check']:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   239
            mod = len(modified) > 0
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   240
            for lfile in unsure:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   241
                standin = lfutil.standin(lfile)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   242
                if repo['.'][standin].data().strip() != \
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   243
                        lfutil.hashfile(repo.wjoin(lfile)):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   244
                    mod = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   245
                else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   246
                    lfdirstate.normal(lfile)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   247
            lfdirstate.write()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   248
            if mod:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   249
                raise util.Abort(_('uncommitted local changes'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   250
        # XXX handle removed differently
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   251
        if not opts['clean']:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   252
            for lfile in unsure + modified + added:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   253
                lfutil.updatestandin(repo, lfutil.standin(lfile))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   254
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   255
        wlock.release()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   256
    return orig(ui, repo, *pats, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   257
15663
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   258
# Before starting the manifest merge, merge.updates will call
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   259
# _checkunknown to check if there are any files in the merged-in
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   260
# changeset that collide with unknown files in the working copy.
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   261
#
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   262
# The largefiles are seen as unknown, so this prevents us from merging
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   263
# in a file 'foo' if we already have a largefile with the same name.
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   264
#
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   265
# The overridden function filters the unknown files by removing any
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   266
# largefiles. This makes the merge proceed and we can then handle this
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   267
# case further in the overridden manifestmerge function below.
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   268
def overridecheckunknownfile(origfn, repo, wctx, mctx, f):
16093
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16075
diff changeset
   269
    if lfutil.standin(f) in wctx:
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16075
diff changeset
   270
        return False
7e30f5f2285f merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents: 16075
diff changeset
   271
    return origfn(repo, wctx, mctx, f)
15663
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   272
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   273
# The manifest merge handles conflicts on the manifest level. We want
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   274
# to handle changes in largefile-ness of files at this level too.
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   275
#
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   276
# The strategy is to run the original manifestmerge and then process
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   277
# the action list it outputs. There are two cases we need to deal with:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   278
#
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   279
# 1. Normal file in p1, largefile in p2. Here the largefile is
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   280
#    detected via its standin file, which will enter the working copy
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   281
#    with a "get" action. It is not "merge" since the standin is all
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   282
#    Mercurial is concerned with at this level -- the link to the
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   283
#    existing normal file is not relevant here.
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   284
#
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   285
# 2. Largefile in p1, normal file in p2. Here we get a "merge" action
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   286
#    since the largefile will be present in the working copy and
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   287
#    different from the normal file in p2. Mercurial therefore
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   288
#    triggers a merge action.
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   289
#
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   290
# In both cases, we prompt the user and emit new actions to either
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   291
# remove the standin (if the normal file was kept) or to remove the
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   292
# normal file and get the standin (if the largefile was kept). The
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   293
# default prompt answer is to use the largefile version since it was
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   294
# presumably changed on purpose.
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   295
#
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   296
# Finally, the merge.applyupdates function will then take care of
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   297
# writing the files into the working copy and lfcommands.updatelfiles
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   298
# will update the largefiles.
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   299
def overridemanifestmerge(origfn, repo, p1, p2, pa, overwrite, partial):
15663
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   300
    actions = origfn(repo, p1, p2, pa, overwrite, partial)
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   301
    processed = []
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   302
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   303
    for action in actions:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   304
        if overwrite:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   305
            processed.append(action)
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   306
            continue
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   307
        f, m = action[:2]
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   308
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   309
        choices = (_('&Largefile'), _('&Normal file'))
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   310
        if m == "g" and lfutil.splitstandin(f) in p1 and f in p2:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   311
            # Case 1: normal file in the working copy, largefile in
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   312
            # the second parent
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   313
            lfile = lfutil.splitstandin(f)
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   314
            standin = f
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   315
            msg = _('%s has been turned into a largefile\n'
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   316
                    'use (l)argefile or keep as (n)ormal file?') % lfile
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   317
            if repo.ui.promptchoice(msg, choices, 0) == 0:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   318
                processed.append((lfile, "r"))
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   319
                processed.append((standin, "g", p2.flags(standin)))
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   320
            else:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   321
                processed.append((standin, "r"))
16094
0776a6cababe merge: don't use unknown()
Matt Mackall <mpm@selenic.com>
parents: 16093
diff changeset
   322
        elif m == "g" and lfutil.standin(f) in p1 and f in p2:
15663
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   323
            # Case 2: largefile in the working copy, normal file in
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   324
            # the second parent
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   325
            standin = lfutil.standin(f)
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   326
            lfile = f
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   327
            msg = _('%s has been turned into a normal file\n'
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   328
                    'keep as (l)argefile or use (n)ormal file?') % lfile
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   329
            if repo.ui.promptchoice(msg, choices, 0) == 0:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   330
                processed.append((lfile, "r"))
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   331
            else:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   332
                processed.append((standin, "r"))
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   333
                processed.append((lfile, "g", p2.flags(lfile)))
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   334
        else:
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   335
            processed.append(action)
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   336
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   337
    return processed
9036c7d106bf largefiles: handle merges between normal files and largefiles (issue3084)
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   338
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
   339
# Override filemerge to prompt the user about how they wish to merge
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
   340
# largefiles. This will handle identical edits, and copy/rename +
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
   341
# edit without prompting the user.
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   342
def overridefilemerge(origfn, repo, mynode, orig, fcd, fco, fca):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   343
    # Use better variable names here. Because this is a wrapper we cannot
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   344
    # change the variable names in the function declaration.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   345
    fcdest, fcother, fcancestor = fcd, fco, fca
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   346
    if not lfutil.isstandin(orig):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   347
        return origfn(repo, mynode, orig, fcdest, fcother, fcancestor)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   348
    else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   349
        if not fcother.cmp(fcdest): # files identical?
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   350
            return None
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   351
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   352
        # backwards, use working dir parent as ancestor
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   353
        if fcancestor == fcother:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   354
            fcancestor = fcdest.parents()[0]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   355
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   356
        if orig != fcother.path():
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   357
            repo.ui.status(_('merging %s and %s to %s\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   358
                           % (lfutil.splitstandin(orig),
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   359
                              lfutil.splitstandin(fcother.path()),
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   360
                              lfutil.splitstandin(fcdest.path())))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   361
        else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   362
            repo.ui.status(_('merging %s\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   363
                           % lfutil.splitstandin(fcdest.path()))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   364
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   365
        if fcancestor.path() != fcother.path() and fcother.data() == \
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   366
                fcancestor.data():
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   367
            return 0
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   368
        if fcancestor.path() != fcdest.path() and fcdest.data() == \
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   369
                fcancestor.data():
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   370
            repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   371
            return 0
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   372
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   373
        if repo.ui.promptchoice(_('largefile %s has a merge conflict\n'
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   374
                             'keep (l)ocal or take (o)ther?') %
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   375
                             lfutil.splitstandin(orig),
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   376
                             (_('&Local'), _('&Other')), 0) == 0:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   377
            return 0
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   378
        else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   379
            repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   380
            return 0
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   381
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
   382
# Copy first changes the matchers to match standins instead of
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
   383
# largefiles.  Then it overrides util.copyfile in that function it
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
   384
# checks if the destination largefile already exists. It also keeps a
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
   385
# list of copied files so that the largefiles can be copied and the
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
   386
# dirstate updated.
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   387
def overridecopy(orig, ui, repo, pats, opts, rename=False):
15252
6e809bb4f969 largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents: 15229
diff changeset
   388
    # doesn't remove largefile on rename
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   389
    if len(pats) < 2:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   390
        # this isn't legal, let the original function deal with it
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   391
        return orig(ui, repo, pats, opts, rename)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   392
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   393
    def makestandin(relpath):
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   394
        path = scmutil.canonpath(repo.root, repo.getcwd(), relpath)
15323
19368c54a774 largefiles: remove all uses of os.path.relpath for 2.4 compatibility
Benjamin Pollack <benjamin@bitquabit.com>
parents: 15306
diff changeset
   395
        return os.path.join(repo.wjoin(lfutil.standin(path)))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   396
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   397
    fullpats = scmutil.expandpats(pats)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   398
    dest = fullpats[-1]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   399
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   400
    if os.path.isdir(dest):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   401
        if not os.path.isdir(makestandin(dest)):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   402
            os.makedirs(makestandin(dest))
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   403
    # This could copy both lfiles and normal files in one command,
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   404
    # but we don't want to do that. First replace their matcher to
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   405
    # only match normal files and run it, then replace it to just
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   406
    # match largefiles and run it again.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   407
    nonormalfiles = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   408
    nolfiles = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   409
    try:
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   410
        try:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   411
            installnormalfilesmatchfn(repo[None].manifest())
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   412
            result = orig(ui, repo, pats, opts, rename)
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   413
        except util.Abort, e:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   414
            if str(e) != 'no files to copy':
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   415
                raise e
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   416
            else:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   417
                nonormalfiles = True
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   418
            result = 0
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   419
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   420
        restorematchfn()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   421
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   422
    # The first rename can cause our current working directory to be removed.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   423
    # In that case there is nothing left to copy/rename so just quit.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   424
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   425
        repo.getcwd()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   426
    except OSError:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   427
        return result
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   428
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   429
    try:
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   430
        try:
16248
51e6f318bdf1 largefiles: fix check-code errors.
Na'Tosha Bard <natosha@unity3d.com>
parents: 16247
diff changeset
   431
            # When we call orig below it creates the standins but we don't add
51e6f318bdf1 largefiles: fix check-code errors.
Na'Tosha Bard <natosha@unity3d.com>
parents: 16247
diff changeset
   432
            # them to the dir state until later so lock during that time.
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   433
            wlock = repo.wlock()
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   434
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   435
            manifest = repo[None].manifest()
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   436
            oldmatch = None # for the closure
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   437
            def overridematch(ctx, pats=[], opts={}, globbed=False,
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   438
                    default='relpath'):
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   439
                newpats = []
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   440
                # The patterns were previously mangled to add the standin
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   441
                # directory; we need to remove that now
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   442
                for pat in pats:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   443
                    if match_.patkind(pat) is None and lfutil.shortname in pat:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   444
                        newpats.append(pat.replace(lfutil.shortname, ''))
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   445
                    else:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   446
                        newpats.append(pat)
15306
94527d67f3da largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents: 15305
diff changeset
   447
                match = oldmatch(ctx, newpats, opts, globbed, default)
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   448
                m = copy.copy(match)
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   449
                lfile = lambda f: lfutil.standin(f) in manifest
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   450
                m._files = [lfutil.standin(f) for f in m._files if lfile(f)]
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   451
                m._fmap = set(m._files)
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   452
                origmatchfn = m.matchfn
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   453
                m.matchfn = lambda f: (lfutil.isstandin(f) and
16075
d2e8e79a6361 largefiles: reduce redundant splitstandin/standin combination
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16074
diff changeset
   454
                                    (f in manifest) and
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   455
                                    origmatchfn(lfutil.splitstandin(f)) or
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   456
                                    None)
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   457
                return m
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   458
            oldmatch = installmatchfn(overridematch)
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   459
            listpats = []
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   460
            for pat in pats:
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   461
                if match_.patkind(pat) is not None:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   462
                    listpats.append(pat)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   463
                else:
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   464
                    listpats.append(makestandin(pat))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   465
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   466
            try:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   467
                origcopyfile = util.copyfile
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   468
                copiedfiles = []
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   469
                def overridecopyfile(src, dest):
15598
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
   470
                    if (lfutil.shortname in src and
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
   471
                        dest.startswith(repo.wjoin(lfutil.shortname))):
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   472
                        destlfile = dest.replace(lfutil.shortname, '')
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   473
                        if not opts['force'] and os.path.exists(destlfile):
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   474
                            raise IOError('',
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   475
                                _('destination largefile already exists'))
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   476
                    copiedfiles.append((src, dest))
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   477
                    origcopyfile(src, dest)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   478
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   479
                util.copyfile = overridecopyfile
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   480
                result += orig(ui, repo, listpats, opts, rename)
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   481
            finally:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   482
                util.copyfile = origcopyfile
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   483
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   484
            lfdirstate = lfutil.openlfdirstate(ui, repo)
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   485
            for (src, dest) in copiedfiles:
15598
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
   486
                if (lfutil.shortname in src and
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
   487
                    dest.startswith(repo.wjoin(lfutil.shortname))):
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
   488
                    srclfile = src.replace(repo.wjoin(lfutil.standin('')), '')
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
   489
                    destlfile = dest.replace(repo.wjoin(lfutil.standin('')), '')
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   490
                    destlfiledir = os.path.dirname(destlfile) or '.'
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   491
                    if not os.path.isdir(destlfiledir):
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   492
                        os.makedirs(destlfiledir)
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   493
                    if rename:
15598
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
   494
                        os.rename(repo.wjoin(srclfile), repo.wjoin(destlfile))
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
   495
                        lfdirstate.remove(srclfile)
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   496
                    else:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   497
                        util.copyfile(srclfile, destlfile)
15598
a77ce45584ef largefiles: fix rename (issue3093)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15576
diff changeset
   498
                    lfdirstate.add(destlfile)
15279
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   499
            lfdirstate.write()
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   500
        except util.Abort, e:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   501
            if str(e) != 'no files to copy':
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   502
                raise e
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   503
            else:
018608160299 largefiles: use separate try/except and try/finally as needed for python2.4
Thomas Arendsen Hein <thomas@intevation.de>
parents: 15255
diff changeset
   504
                nolfiles = True
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   505
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   506
        restorematchfn()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   507
        wlock.release()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   508
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   509
    if nolfiles and nonormalfiles:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   510
        raise util.Abort(_('no files to copy'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   511
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   512
    return result
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   513
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   514
# When the user calls revert, we have to be careful to not revert any
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   515
# changes to other largefiles accidentally. This means we have to keep
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   516
# track of the largefiles that are being reverted so we only pull down
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   517
# the necessary largefiles.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   518
#
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   519
# Standins are only updated (to match the hash of largefiles) before
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   520
# commits. Update the standins then run the original revert, changing
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   521
# the matcher to hit standins instead of largefiles. Based on the
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   522
# resulting standins update the largefiles. Then return the standins
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   523
# to their proper state
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   524
def overriderevert(orig, ui, repo, *pats, **opts):
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   525
    # Because we put the standins in a bad state (by updating them)
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   526
    # and then return them to a correct state we need to lock to
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   527
    # prevent others from changing them in their incorrect state.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   528
    wlock = repo.wlock()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   529
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   530
        lfdirstate = lfutil.openlfdirstate(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   531
        (modified, added, removed, missing, unknown, ignored, clean) = \
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   532
            lfutil.lfdirstatestatus(lfdirstate, repo, repo['.'].rev())
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   533
        for lfile in modified:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   534
            lfutil.updatestandin(repo, lfutil.standin(lfile))
15983
32b9aee3602c largefiles: fix revert on missing largefile (issue3217)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15982
diff changeset
   535
        for lfile in missing:
32b9aee3602c largefiles: fix revert on missing largefile (issue3217)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15982
diff changeset
   536
            os.unlink(repo.wjoin(lfutil.standin(lfile)))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   537
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   538
        try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   539
            ctx = repo[opts.get('rev')]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   540
            oldmatch = None # for the closure
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   541
            def overridematch(ctx, pats=[], opts={}, globbed=False,
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   542
                    default='relpath'):
15306
94527d67f3da largefiles: fix some badly named function parameters
Greg Ward <greg@gerg.ca>
parents: 15305
diff changeset
   543
                match = oldmatch(ctx, pats, opts, globbed, default)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   544
                m = copy.copy(match)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   545
                def tostandin(f):
16074
67a5bc8aeb1d largefiles: reduce OR-ing of same conditions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15983
diff changeset
   546
                    if lfutil.standin(f) in ctx:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   547
                        return lfutil.standin(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   548
                    elif lfutil.standin(f) in repo[None]:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   549
                        return None
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   550
                    return f
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   551
                m._files = [tostandin(f) for f in m._files]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   552
                m._files = [f for f in m._files if f is not None]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   553
                m._fmap = set(m._files)
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   554
                origmatchfn = m.matchfn
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   555
                def matchfn(f):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   556
                    if lfutil.isstandin(f):
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   557
                        # We need to keep track of what largefiles are being
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   558
                        # matched so we know which ones to update later --
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   559
                        # otherwise we accidentally revert changes to other
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   560
                        # largefiles. This is repo-specific, so duckpunch the
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   561
                        # repo object to keep the list of largefiles for us
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   562
                        # later.
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   563
                        if origmatchfn(lfutil.splitstandin(f)) and \
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   564
                                (f in repo[None] or f in ctx):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   565
                            lfileslist = getattr(repo, '_lfilestoupdate', [])
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   566
                            lfileslist.append(lfutil.splitstandin(f))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   567
                            repo._lfilestoupdate = lfileslist
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   568
                            return True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   569
                        else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   570
                            return False
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   571
                    return origmatchfn(f)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   572
                m.matchfn = matchfn
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   573
                return m
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   574
            oldmatch = installmatchfn(overridematch)
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   575
            scmutil.match
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   576
            matches = overridematch(repo[None], pats, opts)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   577
            orig(ui, repo, *pats, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   578
        finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   579
            restorematchfn()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   580
        lfileslist = getattr(repo, '_lfilestoupdate', [])
15170
c1a4a3220711 largefiles: fix over-long lines
Matt Mackall <mpm@selenic.com>
parents: 15169
diff changeset
   581
        lfcommands.updatelfiles(ui, repo, filelist=lfileslist,
c1a4a3220711 largefiles: fix over-long lines
Matt Mackall <mpm@selenic.com>
parents: 15169
diff changeset
   582
                                printmessage=False)
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   583
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   584
        # empty out the largefiles list so we start fresh next time
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   585
        repo._lfilestoupdate = []
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   586
        for lfile in modified:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   587
            if lfile in lfileslist:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   588
                if os.path.exists(repo.wjoin(lfutil.standin(lfile))) and lfile\
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   589
                        in repo['.']:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   590
                    lfutil.writestandin(repo, lfutil.standin(lfile),
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   591
                        repo['.'][lfile].data().strip(),
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   592
                        'x' in repo['.'][lfile].flags())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   593
        lfdirstate = lfutil.openlfdirstate(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   594
        for lfile in added:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   595
            standin = lfutil.standin(lfile)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   596
            if standin not in ctx and (standin in matches or opts.get('all')):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   597
                if lfile in lfdirstate:
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   598
                    lfdirstate.drop(lfile)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   599
                util.unlinkpath(repo.wjoin(standin))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   600
        lfdirstate.write()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   601
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   602
        wlock.release()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   603
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   604
def hgupdate(orig, repo, node):
16245
a18ad914aa21 largefiles: move calculation of largefiles for updating to utility function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16232
diff changeset
   605
    # Only call updatelfiles the standins that have changed to save time
16120
47ee41fcf42b largefiles: optimize update speed by only updating changed largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents: 16109
diff changeset
   606
    oldstandins = lfutil.getstandinsstate(repo)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   607
    result = orig(repo, node)
16120
47ee41fcf42b largefiles: optimize update speed by only updating changed largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents: 16109
diff changeset
   608
    newstandins = lfutil.getstandinsstate(repo)
16245
a18ad914aa21 largefiles: move calculation of largefiles for updating to utility function
Na'Tosha Bard <natosha@unity3d.com>
parents: 16232
diff changeset
   609
    filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
16120
47ee41fcf42b largefiles: optimize update speed by only updating changed largefiles
Na'Tosha Bard <natosha@unity3d.com>
parents: 16109
diff changeset
   610
    lfcommands.updatelfiles(repo.ui, repo, filelist=filelist, printmessage=True)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   611
    return result
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   612
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   613
def hgclean(orig, repo, node, show_stats=True):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   614
    result = orig(repo, node, show_stats)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   615
    lfcommands.updatelfiles(repo.ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   616
    return result
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   617
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   618
def hgmerge(orig, repo, node, force=None, remind=True):
15860
3ecce805ac13 largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents: 15794
diff changeset
   619
    # Mark the repo as being in the middle of a merge, so that
3ecce805ac13 largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents: 15794
diff changeset
   620
    # updatelfiles() will know that it needs to trust the standins in
3ecce805ac13 largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents: 15794
diff changeset
   621
    # the working copy, not in the standins in the current node
3ecce805ac13 largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents: 15794
diff changeset
   622
    repo._ismerging = True
3ecce805ac13 largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents: 15794
diff changeset
   623
    try:
3ecce805ac13 largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents: 15794
diff changeset
   624
        result = orig(repo, node, force, remind)
3ecce805ac13 largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents: 15794
diff changeset
   625
        lfcommands.updatelfiles(repo.ui, repo)
3ecce805ac13 largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents: 15794
diff changeset
   626
    finally:
3ecce805ac13 largefiles: correctly download new largefiles when merging
Na'Tosha Bard <natosha@unity3d.com>
parents: 15794
diff changeset
   627
        repo._ismerging = False
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   628
    return result
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   629
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   630
# When we rebase a repository with remotely changed largefiles, we need to
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   631
# take some extra care so that the largefiles are correctly updated in the
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   632
# working copy
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   633
def overridepull(orig, ui, repo, source=None, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   634
    if opts.get('rebase', False):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   635
        repo._isrebasing = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   636
        try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   637
            if opts.get('update'):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   638
                 del opts['update']
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   639
                 ui.debug('--update and --rebase are not compatible, ignoring '
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   640
                          'the update flag\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   641
            del opts['rebase']
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   642
            cmdutil.bailifchanged(repo)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   643
            revsprepull = len(repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   644
            origpostincoming = commands.postincoming
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   645
            def _dummy(*args, **kwargs):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   646
                pass
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   647
            commands.postincoming = _dummy
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   648
            repo.lfpullsource = source
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   649
            if not source:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   650
                source = 'default'
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   651
            try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   652
                result = commands.pull(ui, repo, source, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   653
            finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   654
                commands.postincoming = origpostincoming
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   655
            revspostpull = len(repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   656
            if revspostpull > revsprepull:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   657
                result = result or rebase.rebase(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   658
        finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   659
            repo._isrebasing = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   660
    else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   661
        repo.lfpullsource = source
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   662
        if not source:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   663
            source = 'default'
16103
3e1efb458e8b largefiles: only cache largefiles in new heads
Na'Tosha Bard <natosha@unity3d.com>
parents: 15983
diff changeset
   664
        oldheads = lfutil.getcurrentheads(repo)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   665
        result = orig(ui, repo, source, **opts)
15916
c96148346af8 largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents: 15914
diff changeset
   666
        # If we do not have the new largefiles for any new heads we pulled, we
c96148346af8 largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents: 15914
diff changeset
   667
        # will run into a problem later if we try to merge or rebase with one of
c96148346af8 largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents: 15914
diff changeset
   668
        # these heads, so cache the largefiles now direclty into the system
c96148346af8 largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents: 15914
diff changeset
   669
        # cache.
c96148346af8 largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents: 15914
diff changeset
   670
        ui.status(_("caching new largefiles\n"))
c96148346af8 largefiles: cache new largefiles for new heads when pulling
Na'Tosha Bard <natosha@unity3d.com>
parents: 15914
diff changeset
   671
        numcached = 0
16103
3e1efb458e8b largefiles: only cache largefiles in new heads
Na'Tosha Bard <natosha@unity3d.com>
parents: 15983
diff changeset
   672
        heads = lfutil.getcurrentheads(repo)
3e1efb458e8b largefiles: only cache largefiles in new heads
Na'Tosha Bard <natosha@unity3d.com>
parents: 15983
diff changeset
   673
        newheads = set(heads).difference(set(oldheads))
3e1efb458e8b largefiles: only cache largefiles in new heads
Na'Tosha Bard <natosha@unity3d.com>
parents: 15983
diff changeset
   674
        for head in newheads:
3e1efb458e8b largefiles: only cache largefiles in new heads
Na'Tosha Bard <natosha@unity3d.com>
parents: 15983
diff changeset
   675
            (cached, missing) = lfcommands.cachelfiles(ui, repo, head)
3e1efb458e8b largefiles: only cache largefiles in new heads
Na'Tosha Bard <natosha@unity3d.com>
parents: 15983
diff changeset
   676
            numcached += len(cached)
16231
ce292f1379ba i18n: fix all remaining uses of % inside _()
Matt Mackall <mpm@selenic.com>
parents: 16103
diff changeset
   677
        ui.status(_("%d largefiles cached\n") % numcached)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   678
    return result
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   679
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   680
def overriderebase(orig, ui, repo, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   681
    repo._isrebasing = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   682
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   683
        orig(ui, repo, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   684
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   685
        repo._isrebasing = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   686
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   687
def overridearchive(orig, repo, dest, node, kind, decode=True, matchfn=None,
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   688
            prefix=None, mtime=None, subrepos=None):
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   689
    # No need to lock because we are only reading history and
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   690
    # largefile caches, neither of which are modified.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   691
    lfcommands.cachelfiles(repo.ui, repo, node)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   692
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   693
    if kind not in archival.archivers:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   694
        raise util.Abort(_("unknown archive type '%s'") % kind)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   695
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   696
    ctx = repo[node]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   697
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   698
    if kind == 'files':
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   699
        if prefix:
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   700
            raise util.Abort(
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   701
                _('cannot give prefix when archiving to files'))
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   702
    else:
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   703
        prefix = archival.tidyprefix(dest, kind, prefix)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   704
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   705
    def write(name, mode, islink, getdata):
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   706
        if matchfn and not matchfn(name):
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   707
            return
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   708
        data = getdata()
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   709
        if decode:
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   710
            data = repo.wwritedata(name, data)
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   711
        archiver.addfile(prefix + name, mode, islink, data)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   712
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   713
    archiver = archival.archivers[kind](dest, mtime or ctx.date()[0])
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   714
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   715
    if repo.ui.configbool("ui", "archivemeta", True):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   716
        def metadata():
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   717
            base = 'repo: %s\nnode: %s\nbranch: %s\n' % (
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   718
                hex(repo.changelog.node(0)), hex(node), ctx.branch())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   719
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   720
            tags = ''.join('tag: %s\n' % t for t in ctx.tags()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   721
                           if repo.tagtype(t) == 'global')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   722
            if not tags:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   723
                repo.ui.pushbuffer()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   724
                opts = {'template': '{latesttag}\n{latesttagdistance}',
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   725
                        'style': '', 'patch': None, 'git': None}
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   726
                cmdutil.show_changeset(repo.ui, repo, opts).show(ctx)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   727
                ltags, dist = repo.ui.popbuffer().split('\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   728
                tags = ''.join('latesttag: %s\n' % t for t in ltags.split(':'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   729
                tags += 'latesttagdistance: %s\n' % dist
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   730
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   731
            return base + tags
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   732
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   733
        write('.hg_archival.txt', 0644, False, metadata)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   734
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   735
    for f in ctx:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   736
        ff = ctx.flags(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   737
        getdata = ctx[f].data
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   738
        if lfutil.isstandin(f):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   739
            path = lfutil.findfile(repo, getdata().strip())
15914
264087940d5b largefiles: check if largefile could be found when archiving (issue3193)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15860
diff changeset
   740
            if path is None:
264087940d5b largefiles: check if largefile could be found when archiving (issue3193)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15860
diff changeset
   741
                raise util.Abort(
264087940d5b largefiles: check if largefile could be found when archiving (issue3193)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15860
diff changeset
   742
                    _('largefile %s not found in repo store or system cache')
264087940d5b largefiles: check if largefile could be found when archiving (issue3193)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15860
diff changeset
   743
                    % lfutil.splitstandin(f))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   744
            f = lfutil.splitstandin(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   745
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   746
            def getdatafn():
15576
e387e760b207 largefiles: avoid use of uinitialized variable in case of errors
Mads Kiilerich <mads@kiilerich.com>
parents: 15383
diff changeset
   747
                fd = None
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   748
                try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   749
                    fd = open(path, 'rb')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   750
                    return fd.read()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   751
                finally:
15576
e387e760b207 largefiles: avoid use of uinitialized variable in case of errors
Mads Kiilerich <mads@kiilerich.com>
parents: 15383
diff changeset
   752
                    if fd:
e387e760b207 largefiles: avoid use of uinitialized variable in case of errors
Mads Kiilerich <mads@kiilerich.com>
parents: 15383
diff changeset
   753
                        fd.close()
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   754
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   755
            getdata = getdatafn
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   756
        write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   757
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   758
    if subrepos:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   759
        for subpath in ctx.substate:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   760
            sub = ctx.sub(subpath)
15626
931dc4af0d95 largefiles: remove pre-1.7 compatibility code
Martin Geisler <mg@aragost.com>
parents: 15598
diff changeset
   761
            sub.archive(repo.ui, archiver, prefix)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   762
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   763
    archiver.done()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   764
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   765
# If a largefile is modified, the change is not reflected in its
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   766
# standin until a commit. cmdutil.bailifchanged() raises an exception
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   767
# if the repo has uncommitted changes. Wrap it to also check if
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   768
# largefiles were changed. This is used by bisect and backout.
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   769
def overridebailifchanged(orig, repo):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   770
    orig(repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   771
    repo.lfstatus = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   772
    modified, added, removed, deleted = repo.status()[:4]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   773
    repo.lfstatus = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   774
    if modified or added or removed or deleted:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   775
        raise util.Abort(_('outstanding uncommitted changes'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   776
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   777
# Fetch doesn't use cmdutil.bailifchanged so override it to add the check
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   778
def overridefetch(orig, ui, repo, *pats, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   779
    repo.lfstatus = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   780
    modified, added, removed, deleted = repo.status()[:4]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   781
    repo.lfstatus = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   782
    if modified or added or removed or deleted:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   783
        raise util.Abort(_('outstanding uncommitted changes'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   784
    return orig(ui, repo, *pats, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   785
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   786
def overrideforget(orig, ui, repo, *pats, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   787
    installnormalfilesmatchfn(repo[None].manifest())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   788
    orig(ui, repo, *pats, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   789
    restorematchfn()
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   790
    m = scmutil.match(repo[None], pats, opts)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   791
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   792
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   793
        repo.lfstatus = True
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   794
        s = repo.status(match=m, clean=True)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   795
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   796
        repo.lfstatus = False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   797
    forget = sorted(s[0] + s[1] + s[3] + s[6])
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   798
    forget = [f for f in forget if lfutil.standin(f) in repo[None].manifest()]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   799
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   800
    for f in forget:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   801
        if lfutil.standin(f) not in repo.dirstate and not \
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   802
                os.path.isdir(m.rel(lfutil.standin(f))):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   803
            ui.warn(_('not removing %s: file is already untracked\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   804
                    % m.rel(f))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   805
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   806
    for f in forget:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   807
        if ui.verbose or not m.exact(f):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   808
            ui.status(_('removing %s\n') % m.rel(f))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   809
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   810
    # Need to lock because standin files are deleted then removed from the
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   811
    # repository and we could race inbetween.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   812
    wlock = repo.wlock()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   813
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   814
        lfdirstate = lfutil.openlfdirstate(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   815
        for f in forget:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   816
            if lfdirstate[f] == 'a':
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   817
                lfdirstate.drop(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   818
            else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   819
                lfdirstate.remove(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   820
        lfdirstate.write()
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   821
        lfutil.reporemove(repo, [lfutil.standin(f) for f in forget],
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   822
            unlink=True)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   823
    finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   824
        wlock.release()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   825
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   826
def getoutgoinglfiles(ui, repo, dest=None, **opts):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   827
    dest = ui.expandpath(dest or 'default-push', dest or 'default')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   828
    dest, branches = hg.parseurl(dest, opts.get('branch'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   829
    revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   830
    if revs:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   831
        revs = [repo.lookup(rev) for rev in revs]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   832
15224
7c604d8c7e83 largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents: 15170
diff changeset
   833
    remoteui = hg.remoteui
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   834
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   835
    try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   836
        remote = hg.repository(remoteui(repo, opts), dest)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   837
    except error.RepoError:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   838
        return None
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   839
    o = lfutil.findoutgoing(repo, remote, False)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   840
    if not o:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   841
        return None
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   842
    o = repo.changelog.nodesbetween(o, revs)[0]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   843
    if opts.get('newest_first'):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   844
        o.reverse()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   845
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   846
    toupload = set()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   847
    for n in o:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   848
        parents = [p for p in repo.changelog.parents(n) if p != node.nullid]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   849
        ctx = repo[n]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   850
        files = set(ctx.files())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   851
        if len(parents) == 2:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   852
            mc = ctx.manifest()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   853
            mp1 = ctx.parents()[0].manifest()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   854
            mp2 = ctx.parents()[1].manifest()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   855
            for f in mp1:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   856
                if f not in mc:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   857
                        files.add(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   858
            for f in mp2:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   859
                if f not in mc:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   860
                    files.add(f)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   861
            for f in mc:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   862
                if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   863
                    files.add(f)
15255
7ab05d752405 largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents: 15254
diff changeset
   864
        toupload = toupload.union(
7ab05d752405 largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents: 15254
diff changeset
   865
            set([f for f in files if lfutil.isstandin(f) and f in ctx]))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   866
    return toupload
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   867
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   868
def overrideoutgoing(orig, ui, repo, dest=None, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   869
    orig(ui, repo, dest, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   870
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   871
    if opts.pop('large', None):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   872
        toupload = getoutgoinglfiles(ui, repo, dest, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   873
        if toupload is None:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   874
            ui.status(_('largefiles: No remote repo\n'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   875
        else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   876
            ui.status(_('largefiles to upload:\n'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   877
            for file in toupload:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   878
                ui.status(lfutil.splitstandin(file) + '\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   879
            ui.status('\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   880
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   881
def overridesummary(orig, ui, repo, *pats, **opts):
15787
0c7b83a057aa largefiles: fix output of hg summary (issue3060)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15786
diff changeset
   882
    try:
0c7b83a057aa largefiles: fix output of hg summary (issue3060)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15786
diff changeset
   883
        repo.lfstatus = True
0c7b83a057aa largefiles: fix output of hg summary (issue3060)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15786
diff changeset
   884
        orig(ui, repo, *pats, **opts)
0c7b83a057aa largefiles: fix output of hg summary (issue3060)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15786
diff changeset
   885
    finally:
0c7b83a057aa largefiles: fix output of hg summary (issue3060)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15786
diff changeset
   886
        repo.lfstatus = False
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   887
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   888
    if opts.pop('large', None):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   889
        toupload = getoutgoinglfiles(ui, repo, None, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   890
        if toupload is None:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   891
            ui.status(_('largefiles: No remote repo\n'))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   892
        else:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   893
            ui.status(_('largefiles: %d to upload\n') % len(toupload))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   894
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   895
def overrideaddremove(orig, ui, repo, *pats, **opts):
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   896
    # Get the list of missing largefiles so we can remove them
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   897
    lfdirstate = lfutil.openlfdirstate(ui, repo)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   898
    s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   899
        False, False)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   900
    (unsure, modified, added, removed, missing, unknown, ignored, clean) = s
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   901
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   902
    # Call into the normal remove code, but the removing of the standin, we want
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   903
    # to have handled by original addremove.  Monkey patching here makes sure
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   904
    # we don't remove the standin in the largefiles code, preventing a very
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   905
    # confused state later.
15967
295f8aeab363 largefiles: fix addremove when no largefiles are specified
Na'Tosha Bard <natosha@unity3d.com>
parents: 15944
diff changeset
   906
    if missing:
295f8aeab363 largefiles: fix addremove when no largefiles are specified
Na'Tosha Bard <natosha@unity3d.com>
parents: 15944
diff changeset
   907
        repo._isaddremove = True
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   908
        removelargefiles(ui, repo, *missing, **opts)
15967
295f8aeab363 largefiles: fix addremove when no largefiles are specified
Na'Tosha Bard <natosha@unity3d.com>
parents: 15944
diff changeset
   909
        repo._isaddremove = False
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   910
    # Call into the normal add code, and any files that *should* be added as
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   911
    # largefiles will be
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   912
    addlargefiles(ui, repo, *pats, **opts)
15792
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   913
    # Now that we've handled largefiles, hand off to the original addremove
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   914
    # function to take care of the rest.  Make sure it doesn't do anything with
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   915
    # largefiles by installing a matcher that will ignore them.
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   916
    installnormalfilesmatchfn(repo[None].manifest())
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   917
    result = orig(ui, repo, *pats, **opts)
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   918
    restorematchfn()
7cbba3adabc7 largefiles: implement addremove (issue3064)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15788
diff changeset
   919
    return result
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   920
15254
dd03d3a9f888 largefiles: more work on cleaning up comments
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
   921
# Calling purge with --all will cause the largefiles to be deleted.
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   922
# Override repo.status to prevent this from happening.
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   923
def overridepurge(orig, ui, repo, *dirs, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   924
    oldstatus = repo.status
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   925
    def overridestatus(node1='.', node2=None, match=None, ignored=False,
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   926
                        clean=False, unknown=False, listsubrepos=False):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   927
        r = oldstatus(node1, node2, match, ignored, clean, unknown,
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   928
                      listsubrepos)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   929
        lfdirstate = lfutil.openlfdirstate(ui, repo)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   930
        modified, added, removed, deleted, unknown, ignored, clean = r
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   931
        unknown = [f for f in unknown if lfdirstate[f] == '?']
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   932
        ignored = [f for f in ignored if lfdirstate[f] == '?']
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   933
        return modified, added, removed, deleted, unknown, ignored, clean
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   934
    repo.status = overridestatus
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   935
    orig(ui, repo, *dirs, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   936
    repo.status = oldstatus
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   937
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   938
def overriderollback(orig, ui, repo, **opts):
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   939
    result = orig(ui, repo, **opts)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   940
    merge.update(repo, node=None, branchmerge=False, force=True,
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   941
        partial=lfutil.isstandin)
15794
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   942
    wlock = repo.wlock()
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   943
    try:
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   944
        lfdirstate = lfutil.openlfdirstate(ui, repo)
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   945
        lfiles = lfutil.listlfiles(repo)
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   946
        oldlfiles = lfutil.listlfiles(repo, repo[None].parents()[0].rev())
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   947
        for file in lfiles:
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   948
            if file in oldlfiles:
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   949
                lfdirstate.normallookup(file)
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   950
            else:
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   951
                lfdirstate.add(file)
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   952
        lfdirstate.write()
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   953
    finally:
0d91211dd12f largefiles: fix inappropriate locking (issue3182)
Levi Bard <levi@unity3d.com>
parents: 15792
diff changeset
   954
        wlock.release()
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
   955
    return result
15383
155d0f8fb7e5 largefiles: fix bad bug where transplanting a changeset with a largefile will result in an old largefile being comitted later on
Na'Tosha Bard <natosha@unity3d.com>
parents: 15369
diff changeset
   956
16247
d87d9d8a8e03 largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents: 16246
diff changeset
   957
def overridetransplant(orig, ui, repo, *revs, **opts):
15982
bf502ccc46d7 largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15967
diff changeset
   958
    try:
16246
169525f8ffbb largefiles: only update changed largefiles when transplanting
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   959
        oldstandins = lfutil.getstandinsstate(repo)
15982
bf502ccc46d7 largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15967
diff changeset
   960
        repo._istransplanting = True
bf502ccc46d7 largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15967
diff changeset
   961
        result = orig(ui, repo, *revs, **opts)
16246
169525f8ffbb largefiles: only update changed largefiles when transplanting
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   962
        newstandins = lfutil.getstandinsstate(repo)
169525f8ffbb largefiles: only update changed largefiles when transplanting
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   963
        filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
169525f8ffbb largefiles: only update changed largefiles when transplanting
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   964
        lfcommands.updatelfiles(repo.ui, repo, filelist=filelist,
169525f8ffbb largefiles: only update changed largefiles when transplanting
Na'Tosha Bard <natosha@unity3d.com>
parents: 16245
diff changeset
   965
                                printmessage=True)
15982
bf502ccc46d7 largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15967
diff changeset
   966
    finally:
bf502ccc46d7 largefiles: fix transplant for all cases (issue3192)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15967
diff changeset
   967
        repo._istransplanting = False
15383
155d0f8fb7e5 largefiles: fix bad bug where transplanting a changeset with a largefile will result in an old largefile being comitted later on
Na'Tosha Bard <natosha@unity3d.com>
parents: 15369
diff changeset
   968
    return result
16439
290850e7aa43 largefiles: fix cat for largefiles (issue3352)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16248
diff changeset
   969
290850e7aa43 largefiles: fix cat for largefiles (issue3352)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16248
diff changeset
   970
def overridecat(orig, ui, repo, file1, *pats, **opts):
290850e7aa43 largefiles: fix cat for largefiles (issue3352)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16248
diff changeset
   971
    rev = opts.get('rev')
290850e7aa43 largefiles: fix cat for largefiles (issue3352)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16248
diff changeset
   972
    if not lfutil.standin(file1) in repo[rev]:
290850e7aa43 largefiles: fix cat for largefiles (issue3352)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16248
diff changeset
   973
        result = orig(ui, repo, file1, *pats, **opts)
290850e7aa43 largefiles: fix cat for largefiles (issue3352)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16248
diff changeset
   974
        return result
290850e7aa43 largefiles: fix cat for largefiles (issue3352)
Na'Tosha Bard <natosha@unity3d.com>
parents: 16248
diff changeset
   975
    return lfcommands.catlfile(repo, file1, opts.get('rev'), opts.get('output'))