git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jon Seymour <jon.seymour@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, ams@toroid.org, nanako3@bluebottle.com,
	Jon Seymour <jon.seymour@gmail.com>
Subject: [PATCH v3 2/9] stash: extract stash-like check into its own function
Date: Sun,  8 Aug 2010 14:46:04 +1000	[thread overview]
Message-ID: <1281242771-24764-3-git-send-email-jon.seymour@gmail.com> (raw)
In-Reply-To: <1281242771-24764-1-git-send-email-jon.seymour@gmail.com>

A similar code block is used in three places; this change
factors the stash-like check into a separate function so that
it can be used in these and other places.

Note to reviewers: The existing code in apply_stash appears
to assume w_tree, b_tree and i_tree are all trees as opposed
to tree-ish (which is what they actually are).

This refactoring does not change the existing derivation,
but one wonders whether this difference might be subverting
the intent of the test which compares c_tree with i_tree.

Signed-off-by: Jon Seymour <jon.seymour@gmail.com>
---
 git-stash.sh |   46 ++++++++++++++++++++++++++++++----------------
 1 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/git-stash.sh b/git-stash.sh
index 31ea333..dbb7944 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -218,13 +218,30 @@ show_stash () {
 		flags=--stat
 	fi
 
-	w_commit=$(git rev-parse --quiet --verify --default $ref_stash "$@") &&
-	b_commit=$(git rev-parse --quiet --verify "$w_commit^") ||
-		die "'$*' is not a stash"
+	assert_stash_like "$@"
 
 	git diff $flags $b_commit $w_commit
 }
 
+#
+# if this function returns, then:
+#   s is set to the stash commit
+#   w_commit is set to the commit containing the working tree
+#   b_commit is set to the base commit
+#   i_commit is set to the commit containing the index tree
+# otherwise:
+#   the function exits via die
+#
+assert_stash_like() {
+	# stash records the work tree, and is a merge between the
+	# base commit (first parent) and the index tree (second parent).
+	s=$(git rev-parse --revs-only --quiet --verify --default $ref_stash "$@") &&
+	w_commit=$(git rev-parse --quiet --verify "$s:") &&
+	b_commit=$(git rev-parse --quiet --verify "$s^1:") &&
+	i_commit=$(git rev-parse --quiet --verify "$s^2:") ||
+		die "$*: no valid stashed state found"
+}
+
 apply_stash () {
 	applied_stash=
 	unstash_index=
@@ -253,13 +270,11 @@ apply_stash () {
 		applied_stash="$*"
 	fi
 
-	# stash records the work tree, and is a merge between the
-	# base commit (first parent) and the index tree (second parent).
-	s=$(git rev-parse --quiet --verify --default $ref_stash "$@") &&
-	w_tree=$(git rev-parse --quiet --verify "$s:") &&
-	b_tree=$(git rev-parse --quiet --verify "$s^1:") &&
-	i_tree=$(git rev-parse --quiet --verify "$s^2:") ||
-		die "$*: no valid stashed state found"
+	assert_stash_like "$@"
+
+	b_tree=$b_commit
+	w_tree=$w_commit
+	i_tree=$i_commit
 
 	git update-index -q --refresh &&
 	git diff-files --quiet --ignore-submodules ||
@@ -270,6 +285,9 @@ apply_stash () {
 		die 'Cannot apply a stash in the middle of a merge'
 
 	unstashed_index_tree=
+	#
+	# note to reviewers: comparing $c_tree to $i_tree seems unsound, since i_tree is only tree-ish
+	#
 	if test -n "$unstash_index" && test "$b_tree" != "$i_tree" &&
 			test "$c_tree" != "$i_tree"
 	then
@@ -351,12 +369,8 @@ drop_stash () {
 		set x "$ref_stash@{0}"
 		shift
 	fi
-	# Verify supplied argument looks like a stash entry
-	s=$(git rev-parse --verify "$@") &&
-	git rev-parse --verify "$s:"   > /dev/null 2>&1 &&
-	git rev-parse --verify "$s^1:" > /dev/null 2>&1 &&
-	git rev-parse --verify "$s^2:" > /dev/null 2>&1 ||
-		die "$*: not a valid stashed state"
+
+	assert_stash_like "$@"
 
 	git reflog delete --updateref --rewrite "$@" &&
 		say "Dropped $* ($s)" || die "$*: Could not drop stash entry"
-- 
1.7.2.1.51.g82c0c0

  parent reply	other threads:[~2010-08-08  4:47 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-08  4:46 [PATCH v3 0/9] stash: modifiy handling of stash-like references Jon Seymour
2010-08-08  4:46 ` [PATCH v3 1/9] stash: refactor - create pop_stash function Jon Seymour
2010-08-08  4:46 ` Jon Seymour [this message]
2010-08-08  4:46 ` [PATCH v3 3/9] stash: introduce is_stash_ref and assert_stash_ref functions Jon Seymour
2010-08-08  4:46 ` [PATCH v3 4/9] stash: teach git stash pop to fail early if the argument is not a stash ref Jon Seymour
2010-08-08  4:46 ` [PATCH v3 5/9] stash: teach git stash drop to fail early if the specified revision is not a stash reference Jon Seymour
2010-08-08  4:46 ` [PATCH v3 6/9] stash: teach git stash branch to tolerate stash-like arguments Jon Seymour
2010-08-08  4:46 ` [PATCH v3 7/9] stash: teach git stash show to always " Jon Seymour
2010-08-08  4:46 ` [PATCH v3 8/9] t3903-stash.sh: tests of git stash with " Jon Seymour
2010-08-08  9:32   ` Johannes Sixt
2010-08-08 12:56     ` Jon Seymour
2010-08-08  4:46 ` [PATCH v3 9/9] Documentation: git stash branch now tolerates non-stash references Jon Seymour
2010-08-08 13:18   ` Jon Seymour
2010-08-10  0:04 ` [PATCH v4 0/9] stash: modifiy handling of stash-like references Jon Seymour
2010-08-10  0:04 ` [PATCH v4 1/9] stash: refactor - create pop_stash function Jon Seymour
2010-08-10  0:04 ` [PATCH v4 2/9] stash: extract stash-like check into its own function Jon Seymour
2010-08-13  0:49   ` Junio C Hamano
2010-08-13 23:55     ` Jon Seymour
2010-08-10  0:04 ` [PATCH v4 3/9] stash: introduce is_stash_ref and assert_stash_ref functions Jon Seymour
2010-08-13  0:49   ` Junio C Hamano
2010-08-14  0:26     ` Jon Seymour
2010-08-10  0:04 ` [PATCH v4 4/9] stash: teach git stash pop to fail early if the argument is not a stash ref Jon Seymour
2010-08-10  0:04 ` [PATCH v4 5/9] stash: teach git stash drop to fail early if the specified revision is not a stash reference Jon Seymour
2010-08-10  0:04 ` [PATCH v4 6/9] stash: teach git stash branch to tolerate stash-like arguments Jon Seymour
2010-08-10  0:04 ` [PATCH v4 7/9] stash: teach git stash show to always " Jon Seymour
2010-08-13  0:49   ` Junio C Hamano
2010-08-10  0:04 ` [PATCH v4 8/9] t3903-stash.sh: tests of git stash with " Jon Seymour
2010-08-10  0:04 ` [PATCH v4 9/9] Documentation: git stash branch now tolerates non-stash references Jon Seymour
2010-08-13  0:49   ` Junio C Hamano
2010-08-14  0:30     ` Jon Seymour

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=1281242771-24764-3-git-send-email-jon.seymour@gmail.com \
    --to=jon.seymour@gmail.com \
    --cc=ams@toroid.org \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=nanako3@bluebottle.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).