Show More
@@ -919,13 +919,10 b' def clone(ui, source, dest=None, **opts)' | |||
|
919 | 919 | if os.path.exists(dest): |
|
920 | 920 | raise util.Abort(_("destination '%s' already exists"), dest) |
|
921 | 921 | |
|
922 | dest = os.path.realpath(dest) | |
|
923 | ||
|
924 | 922 | class Dircleanup(object): |
|
925 | 923 | def __init__(self, dir_): |
|
926 | 924 | self.rmtree = shutil.rmtree |
|
927 | 925 | self.dir_ = dir_ |
|
928 | os.mkdir(dir_) | |
|
929 | 926 | def close(self): |
|
930 | 927 | self.dir_ = None |
|
931 | 928 | def __del__(self): |
@@ -938,13 +935,24 b' def clone(ui, source, dest=None, **opts)' | |||
|
938 | 935 | ui.setconfig("ui", "remotecmd", opts['remotecmd']) |
|
939 | 936 | |
|
940 | 937 | source = ui.expandpath(source) |
|
941 | ||
|
942 | d = Dircleanup(dest) | |
|
938 | src_repo = hg.repository(ui, source) | |
|
939 | ||
|
940 | dest_repo = None | |
|
941 | try: | |
|
942 | dest_repo = hg.repository(ui, dest) | |
|
943 | raise util.Abort(_("destination '%s' already exists." % dest)) | |
|
944 | except hg.RepoError: | |
|
945 | dest_repo = hg.repository(ui, dest, create=1) | |
|
946 | ||
|
947 | dest_path = None | |
|
948 | d = None | |
|
949 | if dest_repo.local(): | |
|
950 | dest_path = os.path.realpath(dest) | |
|
951 | d = Dircleanup(dest_path) | |
|
952 | ||
|
943 | 953 | abspath = source |
|
944 | other = hg.repository(ui, source) | |
|
945 | ||
|
946 | 954 | copy = False |
|
947 | if other.dev() != -1: | |
|
955 | if src_repo.local() and dest_repo.local(): | |
|
948 | 956 | abspath = os.path.abspath(source) |
|
949 | 957 | if not opts['pull'] and not opts['rev']: |
|
950 | 958 | copy = True |
@@ -955,47 +963,57 b' def clone(ui, source, dest=None, **opts)' | |||
|
955 | 963 | # can end up with extra data in the cloned revlogs that's |
|
956 | 964 | # not pointed to by changesets, thus causing verify to |
|
957 | 965 | # fail |
|
958 |
l1 = o |
|
|
966 | l1 = src_repo.lock() | |
|
959 | 967 | except lock.LockException: |
|
960 | 968 | copy = False |
|
961 | 969 | |
|
962 | 970 | if copy: |
|
963 | 971 | # we lock here to avoid premature writing to the target |
|
964 |
|
|
|
965 | l2 = lock.lock(os.path.join(dest, ".hg", "lock")) | |
|
966 | ||
|
972 | l2 = lock.lock(os.path.join(dest_path, ".hg", "lock")) | |
|
973 | ||
|
974 | # we need to remove the (empty) data dir in dest so copyfiles can do it's work | |
|
975 | os.rmdir( os.path.join(dest_path, ".hg", "data") ) | |
|
967 | 976 | files = "data 00manifest.d 00manifest.i 00changelog.d 00changelog.i" |
|
968 | 977 | for f in files.split(): |
|
969 | 978 | src = os.path.join(source, ".hg", f) |
|
970 | dst = os.path.join(dest, ".hg", f) | |
|
979 | dst = os.path.join(dest_path, ".hg", f) | |
|
971 | 980 | try: |
|
972 | 981 | util.copyfiles(src, dst) |
|
973 | 982 | except OSError, inst: |
|
974 | 983 | if inst.errno != errno.ENOENT: |
|
975 | 984 | raise |
|
976 | 985 | |
|
977 | repo = hg.repository(ui, dest) | |
|
986 | # we need to re-init the repo after manually copying the data into it | |
|
987 | dest_repo = hg.repository(ui, dest) | |
|
978 | 988 | |
|
979 | 989 | else: |
|
980 | 990 | revs = None |
|
981 | 991 | if opts['rev']: |
|
982 |
if not o |
|
|
992 | if not src_repo.local(): | |
|
983 | 993 | error = _("clone -r not supported yet for remote repositories.") |
|
984 | 994 | raise util.Abort(error) |
|
985 | 995 | else: |
|
986 |
revs = [o |
|
|
987 | repo = hg.repository(ui, dest, create=1) | |
|
988 | repo.pull(other, heads = revs) | |
|
989 | ||
|
990 | f = repo.opener("hgrc", "w", text=True) | |
|
991 | f.write("[paths]\n") | |
|
992 | f.write("default = %s\n" % abspath) | |
|
993 | f.close() | |
|
994 | ||
|
995 | if not opts['noupdate']: | |
|
996 | doupdate(repo.ui, repo) | |
|
997 | ||
|
998 | d.close() | |
|
996 | revs = [src_repo.lookup(rev) for rev in opts['rev']] | |
|
997 | ||
|
998 | if dest_repo.local(): | |
|
999 | dest_repo.pull(src_repo, heads = revs) | |
|
1000 | elif src_repo.local(): | |
|
1001 | src_repo.push(dest_repo, revs = revs) | |
|
1002 | else: | |
|
1003 | error = _("clone from remote to remote not supported.") | |
|
1004 | raise util.Abort(error) | |
|
1005 | ||
|
1006 | if dest_repo.local(): | |
|
1007 | f = dest_repo.opener("hgrc", "w", text=True) | |
|
1008 | f.write("[paths]\n") | |
|
1009 | f.write("default = %s\n" % abspath) | |
|
1010 | f.close() | |
|
1011 | ||
|
1012 | if not opts['noupdate']: | |
|
1013 | doupdate(dest_repo.ui, dest_repo) | |
|
1014 | ||
|
1015 | if d: | |
|
1016 | d.close() | |
|
999 | 1017 | |
|
1000 | 1018 | def commit(ui, repo, *pats, **opts): |
|
1001 | 1019 | """commit the specified files or all outstanding changes |
@@ -1905,8 +1923,6 b' def init(ui, dest="."):' | |||
|
1905 | 1923 | |
|
1906 | 1924 | If no directory is given, the current directory is used. |
|
1907 | 1925 | """ |
|
1908 | if not os.path.exists(dest): | |
|
1909 | os.mkdir(dest) | |
|
1910 | 1926 | hg.repository(ui, dest, create=1) |
|
1911 | 1927 | |
|
1912 | 1928 | def locate(ui, repo, *pats, **opts): |
@@ -33,6 +33,9 b' def local_(ui, path, create=0):' | |||
|
33 | 33 | path = path[5:] |
|
34 | 34 | return localrepo.localrepository(ui, path, create) |
|
35 | 35 | |
|
36 | def ssh_(ui, path, create=0): | |
|
37 | return sshrepo.sshrepository(ui, path, create) | |
|
38 | ||
|
36 | 39 | def old_http(ui, path): |
|
37 | 40 | ui.warn(_("old-http:// syntax is deprecated, " |
|
38 | 41 | "please use static-http:// instead\n")) |
@@ -50,7 +53,7 b' schemes = {' | |||
|
50 | 53 | 'http': lambda ui, path: httprepo.httprepository(ui, path), |
|
51 | 54 | 'https': lambda ui, path: httprepo.httpsrepository(ui, path), |
|
52 | 55 | 'old-http': old_http, |
|
53 | 'ssh': lambda ui, path: sshrepo.sshrepository(ui, path), | |
|
56 | 'ssh': ssh_, | |
|
54 | 57 | 'static-http': static_http, |
|
55 | 58 | } |
|
56 | 59 |
@@ -74,6 +74,8 b' class localrepository(object):' | |||
|
74 | 74 | self.transhandle = None |
|
75 | 75 | |
|
76 | 76 | if create: |
|
77 | if not os.path.exists(path): | |
|
78 | os.mkdir(path) | |
|
77 | 79 | os.mkdir(self.path) |
|
78 | 80 | os.mkdir(self.join("data")) |
|
79 | 81 |
@@ -12,7 +12,7 b' from demandload import *' | |||
|
12 | 12 | demandload(globals(), "hg os re stat util") |
|
13 | 13 | |
|
14 | 14 | class sshrepository(remoterepository): |
|
15 | def __init__(self, ui, path): | |
|
15 | def __init__(self, ui, path, create=0): | |
|
16 | 16 | self.url = path |
|
17 | 17 | self.ui = ui |
|
18 | 18 | |
@@ -30,6 +30,25 b' class sshrepository(remoterepository):' | |||
|
30 | 30 | |
|
31 | 31 | sshcmd = self.ui.config("ui", "ssh", "ssh") |
|
32 | 32 | remotecmd = self.ui.config("ui", "remotecmd", "hg") |
|
33 | ||
|
34 | if create: | |
|
35 | try: | |
|
36 | self.validate_repo(ui, sshcmd, args, remotecmd) | |
|
37 | return # the repo is good, nothing more to do | |
|
38 | except hg.RepoError: | |
|
39 | pass | |
|
40 | ||
|
41 | cmd = '%s %s "%s init %s"' | |
|
42 | cmd = cmd % (sshcmd, args, remotecmd, self.path) | |
|
43 | ||
|
44 | ui.note('running %s\n' % cmd) | |
|
45 | res = os.system(cmd) | |
|
46 | if res != 0: | |
|
47 | raise hg.RepoError(_("could not create remote repo")) | |
|
48 | ||
|
49 | self.validate_repo(ui, sshcmd, args, remotecmd) | |
|
50 | ||
|
51 | def validate_repo(self, ui, sshcmd, args, remotecmd): | |
|
33 | 52 | cmd = '%s %s "%s -R %s serve --stdio"' |
|
34 | 53 | cmd = cmd % (sshcmd, args, remotecmd, self.path) |
|
35 | 54 |
General Comments 0
You need to be logged in to leave comments.
Login now