git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [GUILT][RFC] Autotagging
@ 2007-03-10  4:46 Josef 'Jeff' Sipek
  2007-03-10  4:46 ` [PATCH 1/2] Automatically create unannotated tags for top, bottom, and base of the stack Josef 'Jeff' Sipek
  2007-03-10  4:46 ` [PATCH 2/2] Autotag: Read guilt.autotag config var and tag commits only if this feature is enabled Josef 'Jeff' Sipek
  0 siblings, 2 replies; 3+ messages in thread
From: Josef 'Jeff' Sipek @ 2007-03-10  4:46 UTC (permalink / raw)
  To: git

Greetings all!

Recently, it has been brought to my attention that it would be nice to be
able to refer to the top/bottom/base of the patch stack in Guilt by a name
instead of fishing around the log for the hash. I quickly coded up the
following solution (which I call "autotagging"), which creates unannotated
tags for the top (topmost applied patch), bottom (first applied patch), and
base (parent of bottom) in with this naming scheme:

	${branch}_top
	${branch}_bottom
	${branch}_base

The branch name is necessary as each branch has its own series of patches,
and potentially different history to begin with.

Of course, I included an option to disable this feature (see patch 2) - just
set guilt.autotag=0 in your git config.

Before I merge this into Guilt master, I was hoping for some feedback. Just
in case I completely missed something obvious, or perhaps there is a better
way to name the branches :)

Thanks,

Josef "Jeff" Sipek.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] Automatically create unannotated tags for top, bottom, and base of the stack
  2007-03-10  4:46 [GUILT][RFC] Autotagging Josef 'Jeff' Sipek
@ 2007-03-10  4:46 ` Josef 'Jeff' Sipek
  2007-03-10  4:46 ` [PATCH 2/2] Autotag: Read guilt.autotag config var and tag commits only if this feature is enabled Josef 'Jeff' Sipek
  1 sibling, 0 replies; 3+ messages in thread
From: Josef 'Jeff' Sipek @ 2007-03-10  4:46 UTC (permalink / raw)
  To: git; +Cc: Josef 'Jeff' Sipek

On every push or pop operation (refresh is a pop followed by a push), update
the stack top (${branch}_top), stack bottom (${branch}_bottom), and stack
base (${branch}_base) tags.

Top:	Topmost applied patch/commit
Bottom:	Bottommost applied patch/commit
Base:	Commit on top of which the bottom most patch is applied

Having these three tags, one can easily get the log/diff/other information
only for commits that are (or are not!) part of the patch stack.

Signed-off-by: Josef 'Jeff' Sipek <jsipek@cs.sunysb.edu>
---
 guilt |   34 ++++++++++++++++++++++++++++++++--
 1 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/guilt b/guilt
index 43e7842..3dbe4b6 100755
--- a/guilt
+++ b/guilt
@@ -277,6 +277,33 @@ function pop_many_patches
 	mv "$applied.tmp" "$applied"
 
 	cd - 2>&1 >/dev/null
+
+	# update references to top, bottom, and base
+	update_stack_tags
+}
+
+# usage: update_stack_tags
+function update_stack_tags
+{
+	if [ `wc -l < $applied` -gt 0 ]; then
+		# there are patches applied, therefore we must get the top,
+		# bottom and base hashes, and update the tags
+
+		local top_hash=`git-rev-parse HEAD`
+		local bottom_hash=`head -1 < $applied | cut -d: -f1`
+		local base_hash=`git-rev-parse $bottom_hash^`
+
+		echo $top_hash > "$GIT_DIR/refs/tags/${branch}_top"
+		echo $bottom_hash > "$GIT_DIR/refs/tags/${branch}_bottom"
+		echo $base_hash > "$GIT_DIR/refs/tags/${branch}_base"
+	else
+		# there are no patches applied, therefore we must remove the
+		# tags to old top, bottom, and base
+
+		rm -f "$GIT_DIR/refs/tags/${branch}_top"
+		rm -f "$GIT_DIR/refs/tags/${branch}_bottom"
+		rm -f "$GIT_DIR/refs/tags/${branch}_base"
+	fi
 }
 
 # usage: push_patch patchname [bail_action]
@@ -349,6 +376,11 @@ function push_patch
 	# mark patch as applied
 	echo "$commitish:$pname" >> $applied
 
+	cd - 2>&1 >/dev/null
+
+	# update references to top, bottom, and base of the stack
+	update_stack_tags
+
 	# restore original GIT_AUTHOR_{NAME,EMAIL}
 	if [ ! -z "$author_str" ]; then
 		if [ ! -z "$backup_author_name" ]; then
@@ -376,8 +408,6 @@ function push_patch
 
 	rm -f /tmp/guilt.msg.$$ /tmp/guilt.log.$$
 
-	cd - 2>&1 >/dev/null
-
 	return $bail
 }
 
-- 
1.5.0.3.268.g3dda

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] Autotag: Read guilt.autotag config var and tag commits only if this feature is enabled
  2007-03-10  4:46 [GUILT][RFC] Autotagging Josef 'Jeff' Sipek
  2007-03-10  4:46 ` [PATCH 1/2] Automatically create unannotated tags for top, bottom, and base of the stack Josef 'Jeff' Sipek
@ 2007-03-10  4:46 ` Josef 'Jeff' Sipek
  1 sibling, 0 replies; 3+ messages in thread
From: Josef 'Jeff' Sipek @ 2007-03-10  4:46 UTC (permalink / raw)
  To: git; +Cc: Josef 'Jeff' Sipek

Some users may not want to have guilt automatically tag the top, bottom, and
base of the stack. Allow them to disable such functionality by setting
guilt.autotag=0 in their git config file.

guilt-init now accepts a new parameter '-n' to automatically set
guilt.autotag=0 in the current repository.

Signed-off-by: Josef 'Jeff' Sipek <jsipek@cs.sunysb.edu>
---
 Documentation/guilt-init.txt |    8 +++++++-
 guilt                        |   15 +++++++++++++++
 guilt-init                   |   15 ++++++++++++---
 3 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/Documentation/guilt-init.txt b/Documentation/guilt-init.txt
index e643668..a245c6e 100644
--- a/Documentation/guilt-init.txt
+++ b/Documentation/guilt-init.txt
@@ -8,12 +8,18 @@ guilt-init - Initialize guilt for use in a git repository
 
 SYNOPSIS
 --------
-'guilt-init' 
+'guilt-init [-n]' 
 
 DESCRIPTION
 -----------
 Initialize a git repository for use with guilt
 
+OPTIONS
+-------
+-n::
+	Do not automatically create stack top, bottom, and base tags (sets
+	guilt.autotag config variable to 0).
+
 EXAMPLES
 --------
 First, get a repository to work on. Here's one that we'll use as an example:
diff --git a/guilt b/guilt
index 3dbe4b6..e7c22d2 100755
--- a/guilt
+++ b/guilt
@@ -285,6 +285,11 @@ function pop_many_patches
 # usage: update_stack_tags
 function update_stack_tags
 {
+	# bail if autotagging is not enabled
+	if [ $autotag -eq 0 ]; then
+		return 0
+	fi
+
 	if [ `wc -l < $applied` -gt 0 ]; then
 		# there are patches applied, therefore we must get the top,
 		# bottom and base hashes, and update the tags
@@ -480,12 +485,22 @@ function munge_hash_range
 	fi
 }
 
+#
 # Some constants
+#
 
 # used for: git-apply -C <val>
 guilt_push_diff_context=1
 
 #
+# Parse any part of .git/config that belongs to us
+#
+
+# autotag?
+autotag=`git-config guilt.autotag`
+[ -z "$autotag" ] && autotag=1
+
+#
 # The following gets run every time this file is source'd
 #
 
diff --git a/guilt-init b/guilt-init
index 1277998..feacf95 100755
--- a/guilt-init
+++ b/guilt-init
@@ -5,11 +5,19 @@
 
 DO_NOT_CHECK_BRANCH_EXISTENCE=1
 
+USAGE="[-n]"
 . guilt
 
-if [ $# -ne 0 ]; then
-	usage
-fi
+autotag=1
+
+while case $# in 0) break ;; esac; do
+	if [ "$1" = "-n" ]; then
+		autotag=0
+		shift
+	else
+		usage
+	fi
+done
 
 if [ -d "$GUILT_DIR/$branch" ]; then
 	die "Branch $branch appears to be already initialized (GIT_DIR=$GIT_DIR)"
@@ -20,3 +28,4 @@ mkdir $GUILT_DIR/$branch
 touch $GUILT_DIR/$branch/series
 touch $GUILT_DIR/$branch/status
 
+git-config --int --replace-all guilt.autotag $autotag
-- 
1.5.0.3.268.g3dda

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-03-10  4:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-03-10  4:46 [GUILT][RFC] Autotagging Josef 'Jeff' Sipek
2007-03-10  4:46 ` [PATCH 1/2] Automatically create unannotated tags for top, bottom, and base of the stack Josef 'Jeff' Sipek
2007-03-10  4:46 ` [PATCH 2/2] Autotag: Read guilt.autotag config var and tag commits only if this feature is enabled Josef 'Jeff' Sipek

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).