git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [TopGit PATCH 1/2] Factor out the template generation for the .topmsg file
@ 2008-08-08 18:19 Bert Wesarg
  2008-08-08 18:19 ` [TopGit PATCH 2/2] tg-import.sh: A dump quilt queue importer Bert Wesarg
  0 siblings, 1 reply; 4+ messages in thread
From: Bert Wesarg @ 2008-08-08 18:19 UTC (permalink / raw)
  To: Petr Baudis; +Cc: Bert Wesarg, git

Provide a function for the .topmsg template file.

Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>

---
 tg-create.sh |   29 ++---------------------------
 tg.sh        |   30 ++++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/tg-create.sh b/tg-create.sh
index d47959b..e30a014 100644
--- a/tg-create.sh
+++ b/tg-create.sh
@@ -100,33 +100,8 @@ git checkout -b "$name"
 echo "$deps" | sed 's/ /\n/g' >"$root_dir/.topdeps"
 git add "$root_dir/.topdeps"
 
-# Print each config value for a key ($1, without "topgit." prefix)
-# with the given prefix ($2)
-get_multi_config()
-{
-	# escape any / in prefix for sed
-	prefix="$(echo "$2" | sed -e 's/\//\\\\\//g')"
-
-	git config --get-all topgit.$1 2>/dev/null |
-		sed -e "s/^/$prefix /g"
-}
-
-author="$(git var GIT_AUTHOR_IDENT)"
-author_addr="${author%> *}>"
-{
-	echo "From: $author_addr"
-	get_multi_config to  "To:"
-	get_multi_config cc  "Cc:"
-	get_multi_config bcc "Bcc:"
-	! subject_prefix="$(git config topgit.subjectprefix)" || subject_prefix="$subject_prefix "
-	echo "Subject: [${subject_prefix}PATCH] $name"
-	echo
-	cat <<EOT
-<patch description>
-
-Signed-off-by: $author_addr
-EOT
-} >"$root_dir/.topmsg"
+echo "<patch description>" |
+	make_topmsg "$name" >"$root_dir/.topmsg"
 git add "$root_dir/.topmsg"
 
 
diff --git a/tg.sh b/tg.sh
index 03a392b..8384b79 100644
--- a/tg.sh
+++ b/tg.sh
@@ -148,6 +148,36 @@ switch_to_base()
 	git symbolic-ref HEAD "$_base"
 }
 
+# Print each config value for a key ($1, without "topgit." prefix)
+# with the given prefix ($2)
+get_multi_config()
+{
+	# escape any / in prefix for sed
+	prefix="$(echo "$2" | sed -e 's/\//\\\\\//g')"
+
+	git config --get-all topgit.$1 2>/dev/null |
+		sed -e "s/^/$prefix /g"
+}
+
+# Make initial .topmsg template with content from stdin
+# optional first argument is subject line
+make_topmsg()
+{
+	author="$(git var GIT_AUTHOR_IDENT)"
+	author_addr="${author%> *}>"
+
+	echo "From: $author_addr"
+	get_multi_config to  "To:"
+	get_multi_config cc  "Cc:"
+	get_multi_config bcc "Bcc:"
+	! subject_prefix="$(git config topgit.subjectprefix)" || subject_prefix="$subject_prefix "
+	echo "Subject: [${subject_prefix}PATCH] $1"
+	echo
+	cat
+	echo
+	echo "Signed-off-by: $author_addr"
+}
+
 # Show the help messages.
 do_help()
 {
-- 
tg: (2a28314..) t/make-.topmsg-gen-a-function (depends on: t/support-for-multiple-to-cc-bcc-options)

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [TopGit PATCH 2/2] tg-import.sh: A dump quilt queue importer
  2008-08-08 18:19 [TopGit PATCH 1/2] Factor out the template generation for the .topmsg file Bert Wesarg
@ 2008-08-08 18:19 ` Bert Wesarg
  2008-08-09  0:57   ` Petr Baudis
  0 siblings, 1 reply; 4+ messages in thread
From: Bert Wesarg @ 2008-08-08 18:19 UTC (permalink / raw)
  To: Petr Baudis; +Cc: Bert Wesarg, git

A simple, non smart, quilt importer.

Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>

---
 .gitignore   |    2 +
 Makefile     |    3 +-
 README       |   15 ++++++++
 tg-import.sh |  115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 134 insertions(+), 1 deletions(-)

diff --git a/.gitignore b/.gitignore
index 6f0727f..5f1831b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,8 @@ tg-create
 tg-create.txt
 tg-delete
 tg-delete.txt
+tg-import
+tg-import.txt
 tg-info
 tg-info.txt
 tg-patch
diff --git a/Makefile b/Makefile
index dba5f20..671beab 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,8 @@ sharedir = $(PREFIX)/share/topgit
 hooksdir = $(cmddir)/hooks
 
 
-commands_in = tg-create.sh tg-delete.sh tg-info.sh tg-patch.sh tg-summary.sh tg-update.sh
+commands_in = tg-create.sh tg-delete.sh tg-info.sh tg-patch.sh tg-summary.sh \
+              tg-update.sh tg-import.sh
 hooks_in = hooks/pre-commit.sh
 
 commands_out = $(patsubst %.sh,%,$(commands_in))
diff --git a/README b/README
index dc0045f..3fc6d18 100644
--- a/README
+++ b/README
@@ -275,6 +275,21 @@ tg update
 
 	TODO: tg update -a for updating all topic branches
 
+tg import
+~~~~~~~~~
+	Import a quilt queue into TopGit. First argument is the series
+	file from quilt. Second is the prefix for the topic names
+	(i.e. "t/"). All remaining arguments are the dependencies for
+	the first patch in the series. Use '-s' if you want to strip
+	common patch suffixes from the patch file name (like .diff and
+	.patch).
+
+	TODO: be smart (merge conflicts, patch rejects, ...)
+	TODO: be interactive, let the user edit .topmsg for first commit
+	TODO: be resumable
+	TODO: use a dependency file, for creating non linear dependencies
+	      of the patches (maybe generated from quilt graph)
+
 TODO: Some infrastructure for sharing topic branches between
 	repositories easily
 TODO: tg depend for adding/removing dependencies smoothly
diff --git a/tg-import.sh b/tg-import.sh
new file mode 100644
index 0000000..f9403b9
--- /dev/null
+++ b/tg-import.sh
@@ -0,0 +1,115 @@
+#!/bin/sh
+# TopGit - A different patch queue manager
+# (c) Petr Baudis <pasky@suse.cz>  2008
+# (c) Bert Wesarg <Bert.Wesarg@googlemail.com>  2008
+# GPLv2
+
+series= # series file of patch queue
+prefix= # prefix for branch names (i.e. "t/")
+strip_suffixes= # strip suffixes like .{diff,patch}
+
+## Parse options
+
+while [ -n "$1" ]; do
+	arg="$1"
+	case "$arg" in
+	-s)
+		strip_suffixes=1
+		shift;;
+	-*)
+		echo "Usage: tg import [-s] SERIES PREFIX [DEPS...]" >&2
+		exit 1;;
+	*)
+		break;;
+	esac
+done
+
+series="$1"
+prefix="$2"
+shift 2
+# remaining args in "$@" are deps for first patch
+
+# check series file for existens and reading
+[ -r "$series" ] ||
+	die "can't read series file '$series'"
+
+# get dir of series file
+dir="$(dirname "$series")" ||
+	die "can't parse dir of series file '$series'"
+
+# These two functions are from quilt, and we can use more from there
+patch_header()
+{
+	awk '
+	/^(---|\*\*\*|Index:)[ \t][^ \t]|^diff -/ \
+		{ exit }
+		{ print }
+	'
+}
+
+strip_diffstat()
+{
+	awk '
+	/#? .* \| / \
+		{ eat = eat $0 "\n"
+		  next }
+	/^#? .* files? changed(, .* insertions?\(\+\))?(, .* deletions?\(-\))?/ \
+		{ eat = ""
+		  next }
+		{ print eat $0
+		  eat = "" }
+	'
+}
+
+# escape $root_dir for sed expression
+root_dir_esc="$(echo "$root_dir" | sed -e 's/\//\\\\\//g')"
+
+cat "$series" |
+	sed -e 's/#.*//' \      # remove any comments
+	    -e 's/^[ \t]*//' \  # remove leading whitespace
+	    -e 's/[ \t].*//' |  # remove all after none leading whitespace
+	sed -e '/^$/d' |        # remove empty lines
+	while read patch; do
+
+		patchfile="$dir/$patch"
+		[ -r "$patchfile" ] ||
+			die "can't access patch file for '$patch'"
+
+		# strip suffixes
+		name="$patch"
+		[ -n "$strip_suffixes" ] && {
+			name="${name%.patch}"
+			name="${name%.diff}"
+		}
+
+		# for the first patch "$@" are the deps from the command line
+		# all others get zero deps
+		tg create "${prefix}${name}" "$@"
+
+		# apply patch
+		# be stupid, hard coded -p1
+		# currently no support for compressed patch files
+		patch -p1 -d "$root_dir" < "$patchfile"
+
+		# extract header from patch file and feed it into .topmsg
+		# TODO: extract mail headers
+		cat "$patchfile" |
+			patch_header |
+			strip_diffstat |
+			make_topmsg "$name" > "$root_dir/.topmsg"
+		# overwrite .topmsg from tg create in index
+		git add "$root_dir/.topmsg"
+
+		# add all modified files from patch to index
+		# (and prepending it with $root_dir)
+		# be stupid, hard coded -p1 --strip=1
+		lsdiff --strip=1 "$patchfile" |
+			sed -e "s/^/$root_dir_esc\//" |
+			xargs git add
+
+		# commit changes to git
+		git commit -m "import of quilt patch '$patch'"
+
+		# clean deps after first create
+		set --
+	done
-- 
tg: (63c1934..) t/tg-import (depends on: t/auto-generate-command-list-for-tg.sh t/check-read-permissions-of-help-files t/mkdir-bindir t/make-.topmsg-gen-a-function t/its-info-attributes)

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [TopGit PATCH 2/2] tg-import.sh: A dump quilt queue importer
  2008-08-08 18:19 ` [TopGit PATCH 2/2] tg-import.sh: A dump quilt queue importer Bert Wesarg
@ 2008-08-09  0:57   ` Petr Baudis
  2008-08-09  7:56     ` Bert Wesarg
  0 siblings, 1 reply; 4+ messages in thread
From: Petr Baudis @ 2008-08-09  0:57 UTC (permalink / raw)
  To: Bert Wesarg; +Cc: git

On Fri, Aug 08, 2008 at 08:19:48PM +0200, Bert Wesarg wrote:
> A simple, non smart, quilt importer.
> 
> Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
> 
> ---
>  .gitignore   |    2 +
>  Makefile     |    3 +-
>  README       |   15 ++++++++
>  tg-import.sh |  115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 134 insertions(+), 1 deletions(-)
> 
> diff --git a/.gitignore b/.gitignore
> index 6f0727f..5f1831b 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -3,6 +3,8 @@ tg-create
>  tg-create.txt
>  tg-delete
>  tg-delete.txt
> +tg-import
> +tg-import.txt
>  tg-info
>  tg-info.txt
>  tg-patch
> diff --git a/Makefile b/Makefile
> index dba5f20..671beab 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -6,7 +6,8 @@ sharedir = $(PREFIX)/share/topgit
>  hooksdir = $(cmddir)/hooks
>  
>  
> -commands_in = tg-create.sh tg-delete.sh tg-info.sh tg-patch.sh tg-summary.sh tg-update.sh
> +commands_in = tg-create.sh tg-delete.sh tg-info.sh tg-patch.sh tg-summary.sh \
> +              tg-update.sh tg-import.sh
>  hooks_in = hooks/pre-commit.sh
>  
>  commands_out = $(patsubst %.sh,%,$(commands_in))
> diff --git a/README b/README
> index dc0045f..3fc6d18 100644
> --- a/README
> +++ b/README
> @@ -275,6 +275,21 @@ tg update
>  
>  	TODO: tg update -a for updating all topic branches
>  
> +tg import
> +~~~~~~~~~
> +	Import a quilt queue into TopGit. First argument is the series
> +	file from quilt. Second is the prefix for the topic names
> +	(i.e. "t/"). All remaining arguments are the dependencies for
> +	the first patch in the series.

Sensible usage, but I'm not happy with making tg import quilt-only;
what if we will say want to import to topgit from existing branches,
or from StGIT or something else? The command name is good, but maybe
I'd add a required --quilt switch. After all, this is not a command you
run three times a day by hand.

> + Use '-s' if you want to strip
> +	common patch suffixes from the patch file name (like .diff and
> +	.patch).

When *wouldn't* we want to do this? Doesn't it make sense to make this
the default?

> diff --git a/tg-import.sh b/tg-import.sh
> new file mode 100644
> index 0000000..f9403b9
> --- /dev/null
> +++ b/tg-import.sh

I think the functionality is good to have, but you are also reinventing
the wheel here. Git can already import quilt series by git-quiltimport.
So what about a more general approach?

* Build tg-import so that it primarily just imports given set of
  existing commits.
* Then, StGIT and Quilt importers are trivial extensions?

> +		# strip suffixes
> +		name="$patch"
> +		[ -n "$strip_suffixes" ] && {
> +			name="${name%.patch}"
> +			name="${name%.diff}"
> +		}

I think in these cases, it's better style to use plain if.

> +		# apply patch
> +		# be stupid, hard coded -p1
> +		# currently no support for compressed patch files
> +		patch -p1 -d "$root_dir" < "$patchfile"
> +
> +		# extract header from patch file and feed it into .topmsg
> +		# TODO: extract mail headers
> +		cat "$patchfile" |
> +			patch_header |
> +			strip_diffstat |
> +			make_topmsg "$name" > "$root_dir/.topmsg"
> +		# overwrite .topmsg from tg create in index
> +		git add "$root_dir/.topmsg"
> +
> +		# add all modified files from patch to index
> +		# (and prepending it with $root_dir)
> +		# be stupid, hard coded -p1 --strip=1
> +		lsdiff --strip=1 "$patchfile" |
> +			sed -e "s/^/$root_dir_esc\//" |
> +			xargs git add

lsdiff? I don't have this tool. And this won't work with file removals
properly anyway.

I guess git add -u is too new for us, so you might opt for this snippet
I've used in git-filter-branch:

	(
		git diff-index -r --name-only HEAD
		git ls-files --others
	) |
	git update-index --add --replace --remove --stdin

Or even better, use git apply?

-- 
				Petr "Pasky" Baudis
The next generation of interesting software will be done
on the Macintosh, not the IBM PC.  -- Bill Gates

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [TopGit PATCH 2/2] tg-import.sh: A dump quilt queue importer
  2008-08-09  0:57   ` Petr Baudis
@ 2008-08-09  7:56     ` Bert Wesarg
  0 siblings, 0 replies; 4+ messages in thread
From: Bert Wesarg @ 2008-08-09  7:56 UTC (permalink / raw)
  To: Petr Baudis; +Cc: git

On Sat, Aug 9, 2008 at 02:57, Petr Baudis <pasky@suse.cz> wrote:
> On Fri, Aug 08, 2008 at 08:19:48PM +0200, Bert Wesarg wrote:
>> +tg import
>> +~~~~~~~~~
>> +     Import a quilt queue into TopGit. First argument is the series
>> +     file from quilt. Second is the prefix for the topic names
>> +     (i.e. "t/"). All remaining arguments are the dependencies for
>> +     the first patch in the series.
>
> Sensible usage, but I'm not happy with making tg import quilt-only;
> what if we will say want to import to topgit from existing branches,
> or from StGIT or something else? The command name is good, but maybe
> I'd add a required --quilt switch. After all, this is not a command you
> run three times a day by hand.
Your absolutly right, that import should not be quilt specific. It was
just what I currently need, so I made it.

>
>> + Use '-s' if you want to strip
>> +     common patch suffixes from the patch file name (like .diff and
>> +     .patch).
>
> When *wouldn't* we want to do this? Doesn't it make sense to make this
> the default?
I suggest never ;-)

>> +             # add all modified files from patch to index
>> +             # (and prepending it with $root_dir)
>> +             # be stupid, hard coded -p1 --strip=1
>> +             lsdiff --strip=1 "$patchfile" |
>> +                     sed -e "s/^/$root_dir_esc\//" |
>> +                     xargs git add
>
> lsdiff? I don't have this tool. And this won't work with file removals
> properly anyway.
lsdiff comes with the patchutils package.

>
> I guess git add -u is too new for us, so you might opt for this snippet
> I've used in git-filter-branch:
>
>        (
>                git diff-index -r --name-only HEAD
>                git ls-files --others
>        ) |
>        git update-index --add --replace --remove --stdin
>
> Or even better, use git apply?
Ohh yeah, that sounds reasonable. Sometimes it an be so easy.

Thanks for the comments and input.

Bert
>
> --
>                                Petr "Pasky" Baudis

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2008-08-09  8:00 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-08 18:19 [TopGit PATCH 1/2] Factor out the template generation for the .topmsg file Bert Wesarg
2008-08-08 18:19 ` [TopGit PATCH 2/2] tg-import.sh: A dump quilt queue importer Bert Wesarg
2008-08-09  0:57   ` Petr Baudis
2008-08-09  7:56     ` Bert Wesarg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).