clang-format: Use git-ls-tree to get file mode in diff mode

Summary:
If a file has been renamed/deleted from the filesystem and --diff mode
with two commits is active, attempting to get the file's mode will fail.
This change uses git-ls-tree instead to get the correct permissions for
the given revision.

Patch by Luis Hector Chavez!

Reviewers: djasper, lodato

Subscribers: srhines, cfe-commits

Differential Revision: https://reviews.llvm.org/D26287

llvm-svn: 286212
This commit is contained in:
Stephen Hines 2016-11-08 05:50:14 +00:00
parent 62f99cc486
commit 171244fb7a
1 changed files with 10 additions and 1 deletions

View File

@ -346,7 +346,16 @@ def run_clang_format_and_save_to_tree(changed_lines, revision=None,
Returns the object ID (SHA-1) of the created tree."""
def index_info_generator():
for filename, line_ranges in changed_lines.iteritems():
mode = oct(os.stat(filename).st_mode)
if revision:
git_metadata_cmd = ['git', 'ls-tree',
'%s:%s' % (revision, os.path.dirname(filename)),
os.path.basename(filename)]
git_metadata = subprocess.Popen(git_metadata_cmd, stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
stdout = git_metadata.communicate()[0]
mode = oct(int(stdout.split()[0], 8))
else:
mode = oct(os.stat(filename).st_mode)
blob_id = clang_format_to_blob(filename, line_ranges,
revision=revision,
binary=binary,