File: atomic_push.sh

package info (click to toggle)
opensearch 2.4.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 109,808 kB
  • sloc: java: 1,199,376; sh: 963; xml: 379; python: 73; perl: 66; makefile: 11
file content (55 lines) | stat: -rwxr-xr-x 1,591 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/env bash
set -e -o pipefail

if [ "$#" -eq 0 ]; then
    printf 'Usage: %s <origin> <branch> <branch> ...\n' "$(basename "$0")"
    exit 0;
fi

REMOTE="$1"

if ! git ls-remote --exit-code "${REMOTE}" > /dev/null 2>&1; then
    echo >&2 "Remote '${REMOTE}' is not valid."
    exit 1;
fi

if [ "$#" -lt 3 ]; then
    echo >&2 "You must specify at least two branchs to push."
    exit 1;
fi

if ! git diff-index --quiet HEAD -- ; then
    echo >&2 "Found uncommitted changes in working copy."
    exit 1;
fi

ATOMIC_COMMIT_DATE="$(date)"

for BRANCH in "${@:2}"
do
    echo "Validating branch '${BRANCH}'..."
    
    # Vailidate that script arguments are valid local branch names
    if ! git show-ref --verify --quiet "refs/heads/${BRANCH}"; then
        echo >&2 "No such branch named '${BRANCH}'."
        exit 1;
    fi
    
    # Pull and rebase all branches to ensure we've incorporated any new upstream commits
    git checkout --quiet ${BRANCH}
    git pull "${REMOTE}" --rebase --quiet
    
    PENDING_COMMITS=$(git log ${REMOTE}/${BRANCH}..HEAD --oneline | grep "^.*$" -c || true)
    
    # Ensure that there is exactly 1 unpushed commit in the branch
    if [ "${PENDING_COMMITS}" -ne 1 ]; then
        echo >&2 "Expected exactly 1 pending commit for branch '${BRANCH}' but ${PENDING_COMMITS} exist."
        exit 1;
    fi
    
    # Amend HEAD commit to ensure all branch commit dates are the same
    GIT_COMMITTER_DATE="${ATOMIC_COMMIT_DATE}" git commit --amend --no-edit --quiet
done

echo "Pushing to remote '${REMOTE}'..."
git push --atomic "${REMOTE}" "${@:2}"