This changes the way how cat_file selects the source of the file. It accepts an optional parameter which is either -i or -w and will react on this instead of the branch name. tg-patch is updated accordingly and can now accepts the current branch name as argument with -i or -w given. cat_file was also broken for the worktree case when we are not in the top level. Also, tg-patch allowed to be on the top-base branch, but -i and -w doesn't make sense there too. Signed-off-by: Bert Wesarg <bert.wesarg@xxxxxxxxxxxxxx> --- I will probably never understand why TopGit accepts to be on a top-base branch. I will probably never understand why TopGit not changes the cwd to the top level. I will probably never understand why TopGit does not use the git-sh-setup.sh. --- tg-patch.sh | 25 ++++++++++++++----------- tg.sh | 27 +++++++++++++++------------ 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/tg-patch.sh b/tg-patch.sh index 7bafdfe..5b7386a 100644 tg-patch.sh --- a/tg-patch.sh +++ b/tg-patch.sh @@ -5,7 +5,7 @@ name= -topic= +head_from= diff_opts= diff_committed_only=yes # will be unset for index/worktree @@ -16,11 +16,13 @@ while [ -n "$1" ]; do arg="$1"; shift case "$arg" in -i) - topic='(i)' + [ -z "$head_from" ] || die "-i and -w are mutually exclusive" + head_from=-i diff_opts="$diff_opts --cached"; diff_committed_only=;; -w) - topic='(w)' + [ -z "$head_from" ] || die "-i and -w are mutually exclusive" + head_from=-w diff_committed_only=;; -*) echo "Usage: tg [...] patch [-i | -w] [NAME]" >&2 @@ -31,22 +33,23 @@ while [ -n "$1" ]; do esac done +head="$(git symbolic-ref HEAD)" +head="${head#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\)/##')" +[ -n "$name" ] || + name="$head" base_rev="$(git rev-parse --short --verify "refs/top-bases/$name" 2>/dev/null)" || die "not a TopGit-controlled branch" -# if not index/worktree, topic is current branch -[ -z "$topic" ] && topic="$name" +if [ -n "$head_from" ] && [ "$name" != "$head" ]; then + die "$head_from makes only sense for the current branch" +fi setup_pager -cat_file "$topic:.topmsg" +cat_file "$name:.topmsg" $head_from echo [ -n "$(git grep $diff_opts '^[-]--' ${diff_committed_only:+"$name"} -- ".topmsg")" ] || echo '---' @@ -64,7 +67,7 @@ fi rm "$git_is_stupid" echo '-- ' -echo "tg: ($base_rev..) $name (depends on: $(cat_file "$topic:.topdeps" | paste -s -d' '))" +echo "tg: ($base_rev..) $name (depends on: $(cat_file "$name:.topdeps" $head_from | paste -s -d' '))" branch_contains "$name" "$base_rev" || echo "tg: The patch is out-of-date wrt. the base! Run \`$tg update\`." diff --git a/tg.sh b/tg.sh index 3718702..4d7d4ef 100644 tg.sh --- a/tg.sh +++ b/tg.sh @@ -18,24 +18,27 @@ die() exit 1 } -# cat_file "topic:file" -# Like `git cat-file blob $1`, but topics '(i)' and '(w)' means index and worktree +# cat_file TOPIC:PATH FROM +# cat the file PATH from branch TOPIC when FROM is empty. +# FROM can be -i or -w, than the file will be from the index or worktree, +# respectively. The caller should than ensure that HEAD is TOPIC, to make sense. cat_file() { - arg="$1" - case "$arg" in - '(w):'*) - arg=$(echo "$arg" | tail --bytes=+5) - cat "$arg" - return + path="$1" + case "${2-}" in + -w) + cat "$root_dir/${path#*:}" ;; - '(i):'*) + -i) # ':file' means cat from index - arg=$(echo "$arg" | tail --bytes=+5) - git cat-file blob ":$arg" + git cat-file blob ":${path#*:}" + ;; + '') + git cat-file blob "$path" ;; *) - git cat-file blob "$arg" + die "Wrong argument to cat_file: '$2'" + ;; esac } -- 1.7.1.1067.g5aeb7 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html