Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
164 changes: 91 additions & 73 deletions entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,15 @@ git remote set-url origin "https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@${INPUT_ORGAN
git config --global user.name "${GITHUB_ACTOR}"
git config --global user.email "${GITHUB_ACTOR}@users.noreply.${INPUT_ORGANIZATION_DOMAIN}"

get_current_branch() {
local branch
branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || true)
if [[ "${branch}" == "HEAD" ]]; then
branch=""
fi
printf '%s' "${branch}"
}

# Get changed files
git add -A
FILES_CHANGED=$(git diff --staged --name-status)
Expand All @@ -40,84 +49,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="$(get_current_branch)"
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:-$(get_current_branch)}"
# 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 +186,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