From 7a0e4d7c39083e951625e4c3434d05abfea8f5e6 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 16 Jul 2010 12:08:24 -0700 Subject: [PATCH 1/3] diff A...B: do not limit the syntax too narrowly Earlier we tried to make sure that the trees we get are what A...B syntax produced, by checking that earlier ones are all marked uninteresting (which has to be true as they are merge bases), there are two remaining ones that are interesting, and they are marked as non-symmetric-left and symmetric-left respectively. The "the last two must be interesting" condition is however wrong when one is an ancestor of the other between A and B (i.e. fast-forward). In such a case, one of them is marked uninteresting. --- builtin-diff.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/builtin-diff.c b/builtin-diff.c index 62b483bd5f..192cbb212e 100644 --- a/builtin-diff.c +++ b/builtin-diff.c @@ -406,19 +406,6 @@ int cmd_diff(int argc, const char **argv, const char *prefix) else if (ents == 2) result = builtin_diff_tree(&rev, argc, argv, ent); else if (ent[0].item->flags & UNINTERESTING) { - /* - * Perhaps the user gave us A...B, which expands - * to a list of negative merge bases followed by - * A (symmetric-left) and B? Let's make sure... - */ - for (i = 1; i < ents; i++) - if (!(ent[i].item->flags & UNINTERESTING)) - break; - if (ents != i + 2 || - (ent[i+1].item->flags & UNINTERESTING) || - (!(ent[i].item->flags & SYMMETRIC_LEFT)) || - (ent[i+1].item->flags & SYMMETRIC_LEFT)) - die("what do you mean by that?"); /* * diff A...B where there is at least one merge base * between A and B. We have ent[0] == merge-base, From e605164d1da51087882a468bcf3f5d36d3a9d4ba Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Thu, 15 Jul 2010 18:25:39 +0200 Subject: [PATCH 2/3] Add a sample user for the svndump library The svn-fe tool takes a Subversion dump file as input and produces a fast-import stream as output. This can be useful as a low-level tool in building other importers, or for debugging the vcs-svn library. make svn-fe make svn-fe.1 to test. Signed-off-by: Jonathan Nieder Signed-off-by: Ramkumar Ramachandra Signed-off-by: Junio C Hamano --- contrib/svn-fe/.gitignore | 3 ++ contrib/svn-fe/Makefile | 63 +++++++++++++++++++++++++++++++++++++ contrib/svn-fe/svn-fe.c | 15 +++++++++ contrib/svn-fe/svn-fe.txt | 66 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+) create mode 100644 contrib/svn-fe/.gitignore create mode 100644 contrib/svn-fe/Makefile create mode 100644 contrib/svn-fe/svn-fe.c create mode 100644 contrib/svn-fe/svn-fe.txt diff --git a/contrib/svn-fe/.gitignore b/contrib/svn-fe/.gitignore new file mode 100644 index 0000000000..27a33b669e --- /dev/null +++ b/contrib/svn-fe/.gitignore @@ -0,0 +1,3 @@ +/*.xml +/*.1 +/*.html diff --git a/contrib/svn-fe/Makefile b/contrib/svn-fe/Makefile new file mode 100644 index 0000000000..4cc8d15827 --- /dev/null +++ b/contrib/svn-fe/Makefile @@ -0,0 +1,63 @@ +all:: svn-fe$X + +CC = gcc +RM = rm -f +MV = mv + +CFLAGS = -g -O2 -Wall +LDFLAGS = +ALL_CFLAGS = $(CFLAGS) +ALL_LDFLAGS = $(LDFLAGS) +EXTLIBS = + +GIT_LIB = ../../libgit.a +VCSSVN_LIB = ../../vcs-svn/lib.a +LIBS = $(VCSSVN_LIB) $(GIT_LIB) $(EXTLIBS) + +QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir +QUIET_SUBDIR1 = + +ifneq ($(findstring $(MAKEFLAGS),w),w) +PRINT_DIR = --no-print-directory +else # "make -w" +NO_SUBDIR = : +endif + +ifneq ($(findstring $(MAKEFLAGS),s),s) +ifndef V + QUIET_CC = @echo ' ' CC $@; + QUIET_LINK = @echo ' ' LINK $@; + QUIET_SUBDIR0 = +@subdir= + QUIET_SUBDIR1 = ;$(NO_SUBDIR) echo ' ' SUBDIR $$subdir; \ + $(MAKE) $(PRINT_DIR) -C $$subdir +endif +endif + +svn-fe$X: svn-fe.o $(VCSSVN_LIB) $(GIT_LIB) + $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ svn-fe.o \ + $(ALL_LDFLAGS) $(LIBS) + +svn-fe.o: svn-fe.c ../../vcs-svn/svndump.h + $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $< + +svn-fe.html: svn-fe.txt + $(QUIET_SUBDIR0)../../Documentation $(QUIET_SUBDIR1) \ + MAN_TXT=../contrib/svn-fe/svn-fe.txt \ + ../contrib/svn-fe/$@ + +svn-fe.1: svn-fe.txt + $(QUIET_SUBDIR0)../../Documentation $(QUIET_SUBDIR1) \ + MAN_TXT=../contrib/svn-fe/svn-fe.txt \ + ../contrib/svn-fe/$@ + $(MV) ../../Documentation/svn-fe.1 . + +../../vcs-svn/lib.a: FORCE + $(QUIET_SUBDIR0)../.. $(QUIET_SUBDIR1) vcs-svn/lib.a + +../../libgit.a: FORCE + $(QUIET_SUBDIR0)../.. $(QUIET_SUBDIR1) libgit.a + +clean: + $(RM) svn-fe$X svn-fe.o svn-fe.html svn-fe.xml svn-fe.1 + +.PHONY: all clean FORCE diff --git a/contrib/svn-fe/svn-fe.c b/contrib/svn-fe/svn-fe.c new file mode 100644 index 0000000000..43c4320cac --- /dev/null +++ b/contrib/svn-fe/svn-fe.c @@ -0,0 +1,15 @@ +/* + * This file is in the public domain. + * You may freely use, modify, distribute, and relicense it. + */ + +#include +#include "vcs-svn/svndump.h" + +int main(int argc, char **argv) +{ + svndump_init(NULL); + svndump_read((argc > 1) ? argv[1] : NULL); + svndump_reset(); + return 0; +} diff --git a/contrib/svn-fe/svn-fe.txt b/contrib/svn-fe/svn-fe.txt new file mode 100644 index 0000000000..de30f83a1f --- /dev/null +++ b/contrib/svn-fe/svn-fe.txt @@ -0,0 +1,66 @@ +svn-fe(1) +========= + +NAME +---- +svn-fe - convert an SVN "dumpfile" to a fast-import stream + +SYNOPSIS +-------- +svnadmin dump --incremental REPO | svn-fe [url] | git fast-import + +DESCRIPTION +----------- + +Converts a Subversion dumpfile (version: 2) into input suitable for +git-fast-import(1) and similar importers. REPO is a path to a +Subversion repository mirrored on the local disk. Remote Subversion +repositories can be mirrored on local disk using the `svnsync` +command. + +INPUT FORMAT +------------ +Subversion's repository dump format is documented in full in +`notes/dump-load-format.txt` from the Subversion source tree. +Files in this format can be generated using the 'svnadmin dump' or +'svk admin dump' command. + +OUTPUT FORMAT +------------- +The fast-import format is documented by the git-fast-import(1) +manual page. + +NOTES +----- +Subversion dumps do not record a separate author and committer for +each revision, nor a separate display name and email address for +each author. Like git-svn(1), 'svn-fe' will use the name + +--------- +user +--------- + +as committer, where 'user' is the value of the `svn:author` property +and 'UUID' the repository's identifier. + +To support incremental imports, 'svn-fe' will put a `git-svn-id` +line at the end of each commit log message if passed an url on the +command line. This line has the form `git-svn-id: URL@REVNO UUID`. + +Empty directories and unknown properties are silently discarded. + +The resulting repository will generally require further processing +to put each project in its own repository and to separate the history +of each branch. The 'git filter-branch --subdirectory-filter' command +may be useful for this purpose. + +BUGS +---- +Litters the current working directory with .bin files for +persistence. Will be fixed when the svn-fe infrastructure is aware of +a Git working directory. + +SEE ALSO +-------- +git-svn(1), svn2git(1), svk(1), git-filter-branch(1), git-fast-import(1), +https://svn.apache.org/repos/asf/subversion/trunk/notes/dump-load-format.txt From 7ea3ddf818dbd59ae8002e98f56e60742746db45 Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Fri, 16 Jul 2010 11:37:44 +0200 Subject: [PATCH 3/3] Only run aggregate-results over actual counts The current make target 'aggregate-results' scanned all files matching test-results/t*-*. Normally these are only the test counts (and the exit values, which are ignored), but with --tee the suite also dumps all output. Furthermore, with --verbose t1450 contains several lines starting with "broken link from ..." which matches the criteria used by aggregate-results.sh. Rename the counts output files to *.counts, and only scan those. Signed-off-by: Thomas Rast Acked-by: Sverre Rabbelier Signed-off-by: Junio C Hamano --- t/Makefile | 2 +- t/test-lib.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/t/Makefile b/t/Makefile index f9de24b4d2..cf5f9e2e1e 100644 --- a/t/Makefile +++ b/t/Makefile @@ -36,7 +36,7 @@ aggregate-results-and-cleanup: $(T) $(MAKE) clean aggregate-results: - for f in test-results/t*-*; do \ + for f in test-results/t*-*.counts; do \ echo "$$f"; \ done | '$(SHELL_PATH_SQ)' ./aggregate-results.sh diff --git a/t/test-lib.sh b/t/test-lib.sh index db8371cb17..e5523dd690 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -636,7 +636,7 @@ test_done () { GIT_EXIT_OK=t test_results_dir="$TEST_DIRECTORY/test-results" mkdir -p "$test_results_dir" - test_results_path="$test_results_dir/${0%.sh}-$$" + test_results_path="$test_results_dir/${0%.sh}-$$.counts" echo "total $test_count" >> $test_results_path echo "success $test_success" >> $test_results_path