-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
github actions: Use python PR check script
jira LE-2214 Obsoletes the old ruby PR check script
- Loading branch information
1 parent
494e5e2
commit 3017050
Showing
3 changed files
with
182 additions
and
140 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
#!/usr/bin/env python3 | ||
|
||
import sys | ||
import subprocess | ||
import os | ||
import re | ||
import git | ||
|
||
def log_commits_between_branches(repo_path, from_branch, to_branch): | ||
repo = git.Repo(repo_path) | ||
|
||
# Get the common ancestor of the two branches | ||
common_ancestor = repo.merge_base(from_branch, to_branch) | ||
|
||
print(f"Common ancestor is {common_ancestor}") | ||
|
||
# Get the commits in 'from_branch' that are not in 'to_branch' | ||
commits = list(repo.iter_commits(f"{to_branch}..{from_branch}")) | ||
|
||
# for commit in commits: | ||
# print(commit.hexsha, commit.message.strip()) | ||
|
||
def file_prepend(file, str): | ||
with open(file, 'r') as fd: | ||
contents = fd.read() | ||
new_contents = str + contents | ||
|
||
# Overwrite file but now with prepended string on it | ||
with open(file, 'w') as fd: | ||
fd.write(new_contents) | ||
|
||
def process_git_request(fname, target_branch, source_branch, prj_dir): | ||
retcode = 0 # presume success | ||
file = open(fname, "w") | ||
working_dir = prj_dir | ||
os.chdir(working_dir) | ||
|
||
repo = git.Repo(".") | ||
commits = repo.iter_commits(f"{target_branch}..{source_branch}") | ||
loglines_to_check = 13 | ||
for commit in commits: | ||
print(f"{commit.hexsha} {commit.message.splitlines()[0]}") | ||
|
||
commit_sha = commit.hexsha | ||
|
||
git_cmd = "git show " + commit_sha | ||
gitlog_out, gitlog_err = subprocess.Popen(git_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True).communicate() | ||
|
||
loglines = gitlog_out.splitlines() | ||
lines_counted = 0 | ||
local_diffdiff_sha = commit_sha | ||
upstream_diffdiff_sha = "" | ||
upstream_diff = False | ||
|
||
for logline in loglines: | ||
# print(f"Processing logline {commit_sha}") | ||
lines_counted += 1 | ||
if lines_counted == 1: | ||
file.write("Merge Request sha: " + local_diffdiff_sha) | ||
file.write("\n") | ||
if lines_counted == 2: # email address | ||
if "ciq.com" not in logline.lower(): | ||
# Bad Author | ||
s = f"error:\nBad {logline}\n" | ||
print(s) | ||
file.write(s) | ||
file.close() | ||
return retcode | ||
if lines_counted > 1: | ||
if "jira" in logline.lower(): | ||
file.write("\t" + logline + "\n") | ||
|
||
if "upstream-diff" in logline.lower(): | ||
upstream_diff = True | ||
|
||
if "commit" in logline.lower(): | ||
local_commit_sha = re.search(r'[0-9a-f]{40}', logline) | ||
upstream_diffdiff_sha = str(local_commit_sha.group(0)) if local_commit_sha else "" | ||
if upstream_diffdiff_sha: | ||
print(f"Upstream : " + upstream_diffdiff_sha) | ||
file.write("\tUpstream sha: " + upstream_diffdiff_sha) | ||
file.write("\n") | ||
|
||
if lines_counted > loglines_to_check: # Everything we need should be in the first loglines_to_check lines | ||
# print(f"Breaking after {loglines_to_check} lines of commit checking") | ||
break | ||
|
||
if local_diffdiff_sha and upstream_diffdiff_sha: | ||
diff_cmd = os.path.join(os.getcwd(), ".github/workflows/diffdiff.py") + " --colour --commit " + local_diffdiff_sha | ||
# print("diffdiff: " + diff_cmd) | ||
process = subprocess.run(diff_cmd, shell=True, capture_output=True, text=True) | ||
diff_out = process.stdout | ||
diff_err = process.stderr | ||
diff_status = process.returncode | ||
|
||
if diff_status != 0 and not upstream_diff: | ||
print(f"diffdiff out: " + diff_out) | ||
print(f"diffdiff err: " + diff_err) | ||
retcode = 1 | ||
file.write("error:\nCommit: " + local_diffdiff_sha + " differs with no upstream tag in commit message\n") | ||
|
||
return retcode | ||
|
||
first_arg, *argv_in = sys.argv[1:] # Skip script name in sys.argv | ||
|
||
if len(argv_in) < 5: | ||
print("Not enough arguments: fname, target_branch, source_branch, prj_dir, pull_request, requestor") | ||
sys.exit() | ||
|
||
fname = str(first_arg) | ||
fname = "tmp-" + fname | ||
# print("filename is " + fname) | ||
target_branch = str(argv_in[0]) | ||
# print("target branch is " + target_branch) | ||
source_branch = str(argv_in[1]) | ||
# print("source branch is " + source_branch) | ||
prj_dir = str(argv_in[2]) | ||
# print("project dir is " + prj_dir) | ||
pullreq = str(argv_in[3]) | ||
# print("pull request is " + pullreq) | ||
requestor = str(argv_in[4]) | ||
|
||
retcode = process_git_request(fname, target_branch, source_branch, prj_dir) | ||
|
||
if retcode != 0: | ||
with open(fname, 'r') as fd: | ||
contents = fd.read() | ||
print(contents) | ||
sys.exit(1) | ||
else: | ||
print("Done") | ||
|
||
sys.exit(0) | ||
|
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
# This workflow uses actions that are not certified by GitHub. | ||
# They are provided by a third-party and are governed by | ||
# separate terms of service, privacy policy, and support | ||
# documentation. | ||
|
||
name: Pull Request Checker | ||
|
||
on: | ||
pull_request: | ||
branches: | ||
- '**' | ||
- '!mainline' | ||
|
||
permissions: | ||
contents: read | ||
|
||
jobs: | ||
test: | ||
|
||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- uses: actions/checkout@v4 | ||
- name: Set up Python | ||
uses: actions/setup-python@v5 | ||
- name: Run tests | ||
run: | | ||
/usr/bin/pip3 install gitPython | ||
python -c "import sys; import git; print(sys.version)" | ||
rm -rf /home/runner/work/kernel-src-tree/kernel-src-tree | ||
cd /home/runner/work/kernel-src-tree | ||
git clone https://github.com/ctrliq/kernel-src-tree | ||
cd kernel-src-tree | ||
git fetch --all | ||
git checkout -b ${{ github.head_ref }} origin/${{ github.head_ref }} | ||
git checkout ${{ github.base_ref }} | ||
git remote add linux https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git | ||
git fetch --shallow-since="2 years ago" linux | ||
echo "Will run process-git-request.py with:" | ||
echo "fname = ${{ github.run_id }}" | ||
echo "target_branch = ${{ github.base_ref }}" | ||
echo "source_branch = ${{ github.head_ref }}" | ||
echo "prj_dir = ${{ github.workspace }}" | ||
echo "pull_request = ${{ github.ref }}" | ||
echo "requestor = ${{ github.actor }}" | ||
cd ${{ github.workspace }} | ||
/usr/bin/python3 .github/workflows/process-git-request.py ${{ github.run_id }} ${{ github.base_ref }} \ | ||
${{ github.ref }} ${{ github.workspace }} ${{ github.head_ref }} ${{ github.actor }} |