| ''' |
| Copyright 2011 Google Inc. |
| |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| ''' |
| |
| import fnmatch |
| import os |
| import re |
| import subprocess |
| |
| PROPERTY_MIMETYPE = 'svn:mime-type' |
| |
| class Svn: |
| |
| def __init__(self, directory): |
| """Set up to manipulate SVN control within the given directory. |
| |
| @param directory |
| """ |
| self._directory = directory |
| |
| def _RunCommand(self, args): |
| """Run a command (from self._directory) and return stdout as a single |
| string. |
| |
| @param args a list of arguments |
| """ |
| print 'RunCommand: %s' % args |
| proc = subprocess.Popen(args, cwd=self._directory, |
| stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
| (stdout, stderr) = proc.communicate() |
| if proc.returncode is not 0: |
| raise Exception('command "%s" failed in dir "%s": %s' % |
| (args, self._directory, stderr)) |
| return stdout |
| |
| def Checkout(self, url, path): |
| """Check out a working copy from a repository. |
| Returns stdout as a single string. |
| |
| @param url URL from which to check out the working copy |
| @param path path (within self._directory) where the local copy will be |
| written |
| """ |
| return self._RunCommand(['svn', 'checkout', url, path]) |
| |
| def GetNewFiles(self): |
| """Return a list of files which are in this directory but NOT under |
| SVN control. |
| """ |
| stdout = self._RunCommand(['svn', 'status']) |
| new_regex = re.compile('^\?.....\s+(.+)$', re.MULTILINE) |
| files = new_regex.findall(stdout) |
| return files |
| |
| def GetNewAndModifiedFiles(self): |
| """Return a list of files in this dir which are newly added or modified, |
| including those that are not (yet) under SVN control. |
| """ |
| stdout = self._RunCommand(['svn', 'status']) |
| new_regex = re.compile('^[AM\?].....\s+(.+)$', re.MULTILINE) |
| files = new_regex.findall(stdout) |
| return files |
| |
| def AddFiles(self, filenames): |
| """Adds these files to SVN control. |
| |
| @param filenames files to add to SVN control |
| """ |
| self._RunCommand(['svn', 'add'] + filenames) |
| |
| def SetProperty(self, filenames, property_name, property_value): |
| """Sets a svn property for these files. |
| |
| @param filenames files to set property on |
| @param property_name property_name to set for each file |
| @param property_value what to set the property_name to |
| """ |
| if filenames: |
| self._RunCommand( |
| ['svn', 'propset', property_name, property_value] + filenames) |
| |
| def SetPropertyByFilenamePattern(self, filename_pattern, |
| property_name, property_value): |
| """Sets a svn property for all files matching filename_pattern. |
| |
| @param filename_pattern set the property for all files whose names match |
| this Unix-style filename pattern (e.g., '*.jpg') |
| @param property_name property_name to set for each file |
| @param property_value what to set the property_name to |
| """ |
| all_files = os.listdir(self._directory) |
| matching_files = fnmatch.filter(all_files, filename_pattern) |
| self.SetProperty(matching_files, property_name, property_value) |