sh: add commit propagator tool
This commit is contained in:
parent
83921d1788
commit
776a6ca1e4
@ -35,5 +35,7 @@ in
|
||||
mkdir -p $out/share/man/man1
|
||||
cp garlic.1 $out/share/man/man1
|
||||
cp garlic-git-table $out/bin
|
||||
patchShebangs garlic-propagate-commit
|
||||
cp garlic-propagate-commit $out/bin
|
||||
'';
|
||||
}
|
||||
|
63
garlic/sh/garlic-propagate-commit
Executable file
63
garlic/sh/garlic-propagate-commit
Executable file
@ -0,0 +1,63 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
function printHelp()
|
||||
{
|
||||
>&2 echo "Usage: garlic-propagate-commit <COMMIT-ID>"
|
||||
>&2 echo
|
||||
cat >&2 <<EOF
|
||||
This tool uses the given commit and adds it to each branch and then pushes them
|
||||
to the remote repository. It is useful to propagate the same change to every
|
||||
branch.
|
||||
|
||||
Ensure that you don't have changes in your working copy or the index without
|
||||
adding to a commit.
|
||||
|
||||
Use with caution!
|
||||
EOF
|
||||
}
|
||||
|
||||
function branchContainsCommit()
|
||||
{
|
||||
if [[ `git branch $1 --contains $2 2>/dev/null | sed 's/^..//'` == $1 ]]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
if [ $# -lt 1 ]; then
|
||||
printHelp
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Obtain all the tracked branches
|
||||
branches=(`git branch | sed 's/^..//'`)
|
||||
currentBranch=`git rev-parse --abbrev-ref HEAD`
|
||||
|
||||
# Make sure that the commit SHA exists
|
||||
commit=$1
|
||||
if branchContainsCommit $currentBranch $commit; then
|
||||
echo "Commit $commit exists in current branch, proceeding..."
|
||||
else
|
||||
echo "Error: Commit $commit does not exist in the current branch"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Distribute the commit for all tracked branches
|
||||
for branch in ${branches[@]};
|
||||
do
|
||||
if [[ $branch != $currentBranch ]]; then
|
||||
echo "Trying to add commit $commit to branch $branch"
|
||||
if branchContainsCommit $branch $commit; then
|
||||
echo "Branch $branch already contains commit $commit, skipping"
|
||||
else
|
||||
git checkout $branch
|
||||
git cherry-pick $commit
|
||||
git push
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Return to the original branch
|
||||
git checkout $currentBranch
|
Loading…
Reference in New Issue
Block a user