git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] topgit tg push feature

From
MWMarc Weber <marco-oweber@gmx.de>
Date
May 11, 2009, 03:28 UTC
Message-ID
<20090511032813.GA15540@gmx.de>
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
Previous: Marc WeberNext: martin f krafft
Message 10 of 22 in “topgit tg push feature”
  1. topgit tg push featureMarc Weber, Apr 25, 2009
  2. Marc WeberApr 25, 2009
  3. Marc WeberMay 5, 2009
  4. Marc WeberMay 7, 2009
  5. Bert WesargMay 7, 2009
  6. Uwe Kleine-KönigMay 7, 2009
  7. Bert WesargMay 7, 2009
  8. martin f krafftMay 9, 2009
  9. Marc WeberMay 9, 2009
  10. Marc WeberMay 11, 2009
  11. martin f krafftMay 11, 2009
  12. martin f krafftMay 11, 2009
  13. Uwe Kleine-KönigMay 11, 2009
  14. Marc WeberMay 11, 2009
  15. martin f krafftMay 11, 2009
  16. Uwe Kleine-KönigMay 12, 2009
  17. Bert WesargMay 12, 2009
  18. Marc WeberMay 12, 2009
  19. Bert WesargMay 12, 2009
  20. Uwe Kleine-KönigMay 12, 2009
  21. tg-remote: don't add push specs but warn about existing ones.Uwe Kleine-König, May 13, 2009
  22. martin f krafftMay 13, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.