##// END OF EJS Templates
largefiles: remove trivial portability wrappers
largefiles: remove trivial portability wrappers

File last commit:

r18154:93c697d9 default
r18154:93c697d9 default
Show More
overrides.py
1141 lines | 43.7 KiB | text/x-python | PythonLexer
various
hgext: add largefiles extension...
r15168 # Copyright 2009-2010 Gregory P. Ward
# Copyright 2009-2010 Intelerad Medical Systems Incorporated
# Copyright 2010-2011 Fog Creek Software
# Copyright 2010-2011 Unity Technologies
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
'''Overridden Mercurial commands and functions for the largefiles extension'''
import os
import copy
Greg Ward
largefiles: tidy imports...
r15305 from mercurial import hg, commands, util, cmdutil, scmutil, match as match_, \
Mads Kiilerich
largefiles: remove findoutgoing portability wrapper
r18152 node, archival, error, merge, discovery
various
hgext: add largefiles extension...
r15168 from mercurial.i18n import _
from mercurial.node import hex
from hgext import rebase
import lfutil
import lfcommands
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 # -- Utility functions: commonly/repeatedly needed functionality ---------------
various
hgext: add largefiles extension...
r15168 def installnormalfilesmatchfn(manifest):
'''overrides scmutil.match so that the matcher it returns will ignore all
largefiles'''
oldmatch = None # for the closure
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridematch(ctx, pats=[], opts={}, globbed=False,
various
hgext: add largefiles extension...
r15168 default='relpath'):
Greg Ward
largefiles: fix some badly named function parameters...
r15306 match = oldmatch(ctx, pats, opts, globbed, default)
various
hgext: add largefiles extension...
r15168 m = copy.copy(match)
notlfile = lambda f: not (lfutil.isstandin(f) or lfutil.standin(f) in
manifest)
m._files = filter(notlfile, m._files)
m._fmap = set(m._files)
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 origmatchfn = m.matchfn
m.matchfn = lambda f: notlfile(f) and origmatchfn(f) or None
various
hgext: add largefiles extension...
r15168 return m
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 oldmatch = installmatchfn(overridematch)
various
hgext: add largefiles extension...
r15168
def installmatchfn(f):
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 oldmatch = scmutil.match
various
hgext: add largefiles extension...
r15168 setattr(f, 'oldmatch', oldmatch)
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 scmutil.match = f
various
hgext: add largefiles extension...
r15168 return oldmatch
def restorematchfn():
'''restores scmutil.match to what it was before installnormalfilesmatchfn
was called. no-op if scmutil.match is its original function.
Note that n calls to installnormalfilesmatchfn will require n calls to
restore matchfn to reverse'''
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 scmutil.match = getattr(scmutil.match, 'oldmatch', scmutil.match)
various
hgext: add largefiles extension...
r15168
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def addlargefiles(ui, repo, *pats, **opts):
various
hgext: add largefiles extension...
r15168 large = opts.pop('large', None)
Greg Ward
largefiles: factor out lfutil.getminsize()
r15227 lfsize = lfutil.getminsize(
ui, lfutil.islfilesrepo(repo), opts.pop('lfsize', None))
various
hgext: add largefiles extension...
r15168
lfmatcher = None
Michal Sznajder
largefiles: tiny code clean up...
r15739 if lfutil.islfilesrepo(repo):
Greg Ward
largefiles: use ui.configlist() to split largefiles.patterns
r15229 lfpats = ui.configlist(lfutil.longname, 'patterns', default=[])
various
hgext: add largefiles extension...
r15168 if lfpats:
lfmatcher = match_.match(repo.root, '', list(lfpats))
lfnames = []
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 m = scmutil.match(repo[None], pats, opts)
various
hgext: add largefiles extension...
r15168 m.bad = lambda x, y: None
wctx = repo[None]
for f in repo.walk(m):
exact = m.exact(f)
lfile = lfutil.standin(f) in wctx
nfile = f in wctx
exists = lfile or nfile
# Don't warn the user when they attempt to add a normal tracked file.
# The normal add code will do that for us.
if exact and exists:
if lfile:
ui.warn(_('%s already a largefile\n') % f)
continue
Matt Harbison
largefiles: ensure addlargefiles() doesn't add a standin as a largefile...
r17232 if (exact or not exists) and not lfutil.isstandin(f):
Matt Harbison
largefiles: fix a traceback when addremove follows a remove (issue3507)...
r17231 wfile = repo.wjoin(f)
# In case the file was removed previously, but not committed
# (issue3507)
if not os.path.exists(wfile):
continue
Greg Ward
largefiles: cosmetics, whitespace, code style...
r15255 abovemin = (lfsize and
Matt Harbison
largefiles: fix a traceback when addremove follows a remove (issue3507)...
r17231 os.lstat(wfile).st_size >= lfsize * 1024 * 1024)
Greg Ward
largefiles: cosmetics, whitespace, code style...
r15255 if large or abovemin or (lfmatcher and lfmatcher(f)):
various
hgext: add largefiles extension...
r15168 lfnames.append(f)
if ui.verbose or not exact:
ui.status(_('adding %s as a largefile\n') % m.rel(f))
bad = []
standins = []
Greg Ward
largefiles: improve comments, internal docstrings...
r15252 # Need to lock, otherwise there could be a race condition between
# when standins are created and added to the repo.
various
hgext: add largefiles extension...
r15168 wlock = repo.wlock()
try:
if not opts.get('dry_run'):
lfdirstate = lfutil.openlfdirstate(ui, repo)
for f in lfnames:
standinname = lfutil.standin(f)
lfutil.writestandin(repo, standinname, hash='',
executable=lfutil.getexecutable(repo.wjoin(f)))
standins.append(standinname)
if lfdirstate[f] == 'r':
lfdirstate.normallookup(f)
else:
lfdirstate.add(f)
lfdirstate.write()
Greg Ward
largefiles: cosmetics, whitespace, code style...
r15255 bad += [lfutil.splitstandin(f)
Mads Kiilerich
largefiles: remove trivial portability wrappers
r18154 for f in repo[None].add(standins)
Greg Ward
largefiles: cosmetics, whitespace, code style...
r15255 if f in m.files()]
various
hgext: add largefiles extension...
r15168 finally:
wlock.release()
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 return bad
various
hgext: add largefiles extension...
r15168
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def removelargefiles(ui, repo, *pats, **opts):
Na'Tosha Bard
largefiles: fix confusion upon removal of added largefile (issue3176)...
r15786 after = opts.get('after')
various
hgext: add largefiles extension...
r15168 if not pats and not after:
raise util.Abort(_('no files specified'))
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 m = scmutil.match(repo[None], pats, opts)
various
hgext: add largefiles extension...
r15168 try:
repo.lfstatus = True
s = repo.status(match=m, clean=True)
finally:
repo.lfstatus = False
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 manifest = repo[None].manifest()
Greg Ward
largefiles: cosmetics, whitespace, code style...
r15255 modified, added, deleted, clean = [[f for f in list
if lfutil.standin(f) in manifest]
for list in [s[0], s[1], s[3], s[6]]]
various
hgext: add largefiles extension...
r15168
Mads Kiilerich
largefiles: align rm warnings with warnings used in core
r18066 def warn(files, msg):
various
hgext: add largefiles extension...
r15168 for f in files:
Mads Kiilerich
largefiles: align rm warnings with warnings used in core
r18066 ui.warn(msg % m.rel(f))
Matt Harbison
largefiles: exit from remove with 1 on warnings...
r17576 return int(len(files) > 0)
result = 0
various
hgext: add largefiles extension...
r15168
Na'Tosha Bard
largefiles: fix confusion upon removal of added largefile (issue3176)...
r15786 if after:
various
hgext: add largefiles extension...
r15168 remove, forget = deleted, []
Mads Kiilerich
largefiles: align rm warnings with warnings used in core
r18066 result = warn(modified + added + clean,
_('not removing %s: file still exists\n'))
various
hgext: add largefiles extension...
r15168 else:
remove, forget = deleted + clean, []
Mads Kiilerich
largefiles: align rm warnings with warnings used in core
r18066 result = warn(modified, _('not removing %s: file is modified (use -f'
' to force removal)\n'))
result = warn(added, _('not removing %s: file has been marked for add'
' (use forget to undo)\n')) or result
various
hgext: add largefiles extension...
r15168
for f in sorted(remove + forget):
if ui.verbose or not m.exact(f):
ui.status(_('removing %s\n') % m.rel(f))
# Need to lock because standin files are deleted then removed from the
Mads Kiilerich
fix trivial spelling errors
r17424 # repository and we could race in-between.
various
hgext: add largefiles extension...
r15168 wlock = repo.wlock()
try:
lfdirstate = lfutil.openlfdirstate(ui, repo)
for f in remove:
if not after:
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 # If this is being called by addremove, notify the user that we
# are removing the file.
if getattr(repo, "_isaddremove", False):
Matt Mackall
i18n: fix all remaining uses of % inside _()
r16231 ui.status(_('removing %s\n') % f)
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 if os.path.exists(repo.wjoin(f)):
Patrick Mezard
largefiles: test and simplify empty directory removal in remove
r15930 util.unlinkpath(repo.wjoin(f))
various
hgext: add largefiles extension...
r15168 lfdirstate.remove(f)
lfdirstate.write()
forget = [lfutil.standin(f) for f in forget]
remove = [lfutil.standin(f) for f in remove]
Mads Kiilerich
largefiles: remove trivial portability wrappers
r18154 repo[None].forget(forget)
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 # If this is being called by addremove, let the original addremove
# function handle this.
if not getattr(repo, "_isaddremove", False):
Mads Kiilerich
largefiles: remove reporemove portability wrapper
r18153 for f in remove:
util.unlinkpath(repo.wjoin(f), ignoremissing=True)
repo[None].forget(remove)
various
hgext: add largefiles extension...
r15168 finally:
wlock.release()
Matt Harbison
largefiles: exit from remove with 1 on warnings...
r17576 return result
Martin Geisler
largefiles: hide .hglf/ prefix for largefiles in hgweb...
r16449 # For overriding mercurial.hgweb.webcommands so that largefiles will
# appear at their right place in the manifests.
def decodepath(orig, path):
return lfutil.splitstandin(path) or path
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 # -- Wrappers: modify existing commands --------------------------------
# Add works by going through the files that the user wanted to add and
# checking if they should be added as largefiles. Then it makes a new
# matcher which matches only the normal files and runs the original
# version of add.
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overrideadd(orig, ui, repo, *pats, **opts):
Na'Tosha Bard
largefiles: add --normal option to hg add (issue3061)
r15944 normal = opts.pop('normal')
if normal:
if opts.get('large'):
raise util.Abort(_('--normal cannot be used with --large'))
return orig(ui, repo, *pats, **opts)
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 bad = addlargefiles(ui, repo, *pats, **opts)
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 installnormalfilesmatchfn(repo[None].manifest())
result = orig(ui, repo, *pats, **opts)
restorematchfn()
return (result == 1 or bad) and 1 or 0
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overrideremove(orig, ui, repo, *pats, **opts):
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 installnormalfilesmatchfn(repo[None].manifest())
Matt Harbison
largefiles: exit from remove with 1 on warnings...
r17576 result = orig(ui, repo, *pats, **opts)
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 restorematchfn()
Matt Harbison
largefiles: exit from remove with 1 on warnings...
r17576 return removelargefiles(ui, repo, *pats, **opts) or result
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792
Matt Harbison
largefiles: fix status -S reporting of subrepos (issue3231)...
r16515 def overridestatusfn(orig, repo, rev2, **opts):
try:
repo._repo.lfstatus = True
return orig(repo, rev2, **opts)
finally:
repo._repo.lfstatus = False
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridestatus(orig, ui, repo, *pats, **opts):
various
hgext: add largefiles extension...
r15168 try:
repo.lfstatus = True
return orig(ui, repo, *pats, **opts)
finally:
repo.lfstatus = False
Matt Harbison
largefiles: notice dirty large files in a subrepo...
r16516 def overridedirty(orig, repo, ignoreupdate=False):
try:
repo._repo.lfstatus = True
return orig(repo, ignoreupdate)
finally:
repo._repo.lfstatus = False
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridelog(orig, ui, repo, *pats, **opts):
various
hgext: add largefiles extension...
r15168 try:
repo.lfstatus = True
Matt Harbison
largefiles: preserve the exit status of the log command
r17577 return orig(ui, repo, *pats, **opts)
various
hgext: add largefiles extension...
r15168 finally:
repo.lfstatus = False
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overrideverify(orig, ui, repo, *pats, **opts):
various
hgext: add largefiles extension...
r15168 large = opts.pop('large', False)
all = opts.pop('lfa', False)
contents = opts.pop('lfc', False)
result = orig(ui, repo, *pats, **opts)
if large:
result = result or lfcommands.verifylfiles(ui, repo, all, contents)
return result
Mads Kiilerich
largefiles: introduce basic debugstate --large functionality...
r18144 def overridedebugstate(orig, ui, repo, *pats, **opts):
large = opts.pop('large', False)
if large:
lfcommands.debugdirstate(ui, repo)
else:
orig(ui, repo, *pats, **opts)
various
hgext: add largefiles extension...
r15168 # Override needs to refresh standins so that update's normal merge
# will go through properly. Then the other update hook (overriding repo.update)
Mads Kiilerich
fix trivial spelling errors
r17424 # will get the new files. Filemerge is also overridden so that the merge
various
hgext: add largefiles extension...
r15168 # will merge standins correctly.
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overrideupdate(orig, ui, repo, *pats, **opts):
various
hgext: add largefiles extension...
r15168 lfdirstate = lfutil.openlfdirstate(ui, repo)
s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
False, False)
(unsure, modified, added, removed, missing, unknown, ignored, clean) = s
Greg Ward
largefiles: improve comments, internal docstrings...
r15252 # Need to lock between the standins getting updated and their
# largefiles getting updated
various
hgext: add largefiles extension...
r15168 wlock = repo.wlock()
try:
if opts['check']:
mod = len(modified) > 0
for lfile in unsure:
standin = lfutil.standin(lfile)
if repo['.'][standin].data().strip() != \
lfutil.hashfile(repo.wjoin(lfile)):
mod = True
else:
lfdirstate.normal(lfile)
lfdirstate.write()
if mod:
raise util.Abort(_('uncommitted local changes'))
# XXX handle removed differently
if not opts['clean']:
for lfile in unsure + modified + added:
lfutil.updatestandin(repo, lfutil.standin(lfile))
finally:
wlock.release()
return orig(ui, repo, *pats, **opts)
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663 # Before starting the manifest merge, merge.updates will call
# _checkunknown to check if there are any files in the merged-in
# changeset that collide with unknown files in the working copy.
#
# The largefiles are seen as unknown, so this prevents us from merging
# in a file 'foo' if we already have a largefile with the same name.
#
# The overridden function filters the unknown files by removing any
# largefiles. This makes the merge proceed and we can then handle this
# case further in the overridden manifestmerge function below.
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridecheckunknownfile(origfn, repo, wctx, mctx, f):
Matt Mackall
merge: refactor unknown file conflict checking...
r16093 if lfutil.standin(f) in wctx:
return False
return origfn(repo, wctx, mctx, f)
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663
# The manifest merge handles conflicts on the manifest level. We want
# to handle changes in largefile-ness of files at this level too.
#
# The strategy is to run the original manifestmerge and then process
# the action list it outputs. There are two cases we need to deal with:
#
# 1. Normal file in p1, largefile in p2. Here the largefile is
# detected via its standin file, which will enter the working copy
# with a "get" action. It is not "merge" since the standin is all
# Mercurial is concerned with at this level -- the link to the
# existing normal file is not relevant here.
#
# 2. Largefile in p1, normal file in p2. Here we get a "merge" action
# since the largefile will be present in the working copy and
# different from the normal file in p2. Mercurial therefore
# triggers a merge action.
#
# In both cases, we prompt the user and emit new actions to either
# remove the standin (if the normal file was kept) or to remove the
# normal file and get the standin (if the largefile was kept). The
# default prompt answer is to use the largefile version since it was
# presumably changed on purpose.
#
# Finally, the merge.applyupdates function will then take care of
# writing the files into the working copy and lfcommands.updatelfiles
# will update the largefiles.
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridemanifestmerge(origfn, repo, p1, p2, pa, overwrite, partial):
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663 actions = origfn(repo, p1, p2, pa, overwrite, partial)
processed = []
for action in actions:
if overwrite:
processed.append(action)
continue
f, m = action[:2]
choices = (_('&Largefile'), _('&Normal file'))
if m == "g" and lfutil.splitstandin(f) in p1 and f in p2:
# Case 1: normal file in the working copy, largefile in
# the second parent
lfile = lfutil.splitstandin(f)
standin = f
msg = _('%s has been turned into a largefile\n'
'use (l)argefile or keep as (n)ormal file?') % lfile
if repo.ui.promptchoice(msg, choices, 0) == 0:
processed.append((lfile, "r"))
processed.append((standin, "g", p2.flags(standin)))
else:
processed.append((standin, "r"))
Matt Mackall
merge: don't use unknown()...
r16094 elif m == "g" and lfutil.standin(f) in p1 and f in p2:
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663 # Case 2: largefile in the working copy, normal file in
# the second parent
standin = lfutil.standin(f)
lfile = f
msg = _('%s has been turned into a normal file\n'
'keep as (l)argefile or use (n)ormal file?') % lfile
if repo.ui.promptchoice(msg, choices, 0) == 0:
processed.append((lfile, "r"))
else:
processed.append((standin, "r"))
processed.append((lfile, "g", p2.flags(lfile)))
else:
processed.append(action)
return processed
Greg Ward
largefiles: improve comments, internal docstrings...
r15252 # Override filemerge to prompt the user about how they wish to merge
# largefiles. This will handle identical edits, and copy/rename +
# edit without prompting the user.
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridefilemerge(origfn, repo, mynode, orig, fcd, fco, fca):
various
hgext: add largefiles extension...
r15168 # Use better variable names here. Because this is a wrapper we cannot
# change the variable names in the function declaration.
fcdest, fcother, fcancestor = fcd, fco, fca
if not lfutil.isstandin(orig):
return origfn(repo, mynode, orig, fcdest, fcother, fcancestor)
else:
if not fcother.cmp(fcdest): # files identical?
return None
# backwards, use working dir parent as ancestor
if fcancestor == fcother:
fcancestor = fcdest.parents()[0]
if orig != fcother.path():
repo.ui.status(_('merging %s and %s to %s\n')
% (lfutil.splitstandin(orig),
lfutil.splitstandin(fcother.path()),
lfutil.splitstandin(fcdest.path())))
else:
repo.ui.status(_('merging %s\n')
% lfutil.splitstandin(fcdest.path()))
if fcancestor.path() != fcother.path() and fcother.data() == \
fcancestor.data():
return 0
if fcancestor.path() != fcdest.path() and fcdest.data() == \
fcancestor.data():
repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
return 0
if repo.ui.promptchoice(_('largefile %s has a merge conflict\n'
'keep (l)ocal or take (o)ther?') %
lfutil.splitstandin(orig),
(_('&Local'), _('&Other')), 0) == 0:
return 0
else:
repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
return 0
Greg Ward
largefiles: improve comments, internal docstrings...
r15252 # Copy first changes the matchers to match standins instead of
# largefiles. Then it overrides util.copyfile in that function it
# checks if the destination largefile already exists. It also keeps a
# list of copied files so that the largefiles can be copied and the
# dirstate updated.
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridecopy(orig, ui, repo, pats, opts, rename=False):
Greg Ward
largefiles: improve comments, internal docstrings...
r15252 # doesn't remove largefile on rename
various
hgext: add largefiles extension...
r15168 if len(pats) < 2:
# this isn't legal, let the original function deal with it
return orig(ui, repo, pats, opts, rename)
def makestandin(relpath):
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 path = scmutil.canonpath(repo.root, repo.getcwd(), relpath)
Benjamin Pollack
largefiles: remove all uses of os.path.relpath for 2.4 compatibility
r15323 return os.path.join(repo.wjoin(lfutil.standin(path)))
various
hgext: add largefiles extension...
r15168
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 fullpats = scmutil.expandpats(pats)
various
hgext: add largefiles extension...
r15168 dest = fullpats[-1]
if os.path.isdir(dest):
if not os.path.isdir(makestandin(dest)):
os.makedirs(makestandin(dest))
Greg Ward
largefiles: more work on cleaning up comments...
r15254 # This could copy both lfiles and normal files in one command,
# but we don't want to do that. First replace their matcher to
# only match normal files and run it, then replace it to just
# match largefiles and run it again.
various
hgext: add largefiles extension...
r15168 nonormalfiles = False
nolfiles = False
try:
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 try:
installnormalfilesmatchfn(repo[None].manifest())
result = orig(ui, repo, pats, opts, rename)
except util.Abort, e:
Matt Mackall
largefiles: fix exception hack for i18n (issue3197)...
r17263 if str(e) != _('no files to copy'):
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 raise e
else:
nonormalfiles = True
result = 0
various
hgext: add largefiles extension...
r15168 finally:
restorematchfn()
# The first rename can cause our current working directory to be removed.
# In that case there is nothing left to copy/rename so just quit.
try:
repo.getcwd()
except OSError:
return result
try:
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 try:
Na'Tosha Bard
largefiles: fix check-code errors.
r16248 # When we call orig below it creates the standins but we don't add
# them to the dir state until later so lock during that time.
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 wlock = repo.wlock()
various
hgext: add largefiles extension...
r15168
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 manifest = repo[None].manifest()
oldmatch = None # for the closure
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridematch(ctx, pats=[], opts={}, globbed=False,
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 default='relpath'):
newpats = []
# The patterns were previously mangled to add the standin
# directory; we need to remove that now
for pat in pats:
if match_.patkind(pat) is None and lfutil.shortname in pat:
newpats.append(pat.replace(lfutil.shortname, ''))
else:
newpats.append(pat)
Greg Ward
largefiles: fix some badly named function parameters...
r15306 match = oldmatch(ctx, newpats, opts, globbed, default)
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 m = copy.copy(match)
lfile = lambda f: lfutil.standin(f) in manifest
m._files = [lfutil.standin(f) for f in m._files if lfile(f)]
m._fmap = set(m._files)
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 origmatchfn = m.matchfn
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 m.matchfn = lambda f: (lfutil.isstandin(f) and
FUJIWARA Katsunori
largefiles: reduce redundant splitstandin/standin combination...
r16075 (f in manifest) and
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 origmatchfn(lfutil.splitstandin(f)) or
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 None)
return m
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 oldmatch = installmatchfn(overridematch)
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 listpats = []
various
hgext: add largefiles extension...
r15168 for pat in pats:
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 if match_.patkind(pat) is not None:
listpats.append(pat)
various
hgext: add largefiles extension...
r15168 else:
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 listpats.append(makestandin(pat))
various
hgext: add largefiles extension...
r15168
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 try:
origcopyfile = util.copyfile
copiedfiles = []
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridecopyfile(src, dest):
Na'Tosha Bard
largefiles: fix rename (issue3093)
r15598 if (lfutil.shortname in src and
dest.startswith(repo.wjoin(lfutil.shortname))):
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 destlfile = dest.replace(lfutil.shortname, '')
if not opts['force'] and os.path.exists(destlfile):
raise IOError('',
_('destination largefile already exists'))
copiedfiles.append((src, dest))
origcopyfile(src, dest)
various
hgext: add largefiles extension...
r15168
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 util.copyfile = overridecopyfile
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 result += orig(ui, repo, listpats, opts, rename)
finally:
util.copyfile = origcopyfile
various
hgext: add largefiles extension...
r15168
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 lfdirstate = lfutil.openlfdirstate(ui, repo)
for (src, dest) in copiedfiles:
Na'Tosha Bard
largefiles: fix rename (issue3093)
r15598 if (lfutil.shortname in src and
dest.startswith(repo.wjoin(lfutil.shortname))):
srclfile = src.replace(repo.wjoin(lfutil.standin('')), '')
destlfile = dest.replace(repo.wjoin(lfutil.standin('')), '')
Matt Harbison
largefiles: fix path handling for cp/mv (issue3516)...
r17245 destlfiledir = os.path.dirname(repo.wjoin(destlfile)) or '.'
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 if not os.path.isdir(destlfiledir):
os.makedirs(destlfiledir)
if rename:
Na'Tosha Bard
largefiles: fix rename (issue3093)
r15598 os.rename(repo.wjoin(srclfile), repo.wjoin(destlfile))
lfdirstate.remove(srclfile)
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 else:
Matt Harbison
largefiles: fix path handling for cp/mv (issue3516)...
r17245 util.copyfile(repo.wjoin(srclfile),
repo.wjoin(destlfile))
Na'Tosha Bard
largefiles: fix rename (issue3093)
r15598 lfdirstate.add(destlfile)
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 lfdirstate.write()
except util.Abort, e:
Matt Mackall
largefiles: fix exception hack for i18n (issue3197)...
r17263 if str(e) != _('no files to copy'):
Thomas Arendsen Hein
largefiles: use separate try/except and try/finally as needed for python2.4...
r15279 raise e
else:
nolfiles = True
various
hgext: add largefiles extension...
r15168 finally:
restorematchfn()
wlock.release()
if nolfiles and nonormalfiles:
raise util.Abort(_('no files to copy'))
return result
Greg Ward
largefiles: more work on cleaning up comments...
r15254 # When the user calls revert, we have to be careful to not revert any
# changes to other largefiles accidentally. This means we have to keep
# track of the largefiles that are being reverted so we only pull down
# the necessary largefiles.
various
hgext: add largefiles extension...
r15168 #
Greg Ward
largefiles: more work on cleaning up comments...
r15254 # Standins are only updated (to match the hash of largefiles) before
# commits. Update the standins then run the original revert, changing
# the matcher to hit standins instead of largefiles. Based on the
# resulting standins update the largefiles. Then return the standins
# to their proper state
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overriderevert(orig, ui, repo, *pats, **opts):
Greg Ward
largefiles: more work on cleaning up comments...
r15254 # Because we put the standins in a bad state (by updating them)
# and then return them to a correct state we need to lock to
# prevent others from changing them in their incorrect state.
various
hgext: add largefiles extension...
r15168 wlock = repo.wlock()
try:
lfdirstate = lfutil.openlfdirstate(ui, repo)
(modified, added, removed, missing, unknown, ignored, clean) = \
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 lfutil.lfdirstatestatus(lfdirstate, repo, repo['.'].rev())
Mads Kiilerich
largefiles revert: update lfdirstate with result from first cleanliness check...
r18140 lfdirstate.write()
various
hgext: add largefiles extension...
r15168 for lfile in modified:
lfutil.updatestandin(repo, lfutil.standin(lfile))
Na'Tosha Bard
largefiles: fix revert on missing largefile (issue3217)
r15983 for lfile in missing:
Na'Tosha Bard
largefiles: fix deletion of multiple missing largefiles (issue3329)
r16638 if (os.path.exists(repo.wjoin(lfutil.standin(lfile)))):
os.unlink(repo.wjoin(lfutil.standin(lfile)))
various
hgext: add largefiles extension...
r15168
try:
Matt Harbison
largefiles: support revsets for revert...
r17268 ctx = scmutil.revsingle(repo, opts.get('rev'))
various
hgext: add largefiles extension...
r15168 oldmatch = None # for the closure
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridematch(ctx, pats=[], opts={}, globbed=False,
various
hgext: add largefiles extension...
r15168 default='relpath'):
Greg Ward
largefiles: fix some badly named function parameters...
r15306 match = oldmatch(ctx, pats, opts, globbed, default)
various
hgext: add largefiles extension...
r15168 m = copy.copy(match)
def tostandin(f):
FUJIWARA Katsunori
largefiles: reduce OR-ing of same conditions
r16074 if lfutil.standin(f) in ctx:
various
hgext: add largefiles extension...
r15168 return lfutil.standin(f)
elif lfutil.standin(f) in repo[None]:
return None
return f
m._files = [tostandin(f) for f in m._files]
m._files = [f for f in m._files if f is not None]
m._fmap = set(m._files)
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 origmatchfn = m.matchfn
various
hgext: add largefiles extension...
r15168 def matchfn(f):
if lfutil.isstandin(f):
Greg Ward
largefiles: more work on cleaning up comments...
r15254 # We need to keep track of what largefiles are being
# matched so we know which ones to update later --
# otherwise we accidentally revert changes to other
# largefiles. This is repo-specific, so duckpunch the
# repo object to keep the list of largefiles for us
various
hgext: add largefiles extension...
r15168 # later.
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 if origmatchfn(lfutil.splitstandin(f)) and \
various
hgext: add largefiles extension...
r15168 (f in repo[None] or f in ctx):
lfileslist = getattr(repo, '_lfilestoupdate', [])
lfileslist.append(lfutil.splitstandin(f))
repo._lfilestoupdate = lfileslist
return True
else:
return False
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 return origmatchfn(f)
various
hgext: add largefiles extension...
r15168 m.matchfn = matchfn
return m
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 oldmatch = installmatchfn(overridematch)
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 scmutil.match
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 matches = overridematch(repo[None], pats, opts)
various
hgext: add largefiles extension...
r15168 orig(ui, repo, *pats, **opts)
finally:
restorematchfn()
lfileslist = getattr(repo, '_lfilestoupdate', [])
Matt Mackall
largefiles: fix over-long lines
r15170 lfcommands.updatelfiles(ui, repo, filelist=lfileslist,
printmessage=False)
Greg Ward
largefiles: more work on cleaning up comments...
r15254
# empty out the largefiles list so we start fresh next time
various
hgext: add largefiles extension...
r15168 repo._lfilestoupdate = []
for lfile in modified:
if lfile in lfileslist:
if os.path.exists(repo.wjoin(lfutil.standin(lfile))) and lfile\
in repo['.']:
lfutil.writestandin(repo, lfutil.standin(lfile),
repo['.'][lfile].data().strip(),
'x' in repo['.'][lfile].flags())
lfdirstate = lfutil.openlfdirstate(ui, repo)
for lfile in added:
standin = lfutil.standin(lfile)
if standin not in ctx and (standin in matches or opts.get('all')):
if lfile in lfdirstate:
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 lfdirstate.drop(lfile)
various
hgext: add largefiles extension...
r15168 util.unlinkpath(repo.wjoin(standin))
lfdirstate.write()
finally:
wlock.release()
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def hgupdate(orig, repo, node):
Na'Tosha Bard
largefiles: move calculation of largefiles for updating to utility function
r16245 # Only call updatelfiles the standins that have changed to save time
Na'Tosha Bard
largefiles: optimize update speed by only updating changed largefiles...
r16120 oldstandins = lfutil.getstandinsstate(repo)
various
hgext: add largefiles extension...
r15168 result = orig(repo, node)
Na'Tosha Bard
largefiles: optimize update speed by only updating changed largefiles...
r16120 newstandins = lfutil.getstandinsstate(repo)
Na'Tosha Bard
largefiles: move calculation of largefiles for updating to utility function
r16245 filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
Na'Tosha Bard
largefiles: optimize update speed by only updating changed largefiles...
r16120 lfcommands.updatelfiles(repo.ui, repo, filelist=filelist, printmessage=True)
various
hgext: add largefiles extension...
r15168 return result
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def hgclean(orig, repo, node, show_stats=True):
various
hgext: add largefiles extension...
r15168 result = orig(repo, node, show_stats)
lfcommands.updatelfiles(repo.ui, repo)
return result
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def hgmerge(orig, repo, node, force=None, remind=True):
Na'Tosha Bard
largefiles: correctly download new largefiles when merging...
r15860 # Mark the repo as being in the middle of a merge, so that
# updatelfiles() will know that it needs to trust the standins in
# the working copy, not in the standins in the current node
repo._ismerging = True
try:
result = orig(repo, node, force, remind)
lfcommands.updatelfiles(repo.ui, repo)
finally:
repo._ismerging = False
various
hgext: add largefiles extension...
r15168 return result
Greg Ward
largefiles: more work on cleaning up comments...
r15254 # When we rebase a repository with remotely changed largefiles, we need to
# take some extra care so that the largefiles are correctly updated in the
# working copy
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridepull(orig, ui, repo, source=None, **opts):
Na'Tosha Bard
largefiles: add --all-largefiles flag to pull
r16692 revsprepull = len(repo)
various
hgext: add largefiles extension...
r15168 if opts.get('rebase', False):
repo._isrebasing = True
try:
if opts.get('update'):
Mads Kiilerich
check-code: indent 4 spaces in py files
r17299 del opts['update']
ui.debug('--update and --rebase are not compatible, ignoring '
'the update flag\n')
various
hgext: add largefiles extension...
r15168 del opts['rebase']
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 cmdutil.bailifchanged(repo)
various
hgext: add largefiles extension...
r15168 origpostincoming = commands.postincoming
def _dummy(*args, **kwargs):
pass
commands.postincoming = _dummy
if not source:
source = 'default'
Matt Harbison
largefiles: use 'default' instead of 'default-push' when pulling (issue3584)...
r17847 repo.lfpullsource = source
various
hgext: add largefiles extension...
r15168 try:
result = commands.pull(ui, repo, source, **opts)
finally:
commands.postincoming = origpostincoming
revspostpull = len(repo)
if revspostpull > revsprepull:
result = result or rebase.rebase(ui, repo)
finally:
repo._isrebasing = False
else:
if not source:
source = 'default'
Matt Harbison
largefiles: use 'default' instead of 'default-push' when pulling (issue3584)...
r17847 repo.lfpullsource = source
Na'Tosha Bard
largefiles: only cache largefiles in new heads...
r16103 oldheads = lfutil.getcurrentheads(repo)
various
hgext: add largefiles extension...
r15168 result = orig(ui, repo, source, **opts)
Na'Tosha Bard
largefiles: cache new largefiles for new heads when pulling...
r15916 # If we do not have the new largefiles for any new heads we pulled, we
# will run into a problem later if we try to merge or rebase with one of
timeless@mozdev.org
spelling: directly
r17484 # these heads, so cache the largefiles now directly into the system
Na'Tosha Bard
largefiles: cache new largefiles for new heads when pulling...
r15916 # cache.
ui.status(_("caching new largefiles\n"))
numcached = 0
Na'Tosha Bard
largefiles: only cache largefiles in new heads...
r16103 heads = lfutil.getcurrentheads(repo)
newheads = set(heads).difference(set(oldheads))
for head in newheads:
(cached, missing) = lfcommands.cachelfiles(ui, repo, head)
numcached += len(cached)
Matt Mackall
i18n: fix all remaining uses of % inside _()
r16231 ui.status(_("%d largefiles cached\n") % numcached)
Na'Tosha Bard
largefiles: add --all-largefiles flag to pull
r16692 if opts.get('all_largefiles'):
revspostpull = len(repo)
revs = []
for rev in xrange(revsprepull + 1, revspostpull):
revs.append(repo[rev].rev())
lfcommands.downloadlfiles(ui, repo, revs)
various
hgext: add largefiles extension...
r15168 return result
Na'Tosha Bard
largefiles: add --all-largefiles flag to clone (issue3188)
r16644 def overrideclone(orig, ui, source, dest=None, **opts):
Matt Harbison
largefiles: don't convert dest=None to dest=hg.defaultdest() in clone command...
r17600 d = dest
if d is None:
d = hg.defaultdest(source)
if opts.get('all_largefiles') and not hg.islocal(d):
Levi Bard
largefiles: don't attempt to clone all largefiles to non-local destinations
r16723 raise util.Abort(_(
'--all-largefiles is incompatible with non-local destination %s' %
Matt Harbison
largefiles: don't convert dest=None to dest=hg.defaultdest() in clone command...
r17600 d))
Matt Harbison
largefiles: delegate to the wrapped clone command...
r17601
return orig(ui, source, dest, **opts)
def hgclone(orig, ui, opts, *args, **kwargs):
result = orig(ui, opts, *args, **kwargs)
Matt Harbison
largefiles: always create the cache and standin directories when cloning...
r17824 if result is not None:
Na'Tosha Bard
largefiles: add --all-largefiles flag to clone (issue3188)
r16644 sourcerepo, destrepo = result
Matt Harbison
largefiles: restore caching of largefiles with 'clone -U --all-largefiles'...
r17599 repo = destrepo.local()
# The .hglf directory must exist for the standin matcher to match
# anything (which listlfiles uses for each rev), and .hg/largefiles is
# assumed to exist by the code that caches the downloaded file. These
Matt Harbison
largefiles: always create the cache and standin directories when cloning...
r17824 # directories exist if clone updated to any rev. (If the repo does not
# have largefiles, download never gets to the point of needing
# .hg/largefiles, and the standin matcher won't match anything anyway.)
if 'largefiles' in repo.requirements:
if opts.get('noupdate'):
Mads Kiilerich
largefiles: use plain wjoin instead of the complex pathto
r18150 util.makedirs(repo.wjoin(lfutil.shortname))
Matt Harbison
largefiles: always create the cache and standin directories when cloning...
r17824 util.makedirs(repo.join(lfutil.longname))
Matt Harbison
largefiles: restore caching of largefiles with 'clone -U --all-largefiles'...
r17599
# Caching is implicitly limited to 'rev' option, since the dest repo was
Matt Harbison
largefiles: always create the cache and standin directories when cloning...
r17824 # truncated at that point. The user may expect a download count with
# this option, so attempt whether or not this is a largefile repo.
if opts.get('all_largefiles'):
success, missing = lfcommands.downloadlfiles(ui, repo, None)
Matt Harbison
largefiles: delegate to the wrapped clone command...
r17601
Matt Harbison
largefiles: always create the cache and standin directories when cloning...
r17824 if missing != 0:
return None
Matt Harbison
largefiles: delegate to the wrapped clone command...
r17601
return result
Na'Tosha Bard
largefiles: add --all-largefiles flag to clone (issue3188)
r16644
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overriderebase(orig, ui, repo, **opts):
various
hgext: add largefiles extension...
r15168 repo._isrebasing = True
try:
Matt Harbison
largefiles: preserve the exit status of the rebase command
r17578 return orig(ui, repo, **opts)
various
hgext: add largefiles extension...
r15168 finally:
repo._isrebasing = False
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridearchive(orig, repo, dest, node, kind, decode=True, matchfn=None,
various
hgext: add largefiles extension...
r15168 prefix=None, mtime=None, subrepos=None):
Greg Ward
largefiles: more work on cleaning up comments...
r15254 # No need to lock because we are only reading history and
# largefile caches, neither of which are modified.
various
hgext: add largefiles extension...
r15168 lfcommands.cachelfiles(repo.ui, repo, node)
if kind not in archival.archivers:
raise util.Abort(_("unknown archive type '%s'") % kind)
ctx = repo[node]
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 if kind == 'files':
if prefix:
raise util.Abort(
_('cannot give prefix when archiving to files'))
else:
prefix = archival.tidyprefix(dest, kind, prefix)
various
hgext: add largefiles extension...
r15168
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 def write(name, mode, islink, getdata):
if matchfn and not matchfn(name):
return
data = getdata()
if decode:
data = repo.wwritedata(name, data)
archiver.addfile(prefix + name, mode, islink, data)
various
hgext: add largefiles extension...
r15168
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 archiver = archival.archivers[kind](dest, mtime or ctx.date()[0])
various
hgext: add largefiles extension...
r15168
if repo.ui.configbool("ui", "archivemeta", True):
def metadata():
base = 'repo: %s\nnode: %s\nbranch: %s\n' % (
hex(repo.changelog.node(0)), hex(node), ctx.branch())
tags = ''.join('tag: %s\n' % t for t in ctx.tags()
if repo.tagtype(t) == 'global')
if not tags:
repo.ui.pushbuffer()
opts = {'template': '{latesttag}\n{latesttagdistance}',
'style': '', 'patch': None, 'git': None}
cmdutil.show_changeset(repo.ui, repo, opts).show(ctx)
ltags, dist = repo.ui.popbuffer().split('\n')
tags = ''.join('latesttag: %s\n' % t for t in ltags.split(':'))
tags += 'latesttagdistance: %s\n' % dist
return base + tags
write('.hg_archival.txt', 0644, False, metadata)
for f in ctx:
ff = ctx.flags(f)
getdata = ctx[f].data
if lfutil.isstandin(f):
path = lfutil.findfile(repo, getdata().strip())
Na'Tosha Bard
largefiles: check if largefile could be found when archiving (issue3193)
r15914 if path is None:
raise util.Abort(
_('largefile %s not found in repo store or system cache')
% lfutil.splitstandin(f))
various
hgext: add largefiles extension...
r15168 f = lfutil.splitstandin(f)
def getdatafn():
Mads Kiilerich
largefiles: avoid use of uinitialized variable in case of errors
r15576 fd = None
various
hgext: add largefiles extension...
r15168 try:
fd = open(path, 'rb')
return fd.read()
finally:
Mads Kiilerich
largefiles: avoid use of uinitialized variable in case of errors
r15576 if fd:
fd.close()
various
hgext: add largefiles extension...
r15168
getdata = getdatafn
write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata)
if subrepos:
for subpath in ctx.substate:
sub = ctx.sub(subpath)
Matt Harbison
subrepo: propagate matcher to subrepos when archiving...
r17108 submatch = match_.narrowmatcher(subpath, matchfn)
sub.archive(repo.ui, archiver, prefix, submatch)
various
hgext: add largefiles extension...
r15168
archiver.done()
Matt Harbison
subrepo: propagate matcher to subrepos when archiving...
r17108 def hgsubrepoarchive(orig, repo, ui, archiver, prefix, match=None):
Matt Harbison
largefiles: download missing subrepo revs when archiving...
r17695 repo._get(repo._state + ('hg',))
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578 rev = repo._state[1]
ctx = repo._repo[rev]
lfcommands.cachelfiles(ui, repo._repo, ctx.node())
def write(name, mode, islink, getdata):
Matt Harbison
subrepo: propagate matcher to subrepos when archiving...
r17108 # At this point, the standin has been replaced with the largefile name,
# so the normal matcher works here without the lfutil variants.
if match and not match(f):
return
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578 data = getdata()
archiver.addfile(prefix + repo._path + '/' + name, mode, islink, data)
for f in ctx:
ff = ctx.flags(f)
getdata = ctx[f].data
if lfutil.isstandin(f):
path = lfutil.findfile(repo._repo, getdata().strip())
if path is None:
raise util.Abort(
_('largefile %s not found in repo store or system cache')
% lfutil.splitstandin(f))
f = lfutil.splitstandin(f)
def getdatafn():
fd = None
try:
fd = open(os.path.join(prefix, path), 'rb')
return fd.read()
finally:
if fd:
fd.close()
getdata = getdatafn
write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata)
for subpath in ctx.substate:
sub = ctx.sub(subpath)
Matt Harbison
subrepo: propagate matcher to subrepos when archiving...
r17108 submatch = match_.narrowmatcher(subpath, match)
sub.archive(ui, archiver, os.path.join(prefix, repo._path) + '/',
submatch)
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578
Greg Ward
largefiles: more work on cleaning up comments...
r15254 # If a largefile is modified, the change is not reflected in its
# standin until a commit. cmdutil.bailifchanged() raises an exception
# if the repo has uncommitted changes. Wrap it to also check if
# largefiles were changed. This is used by bisect and backout.
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridebailifchanged(orig, repo):
various
hgext: add largefiles extension...
r15168 orig(repo)
repo.lfstatus = True
modified, added, removed, deleted = repo.status()[:4]
repo.lfstatus = False
if modified or added or removed or deleted:
raise util.Abort(_('outstanding uncommitted changes'))
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 # Fetch doesn't use cmdutil.bailifchanged so override it to add the check
def overridefetch(orig, ui, repo, *pats, **opts):
various
hgext: add largefiles extension...
r15168 repo.lfstatus = True
modified, added, removed, deleted = repo.status()[:4]
repo.lfstatus = False
if modified or added or removed or deleted:
raise util.Abort(_('outstanding uncommitted changes'))
return orig(ui, repo, *pats, **opts)
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overrideforget(orig, ui, repo, *pats, **opts):
various
hgext: add largefiles extension...
r15168 installnormalfilesmatchfn(repo[None].manifest())
Matt Harbison
largefiles: preserve the exit status of the forget command...
r17579 result = orig(ui, repo, *pats, **opts)
various
hgext: add largefiles extension...
r15168 restorematchfn()
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 m = scmutil.match(repo[None], pats, opts)
various
hgext: add largefiles extension...
r15168
try:
repo.lfstatus = True
s = repo.status(match=m, clean=True)
finally:
repo.lfstatus = False
forget = sorted(s[0] + s[1] + s[3] + s[6])
forget = [f for f in forget if lfutil.standin(f) in repo[None].manifest()]
for f in forget:
if lfutil.standin(f) not in repo.dirstate and not \
os.path.isdir(m.rel(lfutil.standin(f))):
ui.warn(_('not removing %s: file is already untracked\n')
% m.rel(f))
Matt Harbison
largefiles: preserve the exit status of the forget command...
r17579 result = 1
various
hgext: add largefiles extension...
r15168
for f in forget:
if ui.verbose or not m.exact(f):
ui.status(_('removing %s\n') % m.rel(f))
# Need to lock because standin files are deleted then removed from the
Mads Kiilerich
fix trivial spelling errors
r17424 # repository and we could race in-between.
various
hgext: add largefiles extension...
r15168 wlock = repo.wlock()
try:
lfdirstate = lfutil.openlfdirstate(ui, repo)
for f in forget:
if lfdirstate[f] == 'a':
lfdirstate.drop(f)
else:
lfdirstate.remove(f)
lfdirstate.write()
Mads Kiilerich
largefiles: remove reporemove portability wrapper
r18153 standins = [lfutil.standin(f) for f in forget]
for f in standins:
util.unlinkpath(repo.wjoin(f), ignoremissing=True)
repo[None].forget(standins)
various
hgext: add largefiles extension...
r15168 finally:
wlock.release()
Matt Harbison
largefiles: preserve the exit status of the forget command...
r17579 return result
various
hgext: add largefiles extension...
r15168 def getoutgoinglfiles(ui, repo, dest=None, **opts):
dest = ui.expandpath(dest or 'default-push', dest or 'default')
dest, branches = hg.parseurl(dest, opts.get('branch'))
revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
if revs:
Matt Harbison
largefiles: support revsets for outgoing --large...
r17271 revs = [repo.lookup(rev) for rev in scmutil.revrange(repo, revs)]
various
hgext: add largefiles extension...
r15168
try:
Simon Heimberg
largefiles: use hg.peer instead of hg.remoteui
r17276 remote = hg.peer(repo, opts, dest)
various
hgext: add largefiles extension...
r15168 except error.RepoError:
return None
Mads Kiilerich
largefiles: remove findoutgoing portability wrapper
r18152 outgoing = discovery.findcommonoutgoing(repo, remote.peer(), force=False)
if not outgoing.missing:
return outgoing.missing
o = repo.changelog.nodesbetween(outgoing.missing, revs)[0]
various
hgext: add largefiles extension...
r15168 if opts.get('newest_first'):
o.reverse()
toupload = set()
for n in o:
parents = [p for p in repo.changelog.parents(n) if p != node.nullid]
ctx = repo[n]
files = set(ctx.files())
if len(parents) == 2:
mc = ctx.manifest()
mp1 = ctx.parents()[0].manifest()
mp2 = ctx.parents()[1].manifest()
for f in mp1:
if f not in mc:
files.add(f)
for f in mp2:
if f not in mc:
files.add(f)
for f in mc:
if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None):
files.add(f)
Greg Ward
largefiles: cosmetics, whitespace, code style...
r15255 toupload = toupload.union(
set([f for f in files if lfutil.isstandin(f) and f in ctx]))
various
hgext: add largefiles extension...
r15168 return toupload
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overrideoutgoing(orig, ui, repo, dest=None, **opts):
Matt Harbison
largefiles: preserve exit code from outgoing command (issue3611)...
r17575 result = orig(ui, repo, dest, **opts)
various
hgext: add largefiles extension...
r15168
if opts.pop('large', None):
toupload = getoutgoinglfiles(ui, repo, dest, **opts)
if toupload is None:
ui.status(_('largefiles: No remote repo\n'))
FUJIWARA Katsunori
largefiles: distinguish "no remote repo" from "no files to upload" (issue3651)...
r17835 elif not toupload:
ui.status(_('largefiles: no files to upload\n'))
various
hgext: add largefiles extension...
r15168 else:
ui.status(_('largefiles to upload:\n'))
for file in toupload:
ui.status(lfutil.splitstandin(file) + '\n')
ui.status('\n')
Matt Harbison
largefiles: preserve exit code from outgoing command (issue3611)...
r17575 return result
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridesummary(orig, ui, repo, *pats, **opts):
Na'Tosha Bard
largefiles: fix output of hg summary (issue3060)
r15787 try:
repo.lfstatus = True
orig(ui, repo, *pats, **opts)
finally:
repo.lfstatus = False
various
hgext: add largefiles extension...
r15168
if opts.pop('large', None):
toupload = getoutgoinglfiles(ui, repo, None, **opts)
if toupload is None:
FUJIWARA Katsunori
i18n: add "i18n" comment to column positioning messages of "hg summary"...
r17892 # i18n: column positioning for "hg summary"
FUJIWARA Katsunori
i18n: change output of largefiles for summary to distinguish from one for outgoing...
r17894 ui.status(_('largefiles: (no remote repo)\n'))
FUJIWARA Katsunori
largefiles: distinguish "no remote repo" from "no files to upload" (issue3651)...
r17835 elif not toupload:
FUJIWARA Katsunori
i18n: add "i18n" comment to column positioning messages of "hg summary"...
r17892 # i18n: column positioning for "hg summary"
FUJIWARA Katsunori
largefiles: distinguish "no remote repo" from "no files to upload" (issue3651)...
r17835 ui.status(_('largefiles: (no files to upload)\n'))
various
hgext: add largefiles extension...
r15168 else:
FUJIWARA Katsunori
i18n: add "i18n" comment to column positioning messages of "hg summary"...
r17892 # i18n: column positioning for "hg summary"
various
hgext: add largefiles extension...
r15168 ui.status(_('largefiles: %d to upload\n') % len(toupload))
Matt Harbison
largefiles: handle commit -A properly, after a --large commit (issue3542)...
r17658 def scmutiladdremove(orig, repo, pats=[], opts={}, dry_run=None,
similarity=None):
Na'Tosha Bard
largefiles: follow normal codepath for addremove if non-largefiles repo (issue3249)
r16636 if not lfutil.islfilesrepo(repo):
Matt Harbison
largefiles: handle commit -A properly, after a --large commit (issue3542)...
r17658 return orig(repo, pats, opts, dry_run, similarity)
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 # Get the list of missing largefiles so we can remove them
Matt Harbison
largefiles: handle commit -A properly, after a --large commit (issue3542)...
r17658 lfdirstate = lfutil.openlfdirstate(repo.ui, repo)
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
False, False)
(unsure, modified, added, removed, missing, unknown, ignored, clean) = s
various
hgext: add largefiles extension...
r15168
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 # Call into the normal remove code, but the removing of the standin, we want
# to have handled by original addremove. Monkey patching here makes sure
# we don't remove the standin in the largefiles code, preventing a very
# confused state later.
Na'Tosha Bard
largefiles: fix addremove when no largefiles are specified
r15967 if missing:
Matt Harbison
largefiles: fix addremove with -R option...
r17229 m = [repo.wjoin(f) for f in missing]
Na'Tosha Bard
largefiles: fix addremove when no largefiles are specified
r15967 repo._isaddremove = True
Matt Harbison
largefiles: handle commit -A properly, after a --large commit (issue3542)...
r17658 removelargefiles(repo.ui, repo, *m, **opts)
Na'Tosha Bard
largefiles: fix addremove when no largefiles are specified
r15967 repo._isaddremove = False
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 # Call into the normal add code, and any files that *should* be added as
# largefiles will be
Matt Harbison
largefiles: handle commit -A properly, after a --large commit (issue3542)...
r17658 addlargefiles(repo.ui, repo, *pats, **opts)
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 # Now that we've handled largefiles, hand off to the original addremove
# function to take care of the rest. Make sure it doesn't do anything with
# largefiles by installing a matcher that will ignore them.
installnormalfilesmatchfn(repo[None].manifest())
Matt Harbison
largefiles: handle commit -A properly, after a --large commit (issue3542)...
r17658 result = orig(repo, pats, opts, dry_run, similarity)
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 restorematchfn()
return result
various
hgext: add largefiles extension...
r15168
Greg Ward
largefiles: more work on cleaning up comments...
r15254 # Calling purge with --all will cause the largefiles to be deleted.
various
hgext: add largefiles extension...
r15168 # Override repo.status to prevent this from happening.
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridepurge(orig, ui, repo, *dirs, **opts):
Pierre-Yves David
largefile: status is buggy on repoproxy, so run unfiltered...
r18012 # XXX large file status is buggy when used on repo proxy.
# XXX this needs to be investigate.
repo = repo.unfiltered()
various
hgext: add largefiles extension...
r15168 oldstatus = repo.status
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridestatus(node1='.', node2=None, match=None, ignored=False,
various
hgext: add largefiles extension...
r15168 clean=False, unknown=False, listsubrepos=False):
r = oldstatus(node1, node2, match, ignored, clean, unknown,
listsubrepos)
lfdirstate = lfutil.openlfdirstate(ui, repo)
modified, added, removed, deleted, unknown, ignored, clean = r
unknown = [f for f in unknown if lfdirstate[f] == '?']
ignored = [f for f in ignored if lfdirstate[f] == '?']
return modified, added, removed, deleted, unknown, ignored, clean
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 repo.status = overridestatus
various
hgext: add largefiles extension...
r15168 orig(ui, repo, *dirs, **opts)
repo.status = oldstatus
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overriderollback(orig, ui, repo, **opts):
various
hgext: add largefiles extension...
r15168 result = orig(ui, repo, **opts)
merge.update(repo, node=None, branchmerge=False, force=True,
partial=lfutil.isstandin)
Levi Bard
largefiles: fix inappropriate locking (issue3182)...
r15794 wlock = repo.wlock()
try:
lfdirstate = lfutil.openlfdirstate(ui, repo)
lfiles = lfutil.listlfiles(repo)
oldlfiles = lfutil.listlfiles(repo, repo[None].parents()[0].rev())
for file in lfiles:
if file in oldlfiles:
lfdirstate.normallookup(file)
else:
lfdirstate.add(file)
lfdirstate.write()
finally:
wlock.release()
various
hgext: add largefiles extension...
r15168 return result
Na'Tosha Bard
largefiles: fix bad bug where transplanting a changeset with a largefile will result in an old largefile being comitted later on
r15383
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridetransplant(orig, ui, repo, *revs, **opts):
Na'Tosha Bard
largefiles: fix transplant for all cases (issue3192)
r15982 try:
Na'Tosha Bard
largefiles: only update changed largefiles when transplanting
r16246 oldstandins = lfutil.getstandinsstate(repo)
Na'Tosha Bard
largefiles: fix transplant for all cases (issue3192)
r15982 repo._istransplanting = True
result = orig(ui, repo, *revs, **opts)
Na'Tosha Bard
largefiles: only update changed largefiles when transplanting
r16246 newstandins = lfutil.getstandinsstate(repo)
filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
lfcommands.updatelfiles(repo.ui, repo, filelist=filelist,
printmessage=True)
Na'Tosha Bard
largefiles: fix transplant for all cases (issue3192)
r15982 finally:
repo._istransplanting = False
Na'Tosha Bard
largefiles: fix bad bug where transplanting a changeset with a largefile will result in an old largefile being comitted later on
r15383 return result
Na'Tosha Bard
largefiles: fix cat for largefiles (issue3352)...
r16439
def overridecat(orig, ui, repo, file1, *pats, **opts):
Matt Harbison
largefiles: support revsets for cat...
r17269 ctx = scmutil.revsingle(repo, opts.get('rev'))
if not lfutil.standin(file1) in ctx:
Na'Tosha Bard
largefiles: fix cat for largefiles (issue3352)...
r16439 result = orig(ui, repo, file1, *pats, **opts)
return result
Matt Harbison
largefiles: support revsets for cat...
r17269 return lfcommands.catlfile(repo, file1, ctx.rev(), opts.get('output'))
Matt Harbison
largefiles: don't copy largefiles from working dir to the store while converting...
r17878
def mercurialsinkbefore(orig, sink):
sink.repo._isconverting = True
orig(sink)
def mercurialsinkafter(orig, sink):
sink.repo._isconverting = False
orig(sink)