chiark / gitweb /
cat_file: take -i/-w parameters
[topgit.git] / tg.sh
diff --git a/tg.sh b/tg.sh
index f1b323b7cbe543994f373523ab2b84b814fd0adc..c77898678cdd275783746b0567a6de7edb905192 100644 (file)
--- 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
 }
@@ -199,7 +204,7 @@ recurse_deps()
        _name="$1"; # no shift
        _depchain="$*"
 
-       _depsfile="$(mktemp -t tg-depsfile.XXXXXX)"
+       _depsfile="$(get_temp tg-depsfile)"
        # If no_remotes is unset check also our base against remote base.
        # Checking our head against remote head has to be done in the helper.
        if test -z "$no_remotes" && has_remote "top-bases/$_name"; then
@@ -232,7 +237,6 @@ recurse_deps()
                eval "$_cmd"
        done <"$_depsfile"
        missing_deps="${missing_deps# }"
-       rm "$_depsfile"
        return $_ret
 }
 
@@ -383,19 +387,28 @@ setup_pager()
        # now spawn pager
        export LESS="${LESS:-FRSX}"     # as in pager.c:pager_preexec()
 
-       _pager_fifo_dir="$(mktemp -t -d tg-pager-fifo.XXXXXX)"
-       _pager_fifo="$_pager_fifo_dir/0"
-       mkfifo -m 600 "$_pager_fifo"
+       # setup_pager should be called only once per command
+       pager_fifo="$tg_tmp_dir/pager"
+       mkfifo -m 600 "$pager_fifo"
 
-       "$TG_PAGER" < "$_pager_fifo" &
-       exec > "$_pager_fifo"           # dup2(pager_fifo.in, 1)
+       "$TG_PAGER" < "$pager_fifo" &
+       exec > "$pager_fifo"            # dup2(pager_fifo.in, 1)
 
        # this is needed so e.g. `git diff` will still colorize it's output if
        # requested in ~/.gitconfig with color.diff=auto
        export GIT_PAGER_IN_USE=1
 
        # atexit(close(1); wait pager)
-       trap "exec >&-; rm \"$_pager_fifo\"; rmdir \"$_pager_fifo_dir\"; wait" EXIT
+       # deliberately overwrites the global EXIT trap
+       trap "exec >&-; rm -rf \"$tg_tmp_dir\"; wait" EXIT
+}
+
+# get_temp NAME [-d]
+# creates a new temporary file (or directory with -d) in the global
+# temporary directory $tg_tmp_dir with pattern prefix NAME
+get_temp()
+{
+       mktemp ${2-} "$tg_tmp_dir/$1.XXXXXX"
 }
 
 ## Startup
@@ -415,6 +428,9 @@ tg="tg"
 # make sure merging the .top* files will always behave sanely
 setup_ours
 setup_hook "pre-commit"
+# create global temporary directories, inside GIT_DIR
+tg_tmp_dir="$(mktemp -d "$git_dir/tg-tmp.XXXXXX")"
+trap "rm -rf \"$tg_tmp_dir\"" EXIT
 
 ## Dispatch