exit 1
}
+# Make sure we are in the worktree, not under .git; die otherwise
+ensure_git_repo_or_die()
+{
+ local is_inside_repo is_inside_git_dir
+ is_inside_repo=1
+ is_inside_git_dir=$(git rev-parse --is-inside-git-dir 2>/dev/null) ||
+ is_inside_repo=0
+
+ case "$is_inside_repo/$is_inside_git_dir" in
+ 0*) die "Cannot run outside of a Git repository.";;
+ 1/true) die "Cannot run from inside \`.git\` hierarchy, please switch to work-tree.";;
+ esac
+}
+
# cat_file "topic:file"
# Like `git cat-file blob $1`, but topics '(i)' and '(w)' means index and worktree
cat_file()
# Whether B1 is a superset of B2.
branch_contains()
{
- [ -z "$(git rev-list ^"$1" "$2" --)" ]
+ [ -z "$(git rev-list --max-count=1 ^"$1" "$2" --)" ]
}
# ref_exists REF
[ -n "$base_remote" ] && ref_exists "remotes/$base_remote/$1"
}
+ branch_annihilated()
+ {
+ _name="$1";
+
+ # use the merge base in case the base is ahead.
+ mb="$(git merge-base "refs/top-bases/$_name" "$_name")";
+
+ test "$(git rev-parse "$mb^{tree}")" = "$(git rev-parse "$_name^{tree}")";
+ }
+
# recurse_deps CMD NAME [BRANCHPATH...]
# Recursively eval CMD on all dependencies of NAME.
# CMD can refer to $_name for queried branch name,
if has_remote "top-bases/$_name"; then
echo "refs/remotes/$base_remote/top-bases/$_name" >>"$_depsfile"
fi
- git cat-file blob "$_name:.topdeps" >>"$_depsfile"
+
+ # if the branch was annihilated, there exists no .topdeps file
+ if ! branch_annihilated "$_name"; then
+ #TODO: handle nonexisting .topdeps?
+ git cat-file blob "$_name:.topdeps" >>"$_depsfile";
+ fi;
_ret=0
while read _dep; do
[ -d "@cmddir@" ] ||
die "No command directory: '@cmddir@'"
+ensure_git_repo_or_die
+
## Initial setup
set -e