From: Marc Weber <marco-oweber@gmx.de>
To: git@vger.kernel.org
Subject: Re: [PATCH] topgit tg push feature
Date: Mon, 11 May 2009 05:28:13 +0200 [thread overview]
Message-ID: <20090511032813.GA15540@gmx.de> (raw)
In-Reply-To: <20090509190910.GA9655@gmx.de>
Feedback to Berts reply:
> tg-push first. And where is the --dry-run option?
fixed: added -h|--help option
>This phrase needs rewording, what about: "its deps, both their tgish
>and non-tgish ones."
fixed, used Uwes text.
It looks like this now:
$tg push remote
to push the current branch, its deps and, both their tgish
and non-tgish ones. You may add --no-deps and or --tgish-only
to change this default behaviour. Use these only if you know what you
are doing. They are only present for the sake of completeness.
>now i see why you have the Usage: in the README. common practice is to
>print the usage if an unknown option was given. see all the other
>tg-*.sh scripts.
fixed: see -h|--help above. tg export lists the Usage as well in the README. (-> other topic)
>How effetcts the tg -r REMOTE option this command. Or more exactly why
>doesn't have this option an effect here?
laziness. I thought about that myself. Its fixed now. Usage looks like this:
Usage: tg push [(--dry-run | --no-deps | --tgish-only)] [-r "remote remote2"]* branch*
> the common error message is: "not a TopGit-controlled branch".
:-) The point about this is: You can use
$tg push -r "remote1 remote2" non-tgish-branch1 non-tgish-branch2.
tg push will note that it can't find remotes but it'll push those branches.
So you can "abuse" tg push to push normal branches to multiple remote
locations.
> why not pass the --dry-run option to git remote?
git remote -> git push:
I added --dry-run so that I can see the list of branches which would be pushed
if I had not used --dry-run. It isn't that important that's why I missed adding
it to Usage as well.
Feedback to Uwe Klein Koenigs mail:
> I'd like to have a bit more prose. Something like:
fixed/misus
> maybe extend the comment to something like:
> # if a remote is used ('topgit.remote' configuration variable or
> # tg -r $remote, a tg-base implicitly depends on
> # refs/remotes/$remote/top-bases/$_dep. Don't push these.
> You could even test if this is a dependency as described in this
> comment. Didn't test it, but something like
> test "x$_dep" = "xrefs/remotes/$base_remote/top-bases/$_name"
> could do the trick.
I've extended the recurse_deps function reading from the global var
no_remotes now. It's still ugly but less verbose and more intuitive than
adding long comments
> > + [ -z "$tgish_deps_only" ] || [ -n "$_dep_is_tgish" ] || return 0
>I've always problems to understand these constructs. Are these any
>better than
... :-) *lol* You proposed using them :-)
I do have a vary hard time reading writing them as well.
I have to use boolean algebra to wrap my head around those constructs.
> > + echo "$_dep"
> > + local base="top-bases/$_dep"
> > + if ref_exists "$base"; then
> > + echo "top-bases/$_dep"
> > + else
> > + echo "warning, no base found $base" 1>&2
> > + fi
>mmh, I wonder why you need to do the top-bases explicitly. recurse_deps
>doesn't that for you?
Have a closer look at that function, please:
"
has_remote "top-bases/$_name" && [ -z "$no_remotes" ] &&
echo "refs/remotes/$base_remote/top-bases/$_name" >>"$_depsfile"
[..]
ref_exists "refs/top-bases/$_dep" ||
"
are all occurrences of top-bases. And both only do checks (or push remotes)
Feedback to Berts 2nd reply:
>I also like the true/false style, its also useable with the current 'scheme':
> $tgish_deps_only && ...
great idea. true/false are sh builtins. adopted. I still prefer
[ foo -a bar ]; or [ foo -o bar ]; for readability.
Sincerly
Marc Weber
commit cdab940eefc0a56e0daa8b270bace1aba00a3b57
Author: Marc Weber <marco-oweber@gmx.de>
Date: Mon May 11 05:25:40 2009 +0200
t/tg-push
add tg-push pushing the branch, its deps and their bases
Signed-off-by: Marc Weber <marco-oweber@gmx.de>
diff --git a/.gitignore b/.gitignore
index eb56446..2f6d991 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,6 +21,8 @@
/tg-import.txt
/tg-remote
/tg-remote.txt
+/tg-push
+/tg-push.txt
/tg
.*.swp
diff --git a/README b/README
index d2f095d..495c70b 100644
--- a/README
+++ b/README
@@ -480,6 +480,12 @@ tg update
TODO: tg update -a for updating all topic branches
+tg push
+~~~~~~~
+ pushes a TopGit-controlled topic branch to a remote
+ repository. By default the remote gets all dependencies
+ (both tgish and non-tgish) and bases pushed to.
+
TODO: tg rename
diff --git a/tg-push.sh b/tg-push.sh
new file mode 100644
index 0000000..0fa7854
--- /dev/null
+++ b/tg-push.sh
@@ -0,0 +1,82 @@
+#!/bin/sh
+# TopGit - A different patch queue manager
+# GPLv2
+
+remotes=
+
+## Parse options see README
+
+recurse_deps=true
+tgish_deps_only=false
+dry_run=false
+
+while [ -n "$1" ]; do
+ arg="$1"; shift
+ case "$arg" in
+ --no-deps)
+ recurse_deps=false;;
+ --dry-run)
+ dry_run=true;;
+ --tgish-only)
+ tgish_deps_only=true;;
+ -h|--help)
+ echo "Usage: tg push [(--dry-run | --no-deps | --tgish-only)] [-r "remote remote2"]* branch*"
+ exit 1;;
+ -r)
+ remotes="$remotes $1"
+ shift
+ ;;
+ *)
+ branches="$branches $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 use -r remote argument or set topgit.remote"
+fi
+
+if [ -z "$branches" ]; then
+ branches="$(git symbolic-ref HEAD | sed 's#^refs/heads/##')"
+fi
+
+for name in $branches; do
+ ref_exists "$name" || die "detached HEAD? Can't push that"
+done
+
+push_branch(){
+ # if so desired omit non tgish deps
+ $tgish_deps_only && [ -z "$_dep_is_tgish" ] && return 0
+
+ echo "$_dep"
+ local base="top-bases/$_dep"
+ if ref_exists "$base"; then
+ echo "top-bases/$_dep"
+ else
+ echo "warning, no base found $base" 1>&2
+ fi
+}
+
+for remote in $remotes; do
+ for name in $branches; do
+ list="$(
+ # deps
+ if $recurse_deps; then
+ no_remotes=1 recurse_deps push_branch "$name"
+ fi
+ # current branch
+ _dep="$name"
+ _dep_is_tgish=1
+ push_branch "$name"
+ )"
+ echo "pushing:"; echo $list
+ if $dry_run; then
+ echo git push $remote $list
+ else
+ git push $remote $list
+ fi
+ done
+done
diff --git a/tg.sh b/tg.sh
index 0804f73..94f38f4 100644
--- a/tg.sh
+++ b/tg.sh
@@ -136,6 +136,7 @@ branch_annihilated()
# of the whole function.
# If recurse_deps() hits missing dependencies, it will append
# them to space-separated $missing_deps list and skip them.
+# set no_remotes to any value to omit remote dependencies (-> tg push)
recurse_deps()
{
_cmd="$1"; shift
@@ -145,9 +146,8 @@ recurse_deps()
_depsfile="$(mktemp -t tg-depsfile.XXXXXX)"
# Check also our base against remote base. Checking our head
# against remote head has to be done in the helper.
- if has_remote "top-bases/$_name"; then
+ has_remote "top-bases/$_name" && [ -z "$no_remotes" ] &&
echo "refs/remotes/$base_remote/top-bases/$_name" >>"$_depsfile"
- fi
# if the branch was annihilated, there exists no .topdeps file
if ! branch_annihilated "$_name"; then
next prev parent reply other threads:[~2009-05-11 3:28 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-25 16:13 [PATCH] topgit tg push feature Marc Weber
2009-04-25 16:34 ` Marc Weber
2009-05-05 9:34 ` Marc Weber
2009-05-07 4:59 ` Marc Weber
2009-05-07 5:45 ` Bert Wesarg
2009-05-07 8:43 ` Uwe Kleine-König
2009-05-07 9:50 ` Bert Wesarg
2009-05-09 10:36 ` martin f krafft
2009-05-09 19:09 ` Marc Weber
2009-05-11 3:28 ` Marc Weber [this message]
2009-05-11 7:25 ` martin f krafft
2009-05-11 7:47 ` martin f krafft
2009-05-11 19:55 ` Uwe Kleine-König
2009-05-11 21:06 ` Marc Weber
2009-05-11 21:39 ` martin f krafft
2009-05-12 5:13 ` Uwe Kleine-König
2009-05-12 6:22 ` Bert Wesarg
2009-05-12 7:54 ` Marc Weber
2009-05-12 8:55 ` Bert Wesarg
2009-05-12 9:02 ` Uwe Kleine-König
2009-05-13 10:04 ` [PATCH] tg-remote: don't add push specs but warn about existing ones Uwe Kleine-König
2009-05-13 11:42 ` martin f krafft
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090511032813.GA15540@gmx.de \
--to=marco-oweber@gmx.de \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.