diff options
-rw-r--r-- | README.md | 7 | ||||
-rw-r--r-- | VERSION | 2 | ||||
-rw-r--r-- | doc/source/changes.rst | 12 | ||||
-rw-r--r-- | doc/source/tutorial.rst | 9 | ||||
-rw-r--r-- | git/cmd.py | 7 | ||||
-rw-r--r-- | git/diff.py | 14 | ||||
m--------- | git/ext/gitdb | 0 | ||||
-rw-r--r-- | git/refs/log.py | 5 | ||||
-rw-r--r-- | git/refs/symbolic.py | 2 | ||||
-rw-r--r-- | git/repo/base.py | 6 | ||||
-rw-r--r-- | git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color | 1 | ||||
-rw-r--r-- | git/test/test_diff.py | 9 | ||||
-rw-r--r-- | git/test/test_repo.py | 15 |
13 files changed, 65 insertions, 24 deletions
@@ -18,9 +18,6 @@ The list of dependencies are listed in `./requirements.txt` and `./test-requirem ### INSTALL -[](https://pypi.python.org/pypi/GitPython/) -[](https://pypi.python.org/pypi/GitPython/) - If you have downloaded the source code: python setup.py install @@ -101,8 +98,6 @@ New BSD License. See the LICENSE file. [](https://travis-ci.org/gitpython-developers/GitPython) [](https://codeclimate.com/github/gitpython-developers/GitPython) [](https://readthedocs.org/projects/gitpython/?badge=stable) -[](http://www.issuestats.com/github/gitpython-developers/GitPython) -[](http://www.issuestats.com/github/gitpython-developers/GitPython) Now that there seems to be a massive user base, this should be motivation enough to let git-python return to a proper state, which means @@ -111,4 +106,4 @@ Now that there seems to be a massive user base, this should be motivation enough [twitch-channel]: http://www.twitch.tv/byronimo/profile [youtube-playlist]: https://www.youtube.com/playlist?list=PLMHbQxe1e9MnoEcLhn6Yhv5KAvpWkJbL0 -[contributing]: https://github.com/gitpython-developers/GitPython/blob/master/README.md
\ No newline at end of file +[contributing]: https://github.com/gitpython-developers/GitPython/blob/master/README.md @@ -1 +1 @@ -2.0.7dev0 +2.0.8dev0 diff --git a/doc/source/changes.rst b/doc/source/changes.rst index 428fa2b4..9f8ebb51 100644 --- a/doc/source/changes.rst +++ b/doc/source/changes.rst @@ -2,6 +2,18 @@ Changelog ========= +2.0.8 - Bugfixes +================ + +* `DiffIndex.iter_change_type(...)` produces better results when diffing + an index against the working tree. + +2.0.7 - New Features +==================== + +* `IndexFile.commit(...,skip_hooks=False)` added. This parameter emulates the + behaviour of `--no-verify` on the command-line. + 2.0.6 - Fixes and Features ========================== diff --git a/doc/source/tutorial.rst b/doc/source/tutorial.rst index b0ef273d..92020975 100644 --- a/doc/source/tutorial.rst +++ b/doc/source/tutorial.rst @@ -474,8 +474,13 @@ Using environment variables, you can further adjust the behaviour of the git com * **GIT_PYTHON_TRACE** - * If set to non-0, all executed git commands will be logged using a python logger. - * if set to *full*, the executed git command and its output on stdout and stderr will be logged using a python logger. + * If set to non-0, all executed git commands will be shown as they happen + * If set to *full*, the executed git command _and_ its entire output on stdout and stderr will be shown as they happen + + **NOTE**: All logging is outputted using a Python logger, so make sure your program is configured to show INFO-level messages. If this is not the case, try adding the following to your program:: + + import logging + logging.basicConfig(level=logging.INFO) * **GIT_PYTHON_GIT_EXECUTABLE** @@ -246,6 +246,9 @@ class Git(LazyMixin): # Enables debugging of GitPython's git commands GIT_PYTHON_TRACE = os.environ.get("GIT_PYTHON_TRACE", False) + # value of Windows process creation flag taken from MSDN + CREATE_NO_WINDOW = 0x08000000 + # Provide the full path to the git executable. Otherwise it assumes git is in the path _git_exec_env_var = "GIT_PYTHON_GIT_EXECUTABLE" GIT_PYTHON_GIT_EXECUTABLE = os.environ.get(_git_exec_env_var, git_exec_name) @@ -608,6 +611,7 @@ class Git(LazyMixin): cmd_not_found_exception = OSError # end handle + creationflags = self.CREATE_NO_WINDOW if sys.platform == 'win32' else 0 try: proc = Popen(command, env=env, @@ -619,6 +623,7 @@ class Git(LazyMixin): shell=self.USE_SHELL, close_fds=(os.name == 'posix'), # unsupported on windows universal_newlines=universal_newlines, + creationflags=creationflags, **subprocess_kwargs ) except cmd_not_found_exception as err: @@ -629,7 +634,7 @@ class Git(LazyMixin): def _kill_process(pid): """ Callback method to kill a process. """ - p = Popen(['ps', '--ppid', str(pid)], stdout=PIPE) + p = Popen(['ps', '--ppid', str(pid)], stdout=PIPE, creationflags=creationflags) child_pids = [] for line in p.stdout: if len(line.split()) > 0: diff --git a/git/diff.py b/git/diff.py index 06193920..fb8faaf6 100644 --- a/git/diff.py +++ b/git/diff.py @@ -183,7 +183,9 @@ class DiffIndex(list): raise ValueError("Invalid change type: %s" % change_type) for diff in self: - if change_type == "A" and diff.new_file: + if diff.change_type == change_type: + yield diff + elif change_type == "A" and diff.new_file: yield diff elif change_type == "D" and diff.deleted_file: yield diff @@ -247,11 +249,12 @@ class Diff(object): NULL_BIN_SHA = b"\0" * 20 __slots__ = ("a_blob", "b_blob", "a_mode", "b_mode", "a_rawpath", "b_rawpath", - "new_file", "deleted_file", "raw_rename_from", "raw_rename_to", "diff") + "new_file", "deleted_file", "raw_rename_from", "raw_rename_to", + "diff", "change_type") def __init__(self, repo, a_rawpath, b_rawpath, a_blob_id, b_blob_id, a_mode, b_mode, new_file, deleted_file, raw_rename_from, - raw_rename_to, diff): + raw_rename_to, diff, change_type): self.a_mode = a_mode self.b_mode = b_mode @@ -286,6 +289,7 @@ class Diff(object): self.raw_rename_to = raw_rename_to or None self.diff = diff + self.change_type = change_type def __eq__(self, other): for name in self.__slots__: @@ -435,7 +439,7 @@ class Diff(object): new_file, deleted_file, rename_from, rename_to, - None)) + None, None)) previous_header = header # end for each header we parse @@ -483,7 +487,7 @@ class Diff(object): # END add/remove handling diff = Diff(repo, a_path, b_path, a_blob_id, b_blob_id, old_mode, new_mode, - new_file, deleted_file, rename_from, rename_to, '') + new_file, deleted_file, rename_from, rename_to, '', change_type) index.append(diff) # END for each line diff --git a/git/ext/gitdb b/git/ext/gitdb -Subproject d1996e04dbf4841b853b60c1365f0f5fd28d170 +Subproject 2389b75280efb1a63e6ea578eae7f897fd4beb1 diff --git a/git/refs/log.py b/git/refs/log.py index fed13608..3078355d 100644 --- a/git/refs/log.py +++ b/git/refs/log.py @@ -114,7 +114,7 @@ class RefLogEntry(tuple): newhexsha = info[41:81] for hexsha in (oldhexsha, newhexsha): if not cls._re_hexsha_only.match(hexsha): - raise ValueError("Invalid hexsha: %s" % hexsha) + raise ValueError("Invalid hexsha: %r" % (hexsha,)) # END if hexsha re doesn't match # END for each hexsha @@ -274,11 +274,12 @@ class RefLog(list, Serializable): raise ValueError("Shas need to be given in binary format") # END handle sha type assure_directory_exists(filepath, is_file=True) + first_line = message.split('\n')[0] committer = isinstance(config_reader, Actor) and config_reader or Actor.committer(config_reader) entry = RefLogEntry(( bin_to_hex(oldbinsha).decode('ascii'), bin_to_hex(newbinsha).decode('ascii'), - committer, (int(time.time()), time.altzone), message + committer, (int(time.time()), time.altzone), first_line )) lf = LockFile(filepath) diff --git a/git/refs/symbolic.py b/git/refs/symbolic.py index ae67a7ee..ec2944c6 100644 --- a/git/refs/symbolic.py +++ b/git/refs/symbolic.py @@ -313,7 +313,7 @@ class SymbolicReference(object): lfd = LockedFD(fpath) fd = lfd.open(write=True, stream=True) - fd.write(write_value.encode('ascii')) + fd.write(write_value.encode('ascii') + b'\n') lfd.commit() # Adjust the reflog diff --git a/git/repo/base.py b/git/repo/base.py index 5d0a6d30..57f87df6 100644 --- a/git/repo/base.py +++ b/git/repo/base.py @@ -717,8 +717,7 @@ class Repo(object): authored_date=int(props[b'author-time']), committer=Actor(safe_decode(props[b'committer']), safe_decode(props[b'committer-mail'].lstrip(b'<').rstrip(b'>'))), - committed_date=int(props[b'committer-time']), - message=safe_decode(props[b'summary'])) + committed_date=int(props[b'committer-time'])) commits[hexsha] = c else: # Discard the next line (it's a filename end tag) @@ -818,8 +817,7 @@ class Repo(object): authored_date=info['author_date'], committer=Actor._from_string( info['committer'] + ' ' + info['committer_email']), - committed_date=info['committer_date'], - message=info['summary']) + committed_date=info['committer_date']) commits[sha] = c # END if commit objects needs initial creation if not is_binary: diff --git a/git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color b/git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color new file mode 100644 index 00000000..dad85c68 --- /dev/null +++ b/git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color @@ -0,0 +1 @@ +:100644 100644 739bc65220ad90e9ebfa2d6af1723b97555569a4 0000000000000000000000000000000000000000 M README.md diff --git a/git/test/test_diff.py b/git/test/test_diff.py index ba0d2d13..9fdb26a2 100644 --- a/git/test/test_diff.py +++ b/git/test/test_diff.py @@ -104,6 +104,15 @@ class TestDiff(TestBase): assert diff.rename_to == 'that' assert len(list(diffs.iter_change_type('R'))) == 1 + def test_diff_of_modified_files_not_added_to_the_index(self): + output = StringProcessAdapter(fixture('diff_abbrev-40_full-index_M_raw_no-color')) + diffs = Diff._index_from_raw_format(self.rorepo, output.stdout) + + assert len(diffs) == 1, 'one modification' + assert len(list(diffs.iter_change_type('M'))) == 1, 'one modification' + assert diffs[0].change_type == 'M' + assert diffs[0].b_blob is None + def test_binary_diff(self): for method, file_name in ((Diff._index_from_patch_format, 'diff_patch_binary'), (Diff._index_from_raw_format, 'diff_raw_binary')): diff --git a/git/test/test_repo.py b/git/test/test_repo.py index 7ccd173e..17e990f9 100644 --- a/git/test/test_repo.py +++ b/git/test/test_repo.py @@ -325,7 +325,7 @@ class TestRepo(TestBase): assert_equal('Tom Preston-Werner', c.committer.name) assert_equal('tom@mojombo.com', c.committer.email) assert_equal(1191997100, c.committed_date) - assert_equal('initial grit setup', c.message) + self.assertRaisesRegexp(ValueError, "634396b2f541a9f2d58b00be1a07f0c358b999b3 missing", lambda: c.message) # test the 'lines per commit' entries tlist = b[0][1] @@ -793,12 +793,23 @@ class TestRepo(TestBase): new_file_path = os.path.join(rw_dir, "new_file.ext") touch(new_file_path) r.index.add([new_file_path]) - r.index.commit("initial commit") + r.index.commit("initial commit\nBAD MESSAGE 1\n") # Now a branch should be creatable nb = r.create_head('foo') assert nb.is_valid() + with open(new_file_path, 'w') as f: + f.write('Line 1\n') + + r.index.add([new_file_path]) + r.index.commit("add line 1\nBAD MESSAGE 2\n") + + with open('%s/.git/logs/refs/heads/master' % (rw_dir,), 'r') as f: + contents = f.read() + + assert 'BAD MESSAGE' not in contents, 'log is corrupt' + def test_merge_base(self): repo = self.rorepo c1 = 'f6aa8d1' |