Merge branch 'jc/stash-create'

* jc/stash-create:
  git-stash: Fix listing stashes
  git-merge: no reason to use cpio anymore
  Revert "rebase: allow starting from a dirty tree."
  rebase: allow starting from a dirty tree.
  stash: implement "stash create"
This commit is contained in:
Junio C Hamano 2007-11-14 14:05:47 -08:00
commit 5e389c430d
2 changed files with 31 additions and 14 deletions

View File

@ -28,20 +28,19 @@ allow_trivial_merge=t
dropsave() { dropsave() {
rm -f -- "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/MERGE_MSG" \ rm -f -- "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/MERGE_MSG" \
"$GIT_DIR/MERGE_SAVE" || exit 1 "$GIT_DIR/MERGE_STASH" || exit 1
} }
savestate() { savestate() {
# Stash away any local modifications. # Stash away any local modifications.
git diff-index -z --name-only $head | git stash create >"$GIT_DIR/MERGE_STASH"
cpio -0 -o >"$GIT_DIR/MERGE_SAVE"
} }
restorestate() { restorestate() {
if test -f "$GIT_DIR/MERGE_SAVE" if test -f "$GIT_DIR/MERGE_STASH"
then then
git reset --hard $head >/dev/null git reset --hard $head >/dev/null
cpio -iuv <"$GIT_DIR/MERGE_SAVE" git stash apply $(cat "$GIT_DIR/MERGE_STASH")
git update-index --refresh >/dev/null git update-index --refresh >/dev/null
fi fi
} }
@ -437,7 +436,7 @@ case "$use_strategies" in
single_strategy=no single_strategy=no
;; ;;
*) *)
rm -f "$GIT_DIR/MERGE_SAVE" rm -f "$GIT_DIR/MERGE_STASH"
single_strategy=yes single_strategy=yes
;; ;;
esac esac

View File

@ -21,23 +21,17 @@ no_changes () {
clear_stash () { clear_stash () {
if current=$(git rev-parse --verify $ref_stash 2>/dev/null) if current=$(git rev-parse --verify $ref_stash 2>/dev/null)
then then
git update-ref -d refs/stash $current git update-ref -d $ref_stash $current
fi fi
} }
save_stash () { create_stash () {
stash_msg="$1" stash_msg="$1"
if no_changes if no_changes
then then
echo >&2 'No local changes to save'
exit 0 exit 0
fi fi
test -f "$GIT_DIR/logs/$ref_stash" ||
clear_stash || die "Cannot initialize stash"
# Make sure the reflog for stash is kept.
: >>"$GIT_DIR/logs/$ref_stash"
# state of the base commit # state of the base commit
if b_commit=$(git rev-parse --verify HEAD) if b_commit=$(git rev-parse --verify HEAD)
@ -84,6 +78,23 @@ save_stash () {
w_commit=$(printf '%s\n' "$stash_msg" | w_commit=$(printf '%s\n' "$stash_msg" |
git commit-tree $w_tree -p $b_commit -p $i_commit) || git commit-tree $w_tree -p $b_commit -p $i_commit) ||
die "Cannot record working tree state" die "Cannot record working tree state"
}
save_stash () {
stash_msg="$1"
if no_changes
then
echo >&2 'No local changes to save'
exit 0
fi
test -f "$GIT_DIR/logs/$ref_stash" ||
clear_stash || die "Cannot initialize stash"
create_stash "$stash_msg"
# Make sure the reflog for stash is kept.
: >>"$GIT_DIR/logs/$ref_stash"
git update-ref -m "$stash_msg" $ref_stash $w_commit || git update-ref -m "$stash_msg" $ref_stash $w_commit ||
die "Cannot save the current status" die "Cannot save the current status"
@ -202,6 +213,13 @@ apply)
clear) clear)
clear_stash clear_stash
;; ;;
create)
if test $# -gt 0 && test "$1" = create
then
shift
fi
create_stash "$*" && echo "$w_commit"
;;
help | usage) help | usage)
usage usage
;; ;;