forked from lfortran/lfortran
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcheck_binary_file_in_git_history.py
66 lines (52 loc) · 2.85 KB
/
check_binary_file_in_git_history.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import subprocess
# Open file_path, Read it with mode 'r' which expects a utf-8 encode.
# If the file is binary it'd conflict with
# text mode 'r', leading to raised error `UnicodeDecodeError`.
def is_file_binary(file_path: str) -> bool:
try:
with open(file_path, 'r') as fp:
fp.read(16)
return False
except UnicodeDecodeError:
return True
# Get all commit hashes difference between `origin/main` and current `HEAD`
def get_commit_hash_differences() -> list :
# Run command `git rev-list origin/main..HEAD`
# Use `subporcess.PIPE` as the output buffer to fetch the list of commit hashes
completedProcess_object = subprocess.run(["git" ,"rev-list" ,"origin/main..HEAD"],
stdout=subprocess.PIPE
, text=True)
# Create list out of the resulting commit hases.
commit_hashes_listed : list = completedProcess_object.stdout.split("\n")
if(commit_hashes_listed[-1] == ""):
commit_hashes_listed.remove("") # Remove trailing empty string.
print("number of commits from current PR branch against origin/main is :", len(commit_hashes_listed))
print (completedProcess_object.stdout) # print the whole string of commit hashes.
return commit_hashes_listed
# Fetch all files pathes that has beend changed from current `HEAD` against `origin/main`.
def get_changed_files() -> list :
# Run command `git diff --name-only origin/main --diff-filter=d`
# Notice we filter out the deleted files.
completedProcess_object = subprocess.run(["git","diff","--name-only","origin/main", "--diff-filter=d"],
stdout=subprocess.PIPE, text=True)
file_paths : list = completedProcess_object.stdout.split("\n")
if(file_paths[-1] == ""): file_paths.remove("") # Remove trailing empty string.
return file_paths
def run_test() :
commit_hashes_list = get_commit_hash_differences()
# Run git `checkout` to each commit_hash between `origin/main` --> `HEAD`
for commit_hash in commit_hashes_list:
subprocess.run(["git","checkout",commit_hash],
stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)
print("checked out to commit --> ",commit_hash)
file_paths : list = get_changed_files() # fetch changed files from current-checkout-to commit.
for file_path in file_paths:
if (is_file_binary(file_path)):
print("FAIL --- binary file detected")
print(f"Binary File Name : ({file_path}) In Commit : ({commit_hash})")
raise SystemExit(1)
print("OK --- no binary file found")
print("\n--------------------------------------------------\n")
print("CLEAN : No binary file found in any commit in this PR")
print("DONE")
run_test()