summaryrefslogtreecommitdiff
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
parent2f1b69ad52670a67e8b766e89451080219871739 (diff)
parent4adafc5a99947301ca0ce40511991d6d54c57a41 (diff)
downloadgitpython-8da7852780a62d52c3d5012b89a4b15ecf989881.tar.gz
Merge remote-tracking branch 'upstream/master' into enrich-incremental-blame-output
-rw-r--r--.travis.yml1
-rw-r--r--doc/source/changes.rst7
-rw-r--r--git/compat.py7
-rw-r--r--git/diff.py21
-rw-r--r--git/test/fixtures/diff_initial10
-rw-r--r--git/test/test_diff.py20
-rwxr-xr-xsetup.py1
-rw-r--r--tox.ini3
8 files changed, 54 insertions, 16 deletions
diff --git a/.travis.yml b/.travis.yml
index 4e367fff..2c720821 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,5 @@
language: python
python:
- - "2.6"
- "2.7"
- "3.3"
- "3.4"
diff --git a/doc/source/changes.rst b/doc/source/changes.rst
index 84dd8dfe..4fdf39ca 100644
--- a/doc/source/changes.rst
+++ b/doc/source/changes.rst
@@ -2,6 +2,13 @@
Changelog
=========
+1.0.3 - Fixes
+=============
+
+* `Commit.diff()` now supports diffing the root commit via `Commit.diff(NULL_TREE)`.
+* `Repo.blame()` now respects `incremental=True`, supporting incremental blames. Incremental blames are slightly faster since they don't include the file's contents in them.
+* IMPORTANT: This release drops support for python 2.6, which is officially deprecated by the python maintainers.
+
1.0.2 - Fixes
=============
diff --git a/git/compat.py b/git/compat.py
index b892a9ea..7bd8e494 100644
--- a/git/compat.py
+++ b/git/compat.py
@@ -48,18 +48,13 @@ else:
def mviter(d):
return d.itervalues()
-PRE_PY27 = sys.version_info < (2, 7)
-
def safe_decode(s):
"""Safely decodes a binary string to unicode"""
if isinstance(s, unicode):
return s
elif isinstance(s, bytes):
- if PRE_PY27:
- return s.decode(defenc) # we're screwed
- else:
- return s.decode(defenc, errors='replace')
+ return s.decode(defenc, errors='replace')
raise TypeError('Expected bytes or text, but got %r' % (s,))
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:
diff --git a/git/test/fixtures/diff_initial b/git/test/fixtures/diff_initial
new file mode 100644
index 00000000..6037c677
--- /dev/null
+++ b/git/test/fixtures/diff_initial
@@ -0,0 +1,10 @@
+--- /dev/null
++++ b/CHANGES
+@@ -0,0 +1,7 @@
++=======
++CHANGES
++=======
++
++0.1.0
++=====
++initial release
diff --git a/git/test/test_diff.py b/git/test/test_diff.py
index b0d98248..56e395fd 100644
--- a/git/test/test_diff.py
+++ b/git/test/test_diff.py
@@ -21,7 +21,8 @@ from git import (
Repo,
GitCommandError,
Diff,
- DiffIndex
+ DiffIndex,
+ NULL_TREE,
)
@@ -128,6 +129,21 @@ class TestDiff(TestBase):
assert res[0].deleted_file
assert res[0].b_path == ''
+ def test_diff_initial_commit(self):
+ initial_commit = self.rorepo.commit('33ebe7acec14b25c5f84f35a664803fcab2f7781')
+
+ # Without creating a patch...
+ diff_index = initial_commit.diff(NULL_TREE)
+ assert diff_index[0].b_path == 'CHANGES'
+ assert diff_index[0].new_file
+ assert diff_index[0].diff == ''
+
+ # ...and with creating a patch
+ diff_index = initial_commit.diff(NULL_TREE, create_patch=True)
+ assert diff_index[0].b_path == 'CHANGES'
+ assert diff_index[0].new_file
+ assert diff_index[0].diff == fixture('diff_initial')
+
def test_diff_patch_format(self):
# test all of the 'old' format diffs for completness - it should at least
# be able to deal with it
@@ -149,7 +165,7 @@ class TestDiff(TestBase):
diff_item = commit.tree
# END use tree every second item
- for other in (None, commit.Index, commit.parents[0]):
+ for other in (None, NULL_TREE, commit.Index, commit.parents[0]):
for paths in (None, "CHANGES", ("CHANGES", "lib")):
for create_patch in range(2):
diff_index = diff_item.diff(other=other, paths=paths, create_patch=create_patch)
diff --git a/setup.py b/setup.py
index d35301ae..868f98f0 100755
--- a/setup.py
+++ b/setup.py
@@ -110,7 +110,6 @@ GitPython is a python library used to interact with Git repositories""",
"Operating System :: MacOS :: MacOS X",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.3",
diff --git a/tox.ini b/tox.ini
index da624b5e..9f03872b 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,10 +1,11 @@
[tox]
-envlist = py26,py27,py33,py34,flake8
+envlist = py26,py27,py33,py34,py35,flake8
[testenv]
commands = nosetests {posargs}
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
+passenv = HOME
[testenv:cover]
commands = nosetests --with-coverage {posargs}