From 9b25e8482c536324a6ecdefdf8abc1c0b1dca83e Mon Sep 17 00:00:00 2001 From: Bert Wesarg Date: Wed, 20 Oct 2010 22:17:47 +0200 Subject: [PATCH] cat_file: take -i/-w parameters MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Uwe Kleine-König --- hooks/pre-commit.sh | 2 +- tg-patch.sh | 25 ++++++++++++++----------- tg.sh | 23 ++++++++++++++--------- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/hooks/pre-commit.sh b/hooks/pre-commit.sh index c52a268..9519560 100644 --- a/hooks/pre-commit.sh +++ b/hooks/pre-commit.sh @@ -97,7 +97,7 @@ BEGIN { in_hunk = 0; } # check for repetitions of deps depdir="$(get_temp tg-depdir -d)" || die "Can't check for multiple occurrences of deps" -cat_file "(i):.topdeps" | +cat_file "$head_:.topdeps" -i | while read dep; do [ ! -d "$depdir/$dep" ] || die "Multiple occurrences of the same dep: $dep" diff --git a/tg-patch.sh b/tg-patch.sh index 68efcf0..85346ec 100644 --- 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 '---' @@ -63,7 +66,7 @@ else fi 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 72dc534..c778986 100644 --- a/tg.sh +++ b/tg.sh @@ -18,21 +18,26 @@ 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):'*) - cat "${arg#(w):}" + path="$1" + case "${2-}" in + -w) + cat "$root_dir/${path#*:}" ;; - '(i):'*) + -i) # ':file' means cat from index - git cat-file blob "${arg#(i)}" + git cat-file blob ":${path#*:}" + ;; + '') + git cat-file blob "$path" ;; *) - git cat-file blob "$arg" + die "Wrong argument to cat_file: '$2'" ;; esac } -- 2.11.4.GIT