diff options
author | Ed Bartosh <eduard.bartosh@intel.com> | 2012-06-06 14:45:44 +0300 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2014-12-05 15:45:00 +0100 |
commit | 76739f8000d0d1b66ace201e105e3c3c2cd6357f (patch) | |
tree | d97063f4f8472d970b5825a01163d5112ad974dc | |
parent | 194b6b8652784ebbcb64dada2836f9983b9daefe (diff) |
GitRepository: Implement status method
Simple wrapper to the git-status command.
Signed-off-by: Ed Bartosh <eduard.bartosh@intel.com>
Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
-rw-r--r-- | gbp/git/repository.py | 33 | ||||
-rw-r--r-- | tests/test_GitRepository.py | 22 |
2 files changed, 55 insertions, 0 deletions
diff --git a/gbp/git/repository.py b/gbp/git/repository.py index 96921b1..6559921 100644 --- a/gbp/git/repository.py +++ b/gbp/git/repository.py @@ -820,6 +820,39 @@ class GitRepository(object): if ret: raise GitRepositoryError("Can't execute repository clean: %s" % err) + def status(self, pathlist=None): + """ + Check status of repository. + + @param pathlist: List of paths to check status for + @type pathlist: C{list} + @return C{dict} of C{lists} of paths, where key is a git status flag. + @rtype C{dict} + """ + options = GitArgs('--porcelain', '-z') + if pathlist: + for path in pathlist: + options.add(path) + + out, err, ret = self._git_inout('status', options.args, + extra_env={'LC_ALL': 'C'}) + if ret: + raise GitRepositoryError("Can't get repository status: %s" % err) + + elements = out.split('\x00') + result = defaultdict(list) + + while elements[0] != '': + element = elements.pop(0) + status = element[:2] + filepath = element[3:] + # Expect to have two filenames for renames and copies + if status[0] in ['R', 'C']: + filepath = elements.pop(0) + '\x00' + filepath + result[status].append(filepath) + + return result + def is_empty(self): """ Is the repository empty? diff --git a/tests/test_GitRepository.py b/tests/test_GitRepository.py index c5c5849..d9fc539 100644 --- a/tests/test_GitRepository.py +++ b/tests/test_GitRepository.py @@ -881,6 +881,28 @@ def test_get_merge_base(): GitRepositoryError: Failed to get common ancestor: fatal: Not a valid object name doesnotexist """ +def test_status(): + r""" + Methods tested: + - L{gbp.git.GitRepository.status} + + >>> import gbp.git, os, shutil + >>> repo = gbp.git.GitRepository(repo_dir) + >>> fname = os.path.join(repo.path, "test_status") + >>> shutil.copy(os.path.join(repo.path, ".git/HEAD"), fname) + >>> repo.status().items() + [('??', ['test_status'])] + >>> repo.status(['bla*']).items() + [] + >>> repo.status(['te*']).items() + [('??', ['test_status'])] + >>> repo.add_files(repo.path, force=True) + >>> repo.commit_all(msg='added %s' % fname) + >>> _ = repo._git_inout('mv', [fname, fname + 'new']) + >>> repo.status().items() + [('R ', ['test_status\x00test_statusnew'])] + """ + def test_cmd_has_feature(): r""" Methods tested: |