From 5e9a2b8528a0f49f0a5b3e1fe7af9cef0b2cd107 Mon Sep 17 00:00:00 2001 From: Matt Clay Date: Wed, 15 Mar 2017 11:10:50 -0700 Subject: [PATCH] Verify SHA in Shippable change detection. --- test/runner/lib/changes.py | 8 +++++--- test/runner/lib/git.py | 13 +++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/test/runner/lib/changes.py b/test/runner/lib/changes.py index 04205d19302..8fc27f9666d 100644 --- a/test/runner/lib/changes.py +++ b/test/runner/lib/changes.py @@ -71,7 +71,7 @@ class ShippableChanges(object): self.paths = sorted(git.get_diff_names([self.branch])) else: merge_runs = self.get_merge_runs(self.project_id, self.branch) - last_successful_commit = self.get_last_successful_commit(merge_runs) + last_successful_commit = self.get_last_successful_commit(git, merge_runs) if last_successful_commit: self.paths = sorted(git.get_diff_names([last_successful_commit, self.commit])) @@ -96,8 +96,9 @@ class ShippableChanges(object): return response.json() @staticmethod - def get_last_successful_commit(merge_runs): + def get_last_successful_commit(git, merge_runs): """ + :type git: Git :type merge_runs: dict | list[dict] :rtype: str """ @@ -114,7 +115,8 @@ class ShippableChanges(object): if commit_sha not in known_commits: known_commits.add(commit_sha) if merge_run['statusCode'] == 30: - last_successful_commit = commit_sha + if git.is_valid_ref(commit_sha): + last_successful_commit = commit_sha return last_successful_commit diff --git a/test/runner/lib/git.py b/test/runner/lib/git.py index b732a5dbe18..41613476463 100644 --- a/test/runner/lib/git.py +++ b/test/runner/lib/git.py @@ -4,6 +4,7 @@ from __future__ import absolute_import, print_function from lib.util import ( CommonConfig, + SubprocessError, run_command, ) @@ -55,6 +56,18 @@ class Git(object): cmd = ['merge-base', '--fork-point', branch] return self.run_git(cmd).strip() + def is_valid_ref(self, ref): + """ + :type ref: str + :rtype: bool + """ + cmd = ['show', ref] + try: + self.run_git(cmd) + return True + except SubprocessError: + return False + def run_git_split(self, cmd, separator=None): """ :type cmd: list[str]