[TopGit PATCH 1/2] Factor out the template generation for the .topmsg file

Subsystems: the rest

DORMANTno replies

4 messages, 2 authors, 2016-06-15 · open the first message on its own page

[TopGit PATCH 1/2] Factor out the template generation for the .topmsg file

From: Bert Wesarg <hidden>
Date: 2016-06-15 22:45:07

Provide a function for the .topmsg template file.

Signed-off-by: Bert Wesarg <redacted>

---
 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)

[TopGit PATCH 2/2] tg-import.sh: A dump quilt queue importer

From: Bert Wesarg <hidden>
Date: 2016-06-15 22:45:07

A simple, non smart, quilt importer.

Signed-off-by: Bert Wesarg <redacted>

---
 .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)

Re: [TopGit PATCH 2/2] tg-import.sh: A dump quilt queue importer

From: Petr Baudis <hidden>
Date: 2016-06-15 22:45:07

On Fri, Aug 08, 2008 at 08:19:48PM +0200, Bert Wesarg wrote:
quoted hunk
A simple, non smart, quilt importer.

Signed-off-by: Bert Wesarg <redacted>

---
 .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?
quoted hunk
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

Re: [TopGit PATCH 2/2] tg-import.sh: A dump quilt queue importer

From: Bert Wesarg <hidden>
Date: 2016-06-15 22:45:07

On Sat, Aug 9, 2008 at 02:57, Petr Baudis [off-list ref] wrote:
On Fri, Aug 08, 2008 at 08:19:48PM +0200, Bert Wesarg wrote:
quoted
+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.
quoted
+ 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 ;-)
quoted
+             # 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help