From: Sam Vilain <sam.vilain@catalyst.net.nz>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Sam Vilain <sam.vilain@catalyst.net.nz>
Subject: [PATCH] post-update hook: update working copy
Date: Fri, 2 Nov 2007 13:45:04 +1300 [thread overview]
Message-ID: <1193964304-10847-1-git-send-email-sam.vilain@catalyst.net.nz> (raw)
Now that git-stash is available, it is not so unsafe to push to a
non-bare repository, but care needs to be taken to preserve any dirty
working copy or index state. This hook script does that, using
git-stash.
Signed-off-by: Sam Vilain <sam.vilain@catalyst.net.nz>
---
templates/hooks--post-update | 76 ++++++++++++++++++++++++++++++++++++++++--
1 files changed, 73 insertions(+), 3 deletions(-)
mode change 100644 => 100755 templates/hooks--post-update
diff --git a/templates/hooks--post-update b/templates/hooks--post-update
old mode 100644
new mode 100755
index bcba893..352a432
--- a/templates/hooks--post-update
+++ b/templates/hooks--post-update
@@ -1,8 +1,78 @@
#!/bin/sh
#
-# An example hook script to prepare a packed repository for use over
-# dumb transports.
+# This hook does two things:
+#
+# 1. update the "info" files that allow the list of references to be
+# queries over dumb transports such as http
+#
+# 2. if this repository looks like it is a non-bare repository, and
+# the checked-out branch is pushed to, then update the working copy.
+# This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update".
-exec git-update-server-info
+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 (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 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)
+ git-update-ref --no-deref HEAD HEAD@{1}
+ echo "W:stashing dirty $desc - see git-stash(1)" >&2
+ (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
+ fi
+ done
+fi
--
1.5.3.2.3.g2f2dcc-dirty
next reply other threads:[~2007-11-02 0:45 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-02 0:45 Sam Vilain [this message]
2007-11-02 1:02 ` [PATCH] post-update hook: update working copy Junio C Hamano
2007-11-02 3:36 ` Sam Vilain
2007-11-02 8:49 ` Junio C Hamano
2007-11-02 10:34 ` Andreas Ericsson
2007-11-02 17:28 ` Steven Grimm
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1193964304-10847-1-git-send-email-sam.vilain@catalyst.net.nz \
--to=sam.vilain@catalyst.net.nz \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).