446 ui.status(_('(sharing from new pooled repository %s)\n') % basename) |
446 ui.status(_('(sharing from new pooled repository %s)\n') % basename) |
447 # Always use pull mode because hardlinks in share mode don't work |
447 # Always use pull mode because hardlinks in share mode don't work |
448 # well. Never update because working copies aren't necessary in |
448 # well. Never update because working copies aren't necessary in |
449 # share mode. |
449 # share mode. |
450 clone(ui, peeropts, source, dest=sharepath, pull=True, |
450 clone(ui, peeropts, source, dest=sharepath, pull=True, |
451 rev=rev, update=False, stream=stream) |
451 revs=rev, update=False, stream=stream) |
452 |
452 |
453 # Resolve the value to put in [paths] section for the source. |
453 # Resolve the value to put in [paths] section for the source. |
454 if islocal(source): |
454 if islocal(source): |
455 defaultpath = os.path.abspath(util.urllocalpath(source)) |
455 defaultpath = os.path.abspath(util.urllocalpath(source)) |
456 else: |
456 else: |
481 if os.path.exists(srcbranchcache): |
481 if os.path.exists(srcbranchcache): |
482 if not os.path.exists(dstcachedir): |
482 if not os.path.exists(dstcachedir): |
483 os.mkdir(dstcachedir) |
483 os.mkdir(dstcachedir) |
484 util.copyfile(srcbranchcache, dstbranchcache) |
484 util.copyfile(srcbranchcache, dstbranchcache) |
485 |
485 |
486 def clone(ui, peeropts, source, dest=None, pull=False, rev=None, |
486 def clone(ui, peeropts, source, dest=None, pull=False, revs=None, |
487 update=True, stream=False, branch=None, shareopts=None): |
487 update=True, stream=False, branch=None, shareopts=None): |
488 """Make a copy of an existing repository. |
488 """Make a copy of an existing repository. |
489 |
489 |
490 Create a copy of an existing repository in a new directory. The |
490 Create a copy of an existing repository in a new directory. The |
491 source and destination are URLs, as passed to the repository |
491 source and destination are URLs, as passed to the repository |
510 server prefers streaming |
510 server prefers streaming |
511 |
511 |
512 stream: stream raw data uncompressed from repository (fast over |
512 stream: stream raw data uncompressed from repository (fast over |
513 LAN, slow over WAN) |
513 LAN, slow over WAN) |
514 |
514 |
515 rev: revision to clone up to (implies pull=True) |
515 revs: revision to clone up to (implies pull=True) |
516 |
516 |
517 update: update working directory after clone completes, if |
517 update: update working directory after clone completes, if |
518 destination is local repository (True means update to default rev, |
518 destination is local repository (True means update to default rev, |
519 anything else is treated as a revision) |
519 anything else is treated as a revision) |
520 |
520 |
534 srcpeer = peer(ui, peeropts, source) |
534 srcpeer = peer(ui, peeropts, source) |
535 else: |
535 else: |
536 srcpeer = source.peer() # in case we were called with a localrepo |
536 srcpeer = source.peer() # in case we were called with a localrepo |
537 branches = (None, branch or []) |
537 branches = (None, branch or []) |
538 origsource = source = srcpeer.url() |
538 origsource = source = srcpeer.url() |
539 rev, checkout = addbranchrevs(srcpeer, srcpeer, branches, rev) |
539 revs, checkout = addbranchrevs(srcpeer, srcpeer, branches, revs) |
540 |
540 |
541 if dest is None: |
541 if dest is None: |
542 dest = defaultdest(source) |
542 dest = defaultdest(source) |
543 if dest: |
543 if dest: |
544 ui.status(_("destination directory: %s\n") % dest) |
544 ui.status(_("destination directory: %s\n") % dest) |
585 raise error.Abort(_('unknown share naming mode: %s') % |
585 raise error.Abort(_('unknown share naming mode: %s') % |
586 sharenamemode) |
586 sharenamemode) |
587 |
587 |
588 if sharepath: |
588 if sharepath: |
589 return clonewithshare(ui, peeropts, sharepath, source, srcpeer, |
589 return clonewithshare(ui, peeropts, sharepath, source, srcpeer, |
590 dest, pull=pull, rev=rev, update=update, |
590 dest, pull=pull, rev=revs, update=update, |
591 stream=stream) |
591 stream=stream) |
592 |
592 |
593 srclock = destlock = cleandir = None |
593 srclock = destlock = cleandir = None |
594 srcrepo = srcpeer.local() |
594 srcrepo = srcpeer.local() |
595 try: |
595 try: |
601 cleandir = dest |
601 cleandir = dest |
602 |
602 |
603 copy = False |
603 copy = False |
604 if (srcrepo and srcrepo.cancopy() and islocal(dest) |
604 if (srcrepo and srcrepo.cancopy() and islocal(dest) |
605 and not phases.hassecret(srcrepo)): |
605 and not phases.hassecret(srcrepo)): |
606 copy = not pull and not rev |
606 copy = not pull and not revs |
607 |
607 |
608 if copy: |
608 if copy: |
609 try: |
609 try: |
610 # we use a lock here because if we race with commit, we |
610 # we use a lock here because if we race with commit, we |
611 # can end up with extra data in the cloned revlogs that's |
611 # can end up with extra data in the cloned revlogs that's |
658 cleandir = None |
658 cleandir = None |
659 raise error.Abort(_("destination '%s' already exists") |
659 raise error.Abort(_("destination '%s' already exists") |
660 % dest) |
660 % dest) |
661 raise |
661 raise |
662 |
662 |
663 revs = None |
663 if revs: |
664 if rev: |
|
665 if not srcpeer.capable('lookup'): |
664 if not srcpeer.capable('lookup'): |
666 raise error.Abort(_("src repository does not support " |
665 raise error.Abort(_("src repository does not support " |
667 "revision lookup and so doesn't " |
666 "revision lookup and so doesn't " |
668 "support clone by revision")) |
667 "support clone by revision")) |
669 revs = [srcpeer.lookup(r) for r in rev] |
668 revs = [srcpeer.lookup(r) for r in revs] |
670 checkout = revs[0] |
669 checkout = revs[0] |
|
670 else: |
|
671 revs = None |
671 local = destpeer.local() |
672 local = destpeer.local() |
672 if local: |
673 if local: |
673 u = util.url(abspath) |
674 u = util.url(abspath) |
674 defaulturl = bytes(u) |
675 defaulturl = bytes(u) |
675 local.ui.setconfig('paths', 'default', defaulturl, 'clone') |
676 local.ui.setconfig('paths', 'default', defaulturl, 'clone') |