mercurial/hg.py
changeset 2719 532809ba1db5
parent 2631 8f564a875b50
child 2738 400a4a502001
equal deleted inserted replaced
2717:14ebe97542a7 2719:532809ba1db5
    55     'old-http': old_http,
    55     'old-http': old_http,
    56     'ssh': ssh_,
    56     'ssh': ssh_,
    57     'static-http': static_http,
    57     'static-http': static_http,
    58     }
    58     }
    59 
    59 
       
    60 remote_schemes = [
       
    61     'bundle',
       
    62     'hg',
       
    63     'http',
       
    64     'https',
       
    65     'old-http',
       
    66     'ssh',
       
    67     'static-http',
       
    68     ]
       
    69 
       
    70 def islocal(repo):
       
    71     '''return true if repo or path is local'''
       
    72     if isinstance(repo, str):
       
    73         c = repo.find(':')
       
    74         return c <= 0 or repo[:c] not in remote_schemes
       
    75     return repo.local()
       
    76 
    60 def repository(ui, path=None, create=0):
    77 def repository(ui, path=None, create=0):
    61     scheme = None
    78     scheme = None
    62     if path:
    79     if path:
    63         c = path.find(':')
    80         c = path.find(':')
    64         if c > 0:
    81         if c > 0:
    72         except TypeError:
    89         except TypeError:
    73             raise util.Abort(_('cannot create new repository over "%s" protocol') %
    90             raise util.Abort(_('cannot create new repository over "%s" protocol') %
    74                              scheme)
    91                              scheme)
    75     return ctor(ui, path)
    92     return ctor(ui, path)
    76 
    93 
       
    94 def defaultdest(source):
       
    95     '''return default destination of clone if none is given'''
       
    96     return os.path.basename(os.path.normpath(source))
       
    97     
    77 def clone(ui, source, dest=None, pull=False, rev=None, update=True,
    98 def clone(ui, source, dest=None, pull=False, rev=None, update=True,
    78           stream=False):
    99           stream=False):
    79     """Make a copy of an existing repository.
   100     """Make a copy of an existing repository.
    80 
   101 
    81     Create a copy of an existing repository in a new directory.  The
   102     Create a copy of an existing repository in a new directory.  The
    88     pushes.
   109     pushes.
    89 
   110 
    90     If an exception is raised, the partly cloned/updated destination
   111     If an exception is raised, the partly cloned/updated destination
    91     repository will be deleted.
   112     repository will be deleted.
    92 
   113 
    93     Keyword arguments:
   114     Arguments:
       
   115 
       
   116     source: repository object or URL
    94 
   117 
    95     dest: URL of destination repository to create (defaults to base
   118     dest: URL of destination repository to create (defaults to base
    96     name of source repository)
   119     name of source repository)
    97 
   120 
    98     pull: always pull from source repository, even in local case
   121     pull: always pull from source repository, even in local case
   103     rev: revision to clone up to (implies pull=True)
   126     rev: revision to clone up to (implies pull=True)
   104 
   127 
   105     update: update working directory after clone completes, if
   128     update: update working directory after clone completes, if
   106     destination is local repository
   129     destination is local repository
   107     """
   130     """
       
   131     if isinstance(source, str):
       
   132         src_repo = repository(ui, source)
       
   133     else:
       
   134         src_repo = source
       
   135         source = src_repo.url()
       
   136 
   108     if dest is None:
   137     if dest is None:
   109         dest = os.path.basename(os.path.normpath(source))
   138         dest = defaultdest(source)
       
   139 
       
   140     def localpath(path):
       
   141         if path.startswith('file://'):
       
   142             return path[7:]
       
   143         if path.startswith('file:'):
       
   144             return path[5:]
       
   145         return path
       
   146 
       
   147     dest = localpath(dest)
       
   148     source = localpath(source)
   110 
   149 
   111     if os.path.exists(dest):
   150     if os.path.exists(dest):
   112         raise util.Abort(_("destination '%s' already exists"), dest)
   151         raise util.Abort(_("destination '%s' already exists"), dest)
   113 
   152 
   114     class DirCleanup(object):
   153     class DirCleanup(object):
   119             self.dir_ = None
   158             self.dir_ = None
   120         def __del__(self):
   159         def __del__(self):
   121             if self.dir_:
   160             if self.dir_:
   122                 self.rmtree(self.dir_, True)
   161                 self.rmtree(self.dir_, True)
   123 
   162 
   124     src_repo = repository(ui, source)
       
   125 
       
   126     dest_repo = None
   163     dest_repo = None
   127     try:
   164     try:
   128         dest_repo = repository(ui, dest)
   165         dest_repo = repository(ui, dest)
   129         raise util.Abort(_("destination '%s' already exists." % dest))
   166         raise util.Abort(_("destination '%s' already exists." % dest))
   130     except RepoError:
   167     except RepoError:
   131         dest_repo = repository(ui, dest, create=True)
   168         dest_repo = repository(ui, dest, create=True)
   132 
   169 
   133     dest_path = None
   170     dest_path = None
   134     dir_cleanup = None
   171     dir_cleanup = None
   135     if dest_repo.local():
   172     if dest_repo.local():
   136         dest_path = os.path.realpath(dest)
   173         dest_path = os.path.realpath(dest_repo.root)
   137         dir_cleanup = DirCleanup(dest_path)
   174         dir_cleanup = DirCleanup(dest_path)
   138 
   175 
   139     abspath = source
   176     abspath = source
   140     copy = False
   177     copy = False
   141     if src_repo.local() and dest_repo.local():
   178     if src_repo.local() and dest_repo.local():