mercurial/commands.py
changeset 2597 5ba8be56fa8f
parent 2590 911b56853fdd
child 2598 b898afee9d0d
equal deleted inserted replaced
2596:e3258cc3ed63 2597:5ba8be56fa8f
   954 
   954 
   955     It is possible to specify an ssh:// URL as the destination, but no
   955     It is possible to specify an ssh:// URL as the destination, but no
   956     .hg/hgrc will be created on the remote side. Look at the help text
   956     .hg/hgrc will be created on the remote side. Look at the help text
   957     for the pull command for important details about ssh:// URLs.
   957     for the pull command for important details about ssh:// URLs.
   958     """
   958     """
   959     if dest is None:
       
   960         dest = os.path.basename(os.path.normpath(source))
       
   961 
       
   962     if os.path.exists(dest):
       
   963         raise util.Abort(_("destination '%s' already exists"), dest)
       
   964 
       
   965     class Dircleanup(object):
       
   966         def __init__(self, dir_):
       
   967             self.rmtree = shutil.rmtree
       
   968             self.dir_ = dir_
       
   969         def close(self):
       
   970             self.dir_ = None
       
   971         def __del__(self):
       
   972             if self.dir_:
       
   973                 self.rmtree(self.dir_, True)
       
   974 
       
   975     if opts['ssh']:
   959     if opts['ssh']:
   976         ui.setconfig("ui", "ssh", opts['ssh'])
   960         ui.setconfig("ui", "ssh", opts['ssh'])
   977     if opts['remotecmd']:
   961     if opts['remotecmd']:
   978         ui.setconfig("ui", "remotecmd", opts['remotecmd'])
   962         ui.setconfig("ui", "remotecmd", opts['remotecmd'])
   979 
   963 
   980     source = ui.expandpath(source)
   964     hg.clone(ui, ui.expandpath(source), dest,
   981     src_repo = hg.repository(ui, source)
   965              pull=opts['pull'],
   982 
   966              rev=opts['rev'],
   983     dest_repo = None
   967              update=not opts['noupdate'])
   984     try:
       
   985         dest_repo = hg.repository(ui, dest)
       
   986         raise util.Abort(_("destination '%s' already exists." % dest))
       
   987     except hg.RepoError:
       
   988         dest_repo = hg.repository(ui, dest, create=1)
       
   989 
       
   990     dest_path = None
       
   991     d = None
       
   992     if dest_repo.local():
       
   993         dest_path = os.path.realpath(dest)
       
   994         d = Dircleanup(dest_path)
       
   995 
       
   996     abspath = source
       
   997     copy = False
       
   998     if src_repo.local() and dest_repo.local():
       
   999         abspath = os.path.abspath(source)
       
  1000         if not opts['pull'] and not opts['rev']:
       
  1001             copy = True
       
  1002 
       
  1003     if copy:
       
  1004         try:
       
  1005             # we use a lock here because if we race with commit, we
       
  1006             # can end up with extra data in the cloned revlogs that's
       
  1007             # not pointed to by changesets, thus causing verify to
       
  1008             # fail
       
  1009             l1 = src_repo.lock()
       
  1010         except lock.LockException:
       
  1011             copy = False
       
  1012 
       
  1013     if copy:
       
  1014         # we lock here to avoid premature writing to the target
       
  1015         l2 = lock.lock(os.path.join(dest_path, ".hg", "lock"))
       
  1016 
       
  1017 	# we need to remove the (empty) data dir in dest so copyfiles can do it's work
       
  1018 	os.rmdir( os.path.join(dest_path, ".hg", "data") )
       
  1019         files = "data 00manifest.d 00manifest.i 00changelog.d 00changelog.i"
       
  1020         for f in files.split():
       
  1021             src = os.path.join(source, ".hg", f)
       
  1022             dst = os.path.join(dest_path, ".hg", f)
       
  1023             try:
       
  1024                 util.copyfiles(src, dst)
       
  1025             except OSError, inst:
       
  1026                 if inst.errno != errno.ENOENT:
       
  1027                     raise
       
  1028 
       
  1029 	# we need to re-init the repo after manually copying the data into it
       
  1030         dest_repo = hg.repository(ui, dest)
       
  1031 
       
  1032     else:
       
  1033         revs = None
       
  1034         if opts['rev']:
       
  1035             if not src_repo.local():
       
  1036                 error = _("clone -r not supported yet for remote repositories.")
       
  1037                 raise util.Abort(error)
       
  1038             else:
       
  1039                 revs = [src_repo.lookup(rev) for rev in opts['rev']]
       
  1040 
       
  1041         if dest_repo.local():
       
  1042             dest_repo.pull(src_repo, heads = revs)
       
  1043         elif src_repo.local():
       
  1044             src_repo.push(dest_repo, revs = revs)
       
  1045         else:
       
  1046             error = _("clone from remote to remote not supported.")
       
  1047             raise util.Abort(error)
       
  1048 
       
  1049     if dest_repo.local():
       
  1050         f = dest_repo.opener("hgrc", "w", text=True)
       
  1051         f.write("[paths]\n")
       
  1052         f.write("default = %s\n" % abspath)
       
  1053         f.close()
       
  1054 
       
  1055         if not opts['noupdate']:
       
  1056             doupdate(dest_repo.ui, dest_repo)
       
  1057 
       
  1058     if d:
       
  1059         d.close()
       
  1060 
   968 
  1061 def commit(ui, repo, *pats, **opts):
   969 def commit(ui, repo, *pats, **opts):
  1062     """commit the specified files or all outstanding changes
   970     """commit the specified files or all outstanding changes
  1063 
   971 
  1064     Commit changes to the given files into the repository.
   972     Commit changes to the given files into the repository.