Skip to content

Commit 7343641

Browse files
committed
Detect new files in diffs
New files in patch are shown as diff --git a/git_deps/blame.py b/git_deps/blame.py new file mode 100644 index 0000000..41d79fe --- /dev/null +++ b/git_deps/blame.py @@ -0,0 +1,61 @@ This is even visible in pygit2.Diff.patch. However, when you look at the same diff's pygit2.Patch.delta.old_file.path it is not '/dev/null' but 'git_deps/blame.py'. This could have been caught up by tree_lookup() in blame_diff_hunk if '/dev/null' was checked. Because old_file.path is a valid filename though, tree_lookup() may succeed. When? Consider case of moving a file and replacing it with a symlink: diff --git a/some-script b/some-script deleted file mode 100755 index 21c9f09..0000000 --- a/some-script +++ /dev/null @@ -1,3 +0,0 @@ <-- git-deps examines this hunk -#!/usr/bin/perl -... - diff --git a/some-script b/some-script new file mode 120000 index 0000000..0098051 --- /dev/null +++ b/some-script @@ -0,0 +1 @@ <-- this can be skipped, new file +newdir/some-script As a fix look at file mode of each Patch.delta's file and detect new files from old_file.mode, new files don't bring about any deps so they can be skipped in hunk examination. Fixes aspiers#41 Ref aspiers#108
1 parent 89d51e8 commit 7343641

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

git_deps/detector.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ def find_dependencies_with_parent(self, dependent, parent):
144144
diff = self.repo.diff(parent, dependent,
145145
context_lines=self.options.context_lines)
146146
for patch in diff:
147+
if patch.delta.old_file.mode == 0:
148+
self.logger.info(" New file %s, no old hunks" % patch.delta.new_file.path)
149+
continue
147150
path = patch.delta.old_file.path
148151
self.logger.info(" Examining hunks in %s" % path)
149152
for hunk in patch.hunks:
@@ -342,6 +345,7 @@ def tree_lookup(self, target_path, commit):
342345
tree only contains entries for the directory it refers to, not
343346
recursively for all subdirectories.
344347
"""
348+
self.logger.debug(" tree_lookup %s in %s" % (target_path, commit))
345349
segments = target_path.split("/")
346350
tree_or_blob = commit.tree
347351
path = ''

0 commit comments

Comments
 (0)