summaryrefslogtreecommitdiff
path: root/git/diff.py
diff options
context:
space:
mode:
authorVincent Driessen <me@nvie.com>2016-04-19 21:40:01 +0200
committerVincent Driessen <me@nvie.com>2016-04-19 21:40:01 +0200
commit8da7852780a62d52c3d5012b89a4b15ecf989881 (patch)
tree08bd832e8e48ce190f9d6b9714852b497bb6ff2b /git/diff.py
parent2f1b69ad52670a67e8b766e89451080219871739 (diff)
parent4adafc5a99947301ca0ce40511991d6d54c57a41 (diff)
downloadgitpython-8da7852780a62d52c3d5012b89a4b15ecf989881.tar.gz
Merge remote-tracking branch 'upstream/master' into enrich-incremental-blame-output
Diffstat (limited to 'git/diff.py')
-rw-r--r--git/diff.py21
1 files changed, 16 insertions, 5 deletions
diff --git a/git/diff.py b/git/diff.py
index 062220df..de3aa1e8 100644
--- a/git/diff.py
+++ b/git/diff.py
@@ -16,7 +16,10 @@ from git.compat import (
)
-__all__ = ('Diffable', 'DiffIndex', 'Diff')
+__all__ = ('Diffable', 'DiffIndex', 'Diff', 'NULL_TREE')
+
+# Special object to compare against the empty tree in diffs
+NULL_TREE = object()
class Diffable(object):
@@ -49,6 +52,7 @@ class Diffable(object):
If None, we will be compared to the working tree.
If Treeish, it will be compared against the respective tree
If Index ( type ), it will be compared against the index.
+ If git.NULL_TREE, it will compare against the empty tree.
It defaults to Index to assure the method will not by-default fail
on bare repositories.
@@ -87,10 +91,17 @@ class Diffable(object):
if paths is not None and not isinstance(paths, (tuple, list)):
paths = [paths]
- if other is not None and other is not self.Index:
- args.insert(0, other)
+ diff_cmd = self.repo.git.diff
if other is self.Index:
- args.insert(0, "--cached")
+ args.insert(0, '--cached')
+ elif other is NULL_TREE:
+ args.insert(0, '-r') # recursive diff-tree
+ args.insert(0, '--root')
+ diff_cmd = self.repo.git.diff_tree
+ elif other is not None:
+ args.insert(0, '-r') # recursive diff-tree
+ args.insert(0, other)
+ diff_cmd = self.repo.git.diff_tree
args.insert(0, self)
@@ -101,7 +112,7 @@ class Diffable(object):
# END paths handling
kwargs['as_process'] = True
- proc = self.repo.git.diff(*self._process_diff_args(args), **kwargs)
+ proc = diff_cmd(*self._process_diff_args(args), **kwargs)
diff_method = Diff._index_from_raw_format
if create_patch: