'''
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)
