6 Commits

Author SHA1 Message Date
Ivan Malopinsky 2da11516b4 1.6.1 2016-03-22 22:20:19 -04:00
Ivan Malopinsky e735f44727 integrated testing mode 2016-03-22 22:20:14 -04:00
Ivan Malopinsky 8f40e82492 1.6.0 2016-03-22 22:02:03 -04:00
Ivan Malopinsky da4e21fe5c add remote testing 2016-03-22 22:01:24 -04:00
Ivan Malopinsky 01a44ddc7c replace spaces with NULs for xargs -0 2016-03-09 22:45:08 -05:00
Ivan Malopinsky 0702c3a67b only run remote commands if remote is present, rework rebase/reset 2016-03-09 22:38:49 -05:00
3 changed files with 58 additions and 25 deletions
+56 -23
View File
@@ -39,12 +39,12 @@ die () {
}
error () {
die "error on line $1"
die "Error on line $1: $(head -n $1 $0 | tail -1)"
}
trap 'error $LINENO' ERR
while getopts ":fmrtslF" opt; do
while getopts ":fmrtslFT" opt; do
case $opt in
f)
FORCE_DELETE_STALE=true
@@ -67,6 +67,9 @@ while getopts ":fmrtslF" opt; do
F)
FORCE_LOCAL_RESET=true
;;
T)
TEST=true
;;
*)
usage
break
@@ -76,6 +79,22 @@ done
shift $((OPTIND-1))
# Are we in testing mode?
if [[ $TEST = true ]]; then
PATH=$(pwd):$PATH
TEST_DIR=/tmp/git-fresh-test
mkdir -p $TEST_DIR; cd $TEST_DIR
git init; touch test; git add test; git commit -am 'test'
git checkout -b test; rm test; git commit -am 'delete test'
git checkout master; git merge test; git checkout test
git-fresh -fr; rm -rf $TEST_DIR
exit 0
fi
# Are we inside a git repository?
INSIDE_GIT_REPO=$(git rev-parse --is-inside-work-tree 2> /dev/null)
@@ -88,16 +107,15 @@ fi
TOP_LEVEL_DIRECTORY=$(git rev-parse --show-toplevel)
[[ $(ls -l "$TOP_LEVEL_DIRECTORY/.git/refs/heads" | wc -l) -eq "1" ]] && die "No HEAD ref available"
[[ $(ls -1 "$TOP_LEVEL_DIRECTORY/.git/refs/heads" | wc -l | xargs) -eq "0" ]] && die "No HEAD ref available"
CURRENT=$(git rev-parse --abbrev-ref HEAD)
REMOTE=${1:-origin}
ROOT=${2:-master}
# Update remotes and prune stale remotes
git remote update
git remote prune $REMOTE
if [[ $(git remote -v | wc -l) -gt "0" ]]; then
REMOTES=true
fi
STASH_STAMP=git-fresh-$(date +%s)
@@ -107,23 +125,36 @@ if ! git diff-files --quiet; then
git stash save $STASH_STAMP
fi
# If the current branch exists on the remote, rebase against it
if [[ $REMOTES = true ]]; then
REMOTE_CURRENT=$(git ls-remote $REMOTE --heads 2> /dev/null | grep "heads/$CURRENT$" | cat)
# Update remotes and prune stale remotes
git remote update
git remote prune $REMOTE
# If the current branch exists on the remote, rebase against it
REMOTE_CURRENT=$(git ls-remote $REMOTE --heads 2> /dev/null | grep "heads/$CURRENT$" | cat)
if [[ ! -z "$REMOTE_CURRENT" ]]; then
git rebase $REMOTE $CURRENT
fi
if [[ ! -z "$REMOTE_CURRENT" ]]; then
git rebase $REMOTE $CURRENT
fi
# Switch to root branch (master)
git checkout $ROOT > /dev/null 2>&1
if [[ "$FORCE_LOCAL_RESET" = true ]]; then
git clean -dfx
git reset --hard $REMOTE/$ROOT
else
git rebase -q $REMOTE/$ROOT
if [[ $REMOTES = true ]]; then
if [[ "$FORCE_LOCAL_RESET" = true ]]; then
git clean -dfx
git reset --hard $REMOTE $ROOT
else
git rebase -q $REMOTE $ROOT
fi
fi
# Compute stale branches
@@ -140,7 +171,7 @@ if [[ ! -z "${SMART_STALE// }" ]]; then
if [[ ! -z "${LOCAL_STALE// }" ]]; then
STALE_BRANCHES=true
if [[ "$FORCE_DELETE_STALE" = true ]]; then
echo -n $LOCAL_STALE | xargs -0 git branch -d 2> /dev/null
echo -n $LOCAL_STALE | tr " " "\0" | xargs -0 git branch -d 2> /dev/null
else
say "Local stale branches found:" $(echo -n $LOCAL_STALE | tr "\n" " ")
fi
@@ -150,7 +181,7 @@ if [[ ! -z "${SMART_STALE// }" ]]; then
STALE_BRANCHES=true
if [[ "$FORCE_DELETE_STALE" = true ]]; then
if [[ "$DELETE_ONLY_LOCAL" != true ]]; then
echo -n $REMOTE_STALE | xargs -0 git push $REMOTE --delete
echo -n $REMOTE_STALE | tr " " "\0" | xargs -0 git push $REMOTE --delete
fi
else
say "Remote stale branches found:" $(echo -n $REMOTE_STALE | tr "\n" " ")
@@ -170,12 +201,14 @@ if [[ ! -z $(git rev-parse --verify --quiet "$CURRENT") ]]; then
if [ "$REBASE" = true ] && [ "$MERGE" = true ]; then
say "Rebase and merge enabled, skipping both"
else
if [[ "$REBASE" = true ]]; then
git rebase $REMOTE/$ROOT
fi
if [[ "$REMOTES" = true ]]; then
if [[ "$REBASE" = true ]]; then
git rebase $REMOTE $ROOT
fi
if [[ "$MERGE" = true ]]; then
git merge --no-edit $REMOTE/$ROOT
if [[ "$MERGE" = true ]]; then
git merge --no-edit $REMOTE $ROOT
fi
fi
fi
else
View File
+2 -2
View File
@@ -1,8 +1,8 @@
{
"name": "git-fresh",
"version": "1.5.0",
"version": "1.6.1",
"description": "Utility to keep Git repositories fresh",
"global": true,
"repo": "imsky/git-fresh",
"install": "sudo ./install"
"install": "sudo ./install.sh"
}