Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/workflows/auto-create-pull-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,6 @@ jobs:

- name: Install Docker Buildx
uses: docker/setup-buildx-action@v3
with:
install: true

- name: Install QEMU
uses: docker/setup-qemu-action@v3
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/auto-create-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@ jobs:

- name: Install Docker Buildx
uses: docker/setup-buildx-action@v3
with:
install: true

- name: Install QEMU
uses: docker/setup-qemu-action@v3
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/cron-check-dependencies.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ jobs:

- name: Install Docker Buildx
uses: docker/setup-buildx-action@v3
with:
install: true

- name: Install QEMU
uses: docker/setup-qemu-action@v3
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ This action supports three tag levels for flexible versioning:
| `force_with_lease` | No | `false` | Whether to use force push with lease (`--force-with-lease`). Safer than `force` as it checks for remote changes. Set `fetch-depth: 0` for `actions/checkout`. |
| `no_edit` | No | `false` | Whether to not edit commit message when using amend (`--no-edit`). |
| `organization_domain` | No | `github.com` | GitHub Enterprise domain name. |
| `target_branch` | No | *current branch* | Name of a new branch to push the code into. Creates branch if not existing. |
| `target_branch` | No | *current branch* | Name of a new branch to push the code into. Creates branch if not existing unless there are no changes and `amend` is false. |


### πŸ“€ Output Parameters
Expand Down
2 changes: 1 addition & 1 deletion action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ inputs:
required: false
default: github.com
target_branch:
description: Name of a new branch to push the code into
description: Name of a new branch to push the code into (skipped when no changes and amend is false)
required: false
default: ""
outputs:
Expand Down
155 changes: 82 additions & 73 deletions entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,84 +40,93 @@ else
echo -e "\n[INFO] No files changed."
fi

# Setting branch name
BRANCH="${INPUT_TARGET_BRANCH:-$(git symbolic-ref --short -q HEAD)}"
# Add timestamp to branch name
if [[ "${INPUT_ADD_TIMESTAMP}" == "true" ]]; then
TIMESTAMP=$(date -u +"%Y-%m-%dT%H-%M-%SZ")
if [[ -n ${BRANCH} ]]; then
BRANCH="${BRANCH}-${TIMESTAMP}"
else
BRANCH="${TIMESTAMP}"
fi
SKIP_BRANCH_CREATION=false
if [[ -z ${FILES_CHANGED} && "${INPUT_AMEND}" != "true" ]]; then
SKIP_BRANCH_CREATION=true
BRANCH="$(git symbolic-ref --short -q HEAD)"
echo -e "\n[INFO] No changes to commit and amend disabled; skipping branch creation."
fi
echo -e "\n[INFO] Target branch: ${BRANCH}"

# Enhanced branch handling with proper remote synchronization
if [[ -n "${INPUT_TARGET_BRANCH}" || "${INPUT_ADD_TIMESTAMP}" == "true" ]]; then
# Fetch latest changes from remote
echo "[INFO] Fetching latest changes from remote..."
git fetch origin || {
echo "[WARNING] Could not fetch from remote. Proceeding with local operations."
}

# Check if remote branch exists
REMOTE_BRANCH_EXISTS=$(git ls-remote --heads origin "${BRANCH}" 2>/dev/null | wc -l)

# Improved main branch detection
MAIN_BRANCH="main"
if git show-ref --verify --quiet "refs/remotes/origin/main"; then
MAIN_BRANCH="main"
elif git show-ref --verify --quiet "refs/remotes/origin/master"; then
MAIN_BRANCH="master"
else
# Try to get default branch from remote HEAD
MAIN_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main")
fi
echo "[INFO] Detected main branch: ${MAIN_BRANCH}"

if [[ ${REMOTE_BRANCH_EXISTS} -gt 0 ]]; then
echo "[INFO] Remote branch '${BRANCH}' exists, checking out and updating..."
# Check if local branch exists
if git show-ref --verify --quiet "refs/heads/${BRANCH}"; then
echo "[INFO] Local branch '${BRANCH}' exists, switching to it..."
git checkout "${BRANCH}" || {
echo "[ERROR] Failed to checkout branch ${BRANCH}"
exit 1
}

if [[ "${SKIP_BRANCH_CREATION}" != "true" ]]; then
# Setting branch name
BRANCH="${INPUT_TARGET_BRANCH:-$(git symbolic-ref --short -q HEAD)}"
# Add timestamp to branch name
if [[ "${INPUT_ADD_TIMESTAMP}" == "true" ]]; then
TIMESTAMP=$(date -u +"%Y-%m-%dT%H-%M-%SZ")
if [[ -n ${BRANCH} ]]; then
BRANCH="${BRANCH}-${TIMESTAMP}"
else
echo "[INFO] Creating local branch '${BRANCH}' from remote..."
git checkout -b "${BRANCH}" "origin/${BRANCH}" || {
echo "[ERROR] Failed to create local branch from remote"
exit 1
}
BRANCH="${TIMESTAMP}"
fi
fi
echo -e "\n[INFO] Target branch: ${BRANCH}"

# Enhanced branch handling with proper remote synchronization
if [[ -n "${INPUT_TARGET_BRANCH}" || "${INPUT_ADD_TIMESTAMP}" == "true" ]]; then
# Fetch latest changes from remote
echo "[INFO] Fetching latest changes from remote..."
git fetch origin || {
echo "[WARNING] Could not fetch from remote. Proceeding with local operations."
}

# Check if remote branch exists
REMOTE_BRANCH_EXISTS=$(git ls-remote --heads origin "${BRANCH}" 2>/dev/null | wc -l)

# Ensure branch is up-to-date with main/master (only if they're different branches)
if [[ "${BRANCH}" != "${MAIN_BRANCH}" ]] && git show-ref --verify --quiet "refs/remotes/origin/${MAIN_BRANCH}"; then
echo "[INFO] Rebasing branch onto ${MAIN_BRANCH}..."
git rebase "origin/${MAIN_BRANCH}" || {
echo "[WARNING] Rebase onto ${MAIN_BRANCH} failed. This may indicate conflicts."
echo "[INFO] Attempting to abort the rebase and continue without sync..."
git rebase --abort 2>/dev/null || true
echo "[INFO] Branch will remain at its current state without sync to ${MAIN_BRANCH}"
}
# Improved main branch detection
MAIN_BRANCH="main"
if git show-ref --verify --quiet "refs/remotes/origin/main"; then
MAIN_BRANCH="main"
elif git show-ref --verify --quiet "refs/remotes/origin/master"; then
MAIN_BRANCH="master"
else
# Try to get default branch from remote HEAD
MAIN_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main")
fi
else
echo "[INFO] Remote branch '${BRANCH}' does not exist, creating new branch..."
# Ensure starting from the latest main/master
if git show-ref --verify --quiet "refs/remotes/origin/${MAIN_BRANCH}"; then
echo "[INFO] Creating branch from latest ${MAIN_BRANCH}..."
git checkout -b "${BRANCH}" "origin/${MAIN_BRANCH}" || {
echo "[ERROR] Failed to create branch from ${MAIN_BRANCH}"
exit 1
}
echo "[INFO] Detected main branch: ${MAIN_BRANCH}"

if [[ ${REMOTE_BRANCH_EXISTS} -gt 0 ]]; then
echo "[INFO] Remote branch '${BRANCH}' exists, checking out and updating..."
# Check if local branch exists
if git show-ref --verify --quiet "refs/heads/${BRANCH}"; then
echo "[INFO] Local branch '${BRANCH}' exists, switching to it..."
git checkout "${BRANCH}" || {
echo "[ERROR] Failed to checkout branch ${BRANCH}"
exit 1
}
else
echo "[INFO] Creating local branch '${BRANCH}' from remote..."
git checkout -b "${BRANCH}" "origin/${BRANCH}" || {
echo "[ERROR] Failed to create local branch from remote"
exit 1
}
fi

# Ensure branch is up-to-date with main/master (only if they're different branches)
if [[ "${BRANCH}" != "${MAIN_BRANCH}" ]] && git show-ref --verify --quiet "refs/remotes/origin/${MAIN_BRANCH}"; then
echo "[INFO] Rebasing branch onto ${MAIN_BRANCH}..."
git rebase "origin/${MAIN_BRANCH}" || {
echo "[WARNING] Rebase onto ${MAIN_BRANCH} failed. This may indicate conflicts."
echo "[INFO] Attempting to abort the rebase and continue without sync..."
git rebase --abort 2>/dev/null || true
echo "[INFO] Branch will remain at its current state without sync to ${MAIN_BRANCH}"
}
fi
else
echo "[INFO] Creating branch from current HEAD..."
git checkout -b "${BRANCH}" || {
echo "[ERROR] Failed to create branch from HEAD"
exit 1
}
echo "[INFO] Remote branch '${BRANCH}' does not exist, creating new branch..."
# Ensure starting from the latest main/master
if git show-ref --verify --quiet "refs/remotes/origin/${MAIN_BRANCH}"; then
echo "[INFO] Creating branch from latest ${MAIN_BRANCH}..."
git checkout -b "${BRANCH}" "origin/${MAIN_BRANCH}" || {
echo "[ERROR] Failed to create branch from ${MAIN_BRANCH}"
exit 1
}
else
echo "[INFO] Creating branch from current HEAD..."
git checkout -b "${BRANCH}" || {
echo "[ERROR] Failed to create branch from HEAD"
exit 1
}
fi
fi
fi
fi
Expand Down Expand Up @@ -168,7 +177,7 @@ if [[ "${INPUT_FORCE}" == "true" ]]; then
elif [[ "${INPUT_FORCE_WITH_LEASE}" == "true" ]]; then
echo "[INFO] Force pushing changes with lease"
git push --force-with-lease origin "${BRANCH}"
elif [[ -n ${FILES_CHANGED} || "${INPUT_AMEND}" == "true" || -n "${INPUT_TARGET_BRANCH}" ]]; then
elif [[ "${SKIP_BRANCH_CREATION}" != "true" && ( -n ${FILES_CHANGED} || "${INPUT_AMEND}" == "true" || -n "${INPUT_TARGET_BRANCH}" ) ]]; then
echo "[INFO] Pushing changes"
# Check if branch has upstream tracking
if git rev-parse --abbrev-ref "${BRANCH}@{upstream}" >/dev/null 2>&1; then
Expand Down