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