aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Bartosh <eduard.bartosh@intel.com>2012-06-06 14:45:44 +0300
committerGuido G√ľnther <agx@sigxcpu.org>2014-12-05 15:45:00 +0100
commit76739f8000d0d1b66ace201e105e3c3c2cd6357f (patch)
treed97063f4f8472d970b5825a01163d5112ad974dc
parent194b6b8652784ebbcb64dada2836f9983b9daefe (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.py33
-rw-r--r--tests/test_GitRepository.py22
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: