Index: gclient_scm.py |
diff --git a/gclient_scm.py b/gclient_scm.py |
index a96e0367bbd5726f4bd2208cc1c0eca5e88b6d46..8e4540e39ac0e148dc2168f37fa0e285912300ea 100644 |
--- a/gclient_scm.py |
+++ b/gclient_scm.py |
@@ -55,22 +55,28 @@ class DiffFilterer(object): |
# Factory Method for SCM wrapper creation |
-def CreateSCM(url=None, root_dir=None, relpath=None, scm_name='svn'): |
- scm_map = { |
+def GetScmName(url): |
+ if url: |
+ url, _ = gclient_utils.SplitUrlRevision(url) |
+ if (url.startswith('git://') or url.startswith('ssh://') or |
+ url.endswith('.git')): |
+ return 'git' |
+ elif (url.startswith('http://') or url.startswith('svn://') or |
+ url.startswith('ssh+svn://')): |
+ return 'svn' |
+ return None |
+ |
+ |
+def CreateSCM(url, root_dir=None, relpath=None): |
+ SCM_MAP = { |
'svn' : SVNWrapper, |
'git' : GitWrapper, |
} |
- orig_url = url |
- |
- if url: |
- url, _ = gclient_utils.SplitUrlRevision(url) |
- if url.startswith('git:') or url.startswith('ssh:') or url.endswith('.git'): |
- scm_name = 'git' |
- |
- if not scm_name in scm_map: |
- raise gclient_utils.Error('Unsupported scm %s' % scm_name) |
- return scm_map[scm_name](orig_url, root_dir, relpath, scm_name) |
+ scm_name = GetScmName(url) |
+ if not scm_name in SCM_MAP: |
+ raise gclient_utils.Error('No SCM found for url %s' % url) |
+ return SCM_MAP[scm_name](url, root_dir, relpath) |
# SCMWrapper base class |
@@ -80,9 +86,7 @@ class SCMWrapper(object): |
This is the abstraction layer to bind to different SCM. |
""" |
- def __init__(self, url=None, root_dir=None, relpath=None, |
- scm_name='svn'): |
- self.scm_name = scm_name |
+ def __init__(self, url=None, root_dir=None, relpath=None): |
self.url = url |
self._root_dir = root_dir |
if self._root_dir: |
@@ -106,7 +110,7 @@ class SCMWrapper(object): |
if not command in dir(self): |
raise gclient_utils.Error('Command %s not implemented in %s wrapper' % ( |
- command, self.scm_name)) |
+ command, self.__class__.__name__)) |
return getattr(self, command)(options, args, file_list) |
@@ -671,9 +675,12 @@ class SVNWrapper(SCMWrapper): |
def diff(self, options, args, file_list): |
# NOTE: This function does not currently modify file_list. |
+ path = os.path.join(self._root_dir, self.relpath) |
+ if not os.path.isdir(path): |
+ raise gclient_utils.Error('Directory %s is not present.' % path) |
command = ['diff'] |
command.extend(args) |
- scm.SVN.Run(command, os.path.join(self._root_dir, self.relpath)) |
+ scm.SVN.Run(command, path) |
def export(self, options, args, file_list): |
"""Export a clean directory tree into the given path.""" |
@@ -692,6 +699,8 @@ class SVNWrapper(SCMWrapper): |
"""Generates a patch file which can be applied to the root of the |
repository.""" |
path = os.path.join(self._root_dir, self.relpath) |
+ if not os.path.isdir(path): |
+ raise gclient_utils.Error('Directory %s is not present.' % path) |
command = ['diff'] |
command.extend(args) |