126 self.dir_ = None |
126 self.dir_ = None |
127 def __del__(self): |
127 def __del__(self): |
128 if self.dir_: |
128 if self.dir_: |
129 self.rmtree(self.dir_, True) |
129 self.rmtree(self.dir_, True) |
130 |
130 |
131 dest_repo = repository(ui, dest, create=True) |
|
132 |
|
133 dir_cleanup = None |
131 dir_cleanup = None |
134 if dest_repo.local(): |
132 if islocal(dest): |
135 dir_cleanup = DirCleanup(os.path.realpath(dest_repo.root)) |
133 dir_cleanup = DirCleanup(dest) |
136 |
134 |
137 abspath = source |
135 abspath = source |
138 copy = False |
136 copy = False |
139 if src_repo.local() and dest_repo.local(): |
137 if src_repo.local() and islocal(dest): |
140 abspath = os.path.abspath(source) |
138 abspath = os.path.abspath(source) |
141 copy = not pull and not rev |
139 copy = not pull and not rev |
142 |
140 |
143 src_lock, dest_lock = None, None |
141 src_lock, dest_lock = None, None |
144 if copy: |
142 if copy: |
150 src_lock = src_repo.lock() |
148 src_lock = src_repo.lock() |
151 except lock.LockException: |
149 except lock.LockException: |
152 copy = False |
150 copy = False |
153 |
151 |
154 if copy: |
152 if copy: |
|
153 def force_copy(src, dst): |
|
154 try: |
|
155 util.copyfiles(src, dst) |
|
156 except OSError, inst: |
|
157 if inst.errno != errno.ENOENT: |
|
158 raise |
|
159 |
|
160 src_store = os.path.realpath(src_repo.spath) |
|
161 if not os.path.exists(dest): |
|
162 os.mkdir(dest) |
|
163 dest_path = os.path.realpath(os.path.join(dest, ".hg")) |
|
164 os.mkdir(dest_path) |
|
165 if src_repo.spath != src_repo.path: |
|
166 dest_store = os.path.join(dest_path, "store") |
|
167 os.mkdir(dest_store) |
|
168 else: |
|
169 dest_store = dest_path |
|
170 # copy the requires file |
|
171 force_copy(src_repo.join("requires"), |
|
172 os.path.join(dest_path, "requires")) |
155 # we lock here to avoid premature writing to the target |
173 # we lock here to avoid premature writing to the target |
156 src_store = os.path.realpath(src_repo.spath) |
|
157 dest_store = os.path.realpath(dest_repo.spath) |
|
158 dest_lock = lock.lock(os.path.join(dest_store, "lock")) |
174 dest_lock = lock.lock(os.path.join(dest_store, "lock")) |
159 |
175 |
160 files = ("data", |
176 files = ("data", |
161 "00manifest.d", "00manifest.i", |
177 "00manifest.d", "00manifest.i", |
162 "00changelog.d", "00changelog.i") |
178 "00changelog.d", "00changelog.i") |
163 for f in files: |
179 for f in files: |
164 src = os.path.join(src_store, f) |
180 src = os.path.join(src_store, f) |
165 dst = os.path.join(dest_store, f) |
181 dst = os.path.join(dest_store, f) |
166 try: |
182 force_copy(src, dst) |
167 util.copyfiles(src, dst) |
|
168 except OSError, inst: |
|
169 if inst.errno != errno.ENOENT: |
|
170 raise |
|
171 |
183 |
172 # we need to re-init the repo after manually copying the data |
184 # we need to re-init the repo after manually copying the data |
173 # into it |
185 # into it |
174 dest_repo = repository(ui, dest) |
186 dest_repo = repository(ui, dest) |
175 |
187 |
176 else: |
188 else: |
|
189 dest_repo = repository(ui, dest, create=True) |
|
190 |
177 revs = None |
191 revs = None |
178 if rev: |
192 if rev: |
179 if 'lookup' not in src_repo.capabilities: |
193 if 'lookup' not in src_repo.capabilities: |
180 raise util.Abort(_("src repository does not support revision " |
194 raise util.Abort(_("src repository does not support revision " |
181 "lookup and so doesn't support clone by " |
195 "lookup and so doesn't support clone by " |