Index: gclient_scm.py |
diff --git a/gclient_scm.py b/gclient_scm.py |
index 148855c89ffc597d645314df55274da19909f303..43eaca772c3a9433d15a5e9e3d1504ce9a1cd175 100644 |
--- a/gclient_scm.py |
+++ b/gclient_scm.py |
@@ -27,23 +27,31 @@ SVN_COMMAND = "svn" |
### SCM abstraction layer |
+# Factory Method for SCM wrapper creation |
+ |
+def create_scm(url, root_dir, relpath, scm_name='svn'): |
M-A Ruel
2009/09/17 20:56:15
Functions should be CamelCase too.
|
+ # TODO(maruel): Deduce the SCM from the url. |
+ scm_map = { |
+ 'svn' : SVNWrapper, |
+ } |
+ if not scm_name in scm_map: |
+ raise gclient_utils.Error('Unsupported scm %s' % scm_name) |
+ return scm_map[scm_name](url, root_dir, relpath, scm_name) |
+ |
+ |
+# SCMWrapper base class |
+ |
class SCMWrapper(object): |
"""Add necessary glue between all the supported SCM. |
This is the abstraction layer to bind to different SCM. Since currently only |
subversion is supported, a lot of subersionism remains. This can be sorted out |
once another SCM is supported.""" |
- def __init__(self, url=None, root_dir=None, relpath=None, |
- scm_name='svn'): |
- # TODO(maruel): Deduce the SCM from the url. |
+ def __init__(self, url, root_dir, relpath, scm_name='svn'): |
self.scm_name = scm_name |
self.url = url |
- self._root_dir = root_dir |
- if self._root_dir: |
- self._root_dir = self._root_dir.replace('/', os.sep) |
- self.relpath = relpath |
- if self.relpath: |
- self.relpath = self.relpath.replace('/', os.sep) |
+ self._root_dir = root_dir.replace('/', os.sep) |
+ self.relpath = relpath.replace('/', os.sep) |
def FullUrlForRelativeUrl(self, url): |
# Find the forth '/' and strip from there. A bit hackish. |
@@ -54,21 +62,21 @@ class SCMWrapper(object): |
if file_list is None: |
file_list = [] |
- commands = { |
- 'cleanup': self.cleanup, |
- 'export': self.export, |
- 'update': self.update, |
- 'revert': self.revert, |
- 'status': self.status, |
- 'diff': self.diff, |
- 'pack': self.pack, |
- 'runhooks': self.status, |
- } |
+ commands = ['cleanup', 'export', 'update', 'revert', |
+ 'status', 'diff', 'pack', 'runhooks'] |
if not command in commands: |
raise gclient_utils.Error('Unknown command %s' % command) |
- return commands[command](options, args, file_list) |
+ if not command in dir(self): |
+ raise gclient_utils.Error('Command %s not implemnted in %s wrapper' % ( |
+ command, self.scm_name)) |
+ |
+ return getattr(self, command)(options, args, file_list) |
+ |
+ |
+class SVNWrapper(SCMWrapper): |
+ """ Wrapper for SVN """ |
def cleanup(self, options, args, file_list): |
"""Cleanup working copy.""" |
@@ -258,6 +266,9 @@ class SCMWrapper(object): |
RunSVN(command + accumulated_paths, |
os.path.join(self._root_dir, self.relpath)) |
+ def runhooks(self, options, args, file_list): |
+ self.status(options, args, file_list) |
+ |
def status(self, options, args, file_list): |
"""Display status information.""" |
path = os.path.join(self._root_dir, self.relpath) |