diff options
Diffstat (limited to '.github/workflows/ci.yml')
| -rw-r--r-- | .github/workflows/ci.yml | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc83bbe..ccb1958 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,12 +32,42 @@ jobs: env: PR_BASE_SHA: ${{ github.event.pull_request.base.sha }} PUSH_BEFORE_SHA: ${{ github.event.before }} + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} run: | + is_usable_rev() { + local rev="$1" + [ -n "$rev" ] && + [ "$rev" != "0000000000000000000000000000000000000000" ] && + git rev-parse --verify "${rev}^{commit}" >/dev/null 2>&1 && + git merge-base --is-ancestor "$rev" HEAD >/dev/null 2>&1 + } + BASE_SHA="${PR_BASE_SHA:-$PUSH_BEFORE_SHA}" - if [ -z "$BASE_SHA" ] || [ "$BASE_SHA" = "0000000000000000000000000000000000000000" ]; then - if git rev-parse HEAD^ >/dev/null 2>&1; then - BASE_SHA="$(git rev-parse HEAD^)" + if ! is_usable_rev "$BASE_SHA"; then + BASE_SHA="" + fi + + if [ -z "$BASE_SHA" ] && [ -n "$DEFAULT_BRANCH" ]; then + DEFAULT_REF="origin/$DEFAULT_BRANCH" + + if ! git rev-parse --verify "${DEFAULT_REF}^{commit}" >/dev/null 2>&1; then + git fetch --no-tags --depth=1 origin \ + "$DEFAULT_BRANCH:refs/remotes/origin/$DEFAULT_BRANCH" \ + >/dev/null 2>&1 || true + fi + + if git rev-parse --verify "${DEFAULT_REF}^{commit}" >/dev/null 2>&1; then + MERGE_BASE="$(git merge-base HEAD "$DEFAULT_REF" 2>/dev/null || true)" + if is_usable_rev "$MERGE_BASE"; then + BASE_SHA="$MERGE_BASE" + fi + fi + fi + + if [ -z "$BASE_SHA" ]; then + if git rev-parse --verify HEAD~1 >/dev/null 2>&1; then + BASE_SHA="$(git rev-parse HEAD~1)" else BASE_SHA="$(git rev-list --max-parents=0 HEAD)" fi |
