360 fp = sys.stdout |
360 fp = sys.stdout |
361 fp.write(r.read(n)) |
361 fp.write(r.read(n)) |
362 |
362 |
363 def clone(ui, source, dest = None, **opts): |
363 def clone(ui, source, dest = None, **opts): |
364 """make a copy of an existing repository""" |
364 """make a copy of an existing repository""" |
365 source = ui.expandpath(source) |
|
366 |
|
367 if dest is None: |
365 if dest is None: |
368 dest = os.path.basename(os.path.normpath(source)) |
366 dest = os.path.basename(os.path.normpath(source)) |
369 |
367 |
370 if os.path.exists(dest): |
368 if os.path.exists(dest): |
371 ui.warn("abort: destination '%s' already exists\n" % dest) |
369 ui.warn("abort: destination '%s' already exists\n" % dest) |
382 def __del__(self): |
380 def __del__(self): |
383 if self.dir: |
381 if self.dir: |
384 self.rmtree(self.dir, True) |
382 self.rmtree(self.dir, True) |
385 |
383 |
386 d = dircleanup(dest) |
384 d = dircleanup(dest) |
387 |
|
388 link = 0 |
385 link = 0 |
389 abspath = source |
386 abspath = source |
390 if not (source.startswith("http://") or |
387 source = ui.expandpath(source) |
391 source.startswith("hg://") or |
388 other = hg.repository(ui, source) |
392 source.startswith("ssh://") or |
389 |
393 source.startswith("old-http://")): |
390 if other.dev() != -1 and os.stat(dest).st_dev == other.dev(): |
394 abspath = os.path.abspath(source) |
391 ui.status("cloning by hardlink\n") |
395 d1 = os.stat(dest).st_dev |
|
396 d2 = os.stat(source).st_dev |
|
397 if d1 == d2: link = 1 |
|
398 |
|
399 if link: |
|
400 ui.note("copying by hardlink\n") |
|
401 util.system("cp -al '%s'/.hg '%s'/.hg" % (source, dest)) |
392 util.system("cp -al '%s'/.hg '%s'/.hg" % (source, dest)) |
402 try: |
393 try: |
403 os.remove(os.path.join(dest, ".hg", "dirstate")) |
394 os.remove(os.path.join(dest, ".hg", "dirstate")) |
404 except: pass |
395 except: pass |
405 |
396 |
406 repo = hg.repository(ui, dest) |
397 repo = hg.repository(ui, dest) |
407 |
398 |
408 else: |
399 else: |
409 repo = hg.repository(ui, dest, create=1) |
400 repo = hg.repository(ui, dest, create=1) |
410 other = hg.repository(ui, source) |
|
411 repo.pull(other) |
401 repo.pull(other) |
412 |
402 |
413 f = repo.opener("hgrc", "w") |
403 f = repo.opener("hgrc", "w") |
414 f.write("[paths]\n") |
404 f.write("[paths]\n") |
415 f.write("default = %s\n" % abspath) |
405 f.write("default = %s\n" % abspath) |