chiark
/
gitweb
/
~ian
/
topgit.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
tg-files: simplify arg checking and add sanity check for -i/-w
[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
}
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()
{
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
# ':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
}
;;
esac
}
@@
-199,7
+204,7
@@
recurse_deps()
_name="$1"; # no shift
_depchain="$*"
_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
# 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# }"
eval "$_cmd"
done <"$_depsfile"
missing_deps="${missing_deps# }"
- rm "$_depsfile"
return $_ret
}
return $_ret
}
@@
-383,19
+387,28
@@
setup_pager()
# now spawn pager
export LESS="${LESS:-FRSX}" # as in pager.c:pager_preexec()
# 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)
# 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
}
## Startup
@@
-415,6
+428,9
@@
tg="tg"
# make sure merging the .top* files will always behave sanely
setup_ours
setup_hook "pre-commit"
# 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
## Dispatch