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