{
if [ ! -s "$git_dir/info/attributes" ] || ! grep -q topmsg "$git_dir/info/attributes"; then
{
- echo -e ".topmsg\tmerge=ours"
- echo -e ".topdeps\tmerge=ours"
+ echo ".topmsg merge=ours"
+ echo ".topdeps merge=ours"
} >>"$git_dir/info/attributes"
fi
if ! git config merge.ours.driver >/dev/null; then
[ -z "$(git rev-list ^"$1" "$2")" ]
}
+# ref_exists REF
+# Whether REF is a valid ref name
+ref_exists()
+{
+ git rev-parse --verify "$@" >/dev/null 2>&1
+}
+
# recurse_deps CMD NAME [BRANCHPATH...]
# Recursively eval CMD on all dependencies of NAME.
# CMD can refer to $_name for queried branch name,
_cmd="$1"; shift
_name="$1"; # no shift
_depchain="$*"
- _depsfile="$(mktemp)"
+ _depsfile="$(mktemp -t tg-depsfile.XXXXXX)"
git cat-file blob "$_name:.topdeps" >"$_depsfile"
_ret=0
while read _dep; do
- if ! git rev-parse --verify "$_dep" >/dev/null 2>&1; then
+ if ! ref_exists "$_dep" ; 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 ||
+ ref_exists "refs/top-bases/$_dep" ||
_dep_is_tgish=
# Shoo shoo, keep our environment alone!
[ -z "$_dep_is_tgish" ] ||
- (needs_update "$_cmd" "$_dep" "$@") ||
+ (recurse_deps "$_cmd" "$_dep" "$@") ||
_ret=$?
eval "$_cmd"
# _dep needs to be synced with its base
echo ": $_dep $_depchain"
_ret=1
- elif ! branch_contains "refs/top-bases/$_name" "$_dep"; then
+ elif [ -n "$_name" ] && ! branch_contains "refs/top-bases/$_name" "$_dep"; then
# Some new commits in _dep
echo "$_dep $_depchain"
_ret=1
sep="|"
done
- echo "TopGit v0.1 - A different patch queue manager"
+ echo "TopGit v0.2 - A different patch queue manager"
echo "Usage: tg ($cmds|help) ..."
elif [ -r "@sharedir@/tg-$1.txt" ] ; then
cat "@sharedir@/tg-$1.txt"
set -e
git_dir="$(git rev-parse --git-dir)"
root_dir="$(git rev-parse --show-cdup)"; root_dir="${root_dir:-.}"
+base_remote="$(git config topgit.remote 2>/dev/null)" || :
# make sure merging the .top* files will always behave sanely
setup_ours
setup_hook "pre-commit"