diff --git a/README b/README index d2f095d..f90a7b3 100644 --- a/README +++ b/README @@ -480,6 +480,13 @@ tg update TODO: tg update -a for updating all topic branches +tg push +~~~~~~~ + git push remote branch doesn't push the base. + git push remote pushes all branches (and bases) + You use tg push [-r] to push only the current branch [ and deps] with + its base to a remote location. + TODO: tg rename diff --git a/tg-push.sh b/tg-push.sh new file mode 100644 index 0000000..0f8c964 --- /dev/null +++ b/tg-push.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# TopGit - A different patch queue manager +# GPLv2 + +recurse= +remotes= + + +## Parse options + +while [ -n "$1" ]; do + arg="$1"; shift + case "$arg" in + -r) + recurse=1;; + *) + remotes="$remotes $arg";; + esac +done + +if [ -z "$remotes" ]; then + remotes="$(git config topgit.remote 2>/dev/null)" +fi + +if [ -z "$remotes" ]; then + die "no remote location given. Either add a remote as additional argument or set topgit.remote" +fi + +name="$(git symbolic-ref HEAD | sed 's#^refs/heads/##')" +ref_exists "$name" || die "detached HEAD? Can't push that" + +push_branch(){ + [ -z "${_dep##*remotes/*}" -o -z "$_dep_is_tgish" ] && return # don't push remotes + echo "$_dep" >> "$to_be_pushed" + base="top-bases/$_dep" + if ref_exists "$base"; then + echo "top-bases/$_dep" >> "$to_be_pushed" + else + echo "warning, no base found $base" + fi +} + +to_be_pushed="$(mktemp -t tg-depsfile.XXXXXX)" +trap 'rm -rf "$to_be_pushed"' EXIT + +for remote in $remotes; do + : > $to_be_pushed # empty file + + if [ -n "$recurse" ]; then + recurse_deps push_branch "$name" + fi + _dep="$name" + _dep_is_tgish=1 + push_branch + echo git push $remote `cat $to_be_pushed` + git push $remote `cat $to_be_pushed` +done diff --git a/tg-push.txt b/tg-push.txt new file mode 100644 index 0000000..de9b259 --- /dev/null +++ b/tg-push.txt @@ -0,0 +1,3 @@ + push branch and base. If you also use -r all tgish dependencies + will be pushed as well. + Use tg push remoteA remoteB to push to remoteA and remoteB locations