All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Weber <marco-oweber@gmx.de>
To: git@vger.kernel.org
Subject: Re: [PATCH] topgit tg push feature
Date: Mon, 11 May 2009 23:06:14 +0200	[thread overview]
Message-ID: <20090511210614.GA6118@gmx.de> (raw)
In-Reply-To: <20090511195532.GA28340@pengutronix.de>

Thanks to Bert Wesarg, Uwe Kleine-König and Martin f Krafft the
patch is finally ready to be comitted (?) I included ukleineks last
nitpicks.

ukleinek, usage line: remote2 = just another remote location.

Marc Weber

commit 0bfa198a3cae72d75ca1311bb7a8d495ca2b42cc
Author: Marc Weber <marco-oweber@gmx.de>
Date:   Mon May 11 23:04:20 2009 +0200

    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..5df5073
--- /dev/null
+++ b/tg-push.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+# TopGit - A different patch queue manager
+# GPLv2
+
+remotes="$base_remote" # honor -r flag of the tg command
+
+## Parse options see README
+
+recurse_deps=true
+tgish_deps_only=false
+dry_run=
+
+while [ -n "$1" ]; do
+	arg="$1"; shift
+	case "$arg" in
+	--no-deps)
+		recurse_deps=false;;
+	--dry-run)
+		dry_run=--dry-run;;
+	--tgish-only)
+		tgish_deps_only=true;;
+	-h|--help)
+		echo "Usage: tg [-r remote] push [--dry-run] [--no-deps] [--tgish-only] [-r "remote2 remote3"]* branch*"
+		exit 0;;
+	-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 $name"
+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
+        git push $dry_run "$remote" $list
+	done
+done
diff --git a/tg.sh b/tg.sh
index 0804f73..7d98dbd 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
@@ -366,6 +366,8 @@ help|--help|-h)
 --hooks-path)
 	# Internal command
 	echo "@hooksdir@";;
+eval)
+	eval "$@";;
 *)
 	[ -r "@cmddir@"/tg-$cmd ] || {
 		echo "Unknown subcommand: $cmd" >&2

  reply	other threads:[~2009-05-11 21:06 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
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 [this message]
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=20090511210614.GA6118@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.