##// END OF EJS Templates
debugsuccessorssets: fix typos in docstring
debugsuccessorssets: fix typos in docstring

File last commit:

r18386:03442135 default
r18458:9354a8c1 stable
Show More
overrides.py
1163 lines | 44.6 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)
Mads Kiilerich
refactoring: use unlinkpath with ignoremissing
r18386 util.unlinkpath(repo.wjoin(f), ignoremissing=True)
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):
Mads Kiilerich
largefiles: make log match largefiles in the non-standin location too...
r18341 def overridematch(ctx, pats=[], opts={}, globbed=False,
default='relpath'):
"""Matcher that merges root directory with .hglf, suitable for log.
It is still possible to match .hglf directly.
For any listed files run log on the standin too.
matchfn tries both the given filename and with .hglf stripped.
"""
match = oldmatch(ctx, pats, opts, globbed, default)
m = copy.copy(match)
standins = [lfutil.standin(f) for f in m._files]
m._files.extend(standins)
m._fmap = set(m._files)
origmatchfn = m.matchfn
def lfmatchfn(f):
lf = lfutil.splitstandin(f)
if lf is not None and origmatchfn(lf):
return True
r = origmatchfn(f)
return r
m.matchfn = lfmatchfn
return m
oldmatch = installmatchfn(overridematch)
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
Mads Kiilerich
largefiles: make log match largefiles in the non-standin location too...
r18341 restorematchfn()
various
hgext: add largefiles extension...
r15168
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:
Mads Kiilerich
subrepos: process subrepos in sorted order...
r18364 for subpath in sorted(ctx.substate):
various
hgext: add largefiles extension...
r15168 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)
Mads Kiilerich
subrepos: process subrepos in sorted order...
r18364 for subpath in sorted(ctx.substate):
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578 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]))
Mads Kiilerich
largefiles: upload files in sorted order
r18368 return sorted(toupload)
various
hgext: add largefiles extension...
r15168
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)