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. |