X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topgit.git;a=blobdiff_plain;f=tg-patch.sh;h=d701c5440705a609e833e10503f05441e61d1b1c;hp=ac8a744432a40b5c6a3f367eb21079a4c691cdb1;hb=HEAD;hpb=737a9fa9de0ca7610457c2b4ed514b650668beda diff --git a/tg-patch.sh b/tg-patch.sh index ac8a744..d701c54 100644 --- a/tg-patch.sh +++ b/tg-patch.sh @@ -5,14 +5,25 @@ name= +topic= +diff_opts= +diff_committed_only=yes # will be unset for index/worktree + ## Parse options while [ -n "$1" ]; do arg="$1"; shift case "$arg" in + -i) + topic='(i)' + diff_opts="$diff_opts --cached"; + diff_committed_only=;; + -w) + topic='(w)' + diff_committed_only=;; -*) - echo "Usage: tg patch [NAME]" >&2 + echo "Usage: tg [...] patch [-i | -w] [NAME]" >&2 exit 1;; *) [ -z "$name" ] || die "name already specified ($name)" @@ -20,27 +31,40 @@ while [ -n "$1" ]; do esac done -[ -n "$name" ] || name="$(git symbolic-ref HEAD | sed 's#^refs/heads/##')" + +[ -n "$name" -a -z "$diff_committed_only" ] && + die "-i/-w are mutually exclusive with NAME" + +[ -n "$name" ] || name="$(git symbolic-ref HEAD | sed 's#^refs/\(heads\|top-bases\)/##')" base_rev="$(git rev-parse --short --verify "refs/top-bases/$name" 2>/dev/null)" || die "not a TopGit-controlled branch" -git cat-file blob "$name:.topmsg" +# if not index/worktree, topic is current branch +[ -z "$topic" ] && topic="$name" + + + +setup_pager + +cat_file "$topic:.topmsg" echo -[ -n "$(git grep '^[-]--' "$name" -- ".topmsg")" ] || echo '---' +[ -n "$(git grep $diff_opts '^[-]--' ${diff_committed_only:+"$name"} -- ".topmsg")" ] || echo '---' # Evil obnoxious hack to work around the lack of git diff --exclude -git_is_stupid="$(mktemp)" -git diff-tree --name-only "$base_rev" "$name" | +git_is_stupid="$(mktemp -t tg-patch-changes.XXXXXX)" +git diff --name-only $diff_opts "$base_rev" ${diff_committed_only:+"$name"} -- | fgrep -vx ".topdeps" | fgrep -vx ".topmsg" >"$git_is_stupid" || : # fgrep likes to fail randomly? if [ -s "$git_is_stupid" ]; then - cat "$git_is_stupid" | xargs git diff --patch-with-stat "$base_rev" "$name" -- + cat "$git_is_stupid" | xargs git diff --patch-with-stat $diff_opts "$base_rev" ${diff_committed_only:+"$name"} -- else echo "No changes." fi rm "$git_is_stupid" echo '-- ' -echo "tg: ($base_rev..) $name (depends on $(git cat-file blob "$name:.topdeps" | paste -s -d ,))" +echo "tg: ($base_rev..) $name (depends on: $(cat_file "$topic:.topdeps" | paste -s -d' '))" branch_contains "$name" "$base_rev" || - echo "tg: The patch is out-of-date wrt. the base! Run \`tg update\`." + echo "tg: The patch is out-of-date wrt. the base! Run \`$tg update\`." + +# vim:noet