Skip to content

Instantly share code, notes, and snippets.

@chrisjacob
Forked from dchest/post-update
Created February 3, 2011 13:15
Show Gist options
  • Save chrisjacob/809454 to your computer and use it in GitHub Desktop.
Save chrisjacob/809454 to your computer and use it in GitHub Desktop.

Revisions

  1. @dchest dchest created this gist Nov 27, 2009.
    79 changes: 79 additions & 0 deletions post-update
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,79 @@
    #!/bin/sh
    #
    # Post-update hook to checkout working copy and publish it with jekyll
    #
    # To enable this hook, make this file executable by "chmod +x post-update".

    git-update-server-info

    is_bare=$(git-config --get --bool core.bare)

    if [ -z "$is_bare" ]
    then
    # for compatibility's sake, guess
    git_dir_full=$(cd $GIT_DIR; pwd)
    case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
    fi

    update_wc() {
    ref=$1
    echo "Push to checked out branch $ref" >&2
    if [ ! -f $GIT_DIR/logs/HEAD ]
    then
    echo "E:push to non-bare repository requires a HEAD reflog" >&2
    exit 1
    fi
    if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null)
    then
    wc_dirty=0
    else
    echo "W:unstaged changes found in working copy" >&2
    wc_dirty=1
    desc="working copy"
    fi
    if git diff-index --cached HEAD@{1} >/dev/null
    then
    index_dirty=0
    else
    echo "W:uncommitted, staged changes found" >&2
    index_dirty=1
    if [ -n "$desc" ]
    then
    desc="$desc and index"
    else
    desc="index"
    fi
    fi
    if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
    then
    new=$(git rev-parse HEAD)
    echo "W:stashing dirty $desc - see git-stash(1)" >&2
    ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
    git-update-ref --no-deref HEAD HEAD@{1}
    cd $GIT_WORK_TREE
    git stash save "dirty $desc before update to $new";
    git-symbolic-ref HEAD "$ref"
    )
    fi

    # eye candy - show the WC updates :)
    echo "Updating working copy" >&2
    (cd $GIT_WORK_TREE
    git-diff-index -R --name-status HEAD >&2
    git-reset --hard HEAD)
    }

    if [ "$is_bare" = "false" ]
    then
    active_branch=`git-symbolic-ref HEAD`
    export GIT_DIR=$(cd $GIT_DIR; pwd)
    GIT_WORK_TREE=${GIT_WORK_TREE-..}
    for ref
    do
    if [ "$ref" = "$active_branch" ]
    then
    update_wc $ref
    cd $GIT_WORK_TREE && jekyll >&2
    fi
    done
    fi