setup_hook()
{
hook_call="\"\$(tg --hooks-path)\"/$1 \"\$@\""
- if fgrep -q "$hook_call" "$git_dir/hooks/$1"; then
+ if [ -f "$git_dir/hooks/$1" ] &&
+ fgrep -q "$hook_call" "$git_dir/hooks/$1"; then
# Another job well done!
return
fi
{
echo "#!/bin/sh"
echo "$hook_call"
- cat "$git_dir/hooks/$1"
+ [ ! -s "$git_dir/hooks/$1" ] || cat "$git_dir/hooks/$1"
} >"$git_dir/hooks/$1+"
chmod a+x "$git_dir/hooks/$1+"
mv "$git_dir/hooks/$1+" "$git_dir/hooks/$1"
# Whether B1 is a superset of B2.
branch_contains()
{
- [ "$(git rev-list ^"$1" "$2" | wc -l)" -eq 0 ]
+ [ -z "$(git rev-list ^"$1" "$2")" ]
}
# needs_update NAME [BRANCHPATH...]
# to the branch (e.g. B_DIRTY B1 B2 NAME), one path per line,
# inner paths first. Innermost name can be ':' if the head is
# not in sync with the base.
+# It will also return non-zero status if NAME needs update.
+# If needs_update() hits missing dependencies, it will append
+# them to space-separated $missing_deps list and skip them.
needs_update()
{
- {
- git cat-file blob "$1:.topdeps" 2>/dev/null |
+ git cat-file blob "$1:.topdeps" 2>/dev/null | {
+ _ret=0
while read _dep; do
+ if !git rev-parse --verify "$_dep" >/dev/null 2>&1; then
+ # All hope is lost
+ missing_deps="$missing_deps $_dep"
+ continue
+ fi
+
_dep_is_tgish=1
git rev-parse --verify "refs/top-bases/$_dep" >/dev/null 2>&1 ||
_dep_is_tgish=
# Shoo shoo, keep our environment alone!
- [ -z "$_dep_is_tgish" ] || (needs_update "$_dep" "$@")
+ [ -z "$_dep_is_tgish" ] ||
+ (needs_update "$_dep" "$@") ||
+ _ret=$?
_dep_base_uptodate=1
if [ -n "$_dep_is_tgish" ]; then
if [ -z "$_dep_base_uptodate" ]; then
# _dep needs to be synced with its base
echo ": $_dep $*"
+ _ret=1
elif ! branch_contains "refs/top-bases/$1" "$_dep"; then
# Some new commits in _dep
echo "$_dep $*"
+ _ret=1
fi
done
- } || : # $1 is not tracked by TopGit anymore
+ exit $_ret
+ }
+}
+
+# branch_empty NAME
+branch_empty()
+{
+ [ -z "$(git diff-tree "refs/top-bases/$1" "$1" | fgrep -v " .top")" ]
}
# switch_to_base NAME [SEED]
case "$cmd" in
help)
- echo "TopGit - A different patch queue manager"
+ echo "TopGit v0.1 - A different patch queue manager"
echo "Usage: tg (create|delete|info|patch|summary|update|help) ..."
exit 1;;
create|delete|info|patch|summary|update)