##// END OF EJS Templates
patch: stop modifying gitpatch objects...
patch: stop modifying gitpatch objects gitpatch objects emitted by iterhunks() were referencing file paths unmodified from the input patch. _applydif() made them usable by modifying the gitpatch objects in-place with specified path strip level. The same modified objects were then reused by iterhunks() generator. _applydiff() now copies and update the paths which completely decouples both routines. As a side effect, the "git" event now receives only metadata about copies/renames to perform the necessary copies ahead of time. Other actions are handled in the "file" event.

File last commit:

r14377:f90d5641 default
r14389:909ac6b9 default
Show More
hg.py
559 lines | 18.6 KiB | text/x-python | PythonLexer
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 # hg.py - repository classes for mercurial
#
Thomas Arendsen Hein
Updated copyright notices and add "and others" to "hg version"
r4635 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
Vadim Gelfer
update copyrights.
r2859 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 #
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0
Matt Mackall
Simplify i18n imports
r3891 from i18n import _
Ronny Pfannschmidt
switch lock releasing in the core from gc to explicit
r8109 from lock import release
Alexander Solovyov
remove unused imports and variables
r14064 from node import hex, nullid
David Soria Parra
hg: add support for cloning bookmarks
r13604 import localrepo, bundlerepo, httprepo, sshrepo, statichttprepo, bookmarks
Alexander Solovyov
remove unused imports and variables
r14064 import lock, util, extensions, error, node
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 import cmdutil, discovery
Benoit Boissinot
style: use consistent variable names (*mod) with imports which would shadow
r10651 import merge as mergemod
import verify as verifymod
Simon Heimberg
separate import lines from mercurial and general python modules
r8312 import errno, os, shutil
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 def _local(path):
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 path = util.expandpath(util.localpath(path))
Alexander Solovyov
expand paths to local repository or bundle in appropriate classes...
r11154 return (os.path.isfile(path) and bundlerepo or localrepo)
Vadim Gelfer
hg.repository: make protocol table driven....
r2469
Sune Foldager
interpret repo#name url syntax as branch instead of revision...
r10365 def addbranchrevs(lrepo, repo, branches, revs):
Sune Foldager
improve --branch processing (and differentiate from # syntax)...
r11322 hashbranch, branches = branches
if not hashbranch and not branches:
Sune Foldager
interpret repo#name url syntax as branch instead of revision...
r10365 return revs or None, revs and revs[0] or None
Sune Foldager
addbranchrevs: fallback for older servers
r10380 revs = revs and list(revs) or []
if not repo.capable('branchmap'):
Sune Foldager
improve --branch processing (and differentiate from # syntax)...
r11322 if branches:
raise util.Abort(_("remote branch lookup not supported"))
revs.append(hashbranch)
Sune Foldager
addbranchrevs: fallback for older servers
r10380 return revs, revs[0]
Sune Foldager
interpret repo#name url syntax as branch instead of revision...
r10365 branchmap = repo.branchmap()
Sune Foldager
improve --branch processing (and differentiate from # syntax)...
r11322
Matt Mackall
branch: operate on branch names in local string space where possible...
r13047 def primary(branch):
if branch == '.':
Sune Foldager
interpret repo#name url syntax as branch instead of revision...
r10365 if not lrepo or not lrepo.local():
raise util.Abort(_("dirstate branch not accessible"))
Matt Mackall
branch: operate on branch names in local string space where possible...
r13047 branch = lrepo.dirstate.branch()
if branch in branchmap:
revs.extend(node.hex(r) for r in reversed(branchmap[branch]))
Sune Foldager
improve --branch processing (and differentiate from # syntax)...
r11322 return True
Sune Foldager
interpret repo#name url syntax as branch instead of revision...
r10365 else:
Sune Foldager
improve --branch processing (and differentiate from # syntax)...
r11322 return False
for branch in branches:
Matt Mackall
branch: operate on branch names in local string space where possible...
r13047 if not primary(branch):
Sune Foldager
improve --branch processing (and differentiate from # syntax)...
r11322 raise error.RepoLookupError(_("unknown branch '%s'") % branch)
if hashbranch:
Matt Mackall
branch: operate on branch names in local string space where possible...
r13047 if not primary(hashbranch):
Sune Foldager
improve --branch processing (and differentiate from # syntax)...
r11322 revs.append(hashbranch)
Sune Foldager
interpret repo#name url syntax as branch instead of revision...
r10365 return revs, revs[0]
Brodie Rao
hg: use url.url to parse branch names in parseurl()
r13824 def parseurl(path, branches=None):
Sune Foldager
improve --branch processing (and differentiate from # syntax)...
r11322 '''parse url#branch, returning (url, (branch, branches))'''
Matt Mackall
move parseurl from cmdutil to hg
r5177
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 u = util.url(path)
Thomas Arendsen Hein
hg: make parseurl() consistently return normalised path...
r13897 branch = None
if u.fragment:
branch = u.fragment
u.fragment = None
Brodie Rao
hg: use url.url to parse branch names in parseurl()
r13824 return str(u), (branch, branches or [])
Matt Mackall
move parseurl from cmdutil to hg
r5177
Vadim Gelfer
make repo scheme table driven.
r2472 schemes = {
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 'bundle': bundlerepo,
'file': _local,
'http': httprepo,
'https': httprepo,
'ssh': sshrepo,
'static-http': statichttprepo,
Thomas Arendsen Hein
Removed deprecated hg:// and old-http:// protocols (issue406)
r4853 }
Vadim Gelfer
hg.repository: make protocol table driven....
r2469
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 def _lookup(path):
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 u = util.url(path)
Brodie Rao
hg: look up schemes using url.url
r13823 scheme = u.scheme or 'file'
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 thing = schemes.get(scheme) or schemes['file']
try:
return thing(path)
except TypeError:
return thing
Matt Mackall
Move merge code to its own module...
r2775
Vadim Gelfer
hg.py: add islocal() and defaultdest() functions, refactor...
r2719 def islocal(repo):
'''return true if repo or path is local'''
if isinstance(repo, str):
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 try:
return _lookup(repo).islocal(repo)
except AttributeError:
return False
Vadim Gelfer
hg.py: add islocal() and defaultdest() functions, refactor...
r2719 return repo.local()
Brendan Cully
Make hg.repository work with no path argument
r3195 def repository(ui, path='', create=False):
Matt Mackall
Add a doc string
r2774 """return a repository object for the specified path"""
Vadim Gelfer
call reposetup functions of extension modules whenever repo created
r2847 repo = _lookup(path).instance(ui, path, create)
Alexis S. L. Carvalho
Try to pass repo.ui to reposetup hooks...
r4074 ui = getattr(repo, "ui", ui)
Alexis S. L. Carvalho
Move cmdtable and reposetup handling out of extensions.py...
r5192 for name, module in extensions.extensions():
hook = getattr(module, 'reposetup', None)
if hook:
hook(ui, repo)
Vadim Gelfer
call reposetup functions of extension modules whenever repo created
r2847 return repo
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
Vadim Gelfer
hg.py: add islocal() and defaultdest() functions, refactor...
r2719 def defaultdest(source):
'''return default destination of clone if none is given'''
return os.path.basename(os.path.normpath(source))
Matt Mackall
Add a doc string
r2774
Matt Mackall
share: allow dest to default to the basename of source
r8807 def share(ui, source, dest=None, update=True):
Matt Mackall
add helper function to create shared repos
r8800 '''create a shared repository'''
if not islocal(source):
raise util.Abort(_('can only share local repositories'))
Matt Mackall
share: allow dest to default to the basename of source
r8807 if not dest:
Brendan Cully
share: use defaultdest to compute unspecified destination...
r10099 dest = defaultdest(source)
Matt Mackall
Merge with i18n-stable
r9344 else:
dest = ui.expandpath(dest)
Matt Mackall
share: allow dest to default to the basename of source
r8807
Matt Mackall
add helper function to create shared repos
r8800 if isinstance(source, str):
origsource = ui.expandpath(source)
Sune Foldager
interpret repo#name url syntax as branch instead of revision...
r10365 source, branches = parseurl(origsource)
Matt Mackall
add helper function to create shared repos
r8800 srcrepo = repository(ui, source)
Sune Foldager
interpret repo#name url syntax as branch instead of revision...
r10365 rev, checkout = addbranchrevs(srcrepo, srcrepo, branches, None)
Matt Mackall
add helper function to create shared repos
r8800 else:
srcrepo = source
origsource = source = srcrepo.url()
checkout = None
sharedpath = srcrepo.sharedpath # if our source is already sharing
root = os.path.realpath(dest)
roothg = os.path.join(root, '.hg')
if os.path.exists(roothg):
raise util.Abort(_('destination already exists'))
if not os.path.isdir(root):
os.mkdir(root)
Adrian Buehlmann
set NOT_CONTENT_INDEXED on .hg dir (issue2694)...
r13795 util.makedir(roothg, notindexed=True)
Matt Mackall
add helper function to create shared repos
r8800
requirements = ''
try:
Dan Villiom Podlaski Christiansen
prevent transient leaks of file handle by using new helper functions...
r14168 requirements = srcrepo.opener.read('requires')
Matt Mackall
add helper function to create shared repos
r8800 except IOError, inst:
if inst.errno != errno.ENOENT:
raise
requirements += 'shared\n'
Dan Villiom Podlaski Christiansen
prevent transient leaks of file handle by using new helper functions...
r14168 util.writefile(os.path.join(roothg, 'requires'), requirements)
util.writefile(os.path.join(roothg, 'sharedpath'), sharedpath)
Matt Mackall
add helper function to create shared repos
r8800
Dan Villiom Podlaski Christiansen
share: create 'hgrc' using an opener, like clone
r14156 r = repository(ui, root)
Matt Mackall
add helper function to create shared repos
r8800 default = srcrepo.ui.config('paths', 'default')
if default:
Dan Villiom Podlaski Christiansen
share: create 'hgrc' using an opener, like clone
r14156 fp = r.opener("hgrc", "w", text=True)
fp.write("[paths]\n")
fp.write("default = %s\n" % default)
fp.close()
Matt Mackall
add helper function to create shared repos
r8800
if update:
r.ui.status(_("updating working directory\n"))
if update is not True:
checkout = update
for test in (checkout, 'default', 'tip'):
Matt Mackall
Make distinct lookup error for localrepo.lookup...
r9423 if test is None:
continue
Matt Mackall
add helper function to create shared repos
r8800 try:
uprev = r.lookup(test)
break
Matt Mackall
Make distinct lookup error for localrepo.lookup...
r9423 except error.RepoLookupError:
Matt Mackall
add helper function to create shared repos
r8800 continue
_update(r, uprev)
Vadim Gelfer
clone: do not make streaming default. add --stream option instead.
r2613 def clone(ui, source, dest=None, pull=False, rev=None, update=True,
Sune Foldager
add -b/--branch option to clone, bundle, incoming, outgoing, pull, push
r10379 stream=False, branch=None):
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 """Make a copy of an existing repository.
Create a copy of an existing repository in a new directory. The
source and destination are URLs, as passed to the repository
function. Returns a pair of repository objects, the source and
newly created destination.
The location of the source is added to the new repository's
.hg/hgrc file, as the default to be used for future pulls and
pushes.
If an exception is raised, the partly cloned/updated destination
repository will be deleted.
Vadim Gelfer
clean up trailing white space.
r2600
Vadim Gelfer
hg.py: add islocal() and defaultdest() functions, refactor...
r2719 Arguments:
source: repository object or URL
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
dest: URL of destination repository to create (defaults to base
name of source repository)
pull: always pull from source repository, even in local case
Vadim Gelfer
clone: disable stream support on server side by default....
r2621 stream: stream raw data uncompressed from repository (fast over
LAN, slow over WAN)
Vadim Gelfer
clone: do not make streaming default. add --stream option instead.
r2613
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 rev: revision to clone up to (implies pull=True)
update: update working directory after clone completes, if
Bryan O'Sullivan
repo: add rjoin method
r6526 destination is local repository (True means update to default rev,
anything else is treated as a revision)
Sune Foldager
add -b/--branch option to clone, bundle, incoming, outgoing, pull, push
r10379
branch: branches to clone
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 """
Matt Mackall
Add support for url#id syntax...
r4478
Vadim Gelfer
hg.py: add islocal() and defaultdest() functions, refactor...
r2719 if isinstance(source, str):
Alexis S. L. Carvalho
clone: make things work when source is a repo object
r6089 origsource = ui.expandpath(source)
Sune Foldager
add -b/--branch option to clone, bundle, incoming, outgoing, pull, push
r10379 source, branch = parseurl(origsource, branch)
Vadim Gelfer
hg.py: add islocal() and defaultdest() functions, refactor...
r2719 src_repo = repository(ui, source)
else:
src_repo = source
Nicolas Dumazet
hg.clone: do not ignore branch argument when source is a repo object...
r11818 branch = (None, branch or [])
Alexis S. L. Carvalho
clone: make things work when source is a repo object
r6089 origsource = source = src_repo.url()
Sune Foldager
interpret repo#name url syntax as branch instead of revision...
r10365 rev, checkout = addbranchrevs(src_repo, src_repo, branch, rev)
Vadim Gelfer
hg.py: add islocal() and defaultdest() functions, refactor...
r2719
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 if dest is None:
Vadim Gelfer
hg.py: add islocal() and defaultdest() functions, refactor...
r2719 dest = defaultdest(source)
Thomas Arendsen Hein
Show the destionation for clone if not specified manually.
r3841 ui.status(_("destination directory: %s\n") % dest)
Matt Mackall
Merge with i18n-stable
r9344 else:
dest = ui.expandpath(dest)
Vadim Gelfer
hg.py: add islocal() and defaultdest() functions, refactor...
r2719
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 dest = util.localpath(dest)
source = util.localpath(source)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
if os.path.exists(dest):
Steve Borho
allow clone into existing but empty directories
r7927 if not os.path.isdir(dest):
raise util.Abort(_("destination '%s' already exists") % dest)
elif os.listdir(dest):
raise util.Abort(_("destination '%s' is not empty") % dest)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
class DirCleanup(object):
def __init__(self, dir_):
self.rmtree = shutil.rmtree
self.dir_ = dir_
def close(self):
self.dir_ = None
Ronny Pfannschmidt
switch dircleanup in mercurial.hg.clone from gc based to explicit
r8110 def cleanup(self):
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 if self.dir_:
self.rmtree(self.dir_, True)
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 src_lock = dest_lock = dir_cleanup = None
try:
Brendan Cully
clone: make default path absolute for all local paths...
r14377 abspath = origsource
if islocal(origsource):
abspath = os.path.abspath(util.localpath(origsource))
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 if islocal(dest):
dir_cleanup = DirCleanup(dest)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 copy = False
Matt Mackall
clone: use cancopy
r6315 if src_repo.cancopy() and islocal(dest):
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 copy = not pull and not rev
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 if copy:
try:
# we use a lock here because if we race with commit, we
# can end up with extra data in the cloned revlogs that's
# not pointed to by changesets, thus causing verify to
# fail
Benoit Boissinot
clone: fall back to pull source repo cannot be locked, 937ee88da3ef was a noop...
r8649 src_lock = src_repo.lock(wait=False)
Matt Mackall
error: move lock errors...
r7640 except error.LockError:
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 copy = False
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 if copy:
Fred Wulff
Add (pre)outgoing hooks for local clones.
r8907 src_repo.hook('preoutgoing', throw=True, source='clone')
Steve Borho
on clone failure, only remove directories we created...
r7935 hgdir = os.path.realpath(os.path.join(dest, ".hg"))
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 if not os.path.exists(dest):
os.mkdir(dest)
Steve Borho
on clone failure, only remove directories we created...
r7935 else:
# only clean up directories we create ourselves
dir_cleanup.dir_ = hgdir
Matt Mackall
clone: fix race with same target directory (issue716)...
r5569 try:
Steve Borho
on clone failure, only remove directories we created...
r7935 dest_path = hgdir
Adrian Buehlmann
set NOT_CONTENT_INDEXED on .hg dir (issue2694)...
r13795 util.makedir(dest_path, notindexed=True)
Matt Mackall
clone: fix race with same target directory (issue716)...
r5569 except OSError, inst:
if inst.errno == errno.EEXIST:
dir_cleanup.close()
raise util.Abort(_("destination '%s' already exists")
% dest)
raise
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
Adrian Buehlmann
clone: save hardlink state of util.copyfiles()...
r11255 hardlink = None
Adrian Buehlmann
clone: print number of linked/copied files on --debug
r11251 num = 0
Matt Mackall
clone: get a list of files to clone from store
r6903 for f in src_repo.store.copylist():
Matt Mackall
share: fix interaction with clone
r9984 src = os.path.join(src_repo.sharedpath, f)
Benoit Boissinot
fix regression on empty repo cloning introduced by 0642d9d7ec80...
r6944 dst = os.path.join(dest_path, f)
dstbase = os.path.dirname(dst)
if dstbase and not os.path.exists(dstbase):
os.mkdir(dstbase)
Matt Mackall
clone: get a list of files to clone from store
r6903 if os.path.exists(src):
if dst.endswith('data'):
# lock to avoid premature writing to the target
dest_lock = lock.lock(os.path.join(dstbase, "lock"))
Adrian Buehlmann
clone: print number of linked/copied files on --debug
r11251 hardlink, n = util.copyfiles(src, dst, hardlink)
num += n
if hardlink:
ui.debug("linked %d files\n" % num)
else:
ui.debug("copied %d files\n" % num)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 # we need to re-init the repo after manually copying the data
# into it
dest_repo = repository(ui, dest)
Martin Geisler
clone, patch, convert: use hex(nullid) instead of '0'*40
r12144 src_repo.hook('outgoing', source='clone',
node=node.hex(node.nullid))
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 else:
Matt Mackall
clone: fix race with same target directory (issue716)...
r5569 try:
dest_repo = repository(ui, dest, create=True)
except OSError, inst:
if inst.errno == errno.EEXIST:
dir_cleanup.close()
raise util.Abort(_("destination '%s' already exists")
% dest)
raise
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 revs = None
if rev:
if 'lookup' not in src_repo.capabilities:
Martin Geisler
hg: better wrapping of string literal
r9171 raise util.Abort(_("src repository does not support "
"revision lookup and so doesn't "
"support clone by revision"))
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 revs = [src_repo.lookup(r) for r in rev]
Brett Carter
clone: try updating to the actual changeset specified in options...
r8417 checkout = revs[0]
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 if dest_repo.local():
dest_repo.clone(src_repo, heads=revs, stream=stream)
elif src_repo.local():
src_repo.push(dest_repo, revs=revs)
else:
raise util.Abort(_("clone from remote to remote not supported"))
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
Benoit Boissinot
merge with -stable
r5186 if dir_cleanup:
dir_cleanup.close()
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
if dest_repo.local():
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 fp = dest_repo.opener("hgrc", "w", text=True)
fp.write("[paths]\n")
Matt Mackall
clone: config escaping no longer needed
r8179 fp.write("default = %s\n" % abspath)
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 fp.close()
Benoit Boissinot
clone: do not delete the target if only the update fails
r5185
Matt Mackall
subrepo: add update/merge logic
r8814 dest_repo.ui.setconfig('paths', 'default', abspath)
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 if update:
Bryan O'Sullivan
repo: add rjoin method
r6526 if update is not True:
checkout = update
Adrian Buehlmann
clone: add option -u/--updaterev
r9714 if src_repo.local():
checkout = src_repo.lookup(update)
Dirkjan Ochtman
clone: honor -r even when pulling named branches
r7045 for test in (checkout, 'default', 'tip'):
Matt Mackall
Make distinct lookup error for localrepo.lookup...
r9423 if test is None:
continue
Alexis S. L. Carvalho
Merge with crew-stable
r5248 try:
Dirkjan Ochtman
clone: honor -r even when pulling named branches
r7045 uprev = dest_repo.lookup(test)
break
Matt Mackall
Make distinct lookup error for localrepo.lookup...
r9423 except error.RepoLookupError:
Dirkjan Ochtman
clone: honor -r even when pulling named branches
r7045 continue
Adrian Buehlmann
hg.clone: report branch name on update
r9611 bn = dest_repo[uprev].branch()
Matt Mackall
branch: operate on branch names in local string space where possible...
r13047 dest_repo.ui.status(_("updating to branch %s\n") % bn)
Dirkjan Ochtman
clone: honor -r even when pulling named branches
r7045 _update(dest_repo, uprev)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
David Soria Parra
hg: add support for cloning bookmarks
r13604 # clone all bookmarks
if dest_repo.local() and src_repo.capable("pushkey"):
rb = src_repo.listkeys('bookmarks')
for k, n in rb.iteritems():
try:
m = dest_repo.lookup(n)
dest_repo._bookmarks[k] = m
Idan Kamara
eliminate various naked except clauses
r14004 except error.RepoLookupError:
David Soria Parra
hg: add support for cloning bookmarks
r13604 pass
if rb:
bookmarks.write(dest_repo)
elif src_repo.local() and dest_repo.capable("pushkey"):
for k, n in src_repo._bookmarks.iteritems():
dest_repo.pushkey('bookmarks', k, '', hex(n))
Matt Mackall
Use try/finally pattern to cleanup locks and transactions
r4915 return src_repo, dest_repo
finally:
Ronny Pfannschmidt
switch lock releasing in the core from gc to explicit
r8109 release(src_lock, dest_lock)
Ronny Pfannschmidt
switch dircleanup in mercurial.hg.clone from gc based to explicit
r8110 if dir_cleanup is not None:
dir_cleanup.cleanup()
Matt Mackall
Move merge code to its own module...
r2775
Matt Mackall
merge: pull user messages out to hg.py...
r3316 def _showstats(repo, stats):
Martin Geisler
hg: avoid combining translated strings...
r9454 repo.ui.status(_("%d files updated, %d files merged, "
"%d files removed, %d files unresolved\n") % stats)
Matt Mackall
merge: pull user messages out to hg.py...
r3316
Matt Mackall
Introduce update helper functions: update, merge, clean, and revert
r2808 def update(repo, node):
"""update the working directory to node, merging linear changes"""
Benoit Boissinot
style: use consistent variable names (*mod) with imports which would shadow
r10651 stats = mergemod.update(repo, node, False, False, None)
Matt Mackall
merge: pull user messages out to hg.py...
r3316 _showstats(repo, stats)
if stats[3]:
Matt Mackall
resolve: new command...
r6518 repo.ui.status(_("use 'hg resolve' to retry unresolved file merges\n"))
Matt Mackall
merge: make return codes more sensible...
r5635 return stats[3] > 0
Matt Mackall
Move merge code to its own module...
r2775
Benoit Boissinot
add a comment about the need of hg._update()
r7546 # naming conflict in clone()
_update = update
Matt Mackall
Make repo locks recursive, eliminate all passing of lock/wlock
r4917 def clean(repo, node, show_stats=True):
Matt Mackall
Introduce update helper functions: update, merge, clean, and revert
r2808 """forcibly switch the working directory to node, clobbering changes"""
Benoit Boissinot
style: use consistent variable names (*mod) with imports which would shadow
r10651 stats = mergemod.update(repo, node, False, True, None)
Matt Mackall
many, many trivial check-code fixups
r10282 if show_stats:
_showstats(repo, stats)
Matt Mackall
merge: make return codes more sensible...
r5635 return stats[3] > 0
Matt Mackall
Move merge code to its own module...
r2775
Matt Mackall
Make repo locks recursive, eliminate all passing of lock/wlock
r4917 def merge(repo, node, force=None, remind=True):
Greg Ward
merge: document some internal return values.
r13162 """Branch merge with node, resolving changes. Return true if any
unresolved conflicts."""
Benoit Boissinot
style: use consistent variable names (*mod) with imports which would shadow
r10651 stats = mergemod.update(repo, node, True, force, False)
Matt Mackall
merge: pull user messages out to hg.py...
r3316 _showstats(repo, stats)
if stats[3]:
Augie Fackler
merge: better error messages to lead users to hg update --clean to abandon merges....
r7821 repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
Brodie Rao
merge: suggest 'hg up -C .' for discarding changes, not 'hg up -C'...
r12314 "or 'hg update -C .' to abandon\n"))
Matt Mackall
merge: pull user messages out to hg.py...
r3316 elif remind:
repo.ui.status(_("(branch merge, don't forget to commit)\n"))
Matt Mackall
merge: make return codes more sensible...
r5635 return stats[3] > 0
Matt Mackall
Introduce update helper functions: update, merge, clean, and revert
r2808
Nicolas Dumazet
incoming: unify code for incoming and graphlog.incoming
r12730 def _incoming(displaychlist, subreporecurse, ui, repo, source,
opts, buffered=False):
"""
Helper for incoming / gincoming.
displaychlist gets called with
(remoterepo, incomingchangesetlist, displayer) parameters,
and is supposed to contain only code that can't be unified.
"""
source, branches = parseurl(ui.expandpath(source), opts.get('branch'))
other = repository(remoteui(repo, opts), source)
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 ui.status(_('comparing with %s\n') % util.hidepassword(source))
Nicolas Dumazet
incoming: unify code for incoming and graphlog.incoming
r12730 revs, checkout = addbranchrevs(repo, other, branches, opts.get('rev'))
if revs:
revs = [other.lookup(rev) for rev in revs]
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 other, chlist, cleanupfn = bundlerepo.getremotechanges(ui, repo, other,
revs, opts["bundle"], opts["force"])
try:
if not chlist:
ui.status(_("no changes found\n"))
return subreporecurse()
Nicolas Dumazet
incoming: unify code for incoming and graphlog.incoming
r12730
displayer = cmdutil.show_changeset(ui, other, opts, buffered)
# XXX once graphlog extension makes it into core,
# should be replaced by a if graph/else
displaychlist(other, chlist, displayer)
displayer.close()
finally:
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 cleanupfn()
Nicolas Dumazet
incoming: unify code for incoming and graphlog.incoming
r12730 subreporecurse()
return 0 # exit code is zero since we found incoming changes
Martin Geisler
incoming: move code from commands to cmdutil...
r12273 def incoming(ui, repo, source, opts):
Nicolas Dumazet
incoming: unify code for incoming and graphlog.incoming
r12730 def subreporecurse():
Erik Zielke
incoming/outgoing: Fix recursion on sub repositories...
r12400 ret = 1
if opts.get('subrepos'):
ctx = repo[None]
for subpath in sorted(ctx.substate):
sub = ctx.sub(subpath)
ret = min(ret, sub.incoming(ui, source, opts))
return ret
Nicolas Dumazet
incoming: unify code for incoming and graphlog.incoming
r12730 def display(other, chlist, displayer):
limit = cmdutil.loglimit(opts)
Martin Geisler
incoming: move code from commands to cmdutil...
r12273 if opts.get('newest_first'):
Nicolas Dumazet
incoming: rename variable...
r12729 chlist.reverse()
Martin Geisler
incoming: move code from commands to cmdutil...
r12273 count = 0
Nicolas Dumazet
incoming: rename variable...
r12729 for n in chlist:
Martin Geisler
incoming: move code from commands to cmdutil...
r12273 if limit is not None and count >= limit:
break
parents = [p for p in other.changelog.parents(n) if p != nullid]
if opts.get('no_merges') and len(parents) == 2:
continue
count += 1
displayer.show(other[n])
Nicolas Dumazet
incoming: unify code for incoming and graphlog.incoming
r12730 return _incoming(display, subreporecurse, ui, repo, source, opts)
Martin Geisler
incoming: move code from commands to cmdutil...
r12273
Nicolas Dumazet
outgoing: unify common graphlog.outgoing and hg.outgoing code
r12735 def _outgoing(ui, repo, dest, opts):
dest = ui.expandpath(dest or 'default-push', dest or 'default')
dest, branches = parseurl(dest, opts.get('branch'))
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 ui.status(_('comparing with %s\n') % util.hidepassword(dest))
Nicolas Dumazet
outgoing: unify common graphlog.outgoing and hg.outgoing code
r12735 revs, checkout = addbranchrevs(repo, repo, branches, opts.get('rev'))
if revs:
revs = [repo.lookup(rev) for rev in revs]
other = repository(remoteui(repo, opts), dest)
Peter Arrenbrecht
discovery: resurrect findoutgoing as findcommonoutgoing for extension hooks...
r14213 common, outheads = discovery.findcommonoutgoing(repo, other, revs,
force=opts.get('force'))
o = repo.changelog.findmissing(common, outheads)
Nicolas Dumazet
outgoing: unify common graphlog.outgoing and hg.outgoing code
r12735 if not o:
ui.status(_("no changes found\n"))
return None
Peter Arrenbrecht
discovery: drop findoutgoing and simplify findcommonincoming's api...
r14073 return o
Nicolas Dumazet
outgoing: unify common graphlog.outgoing and hg.outgoing code
r12735
Martin Geisler
outgoing: move code from commands to cmdutil...
r12271 def outgoing(ui, repo, dest, opts):
Erik Zielke
incoming/outgoing: Fix recursion on sub repositories...
r12400 def recurse():
ret = 1
if opts.get('subrepos'):
ctx = repo[None]
for subpath in sorted(ctx.substate):
sub = ctx.sub(subpath)
ret = min(ret, sub.outgoing(ui, dest, opts))
return ret
Martin Geisler
outgoing: move code from commands to cmdutil...
r12271 limit = cmdutil.loglimit(opts)
Nicolas Dumazet
outgoing: unify common graphlog.outgoing and hg.outgoing code
r12735 o = _outgoing(ui, repo, dest, opts)
if o is None:
Erik Zielke
incoming/outgoing: Fix recursion on sub repositories...
r12400 return recurse()
Martin Geisler
outgoing: move code from commands to cmdutil...
r12271 if opts.get('newest_first'):
o.reverse()
displayer = cmdutil.show_changeset(ui, repo, opts)
count = 0
for n in o:
if limit is not None and count >= limit:
break
parents = [p for p in repo.changelog.parents(n) if p != nullid]
if opts.get('no_merges') and len(parents) == 2:
continue
count += 1
displayer.show(repo[n])
displayer.close()
Erik Zielke
incoming/outgoing: Fix recursion on sub repositories...
r12400 recurse()
return 0 # exit code is zero since we found outgoing changes
Martin Geisler
outgoing: move code from commands to cmdutil...
r12271
Matt Mackall
Make repo locks recursive, eliminate all passing of lock/wlock
r4917 def revert(repo, node, choose):
Matt Mackall
Introduce update helper functions: update, merge, clean, and revert
r2808 """revert changes to revision in node without updating dirstate"""
Benoit Boissinot
style: use consistent variable names (*mod) with imports which would shadow
r10651 return mergemod.update(repo, node, False, True, choose)[3] > 0
Matt Mackall
Move repo.verify
r2778
def verify(repo):
"""verify the consistency of a repository"""
Benoit Boissinot
style: use consistent variable names (*mod) with imports which would shadow
r10651 return verifymod.verify(repo)
Matt Mackall
remoteui: move from cmdutil to hg
r11273
def remoteui(src, opts):
'build a remote ui from ui or repo and opts'
if hasattr(src, 'baseui'): # looks like a repository
dst = src.baseui.copy() # drop repo-specific config
src = src.ui # copy target options from repo
else: # assume it's a global ui object
dst = src.copy() # keep all global options
# copy ssh-specific options
for o in 'ssh', 'remotecmd':
v = opts.get(o) or src.config('ui', o)
if v:
dst.setconfig("ui", o, v)
# copy bundle-specific options
r = src.config('bundle', 'mainreporoot')
if r:
dst.setconfig('bundle', 'mainreporoot', r)
Mads Kiilerich
https: use web.cacerts configuration from local repo to validate remote repo
r13192 # copy selected local settings to the remote ui
Mads Kiilerich
url: 'ssh known host'-like checking of fingerprints of HTTPS certificates...
r13314 for sect in ('auth', 'hostfingerprints', 'http_proxy'):
Matt Mackall
remoteui: move from cmdutil to hg
r11273 for key, val in src.configitems(sect):
dst.setconfig(sect, key, val)
Mads Kiilerich
https: use web.cacerts configuration from local repo to validate remote repo
r13192 v = src.config('web', 'cacerts')
if v:
Eduard-Cristian Stefan
url: expand path for web.cacerts
r13231 dst.setconfig('web', 'cacerts', util.expandpath(v))
Matt Mackall
remoteui: move from cmdutil to hg
r11273
return dst