diff --git a/.github/workflows/process-git-request.py b/.github/workflows/process-git-request.py new file mode 100644 index 000000000000..554dbec138aa --- /dev/null +++ b/.github/workflows/process-git-request.py @@ -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) + diff --git a/.github/workflows/process-git-request.rb b/.github/workflows/process-git-request.rb deleted file mode 100644 index 04a2ccd49b8b..000000000000 --- a/.github/workflows/process-git-request.rb +++ /dev/null @@ -1,140 +0,0 @@ -require 'open3' - -requestors = { "gvrose8192" => "" } - -def file_prepend(file, str) - new_contents = "" - File.open(file, 'r') do |fd| - contents = fd.read - new_contents = str << contents - end - # Overwrite file but now with prepended string on it - File.open(file, 'w') do |fd| - fd.write(new_contents) - end -end - -def process_git_request(fname, target_branch, source_branch, prj_dir) - retcode = 200 #presume success -# puts "Opening file " + fname - file = File.new(fname, "w") - working_dir = prj_dir -# puts "Working Dir : " + working_dir - Dir.chdir working_dir -# puts "pwd : " + Dir.pwd - git_cmd = "git log --oneline --no-abbrev-commit origin/" + target_branch + ".." + "origin/" + source_branch -# puts git_cmd - out, err, status = Open3.capture3(git_cmd) - if status.exitstatus != 0 - puts "Command error output is " + err - file.write("Command error output is " + err) - file.close - retcode = 201 - return retcode - end - output_lines = out.split(' ') -# we just want the commit sha IDs - output_lines.each { |x| -# puts "This is output_lines " + x - upstream_diff = false - if !x[/\H/] - if x.length < 40 - next - end - git_cmd = "git show " + x - gitlog_out, gitlog_err, gitlog_status = Open3.capture3(git_cmd) - if gitlog_status.exitstatus != 0 - file.write("git show command error output is " + gitlog_err) - retcode = 201 - end - loglines = gitlog_out.lines.map(&:chomp) - lines_counted = 0 - local_diffdiff_sha = "" - upstream_diffdiff_sha = "" - loglines.each { |logline| - lines_counted = lines_counted + 1 - if lines_counted == 1 - local_commit_sha = logline.match("[0-9a-f]\{40\}") - local_diffdiff_sha = local_commit_sha.to_s -# puts "Local : " + local_diffdiff_sha - file.write("Merge Request sha: " + local_diffdiff_sha) - file.write("\n") - end - if lines_counted == 2 #email address - if !logline.downcase.include? "ciq.com" - # Bad Author - s = "error:\nBad " + logline + "\n" - puts s - file.write(s) - retcode = 201 - else - file.write("\t" + logline + "\n") - end - end - if lines_counted > 1 - if logline.downcase.include? "jira" - file.write("\t" + logline + "\n") - end - if logline.downcase.include? "upstream-diff" - upstream_diff = true - end - if logline.downcase.include? "commit" - commit_sha = logline.match("[0-9a-f]\{40\}") - upstream_diffdiff_sha = commit_sha.to_s -# puts "Upstream : " + upstream_diffdiff_sha - if (!upstream_diffdiff_sha.empty?) - file.write("\tUpstream sha: " + upstream_diffdiff_sha) - file.write("\n") - end - end - end - if lines_counted > 8 #Everything we need should be in the first 8 lines - break - end - } - if !local_diffdiff_sha.empty? && !upstream_diffdiff_sha.empty? - diff_cmd = Dir.pwd + "/.github/workflows/diffdiff.py --colour --commit " + local_diffdiff_sha - puts "diffdiff: " + diff_cmd - diff_out, diff_err, diff_status = Open3.capture3(diff_cmd) - if diff_status.exitstatus != 0 && !upstream_diff - puts "diffdiff out: " + diff_out - puts "diffdiff err: " + diff_err - retcode = 201 - file.write("error:\nCommit: " + local_diffdiff_sha + " differs with no upstream tag in commit message\n") - end - end - end - } - file.close - return retcode -end - -first_arg, *argv_in = ARGV -if argv_in.length < 5 - puts "Not enough arguments: fname, target_branch, source_branch, prj_dir, pull_request, requestor" - exit -end -fname = first_arg.to_s -fname = "tmp-" + fname -# puts "filename is " + fname -target_branch = argv_in[0].to_s -# puts "target branch is " + target_branch -source_branch = argv_in[1].to_s -# puts "source branch is " + source_branch -prj_dir = argv_in[2].to_s -# puts "project dir is " + prj_dir -pullreq = argv_in[3].to_s -# puts "pull request is " + pullreq -requestor = argv_in[4].to_s -retcode = process_git_request(fname, target_branch, source_branch, prj_dir) -if retcode != 200 - File.open(fname, 'r') do |fd| - contents = fd.read - puts contents - end - exit(1) -else - puts "Done" -end -exit(0) - diff --git a/.github/workflows/process-pull-request.yml b/.github/workflows/process-pull-request.yml new file mode 100644 index 000000000000..90fe72473d36 --- /dev/null +++ b/.github/workflows/process-pull-request.yml @@ -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 }}