import os import subprocess __all__ = ['SVNContext'] class SVNContext(object): def __init__(self, default_log=None): self.changed_paths = [] self.log_messages = [] self.default_log = default_log def ensure_dir(self, dir): if not dir or os.path.dirname(dir) == dir: # Rootish dir return if not os.path.exists(dir): superdir = os.path.dirname(dir) self.ensure_dir(superdir) os.mkdir(dir) if os.path.exists(os.path.join(superdir, '.svn')): self.run('svn', 'add', '--', dir) self.changed_paths.append(dir) def delete_file(self, path): if os.path.exists(os.path.join(os.path.dirname(path), '.svn')): self.changed_paths.append(path) self.run('svn', 'rm', '--', path) else: os.unlink(path) def file_changed(self, path, add): if os.path.exists(os.path.join(os.path.dirname(path), '.svn')): self.changed_paths.append(path) if add: self.run('svn', 'add', '--', path) def commit(self): if not self.changed_paths: return if not self.log_messages: self.log_messages.append(self.default_log) message = '\n'.join(self.log_messages) self.run('svn', 'commit', '-m', message, '-q', '--non-interactive', '--non-recursive', '--', *self.changed_paths) self.changed_paths = [] def run(self, cmd, *args): proc = subprocess.Popen([cmd] + list(args), stderr=subprocess.PIPE, stdout=subprocess.PIPE) stdout, stderr = proc.communicate() if proc.returncode: raise OSError( "Command %r (%r) returned error code %s (stderr: %r)" % (cmd, args, proc.returncode, stderr))