A simple, non smart, quilt importer. Signed-off-by: Bert Wesarg <bert.wesarg@xxxxxxxxxxxxxx> --- .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@xxxxxxx> 2008 +# (c) Bert Wesarg <Bert.Wesarg@xxxxxxxxxxxxxx> 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) -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html