Merge branch 'fa/remote-svn'
authorJeff King <peff@peff.net>
Thu, 25 Oct 2012 10:42:01 +0000 (06:42 -0400)
committerJeff King <peff@peff.net>
Thu, 25 Oct 2012 10:42:02 +0000 (06:42 -0400)
A GSoC project.

* fa/remote-svn:
Add a test script for remote-svn
remote-svn: add marks-file regeneration
Add a svnrdump-simulator replaying a dump file for testing
remote-svn: add incremental import
remote-svn: Activate import/export-marks for fast-import
Create a note for every imported commit containing svn metadata
vcs-svn: add fast_export_note to create notes
Allow reading svn dumps from files via file:// urls
remote-svn, vcs-svn: Enable fetching to private refs
When debug==1, start fast-import with "--stats" instead of "--quiet"
Add documentation for the 'bidi-import' capability of remote-helpers
Connect fast-import to the remote-helper via pipe, adding 'bidi-import' capability
Add argv_array_detach and argv_array_free_detached
Add svndump_init_fd to allow reading dumps from arbitrary FDs
Add git-remote-testsvn to Makefile
Implement a remote helper for svn in C

1  2 
.gitignore
Documentation/technical/api-argv-array.txt
Makefile
argv-array.c
argv-array.h
diff --combined .gitignore
index a188a82bb1d6ab080c434a7096bd263545169f3c,51294d6c3c5f8d8e6f6efd9372bd5ae037762784..f702415c12c5a4a66180f7ffd697347e5343ac4a
  /git-remote-fd
  /git-remote-ext
  /git-remote-testgit
+ /git-remote-testsvn
  /git-repack
  /git-replace
  /git-repo-config
  /test-mktemp
  /test-parse-options
  /test-path-utils
 +/test-regex
  /test-revision-walking
  /test-run-command
  /test-sha1
  /test-sigchain
 +/test-string-list
  /test-subprocess
  /test-svn-fe
  /common-cmds.h
index 1a797812fb426189b03a814498dd7019c96607b4,6b97d6db7477fad9f2eda67e418f32e54797055a..a959517b2339847e92464c86a73f9c472bfdb2d0
@@@ -46,10 -46,14 +46,18 @@@ Function
        Format a string and push it onto the end of the array. This is a
        convenience wrapper combining `strbuf_addf` and `argv_array_push`.
  
 +`argv_array_pop`::
 +      Remove the final element from the array. If there are no
 +      elements in the array, do nothing.
 +
  `argv_array_clear`::
        Free all memory associated with the array and return it to the
        initial, empty state.
+ `argv_array_detach`::
+       Detach the argv array from the `struct argv_array`, transfering
+       ownership of the allocated array and strings.
+ `argv_array_free_detached`::
+       Free the memory allocated by a `struct argv_array` that was later
+       detached and is now no longer needed.
diff --combined Makefile
index f69979e39e25bd0aae3dbdf21019d040aa1fd788,a6933df7e715bdcd04d721d611e41a3b18af6cb4..40829a9e994ef57e07bdcc16f0c6c8fd137f01fc
+++ b/Makefile
@@@ -90,8 -90,6 +90,8 @@@ all:
  #
  # Define NO_MKDTEMP if you don't have mkdtemp in the C library.
  #
 +# Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash.
 +#
  # Define NO_MKSTEMPS if you don't have mkstemps in the C library.
  #
  # Define NO_STRTOK_R if you don't have strtok_r in the C library.
  #
  # Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
  #
 +# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
 +#
 +# Define NO_INTPTR_T if you don't have intptr_t nor uintptr_t.
 +#
 +# Define NO_UINTMAX_T if you don't have uintmax_t.
 +#
  # Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
  # Patrick Mauritz).
  #
  #
  # Define NO_MMAP if you want to avoid mmap.
  #
 +# Define NO_SYS_POLL_H if you don't have sys/poll.h.
 +#
 +# Define NO_POLL if you do not have or don't want to use poll().
 +# This also implies NO_SYS_POLL_H.
 +#
  # Define NO_PTHREADS if you do not have or do not want to use Pthreads.
  #
  # Define NO_PREAD if you have a problem with pread() system call (e.g.
  # cygwin1.dll before v1.5.22).
  #
 +# Define NO_SETITIMER if you don't have setitimer()
 +#
 +# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval
 +# This also implies NO_SETITIMER
 +#
  # Define NO_THREAD_SAFE_PREAD if your pread() implementation is not
  # thread-safe. (e.g. compat/pread.c or cygwin)
  #
@@@ -495,6 -477,7 +495,7 @@@ PROGRAM_OBJS += sh-i18n--envsubst.
  PROGRAM_OBJS += shell.o
  PROGRAM_OBJS += show-index.o
  PROGRAM_OBJS += upload-pack.o
+ PROGRAM_OBJS += remote-testsvn.o
  
  # Binary suffix, set to .exe for Windows builds
  X =
@@@ -514,13 -497,11 +515,13 @@@ TEST_PROGRAMS_NEED_X += test-mergesor
  TEST_PROGRAMS_NEED_X += test-mktemp
  TEST_PROGRAMS_NEED_X += test-parse-options
  TEST_PROGRAMS_NEED_X += test-path-utils
 +TEST_PROGRAMS_NEED_X += test-regex
  TEST_PROGRAMS_NEED_X += test-revision-walking
  TEST_PROGRAMS_NEED_X += test-run-command
  TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
  TEST_PROGRAMS_NEED_X += test-sha1
  TEST_PROGRAMS_NEED_X += test-sigchain
 +TEST_PROGRAMS_NEED_X += test-string-list
  TEST_PROGRAMS_NEED_X += test-subprocess
  TEST_PROGRAMS_NEED_X += test-svn-fe
  
@@@ -615,10 -596,10 +616,10 @@@ LIB_H += compat/bswap.
  LIB_H += compat/cygwin.h
  LIB_H += compat/mingw.h
  LIB_H += compat/obstack.h
 +LIB_H += compat/poll/poll.h
  LIB_H += compat/precompose_utf8.h
  LIB_H += compat/terminal.h
  LIB_H += compat/win32/dirent.h
 -LIB_H += compat/win32/poll.h
  LIB_H += compat/win32/pthread.h
  LIB_H += compat/win32/syslog.h
  LIB_H += connected.h
@@@ -1236,7 -1217,7 +1237,7 @@@ ifeq ($(uname_S),Windows
        NO_PREAD = YesPlease
        NEEDS_CRYPTO_WITH_SSL = YesPlease
        NO_LIBGEN_H = YesPlease
 -      NO_SYS_POLL_H = YesPlease
 +      NO_POLL = YesPlease
        NO_SYMLINK_HEAD = YesPlease
        NO_IPV6 = YesPlease
        NO_UNIX_SOCKETS = YesPlease
        BASIC_CFLAGS = -nologo -I. -I../zlib -Icompat/vcbuild -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE
        COMPAT_OBJS = compat/msvc.o compat/winansi.o \
                compat/win32/pthread.o compat/win32/syslog.o \
 -              compat/win32/poll.o compat/win32/dirent.o
 +              compat/win32/dirent.o
        COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
        BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
        EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib
@@@ -1327,67 -1308,12 +1328,67 @@@ ifeq ($(uname_S),Minix
        NO_CURL =
        NO_EXPAT =
  endif
 +ifeq ($(uname_S),NONSTOP_KERNEL)
 +      # Needs some C99 features, "inline" is just one of them.
 +      # INLINE='' would just replace one set of warnings with another and
 +      # still not compile in c89 mode, due to non-const array initializations.
 +      CC = cc -c99
 +      # Disable all optimization, seems to result in bad code, with -O or -O2
 +      # or even -O1 (default), /usr/local/libexec/git-core/git-pack-objects
 +      # abends on "git push". Needs more investigation.
 +      CFLAGS = -g -O0
 +      # We'd want it to be here.
 +      prefix = /usr/local
 +      # Our's are in ${prefix}/bin (perl might also be in /usr/bin/perl).
 +      PERL_PATH = ${prefix}/bin/perl
 +      PYTHON_PATH = ${prefix}/bin/python
 +
 +      # As detected by './configure'.
 +      # Missdetected, hence commented out, see below.
 +      #NO_CURL = YesPlease
 +      # Added manually, see above.
 +      NEEDS_SSL_WITH_CURL = YesPlease
 +      HAVE_LIBCHARSET_H = YesPlease
 +      NEEDS_LIBICONV = YesPlease
 +      NEEDS_LIBINTL_BEFORE_LIBICONV = YesPlease
 +      NO_SYS_SELECT_H = UnfortunatelyYes
 +      NO_D_TYPE_IN_DIRENT = YesPlease
 +      NO_HSTRERROR = YesPlease
 +      NO_STRCASESTR = YesPlease
 +      NO_FNMATCH_CASEFOLD = YesPlease
 +      NO_MEMMEM = YesPlease
 +      NO_STRLCPY = YesPlease
 +      NO_SETENV = YesPlease
 +      NO_UNSETENV = YesPlease
 +      NO_MKDTEMP = YesPlease
 +      NO_MKSTEMPS = YesPlease
 +      # Currently libiconv-1.9.1.
 +      OLD_ICONV = UnfortunatelyYes
 +      NO_REGEX = YesPlease
 +      NO_PTHREADS = UnfortunatelyYes
 +
 +      # Not detected (nor checked for) by './configure'.
 +      # We don't have SA_RESTART on NonStop, unfortunalety.
 +      COMPAT_CFLAGS += -DSA_RESTART=0
 +      # Apparently needed in compat/fnmatch/fnmatch.c.
 +      COMPAT_CFLAGS += -DHAVE_STRING_H=1
 +      NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
 +      NO_NSEC = YesPlease
 +      NO_PREAD = YesPlease
 +      NO_MMAP = YesPlease
 +      NO_POLL = YesPlease
 +      NO_INTPTR_T = UnfortunatelyYes
 +      # Bug report 10-120822-4477 submitted to HP NonStop development.
 +      MKDIR_WO_TRAILING_SLASH = YesPlease
 +      # RFE 10-120912-4693 submitted to HP NonStop development.
 +      NO_SETITIMER = UnfortunatelyYes
 +endif
  ifneq (,$(findstring MINGW,$(uname_S)))
        pathsep = ;
        NO_PREAD = YesPlease
        NEEDS_CRYPTO_WITH_SSL = YesPlease
        NO_LIBGEN_H = YesPlease
 -      NO_SYS_POLL_H = YesPlease
 +      NO_POLL = YesPlease
        NO_SYMLINK_HEAD = YesPlease
        NO_UNIX_SOCKETS = YesPlease
        NO_SETENV = YesPlease
        COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
        COMPAT_OBJS += compat/mingw.o compat/winansi.o \
                compat/win32/pthread.o compat/win32/syslog.o \
 -              compat/win32/poll.o compat/win32/dirent.o
 +              compat/win32/dirent.o
        EXTLIBS += -lws2_32
        PTHREAD_LIBS =
        X = .exe
@@@ -1618,9 -1544,6 +1619,9 @@@ ifdef NEEDS_LIBICON
        else
                ICONV_LINK =
        endif
 +      ifdef NEEDS_LIBINTL_BEFORE_LIBICONV
 +              ICONV_LINK += -lintl
 +      endif
        EXTLIBS += $(ICONV_LINK) -liconv
  endif
  ifdef NEEDS_LIBGEN
@@@ -1679,11 -1602,6 +1680,11 @@@ ifdef NO_GETTEX
        BASIC_CFLAGS += -DNO_GETTEXT
        USE_GETTEXT_SCHEME ?= fallthrough
  endif
 +ifdef NO_POLL
 +      NO_SYS_POLL_H = YesPlease
 +      COMPAT_CFLAGS += -DNO_POLL -Icompat/poll
 +      COMPAT_OBJS += compat/poll/poll.o
 +endif
  ifdef NO_STRCASESTR
        COMPAT_CFLAGS += -DNO_STRCASESTR
        COMPAT_OBJS += compat/strcasestr.o
@@@ -1722,10 -1640,6 +1723,10 @@@ ifdef NO_MKDTEM
        COMPAT_CFLAGS += -DNO_MKDTEMP
        COMPAT_OBJS += compat/mkdtemp.o
  endif
 +ifdef MKDIR_WO_TRAILING_SLASH
 +      COMPAT_CFLAGS += -DMKDIR_WO_TRAILING_SLASH
 +      COMPAT_OBJS += compat/mkdir.o
 +endif
  ifdef NO_MKSTEMPS
        COMPAT_CFLAGS += -DNO_MKSTEMPS
  endif
@@@ -1757,13 -1671,6 +1758,13 @@@ endi
  ifdef OBJECT_CREATION_USES_RENAMES
        COMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1
  endif
 +ifdef NO_STRUCT_ITIMERVAL
 +      COMPAT_CFLAGS += -DNO_STRUCT_ITIMERVAL
 +      NO_SETITIMER=YesPlease
 +endif
 +ifdef NO_SETITIMER
 +      COMPAT_CFLAGS += -DNO_SETITIMER
 +endif
  ifdef NO_PREAD
        COMPAT_CFLAGS += -DNO_PREAD
        COMPAT_OBJS += compat/pread.o
@@@ -1781,9 -1688,6 +1782,9 @@@ endi
  ifdef NO_IPV6
        BASIC_CFLAGS += -DNO_IPV6
  endif
 +ifdef NO_INTPTR_T
 +      COMPAT_CFLAGS += -DNO_INTPTR_T
 +endif
  ifdef NO_UINTMAX_T
        BASIC_CFLAGS += -Duintmax_t=uint32_t
  endif
@@@ -2449,6 -2353,10 +2450,10 @@@ git-http-push$X: revision.o http.o http
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
                $(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
  
+ git-remote-testsvn$X: remote-testsvn.o GIT-LDFLAGS $(GITLIBS) $(VCSSVN_LIB)
+       $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS) \
+       $(VCSSVN_LIB)
  $(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
        $(QUIET_LNCP)$(RM) $@ && \
        ln $< $@ 2>/dev/null || \
@@@ -2636,7 -2544,6 +2641,7 @@@ bin-wrappers/%: wrap-for-bin.s
  # with that.
  
  export NO_SVN_TESTS
 +export TEST_NO_MALLOC_CHECK
  
  ### Testing rules
  
@@@ -2903,13 -2810,8 +2908,13 @@@ endi
  
  ### Check documentation
  #
 +ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
 +ALL_COMMANDS += git
 +ALL_COMMANDS += gitk
 +ALL_COMMANDS += gitweb
 +ALL_COMMANDS += git-gui git-citool
  check-docs::
 -      @(for v in $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git gitk; \
 +      @(for v in $(ALL_COMMANDS); \
        do \
                case "$$v" in \
                git-merge-octopus | git-merge-ours | git-merge-recursive | \
                sed -e '/^#/d' \
                    -e 's/[     ].*//' \
                    -e 's/^/listed /' command-list.txt; \
 -              ls -1 Documentation/git*txt | \
 +              $(MAKE) -C Documentation print-man1 | \
 +              grep '\.txt$$' | \
                sed -e 's|Documentation/|documented |' \
                    -e 's/\.txt//'; \
        ) | while read how cmd; \
        do \
 -              case "$$how,$$cmd" in \
 -              *,git-citool | \
 -              *,git-gui | \
 -              *,git-help | \
 -              documented,gitattributes | \
 -              documented,gitignore | \
 -              documented,gitmodules | \
 -              documented,gitcli | \
 -              documented,git-tools | \
 -              documented,gitcore-tutorial | \
 -              documented,gitcvs-migration | \
 -              documented,gitdiffcore | \
 -              documented,gitglossary | \
 -              documented,githooks | \
 -              documented,gitrepository-layout | \
 -              documented,gitrevisions | \
 -              documented,gittutorial | \
 -              documented,gittutorial-2 | \
 -              documented,git-bisect-lk2009 | \
 -              documented,git-remote-helpers | \
 -              documented,gitworkflows | \
 -              sentinel,not,matching,is,ok ) continue ;; \
 -              esac; \
 -              case " $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git gitk " in \
 +              case " $(ALL_COMMANDS) " in \
                *" $$cmd "*)    ;; \
                *) echo "removed but $$how: $$cmd" ;; \
                esac; \
diff --combined argv-array.c
index 256741d2262b237c56b6730bea9d52c9b39b7ee3,aab50d6a97c7ca76e38601c3e2438e760322f478..9e960d549c158a4c761942bb17824c1d5e075d49
@@@ -49,22 -49,33 +49,42 @@@ void argv_array_pushl(struct argv_arra
        va_end(ap);
  }
  
 +void argv_array_pop(struct argv_array *array)
 +{
 +      if (!array->argc)
 +              return;
 +      free((char *)array->argv[array->argc - 1]);
 +      array->argv[array->argc - 1] = NULL;
 +      array->argc--;
 +}
 +
  void argv_array_clear(struct argv_array *array)
  {
        if (array->argv != empty_argv) {
                int i;
                for (i = 0; i < array->argc; i++)
 -                      free((char **)array->argv[i]);
 +                      free((char *)array->argv[i]);
                free(array->argv);
        }
        argv_array_init(array);
  }
+ const char **argv_array_detach(struct argv_array *array, int *argc)
+ {
+       const char **argv =
+               array->argv == empty_argv || array->argc == 0 ? NULL : array->argv;
+       if (argc)
+               *argc = array->argc;
+       argv_array_init(array);
+       return argv;
+ }
+ void argv_array_free_detached(const char **argv)
+ {
+       if (argv) {
+               int i;
+               for (i = 0; argv[i]; i++)
+                       free((char **)argv[i]);
+               free(argv);
+       }
+ }
diff --combined argv-array.h
index f4b98660f8a98e2cecdf70285d1d76205b3f4be7,b3ef351b4456cf4212e6afa141af65f03386e796..40248d424c31662a3a574cfea13635084feb14f5
@@@ -16,7 -16,8 +16,9 @@@ void argv_array_push(struct argv_array 
  __attribute__((format (printf,2,3)))
  void argv_array_pushf(struct argv_array *, const char *fmt, ...);
  void argv_array_pushl(struct argv_array *, ...);
 +void argv_array_pop(struct argv_array *);
  void argv_array_clear(struct argv_array *);
+ const char **argv_array_detach(struct argv_array *array, int *argc);
+ void argv_array_free_detached(const char **argv);
  
  #endif /* ARGV_ARRAY_H */