##// END OF EJS Templates
tracing: add a couple of trace points on obsolete and repoview...
tracing: add a couple of trace points on obsolete and repoview I was seeing weird stalls in some fast commands, and these trace events help explain them. Differential Revision: https://phab.mercurial-scm.org/D6550

File last commit:

r43375:649d3ac3 default
r43515:74affe7b default
Show More
overrides.py
1827 lines | 58.9 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'''
liscju
py3: make largefiles/overrides.py use absolute_import
r29311 from __future__ import absolute_import
various
hgext: add largefiles extension...
r15168
import copy
liscju
py3: make largefiles/overrides.py use absolute_import
r29311 import os
various
hgext: add largefiles extension...
r15168
from mercurial.i18n import _
Gregory Szorc
py3: manually import pycompat.open into files that need it...
r43355 from mercurial.pycompat import open
Augie Fackler
formatting: blacken the codebase...
r43346 from mercurial.hgweb import webcommands
Matt Harbison
largefiles: port wrapped functions to exthelper...
r41092
liscju
py3: make largefiles/overrides.py use absolute_import
r29311 from mercurial import (
archival,
cmdutil,
Matt Harbison
largefiles: port wrapped functions to exthelper...
r41092 copies as copiesmod,
liscju
py3: make largefiles/overrides.py use absolute_import
r29311 error,
Matt Harbison
largefiles: port wrapped functions to exthelper...
r41092 exchange,
Martin von Zweigbergk
largefiles: use wrappedfunction() for matchandpats() override in overridelog()...
r41719 extensions,
Matt Harbison
largefiles: port commands to exthelper...
r41091 exthelper,
Matt Harbison
largefiles: port wrapped functions to exthelper...
r41092 filemerge,
liscju
py3: make largefiles/overrides.py use absolute_import
r29311 hg,
Yuya Nishihara
cmdutil: split functions of log-like commands to new module (API)...
r35903 logcmdutil,
liscju
largefiles: rename match_ to matchmod import in overrides
r29318 match as matchmod,
Matt Harbison
largefiles: port wrapped functions to exthelper...
r41092 merge,
liscju
py3: make largefiles/overrides.py use absolute_import
r29311 pathutil,
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 pycompat,
liscju
py3: make largefiles/overrides.py use absolute_import
r29311 scmutil,
Yuya Nishihara
revset: import set classes directly from smartset module...
r31023 smartset,
Matt Harbison
largefiles: port wrapped functions to exthelper...
r41092 subrepo,
upgrade,
url as urlmod,
liscju
py3: make largefiles/overrides.py use absolute_import
r29311 util,
)
from . import (
lfcommands,
lfutil,
storefactory,
)
various
hgext: add largefiles extension...
r15168
Matt Harbison
largefiles: port commands to exthelper...
r41091 eh = exthelper.exthelper()
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 # -- Utility functions: commonly/repeatedly needed functionality ---------------
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
largefiles: introduce the 'composelargefilematcher()' method...
r23617 def composelargefilematcher(match, manifest):
'''create a matcher that matches only the largefiles in the original
matcher'''
m = copy.copy(match)
lfile = lambda f: lfutil.standin(f) in manifest
Augie Fackler
largfiles: replace filter() with listcomp when result needs to be a list...
r36329 m._files = [lf for lf in m._files if lfile(lf)]
Martin von Zweigbergk
match: make _fileroots a @propertycache and rename it to _fileset...
r32323 m._fileset = set(m._files)
Martin von Zweigbergk
largefiles: replace always() method, not _always field...
r32387 m.always = lambda: False
Matt Harbison
largefiles: introduce the 'composelargefilematcher()' method...
r23617 origmatchfn = m.matchfn
m.matchfn = lambda f: lfile(f) and origmatchfn(f)
return m
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
largefiles: don't print files as both large and normal in addremove dryruns
r23769 def composenormalfilematcher(match, manifest, exclude=None):
excluded = set()
if exclude is not None:
excluded.update(exclude)
Matt Harbison
largefiles: split the creation of a normal matcher out of its install method...
r23428 m = copy.copy(match)
Augie Fackler
formatting: blacken the codebase...
r43346 notlfile = lambda f: not (
lfutil.isstandin(f) or lfutil.standin(f) in manifest or f in excluded
)
Augie Fackler
largfiles: replace filter() with listcomp when result needs to be a list...
r36329 m._files = [lf for lf in m._files if notlfile(lf)]
Martin von Zweigbergk
match: make _fileroots a @propertycache and rename it to _fileset...
r32323 m._fileset = set(m._files)
Martin von Zweigbergk
largefiles: replace always() method, not _always field...
r32387 m.always = lambda: False
Matt Harbison
largefiles: split the creation of a normal matcher out of its install method...
r23428 origmatchfn = m.matchfn
m.matchfn = lambda f: notlfile(f) and origmatchfn(f)
return m
Augie Fackler
formatting: blacken the codebase...
r43346
Martin von Zweigbergk
largefiles: use uipathfn instead of match.{rel,uipath}() (API)...
r41803 def addlargefiles(ui, repo, isaddremove, matcher, uipathfn, **opts):
Pulkit Goyal
py3: abuse r'' to access keys in keyword arguments
r32157 large = opts.get(r'large')
Greg Ward
largefiles: factor out lfutil.getminsize()
r15227 lfsize = lfutil.getminsize(
Augie Fackler
formatting: blacken the codebase...
r43346 ui, lfutil.islfilesrepo(repo), opts.get(r'lfsize')
)
various
hgext: add largefiles extension...
r15168
lfmatcher = None
Michal Sznajder
largefiles: tiny code clean up...
r15739 if lfutil.islfilesrepo(repo):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lfpats = ui.configlist(lfutil.longname, b'patterns')
various
hgext: add largefiles extension...
r15168 if lfpats:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lfmatcher = matchmod.match(repo.root, b'', list(lfpats))
various
hgext: add largefiles extension...
r15168
lfnames = []
Matt Harbison
largefiles: replace match.bad() monkey patching with match.badmatch()...
r25440 m = matcher
various
hgext: add largefiles extension...
r15168 wctx = repo[None]
Martin von Zweigbergk
cleanup: reuse existing wctx variables instead of calling repo[None]...
r32382 for f in wctx.walk(matchmod.badmatch(m, lambda x, y: None)):
various
hgext: add largefiles extension...
r15168 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:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.warn(_(b'%s already a largefile\n') % uipathfn(f))
various
hgext: add largefiles extension...
r15168 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 # In case the file was removed previously, but not committed
# (issue3507)
Matt Harbison
largefiles: convert addlargefiles() to vfs
r23733 if not repo.wvfs.exists(f):
Matt Harbison
largefiles: fix a traceback when addremove follows a remove (issue3507)...
r17231 continue
Augie Fackler
formatting: blacken the codebase...
r43346 abovemin = (
lfsize and repo.wvfs.lstat(f).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:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(_(b'adding %s as a largefile\n') % uipathfn(f))
various
hgext: add largefiles extension...
r15168
bad = []
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.
Bryan O'Sullivan
with: use context manager for wlock in addlargefiles
r27821 with repo.wlock():
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 if not opts.get(r'dry_run'):
Mads Kiilerich
largefiles: move initialization of standins variable to clarify its "scope"
r23041 standins = []
various
hgext: add largefiles extension...
r15168 lfdirstate = lfutil.openlfdirstate(ui, repo)
for f in lfnames:
standinname = lfutil.standin(f)
Augie Fackler
formatting: blacken the codebase...
r43346 lfutil.writestandin(
repo,
standinname,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 hash=b'',
Augie Fackler
formatting: blacken the codebase...
r43346 executable=lfutil.getexecutable(repo.wjoin(f)),
)
various
hgext: add largefiles extension...
r15168 standins.append(standinname)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if lfdirstate[f] == b'r':
various
hgext: add largefiles extension...
r15168 lfdirstate.normallookup(f)
else:
lfdirstate.add(f)
lfdirstate.write()
Augie Fackler
formatting: blacken the codebase...
r43346 bad += [
lfutil.splitstandin(f)
for f in repo[None].add(standins)
if f in m.files()
]
Matt Harbison
largefiles: return the list of added files from addlargefiles()...
r23768
added = [f for f in lfnames if f not in bad]
return added, bad
various
hgext: add largefiles extension...
r15168
Augie Fackler
formatting: blacken the codebase...
r43346
Martin von Zweigbergk
largefiles: use uipathfn instead of match.{rel,uipath}() (API)...
r41803 def removelargefiles(ui, repo, isaddremove, matcher, uipathfn, dryrun, **opts):
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 after = opts.get(r'after')
Matt Harbison
largefiles: pass a matcher instead of a raw file list to removelargefiles()...
r23741 m = composelargefilematcher(matcher, repo[None].manifest())
various
hgext: add largefiles extension...
r15168 try:
repo.lfstatus = True
Matt Harbison
largefiles: pass a matcher instead of a raw file list to removelargefiles()...
r23741 s = repo.status(match=m, clean=not isaddremove)
various
hgext: add largefiles extension...
r15168 finally:
repo.lfstatus = False
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 manifest = repo[None].manifest()
Augie Fackler
formatting: blacken the codebase...
r43346 modified, added, deleted, clean = [
[f for f in list if lfutil.standin(f) in manifest]
for list in (s.modified, s.added, s.deleted, s.clean)
]
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:
Martin von Zweigbergk
largefiles: use uipathfn instead of match.{rel,uipath}() (API)...
r41803 ui.warn(msg % uipathfn(f))
Matt Harbison
largefiles: exit from remove with 1 on warnings...
r17576 return int(len(files) > 0)
Na'Tosha Bard
largefiles: fix confusion upon removal of added largefile (issue3176)...
r15786 if after:
Martin von Zweigbergk
largefiles: remove 'forget' list that's always empty
r22630 remove = deleted
Augie Fackler
formatting: blacken the codebase...
r43346 result = warn(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 modified + added + clean, _(b'not removing %s: file still exists\n')
Augie Fackler
formatting: blacken the codebase...
r43346 )
various
hgext: add largefiles extension...
r15168 else:
Martin von Zweigbergk
largefiles: remove 'forget' list that's always empty
r22630 remove = deleted + clean
Augie Fackler
formatting: blacken the codebase...
r43346 result = warn(
modified,
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'not removing %s: file is modified (use -f'
b' to force removal)\n'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
)
result = (
warn(
added,
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'not removing %s: file has been marked for add'
b' (use forget to undo)\n'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
)
or result
)
various
hgext: add largefiles extension...
r15168
# 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.
Bryan O'Sullivan
with: use context manager for wlock in removelargefiles
r27822 with repo.wlock():
various
hgext: add largefiles extension...
r15168 lfdirstate = lfutil.openlfdirstate(ui, repo)
Matt Harbison
largefiles: eliminate a duplicate message when removing files in verbose mode...
r23658 for f in sorted(remove):
Matt Harbison
largefiles: align the output messages for a removed file with core methods...
r23766 if ui.verbose or not m.exact(f):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(_(b'removing %s\n') % uipathfn(f))
Matt Harbison
largefiles: don't actually remove largefiles in an addremove dry run...
r23592
Sushil khanchi
remove: add dry-run functionality
r37168 if not dryrun:
Matt Harbison
largefiles: don't actually remove largefiles in an addremove dry run...
r23592 if not after:
Mads Kiilerich
vfs: use repo.wvfs.unlinkpath
r31309 repo.wvfs.unlinkpath(f, ignoremissing=True)
Matt Harbison
largefiles: don't actually remove largefiles in an addremove dry run...
r23592
Sushil khanchi
remove: add dry-run functionality
r37168 if dryrun:
Matt Harbison
largefiles: don't actually remove largefiles in an addremove dry run...
r23592 return result
various
hgext: add largefiles extension...
r15168 remove = [lfutil.standin(f) for f in remove]
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 # If this is being called by addremove, let the original addremove
# function handle this.
Mads Kiilerich
largefiles: replace repo._isaddremove hack with a simple function parameter
r23038 if not isaddremove:
Mads Kiilerich
largefiles: remove reporemove portability wrapper
r18153 for f in remove:
Mads Kiilerich
vfs: use repo.wvfs.unlinkpath
r31309 repo.wvfs.unlinkpath(f, ignoremissing=True)
Mads Kiilerich
largefiles: remove reporemove portability wrapper
r18153 repo[None].forget(remove)
Matt Harbison
largefiles: properly sync lfdirstate after removing largefiles...
r23721
for f in remove:
Augie Fackler
formatting: blacken the codebase...
r43346 lfutil.synclfdirstate(
repo, lfdirstate, lfutil.splitstandin(f), False
)
Matt Harbison
largefiles: properly sync lfdirstate after removing largefiles...
r23721
lfdirstate.write()
various
hgext: add largefiles extension...
r15168
Matt Harbison
largefiles: exit from remove with 1 on warnings...
r17576 return result
Augie Fackler
formatting: blacken the codebase...
r43346
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.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(webcommands, b'decodepath')
Martin Geisler
largefiles: hide .hglf/ prefix for largefiles in hgweb...
r16449 def decodepath(orig, path):
return lfutil.splitstandin(path) or path
Augie Fackler
formatting: blacken the codebase...
r43346
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792 # -- Wrappers: modify existing commands --------------------------------
Augie Fackler
formatting: blacken the codebase...
r43346
@eh.wrapcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'add',
Augie Fackler
formatting: blacken the codebase...
r43346 opts=[
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 (b'', b'large', None, _(b'add as largefile')),
(b'', b'normal', None, _(b'add as normal file')),
Augie Fackler
formatting: blacken the codebase...
r43346 (
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'',
b'lfsize',
b'',
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'add all files above this size (in megabytes) '
b'as largefiles (default: 10)'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
),
],
)
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overrideadd(orig, ui, repo, *pats, **opts):
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 if opts.get(r'normal') and opts.get(r'large'):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'--normal cannot be used with --large'))
Matt Harbison
largefiles: enable subrepo support for add...
r23886 return orig(ui, repo, *pats, **opts)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(cmdutil, b'add')
Martin von Zweigbergk
add: pass around uipathfn and use instead of m.rel() (API)...
r41799 def cmdutiladd(orig, ui, repo, matcher, prefix, uipathfn, explicitonly, **opts):
Matt Harbison
largefiles: enable subrepo support for add...
r23886 # The --normal flag short circuits this override
Pulkit Goyal
py3: abuse r'' to access keys in keyword arguments
r32157 if opts.get(r'normal'):
Martin von Zweigbergk
add: pass around uipathfn and use instead of m.rel() (API)...
r41799 return orig(ui, repo, matcher, prefix, uipathfn, explicitonly, **opts)
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792
Martin von Zweigbergk
largefiles: use uipathfn instead of match.{rel,uipath}() (API)...
r41803 ladded, lbad = addlargefiles(ui, repo, False, matcher, uipathfn, **opts)
Augie Fackler
formatting: blacken the codebase...
r43346 normalmatcher = composenormalfilematcher(
matcher, repo[None].manifest(), ladded
)
Martin von Zweigbergk
add: pass around uipathfn and use instead of m.rel() (API)...
r41799 bad = orig(ui, repo, normalmatcher, prefix, uipathfn, explicitonly, **opts)
Matt Harbison
largefiles: enable subrepo support for add...
r23886
bad.extend(f for f in lbad)
return bad
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(cmdutil, b'remove')
Augie Fackler
formatting: blacken the codebase...
r43346 def cmdutilremove(
orig, ui, repo, matcher, prefix, uipathfn, after, force, subrepos, dryrun
):
Matt Harbison
largefiles: enable subrepo support for remove...
r23782 normalmatcher = composenormalfilematcher(matcher, repo[None].manifest())
Augie Fackler
formatting: blacken the codebase...
r43346 result = orig(
ui,
repo,
normalmatcher,
prefix,
uipathfn,
after,
force,
subrepos,
dryrun,
)
return (
removelargefiles(
ui, repo, False, matcher, uipathfn, dryrun, after=after, force=force
)
or result
)
Na'Tosha Bard
largefiles: implement addremove (issue3064)...
r15792
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(subrepo.hgsubrepo, b'status')
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
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapcommand(b'status')
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
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(subrepo.hgsubrepo, b'dirty')
Matt Harbison
subrepo: consider the parent repo dirty when a file is missing...
r33364 def overridedirty(orig, repo, ignoreupdate=False, missing=False):
Matt Harbison
largefiles: notice dirty large files in a subrepo...
r16516 try:
repo._repo.lfstatus = True
Matt Harbison
subrepo: consider the parent repo dirty when a file is missing...
r33364 return orig(repo, ignoreupdate=ignoreupdate, missing=missing)
Matt Harbison
largefiles: notice dirty large files in a subrepo...
r16516 finally:
repo._repo.lfstatus = False
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapcommand(b'log')
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridelog(orig, ui, repo, *pats, **opts):
Augie Fackler
formatting: blacken the codebase...
r43346 def overridematchandpats(
orig,
ctx,
pats=(),
opts=None,
globbed=False,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 default=b'relpath',
Augie Fackler
formatting: blacken the codebase...
r43346 badfn=None,
):
Mads Kiilerich
largefiles: make log match largefiles in the non-standin location too...
r18341 """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.
"""
Pierre-Yves David
largefiles: remove a mutable default argument...
r26339 if opts is None:
opts = {}
Martin von Zweigbergk
largefiles: use wrappedfunction() for matchandpats() override in overridelog()...
r41719 matchandpats = orig(ctx, pats, opts, globbed, default, badfn=badfn)
Lucas Moscovicz
largefiles: changed overridelog to work with graphlog...
r21110 m, p = copy.copy(matchandpats)
Siddharth Agarwal
largefiles: don't override matchandpats for always matchers (issue4334)...
r22170 if m.always():
# We want to match everything anyway, so there's no benefit trying
# to add standins.
return matchandpats
Lucas Moscovicz
largefiles: changed overridelog to work with graphlog...
r21110 pats = set(p)
Matt Harbison
largefiles: teach log to handle patterns...
r24206
def fixpats(pat, tostandin=lfutil.standin):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if pat.startswith(b'set:'):
Matt Harbison
largefiles: don't mangle filesets when fixing up the log matcher...
r24813 return pat
liscju
largefiles: rename match_ to matchmod import in overrides
r29318 kindpat = matchmod._patsplit(pat, None)
Matt Harbison
largefiles: teach log to handle patterns...
r24206
if kindpat[0] is not None:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return kindpat[0] + b':' + tostandin(kindpat[1])
Matt Harbison
largefiles: teach log to handle patterns...
r24206 return tostandin(kindpat[1])
Martin von Zweigbergk
largefiles: get cwd and relative paths from repo instead of matcher...
r41816 cwd = repo.getcwd()
if cwd:
Matt Harbison
largefiles: handle logging from outside the repo...
r24208 hglf = lfutil.shortname
Augie Fackler
formatting: blacken the codebase...
r43346 back = util.pconvert(repo.pathto(hglf)[: -len(hglf)])
Matt Harbison
largefiles: teach log to handle patterns...
r24206
def tostandin(f):
Mads Kiilerich
spelling: trivial spell checking
r26781 # The file may already be a standin, so truncate the back
Matt Harbison
largefiles: handle logging from outside the repo...
r24208 # prefix and test before mangling it. This avoids turning
Matt Harbison
largefiles: don't prefix standin patterns with '.hglf' when logging...
r24207 # 'glob:../.hglf/foo*' into 'glob:../.hglf/../.hglf/foo*'.
Augie Fackler
formatting: blacken the codebase...
r43346 if f.startswith(back) and lfutil.splitstandin(f[len(back) :]):
Matt Harbison
largefiles: don't prefix standin patterns with '.hglf' when logging...
r24207 return f
Matt Harbison
largefiles: handle logging from outside the repo...
r24208 # An absolute path is from outside the repo, so truncate the
# path to the root before building the standin. Otherwise cwd
# is somewhere in the repo, relative to root, and needs to be
# prepended before building the standin.
Martin von Zweigbergk
largefiles: get cwd and relative paths from repo instead of matcher...
r41816 if os.path.isabs(cwd):
Augie Fackler
formatting: blacken the codebase...
r43346 f = f[len(back) :]
Matt Harbison
largefiles: handle logging from outside the repo...
r24208 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 f = cwd + b'/' + f
Matt Harbison
largefiles: handle logging from outside the repo...
r24208 return back + lfutil.standin(f)
Augie Fackler
formatting: blacken the codebase...
r43346
Lucas Moscovicz
largefiles: changed overridelog to work with graphlog...
r21110 else:
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
largefiles: don't prefix standin patterns with '.hglf' when logging...
r24207 def tostandin(f):
FUJIWARA Katsunori
largefiles: replace splitstandin() by isstandin() to omit str creation...
r31614 if lfutil.isstandin(f):
Matt Harbison
largefiles: don't prefix standin patterns with '.hglf' when logging...
r24207 return f
return lfutil.standin(f)
Augie Fackler
formatting: blacken the codebase...
r43346
Martin von Zweigbergk
largefiles: move identical statement to after if/else
r32301 pats.update(fixpats(f, tostandin) for f in p)
Lucas Moscovicz
largefiles: changed overridelog to work with graphlog...
r21110
Wei, Elson
largefiles: overridematch() should replace the file path instead of extending (issue3934)
r19472 for i in range(0, len(m._files)):
Matt Harbison
largefiles: teach log to handle patterns...
r24206 # Don't add '.hglf' to m.files, since that is already covered by '.'
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if m._files[i] == b'.':
Matt Harbison
largefiles: teach log to handle patterns...
r24206 continue
Wei, Elson
largefiles: overridematch() should replace the file path instead of extending (issue3934)
r19472 standin = lfutil.standin(m._files[i])
Matt Harbison
largefiles: don't interfere with logging normal files...
r23976 # If the "standin" is a directory, append instead of replace to
# support naming a directory on the command line with only
# largefiles. The original directory is kept to support normal
# files.
FUJIWARA Katsunori
largefiles: avoid meaningless changectx looking up...
r31655 if standin in ctx:
Wei, Elson
largefiles: overridematch() should replace the file path instead of extending (issue3934)
r19472 m._files[i] = standin
FUJIWARA Katsunori
largefiles: avoid meaningless changectx looking up...
r31655 elif m._files[i] not in ctx and repo.wvfs.isdir(standin):
Mads Kiilerich
largefiles: include largefiles when doing log on a directory (issue4241)...
r21275 m._files.append(standin)
Lucas Moscovicz
largefiles: changed overridelog to work with graphlog...
r21110
Martin von Zweigbergk
match: make _fileroots a @propertycache and rename it to _fileset...
r32323 m._fileset = set(m._files)
Martin von Zweigbergk
largefiles: replace always() method, not _always field...
r32387 m.always = lambda: False
Mads Kiilerich
largefiles: make log match largefiles in the non-standin location too...
r18341 origmatchfn = m.matchfn
Augie Fackler
formatting: blacken the codebase...
r43346
Mads Kiilerich
largefiles: make log match largefiles in the non-standin location too...
r18341 def lfmatchfn(f):
lf = lfutil.splitstandin(f)
if lf is not None and origmatchfn(lf):
return True
r = origmatchfn(f)
return r
Augie Fackler
formatting: blacken the codebase...
r43346
Mads Kiilerich
largefiles: make log match largefiles in the non-standin location too...
r18341 m.matchfn = lfmatchfn
Lucas Moscovicz
largefiles: changed overridelog to work with graphlog...
r21110
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.debug(b'updated patterns: %s\n' % b', '.join(sorted(pats)))
Lucas Moscovicz
largefiles: changed overridelog to work with graphlog...
r21110 return m, pats
Siddharth Agarwal
largefiles: in overridelog, use non-lf matcher for patch generation (issue4334)...
r22169 # For hg log --patch, the match object is used in two different senses:
# (1) to determine what revisions should be printed out, and
# (2) to determine what files to print out diffs for.
# The magic matchandpats override should be used for case (1) but not for
# case (2).
Martin von Zweigbergk
largefiles: use wrappedfunction() for matchandpats() override in overridelog()...
r41719 oldmatchandpats = scmutil.matchandpats
Augie Fackler
formatting: blacken the codebase...
r43346
Martin von Zweigbergk
largefiles: use wrappedfunction() for matchandpats() override in overridelog()...
r41719 def overridemakefilematcher(orig, repo, pats, opts, badfn=None):
Martin von Zweigbergk
log: prefer 'wctx' over 'pctx' for working context
r24534 wctx = repo[None]
Matt Harbison
scmutil: add an optional parameter to matcher factories for a bad() override...
r25467 match, pats = oldmatchandpats(wctx, pats, opts, badfn=badfn)
Yuya Nishihara
log: pass ctx to makefilematcher() and makehunksfilter() functions...
r36019 return lambda ctx: match
Siddharth Agarwal
largefiles: in overridelog, use non-lf matcher for patch generation (issue4334)...
r22169
Augie Fackler
formatting: blacken the codebase...
r43346 wrappedmatchandpats = extensions.wrappedfunction(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 scmutil, b'matchandpats', overridematchandpats
Augie Fackler
formatting: blacken the codebase...
r43346 )
Martin von Zweigbergk
largefiles: use wrappedfunction() for matchandpats() override in overridelog()...
r41719 wrappedmakefilematcher = extensions.wrappedfunction(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 logcmdutil, b'_makenofollowfilematcher', overridemakefilematcher
Augie Fackler
formatting: blacken the codebase...
r43346 )
Martin von Zweigbergk
largefiles: use wrappedfunction() for matchandpats() override in overridelog()...
r41719 with wrappedmatchandpats, wrappedmakefilematcher:
Matt Harbison
largefiles: preserve the exit status of the log command
r17577 return orig(ui, repo, *pats, **opts)
various
hgext: add largefiles extension...
r15168
Augie Fackler
formatting: blacken the codebase...
r43346
@eh.wrapcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'verify',
Augie Fackler
formatting: blacken the codebase...
r43346 opts=[
(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'',
b'large',
Augie Fackler
formatting: blacken the codebase...
r43346 None,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'verify that all largefiles in current revision exists'),
Augie Fackler
formatting: blacken the codebase...
r43346 ),
(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'',
b'lfa',
Augie Fackler
formatting: blacken the codebase...
r43346 None,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'verify largefiles in all revisions, not just current'),
Augie Fackler
formatting: blacken the codebase...
r43346 ),
(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'',
b'lfc',
Augie Fackler
formatting: blacken the codebase...
r43346 None,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'verify local largefile contents, not just existence'),
Augie Fackler
formatting: blacken the codebase...
r43346 ),
],
)
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overrideverify(orig, ui, repo, *pats, **opts):
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 large = opts.pop(r'large', False)
all = opts.pop(r'lfa', False)
contents = opts.pop(r'lfc', False)
various
hgext: add largefiles extension...
r15168
result = orig(ui, repo, *pats, **opts)
Mads Kiilerich
largefiles: make verify --lfa and --lfc work without --large...
r18547 if large or all or contents:
various
hgext: add largefiles extension...
r15168 result = result or lfcommands.verifylfiles(ui, repo, all, contents)
return result
Augie Fackler
formatting: blacken the codebase...
r43346
@eh.wrapcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'debugstate',
opts=[(b'', b'large', None, _(b'display largefiles dirstate'))],
Augie Fackler
formatting: blacken the codebase...
r43346 )
Mads Kiilerich
largefiles: introduce basic debugstate --large functionality...
r18144 def overridedebugstate(orig, ui, repo, *pats, **opts):
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 large = opts.pop(r'large', False)
Mads Kiilerich
largefiles: introduce basic debugstate --large functionality...
r18144 if large:
Augie Fackler
formatting: blacken the codebase...
r43346
Mads Kiilerich
largefiles: full debugdirstate functionality for largefiles...
r21088 class fakerepo(object):
dirstate = lfutil.openlfdirstate(ui, repo)
Augie Fackler
formatting: blacken the codebase...
r43346
Mads Kiilerich
largefiles: full debugdirstate functionality for largefiles...
r21088 orig(ui, fakerepo, *pats, **opts)
Mads Kiilerich
largefiles: introduce basic debugstate --large functionality...
r18144 else:
orig(ui, repo, *pats, **opts)
Augie Fackler
formatting: blacken the codebase...
r43346
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663 # Before starting the manifest merge, merge.updates will call
Mads Kiilerich
spelling: fixes from proofreading of spell checker issues
r23543 # _checkunknownfile to check if there are any files in the merged-in
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663 # 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
Martin von Zweigbergk
largefiles: update comments to refer to the right overridden method...
r23307 # case further in the overridden calculateupdates function below.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(merge, b'_checkunknownfile')
Martin von Zweigbergk
merge: don't overwrite untracked file at directory rename target...
r23653 def overridecheckunknownfile(origfn, repo, wctx, mctx, f, f2=None):
FUJIWARA Katsunori
largefiles: check unknown files with case awareness of the filesystem...
r19161 if lfutil.standin(repo.dirstate.normalize(f)) in wctx:
Matt Mackall
merge: refactor unknown file conflict checking...
r16093 return False
Martin von Zweigbergk
merge: don't overwrite untracked file at directory rename target...
r23653 return origfn(repo, wctx, mctx, f, f2)
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663
Augie Fackler
formatting: blacken the codebase...
r43346
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.
#
Martin von Zweigbergk
largefiles: update comments to refer to the right overridden method...
r23307 # The strategy is to run the original calculateupdates and then process
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663 # 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.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(merge, b'calculateupdates')
Augie Fackler
formatting: blacken the codebase...
r43346 def overridecalculateupdates(
origfn, repo, p1, p2, pas, branchmerge, force, acceptremote, *args, **kwargs
):
Siddharth Agarwal
manifestmerge: pass in branchmerge and force separately...
r18605 overwrite = force and not branchmerge
Martin von Zweigbergk
merge: don't treat 'diverge' and 'renamedelete' like actions...
r23526 actions, diverge, renamedelete = origfn(
Augie Fackler
formatting: blacken the codebase...
r43346 repo, p1, p2, pas, branchmerge, force, acceptremote, *args, **kwargs
)
Mads Kiilerich
largefiles: don't process merge actions at all when overwriting
r19952
if overwrite:
Martin von Zweigbergk
merge: don't treat 'diverge' and 'renamedelete' like actions...
r23526 return actions, diverge, renamedelete
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663
Martin von Zweigbergk
largefiles: rewrite merge code using dictionary with entry per file...
r23529 # Convert to dictionary with filename as key and action as value.
Martin von Zweigbergk
largefiles: start by finding files of interest...
r23530 lfiles = set()
Martin von Zweigbergk
largefiles: don't duplicate 'actions' into 'actionbyfile'
r23642 for f in actions:
Mads Kiilerich
largefiles: actions will now always have a file - drop check
r27905 splitstandin = lfutil.splitstandin(f)
Raphaël Gomès
rust-dirstate: call rust dirstatemap from Python...
r43000 if splitstandin is not None and splitstandin in p1:
Martin von Zweigbergk
merge: make calculateupdates() return file->action dict...
r23641 lfiles.add(splitstandin)
elif lfutil.standin(f) in p1:
lfiles.add(f)
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663
Mads Kiilerich
largefiles: make prompt order deterministic...
r27904 for lfile in sorted(lfiles):
Martin von Zweigbergk
largefiles: start by finding files of interest...
r23530 standin = lfutil.standin(lfile)
Martin von Zweigbergk
largefiles: don't duplicate 'actions' into 'actionbyfile'
r23642 (lm, largs, lmsg) = actions.get(lfile, (None, None, None))
(sm, sargs, smsg) = actions.get(standin, (None, None, None))
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if sm in (b'g', b'dc') and lm != b'r':
if sm == b'dc':
Siddharth Agarwal
merge: make 'cd' and 'dc' actions store the same arguments as 'm'...
r26962 f1, f2, fa, move, anc = sargs
Siddharth Agarwal
merge: add a new 'backup' argument to get actions...
r27655 sargs = (p2[f2].flags(), False)
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663 # Case 1: normal file in the working copy, largefile in
# the second parent
Augie Fackler
formatting: blacken the codebase...
r43346 usermsg = (
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'remote turned local normal file %s into a largefile\n'
b'use (l)argefile or keep (n)ormal file?'
b'$$ &Largefile $$ &Normal file'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% lfile
)
if repo.ui.promptchoice(usermsg, 0) == 0: # pick remote largefile
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 actions[lfile] = (b'r', None, b'replaced by standin')
actions[standin] = (b'g', sargs, b'replaces standin')
Augie Fackler
formatting: blacken the codebase...
r43346 else: # keep local normal file
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 actions[lfile] = (b'k', None, b'replaces standin')
Martin von Zweigbergk
largefiles: don't use 'r' action for standin that doesn't exist...
r23493 if branchmerge:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 actions[standin] = (b'k', None, b'replaced by non-standin')
Martin von Zweigbergk
largefiles: don't use 'r' action for standin that doesn't exist...
r23493 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 actions[standin] = (b'r', None, b'replaced by non-standin')
elif lm in (b'g', b'dc') and sm != b'r':
if lm == b'dc':
Siddharth Agarwal
merge: make 'cd' and 'dc' actions store the same arguments as 'm'...
r26962 f1, f2, fa, move, anc = largs
Siddharth Agarwal
merge: add a new 'backup' argument to get actions...
r27655 largs = (p2[f2].flags(), False)
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
Augie Fackler
formatting: blacken the codebase...
r43346 usermsg = (
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'remote turned local largefile %s into a normal file\n'
b'keep (l)argefile or use (n)ormal file?'
b'$$ &Largefile $$ &Normal file'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% lfile
)
if repo.ui.promptchoice(usermsg, 0) == 0: # keep local largefile
FUJIWARA Katsunori
largefiles: keep largefiles from colliding with normal one during linear merge...
r22196 if branchmerge:
# largefile can be restored from standin safely
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 actions[lfile] = (b'k', None, b'replaced by standin')
actions[standin] = (b'k', None, b'replaces standin')
FUJIWARA Katsunori
largefiles: keep largefiles from colliding with normal one during linear merge...
r22196 else:
# "lfile" should be marked as "removed" without
# removal of itself
Augie Fackler
formatting: blacken the codebase...
r43346 actions[lfile] = (
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'lfmr',
Augie Fackler
formatting: blacken the codebase...
r43346 None,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'forget non-standin largefile',
Augie Fackler
formatting: blacken the codebase...
r43346 )
FUJIWARA Katsunori
largefiles: keep largefiles from colliding with normal one during linear merge...
r22196
# linear-merge should treat this largefile as 're-added'
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 actions[standin] = (b'a', None, b'keep standin')
Augie Fackler
formatting: blacken the codebase...
r43346 else: # pick remote normal file
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 actions[lfile] = (b'g', largs, b'replaces standin')
actions[standin] = (b'r', None, b'replaced by non-standin')
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663
Martin von Zweigbergk
largefiles: don't duplicate 'actions' into 'actionbyfile'
r23642 return actions, diverge, renamedelete
Martin Geisler
largefiles: handle merges between normal files and largefiles (issue3084)...
r15663
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(merge, b'recordupdates')
Valentin Gatien-Baron
merge: fix race that could cause wrong size in dirstate...
r42656 def mergerecordupdates(orig, repo, actions, branchmerge, getfiledata):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'lfmr' in actions:
Mads Kiilerich
largefiles: mark lfile as added in lfdirstate when the standin is added...
r23695 lfdirstate = lfutil.openlfdirstate(repo.ui, repo)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 for lfile, args, msg in actions[b'lfmr']:
Mads Kiilerich
largefiles: mark lfile as added in lfdirstate when the standin is added...
r23695 # this should be executed before 'orig', to execute 'remove'
# before all other actions
FUJIWARA Katsunori
largefiles: keep largefiles from colliding with normal one during linear merge...
r22196 repo.dirstate.remove(lfile)
Mads Kiilerich
largefiles: mark lfile as added in lfdirstate when the standin is added...
r23695 # make sure lfile doesn't get synclfdirstate'd as normal
lfdirstate.add(lfile)
lfdirstate.write()
FUJIWARA Katsunori
largefiles: keep largefiles from colliding with normal one during linear merge...
r22196
Valentin Gatien-Baron
merge: fix race that could cause wrong size in dirstate...
r42656 return orig(repo, actions, branchmerge, getfiledata)
FUJIWARA Katsunori
largefiles: keep largefiles from colliding with normal one during linear merge...
r22196
Augie Fackler
formatting: blacken the codebase...
r43346
Greg Ward
largefiles: improve comments, internal docstrings...
r15252 # Override filemerge to prompt the user about how they wish to merge
Mads Kiilerich
largefiles: drop redundant special handling of merges of renames...
r20295 # largefiles. This will handle identical edits without prompting the user.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(filemerge, b'_filemerge')
Augie Fackler
formatting: blacken the codebase...
r43346 def overridefilemerge(
origfn, premerge, repo, wctx, mynode, orig, fcd, fco, fca, labels=None
):
Siddharth Agarwal
largefiles: fall back to the original for change/delete conflicts...
r27050 if not lfutil.isstandin(orig) or fcd.isabsent() or fco.isabsent():
Augie Fackler
formatting: blacken the codebase...
r43346 return origfn(
premerge, repo, wctx, mynode, orig, fcd, fco, fca, labels=labels
)
Mads Kiilerich
largefiles: stylistic cleanup of filemerge
r20298
FUJIWARA Katsunori
largefiles: use readasstandin() to read hex hash directly from filectx...
r31740 ahash = lfutil.readasstandin(fca).lower()
dhash = lfutil.readasstandin(fcd).lower()
ohash = lfutil.readasstandin(fco).lower()
Augie Fackler
formatting: blacken the codebase...
r43346 if (
ohash != ahash
and ohash != dhash
and (
dhash == ahash
or repo.ui.promptchoice(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'largefile %s has a merge conflict\nancestor was %s\n'
b'you can keep (l)ocal %s or take (o)ther %s.\n'
b'what do you want to do?'
b'$$ &Local $$ &Other'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% (lfutil.splitstandin(orig), ahash, dhash, ohash),
0,
)
== 1
)
):
Mads Kiilerich
largefiles: stylistic cleanup of filemerge
r20298 repo.wwrite(fcd.path(), fco.data(), fco.flags())
Siddharth Agarwal
filemerge: return whether the file was deleted...
r27034 return True, 0, False
various
hgext: add largefiles extension...
r15168
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(copiesmod, b'pathcopies')
Durham Goode
copies: add matcher parameter to copy logic...
r24782 def copiespathcopies(orig, ctx1, ctx2, match=None):
copies = orig(ctx1, ctx2, match=match)
Matt Harbison
largefiles: report the source of copied/moved largefiles in status -C...
r24230 updated = {}
Gregory Szorc
py3: define and use pycompat.iteritems() for hgext/...
r43375 for k, v in pycompat.iteritems(copies):
Matt Harbison
largefiles: report the source of copied/moved largefiles in status -C...
r24230 updated[lfutil.splitstandin(k) or k] = lfutil.splitstandin(v) or v
return updated
Augie Fackler
formatting: blacken the codebase...
r43346
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.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(cmdutil, b'copy')
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)
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
Martin von Zweigbergk
largefiles: use wrappedfunction() for "normal files match" in overridecopy()...
r41722 manifest = repo[None].manifest()
Augie Fackler
formatting: blacken the codebase...
r43346
def normalfilesmatchfn(
orig,
ctx,
pats=(),
opts=None,
globbed=False,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 default=b'relpath',
Augie Fackler
formatting: blacken the codebase...
r43346 badfn=None,
):
Martin von Zweigbergk
largefiles: use wrappedfunction() for "normal files match" in overridecopy()...
r41722 if opts is None:
opts = {}
match = orig(ctx, pats, opts, globbed, default, badfn=badfn)
return composenormalfilematcher(match, manifest)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 with extensions.wrappedfunction(scmutil, b'match', normalfilesmatchfn):
Martin von Zweigbergk
largefiles: use wrappedfunction() for "normal files match" in overridecopy()...
r41722 try:
result = orig(ui, repo, pats, opts, rename)
except error.Abort as e:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if pycompat.bytestr(e) != _(b'no files to copy'):
Martin von Zweigbergk
largefiles: use wrappedfunction() for "normal files match" in overridecopy()...
r41722 raise e
else:
nonormalfiles = True
result = 0
various
hgext: add largefiles extension...
r15168
# 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
Matt Harbison
largefiles: use the core file copy logic to validate the destination path...
r24006 def makestandin(relpath):
path = pathutil.canonpath(repo.root, repo.getcwd(), relpath)
liscju
largefiles: replace invocation of os.path module by vfs in overrides.py...
r28715 return repo.wvfs.join(lfutil.standin(path))
Matt Harbison
largefiles: use the core file copy logic to validate the destination path...
r24006
fullpats = scmutil.expandpats(pats)
dest = fullpats[-1]
if os.path.isdir(dest):
if not os.path.isdir(makestandin(dest)):
os.makedirs(makestandin(dest))
various
hgext: add largefiles extension...
r15168 try:
Matt Mackall
largefiles: use try/except/finally
r25079 # 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.
wlock = repo.wlock()
various
hgext: add largefiles extension...
r15168
Matt Mackall
largefiles: use try/except/finally
r25079 manifest = repo[None].manifest()
Augie Fackler
formatting: blacken the codebase...
r43346
def overridematch(
orig,
ctx,
pats=(),
opts=None,
globbed=False,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 default=b'relpath',
Augie Fackler
formatting: blacken the codebase...
r43346 badfn=None,
):
Pierre-Yves David
largefiles: remove a mutable default argument...
r26341 if opts is None:
opts = {}
Matt Mackall
largefiles: use try/except/finally
r25079 newpats = []
# The patterns were previously mangled to add the standin
# directory; we need to remove that now
various
hgext: add largefiles extension...
r15168 for pat in pats:
liscju
largefiles: rename match_ to matchmod import in overrides
r29318 if matchmod.patkind(pat) is None and lfutil.shortname in pat:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 newpats.append(pat.replace(lfutil.shortname, b''))
various
hgext: add largefiles extension...
r15168 else:
Matt Mackall
largefiles: use try/except/finally
r25079 newpats.append(pat)
Martin von Zweigbergk
largefiles: use wrappedfunction() for match() override in overridecopy()...
r41721 match = orig(ctx, newpats, opts, globbed, default, badfn=badfn)
Matt Mackall
largefiles: use try/except/finally
r25079 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)]
Martin von Zweigbergk
match: make _fileroots a @propertycache and rename it to _fileset...
r32323 m._fileset = set(m._files)
Matt Mackall
largefiles: use try/except/finally
r25079 origmatchfn = m.matchfn
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: omit redundant isstandin() before splitstandin()...
r31613 def matchfn(f):
lfile = lfutil.splitstandin(f)
Augie Fackler
formatting: blacken the codebase...
r43346 return (
lfile is not None
and (f in manifest)
and origmatchfn(lfile)
or None
)
FUJIWARA Katsunori
largefiles: omit redundant isstandin() before splitstandin()...
r31613 m.matchfn = matchfn
Matt Mackall
largefiles: use try/except/finally
r25079 return m
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
largefiles: use try/except/finally
r25079 listpats = []
for pat in pats:
liscju
largefiles: rename match_ to matchmod import in overrides
r29318 if matchmod.patkind(pat) is not None:
Matt Mackall
largefiles: use try/except/finally
r25079 listpats.append(pat)
else:
listpats.append(makestandin(pat))
various
hgext: add largefiles extension...
r15168
Martin von Zweigbergk
largefiles: use wrappedfunction() for util.copyfile() override...
r41720 copiedfiles = []
Augie Fackler
formatting: blacken the codebase...
r43346
Martin von Zweigbergk
largefiles: use wrappedfunction() for util.copyfile() override...
r41720 def overridecopyfile(orig, src, dest, *args, **kwargs):
Augie Fackler
formatting: blacken the codebase...
r43346 if lfutil.shortname in src and dest.startswith(
repo.wjoin(lfutil.shortname)
):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 destlfile = dest.replace(lfutil.shortname, b'')
if not opts[b'force'] and os.path.exists(destlfile):
raise IOError(
b'', _(b'destination largefile already exists')
)
Martin von Zweigbergk
largefiles: use wrappedfunction() for util.copyfile() override...
r41720 copiedfiles.append((src, dest))
orig(src, dest, *args, **kwargs)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 with extensions.wrappedfunction(util, b'copyfile', overridecopyfile):
with extensions.wrappedfunction(scmutil, b'match', overridematch):
Augie Fackler
cleanup: prefer nested context managers to \-continuations...
r41926 result += orig(ui, repo, listpats, opts, rename)
Matt Harbison
largefiles: remove directories emptied after their files are moved (issue3515)
r21196
Matt Mackall
largefiles: use try/except/finally
r25079 lfdirstate = lfutil.openlfdirstate(ui, repo)
for (src, dest) in copiedfiles:
Augie Fackler
formatting: blacken the codebase...
r43346 if lfutil.shortname in src and dest.startswith(
repo.wjoin(lfutil.shortname)
):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 srclfile = src.replace(repo.wjoin(lfutil.standin(b'')), b'')
destlfile = dest.replace(repo.wjoin(lfutil.standin(b'')), b'')
destlfiledir = repo.wvfs.dirname(repo.wjoin(destlfile)) or b'.'
Matt Mackall
largefiles: use try/except/finally
r25079 if not os.path.isdir(destlfiledir):
os.makedirs(destlfiledir)
if rename:
os.rename(repo.wjoin(srclfile), repo.wjoin(destlfile))
Matt Harbison
largefiles: fix path handling for cp/mv (issue3516)...
r17245
Matt Mackall
largefiles: use try/except/finally
r25079 # The file is gone, but this deletes any empty parent
# directories as a side-effect.
Mads Kiilerich
vfs: use repo.wvfs.unlinkpath
r31309 repo.wvfs.unlinkpath(srclfile, ignoremissing=True)
Matt Mackall
largefiles: use try/except/finally
r25079 lfdirstate.remove(srclfile)
else:
Augie Fackler
formatting: blacken the codebase...
r43346 util.copyfile(repo.wjoin(srclfile), repo.wjoin(destlfile))
Matt Mackall
largefiles: use try/except/finally
r25079
lfdirstate.add(destlfile)
lfdirstate.write()
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 except error.Abort as e:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if pycompat.bytestr(e) != _(b'no files to copy'):
Matt Mackall
largefiles: use try/except/finally
r25079 raise e
else:
nolfiles = True
various
hgext: add largefiles extension...
r15168 finally:
wlock.release()
if nolfiles and nonormalfiles:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'no files to copy'))
various
hgext: add largefiles extension...
r15168
return result
Augie Fackler
formatting: blacken the codebase...
r43346
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
Mads Kiilerich
largefiles: simplify revert - use getstandinsstate like other commands do
r21094 # resulting standins update the largefiles.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(cmdutil, b'revert')
Martin von Zweigbergk
largefiles: override cmdutil.revert() instead of comands.revert()...
r24436 def overriderevert(orig, ui, repo, ctx, parents, *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.
Bryan O'Sullivan
with: use context manager for wlock in overriderevert
r27823 with repo.wlock():
various
hgext: add largefiles extension...
r15168 lfdirstate = lfutil.openlfdirstate(ui, repo)
Mads Kiilerich
largefiles: remove confusing rev parameter for lfdirstatestatus...
r23039 s = lfutil.lfdirstatestatus(lfdirstate, repo)
Mads Kiilerich
largefiles revert: update lfdirstate with result from first cleanliness check...
r18140 lfdirstate.write()
Martin von Zweigbergk
largefiles: access status fields by name rather than index
r22919 for lfile in s.modified:
FUJIWARA Katsunori
largefiles: add lfile argument to updatestandin() for efficiency (API)...
r31659 lfutil.updatestandin(repo, lfile, lfutil.standin(lfile))
Martin von Zweigbergk
largefiles: access status fields by name rather than index
r22919 for lfile in s.deleted:
FUJIWARA Katsunori
largefiles: avoid redundant standin() invocations...
r31618 fstandin = lfutil.standin(lfile)
Augie Fackler
formatting: blacken the codebase...
r43346 if repo.wvfs.exists(fstandin):
FUJIWARA Katsunori
largefiles: avoid redundant standin() invocations...
r31618 repo.wvfs.unlink(fstandin)
various
hgext: add largefiles extension...
r15168
Mads Kiilerich
largefiles: simplify revert - use getstandinsstate like other commands do
r21094 oldstandins = lfutil.getstandinsstate(repo)
Augie Fackler
formatting: blacken the codebase...
r43346 def overridematch(
orig,
mctx,
pats=(),
opts=None,
globbed=False,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 default=b'relpath',
Augie Fackler
formatting: blacken the codebase...
r43346 badfn=None,
):
Pierre-Yves David
largefiles: remove a mutable default argument...
r26343 if opts is None:
opts = {}
Martin von Zweigbergk
largefiles: use wrappedfunction() in overriderevert()...
r41723 match = orig(mctx, pats, opts, globbed, default, badfn=badfn)
Mads Kiilerich
largefiles: revert override, install matchfn outside the try/except restoring it
r21095 m = copy.copy(match)
Matt Harbison
largefiles: don't warn when reverting a forgotten largefile...
r24133
# revert supports recursing into subrepos, and though largefiles
# currently doesn't work correctly in that case, this match is
# called, so the lfdirstate above may not be the correct one for
# this invocation of match.
Augie Fackler
formatting: blacken the codebase...
r43346 lfdirstate = lfutil.openlfdirstate(
mctx.repo().ui, mctx.repo(), False
)
Matt Harbison
largefiles: don't warn when reverting a forgotten largefile...
r24133
FUJIWARA Katsunori
largefiles: avoid redundant changectx looking up at each repetitions...
r31654 wctx = repo[None]
FUJIWARA Katsunori
largefiles: avoid redundant loop to eliminate None from list...
r31656 matchfiles = []
for f in m._files:
Martin von Zweigbergk
largefiles: extract and reuse 'standin' variable in overriderevert()
r24437 standin = lfutil.standin(f)
Martin von Zweigbergk
revert: evaluate filesets against working directory (issue4497)...
r24438 if standin in ctx or standin in mctx:
FUJIWARA Katsunori
largefiles: avoid redundant loop to eliminate None from list...
r31656 matchfiles.append(standin)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif standin in wctx or lfdirstate[f] == b'r':
FUJIWARA Katsunori
largefiles: avoid redundant loop to eliminate None from list...
r31656 continue
else:
matchfiles.append(f)
m._files = matchfiles
Martin von Zweigbergk
match: make _fileroots a @propertycache and rename it to _fileset...
r32323 m._fileset = set(m._files)
Mads Kiilerich
largefiles: revert override, install matchfn outside the try/except restoring it
r21095 origmatchfn = m.matchfn
Augie Fackler
formatting: blacken the codebase...
r43346
Mads Kiilerich
largefiles: revert override, install matchfn outside the try/except restoring it
r21095 def matchfn(f):
FUJIWARA Katsunori
largefiles: omit redundant isstandin() before splitstandin()...
r31613 lfile = lfutil.splitstandin(f)
if lfile is not None:
Augie Fackler
formatting: blacken the codebase...
r43346 return origmatchfn(lfile) and (f in ctx or f in mctx)
Mads Kiilerich
largefiles: revert override, install matchfn outside the try/except restoring it
r21095 return origmatchfn(f)
Augie Fackler
formatting: blacken the codebase...
r43346
Mads Kiilerich
largefiles: revert override, install matchfn outside the try/except restoring it
r21095 m.matchfn = matchfn
return m
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 with extensions.wrappedfunction(scmutil, b'match', overridematch):
Martin von Zweigbergk
largefiles: override cmdutil.revert() instead of comands.revert()...
r24436 orig(ui, repo, ctx, parents, *pats, **opts)
Greg Ward
largefiles: more work on cleaning up comments...
r15254
Mads Kiilerich
largefiles: simplify revert - use getstandinsstate like other commands do
r21094 newstandins = lfutil.getstandinsstate(repo)
filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
FUJIWARA Katsunori
largefiles: use "normallookup" on "lfdirstate" while reverting...
r21934 # lfdirstate should be 'normallookup'-ed for updated files,
# because reverting doesn't touch dirstate for 'normal' files
# when target revision is explicitly specified: in such case,
# 'n' and valid timestamp in dirstate doesn't ensure 'clean'
# of target (standin) file.
Augie Fackler
formatting: blacken the codebase...
r43346 lfcommands.updatelfiles(
ui, repo, filelist, printmessage=False, normallookup=True
)
Mads Kiilerich
largefiles: simplify revert - use getstandinsstate like other commands do
r21094
FUJIWARA Katsunori
largefiles: remove meaningless code path for "hg pull --rebase"...
r23183 # after pulling changesets, we need to take some extra care to get
# largefiles updated remotely
Augie Fackler
formatting: blacken the codebase...
r43346 @eh.wrapcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'pull',
Augie Fackler
formatting: blacken the codebase...
r43346 opts=[
(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'',
b'all-largefiles',
Augie Fackler
formatting: blacken the codebase...
r43346 None,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'download all pulled versions of largefiles (DEPRECATED)'),
Augie Fackler
formatting: blacken the codebase...
r43346 ),
(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'',
b'lfrev',
Augie Fackler
formatting: blacken the codebase...
r43346 [],
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'download largefiles for these revisions'),
_(b'REV'),
Augie Fackler
formatting: blacken the codebase...
r43346 ),
],
)
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)
Mads Kiilerich
largefiles: refactor overridepull internals
r18977 if not source:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 source = b'default'
Mads Kiilerich
largefiles: refactor overridepull internals
r18977 repo.lfpullsource = source
FUJIWARA Katsunori
largefiles: remove meaningless code path for "hg pull --rebase"...
r23183 result = orig(ui, repo, source, **opts)
Mads Kiilerich
largefiles: refactor overridepull internals
r18977 revspostpull = len(repo)
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 lfrevs = opts.get(r'lfrev', [])
if opts.get(r'all_largefiles'):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lfrevs.append(b'pulled()')
Mads Kiilerich
largefiles: introduce pull --lfrev option...
r18978 if lfrevs and revspostpull > revsprepull:
numcached = 0
Augie Fackler
formatting: blacken the codebase...
r43346 repo.firstpulled = revsprepull # for pulled() revset expression
Mads Kiilerich
largefiles: introduce pulled() revset expression for use in --lfrev...
r18979 try:
for rev in scmutil.revrange(repo, lfrevs):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.note(_(b'pulling largefiles for revision %d\n') % rev)
Mads Kiilerich
largefiles: introduce pulled() revset expression for use in --lfrev...
r18979 (cached, missing) = lfcommands.cachelfiles(ui, repo, rev)
numcached += len(cached)
finally:
del repo.firstpulled
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(_(b"%d largefiles cached\n") % numcached)
various
hgext: add largefiles extension...
r15168 return result
Augie Fackler
formatting: blacken the codebase...
r43346
@eh.wrapcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'push',
Augie Fackler
formatting: blacken the codebase...
r43346 opts=[
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 (
b'',
b'lfrev',
[],
_(b'upload largefiles for these revisions'),
_(b'REV'),
)
Augie Fackler
formatting: blacken the codebase...
r43346 ],
)
Mads Kiilerich
largefiles: introduce push --lfrev to control which revisions are pushed...
r28878 def overridepush(orig, ui, repo, *args, **kwargs):
"""Override push command and store --lfrev parameters in opargs"""
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 lfrevs = kwargs.pop(r'lfrev', None)
Mads Kiilerich
largefiles: introduce push --lfrev to control which revisions are pushed...
r28878 if lfrevs:
Pulkit Goyal
py3: fix handling of keyword arguments at more places...
r36418 opargs = kwargs.setdefault(r'opargs', {})
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 opargs[b'lfrevs'] = scmutil.revrange(repo, lfrevs)
Mads Kiilerich
largefiles: introduce push --lfrev to control which revisions are pushed...
r28878 return orig(ui, repo, *args, **kwargs)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(exchange, b'pushoperation')
Mads Kiilerich
largefiles: introduce push --lfrev to control which revisions are pushed...
r28878 def exchangepushoperation(orig, *args, **kwargs):
"""Override pushoperation constructor and store lfrevs parameter"""
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 lfrevs = kwargs.pop(r'lfrevs', None)
Mads Kiilerich
largefiles: introduce push --lfrev to control which revisions are pushed...
r28878 pushop = orig(*args, **kwargs)
pushop.lfrevs = lfrevs
return pushop
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.revsetpredicate(b'pulled()')
Mads Kiilerich
largefiles: introduce pulled() revset expression for use in --lfrev...
r18979 def pulledrevsetsymbol(repo, subset, x):
FUJIWARA Katsunori
revset: use delayregistrar to register predicate in extension easily...
r27586 """Changesets that just has been pulled.
Mads Kiilerich
largefiles: introduce pulled() revset expression for use in --lfrev...
r18979
Only available with largefiles from pull --lfrev expressions.
.. container:: verbose
Some examples:
- pull largefiles for all new changesets::
hg pull -lfrev "pulled()"
- pull largefiles for all new branch heads::
hg pull -lfrev "head(pulled()) and not closed()"
"""
try:
firstpulled = repo.firstpulled
except AttributeError:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"pulled() only available in --lfrev"))
Yuya Nishihara
revset: import set classes directly from smartset module...
r31023 return smartset.baseset([r for r in subset if r >= firstpulled])
Mads Kiilerich
largefiles: introduce pulled() revset expression for use in --lfrev...
r18979
Augie Fackler
formatting: blacken the codebase...
r43346
@eh.wrapcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'clone',
Augie Fackler
formatting: blacken the codebase...
r43346 opts=[
(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'',
b'all-largefiles',
Augie Fackler
formatting: blacken the codebase...
r43346 None,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'download all versions of all largefiles'),
Augie Fackler
formatting: blacken the codebase...
r43346 )
],
)
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)
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 if opts.get(r'all_largefiles') and not hg.islocal(d):
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'--all-largefiles is incompatible with non-local destination %s')
Augie Fackler
formatting: blacken the codebase...
r43346 % d
)
Matt Harbison
largefiles: delegate to the wrapped clone command...
r17601
return orig(ui, source, dest, **opts)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(hg, b'clone')
Matt Harbison
largefiles: delegate to the wrapped clone command...
r17601 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()
Matt Harbison
largefiles: don't crash when cloning to a remote repo...
r24812 # When cloning to a remote repo (like through SSH), no repo is available
# from the peer. Therefore the largefiles can't be downloaded and the
# hgrc can't be updated.
if not repo:
return result
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.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if opts.get(b'all_largefiles'):
Matt Harbison
largefiles: always create the cache and standin directories when cloning...
r17824 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
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapcommand(b'rebase', extension=b'rebase')
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overriderebase(orig, ui, repo, **opts):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if not util.safehasattr(repo, b'_largefilesenabled'):
FUJIWARA Katsunori
largefiles: access to specific fields only if largefiles enabled (issue4547)...
r24158 return orig(ui, repo, **opts)
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 resuming = opts.get(r'continue')
FUJIWARA Katsunori
largefiles: update standins only at the 1st commit of "hg rebase --continue"...
r23187 repo._lfcommithooks.append(lfutil.automatedcommithook(resuming))
FUJIWARA Katsunori
largefiles: avoid printing messages while rebasing by "_lfstatuswriters"...
r23190 repo._lfstatuswriters.append(lambda *msg, **opts: None)
various
hgext: add largefiles extension...
r15168 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:
FUJIWARA Katsunori
largefiles: avoid printing messages while rebasing by "_lfstatuswriters"...
r23190 repo._lfstatuswriters.pop()
FUJIWARA Katsunori
largefiles: update standins only at the 1st commit of "hg rebase --continue"...
r23187 repo._lfcommithooks.pop()
various
hgext: add largefiles extension...
r15168
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapcommand(b'archive')
Matt Harbison
largefiles: allow the archiving of largefiles to be disabled...
r25811 def overridearchivecmd(orig, ui, repo, dest, **opts):
repo.unfiltered().lfstatus = True
try:
return orig(ui, repo.unfiltered(), dest, **opts)
finally:
repo.unfiltered().lfstatus = False
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(webcommands, b'archive')
Gregory Szorc
hgweb: stop passing req and tmpl into @webcommand functions (API)...
r36903 def hgwebarchive(orig, web):
Matt Harbison
largefiles: restore archiving largefiles with hgweb (issue4859)...
r26417 web.repo.lfstatus = True
try:
Gregory Szorc
hgweb: stop passing req and tmpl into @webcommand functions (API)...
r36903 return orig(web)
Matt Harbison
largefiles: restore archiving largefiles with hgweb (issue4859)...
r26417 finally:
web.repo.lfstatus = False
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(archival, b'archive')
Augie Fackler
formatting: blacken the codebase...
r43346 def overridearchive(
orig,
repo,
dest,
node,
kind,
decode=True,
match=None,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 prefix=b'',
Augie Fackler
formatting: blacken the codebase...
r43346 mtime=None,
subrepos=None,
):
Matt Harbison
largefiles: restore archiving largefiles with hgweb (issue4859)...
r26417 # For some reason setting repo.lfstatus in hgwebarchive only changes the
# unfiltered repo's attr, so check that as well.
if not repo.lfstatus and not repo.unfiltered().lfstatus:
Augie Fackler
formatting: blacken the codebase...
r43346 return orig(
repo, dest, node, kind, decode, match, prefix, mtime, subrepos
)
Matt Harbison
largefiles: allow the archiving of largefiles to be disabled...
r25811
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.
Matt Harbison
archive: support 'wdir()'...
r25601 if node is not None:
lfcommands.cachelfiles(repo.ui, repo, node)
various
hgext: add largefiles extension...
r15168
if kind not in archival.archivers:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"unknown archive type '%s'") % kind)
various
hgext: add largefiles extension...
r15168
ctx = repo[node]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if kind == b'files':
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 if prefix:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'cannot give prefix when archiving to files'))
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 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):
Martin von Zweigbergk
archive: change "matcnfn" argument to a real matcher...
r40443 if match and not match(name):
Na'Tosha Bard
largefiles: remove pre-1.9 code from extension first bundled with 1.9
r15224 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
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if repo.ui.configbool(b"ui", b"archivemeta"):
Augie Fackler
formatting: blacken the codebase...
r43346 write(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'.hg_archival.txt',
Augie Fackler
formatting: blacken the codebase...
r43346 0o644,
False,
lambda: archival.buildmetadata(ctx),
)
various
hgext: add largefiles extension...
r15168
for f in ctx:
ff = ctx.flags(f)
getdata = ctx[f].data
FUJIWARA Katsunori
largefiles: omit redundant isstandin() before splitstandin()...
r31613 lfile = lfutil.splitstandin(f)
if lfile is not None:
Matt Harbison
archive: support 'wdir()'...
r25601 if node is not None:
path = lfutil.findfile(repo, getdata().strip())
if path is None:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'largefile %s not found in repo store or system cache'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% lfile
)
Matt Harbison
archive: support 'wdir()'...
r25601 else:
FUJIWARA Katsunori
largefiles: omit redundant isstandin() before splitstandin()...
r31613 path = lfile
Matt Harbison
archive: support 'wdir()'...
r25601
FUJIWARA Katsunori
largefiles: omit redundant isstandin() before splitstandin()...
r31613 f = lfile
various
hgext: add largefiles extension...
r15168
Bryan O'Sullivan
largefiles: use util.readfile in overrides
r27772 getdata = lambda: util.readfile(path)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 write(f, b'x' in ff and 0o755 or 0o644, b'l' in ff, getdata)
various
hgext: add largefiles extension...
r15168
if subrepos:
Mads Kiilerich
subrepos: process subrepos in sorted order...
r18364 for subpath in sorted(ctx.substate):
Matt Harbison
archive: support 'wdir()'...
r25601 sub = ctx.workingsub(subpath)
Martin von Zweigbergk
archive: change "matcnfn" argument to a real matcher...
r40443 submatch = matchmod.subdirmatcher(subpath, match)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 subprefix = prefix + subpath + b'/'
Matt Harbison
largefiles: allow the archiving of largefiles to be disabled...
r25811 sub._repo.lfstatus = True
Martin von Zweigbergk
subrepo: adjust subrepo prefix before calling subrepo.archive() (API)...
r41780 sub.archive(archiver, subprefix, submatch)
various
hgext: add largefiles extension...
r15168
archiver.done()
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(subrepo.hgsubrepo, b'archive')
Matt Harbison
subrepo: run the repo decoders when archiving...
r31099 def hgsubrepoarchive(orig, repo, archiver, prefix, match=None, decode=True):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lfenabled = util.safehasattr(repo._repo, b'_largefilesenabled')
Matt Harbison
largefiles: avoid a crash when archiving a subrepo with largefiles disabled...
r32835 if not lfenabled or not repo._repo.lfstatus:
Matt Harbison
subrepo: run the repo decoders when archiving...
r31099 return orig(repo, archiver, prefix, match, decode)
Matt Harbison
largefiles: allow the archiving of largefiles to be disabled...
r25811
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 repo._get(repo._state + (b'hg',))
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578 rev = repo._state[1]
ctx = repo._repo[rev]
Matt Harbison
archive: support 'wdir()'...
r25601 if ctx.node() is not None:
lfcommands.cachelfiles(repo.ui, repo._repo, ctx.node())
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578
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()
Matt Harbison
subrepo: run the repo decoders when archiving...
r31099 if decode:
data = repo._repo.wwritedata(name, data)
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578
Martin von Zweigbergk
subrepo: adjust subrepo prefix before calling subrepo.archive() (API)...
r41780 archiver.addfile(prefix + name, mode, islink, data)
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578
for f in ctx:
ff = ctx.flags(f)
getdata = ctx[f].data
FUJIWARA Katsunori
largefiles: omit redundant isstandin() before splitstandin()...
r31613 lfile = lfutil.splitstandin(f)
if lfile is not None:
Matt Harbison
archive: support 'wdir()'...
r25601 if ctx.node() is not None:
path = lfutil.findfile(repo._repo, getdata().strip())
if path is None:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'largefile %s not found in repo store or system cache'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% lfile
)
Matt Harbison
archive: support 'wdir()'...
r25601 else:
FUJIWARA Katsunori
largefiles: omit redundant isstandin() before splitstandin()...
r31613 path = lfile
Matt Harbison
archive: support 'wdir()'...
r25601
FUJIWARA Katsunori
largefiles: omit redundant isstandin() before splitstandin()...
r31613 f = lfile
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578
Bryan O'Sullivan
largefiles: use util.readfile in overrides
r27772 getdata = lambda: util.readfile(os.path.join(prefix, path))
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 write(f, b'x' in ff and 0o755 or 0o644, b'l' in ff, getdata)
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578
Mads Kiilerich
subrepos: process subrepos in sorted order...
r18364 for subpath in sorted(ctx.substate):
Matt Harbison
archive: support 'wdir()'...
r25601 sub = ctx.workingsub(subpath)
liscju
largefiles: rename match_ to matchmod import in overrides
r29318 submatch = matchmod.subdirmatcher(subpath, match)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 subprefix = prefix + subpath + b'/'
Matt Harbison
largefiles: allow the archiving of largefiles to be disabled...
r25811 sub._repo.lfstatus = True
Martin von Zweigbergk
subrepo: adjust subrepo prefix before calling subrepo.archive() (API)...
r41780 sub.archive(archiver, subprefix, submatch, decode)
Matt Harbison
largefiles: make archive -S store largefiles instead of standins...
r16578
Augie Fackler
formatting: blacken the codebase...
r43346
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
Matt Harbison
largefiles: drop the override for 'fetch'...
r23441 # largefiles were changed. This is used by bisect, backout and fetch.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(cmdutil, b'bailifchanged')
FUJIWARA Katsunori
cmdutil: allow bailifchanged to ignore merging in progress...
r24472 def overridebailifchanged(orig, repo, *args, **kwargs):
orig(repo, *args, **kwargs)
various
hgext: add largefiles extension...
r15168 repo.lfstatus = True
Martin von Zweigbergk
largefiles: access status fields by name rather than index
r22919 s = repo.status()
various
hgext: add largefiles extension...
r15168 repo.lfstatus = False
Martin von Zweigbergk
largefiles: access status fields by name rather than index
r22919 if s.modified or s.added or s.removed or s.deleted:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'uncommitted changes'))
various
hgext: add largefiles extension...
r15168
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(cmdutil, b'postcommitstatus')
Matt Harbison
largefiles: report the missing file count after a commit that does nothing...
r27944 def postcommitstatus(orig, repo, *args, **kwargs):
repo.lfstatus = True
try:
return orig(repo, *args, **kwargs)
finally:
repo.lfstatus = False
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(cmdutil, b'forget')
Augie Fackler
formatting: blacken the codebase...
r43346 def cmdutilforget(
orig, ui, repo, match, prefix, uipathfn, explicitonly, dryrun, interactive
):
Matt Harbison
largefiles: enable subrepo support for forget
r23837 normalmatcher = composenormalfilematcher(match, repo[None].manifest())
Augie Fackler
formatting: blacken the codebase...
r43346 bad, forgot = orig(
ui,
repo,
normalmatcher,
prefix,
uipathfn,
explicitonly,
dryrun,
interactive,
)
Matt Harbison
largefiles: enable subrepo support for forget
r23837 m = composelargefilematcher(match, repo[None].manifest())
various
hgext: add largefiles extension...
r15168
try:
repo.lfstatus = True
s = repo.status(match=m, clean=True)
finally:
repo.lfstatus = False
FUJIWARA Katsunori
largefiles: avoid redundant changectx looking up at each repetitions...
r31654 manifest = repo[None].manifest()
Martin von Zweigbergk
largefiles: access status fields by name rather than index
r22919 forget = sorted(s.modified + s.added + s.deleted + s.clean)
FUJIWARA Katsunori
largefiles: avoid redundant changectx looking up at each repetitions...
r31654 forget = [f for f in forget if lfutil.standin(f) in manifest]
various
hgext: add largefiles extension...
r15168
for f in forget:
FUJIWARA Katsunori
largefiles: avoid redundant standin() invocations...
r31618 fstandin = lfutil.standin(f)
if fstandin not in repo.dirstate and not repo.wvfs.isdir(fstandin):
Augie Fackler
formatting: blacken the codebase...
r43346 ui.warn(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'not removing %s: file is already untracked\n') % uipathfn(f)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Matt Harbison
largefiles: enable subrepo support for forget
r23837 bad.append(f)
various
hgext: add largefiles extension...
r15168
for f in forget:
if ui.verbose or not m.exact(f):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(_(b'removing %s\n') % uipathfn(f))
various
hgext: add largefiles extension...
r15168
# 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.
Bryan O'Sullivan
with: use context manager for wlock in cmdutilforget
r27824 with repo.wlock():
various
hgext: add largefiles extension...
r15168 lfdirstate = lfutil.openlfdirstate(ui, repo)
for f in forget:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if lfdirstate[f] == b'a':
various
hgext: add largefiles extension...
r15168 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:
Mads Kiilerich
vfs: use repo.wvfs.unlinkpath
r31309 repo.wvfs.unlinkpath(f, ignoremissing=True)
Matt Harbison
largefiles: enable subrepo support for forget
r23837 rejected = repo[None].forget(standins)
various
hgext: add largefiles extension...
r15168
Matt Harbison
largefiles: enable subrepo support for forget
r23837 bad.extend(f for f in rejected if f in m.files())
forgot.extend(f for f in forget if f not in rejected)
return bad, forgot
Matt Harbison
largefiles: preserve the exit status of the forget command...
r17579
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: confirm existence of outgoing largefile entities in remote store...
r21884 def _getoutgoings(repo, other, missing, addfunc):
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg summary"...
r21882 """get pairs of filename and largefile hash in outgoing revisions
in 'missing'.
FUJIWARA Katsunori
largefiles: confirm existence of outgoing largefile entities in remote store...
r21884 largefiles already existing on 'other' repository are ignored.
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg summary"...
r21882 'addfunc' is invoked with each unique pairs of filename and
largefile hash value.
"""
knowns = set()
FUJIWARA Katsunori
largefiles: confirm existence of outgoing largefile entities in remote store...
r21884 lfhashes = set()
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg summary"...
r21882 def dedup(fn, lfhash):
k = (fn, lfhash)
if k not in knowns:
knowns.add(k)
FUJIWARA Katsunori
largefiles: confirm existence of outgoing largefile entities in remote store...
r21884 lfhashes.add(lfhash)
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg summary"...
r21882 lfutil.getlfilestoupload(repo, missing, dedup)
FUJIWARA Katsunori
largefiles: confirm existence of outgoing largefile entities in remote store...
r21884 if lfhashes:
liscju
largefiles: make storefactory._openstore public...
r29355 lfexists = storefactory.openstore(repo, other).exists(lfhashes)
FUJIWARA Katsunori
largefiles: confirm existence of outgoing largefile entities in remote store...
r21884 for fn, lfhash in knowns:
Augie Fackler
formatting: blacken the codebase...
r43346 if not lfexists[lfhash]: # lfhash doesn't exist on "other"
FUJIWARA Katsunori
largefiles: confirm existence of outgoing largefile entities in remote store...
r21884 addfunc(fn, lfhash)
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg summary"...
r21882
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: use "outgoinghooks" to avoid redundant outgoing check...
r21052 def outgoinghook(ui, repo, other, opts, missing):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if opts.pop(b'large', None):
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg outgoing"...
r21883 lfhashes = set()
if ui.debugflag:
toupload = {}
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg outgoing"...
r21883 def addfunc(fn, lfhash):
if fn not in toupload:
toupload[fn] = []
toupload[fn].append(lfhash)
lfhashes.add(lfhash)
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg outgoing"...
r21883 def showhashes(fn):
for lfhash in sorted(toupload[fn]):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.debug(b' %s\n' % lfhash)
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg outgoing"...
r21883 else:
toupload = set()
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg outgoing"...
r21883 def addfunc(fn, lfhash):
toupload.add(fn)
lfhashes.add(lfhash)
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg outgoing"...
r21883 def showhashes(fn):
pass
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: confirm existence of outgoing largefile entities in remote store...
r21884 _getoutgoings(repo, other, missing, addfunc)
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg outgoing"...
r21883
FUJIWARA Katsunori
largefiles: use "outgoinghooks" to avoid redundant outgoing check...
r21052 if not toupload:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(_(b'largefiles: no files to upload\n'))
various
hgext: add largefiles extension...
r15168 else:
Augie Fackler
formatting: blacken the codebase...
r43346 ui.status(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'largefiles to upload (%d entities):\n') % (len(lfhashes))
Augie Fackler
formatting: blacken the codebase...
r43346 )
FUJIWARA Katsunori
largefiles: use "outgoinghooks" to avoid redundant outgoing check...
r21052 for file in sorted(toupload):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(lfutil.splitstandin(file) + b'\n')
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg outgoing"...
r21883 showhashes(file)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(b'\n')
various
hgext: add largefiles extension...
r15168
Augie Fackler
formatting: blacken the codebase...
r43346
@eh.wrapcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'outgoing', opts=[(b'', b'large', None, _(b'display outgoing largefiles'))]
Augie Fackler
formatting: blacken the codebase...
r43346 )
Matt Harbison
largefiles: port commands to exthelper...
r41091 def _outgoingcmd(orig, *args, **kwargs):
# Nothing to do here other than add the extra help option- the hook above
# processes it.
return orig(*args, **kwargs)
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: use "summaryremotehooks" to avoid redundant outgoing check...
r21048 def summaryremotehook(ui, repo, opts, changes):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 largeopt = opts.get(b'large', False)
FUJIWARA Katsunori
largefiles: use "summaryremotehooks" to avoid redundant outgoing check...
r21048 if changes is None:
if largeopt:
Augie Fackler
formatting: blacken the codebase...
r43346 return (False, True) # only outgoing check is needed
FUJIWARA Katsunori
largefiles: use "summaryremotehooks" to avoid redundant outgoing check...
r21048 else:
return (False, False)
elif largeopt:
url, branch, peer, outgoing = changes[1]
if peer is None:
# i18n: column positioning for "hg summary"
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(_(b'largefiles: (no remote repo)\n'))
FUJIWARA Katsunori
largefiles: use "summaryremotehooks" to avoid redundant outgoing check...
r21048 return
toupload = set()
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg summary"...
r21882 lfhashes = set()
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg summary"...
r21882 def addfunc(fn, lfhash):
toupload.add(fn)
lfhashes.add(lfhash)
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
largefiles: confirm existence of outgoing largefile entities in remote store...
r21884 _getoutgoings(repo, peer, outgoing.missing, addfunc)
FUJIWARA Katsunori
largefiles: show also how many data entities are outgoing at "hg summary"...
r21882
FUJIWARA Katsunori
largefiles: use "summaryremotehooks" to avoid redundant outgoing check...
r21048 if not toupload:
# i18n: column positioning for "hg summary"
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.status(_(b'largefiles: (no files to upload)\n'))
FUJIWARA Katsunori
largefiles: use "summaryremotehooks" to avoid redundant outgoing check...
r21048 else:
# i18n: column positioning for "hg summary"
Augie Fackler
formatting: blacken the codebase...
r43346 ui.status(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'largefiles: %d entities for %d files to upload\n')
Augie Fackler
formatting: blacken the codebase...
r43346 % (len(lfhashes), len(toupload))
)
FUJIWARA Katsunori
largefiles: use "summaryremotehooks" to avoid redundant outgoing check...
r21048
Augie Fackler
formatting: blacken the codebase...
r43346
@eh.wrapcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'summary', opts=[(b'', b'large', None, _(b'display outgoing largefiles'))]
Augie Fackler
formatting: blacken the codebase...
r43346 )
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
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(scmutil, b'addremove')
Martin von Zweigbergk
addremove: pass around uipathfn and use instead of m.uipath() (API)...
r41801 def scmutiladdremove(orig, repo, matcher, prefix, uipathfn, opts=None):
Pierre-Yves David
largefiles: remove a mutable default argument...
r26344 if opts is None:
opts = {}
Na'Tosha Bard
largefiles: follow normal codepath for addremove if non-largefiles repo (issue3249)
r16636 if not lfutil.islfilesrepo(repo):
Martin von Zweigbergk
addremove: pass around uipathfn and use instead of m.uipath() (API)...
r41801 return orig(repo, matcher, prefix, uipathfn, opts)
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)
Augie Fackler
formatting: blacken the codebase...
r43346 unsure, s = lfdirstate.status(
matchmod.always(),
subrepos=[],
ignored=False,
clean=False,
unknown=False,
)
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.
Martin von Zweigbergk
largefiles: access status fields by name rather than index
r22919 if s.deleted:
Matt Harbison
largefiles: pass a matcher instead of a raw file list to removelargefiles()...
r23741 m = copy.copy(matcher)
# The m._files and m._map attributes are not changed to the deleted list
# because that affects the m.exact() test, which in turn governs whether
# or not the file name is printed, and how. Simply limit the original
# matches to those in the deleted status list.
matchfn = m.matchfn
m.matchfn = lambda f: f in s.deleted and matchfn(f)
Augie Fackler
formatting: blacken the codebase...
r43346 removelargefiles(
repo.ui,
repo,
True,
m,
uipathfn,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 opts.get(b'dry_run'),
Augie Fackler
formatting: blacken the codebase...
r43346 **pycompat.strkwargs(opts)
)
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
Augie Fackler
formatting: blacken the codebase...
r43346 added, bad = addlargefiles(
repo.ui, repo, True, matcher, uipathfn, **pycompat.strkwargs(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
Matt Harbison
scmutil: pass a matcher to scmutil.addremove() instead of a list of patterns...
r23533 # largefiles by passing a matcher that will ignore them.
Matt Harbison
largefiles: don't print files as both large and normal in addremove dryruns
r23769 matcher = composenormalfilematcher(matcher, repo[None].manifest(), added)
Martin von Zweigbergk
addremove: pass around uipathfn and use instead of m.uipath() (API)...
r41801 return orig(repo, matcher, prefix, uipathfn, opts)
various
hgext: add largefiles extension...
r15168
Augie Fackler
formatting: blacken the codebase...
r43346
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.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapcommand(b'purge', extension=b'purge')
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridepurge(orig, ui, repo, *dirs, **opts):
Pierre-Yves David
largefile: explain why no monkey patching on a repoview...
r23635 # XXX Monkey patching a repoview will not work. The assigned attribute will
# be set on the unfiltered repo, but we will only lookup attributes in the
# unfiltered repo if the lookup in the repoview object itself fails. As the
# monkey patched method exists on the repoview class the lookup will not
# fail. As a result, the original version will shadow the monkey patched
# one, defeating the monkey patch.
#
# As a work around we use an unfiltered repo here. We should do something
# cleaner instead.
Pierre-Yves David
largefile: status is buggy on repoproxy, so run unfiltered...
r18012 repo = repo.unfiltered()
various
hgext: add largefiles extension...
r15168 oldstatus = repo.status
Augie Fackler
formatting: blacken the codebase...
r43346
def overridestatus(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 node1=b'.',
Augie Fackler
formatting: blacken the codebase...
r43346 node2=None,
match=None,
ignored=False,
clean=False,
unknown=False,
listsubrepos=False,
):
r = oldstatus(
node1, node2, match, ignored, clean, unknown, listsubrepos
)
various
hgext: add largefiles extension...
r15168 lfdirstate = lfutil.openlfdirstate(ui, repo)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 unknown = [f for f in r.unknown if lfdirstate[f] == b'?']
ignored = [f for f in r.ignored if lfdirstate[f] == b'?']
Augie Fackler
formatting: blacken the codebase...
r43346 return scmutil.status(
r.modified, r.added, r.removed, r.deleted, unknown, ignored, r.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
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapcommand(b'rollback')
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overriderollback(orig, ui, repo, **opts):
Bryan O'Sullivan
with: use context manager for wlock in overridepurge
r27825 with repo.wlock():
FUJIWARA Katsunori
largefiles: omit restoring standins if working parent is not rollbacked...
r22283 before = repo.dirstate.parents()
Augie Fackler
formatting: blacken the codebase...
r43346 orphans = set(
f
for f in repo.dirstate
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if lfutil.isstandin(f) and repo.dirstate[f] != b'r'
Augie Fackler
formatting: blacken the codebase...
r43346 )
FUJIWARA Katsunori
largefiles: put whole rollback-ing process into the same "wlock" scope...
r22094 result = orig(ui, repo, **opts)
FUJIWARA Katsunori
largefiles: omit restoring standins if working parent is not rollbacked...
r22283 after = repo.dirstate.parents()
if before == after:
Augie Fackler
formatting: blacken the codebase...
r43346 return result # no need to restore standins
FUJIWARA Katsunori
largefiles: omit restoring standins if working parent is not rollbacked...
r22283
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pctx = repo[b'.']
FUJIWARA Katsunori
largefiles: restore standins according to restored dirstate...
r22285 for f in repo.dirstate:
if lfutil.isstandin(f):
FUJIWARA Katsunori
largefiles: unlink standins not known to the restored dirstate at rollback...
r22286 orphans.discard(f)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if repo.dirstate[f] == b'r':
FUJIWARA Katsunori
largefiles: restore standins according to restored dirstate...
r22285 repo.wvfs.unlinkpath(f, ignoremissing=True)
elif f in pctx:
fctx = pctx[f]
repo.wwrite(f, fctx.data(), fctx.flags())
else:
# content of standin is not so important in 'a',
# 'm' or 'n' (coming from the 2nd parent) cases
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lfutil.writestandin(repo, f, b'', False)
FUJIWARA Katsunori
largefiles: unlink standins not known to the restored dirstate at rollback...
r22286 for standin in orphans:
repo.wvfs.unlinkpath(standin, ignoremissing=True)
FUJIWARA Katsunori
largefiles: put whole rollback-ing process into the same "wlock" scope...
r22094
Levi Bard
largefiles: fix inappropriate locking (issue3182)...
r15794 lfdirstate = lfutil.openlfdirstate(ui, repo)
FUJIWARA Katsunori
largefiles: drop orphan entries from lfdristat at "hg rollback"...
r22097 orphans = set(lfdirstate)
Levi Bard
largefiles: fix inappropriate locking (issue3182)...
r15794 lfiles = lfutil.listlfiles(repo)
for file in lfiles:
FUJIWARA Katsunori
largefiles: restore R status of removed largefiles correctly at "hg rollback"...
r22096 lfutil.synclfdirstate(repo, lfdirstate, file, True)
FUJIWARA Katsunori
largefiles: drop orphan entries from lfdristat at "hg rollback"...
r22097 orphans.discard(file)
for lfile in orphans:
lfdirstate.drop(lfile)
Levi Bard
largefiles: fix inappropriate locking (issue3182)...
r15794 lfdirstate.write()
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
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapcommand(b'transplant', extension=b'transplant')
Na'Tosha Bard
largefiles: remove use of underscores that breaks coding convention
r16247 def overridetransplant(orig, ui, repo, *revs, **opts):
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 resuming = opts.get(r'continue')
FUJIWARA Katsunori
largefiles: update standins only at the 1st commit of "transplant --continue"...
r23274 repo._lfcommithooks.append(lfutil.automatedcommithook(resuming))
FUJIWARA Katsunori
largefiles: avoid printing messages while transplanting by "_lfstatuswriters"...
r23275 repo._lfstatuswriters.append(lambda *msg, **opts: None)
Na'Tosha Bard
largefiles: fix transplant for all cases (issue3192)
r15982 try:
result = orig(ui, repo, *revs, **opts)
finally:
FUJIWARA Katsunori
largefiles: avoid printing messages while transplanting by "_lfstatuswriters"...
r23275 repo._lfstatuswriters.pop()
FUJIWARA Katsunori
largefiles: update standins only at the 1st commit of "transplant --continue"...
r23274 repo._lfcommithooks.pop()
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
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapcommand(b'cat')
Na'Tosha Bard
largefiles: fix cat for largefiles (issue3352)...
r16439 def overridecat(orig, ui, repo, file1, *pats, **opts):
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 opts = pycompat.byteskwargs(opts)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ctx = scmutil.revsingle(repo, opts.get(b'rev'))
Mads Kiilerich
largefiles: fix cat when using relative paths from subdirectory
r18491 err = 1
notbad = set()
m = scmutil.match(ctx, (file1,) + pats, opts)
origmatchfn = m.matchfn
Augie Fackler
formatting: blacken the codebase...
r43346
Mads Kiilerich
largefiles: fix cat when using relative paths from subdirectory
r18491 def lfmatchfn(f):
Mads Kiilerich
largefiles: make cat on standins do something...
r21087 if origmatchfn(f):
return True
Mads Kiilerich
largefiles: fix cat when using relative paths from subdirectory
r18491 lf = lfutil.splitstandin(f)
if lf is None:
Mads Kiilerich
largefiles: make cat on standins do something...
r21087 return False
Mads Kiilerich
largefiles: fix cat when using relative paths from subdirectory
r18491 notbad.add(lf)
return origmatchfn(lf)
Augie Fackler
formatting: blacken the codebase...
r43346
Mads Kiilerich
largefiles: fix cat when using relative paths from subdirectory
r18491 m.matchfn = lfmatchfn
Mads Kiilerich
largefiles: fix cat of non-largefiles from subdirectory...
r18974 origbadfn = m.bad
Augie Fackler
formatting: blacken the codebase...
r43346
Mads Kiilerich
largefiles: fix cat of non-largefiles from subdirectory...
r18974 def lfbadfn(f, msg):
if not f in notbad:
Mads Kiilerich
largefiles: remove confusing handling of .bad return value - it is void
r21086 origbadfn(f, msg)
Augie Fackler
formatting: blacken the codebase...
r43346
Mads Kiilerich
largefiles: fix cat of non-largefiles from subdirectory...
r18974 m.bad = lfbadfn
Drew Gottlieb
treemanifest: optimize treemanifest._walk() to skip directories...
r24670
origvisitdirfn = m.visitdir
Augie Fackler
formatting: blacken the codebase...
r43346
Drew Gottlieb
treemanifest: optimize treemanifest._walk() to skip directories...
r24670 def lfvisitdirfn(dir):
if dir == lfutil.shortname:
return True
ret = origvisitdirfn(dir)
if ret:
return ret
lf = lfutil.splitstandin(dir)
if lf is None:
return False
return origvisitdirfn(lf)
Augie Fackler
formatting: blacken the codebase...
r43346
Drew Gottlieb
treemanifest: optimize treemanifest._walk() to skip directories...
r24670 m.visitdir = lfvisitdirfn
Mads Kiilerich
largefiles: fix cat when using relative paths from subdirectory
r18491 for f in ctx.walk(m):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 with cmdutil.makefileobj(ctx, opts.get(b'output'), pathname=f) as fp:
Mads Kiilerich
largefiles: use context for file closing...
r30142 lf = lfutil.splitstandin(f)
if lf is None or origmatchfn(f):
# duplicating unreachable code from commands.cat
data = ctx[f].data()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if opts.get(b'decode'):
Mads Kiilerich
largefiles: use context for file closing...
r30142 data = repo.wwritedata(f, data)
fp.write(data)
else:
FUJIWARA Katsunori
largefiles: replace readstandin() by readasstandin()...
r31735 hash = lfutil.readasstandin(ctx[f])
Mads Kiilerich
largefiles: use context for file closing...
r30142 if not lfutil.inusercache(repo.ui, hash):
store = storefactory.openstore(repo)
success, missing = store.get([(lf, hash)])
if len(success) != 1:
raise error.Abort(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'largefile %s is not in cache and could not be '
b'downloaded'
Augie Fackler
formatting: blacken the codebase...
r43346 )
% lf
)
Mads Kiilerich
largefiles: use context for file closing...
r30142 path = lfutil.usercachepath(repo.ui, hash)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 with open(path, b"rb") as fpin:
Mads Kiilerich
util: increase filechunkiter size to 128k...
r30181 for chunk in util.filechunkiter(fpin):
Mads Kiilerich
largefiles: use context for file closing...
r30142 fp.write(chunk)
Mads Kiilerich
largefiles: fix cat of non-largefiles from subdirectory...
r18974 err = 0
Mads Kiilerich
largefiles: fix cat when using relative paths from subdirectory
r18491 return err
Matt Harbison
largefiles: don't copy largefiles from working dir to the store while converting...
r17878
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(merge, b'update')
Augie Fackler
formatting: blacken the codebase...
r43346 def mergeupdate(orig, repo, node, branchmerge, force, *args, **kwargs):
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 matcher = kwargs.get(r'matcher', None)
Augie Fackler
merge: have merge.update use a matcher instead of partial fn...
r27344 # note if this is a partial update
partial = matcher and not matcher.always()
Bryan O'Sullivan
with: use context manager for wlock in mergeupdate
r27826 with repo.wlock():
FUJIWARA Katsunori
largefiles: update largefiles even if rebase is aborted by conflict...
r22288 # branch | | |
# merge | force | partial | action
# -------+-------+---------+--------------
# x | x | x | linear-merge
# o | x | x | branch-merge
# x | o | x | overwrite (as clean update)
# o | o | x | force-branch-merge (*1)
# x | x | o | (*)
# o | x | o | (*)
# x | o | o | overwrite (as revert)
# o | o | o | (*)
#
# (*) don't care
# (*1) deprecated, but used internally (e.g: "rebase --collapse")
Mads Kiilerich
largefiles: for update -C, only update largefiles when necessary...
r24787 lfdirstate = lfutil.openlfdirstate(repo.ui, repo)
Augie Fackler
formatting: blacken the codebase...
r43346 unsure, s = lfdirstate.status(
matchmod.always(),
subrepos=[],
ignored=False,
clean=True,
unknown=False,
)
Mads Kiilerich
largefiles: more safe handling of interruptions while updating modifications...
r30190 oldclean = set(s.clean)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 pctx = repo[b'.']
FUJIWARA Katsunori
largefiles: omit updating newly added standin at linear merging...
r31653 dctx = repo[node]
Mads Kiilerich
largefiles: for update -C, only update largefiles when necessary...
r24787 for lfile in unsure + s.modified:
lfileabs = repo.wvfs.join(lfile)
liscju
largefiles: replace invocation of os.path module by vfs in overrides.py...
r28715 if not repo.wvfs.exists(lfileabs):
Mads Kiilerich
largefiles: for update -C, only update largefiles when necessary...
r24787 continue
FUJIWARA Katsunori
largefiles: replace hashrepofile by hashfile (API)...
r31617 lfhash = lfutil.hashfile(lfileabs)
Mads Kiilerich
largefiles: for update -C, only update largefiles when necessary...
r24787 standin = lfutil.standin(lfile)
Augie Fackler
formatting: blacken the codebase...
r43346 lfutil.writestandin(
repo, standin, lfhash, lfutil.getexecutable(lfileabs)
)
if standin in pctx and lfhash == lfutil.readasstandin(
pctx[standin]
):
Mads Kiilerich
largefiles: more safe handling of interruptions while updating modifications...
r30190 oldclean.add(lfile)
Mads Kiilerich
largefiles: for update -C, only update largefiles when necessary...
r24787 for lfile in s.added:
FUJIWARA Katsunori
largefiles: omit updating newly added standin at linear merging...
r31653 fstandin = lfutil.standin(lfile)
if fstandin not in dctx:
# in this case, content of standin file is meaningless
# (in dctx, lfile is unknown, or normal file)
continue
FUJIWARA Katsunori
largefiles: add lfile argument to updatestandin() for efficiency (API)...
r31659 lfutil.updatestandin(repo, lfile, fstandin)
Mads Kiilerich
largefiles: more safe handling of interruptions while updating modifications...
r30190 # mark all clean largefiles as dirty, just in case the update gets
# interrupted before largefiles and lfdirstate are synchronized
for lfile in oldclean:
lfdirstate.normallookup(lfile)
Mads Kiilerich
largefiles: for update -C, only update largefiles when necessary...
r24787 lfdirstate.write()
FUJIWARA Katsunori
largefiles: update largefiles even if rebase is aborted by conflict...
r22288
Mads Kiilerich
largefiles: for update -C, only update largefiles when necessary...
r24787 oldstandins = lfutil.getstandinsstate(repo)
Phil Cohen
largefiles: force an on-disk merge...
r34304 # Make sure the merge runs on disk, not in-memory. largefiles is not a
# good candidate for in-memory merge (large files, custom dirstate,
# matcher usage).
Pulkit Goyal
py3: handle keyword arguments correctly in hgext/largefiles/...
r35349 kwargs[r'wc'] = repo[None]
Augie Fackler
merge: have merge.update use a matcher instead of partial fn...
r27344 result = orig(repo, node, branchmerge, force, *args, **kwargs)
FUJIWARA Katsunori
largefiles: update largefiles even if rebase is aborted by conflict...
r22288
Mads Kiilerich
largefiles: for update -C, only update largefiles when necessary...
r24787 newstandins = lfutil.getstandinsstate(repo)
filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
Mads Kiilerich
largefiles: more safe handling of interruptions while updating modifications...
r30190
# to avoid leaving all largefiles as dirty and thus rehash them, mark
# all the ones that didn't change as clean
for lfile in oldclean.difference(filelist):
lfdirstate.normal(lfile)
lfdirstate.write()
Mads Kiilerich
largefiles: for update -C, only update largefiles when necessary...
r24787 if branchmerge or force or partial:
filelist.extend(s.deleted + s.removed)
FUJIWARA Katsunori
largefiles: update largefiles even if rebase is aborted by conflict...
r22288
Augie Fackler
formatting: blacken the codebase...
r43346 lfcommands.updatelfiles(
repo.ui, repo, filelist=filelist, normallookup=partial
)
FUJIWARA Katsunori
largefiles: update largefiles even if rebase is aborted by conflict...
r22288
return result
FUJIWARA Katsunori
largefiles: update largefiles even if transplant is aborted by conflict...
r22289
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(scmutil, b'marktouched')
FUJIWARA Katsunori
largefiles: update largefiles even if transplant is aborted by conflict...
r22289 def scmutilmarktouched(orig, repo, files, *args, **kwargs):
result = orig(repo, files, *args, **kwargs)
FUJIWARA Katsunori
largefiles: omit redundant isstandin() before splitstandin()...
r31613 filelist = []
for f in files:
lf = lfutil.splitstandin(f)
if lf is not None:
filelist.append(lf)
FUJIWARA Katsunori
largefiles: update largefiles even if transplant is aborted by conflict...
r22289 if filelist:
Augie Fackler
formatting: blacken the codebase...
r43346 lfcommands.updatelfiles(
repo.ui,
repo,
filelist=filelist,
printmessage=False,
normallookup=True,
)
FUJIWARA Katsunori
largefiles: update largefiles even if transplant is aborted by conflict...
r22289
return result
Boris Feld
largefiles: allow to run 'debugupgraderepo' on repo with largefiles...
r35304
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(upgrade, b'preservedrequirements')
@eh.wrapfunction(upgrade, b'supporteddestrequirements')
Boris Feld
largefiles: allow to run 'debugupgraderepo' on repo with largefiles...
r35304 def upgraderequirements(orig, repo):
reqs = orig(repo)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if b'largefiles' in repo.requirements:
reqs.add(b'largefiles')
Boris Feld
largefiles: allow to run 'debugupgraderepo' on repo with largefiles...
r35304 return reqs
Boris Feld
largefiles: add support for 'largefiles://' url scheme...
r35580
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _lfscheme = b'largefile://'
Matt Harbison
largefiles: port wrapped functions to exthelper...
r41092
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @eh.wrapfunction(urlmod, b'open')
Boris Feld
largefiles: add support for 'largefiles://' url scheme...
r35580 def openlargefile(orig, ui, url_, data=None):
if url_.startswith(_lfscheme):
if data:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 msg = b"cannot use data on a 'largefile://' url"
Boris Feld
largefiles: add support for 'largefiles://' url scheme...
r35580 raise error.ProgrammingError(msg)
Augie Fackler
formatting: blacken the codebase...
r43346 lfid = url_[len(_lfscheme) :]
Boris Feld
largefiles: add support for 'largefiles://' url scheme...
r35580 return storefactory.getlfile(ui, lfid)
else:
return orig(ui, url_, data=data)