##// END OF EJS Templates
Fix revlog.children so the real children of the null revision can be calculated.
Fix revlog.children so the real children of the null revision can be calculated.

File last commit:

r4635:63b9d2de default
r4746:62c56d8f default
Show More
hg.py
289 lines | 9.0 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 #
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
mpm@selenic.com
Break apart hg.py...
r1089 from node import *
from repo import *
Matt Mackall
Simplify i18n imports
r3891 from i18n import _
Matt Mackall
Replace demandload with new demandimport
r3877 import localrepo, bundlerepo, httprepo, sshrepo, statichttprepo
Matt Mackall
Add support for url#id syntax...
r4478 import errno, lock, os, shutil, util, cmdutil
Matt Mackall
Replace demandload with new demandimport
r3877 import merge as _merge
import verify as _verify
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):
Brendan Cully
Make hg.repository work with no path argument
r3195 return (os.path.isfile(util.drop_scheme('file', path)) and
Vadim Gelfer
allow None for path of hg.repository
r2768 bundlerepo or localrepo)
Vadim Gelfer
hg.repository: make protocol table driven....
r2469
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,
'hg': httprepo,
'http': httprepo,
'https': httprepo,
'old-http': statichttprepo,
'ssh': sshrepo,
'static-http': statichttprepo,
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):
scheme = 'file'
if path:
c = path.find(':')
if c > 0:
scheme = path[:c]
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()
Vadim Gelfer
call reposetup functions of extension modules whenever repo created
r2847 repo_setup_hooks = []
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)
Vadim Gelfer
call reposetup functions of extension modules whenever repo created
r2847 for hook in repo_setup_hooks:
hook(ui, repo)
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
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,
stream=False):
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
destination is local repository
"""
Matt Mackall
Add support for url#id syntax...
r4478
origsource = source
source, rev = cmdutil.parseurl(ui.expandpath(source), rev)
Vadim Gelfer
hg.py: add islocal() and defaultdest() functions, refactor...
r2719 if isinstance(source, str):
src_repo = repository(ui, source)
else:
src_repo = source
source = src_repo.url()
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)
Vadim Gelfer
hg.py: add islocal() and defaultdest() functions, refactor...
r2719
def localpath(path):
if path.startswith('file://'):
return path[7:]
if path.startswith('file:'):
return path[5:]
return path
dest = localpath(dest)
source = localpath(source)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
if os.path.exists(dest):
Thomas Arendsen Hein
Never apply string formatting to generated errors with util.Abort....
r3072 raise util.Abort(_("destination '%s' already exists") % 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
def __del__(self):
if self.dir_:
self.rmtree(self.dir_, True)
dir_cleanup = None
Benoit Boissinot
don't use localrepo.__init__ to create the dest repo with clone+hardlinks
r3849 if islocal(dest):
dir_cleanup = DirCleanup(dest)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
Matt Mackall
Add support for url#id syntax...
r4478 abspath = origsource
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 copy = False
Benoit Boissinot
don't use localrepo.__init__ to create the dest repo with clone+hardlinks
r3849 if src_repo.local() and islocal(dest):
Matt Mackall
Add support for url#id syntax...
r4478 abspath = os.path.abspath(origsource)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 copy = not pull and not rev
src_lock, dest_lock = None, None
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
src_lock = src_repo.lock()
except lock.LockException:
copy = False
if copy:
Benoit Boissinot
add "requires" file to the repo, specifying the requirements
r3851 def force_copy(src, dst):
try:
util.copyfiles(src, dst)
except OSError, inst:
if inst.errno != errno.ENOENT:
raise
Benoit Boissinot
introduce localrepo.spath for the store path, sopener fixes
r3791 src_store = os.path.realpath(src_repo.spath)
Benoit Boissinot
don't use localrepo.__init__ to create the dest repo with clone+hardlinks
r3849 if not os.path.exists(dest):
os.mkdir(dest)
Benoit Boissinot
switch to the .hg/store layout, fix the tests
r3853 dest_path = os.path.realpath(os.path.join(dest, ".hg"))
Benoit Boissinot
don't use localrepo.__init__ to create the dest repo with clone+hardlinks
r3849 os.mkdir(dest_path)
Benoit Boissinot
switch to the .hg/store layout, fix the tests
r3853 if src_repo.spath != src_repo.path:
dest_store = os.path.join(dest_path, "store")
os.mkdir(dest_store)
else:
dest_store = dest_path
Benoit Boissinot
add "requires" file to the repo, specifying the requirements
r3851 # copy the requires file
force_copy(src_repo.join("requires"),
os.path.join(dest_path, "requires"))
# we lock here to avoid premature writing to the target
Benoit Boissinot
introduce localrepo.spath for the store path, sopener fixes
r3791 dest_lock = lock.lock(os.path.join(dest_store, "lock"))
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
Benoit Boissinot
don't create the .hg/data at init time
r3713 files = ("data",
"00manifest.d", "00manifest.i",
"00changelog.d", "00changelog.i")
for f in files:
Benoit Boissinot
introduce localrepo.spath for the store path, sopener fixes
r3791 src = os.path.join(src_store, f)
dst = os.path.join(dest_store, f)
Benoit Boissinot
add "requires" file to the repo, specifying the requirements
r3851 force_copy(src, dst)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597
Benoit Boissinot
codingstyle: use spaces instead of tabs
r2631 # we need to re-init the repo after manually copying the data
# into it
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 dest_repo = repository(ui, dest)
else:
Benoit Boissinot
don't use localrepo.__init__ to create the dest repo with clone+hardlinks
r3849 dest_repo = repository(ui, dest, create=True)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 revs = None
if rev:
Eric Hopper
Stop erroring out pull -r and clone -r if repository isn't local.
r3448 if 'lookup' not in src_repo.capabilities:
raise util.Abort(_("src repository does not support revision "
"lookup and so doesn't support clone by "
"revision"))
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 revs = [src_repo.lookup(r) for r in rev]
if dest_repo.local():
Vadim Gelfer
clone: do not make streaming default. add --stream option instead.
r2613 dest_repo.clone(src_repo, heads=revs, stream=stream)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 elif src_repo.local():
src_repo.push(dest_repo, revs=revs)
else:
raise util.Abort(_("clone from remote to remote not supported"))
if src_lock:
src_lock.release()
if dest_repo.local():
fp = dest_repo.opener("hgrc", "w", text=True)
fp.write("[paths]\n")
fp.write("default = %s\n" % abspath)
fp.close()
if dest_lock:
dest_lock.release()
if update:
Matt Mackall
clone: checkout the "default" branch if available
r4477 try:
checkout = dest_repo.lookup("default")
except:
checkout = dest_repo.changelog.tip()
_update(dest_repo, checkout)
Vadim Gelfer
clone: move code into hg module. make doc better....
r2597 if dir_cleanup:
dir_cleanup.close()
return src_repo, dest_repo
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):
stats = ((stats[0], _("updated")),
(stats[1], _("merged")),
(stats[2], _("removed")),
(stats[3], _("unresolved")))
note = ", ".join([_("%d files %s") % s for s in stats])
repo.ui.status("%s\n" % note)
def _update(repo, node): return update(repo, node)
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"""
Thomas Arendsen Hein
Add instructions how to redo/finish failed merge with local working directory....
r3869 pl = repo.parents()
Matt Mackall
merge: pull user messages out to hg.py...
r3316 stats = _merge.update(repo, node, False, False, None, None)
_showstats(repo, stats)
if stats[3]:
repo.ui.status(_("There are unresolved merges with"
" locally modified files.\n"))
Thomas Arendsen Hein
Add instructions how to redo/finish failed merge with local working directory....
r3869 if stats[1]:
repo.ui.status(_("You can finish the partial merge using:\n"))
else:
repo.ui.status(_("You can redo the full merge using:\n"))
# len(pl)==1, otherwise _merge.update() would have raised util.Abort:
repo.ui.status(_(" hg update %s\n hg update %s\n")
% (pl[0].rev(), repo.changectx(node).rev()))
Matt Mackall
merge: pull user messages out to hg.py...
r3316 return stats[3]
Matt Mackall
Move merge code to its own module...
r2775
Matt Mackall
Introduce update helper functions: update, merge, clean, and revert
r2808 def clean(repo, node, wlock=None, show_stats=True):
"""forcibly switch the working directory to node, clobbering changes"""
Matt Mackall
merge: pull user messages out to hg.py...
r3316 stats = _merge.update(repo, node, False, True, None, wlock)
if show_stats: _showstats(repo, stats)
return stats[3]
Matt Mackall
Move merge code to its own module...
r2775
Matt Mackall
Introduce update helper functions: update, merge, clean, and revert
r2808 def merge(repo, node, force=None, remind=True, wlock=None):
"""branch merge with node, resolving changes"""
Matt Mackall
merge: pull user messages out to hg.py...
r3316 stats = _merge.update(repo, node, True, force, False, wlock)
_showstats(repo, stats)
if stats[3]:
pl = repo.parents()
repo.ui.status(_("There are unresolved merges,"
" you can redo the full merge using:\n"
" hg update -C %s\n"
Marcos Chaves
fix warnings generated by pygettext.py.
r3679 " hg merge %s\n")
Thomas Arendsen Hein
Indentation cleanups for 2956948b81f3.
r3680 % (pl[0].rev(), pl[1].rev()))
Matt Mackall
merge: pull user messages out to hg.py...
r3316 elif remind:
repo.ui.status(_("(branch merge, don't forget to commit)\n"))
return stats[3]
Matt Mackall
Introduce update helper functions: update, merge, clean, and revert
r2808
Matt Mackall
Refactor update locking slightly
r2812 def revert(repo, node, choose, wlock):
Matt Mackall
Introduce update helper functions: update, merge, clean, and revert
r2808 """revert changes to revision in node without updating dirstate"""
Matt Mackall
merge: pull user messages out to hg.py...
r3316 return _merge.update(repo, node, False, True, choose, wlock)[3]
Matt Mackall
Move repo.verify
r2778
def verify(repo):
"""verify the consistency of a repository"""
return _verify.verify(repo)