# HG changeset patch # User Vadim Gelfer # Date 1151947149 25200 # Node ID 764a54eb8c5a155dc735bf9013b363c30fcf0a6f # Parent 45235e492cc674812ea1e768174d3ea04e3bc3a3# Parent 0229ff95faec752bd19e2dbcc5ca4373ecf0458d merge with crew. diff --git a/contrib/win32/mercurial.ini b/contrib/win32/mercurial.ini --- a/contrib/win32/mercurial.ini +++ b/contrib/win32/mercurial.ini @@ -18,7 +18,8 @@ hgext.win32text = [encode] ; Encode files that don't contain NUL characters. -** = cleverencode: + +; ** = cleverencode: ; Alternatively, you can explicitly specify each file extension that ; you want encoded (any you omit will be left untouched), like this: @@ -28,7 +29,8 @@ hgext.win32text = [decode] ; Decode files that don't contain NUL characters. -** = cleverdecode: + +; ** = cleverdecode: ; Alternatively, you can explicitly specify each file extension that ; you want decoded (any you omit will be left untouched), like this: diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -919,13 +919,10 @@ def clone(ui, source, dest=None, **opts) if os.path.exists(dest): raise util.Abort(_("destination '%s' already exists"), dest) - dest = os.path.realpath(dest) - class Dircleanup(object): def __init__(self, dir_): self.rmtree = shutil.rmtree self.dir_ = dir_ - os.mkdir(dir_) def close(self): self.dir_ = None def __del__(self): @@ -938,13 +935,24 @@ def clone(ui, source, dest=None, **opts) ui.setconfig("ui", "remotecmd", opts['remotecmd']) source = ui.expandpath(source) - - d = Dircleanup(dest) + src_repo = hg.repository(ui, source) + + dest_repo = None + try: + dest_repo = hg.repository(ui, dest) + raise util.Abort(_("destination '%s' already exists." % dest)) + except hg.RepoError: + dest_repo = hg.repository(ui, dest, create=1) + + dest_path = None + d = None + if dest_repo.local(): + dest_path = os.path.realpath(dest) + d = Dircleanup(dest_path) + abspath = source - other = hg.repository(ui, source) - copy = False - if other.dev() != -1: + if src_repo.local() and dest_repo.local(): abspath = os.path.abspath(source) if not opts['pull'] and not opts['rev']: copy = True @@ -955,47 +963,57 @@ def clone(ui, source, dest=None, **opts) # can end up with extra data in the cloned revlogs that's # not pointed to by changesets, thus causing verify to # fail - l1 = other.lock() + l1 = src_repo.lock() except lock.LockException: copy = False if copy: # we lock here to avoid premature writing to the target - os.mkdir(os.path.join(dest, ".hg")) - l2 = lock.lock(os.path.join(dest, ".hg", "lock")) - + l2 = lock.lock(os.path.join(dest_path, ".hg", "lock")) + + # we need to remove the (empty) data dir in dest so copyfiles can do it's work + os.rmdir( os.path.join(dest_path, ".hg", "data") ) files = "data 00manifest.d 00manifest.i 00changelog.d 00changelog.i" for f in files.split(): src = os.path.join(source, ".hg", f) - dst = os.path.join(dest, ".hg", f) + dst = os.path.join(dest_path, ".hg", f) try: util.copyfiles(src, dst) except OSError, inst: if inst.errno != errno.ENOENT: raise - repo = hg.repository(ui, dest) + # we need to re-init the repo after manually copying the data into it + dest_repo = hg.repository(ui, dest) else: revs = None if opts['rev']: - if not other.local(): + if not src_repo.local(): error = _("clone -r not supported yet for remote repositories.") raise util.Abort(error) else: - revs = [other.lookup(rev) for rev in opts['rev']] - repo = hg.repository(ui, dest, create=1) - repo.pull(other, heads = revs) - - f = repo.opener("hgrc", "w", text=True) - f.write("[paths]\n") - f.write("default = %s\n" % abspath) - f.close() - - if not opts['noupdate']: - doupdate(repo.ui, repo) - - d.close() + revs = [src_repo.lookup(rev) for rev in opts['rev']] + + if dest_repo.local(): + dest_repo.pull(src_repo, heads = revs) + elif src_repo.local(): + src_repo.push(dest_repo, revs = revs) + else: + error = _("clone from remote to remote not supported.") + raise util.Abort(error) + + if dest_repo.local(): + f = dest_repo.opener("hgrc", "w", text=True) + f.write("[paths]\n") + f.write("default = %s\n" % abspath) + f.close() + + if not opts['noupdate']: + doupdate(dest_repo.ui, dest_repo) + + if d: + d.close() def commit(ui, repo, *pats, **opts): """commit the specified files or all outstanding changes @@ -1905,8 +1923,6 @@ def init(ui, dest="."): If no directory is given, the current directory is used. """ - if not os.path.exists(dest): - os.mkdir(dest) hg.repository(ui, dest, create=1) def locate(ui, repo, *pats, **opts): diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -33,6 +33,9 @@ def local_(ui, path, create=0): path = path[5:] return localrepo.localrepository(ui, path, create) +def ssh_(ui, path, create=0): + return sshrepo.sshrepository(ui, path, create) + def old_http(ui, path): ui.warn(_("old-http:// syntax is deprecated, " "please use static-http:// instead\n")) @@ -50,7 +53,7 @@ schemes = { 'http': lambda ui, path: httprepo.httprepository(ui, path), 'https': lambda ui, path: httprepo.httpsrepository(ui, path), 'old-http': old_http, - 'ssh': lambda ui, path: sshrepo.sshrepository(ui, path), + 'ssh': ssh_, 'static-http': static_http, } diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -74,6 +74,8 @@ class localrepository(object): self.transhandle = None if create: + if not os.path.exists(path): + os.mkdir(path) os.mkdir(self.path) os.mkdir(self.join("data")) diff --git a/mercurial/sshrepo.py b/mercurial/sshrepo.py --- a/mercurial/sshrepo.py +++ b/mercurial/sshrepo.py @@ -12,7 +12,7 @@ from demandload import * demandload(globals(), "hg os re stat util") class sshrepository(remoterepository): - def __init__(self, ui, path): + def __init__(self, ui, path, create=0): self.url = path self.ui = ui @@ -30,6 +30,25 @@ class sshrepository(remoterepository): sshcmd = self.ui.config("ui", "ssh", "ssh") remotecmd = self.ui.config("ui", "remotecmd", "hg") + + if create: + try: + self.validate_repo(ui, sshcmd, args, remotecmd) + return # the repo is good, nothing more to do + except hg.RepoError: + pass + + cmd = '%s %s "%s init %s"' + cmd = cmd % (sshcmd, args, remotecmd, self.path) + + ui.note('running %s\n' % cmd) + res = os.system(cmd) + if res != 0: + raise hg.RepoError(_("could not create remote repo")) + + self.validate_repo(ui, sshcmd, args, remotecmd) + + def validate_repo(self, ui, sshcmd, args, remotecmd): cmd = '%s %s "%s -R %s serve --stdio"' cmd = cmd % (sshcmd, args, remotecmd, self.path)