test helpers: move test-* to t/helper/ subdirectory
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Wed, 13 Apr 2016 13:22:42 +0000 (20:22 +0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 15 Apr 2016 17:12:19 +0000 (10:12 -0700)
This keeps top dir a bit less crowded. And because these programs are
for testing purposes, it makes sense that they stay somewhere in t/

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
73 files changed:
.gitignore
Makefile
t/helper/.gitignore [new file with mode: 0644]
t/helper/test-chmtime.c [new file with mode: 0644]
t/helper/test-config.c [new file with mode: 0644]
t/helper/test-ctype.c [new file with mode: 0644]
t/helper/test-date.c [new file with mode: 0644]
t/helper/test-delta.c [new file with mode: 0644]
t/helper/test-dump-cache-tree.c [new file with mode: 0644]
t/helper/test-dump-split-index.c [new file with mode: 0644]
t/helper/test-dump-untracked-cache.c [new file with mode: 0644]
t/helper/test-fake-ssh.c [new file with mode: 0644]
t/helper/test-genrandom.c [new file with mode: 0644]
t/helper/test-hashmap.c [new file with mode: 0644]
t/helper/test-index-version.c [new file with mode: 0644]
t/helper/test-line-buffer.c [new file with mode: 0644]
t/helper/test-match-trees.c [new file with mode: 0644]
t/helper/test-mergesort.c [new file with mode: 0644]
t/helper/test-mktemp.c [new file with mode: 0644]
t/helper/test-parse-options.c [new file with mode: 0644]
t/helper/test-path-utils.c [new file with mode: 0644]
t/helper/test-prio-queue.c [new file with mode: 0644]
t/helper/test-read-cache.c [new file with mode: 0644]
t/helper/test-regex.c [new file with mode: 0644]
t/helper/test-revision-walking.c [new file with mode: 0644]
t/helper/test-run-command.c [new file with mode: 0644]
t/helper/test-scrap-cache-tree.c [new file with mode: 0644]
t/helper/test-sha1-array.c [new file with mode: 0644]
t/helper/test-sha1.c [new file with mode: 0644]
t/helper/test-sha1.sh [new file with mode: 0755]
t/helper/test-sigchain.c [new file with mode: 0644]
t/helper/test-string-list.c [new file with mode: 0644]
t/helper/test-submodule-config.c [new file with mode: 0644]
t/helper/test-subprocess.c [new file with mode: 0644]
t/helper/test-svn-fe.c [new file with mode: 0644]
t/helper/test-urlmatch-normalization.c [new file with mode: 0644]
t/helper/test-wildmatch.c [new file with mode: 0644]
t/t5601-clone.sh
t/test-lib.sh
test-chmtime.c [deleted file]
test-config.c [deleted file]
test-ctype.c [deleted file]
test-date.c [deleted file]
test-delta.c [deleted file]
test-dump-cache-tree.c [deleted file]
test-dump-split-index.c [deleted file]
test-dump-untracked-cache.c [deleted file]
test-fake-ssh.c [deleted file]
test-genrandom.c [deleted file]
test-hashmap.c [deleted file]
test-index-version.c [deleted file]
test-line-buffer.c [deleted file]
test-match-trees.c [deleted file]
test-mergesort.c [deleted file]
test-mktemp.c [deleted file]
test-parse-options.c [deleted file]
test-path-utils.c [deleted file]
test-prio-queue.c [deleted file]
test-read-cache.c [deleted file]
test-regex.c [deleted file]
test-revision-walking.c [deleted file]
test-run-command.c [deleted file]
test-scrap-cache-tree.c [deleted file]
test-sha1-array.c [deleted file]
test-sha1.c [deleted file]
test-sha1.sh [deleted file]
test-sigchain.c [deleted file]
test-string-list.c [deleted file]
test-submodule-config.c [deleted file]
test-subprocess.c [deleted file]
test-svn-fe.c [deleted file]
test-urlmatch-normalization.c [deleted file]
test-wildmatch.c [deleted file]
index 5087ce1eb7e2210e7fc25a9a14ac3f499ad5ac2f..05cb58a3d4ef47295fa8ef02add44a0f0dd90d1f 100644 (file)
 /gitweb/gitweb.cgi
 /gitweb/static/gitweb.js
 /gitweb/static/gitweb.min.*
-/test-chmtime
-/test-ctype
-/test-config
-/test-date
-/test-delta
-/test-dump-cache-tree
-/test-dump-split-index
-/test-dump-untracked-cache
-/test-fake-ssh
-/test-scrap-cache-tree
-/test-genrandom
-/test-hashmap
-/test-index-version
-/test-line-buffer
-/test-match-trees
-/test-mergesort
-/test-mktemp
-/test-parse-options
-/test-path-utils
-/test-prio-queue
-/test-read-cache
-/test-regex
-/test-revision-walking
-/test-run-command
-/test-sha1
-/test-sha1-array
-/test-sigchain
-/test-string-list
-/test-submodule-config
-/test-subprocess
-/test-svn-fe
-/test-urlmatch-normalization
-/test-wildmatch
 /common-cmds.h
 *.tar.gz
 *.dsc
index 0bed5cb3357c6f13b56267f65b8dae03a767c3ae..69d32bfe31e9cca783480482526ce8b1d88acde1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -624,7 +624,7 @@ TEST_PROGRAMS_NEED_X += test-svn-fe
 TEST_PROGRAMS_NEED_X += test-urlmatch-normalization
 TEST_PROGRAMS_NEED_X += test-wildmatch
 
-TEST_PROGRAMS = $(patsubst %,%$X,$(TEST_PROGRAMS_NEED_X))
+TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
 
 # List built-in command $C whose implementation cmd_$C() is not in
 # builtin/$C.o but is linked in as part of some other command.
@@ -1904,7 +1904,7 @@ VCSSVN_OBJS += vcs-svn/fast_export.o
 VCSSVN_OBJS += vcs-svn/svndiff.o
 VCSSVN_OBJS += vcs-svn/svndump.o
 
-TEST_OBJS := $(patsubst test-%$X,test-%.o,$(TEST_PROGRAMS))
+TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS))
 OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
        $(XDIFF_OBJS) \
        $(VCSSVN_OBJS) \
@@ -2211,7 +2211,7 @@ bin-wrappers/%: wrap-for-bin.sh
        @mkdir -p bin-wrappers
        $(QUIET_GEN)sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
             -e 's|@@BUILD_DIR@@|$(shell pwd)|' \
-            -e 's|@@PROG@@|$(@F)|' < $< > $@ && \
+            -e 's|@@PROG@@|$(patsubst test-%,t/helper/test-%,$(@F))|' < $< > $@ && \
        chmod +x $@
 
 # GNU make supports exporting all variables by "export" without parameters.
@@ -2231,25 +2231,25 @@ perf: all
 
 .PHONY: test perf
 
-test-ctype$X: ctype.o
+t/helper/test-ctype$X: ctype.o
 
-test-date$X: date.o ctype.o
+t/helper/test-date$X: date.o ctype.o
 
-test-delta$X: diff-delta.o patch-delta.o
+t/helper/test-delta$X: diff-delta.o patch-delta.o
 
-test-line-buffer$X: vcs-svn/lib.a
+t/helper/test-line-buffer$X: vcs-svn/lib.a
 
-test-parse-options$X: parse-options.o parse-options-cb.o
+t/helper/test-parse-options$X: parse-options.o parse-options-cb.o
 
-test-svn-fe$X: vcs-svn/lib.a
+t/helper/test-svn-fe$X: vcs-svn/lib.a
 
 .PRECIOUS: $(TEST_OBJS)
 
-test-%$X: test-%.o GIT-LDFLAGS $(GITLIBS)
+t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
 
-check-sha1:: test-sha1$X
-       ./test-sha1.sh
+check-sha1:: t/helper/test-sha1$X
+       t/helper/test-sha1.sh
 
 SP_OBJ = $(patsubst %.o,%.sp,$(C_OBJ))
 
diff --git a/t/helper/.gitignore b/t/helper/.gitignore
new file mode 100644 (file)
index 0000000..d6e8b36
--- /dev/null
@@ -0,0 +1,33 @@
+/test-chmtime
+/test-ctype
+/test-config
+/test-date
+/test-delta
+/test-dump-cache-tree
+/test-dump-split-index
+/test-dump-untracked-cache
+/test-fake-ssh
+/test-scrap-cache-tree
+/test-genrandom
+/test-hashmap
+/test-index-version
+/test-line-buffer
+/test-match-trees
+/test-mergesort
+/test-mktemp
+/test-parse-options
+/test-path-utils
+/test-prio-queue
+/test-read-cache
+/test-regex
+/test-revision-walking
+/test-run-command
+/test-sha1
+/test-sha1-array
+/test-sigchain
+/test-string-list
+/test-submodule-config
+/test-subprocess
+/test-svn-fe
+/test-urlmatch-normalization
+/test-wildmatch
diff --git a/t/helper/test-chmtime.c b/t/helper/test-chmtime.c
new file mode 100644 (file)
index 0000000..dfe8a83
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * This program can either change modification time of the given
+ * file(s) or just print it. The program does not change atime or
+ * ctime (their values are explicitly preserved).
+ *
+ * The mtime can be changed to an absolute value:
+ *
+ *     test-chmtime =<seconds> file...
+ *
+ * Relative to the current time as returned by time(3):
+ *
+ *     test-chmtime =+<seconds> (or =-<seconds>) file...
+ *
+ * Or relative to the current mtime of the file:
+ *
+ *     test-chmtime <seconds> file...
+ *     test-chmtime +<seconds> (or -<seconds>) file...
+ *
+ * Examples:
+ *
+ * To just print the mtime use --verbose and set the file mtime offset to 0:
+ *
+ *     test-chmtime -v +0 file
+ *
+ * To set the mtime to current time:
+ *
+ *     test-chmtime =+0 file
+ *
+ */
+#include "git-compat-util.h"
+#include <utime.h>
+
+static const char usage_str[] = "-v|--verbose (+|=|=+|=-|-)<seconds> <file>...";
+
+static int timespec_arg(const char *arg, long int *set_time, int *set_eq)
+{
+       char *test;
+       const char *timespec = arg;
+       *set_eq = (*timespec == '=') ? 1 : 0;
+       if (*set_eq) {
+               timespec++;
+               if (*timespec == '+') {
+                       *set_eq = 2; /* relative "in the future" */
+                       timespec++;
+               }
+       }
+       *set_time = strtol(timespec, &test, 10);
+       if (*test) {
+               fprintf(stderr, "Not a base-10 integer: %s\n", arg + 1);
+               return 0;
+       }
+       if ((*set_eq && *set_time < 0) || *set_eq == 2) {
+               time_t now = time(NULL);
+               *set_time += now;
+       }
+       return 1;
+}
+
+int main(int argc, char *argv[])
+{
+       static int verbose;
+
+       int i = 1;
+       /* no mtime change by default */
+       int set_eq = 0;
+       long int set_time = 0;
+
+       if (argc < 3)
+               goto usage;
+
+       if (strcmp(argv[i], "--verbose") == 0 || strcmp(argv[i], "-v") == 0) {
+               verbose = 1;
+               ++i;
+       }
+       if (timespec_arg(argv[i], &set_time, &set_eq))
+               ++i;
+       else
+               goto usage;
+
+       for (; i < argc; i++) {
+               struct stat sb;
+               struct utimbuf utb;
+
+               if (stat(argv[i], &sb) < 0) {
+                       fprintf(stderr, "Failed to stat %s: %s\n",
+                               argv[i], strerror(errno));
+                       return 1;
+               }
+
+#ifdef GIT_WINDOWS_NATIVE
+               if (!(sb.st_mode & S_IWUSR) &&
+                               chmod(argv[i], sb.st_mode | S_IWUSR)) {
+                       fprintf(stderr, "Could not make user-writable %s: %s",
+                               argv[i], strerror(errno));
+                       return 1;
+               }
+#endif
+
+               utb.actime = sb.st_atime;
+               utb.modtime = set_eq ? set_time : sb.st_mtime + set_time;
+
+               if (verbose) {
+                       uintmax_t mtime = utb.modtime < 0 ? 0: utb.modtime;
+                       printf("%"PRIuMAX"\t%s\n", mtime, argv[i]);
+               }
+
+               if (utb.modtime != sb.st_mtime && utime(argv[i], &utb) < 0) {
+                       fprintf(stderr, "Failed to modify time on %s: %s\n",
+                               argv[i], strerror(errno));
+                       return 1;
+               }
+       }
+
+       return 0;
+
+usage:
+       fprintf(stderr, "usage: %s %s\n", argv[0], usage_str);
+       return 1;
+}
diff --git a/t/helper/test-config.c b/t/helper/test-config.c
new file mode 100644 (file)
index 0000000..6a77552
--- /dev/null
@@ -0,0 +1,152 @@
+#include "cache.h"
+#include "string-list.h"
+
+/*
+ * This program exposes the C API of the configuration mechanism
+ * as a set of simple commands in order to facilitate testing.
+ *
+ * Reads stdin and prints result of command to stdout:
+ *
+ * get_value -> prints the value with highest priority for the entered key
+ *
+ * get_value_multi -> prints all values for the entered key in increasing order
+ *                  of priority
+ *
+ * get_int -> print integer value for the entered key or die
+ *
+ * get_bool -> print bool value for the entered key or die
+ *
+ * get_string -> print string value for the entered key or die
+ *
+ * configset_get_value -> returns value with the highest priority for the entered key
+ *                     from a config_set constructed from files entered as arguments.
+ *
+ * configset_get_value_multi -> returns value_list for the entered key sorted in
+ *                             ascending order of priority from a config_set
+ *                             constructed from files entered as arguments.
+ *
+ * Examples:
+ *
+ * To print the value with highest priority for key "foo.bAr Baz.rock":
+ *     test-config get_value "foo.bAr Baz.rock"
+ *
+ */
+
+
+int main(int argc, char **argv)
+{
+       int i, val;
+       const char *v;
+       const struct string_list *strptr;
+       struct config_set cs;
+       git_configset_init(&cs);
+
+       if (argc < 2) {
+               fprintf(stderr, "Please, provide a command name on the command-line\n");
+               goto exit1;
+       } else if (argc == 3 && !strcmp(argv[1], "get_value")) {
+               if (!git_config_get_value(argv[2], &v)) {
+                       if (!v)
+                               printf("(NULL)\n");
+                       else
+                               printf("%s\n", v);
+                       goto exit0;
+               } else {
+                       printf("Value not found for \"%s\"\n", argv[2]);
+                       goto exit1;
+               }
+       } else if (argc == 3 && !strcmp(argv[1], "get_value_multi")) {
+               strptr = git_config_get_value_multi(argv[2]);
+               if (strptr) {
+                       for (i = 0; i < strptr->nr; i++) {
+                               v = strptr->items[i].string;
+                               if (!v)
+                                       printf("(NULL)\n");
+                               else
+                                       printf("%s\n", v);
+                       }
+                       goto exit0;
+               } else {
+                       printf("Value not found for \"%s\"\n", argv[2]);
+                       goto exit1;
+               }
+       } else if (argc == 3 && !strcmp(argv[1], "get_int")) {
+               if (!git_config_get_int(argv[2], &val)) {
+                       printf("%d\n", val);
+                       goto exit0;
+               } else {
+                       printf("Value not found for \"%s\"\n", argv[2]);
+                       goto exit1;
+               }
+       } else if (argc == 3 && !strcmp(argv[1], "get_bool")) {
+               if (!git_config_get_bool(argv[2], &val)) {
+                       printf("%d\n", val);
+                       goto exit0;
+               } else {
+                       printf("Value not found for \"%s\"\n", argv[2]);
+                       goto exit1;
+               }
+       } else if (argc == 3 && !strcmp(argv[1], "get_string")) {
+               if (!git_config_get_string_const(argv[2], &v)) {
+                       printf("%s\n", v);
+                       goto exit0;
+               } else {
+                       printf("Value not found for \"%s\"\n", argv[2]);
+                       goto exit1;
+               }
+       } else if (!strcmp(argv[1], "configset_get_value")) {
+               for (i = 3; i < argc; i++) {
+                       int err;
+                       if ((err = git_configset_add_file(&cs, argv[i]))) {
+                               fprintf(stderr, "Error (%d) reading configuration file %s.\n", err, argv[i]);
+                               goto exit2;
+                       }
+               }
+               if (!git_configset_get_value(&cs, argv[2], &v)) {
+                       if (!v)
+                               printf("(NULL)\n");
+                       else
+                               printf("%s\n", v);
+                       goto exit0;
+               } else {
+                       printf("Value not found for \"%s\"\n", argv[2]);
+                       goto exit1;
+               }
+       } else if (!strcmp(argv[1], "configset_get_value_multi")) {
+               for (i = 3; i < argc; i++) {
+                       int err;
+                       if ((err = git_configset_add_file(&cs, argv[i]))) {
+                               fprintf(stderr, "Error (%d) reading configuration file %s.\n", err, argv[i]);
+                               goto exit2;
+                       }
+               }
+               strptr = git_configset_get_value_multi(&cs, argv[2]);
+               if (strptr) {
+                       for (i = 0; i < strptr->nr; i++) {
+                               v = strptr->items[i].string;
+                               if (!v)
+                                       printf("(NULL)\n");
+                               else
+                                       printf("%s\n", v);
+                       }
+                       goto exit0;
+               } else {
+                       printf("Value not found for \"%s\"\n", argv[2]);
+                       goto exit1;
+               }
+       }
+
+       die("%s: Please check the syntax and the function name", argv[0]);
+
+exit0:
+       git_configset_clear(&cs);
+       return 0;
+
+exit1:
+       git_configset_clear(&cs);
+       return 1;
+
+exit2:
+       git_configset_clear(&cs);
+       return 2;
+}
diff --git a/t/helper/test-ctype.c b/t/helper/test-ctype.c
new file mode 100644 (file)
index 0000000..707a821
--- /dev/null
@@ -0,0 +1,42 @@
+#include "cache.h"
+
+static int rc;
+
+static void report_error(const char *class, int ch)
+{
+       printf("%s classifies char %d (0x%02x) wrongly\n", class, ch, ch);
+       rc = 1;
+}
+
+static int is_in(const char *s, int ch)
+{
+       /* We can't find NUL using strchr.  It's classless anyway. */
+       if (ch == '\0')
+               return 0;
+       return !!strchr(s, ch);
+}
+
+#define TEST_CLASS(t,s) {                      \
+       int i;                                  \
+       for (i = 0; i < 256; i++) {             \
+               if (is_in(s, i) != t(i))        \
+                       report_error(#t, i);    \
+       }                                       \
+}
+
+#define DIGIT "0123456789"
+#define LOWER "abcdefghijklmnopqrstuvwxyz"
+#define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+
+int main(int argc, char **argv)
+{
+       TEST_CLASS(isdigit, DIGIT);
+       TEST_CLASS(isspace, " \n\r\t");
+       TEST_CLASS(isalpha, LOWER UPPER);
+       TEST_CLASS(isalnum, LOWER UPPER DIGIT);
+       TEST_CLASS(is_glob_special, "*?[\\");
+       TEST_CLASS(is_regex_special, "$()*+.?[\\^{|");
+       TEST_CLASS(is_pathspec_magic, "!\"#%&',-/:;<=>@_`~");
+
+       return rc;
+}
diff --git a/t/helper/test-date.c b/t/helper/test-date.c
new file mode 100644 (file)
index 0000000..63f3735
--- /dev/null
@@ -0,0 +1,73 @@
+#include "cache.h"
+
+static const char *usage_msg = "\n"
+"  test-date show [time_t]...\n"
+"  test-date parse [date]...\n"
+"  test-date approxidate [date]...\n";
+
+static void show_dates(char **argv, struct timeval *now)
+{
+       struct strbuf buf = STRBUF_INIT;
+
+       for (; *argv; argv++) {
+               time_t t = atoi(*argv);
+               show_date_relative(t, 0, now, &buf);
+               printf("%s -> %s\n", *argv, buf.buf);
+       }
+       strbuf_release(&buf);
+}
+
+static void parse_dates(char **argv, struct timeval *now)
+{
+       struct strbuf result = STRBUF_INIT;
+
+       for (; *argv; argv++) {
+               unsigned long t;
+               int tz;
+
+               strbuf_reset(&result);
+               parse_date(*argv, &result);
+               if (sscanf(result.buf, "%lu %d", &t, &tz) == 2)
+                       printf("%s -> %s\n",
+                              *argv, show_date(t, tz, DATE_MODE(ISO8601)));
+               else
+                       printf("%s -> bad\n", *argv);
+       }
+       strbuf_release(&result);
+}
+
+static void parse_approxidate(char **argv, struct timeval *now)
+{
+       for (; *argv; argv++) {
+               time_t t;
+               t = approxidate_relative(*argv, now);
+               printf("%s -> %s\n", *argv, show_date(t, 0, DATE_MODE(ISO8601)));
+       }
+}
+
+int main(int argc, char **argv)
+{
+       struct timeval now;
+       const char *x;
+
+       x = getenv("TEST_DATE_NOW");
+       if (x) {
+               now.tv_sec = atoi(x);
+               now.tv_usec = 0;
+       }
+       else
+               gettimeofday(&now, NULL);
+
+       argv++;
+       if (!*argv)
+               usage(usage_msg);
+       if (!strcmp(*argv, "show"))
+               show_dates(argv+1, &now);
+       else if (!strcmp(*argv, "parse"))
+               parse_dates(argv+1, &now);
+       else if (!strcmp(*argv, "approxidate"))
+               parse_approxidate(argv+1, &now);
+       else
+               usage(usage_msg);
+       return 0;
+}
diff --git a/t/helper/test-delta.c b/t/helper/test-delta.c
new file mode 100644 (file)
index 0000000..4595cd6
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * test-delta.c: test code to exercise diff-delta.c and patch-delta.c
+ *
+ * (C) 2005 Nicolas Pitre <nico@fluxnic.net>
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "git-compat-util.h"
+#include "delta.h"
+#include "cache.h"
+
+static const char usage_str[] =
+       "test-delta (-d|-p) <from_file> <data_file> <out_file>";
+
+int main(int argc, char *argv[])
+{
+       int fd;
+       struct stat st;
+       void *from_buf, *data_buf, *out_buf;
+       unsigned long from_size, data_size, out_size;
+
+       if (argc != 5 || (strcmp(argv[1], "-d") && strcmp(argv[1], "-p"))) {
+               fprintf(stderr, "usage: %s\n", usage_str);
+               return 1;
+       }
+
+       fd = open(argv[2], O_RDONLY);
+       if (fd < 0 || fstat(fd, &st)) {
+               perror(argv[2]);
+               return 1;
+       }
+       from_size = st.st_size;
+       from_buf = mmap(NULL, from_size, PROT_READ, MAP_PRIVATE, fd, 0);
+       if (from_buf == MAP_FAILED) {
+               perror(argv[2]);
+               close(fd);
+               return 1;
+       }
+       close(fd);
+
+       fd = open(argv[3], O_RDONLY);
+       if (fd < 0 || fstat(fd, &st)) {
+               perror(argv[3]);
+               return 1;
+       }
+       data_size = st.st_size;
+       data_buf = mmap(NULL, data_size, PROT_READ, MAP_PRIVATE, fd, 0);
+       if (data_buf == MAP_FAILED) {
+               perror(argv[3]);
+               close(fd);
+               return 1;
+       }
+       close(fd);
+
+       if (argv[1][1] == 'd')
+               out_buf = diff_delta(from_buf, from_size,
+                                    data_buf, data_size,
+                                    &out_size, 0);
+       else
+               out_buf = patch_delta(from_buf, from_size,
+                                     data_buf, data_size,
+                                     &out_size);
+       if (!out_buf) {
+               fprintf(stderr, "delta operation failed (returned NULL)\n");
+               return 1;
+       }
+
+       fd = open (argv[4], O_WRONLY|O_CREAT|O_TRUNC, 0666);
+       if (fd < 0 || write_in_full(fd, out_buf, out_size) != out_size) {
+               perror(argv[4]);
+               return 1;
+       }
+
+       return 0;
+}
diff --git a/t/helper/test-dump-cache-tree.c b/t/helper/test-dump-cache-tree.c
new file mode 100644 (file)
index 0000000..bb53c0a
--- /dev/null
@@ -0,0 +1,67 @@
+#include "cache.h"
+#include "tree.h"
+#include "cache-tree.h"
+
+
+static void dump_one(struct cache_tree *it, const char *pfx, const char *x)
+{
+       if (it->entry_count < 0)
+               printf("%-40s %s%s (%d subtrees)\n",
+                      "invalid", x, pfx, it->subtree_nr);
+       else
+               printf("%s %s%s (%d entries, %d subtrees)\n",
+                      sha1_to_hex(it->sha1), x, pfx,
+                      it->entry_count, it->subtree_nr);
+}
+
+static int dump_cache_tree(struct cache_tree *it,
+                          struct cache_tree *ref,
+                          const char *pfx)
+{
+       int i;
+       int errs = 0;
+
+       if (!it || !ref)
+               /* missing in either */
+               return 0;
+
+       if (it->entry_count < 0) {
+               /* invalid */
+               dump_one(it, pfx, "");
+               dump_one(ref, pfx, "#(ref) ");
+       }
+       else {
+               dump_one(it, pfx, "");
+               if (hashcmp(it->sha1, ref->sha1) ||
+                   ref->entry_count != it->entry_count ||
+                   ref->subtree_nr != it->subtree_nr) {
+                       /* claims to be valid but is lying */
+                       dump_one(ref, pfx, "#(ref) ");
+                       errs = 1;
+               }
+       }
+
+       for (i = 0; i < it->subtree_nr; i++) {
+               char path[PATH_MAX];
+               struct cache_tree_sub *down = it->down[i];
+               struct cache_tree_sub *rdwn;
+
+               rdwn = cache_tree_sub(ref, down->name);
+               xsnprintf(path, sizeof(path), "%s%.*s/", pfx, down->namelen, down->name);
+               if (dump_cache_tree(down->cache_tree, rdwn->cache_tree, path))
+                       errs = 1;
+       }
+       return errs;
+}
+
+int main(int ac, char **av)
+{
+       struct index_state istate;
+       struct cache_tree *another = cache_tree();
+       if (read_cache() < 0)
+               die("unable to read index file");
+       istate = the_index;
+       istate.cache_tree = another;
+       cache_tree_update(&istate, WRITE_TREE_DRY_RUN);
+       return dump_cache_tree(active_cache_tree, another, "");
+}
diff --git a/t/helper/test-dump-split-index.c b/t/helper/test-dump-split-index.c
new file mode 100644 (file)
index 0000000..861d28c
--- /dev/null
@@ -0,0 +1,36 @@
+#include "cache.h"
+#include "split-index.h"
+#include "ewah/ewok.h"
+
+static void show_bit(size_t pos, void *data)
+{
+       printf(" %d", (int)pos);
+}
+
+int main(int ac, char **av)
+{
+       struct split_index *si;
+       int i;
+
+       do_read_index(&the_index, av[1], 1);
+       printf("own %s\n", sha1_to_hex(the_index.sha1));
+       si = the_index.split_index;
+       if (!si) {
+               printf("not a split index\n");
+               return 0;
+       }
+       printf("base %s\n", sha1_to_hex(si->base_sha1));
+       for (i = 0; i < the_index.cache_nr; i++) {
+               struct cache_entry *ce = the_index.cache[i];
+               printf("%06o %s %d\t%s\n", ce->ce_mode,
+                      sha1_to_hex(ce->sha1), ce_stage(ce), ce->name);
+       }
+       printf("replacements:");
+       if (si->replace_bitmap)
+               ewah_each_bit(si->replace_bitmap, show_bit, NULL);
+       printf("\ndeletions:");
+       if (si->delete_bitmap)
+               ewah_each_bit(si->delete_bitmap, show_bit, NULL);
+       printf("\n");
+       return 0;
+}
diff --git a/t/helper/test-dump-untracked-cache.c b/t/helper/test-dump-untracked-cache.c
new file mode 100644 (file)
index 0000000..0a1c285
--- /dev/null
@@ -0,0 +1,66 @@
+#include "cache.h"
+#include "dir.h"
+
+static int compare_untracked(const void *a_, const void *b_)
+{
+       const char *const *a = a_;
+       const char *const *b = b_;
+       return strcmp(*a, *b);
+}
+
+static int compare_dir(const void *a_, const void *b_)
+{
+       const struct untracked_cache_dir *const *a = a_;
+       const struct untracked_cache_dir *const *b = b_;
+       return strcmp((*a)->name, (*b)->name);
+}
+
+static void dump(struct untracked_cache_dir *ucd, struct strbuf *base)
+{
+       int i, len;
+       qsort(ucd->untracked, ucd->untracked_nr, sizeof(*ucd->untracked),
+             compare_untracked);
+       qsort(ucd->dirs, ucd->dirs_nr, sizeof(*ucd->dirs),
+             compare_dir);
+       len = base->len;
+       strbuf_addf(base, "%s/", ucd->name);
+       printf("%s %s", base->buf,
+              sha1_to_hex(ucd->exclude_sha1));
+       if (ucd->recurse)
+               fputs(" recurse", stdout);
+       if (ucd->check_only)
+               fputs(" check_only", stdout);
+       if (ucd->valid)
+               fputs(" valid", stdout);
+       printf("\n");
+       for (i = 0; i < ucd->untracked_nr; i++)
+               printf("%s\n", ucd->untracked[i]);
+       for (i = 0; i < ucd->dirs_nr; i++)
+               dump(ucd->dirs[i], base);
+       strbuf_setlen(base, len);
+}
+
+int main(int ac, char **av)
+{
+       struct untracked_cache *uc;
+       struct strbuf base = STRBUF_INIT;
+
+       /* Hack to avoid modifying the untracked cache when we read it */
+       ignore_untracked_cache_config = 1;
+
+       setup_git_directory();
+       if (read_cache() < 0)
+               die("unable to read index file");
+       uc = the_index.untracked;
+       if (!uc) {
+               printf("no untracked cache\n");
+               return 0;
+       }
+       printf("info/exclude %s\n", sha1_to_hex(uc->ss_info_exclude.sha1));
+       printf("core.excludesfile %s\n", sha1_to_hex(uc->ss_excludes_file.sha1));
+       printf("exclude_per_dir %s\n", uc->exclude_per_dir);
+       printf("flags %08x\n", uc->dir_flags);
+       if (uc->root)
+               dump(uc->root, &base);
+       return 0;
+}
diff --git a/t/helper/test-fake-ssh.c b/t/helper/test-fake-ssh.c
new file mode 100644 (file)
index 0000000..980de21
--- /dev/null
@@ -0,0 +1,30 @@
+#include "git-compat-util.h"
+#include "run-command.h"
+#include "strbuf.h"
+
+int main(int argc, char **argv)
+{
+       const char *trash_directory = getenv("TRASH_DIRECTORY");
+       struct strbuf buf = STRBUF_INIT;
+       FILE *f;
+       int i;
+       const char *child_argv[] = { NULL, NULL };
+
+       /* First, print all parameters into $TRASH_DIRECTORY/ssh-output */
+       if (!trash_directory)
+               die("Need a TRASH_DIRECTORY!");
+       strbuf_addf(&buf, "%s/ssh-output", trash_directory);
+       f = fopen(buf.buf, "w");
+       if (!f)
+               die("Could not write to %s", buf.buf);
+       for (i = 0; i < argc; i++)
+               fprintf(f, "%s%s", i > 0 ? " " : "", i > 0 ? argv[i] : "ssh:");
+       fprintf(f, "\n");
+       fclose(f);
+
+       /* Now, evaluate the *last* parameter */
+       if (argc < 2)
+               return 0;
+       child_argv[0] = argv[argc - 1];
+       return run_command_v_opt(child_argv, RUN_USING_SHELL);
+}
diff --git a/t/helper/test-genrandom.c b/t/helper/test-genrandom.c
new file mode 100644 (file)
index 0000000..54824d0
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Simple random data generator used to create reproducible test files.
+ * This is inspired from POSIX.1-2001 implementation example for rand().
+ * Copyright (C) 2007 by Nicolas Pitre, licensed under the GPL version 2.
+ */
+
+#include "git-compat-util.h"
+
+int main(int argc, char *argv[])
+{
+       unsigned long count, next = 0;
+       unsigned char *c;
+
+       if (argc < 2 || argc > 3) {
+               fprintf(stderr, "usage: %s <seed_string> [<size>]\n", argv[0]);
+               return 1;
+       }
+
+       c = (unsigned char *) argv[1];
+       do {
+               next = next * 11 + *c;
+       } while (*c++);
+
+       count = (argc == 3) ? strtoul(argv[2], NULL, 0) : -1L;
+
+       while (count--) {
+               next = next * 1103515245 + 12345;
+               if (putchar((next >> 16) & 0xff) == EOF)
+                       return -1;
+       }
+
+       return 0;
+}
diff --git a/t/helper/test-hashmap.c b/t/helper/test-hashmap.c
new file mode 100644 (file)
index 0000000..cc2891d
--- /dev/null
@@ -0,0 +1,264 @@
+#include "git-compat-util.h"
+#include "hashmap.h"
+
+struct test_entry
+{
+       struct hashmap_entry ent;
+       /* key and value as two \0-terminated strings */
+       char key[FLEX_ARRAY];
+};
+
+static const char *get_value(const struct test_entry *e)
+{
+       return e->key + strlen(e->key) + 1;
+}
+
+static int test_entry_cmp(const struct test_entry *e1,
+               const struct test_entry *e2, const char* key)
+{
+       return strcmp(e1->key, key ? key : e2->key);
+}
+
+static int test_entry_cmp_icase(const struct test_entry *e1,
+               const struct test_entry *e2, const char* key)
+{
+       return strcasecmp(e1->key, key ? key : e2->key);
+}
+
+static struct test_entry *alloc_test_entry(int hash, char *key, int klen,
+               char *value, int vlen)
+{
+       struct test_entry *entry = malloc(sizeof(struct test_entry) + klen
+                       + vlen + 2);
+       hashmap_entry_init(entry, hash);
+       memcpy(entry->key, key, klen + 1);
+       memcpy(entry->key + klen + 1, value, vlen + 1);
+       return entry;
+}
+
+#define HASH_METHOD_FNV 0
+#define HASH_METHOD_I 1
+#define HASH_METHOD_IDIV10 2
+#define HASH_METHOD_0 3
+#define HASH_METHOD_X2 4
+#define TEST_SPARSE 8
+#define TEST_ADD 16
+#define TEST_SIZE 100000
+
+static unsigned int hash(unsigned int method, unsigned int i, const char *key)
+{
+       unsigned int hash = 0;
+       switch (method & 3)
+       {
+       case HASH_METHOD_FNV:
+               hash = strhash(key);
+               break;
+       case HASH_METHOD_I:
+               hash = i;
+               break;
+       case HASH_METHOD_IDIV10:
+               hash = i / 10;
+               break;
+       case HASH_METHOD_0:
+               hash = 0;
+               break;
+       }
+
+       if (method & HASH_METHOD_X2)
+               hash = 2 * hash;
+       return hash;
+}
+
+/*
+ * Test performance of hashmap.[ch]
+ * Usage: time echo "perfhashmap method rounds" | test-hashmap
+ */
+static void perf_hashmap(unsigned int method, unsigned int rounds)
+{
+       struct hashmap map;
+       char buf[16];
+       struct test_entry **entries;
+       unsigned int *hashes;
+       unsigned int i, j;
+
+       entries = malloc(TEST_SIZE * sizeof(struct test_entry *));
+       hashes = malloc(TEST_SIZE * sizeof(int));
+       for (i = 0; i < TEST_SIZE; i++) {
+               snprintf(buf, sizeof(buf), "%i", i);
+               entries[i] = alloc_test_entry(0, buf, strlen(buf), "", 0);
+               hashes[i] = hash(method, i, entries[i]->key);
+       }
+
+       if (method & TEST_ADD) {
+               /* test adding to the map */
+               for (j = 0; j < rounds; j++) {
+                       hashmap_init(&map, (hashmap_cmp_fn) test_entry_cmp, 0);
+
+                       /* add entries */
+                       for (i = 0; i < TEST_SIZE; i++) {
+                               hashmap_entry_init(entries[i], hashes[i]);
+                               hashmap_add(&map, entries[i]);
+                       }
+
+                       hashmap_free(&map, 0);
+               }
+       } else {
+               /* test map lookups */
+               hashmap_init(&map, (hashmap_cmp_fn) test_entry_cmp, 0);
+
+               /* fill the map (sparsely if specified) */
+               j = (method & TEST_SPARSE) ? TEST_SIZE / 10 : TEST_SIZE;
+               for (i = 0; i < j; i++) {
+                       hashmap_entry_init(entries[i], hashes[i]);
+                       hashmap_add(&map, entries[i]);
+               }
+
+               for (j = 0; j < rounds; j++) {
+                       for (i = 0; i < TEST_SIZE; i++) {
+                               hashmap_get_from_hash(&map, hashes[i],
+                                                     entries[i]->key);
+                       }
+               }
+
+               hashmap_free(&map, 0);
+       }
+}
+
+#define DELIM " \t\r\n"
+
+/*
+ * Read stdin line by line and print result of commands to stdout:
+ *
+ * hash key -> strhash(key) memhash(key) strihash(key) memihash(key)
+ * put key value -> NULL / old value
+ * get key -> NULL / value
+ * remove key -> NULL / old value
+ * iterate -> key1 value1\nkey2 value2\n...
+ * size -> tablesize numentries
+ *
+ * perfhashmap method rounds -> test hashmap.[ch] performance
+ */
+int main(int argc, char *argv[])
+{
+       char line[1024];
+       struct hashmap map;
+       int icase;
+
+       /* init hash map */
+       icase = argc > 1 && !strcmp("ignorecase", argv[1]);
+       hashmap_init(&map, (hashmap_cmp_fn) (icase ? test_entry_cmp_icase
+                       : test_entry_cmp), 0);
+
+       /* process commands from stdin */
+       while (fgets(line, sizeof(line), stdin)) {
+               char *cmd, *p1 = NULL, *p2 = NULL;
+               int l1 = 0, l2 = 0, hash = 0;
+               struct test_entry *entry;
+
+               /* break line into command and up to two parameters */
+               cmd = strtok(line, DELIM);
+               /* ignore empty lines */
+               if (!cmd || *cmd == '#')
+                       continue;
+
+               p1 = strtok(NULL, DELIM);
+               if (p1) {
+                       l1 = strlen(p1);
+                       hash = icase ? strihash(p1) : strhash(p1);
+                       p2 = strtok(NULL, DELIM);
+                       if (p2)
+                               l2 = strlen(p2);
+               }
+
+               if (!strcmp("hash", cmd) && l1) {
+
+                       /* print results of different hash functions */
+                       printf("%u %u %u %u\n", strhash(p1), memhash(p1, l1),
+                                       strihash(p1), memihash(p1, l1));
+
+               } else if (!strcmp("add", cmd) && l1 && l2) {
+
+                       /* create entry with key = p1, value = p2 */
+                       entry = alloc_test_entry(hash, p1, l1, p2, l2);
+
+                       /* add to hashmap */
+                       hashmap_add(&map, entry);
+
+               } else if (!strcmp("put", cmd) && l1 && l2) {
+
+                       /* create entry with key = p1, value = p2 */
+                       entry = alloc_test_entry(hash, p1, l1, p2, l2);
+
+                       /* add / replace entry */
+                       entry = hashmap_put(&map, entry);
+
+                       /* print and free replaced entry, if any */
+                       puts(entry ? get_value(entry) : "NULL");
+                       free(entry);
+
+               } else if (!strcmp("get", cmd) && l1) {
+
+                       /* lookup entry in hashmap */
+                       entry = hashmap_get_from_hash(&map, hash, p1);
+
+                       /* print result */
+                       if (!entry)
+                               puts("NULL");
+                       while (entry) {
+                               puts(get_value(entry));
+                               entry = hashmap_get_next(&map, entry);
+                       }
+
+               } else if (!strcmp("remove", cmd) && l1) {
+
+                       /* setup static key */
+                       struct hashmap_entry key;
+                       hashmap_entry_init(&key, hash);
+
+                       /* remove entry from hashmap */
+                       entry = hashmap_remove(&map, &key, p1);
+
+                       /* print result and free entry*/
+                       puts(entry ? get_value(entry) : "NULL");
+                       free(entry);
+
+               } else if (!strcmp("iterate", cmd)) {
+
+                       struct hashmap_iter iter;
+                       hashmap_iter_init(&map, &iter);
+                       while ((entry = hashmap_iter_next(&iter)))
+                               printf("%s %s\n", entry->key, get_value(entry));
+
+               } else if (!strcmp("size", cmd)) {
+
+                       /* print table sizes */
+                       printf("%u %u\n", map.tablesize, map.size);
+
+               } else if (!strcmp("intern", cmd) && l1) {
+
+                       /* test that strintern works */
+                       const char *i1 = strintern(p1);
+                       const char *i2 = strintern(p1);
+                       if (strcmp(i1, p1))
+                               printf("strintern(%s) returns %s\n", p1, i1);
+                       else if (i1 == p1)
+                               printf("strintern(%s) returns input pointer\n", p1);
+                       else if (i1 != i2)
+                               printf("strintern(%s) != strintern(%s)", i1, i2);
+                       else
+                               printf("%s\n", i1);
+
+               } else if (!strcmp("perfhashmap", cmd) && l1 && l2) {
+
+                       perf_hashmap(atoi(p1), atoi(p2));
+
+               } else {
+
+                       printf("Unknown command %s\n", cmd);
+
+               }
+       }
+
+       hashmap_free(&map, 1);
+       return 0;
+}
diff --git a/t/helper/test-index-version.c b/t/helper/test-index-version.c
new file mode 100644 (file)
index 0000000..05d4699
--- /dev/null
@@ -0,0 +1,14 @@
+#include "cache.h"
+
+int main(int argc, char **argv)
+{
+       struct cache_header hdr;
+       int version;
+
+       memset(&hdr,0,sizeof(hdr));
+       if (read(0, &hdr, sizeof(hdr)) != sizeof(hdr))
+               return 0;
+       version = ntohl(hdr.hdr_version);
+       printf("%d\n", version);
+       return 0;
+}
diff --git a/t/helper/test-line-buffer.c b/t/helper/test-line-buffer.c
new file mode 100644 (file)
index 0000000..1e58f04
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * test-line-buffer.c: code to exercise the svn importer's input helper
+ */
+
+#include "git-compat-util.h"
+#include "strbuf.h"
+#include "vcs-svn/line_buffer.h"
+
+static uint32_t strtouint32(const char *s)
+{
+       char *end;
+       uintmax_t n = strtoumax(s, &end, 10);
+       if (*s == '\0' || *end != '\0')
+               die("invalid count: %s", s);
+       return (uint32_t) n;
+}
+
+static void handle_command(const char *command, const char *arg, struct line_buffer *buf)
+{
+       switch (*command) {
+       case 'b':
+               if (starts_with(command, "binary ")) {
+                       struct strbuf sb = STRBUF_INIT;
+                       strbuf_addch(&sb, '>');
+                       buffer_read_binary(buf, &sb, strtouint32(arg));
+                       fwrite(sb.buf, 1, sb.len, stdout);
+                       strbuf_release(&sb);
+                       return;
+               }
+       case 'c':
+               if (starts_with(command, "copy ")) {
+                       buffer_copy_bytes(buf, strtouint32(arg));
+                       return;
+               }
+       case 's':
+               if (starts_with(command, "skip ")) {
+                       buffer_skip_bytes(buf, strtouint32(arg));
+                       return;
+               }
+       default:
+               die("unrecognized command: %s", command);
+       }
+}
+
+static void handle_line(const char *line, struct line_buffer *stdin_buf)
+{
+       const char *arg = strchr(line, ' ');
+       if (!arg)
+               die("no argument in line: %s", line);
+       handle_command(line, arg + 1, stdin_buf);
+}
+
+int main(int argc, char *argv[])
+{
+       struct line_buffer stdin_buf = LINE_BUFFER_INIT;
+       struct line_buffer file_buf = LINE_BUFFER_INIT;
+       struct line_buffer *input = &stdin_buf;
+       const char *filename;
+       char *s;
+
+       if (argc == 1)
+               filename = NULL;
+       else if (argc == 2)
+               filename = argv[1];
+       else
+               usage("test-line-buffer [file | &fd] < script");
+
+       if (buffer_init(&stdin_buf, NULL))
+               die_errno("open error");
+       if (filename) {
+               if (*filename == '&') {
+                       if (buffer_fdinit(&file_buf, strtouint32(filename + 1)))
+                               die_errno("error opening fd %s", filename + 1);
+               } else {
+                       if (buffer_init(&file_buf, filename))
+                               die_errno("error opening %s", filename);
+               }
+               input = &file_buf;
+       }
+
+       while ((s = buffer_read_line(&stdin_buf)))
+               handle_line(s, input);
+
+       if (filename && buffer_deinit(&file_buf))
+               die("error reading from %s", filename);
+       if (buffer_deinit(&stdin_buf))
+               die("input error");
+       if (ferror(stdout))
+               die("output error");
+       return 0;
+}
diff --git a/t/helper/test-match-trees.c b/t/helper/test-match-trees.c
new file mode 100644 (file)
index 0000000..4dad709
--- /dev/null
@@ -0,0 +1,26 @@
+#include "cache.h"
+#include "tree.h"
+
+int main(int ac, char **av)
+{
+       unsigned char hash1[20], hash2[20], shifted[20];
+       struct tree *one, *two;
+
+       setup_git_directory();
+
+       if (get_sha1(av[1], hash1))
+               die("cannot parse %s as an object name", av[1]);
+       if (get_sha1(av[2], hash2))
+               die("cannot parse %s as an object name", av[2]);
+       one = parse_tree_indirect(hash1);
+       if (!one)
+               die("not a tree-ish %s", av[1]);
+       two = parse_tree_indirect(hash2);
+       if (!two)
+               die("not a tree-ish %s", av[2]);
+
+       shift_tree(one->object.oid.hash, two->object.oid.hash, shifted, -1);
+       printf("shifted: %s\n", sha1_to_hex(shifted));
+
+       exit(0);
+}
diff --git a/t/helper/test-mergesort.c b/t/helper/test-mergesort.c
new file mode 100644 (file)
index 0000000..ea3b959
--- /dev/null
@@ -0,0 +1,52 @@
+#include "cache.h"
+#include "mergesort.h"
+
+struct line {
+       char *text;
+       struct line *next;
+};
+
+static void *get_next(const void *a)
+{
+       return ((const struct line *)a)->next;
+}
+
+static void set_next(void *a, void *b)
+{
+       ((struct line *)a)->next = b;
+}
+
+static int compare_strings(const void *a, const void *b)
+{
+       const struct line *x = a, *y = b;
+       return strcmp(x->text, y->text);
+}
+
+int main(int argc, char **argv)
+{
+       struct line *line, *p = NULL, *lines = NULL;
+       struct strbuf sb = STRBUF_INIT;
+
+       for (;;) {
+               if (strbuf_getwholeline(&sb, stdin, '\n'))
+                       break;
+               line = xmalloc(sizeof(struct line));
+               line->text = strbuf_detach(&sb, NULL);
+               if (p) {
+                       line->next = p->next;
+                       p->next = line;
+               } else {
+                       line->next = NULL;
+                       lines = line;
+               }
+               p = line;
+       }
+
+       lines = llist_mergesort(lines, get_next, set_next, compare_strings);
+
+       while (lines) {
+               printf("%s", lines->text);
+               lines = lines->next;
+       }
+       return 0;
+}
diff --git a/t/helper/test-mktemp.c b/t/helper/test-mktemp.c
new file mode 100644 (file)
index 0000000..c8c5421
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * test-mktemp.c: code to exercise the creation of temporary files
+ */
+#include "git-compat-util.h"
+
+int main(int argc, char *argv[])
+{
+       if (argc != 2)
+               usage("Expected 1 parameter defining the temporary file template");
+
+       xmkstemp(xstrdup(argv[1]));
+
+       return 0;
+}
diff --git a/t/helper/test-parse-options.c b/t/helper/test-parse-options.c
new file mode 100644 (file)
index 0000000..2c8c8f1
--- /dev/null
@@ -0,0 +1,104 @@
+#include "cache.h"
+#include "parse-options.h"
+#include "string-list.h"
+
+static int boolean = 0;
+static int integer = 0;
+static unsigned long magnitude = 0;
+static unsigned long timestamp;
+static int abbrev = 7;
+static int verbose = 0, dry_run = 0, quiet = 0;
+static char *string = NULL;
+static char *file = NULL;
+static int ambiguous;
+static struct string_list list;
+
+static int length_callback(const struct option *opt, const char *arg, int unset)
+{
+       printf("Callback: \"%s\", %d\n",
+               (arg ? arg : "not set"), unset);
+       if (unset)
+               return 1; /* do not support unset */
+
+       *(int *)opt->value = strlen(arg);
+       return 0;
+}
+
+static int number_callback(const struct option *opt, const char *arg, int unset)
+{
+       *(int *)opt->value = strtol(arg, NULL, 10);
+       return 0;
+}
+
+int main(int argc, char **argv)
+{
+       const char *prefix = "prefix/";
+       const char *usage[] = {
+               "test-parse-options <options>",
+               NULL
+       };
+       struct option options[] = {
+               OPT_BOOL(0, "yes", &boolean, "get a boolean"),
+               OPT_BOOL('D', "no-doubt", &boolean, "begins with 'no-'"),
+               { OPTION_SET_INT, 'B', "no-fear", &boolean, NULL,
+                 "be brave", PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 1 },
+               OPT_COUNTUP('b', "boolean", &boolean, "increment by one"),
+               OPT_BIT('4', "or4", &boolean,
+                       "bitwise-or boolean with ...0100", 4),
+               OPT_NEGBIT(0, "neg-or4", &boolean, "same as --no-or4", 4),
+               OPT_GROUP(""),
+               OPT_INTEGER('i', "integer", &integer, "get a integer"),
+               OPT_INTEGER('j', NULL, &integer, "get a integer, too"),
+               OPT_MAGNITUDE('m', "magnitude", &magnitude, "get a magnitude"),
+               OPT_SET_INT(0, "set23", &integer, "set integer to 23", 23),
+               OPT_DATE('t', NULL, &timestamp, "get timestamp of <time>"),
+               OPT_CALLBACK('L', "length", &integer, "str",
+                       "get length of <str>", length_callback),
+               OPT_FILENAME('F', "file", &file, "set file to <file>"),
+               OPT_GROUP("String options"),
+               OPT_STRING('s', "string", &string, "string", "get a string"),
+               OPT_STRING(0, "string2", &string, "str", "get another string"),
+               OPT_STRING(0, "st", &string, "st", "get another string (pervert ordering)"),
+               OPT_STRING('o', NULL, &string, "str", "get another string"),
+               OPT_NOOP_NOARG(0, "obsolete"),
+               OPT_STRING_LIST(0, "list", &list, "str", "add str to list"),
+               OPT_GROUP("Magic arguments"),
+               OPT_ARGUMENT("quux", "means --quux"),
+               OPT_NUMBER_CALLBACK(&integer, "set integer to NUM",
+                       number_callback),
+               { OPTION_COUNTUP, '+', NULL, &boolean, NULL, "same as -b",
+                 PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH },
+               { OPTION_COUNTUP, 0, "ambiguous", &ambiguous, NULL,
+                 "positive ambiguity", PARSE_OPT_NOARG | PARSE_OPT_NONEG },
+               { OPTION_COUNTUP, 0, "no-ambiguous", &ambiguous, NULL,
+                 "negative ambiguity", PARSE_OPT_NOARG | PARSE_OPT_NONEG },
+               OPT_GROUP("Standard options"),
+               OPT__ABBREV(&abbrev),
+               OPT__VERBOSE(&verbose, "be verbose"),
+               OPT__DRY_RUN(&dry_run, "dry run"),
+               OPT__QUIET(&quiet, "be quiet"),
+               OPT_END(),
+       };
+       int i;
+
+       argc = parse_options(argc, (const char **)argv, prefix, options, usage, 0);
+
+       printf("boolean: %d\n", boolean);
+       printf("integer: %d\n", integer);
+       printf("magnitude: %lu\n", magnitude);
+       printf("timestamp: %lu\n", timestamp);
+       printf("string: %s\n", string ? string : "(not set)");
+       printf("abbrev: %d\n", abbrev);
+       printf("verbose: %d\n", verbose);
+       printf("quiet: %s\n", quiet ? "yes" : "no");
+       printf("dry run: %s\n", dry_run ? "yes" : "no");
+       printf("file: %s\n", file ? file : "(not set)");
+
+       for (i = 0; i < list.nr; i++)
+               printf("list: %s\n", list.items[i].string);
+
+       for (i = 0; i < argc; i++)
+               printf("arg %02d: %s\n", i, argv[i]);
+
+       return 0;
+}
diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c
new file mode 100644 (file)
index 0000000..ba805b3
--- /dev/null
@@ -0,0 +1,262 @@
+#include "cache.h"
+#include "string-list.h"
+
+/*
+ * A "string_list_each_func_t" function that normalizes an entry from
+ * GIT_CEILING_DIRECTORIES.  If the path is unusable for some reason,
+ * die with an explanation.
+ */
+static int normalize_ceiling_entry(struct string_list_item *item, void *unused)
+{
+       char *ceil = item->string;
+
+       if (!*ceil)
+               die("Empty path is not supported");
+       if (!is_absolute_path(ceil))
+               die("Path \"%s\" is not absolute", ceil);
+       if (normalize_path_copy(ceil, ceil) < 0)
+               die("Path \"%s\" could not be normalized", ceil);
+       return 1;
+}
+
+static void normalize_argv_string(const char **var, const char *input)
+{
+       if (!strcmp(input, "<null>"))
+               *var = NULL;
+       else if (!strcmp(input, "<empty>"))
+               *var = "";
+       else
+               *var = input;
+
+       if (*var && (**var == '<' || **var == '('))
+               die("Bad value: %s\n", input);
+}
+
+struct test_data {
+       const char *from;  /* input:  transform from this ... */
+       const char *to;    /* output: ... to this.            */
+       const char *alternative; /* output: ... or this.      */
+};
+
+static int test_function(struct test_data *data, char *(*func)(char *input),
+       const char *funcname)
+{
+       int failed = 0, i;
+       char buffer[1024];
+       char *to;
+
+       for (i = 0; data[i].to; i++) {
+               if (!data[i].from)
+                       to = func(NULL);
+               else {
+                       xsnprintf(buffer, sizeof(buffer), "%s", data[i].from);
+                       to = func(buffer);
+               }
+               if (!strcmp(to, data[i].to))
+                       continue;
+               if (!data[i].alternative)
+                       error("FAIL: %s(%s) => '%s' != '%s'\n",
+                               funcname, data[i].from, to, data[i].to);
+               else if (!strcmp(to, data[i].alternative))
+                       continue;
+               else
+                       error("FAIL: %s(%s) => '%s' != '%s', '%s'\n",
+                               funcname, data[i].from, to, data[i].to,
+                               data[i].alternative);
+               failed = 1;
+       }
+       return failed;
+}
+
+static struct test_data basename_data[] = {
+       /* --- POSIX type paths --- */
+       { NULL,              "."    },
+       { "",                "."    },
+       { ".",               "."    },
+       { "..",              ".."   },
+       { "/",               "/"    },
+       { "//",              "/", "//" },
+       { "///",             "/", "//" },
+       { "////",            "/", "//" },
+       { "usr",             "usr"  },
+       { "/usr",            "usr"  },
+       { "/usr/",           "usr"  },
+       { "/usr//",          "usr"  },
+       { "/usr/lib",        "lib"  },
+       { "usr/lib",         "lib"  },
+       { "usr/lib///",      "lib"  },
+
+#if defined(__MINGW32__) || defined(_MSC_VER)
+       /* --- win32 type paths --- */
+       { "\\usr",           "usr"  },
+       { "\\usr\\",         "usr"  },
+       { "\\usr\\\\",       "usr"  },
+       { "\\usr\\lib",      "lib"  },
+       { "usr\\lib",        "lib"  },
+       { "usr\\lib\\\\\\",  "lib"  },
+       { "C:/usr",          "usr"  },
+       { "C:/usr",          "usr"  },
+       { "C:/usr/",         "usr"  },
+       { "C:/usr//",        "usr"  },
+       { "C:/usr/lib",      "lib"  },
+       { "C:usr/lib",       "lib"  },
+       { "C:usr/lib///",    "lib"  },
+       { "C:",              "."    },
+       { "C:a",             "a"    },
+       { "C:/",             "/"    },
+       { "C:///",           "/"    },
+       { "\\",              "\\", "/" },
+       { "\\\\",            "\\", "/" },
+       { "\\\\\\",          "\\", "/" },
+#endif
+       { NULL,              NULL   }
+};
+
+static struct test_data dirname_data[] = {
+       /* --- POSIX type paths --- */
+       { NULL,              "."      },
+       { "",                "."      },
+       { ".",               "."      },
+       { "..",              "."      },
+       { "/",               "/"      },
+       { "//",              "/", "//" },
+       { "///",             "/", "//" },
+       { "////",            "/", "//" },
+       { "usr",             "."      },
+       { "/usr",            "/"      },
+       { "/usr/",           "/"      },
+       { "/usr//",          "/"      },
+       { "/usr/lib",        "/usr"   },
+       { "usr/lib",         "usr"    },
+       { "usr/lib///",      "usr"    },
+
+#if defined(__MINGW32__) || defined(_MSC_VER)
+       /* --- win32 type paths --- */
+       { "\\",              "\\"     },
+       { "\\\\",            "\\\\"   },
+       { "\\usr",           "\\"     },
+       { "\\usr\\",         "\\"     },
+       { "\\usr\\\\",       "\\"     },
+       { "\\usr\\lib",      "\\usr"  },
+       { "usr\\lib",        "usr"    },
+       { "usr\\lib\\\\\\",  "usr"    },
+       { "C:a",             "C:."    },
+       { "C:/",             "C:/"    },
+       { "C:///",           "C:/"    },
+       { "C:/usr",          "C:/"    },
+       { "C:/usr/",         "C:/"    },
+       { "C:/usr//",        "C:/"    },
+       { "C:/usr/lib",      "C:/usr" },
+       { "C:usr/lib",       "C:usr"  },
+       { "C:usr/lib///",    "C:usr"  },
+       { "\\\\\\",          "\\"     },
+       { "\\\\\\\\",        "\\"     },
+       { "C:",              "C:.", "." },
+#endif
+       { NULL,              NULL     }
+};
+
+int main(int argc, char **argv)
+{
+       if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) {
+               char *buf = xmallocz(strlen(argv[2]));
+               int rv = normalize_path_copy(buf, argv[2]);
+               if (rv)
+                       buf = "++failed++";
+               puts(buf);
+               return 0;
+       }
+
+       if (argc >= 2 && !strcmp(argv[1], "real_path")) {
+               while (argc > 2) {
+                       puts(real_path(argv[2]));
+                       argc--;
+                       argv++;
+               }
+               return 0;
+       }
+
+       if (argc >= 2 && !strcmp(argv[1], "absolute_path")) {
+               while (argc > 2) {
+                       puts(absolute_path(argv[2]));
+                       argc--;
+                       argv++;
+               }
+               return 0;
+       }
+
+       if (argc == 4 && !strcmp(argv[1], "longest_ancestor_length")) {
+               int len;
+               struct string_list ceiling_dirs = STRING_LIST_INIT_DUP;
+               char *path = xstrdup(argv[2]);
+
+               /*
+                * We have to normalize the arguments because under
+                * Windows, bash mangles arguments that look like
+                * absolute POSIX paths or colon-separate lists of
+                * absolute POSIX paths into DOS paths (e.g.,
+                * "/foo:/foo/bar" might be converted to
+                * "D:\Src\msysgit\foo;D:\Src\msysgit\foo\bar"),
+                * whereas longest_ancestor_length() requires paths
+                * that use forward slashes.
+                */
+               if (normalize_path_copy(path, path))
+                       die("Path \"%s\" could not be normalized", argv[2]);
+               string_list_split(&ceiling_dirs, argv[3], PATH_SEP, -1);
+               filter_string_list(&ceiling_dirs, 0,
+                                  normalize_ceiling_entry, NULL);
+               len = longest_ancestor_length(path, &ceiling_dirs);
+               string_list_clear(&ceiling_dirs, 0);
+               free(path);
+               printf("%d\n", len);
+               return 0;
+       }
+
+       if (argc >= 4 && !strcmp(argv[1], "prefix_path")) {
+               char *prefix = argv[2];
+               int prefix_len = strlen(prefix);
+               int nongit_ok;
+               setup_git_directory_gently(&nongit_ok);
+               while (argc > 3) {
+                       puts(prefix_path(prefix, prefix_len, argv[3]));
+                       argc--;
+                       argv++;
+               }
+               return 0;
+       }
+
+       if (argc == 4 && !strcmp(argv[1], "strip_path_suffix")) {
+               char *prefix = strip_path_suffix(argv[2], argv[3]);
+               printf("%s\n", prefix ? prefix : "(null)");
+               return 0;
+       }
+
+       if (argc == 3 && !strcmp(argv[1], "print_path")) {
+               puts(argv[2]);
+               return 0;
+       }
+
+       if (argc == 4 && !strcmp(argv[1], "relative_path")) {
+               struct strbuf sb = STRBUF_INIT;
+               const char *in, *prefix, *rel;
+               normalize_argv_string(&in, argv[2]);
+               normalize_argv_string(&prefix, argv[3]);
+               rel = relative_path(in, prefix, &sb);
+               if (!rel)
+                       puts("(null)");
+               else
+                       puts(strlen(rel) > 0 ? rel : "(empty)");
+               strbuf_release(&sb);
+               return 0;
+       }
+
+       if (argc == 2 && !strcmp(argv[1], "basename"))
+               return test_function(basename_data, basename, argv[1]);
+
+       if (argc == 2 && !strcmp(argv[1], "dirname"))
+               return test_function(dirname_data, dirname, argv[1]);
+
+       fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
+               argv[1] ? argv[1] : "(there was none)");
+       return 1;
+}
diff --git a/t/helper/test-prio-queue.c b/t/helper/test-prio-queue.c
new file mode 100644 (file)
index 0000000..7be72f0
--- /dev/null
@@ -0,0 +1,39 @@
+#include "cache.h"
+#include "prio-queue.h"
+
+static int intcmp(const void *va, const void *vb, void *data)
+{
+       const int *a = va, *b = vb;
+       return *a - *b;
+}
+
+static void show(int *v)
+{
+       if (!v)
+               printf("NULL\n");
+       else
+               printf("%d\n", *v);
+       free(v);
+}
+
+int main(int argc, char **argv)
+{
+       struct prio_queue pq = { intcmp };
+
+       while (*++argv) {
+               if (!strcmp(*argv, "get"))
+                       show(prio_queue_get(&pq));
+               else if (!strcmp(*argv, "dump")) {
+                       int *v;
+                       while ((v = prio_queue_get(&pq)))
+                              show(v);
+               }
+               else {
+                       int *v = malloc(sizeof(*v));
+                       *v = atoi(*argv);
+                       prio_queue_put(&pq, v);
+               }
+       }
+
+       return 0;
+}
diff --git a/t/helper/test-read-cache.c b/t/helper/test-read-cache.c
new file mode 100644 (file)
index 0000000..b25bcf1
--- /dev/null
@@ -0,0 +1,13 @@
+#include "cache.h"
+
+int main (int argc, char **argv)
+{
+       int i, cnt = 1;
+       if (argc == 2)
+               cnt = strtol(argv[1], NULL, 0);
+       for (i = 0; i < cnt; i++) {
+               read_cache();
+               discard_cache();
+       }
+       return 0;
+}
diff --git a/t/helper/test-regex.c b/t/helper/test-regex.c
new file mode 100644 (file)
index 0000000..0dc598e
--- /dev/null
@@ -0,0 +1,20 @@
+#include "git-compat-util.h"
+
+int main(int argc, char **argv)
+{
+       char *pat = "[^={} \t]+";
+       char *str = "={}\nfred";
+       regex_t r;
+       regmatch_t m[1];
+
+       if (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE))
+               die("failed regcomp() for pattern '%s'", pat);
+       if (regexec(&r, str, 1, m, 0))
+               die("no match of pattern '%s' to string '%s'", pat, str);
+
+       /* http://sourceware.org/bugzilla/show_bug.cgi?id=3957  */
+       if (m[0].rm_so == 3) /* matches '\n' when it should not */
+               die("regex bug confirmed: re-build git with NO_REGEX=1");
+
+       exit(0);
+}
diff --git a/t/helper/test-revision-walking.c b/t/helper/test-revision-walking.c
new file mode 100644 (file)
index 0000000..3d03133
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * test-revision-walking.c: test revision walking API.
+ *
+ * (C) 2012 Heiko Voigt <hvoigt@hvoigt.net>
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "cache.h"
+#include "commit.h"
+#include "diff.h"
+#include "revision.h"
+
+static void print_commit(struct commit *commit)
+{
+       struct strbuf sb = STRBUF_INIT;
+       struct pretty_print_context ctx = {0};
+       ctx.date_mode.type = DATE_NORMAL;
+       format_commit_message(commit, " %m %s", &sb, &ctx);
+       printf("%s\n", sb.buf);
+       strbuf_release(&sb);
+}
+
+static int run_revision_walk(void)
+{
+       struct rev_info rev;
+       struct commit *commit;
+       const char *argv[] = {NULL, "--all", NULL};
+       int argc = ARRAY_SIZE(argv) - 1;
+       int got_revision = 0;
+
+       init_revisions(&rev, NULL);
+       setup_revisions(argc, argv, &rev, NULL);
+       if (prepare_revision_walk(&rev))
+               die("revision walk setup failed");
+
+       while ((commit = get_revision(&rev)) != NULL) {
+               print_commit(commit);
+               got_revision = 1;
+       }
+
+       reset_revision_walk();
+       return got_revision;
+}
+
+int main(int argc, char **argv)
+{
+       if (argc < 2)
+               return 1;
+
+       setup_git_directory();
+
+       if (!strcmp(argv[1], "run-twice")) {
+               printf("1st\n");
+               if (!run_revision_walk())
+                       return 1;
+               printf("2nd\n");
+               if (!run_revision_walk())
+                       return 1;
+
+               return 0;
+       }
+
+       fprintf(stderr, "check usage\n");
+       return 1;
+}
diff --git a/t/helper/test-run-command.c b/t/helper/test-run-command.c
new file mode 100644 (file)
index 0000000..30a64a9
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * test-run-command.c: test run command API.
+ *
+ * (C) 2009 Ilari Liusvaara <ilari.liusvaara@elisanet.fi>
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "git-compat-util.h"
+#include "run-command.h"
+#include "argv-array.h"
+#include "strbuf.h"
+#include <string.h>
+#include <errno.h>
+
+static int number_callbacks;
+static int parallel_next(struct child_process *cp,
+                        struct strbuf *err,
+                        void *cb,
+                        void **task_cb)
+{
+       struct child_process *d = cb;
+       if (number_callbacks >= 4)
+               return 0;
+
+       argv_array_pushv(&cp->args, d->argv);
+       strbuf_addf(err, "preloaded output of a child\n");
+       number_callbacks++;
+       return 1;
+}
+
+static int no_job(struct child_process *cp,
+                 struct strbuf *err,
+                 void *cb,
+                 void **task_cb)
+{
+       strbuf_addf(err, "no further jobs available\n");
+       return 0;
+}
+
+static int task_finished(int result,
+                        struct strbuf *err,
+                        void *pp_cb,
+                        void *pp_task_cb)
+{
+       strbuf_addf(err, "asking for a quick stop\n");
+       return 1;
+}
+
+int main(int argc, char **argv)
+{
+       struct child_process proc = CHILD_PROCESS_INIT;
+       int jobs;
+
+       if (argc < 3)
+               return 1;
+       proc.argv = (const char **)argv + 2;
+
+       if (!strcmp(argv[1], "start-command-ENOENT")) {
+               if (start_command(&proc) < 0 && errno == ENOENT)
+                       return 0;
+               fprintf(stderr, "FAIL %s\n", argv[1]);
+               return 1;
+       }
+       if (!strcmp(argv[1], "run-command"))
+               exit(run_command(&proc));
+
+       jobs = atoi(argv[2]);
+       proc.argv = (const char **)argv + 3;
+
+       if (!strcmp(argv[1], "run-command-parallel"))
+               exit(run_processes_parallel(jobs, parallel_next,
+                                           NULL, NULL, &proc));
+
+       if (!strcmp(argv[1], "run-command-abort"))
+               exit(run_processes_parallel(jobs, parallel_next,
+                                           NULL, task_finished, &proc));
+
+       if (!strcmp(argv[1], "run-command-no-jobs"))
+               exit(run_processes_parallel(jobs, no_job,
+                                           NULL, task_finished, &proc));
+
+       fprintf(stderr, "check usage\n");
+       return 1;
+}
diff --git a/t/helper/test-scrap-cache-tree.c b/t/helper/test-scrap-cache-tree.c
new file mode 100644 (file)
index 0000000..6efee31
--- /dev/null
@@ -0,0 +1,17 @@
+#include "cache.h"
+#include "lockfile.h"
+#include "tree.h"
+#include "cache-tree.h"
+
+static struct lock_file index_lock;
+
+int main(int ac, char **av)
+{
+       hold_locked_index(&index_lock, 1);
+       if (read_cache() < 0)
+               die("unable to read index file");
+       active_cache_tree = NULL;
+       if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
+               die("unable to write index file");
+       return 0;
+}
diff --git a/t/helper/test-sha1-array.c b/t/helper/test-sha1-array.c
new file mode 100644 (file)
index 0000000..60ea1d5
--- /dev/null
@@ -0,0 +1,34 @@
+#include "cache.h"
+#include "sha1-array.h"
+
+static void print_sha1(const unsigned char sha1[20], void *data)
+{
+       puts(sha1_to_hex(sha1));
+}
+
+int main(int argc, char **argv)
+{
+       struct sha1_array array = SHA1_ARRAY_INIT;
+       struct strbuf line = STRBUF_INIT;
+
+       while (strbuf_getline(&line, stdin) != EOF) {
+               const char *arg;
+               unsigned char sha1[20];
+
+               if (skip_prefix(line.buf, "append ", &arg)) {
+                       if (get_sha1_hex(arg, sha1))
+                               die("not a hexadecimal SHA1: %s", arg);
+                       sha1_array_append(&array, sha1);
+               } else if (skip_prefix(line.buf, "lookup ", &arg)) {
+                       if (get_sha1_hex(arg, sha1))
+                               die("not a hexadecimal SHA1: %s", arg);
+                       printf("%d\n", sha1_array_lookup(&array, sha1));
+               } else if (!strcmp(line.buf, "clear"))
+                       sha1_array_clear(&array);
+               else if (!strcmp(line.buf, "for_each_unique"))
+                       sha1_array_for_each_unique(&array, print_sha1, NULL);
+               else
+                       die("unknown command: %s", line.buf);
+       }
+       return 0;
+}
diff --git a/t/helper/test-sha1.c b/t/helper/test-sha1.c
new file mode 100644 (file)
index 0000000..e57eae1
--- /dev/null
@@ -0,0 +1,56 @@
+#include "cache.h"
+
+int main(int ac, char **av)
+{
+       git_SHA_CTX ctx;
+       unsigned char sha1[20];
+       unsigned bufsz = 8192;
+       int binary = 0;
+       char *buffer;
+
+       if (ac == 2) {
+               if (!strcmp(av[1], "-b"))
+                       binary = 1;
+               else
+                       bufsz = strtoul(av[1], NULL, 10) * 1024 * 1024;
+       }
+
+       if (!bufsz)
+               bufsz = 8192;
+
+       while ((buffer = malloc(bufsz)) == NULL) {
+               fprintf(stderr, "bufsz %u is too big, halving...\n", bufsz);
+               bufsz /= 2;
+               if (bufsz < 1024)
+                       die("OOPS");
+       }
+
+       git_SHA1_Init(&ctx);
+
+       while (1) {
+               ssize_t sz, this_sz;
+               char *cp = buffer;
+               unsigned room = bufsz;
+               this_sz = 0;
+               while (room) {
+                       sz = xread(0, cp, room);
+                       if (sz == 0)
+                               break;
+                       if (sz < 0)
+                               die_errno("test-sha1");
+                       this_sz += sz;
+                       cp += sz;
+                       room -= sz;
+               }
+               if (this_sz == 0)
+                       break;
+               git_SHA1_Update(&ctx, buffer, this_sz);
+       }
+       git_SHA1_Final(sha1, &ctx);
+
+       if (binary)
+               fwrite(sha1, 1, 20, stdout);
+       else
+               puts(sha1_to_hex(sha1));
+       exit(0);
+}
diff --git a/t/helper/test-sha1.sh b/t/helper/test-sha1.sh
new file mode 100755 (executable)
index 0000000..750b95a
--- /dev/null
@@ -0,0 +1,83 @@
+#!/bin/sh
+
+dd if=/dev/zero bs=1048576 count=100 2>/dev/null |
+/usr/bin/time t/helper/test-sha1 >/dev/null
+
+while read expect cnt pfx
+do
+       case "$expect" in '#'*) continue ;; esac
+       actual=$(
+               {
+                       test -z "$pfx" || echo "$pfx"
+                       dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null |
+                       perl -pe 'y/\000/g/'
+               } | ./t/helper/test-sha1 $cnt
+       )
+       if test "$expect" = "$actual"
+       then
+               echo "OK: $expect $cnt $pfx"
+       else
+               echo >&2 "OOPS: $cnt"
+               echo >&2 "expect: $expect"
+               echo >&2 "actual: $actual"
+               exit 1
+       fi
+done <<EOF
+da39a3ee5e6b4b0d3255bfef95601890afd80709 0
+3f786850e387550fdab836ed7e6dc881de23001b 0 a
+5277cbb45a15902137d332d97e89cf8136545485 0 ab
+03cfd743661f07975fa2f1220c5194cbaff48451 0 abc
+3330b4373640f9e4604991e73c7e86bfd8da2dc3 0 abcd
+ec11312386ad561674f724b8cca7cf1796e26d1d 0 abcde
+bdc37c074ec4ee6050d68bc133c6b912f36474df 0 abcdef
+69bca99b923859f2dc486b55b87f49689b7358c7 0 abcdefg
+e414af7161c9554089f4106d6f1797ef14a73666 0 abcdefgh
+0707f2970043f9f7c22029482db27733deaec029 0 abcdefghi
+a4dd8aa74a5636728fe52451636e2e17726033aa 1
+9986b45e2f4d7086372533bb6953a8652fa3644a 1 frotz
+23d8d4f788e8526b4877548a32577543cbaaf51f 10
+8cd23f822ab44c7f481b8c92d591f6d1fcad431c 10 frotz
+f3b5604a4e604899c1233edb3bf1cc0ede4d8c32 512
+b095bd837a371593048136e429e9ac4b476e1bb3 512 frotz
+08fa81d6190948de5ccca3966340cc48c10cceac 1200 xyzzy
+e33a291f42c30a159733dd98b8b3e4ff34158ca0 4090 4G
+#a3bf783bc20caa958f6cb24dd140a7b21984838d 9999 nitfol
+EOF
+
+exit
+
+# generating test vectors
+# inputs are number of megabytes followed by some random string to prefix.
+
+while read cnt pfx
+do
+       actual=$(
+               {
+                       test -z "$pfx" || echo "$pfx"
+                       dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null |
+                       perl -pe 'y/\000/g/'
+               } | sha1sum |
+               sed -e 's/ .*//'
+       )
+       echo "$actual $cnt $pfx"
+done <<EOF
+0
+0 a
+0 ab
+0 abc
+0 abcd
+0 abcde
+0 abcdef
+0 abcdefg
+0 abcdefgh
+0 abcdefghi
+1
+1 frotz
+10
+10 frotz
+512
+512 frotz
+1200 xyzzy
+4090 4G
+9999 nitfol
+EOF
diff --git a/t/helper/test-sigchain.c b/t/helper/test-sigchain.c
new file mode 100644 (file)
index 0000000..e499fce
--- /dev/null
@@ -0,0 +1,22 @@
+#include "cache.h"
+#include "sigchain.h"
+
+#define X(f) \
+static void f(int sig) { \
+       puts(#f); \
+       fflush(stdout); \
+       sigchain_pop(sig); \
+       raise(sig); \
+}
+X(one)
+X(two)
+X(three)
+#undef X
+
+int main(int argc, char **argv) {
+       sigchain_push(SIGTERM, one);
+       sigchain_push(SIGTERM, two);
+       sigchain_push(SIGTERM, three);
+       raise(SIGTERM);
+       return 0;
+}
diff --git a/t/helper/test-string-list.c b/t/helper/test-string-list.c
new file mode 100644 (file)
index 0000000..14bdf9d
--- /dev/null
@@ -0,0 +1,103 @@
+#include "cache.h"
+#include "string-list.h"
+
+/*
+ * Parse an argument into a string list.  arg should either be a
+ * ':'-separated list of strings, or "-" to indicate an empty string
+ * list (as opposed to "", which indicates a string list containing a
+ * single empty string).  list->strdup_strings must be set.
+ */
+static void parse_string_list(struct string_list *list, const char *arg)
+{
+       if (!strcmp(arg, "-"))
+               return;
+
+       (void)string_list_split(list, arg, ':', -1);
+}
+
+static void write_list(const struct string_list *list)
+{
+       int i;
+       for (i = 0; i < list->nr; i++)
+               printf("[%d]: \"%s\"\n", i, list->items[i].string);
+}
+
+static void write_list_compact(const struct string_list *list)
+{
+       int i;
+       if (!list->nr)
+               printf("-\n");
+       else {
+               printf("%s", list->items[0].string);
+               for (i = 1; i < list->nr; i++)
+                       printf(":%s", list->items[i].string);
+               printf("\n");
+       }
+}
+
+static int prefix_cb(struct string_list_item *item, void *cb_data)
+{
+       const char *prefix = (const char *)cb_data;
+       return starts_with(item->string, prefix);
+}
+
+int main(int argc, char **argv)
+{
+       if (argc == 5 && !strcmp(argv[1], "split")) {
+               struct string_list list = STRING_LIST_INIT_DUP;
+               int i;
+               const char *s = argv[2];
+               int delim = *argv[3];
+               int maxsplit = atoi(argv[4]);
+
+               i = string_list_split(&list, s, delim, maxsplit);
+               printf("%d\n", i);
+               write_list(&list);
+               string_list_clear(&list, 0);
+               return 0;
+       }
+
+       if (argc == 5 && !strcmp(argv[1], "split_in_place")) {
+               struct string_list list = STRING_LIST_INIT_NODUP;
+               int i;
+               char *s = xstrdup(argv[2]);
+               int delim = *argv[3];
+               int maxsplit = atoi(argv[4]);
+
+               i = string_list_split_in_place(&list, s, delim, maxsplit);
+               printf("%d\n", i);
+               write_list(&list);
+               string_list_clear(&list, 0);
+               free(s);
+               return 0;
+       }
+
+       if (argc == 4 && !strcmp(argv[1], "filter")) {
+               /*
+                * Retain only the items that have the specified prefix.
+                * Arguments: list|- prefix
+                */
+               struct string_list list = STRING_LIST_INIT_DUP;
+               const char *prefix = argv[3];
+
+               parse_string_list(&list, argv[2]);
+               filter_string_list(&list, 0, prefix_cb, (void *)prefix);
+               write_list_compact(&list);
+               string_list_clear(&list, 0);
+               return 0;
+       }
+
+       if (argc == 3 && !strcmp(argv[1], "remove_duplicates")) {
+               struct string_list list = STRING_LIST_INIT_DUP;
+
+               parse_string_list(&list, argv[2]);
+               string_list_remove_duplicates(&list, 0);
+               write_list_compact(&list);
+               string_list_clear(&list, 0);
+               return 0;
+       }
+
+       fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
+               argv[1] ? argv[1] : "(there was none)");
+       return 1;
+}
diff --git a/t/helper/test-submodule-config.c b/t/helper/test-submodule-config.c
new file mode 100644 (file)
index 0000000..dab8c27
--- /dev/null
@@ -0,0 +1,76 @@
+#include "cache.h"
+#include "submodule-config.h"
+#include "submodule.h"
+
+static void die_usage(int argc, char **argv, const char *msg)
+{
+       fprintf(stderr, "%s\n", msg);
+       fprintf(stderr, "Usage: %s [<commit> <submodulepath>] ...\n", argv[0]);
+       exit(1);
+}
+
+static int git_test_config(const char *var, const char *value, void *cb)
+{
+       return parse_submodule_config_option(var, value);
+}
+
+int main(int argc, char **argv)
+{
+       char **arg = argv;
+       int my_argc = argc;
+       int output_url = 0;
+       int lookup_name = 0;
+
+       arg++;
+       my_argc--;
+       while (starts_with(arg[0], "--")) {
+               if (!strcmp(arg[0], "--url"))
+                       output_url = 1;
+               if (!strcmp(arg[0], "--name"))
+                       lookup_name = 1;
+               arg++;
+               my_argc--;
+       }
+
+       if (my_argc % 2 != 0)
+               die_usage(argc, argv, "Wrong number of arguments.");
+
+       setup_git_directory();
+       gitmodules_config();
+       git_config(git_test_config, NULL);
+
+       while (*arg) {
+               unsigned char commit_sha1[20];
+               const struct submodule *submodule;
+               const char *commit;
+               const char *path_or_name;
+
+               commit = arg[0];
+               path_or_name = arg[1];
+
+               if (commit[0] == '\0')
+                       hashcpy(commit_sha1, null_sha1);
+               else if (get_sha1(commit, commit_sha1) < 0)
+                       die_usage(argc, argv, "Commit not found.");
+
+               if (lookup_name) {
+                       submodule = submodule_from_name(commit_sha1, path_or_name);
+               } else
+                       submodule = submodule_from_path(commit_sha1, path_or_name);
+               if (!submodule)
+                       die_usage(argc, argv, "Submodule not found.");
+
+               if (output_url)
+                       printf("Submodule url: '%s' for path '%s'\n",
+                                       submodule->url, submodule->path);
+               else
+                       printf("Submodule name: '%s' for path '%s'\n",
+                                       submodule->name, submodule->path);
+
+               arg += 2;
+       }
+
+       submodule_free();
+
+       return 0;
+}
diff --git a/t/helper/test-subprocess.c b/t/helper/test-subprocess.c
new file mode 100644 (file)
index 0000000..56881a0
--- /dev/null
@@ -0,0 +1,19 @@
+#include "cache.h"
+#include "run-command.h"
+
+int main(int argc, char **argv)
+{
+       struct child_process cp = CHILD_PROCESS_INIT;
+       int nogit = 0;
+
+       setup_git_directory_gently(&nogit);
+       if (nogit)
+               die("No git repo found");
+       if (argc > 1 && !strcmp(argv[1], "--setup-work-tree")) {
+               setup_work_tree();
+               argv++;
+       }
+       cp.git_cmd = 1;
+       cp.argv = (const char **)argv + 1;
+       return run_command(&cp);
+}
diff --git a/t/helper/test-svn-fe.c b/t/helper/test-svn-fe.c
new file mode 100644 (file)
index 0000000..120ec96
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * test-svn-fe: Code to exercise the svn import lib
+ */
+
+#include "git-compat-util.h"
+#include "vcs-svn/svndump.h"
+#include "vcs-svn/svndiff.h"
+#include "vcs-svn/sliding_window.h"
+#include "vcs-svn/line_buffer.h"
+
+static const char test_svnfe_usage[] =
+       "test-svn-fe (<dumpfile> | [-d] <preimage> <delta> <len>)";
+
+static int apply_delta(int argc, char *argv[])
+{
+       struct line_buffer preimage = LINE_BUFFER_INIT;
+       struct line_buffer delta = LINE_BUFFER_INIT;
+       struct sliding_view preimage_view = SLIDING_VIEW_INIT(&preimage, -1);
+
+       if (argc != 5)
+               usage(test_svnfe_usage);
+
+       if (buffer_init(&preimage, argv[2]))
+               die_errno("cannot open preimage");
+       if (buffer_init(&delta, argv[3]))
+               die_errno("cannot open delta");
+       if (svndiff0_apply(&delta, (off_t) strtoumax(argv[4], NULL, 0),
+                                       &preimage_view, stdout))
+               return 1;
+       if (buffer_deinit(&preimage))
+               die_errno("cannot close preimage");
+       if (buffer_deinit(&delta))
+               die_errno("cannot close delta");
+       strbuf_release(&preimage_view.buf);
+       return 0;
+}
+
+int main(int argc, char *argv[])
+{
+       if (argc == 2) {
+               if (svndump_init(argv[1]))
+                       return 1;
+               svndump_read(NULL, "refs/heads/master", "refs/notes/svn/revs");
+               svndump_deinit();
+               svndump_reset();
+               return 0;
+       }
+
+       if (argc >= 2 && !strcmp(argv[1], "-d"))
+               return apply_delta(argc, argv);
+       usage(test_svnfe_usage);
+}
diff --git a/t/helper/test-urlmatch-normalization.c b/t/helper/test-urlmatch-normalization.c
new file mode 100644 (file)
index 0000000..090bf21
--- /dev/null
@@ -0,0 +1,50 @@
+#include "git-compat-util.h"
+#include "urlmatch.h"
+
+int main(int argc, char **argv)
+{
+       const char usage[] = "test-urlmatch-normalization [-p | -l] <url1> | <url1> <url2>";
+       char *url1, *url2;
+       int opt_p = 0, opt_l = 0;
+
+       /*
+        * For one url, succeed if url_normalize succeeds on it, fail otherwise.
+        * For two urls, succeed only if url_normalize succeeds on both and
+        * the results compare equal with strcmp.  If -p is given (one url only)
+        * and url_normalize succeeds, print the result followed by "\n".  If
+        * -l is given (one url only) and url_normalize succeeds, print the
+        * returned length in decimal followed by "\n".
+        */
+
+       if (argc > 1 && !strcmp(argv[1], "-p")) {
+               opt_p = 1;
+               argc--;
+               argv++;
+       } else if (argc > 1 && !strcmp(argv[1], "-l")) {
+               opt_l = 1;
+               argc--;
+               argv++;
+       }
+
+       if (argc < 2 || argc > 3)
+               die("%s", usage);
+
+       if (argc == 2) {
+               struct url_info info;
+               url1 = url_normalize(argv[1], &info);
+               if (!url1)
+                       return 1;
+               if (opt_p)
+                       printf("%s\n", url1);
+               if (opt_l)
+                       printf("%u\n", (unsigned)info.url_len);
+               return 0;
+       }
+
+       if (opt_p || opt_l)
+               die("%s", usage);
+
+       url1 = url_normalize(argv[1], NULL);
+       url2 = url_normalize(argv[2], NULL);
+       return (url1 && url2 && !strcmp(url1, url2)) ? 0 : 1;
+}
diff --git a/t/helper/test-wildmatch.c b/t/helper/test-wildmatch.c
new file mode 100644 (file)
index 0000000..578b164
--- /dev/null
@@ -0,0 +1,21 @@
+#include "cache.h"
+
+int main(int argc, char **argv)
+{
+       int i;
+       for (i = 2; i < argc; i++) {
+               if (argv[i][0] == '/')
+                       die("Forward slash is not allowed at the beginning of the\n"
+                           "pattern because Windows does not like it. Use `XXX/' instead.");
+               else if (!strncmp(argv[i], "XXX/", 4))
+                       argv[i] += 3;
+       }
+       if (!strcmp(argv[1], "wildmatch"))
+               return !!wildmatch(argv[3], argv[2], WM_PATHNAME, NULL);
+       else if (!strcmp(argv[1], "iwildmatch"))
+               return !!wildmatch(argv[3], argv[2], WM_PATHNAME | WM_CASEFOLD, NULL);
+       else if (!strcmp(argv[1], "pathmatch"))
+               return !!wildmatch(argv[3], argv[2], 0, NULL);
+       else
+               return 1;
+}
index c1efb8e445402cccdddda987e1eafad4d4bb75f9..150aeaf7137b6521874322fd9e966d4061d71044 100755 (executable)
@@ -308,7 +308,7 @@ test_expect_success 'clone checking out a tag' '
 
 setup_ssh_wrapper () {
        test_expect_success 'setup ssh wrapper' '
-               cp "$GIT_BUILD_DIR/test-fake-ssh$X" \
+               cp "$GIT_BUILD_DIR/t/helper/test-fake-ssh$X" \
                        "$TRASH_DIRECTORY/ssh-wrapper$X" &&
                GIT_SSH="$TRASH_DIRECTORY/ssh-wrapper$X" &&
                export GIT_SSH &&
index 0b47eb6bb299492d31111c94557c216bb3f32c7f..cd0ecd444de0cb38bdcfda159f1e8c18b7fdce03 100644 (file)
@@ -854,10 +854,10 @@ test -d "$GIT_BUILD_DIR"/templates/blt || {
        error "You haven't built things yet, have you?"
 }
 
-if ! test -x "$GIT_BUILD_DIR"/test-chmtime
+if ! test -x "$GIT_BUILD_DIR"/t/helper/test-chmtime
 then
        echo >&2 'You need to build test-chmtime:'
-       echo >&2 'Run "make test-chmtime" in the source (toplevel) directory'
+       echo >&2 'Run "make t/helper/test-chmtime" in the source (toplevel) directory'
        exit 1
 fi
 
diff --git a/test-chmtime.c b/test-chmtime.c
deleted file mode 100644 (file)
index dfe8a83..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * This program can either change modification time of the given
- * file(s) or just print it. The program does not change atime or
- * ctime (their values are explicitly preserved).
- *
- * The mtime can be changed to an absolute value:
- *
- *     test-chmtime =<seconds> file...
- *
- * Relative to the current time as returned by time(3):
- *
- *     test-chmtime =+<seconds> (or =-<seconds>) file...
- *
- * Or relative to the current mtime of the file:
- *
- *     test-chmtime <seconds> file...
- *     test-chmtime +<seconds> (or -<seconds>) file...
- *
- * Examples:
- *
- * To just print the mtime use --verbose and set the file mtime offset to 0:
- *
- *     test-chmtime -v +0 file
- *
- * To set the mtime to current time:
- *
- *     test-chmtime =+0 file
- *
- */
-#include "git-compat-util.h"
-#include <utime.h>
-
-static const char usage_str[] = "-v|--verbose (+|=|=+|=-|-)<seconds> <file>...";
-
-static int timespec_arg(const char *arg, long int *set_time, int *set_eq)
-{
-       char *test;
-       const char *timespec = arg;
-       *set_eq = (*timespec == '=') ? 1 : 0;
-       if (*set_eq) {
-               timespec++;
-               if (*timespec == '+') {
-                       *set_eq = 2; /* relative "in the future" */
-                       timespec++;
-               }
-       }
-       *set_time = strtol(timespec, &test, 10);
-       if (*test) {
-               fprintf(stderr, "Not a base-10 integer: %s\n", arg + 1);
-               return 0;
-       }
-       if ((*set_eq && *set_time < 0) || *set_eq == 2) {
-               time_t now = time(NULL);
-               *set_time += now;
-       }
-       return 1;
-}
-
-int main(int argc, char *argv[])
-{
-       static int verbose;
-
-       int i = 1;
-       /* no mtime change by default */
-       int set_eq = 0;
-       long int set_time = 0;
-
-       if (argc < 3)
-               goto usage;
-
-       if (strcmp(argv[i], "--verbose") == 0 || strcmp(argv[i], "-v") == 0) {
-               verbose = 1;
-               ++i;
-       }
-       if (timespec_arg(argv[i], &set_time, &set_eq))
-               ++i;
-       else
-               goto usage;
-
-       for (; i < argc; i++) {
-               struct stat sb;
-               struct utimbuf utb;
-
-               if (stat(argv[i], &sb) < 0) {
-                       fprintf(stderr, "Failed to stat %s: %s\n",
-                               argv[i], strerror(errno));
-                       return 1;
-               }
-
-#ifdef GIT_WINDOWS_NATIVE
-               if (!(sb.st_mode & S_IWUSR) &&
-                               chmod(argv[i], sb.st_mode | S_IWUSR)) {
-                       fprintf(stderr, "Could not make user-writable %s: %s",
-                               argv[i], strerror(errno));
-                       return 1;
-               }
-#endif
-
-               utb.actime = sb.st_atime;
-               utb.modtime = set_eq ? set_time : sb.st_mtime + set_time;
-
-               if (verbose) {
-                       uintmax_t mtime = utb.modtime < 0 ? 0: utb.modtime;
-                       printf("%"PRIuMAX"\t%s\n", mtime, argv[i]);
-               }
-
-               if (utb.modtime != sb.st_mtime && utime(argv[i], &utb) < 0) {
-                       fprintf(stderr, "Failed to modify time on %s: %s\n",
-                               argv[i], strerror(errno));
-                       return 1;
-               }
-       }
-
-       return 0;
-
-usage:
-       fprintf(stderr, "usage: %s %s\n", argv[0], usage_str);
-       return 1;
-}
diff --git a/test-config.c b/test-config.c
deleted file mode 100644 (file)
index 6a77552..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-#include "cache.h"
-#include "string-list.h"
-
-/*
- * This program exposes the C API of the configuration mechanism
- * as a set of simple commands in order to facilitate testing.
- *
- * Reads stdin and prints result of command to stdout:
- *
- * get_value -> prints the value with highest priority for the entered key
- *
- * get_value_multi -> prints all values for the entered key in increasing order
- *                  of priority
- *
- * get_int -> print integer value for the entered key or die
- *
- * get_bool -> print bool value for the entered key or die
- *
- * get_string -> print string value for the entered key or die
- *
- * configset_get_value -> returns value with the highest priority for the entered key
- *                     from a config_set constructed from files entered as arguments.
- *
- * configset_get_value_multi -> returns value_list for the entered key sorted in
- *                             ascending order of priority from a config_set
- *                             constructed from files entered as arguments.
- *
- * Examples:
- *
- * To print the value with highest priority for key "foo.bAr Baz.rock":
- *     test-config get_value "foo.bAr Baz.rock"
- *
- */
-
-
-int main(int argc, char **argv)
-{
-       int i, val;
-       const char *v;
-       const struct string_list *strptr;
-       struct config_set cs;
-       git_configset_init(&cs);
-
-       if (argc < 2) {
-               fprintf(stderr, "Please, provide a command name on the command-line\n");
-               goto exit1;
-       } else if (argc == 3 && !strcmp(argv[1], "get_value")) {
-               if (!git_config_get_value(argv[2], &v)) {
-                       if (!v)
-                               printf("(NULL)\n");
-                       else
-                               printf("%s\n", v);
-                       goto exit0;
-               } else {
-                       printf("Value not found for \"%s\"\n", argv[2]);
-                       goto exit1;
-               }
-       } else if (argc == 3 && !strcmp(argv[1], "get_value_multi")) {
-               strptr = git_config_get_value_multi(argv[2]);
-               if (strptr) {
-                       for (i = 0; i < strptr->nr; i++) {
-                               v = strptr->items[i].string;
-                               if (!v)
-                                       printf("(NULL)\n");
-                               else
-                                       printf("%s\n", v);
-                       }
-                       goto exit0;
-               } else {
-                       printf("Value not found for \"%s\"\n", argv[2]);
-                       goto exit1;
-               }
-       } else if (argc == 3 && !strcmp(argv[1], "get_int")) {
-               if (!git_config_get_int(argv[2], &val)) {
-                       printf("%d\n", val);
-                       goto exit0;
-               } else {
-                       printf("Value not found for \"%s\"\n", argv[2]);
-                       goto exit1;
-               }
-       } else if (argc == 3 && !strcmp(argv[1], "get_bool")) {
-               if (!git_config_get_bool(argv[2], &val)) {
-                       printf("%d\n", val);
-                       goto exit0;
-               } else {
-                       printf("Value not found for \"%s\"\n", argv[2]);
-                       goto exit1;
-               }
-       } else if (argc == 3 && !strcmp(argv[1], "get_string")) {
-               if (!git_config_get_string_const(argv[2], &v)) {
-                       printf("%s\n", v);
-                       goto exit0;
-               } else {
-                       printf("Value not found for \"%s\"\n", argv[2]);
-                       goto exit1;
-               }
-       } else if (!strcmp(argv[1], "configset_get_value")) {
-               for (i = 3; i < argc; i++) {
-                       int err;
-                       if ((err = git_configset_add_file(&cs, argv[i]))) {
-                               fprintf(stderr, "Error (%d) reading configuration file %s.\n", err, argv[i]);
-                               goto exit2;
-                       }
-               }
-               if (!git_configset_get_value(&cs, argv[2], &v)) {
-                       if (!v)
-                               printf("(NULL)\n");
-                       else
-                               printf("%s\n", v);
-                       goto exit0;
-               } else {
-                       printf("Value not found for \"%s\"\n", argv[2]);
-                       goto exit1;
-               }
-       } else if (!strcmp(argv[1], "configset_get_value_multi")) {
-               for (i = 3; i < argc; i++) {
-                       int err;
-                       if ((err = git_configset_add_file(&cs, argv[i]))) {
-                               fprintf(stderr, "Error (%d) reading configuration file %s.\n", err, argv[i]);
-                               goto exit2;
-                       }
-               }
-               strptr = git_configset_get_value_multi(&cs, argv[2]);
-               if (strptr) {
-                       for (i = 0; i < strptr->nr; i++) {
-                               v = strptr->items[i].string;
-                               if (!v)
-                                       printf("(NULL)\n");
-                               else
-                                       printf("%s\n", v);
-                       }
-                       goto exit0;
-               } else {
-                       printf("Value not found for \"%s\"\n", argv[2]);
-                       goto exit1;
-               }
-       }
-
-       die("%s: Please check the syntax and the function name", argv[0]);
-
-exit0:
-       git_configset_clear(&cs);
-       return 0;
-
-exit1:
-       git_configset_clear(&cs);
-       return 1;
-
-exit2:
-       git_configset_clear(&cs);
-       return 2;
-}
diff --git a/test-ctype.c b/test-ctype.c
deleted file mode 100644 (file)
index 707a821..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "cache.h"
-
-static int rc;
-
-static void report_error(const char *class, int ch)
-{
-       printf("%s classifies char %d (0x%02x) wrongly\n", class, ch, ch);
-       rc = 1;
-}
-
-static int is_in(const char *s, int ch)
-{
-       /* We can't find NUL using strchr.  It's classless anyway. */
-       if (ch == '\0')
-               return 0;
-       return !!strchr(s, ch);
-}
-
-#define TEST_CLASS(t,s) {                      \
-       int i;                                  \
-       for (i = 0; i < 256; i++) {             \
-               if (is_in(s, i) != t(i))        \
-                       report_error(#t, i);    \
-       }                                       \
-}
-
-#define DIGIT "0123456789"
-#define LOWER "abcdefghijklmnopqrstuvwxyz"
-#define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-
-int main(int argc, char **argv)
-{
-       TEST_CLASS(isdigit, DIGIT);
-       TEST_CLASS(isspace, " \n\r\t");
-       TEST_CLASS(isalpha, LOWER UPPER);
-       TEST_CLASS(isalnum, LOWER UPPER DIGIT);
-       TEST_CLASS(is_glob_special, "*?[\\");
-       TEST_CLASS(is_regex_special, "$()*+.?[\\^{|");
-       TEST_CLASS(is_pathspec_magic, "!\"#%&',-/:;<=>@_`~");
-
-       return rc;
-}
diff --git a/test-date.c b/test-date.c
deleted file mode 100644 (file)
index 63f3735..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-#include "cache.h"
-
-static const char *usage_msg = "\n"
-"  test-date show [time_t]...\n"
-"  test-date parse [date]...\n"
-"  test-date approxidate [date]...\n";
-
-static void show_dates(char **argv, struct timeval *now)
-{
-       struct strbuf buf = STRBUF_INIT;
-
-       for (; *argv; argv++) {
-               time_t t = atoi(*argv);
-               show_date_relative(t, 0, now, &buf);
-               printf("%s -> %s\n", *argv, buf.buf);
-       }
-       strbuf_release(&buf);
-}
-
-static void parse_dates(char **argv, struct timeval *now)
-{
-       struct strbuf result = STRBUF_INIT;
-
-       for (; *argv; argv++) {
-               unsigned long t;
-               int tz;
-
-               strbuf_reset(&result);
-               parse_date(*argv, &result);
-               if (sscanf(result.buf, "%lu %d", &t, &tz) == 2)
-                       printf("%s -> %s\n",
-                              *argv, show_date(t, tz, DATE_MODE(ISO8601)));
-               else
-                       printf("%s -> bad\n", *argv);
-       }
-       strbuf_release(&result);
-}
-
-static void parse_approxidate(char **argv, struct timeval *now)
-{
-       for (; *argv; argv++) {
-               time_t t;
-               t = approxidate_relative(*argv, now);
-               printf("%s -> %s\n", *argv, show_date(t, 0, DATE_MODE(ISO8601)));
-       }
-}
-
-int main(int argc, char **argv)
-{
-       struct timeval now;
-       const char *x;
-
-       x = getenv("TEST_DATE_NOW");
-       if (x) {
-               now.tv_sec = atoi(x);
-               now.tv_usec = 0;
-       }
-       else
-               gettimeofday(&now, NULL);
-
-       argv++;
-       if (!*argv)
-               usage(usage_msg);
-       if (!strcmp(*argv, "show"))
-               show_dates(argv+1, &now);
-       else if (!strcmp(*argv, "parse"))
-               parse_dates(argv+1, &now);
-       else if (!strcmp(*argv, "approxidate"))
-               parse_approxidate(argv+1, &now);
-       else
-               usage(usage_msg);
-       return 0;
-}
diff --git a/test-delta.c b/test-delta.c
deleted file mode 100644 (file)
index 4595cd6..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * test-delta.c: test code to exercise diff-delta.c and patch-delta.c
- *
- * (C) 2005 Nicolas Pitre <nico@fluxnic.net>
- *
- * This code is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include "git-compat-util.h"
-#include "delta.h"
-#include "cache.h"
-
-static const char usage_str[] =
-       "test-delta (-d|-p) <from_file> <data_file> <out_file>";
-
-int main(int argc, char *argv[])
-{
-       int fd;
-       struct stat st;
-       void *from_buf, *data_buf, *out_buf;
-       unsigned long from_size, data_size, out_size;
-
-       if (argc != 5 || (strcmp(argv[1], "-d") && strcmp(argv[1], "-p"))) {
-               fprintf(stderr, "usage: %s\n", usage_str);
-               return 1;
-       }
-
-       fd = open(argv[2], O_RDONLY);
-       if (fd < 0 || fstat(fd, &st)) {
-               perror(argv[2]);
-               return 1;
-       }
-       from_size = st.st_size;
-       from_buf = mmap(NULL, from_size, PROT_READ, MAP_PRIVATE, fd, 0);
-       if (from_buf == MAP_FAILED) {
-               perror(argv[2]);
-               close(fd);
-               return 1;
-       }
-       close(fd);
-
-       fd = open(argv[3], O_RDONLY);
-       if (fd < 0 || fstat(fd, &st)) {
-               perror(argv[3]);
-               return 1;
-       }
-       data_size = st.st_size;
-       data_buf = mmap(NULL, data_size, PROT_READ, MAP_PRIVATE, fd, 0);
-       if (data_buf == MAP_FAILED) {
-               perror(argv[3]);
-               close(fd);
-               return 1;
-       }
-       close(fd);
-
-       if (argv[1][1] == 'd')
-               out_buf = diff_delta(from_buf, from_size,
-                                    data_buf, data_size,
-                                    &out_size, 0);
-       else
-               out_buf = patch_delta(from_buf, from_size,
-                                     data_buf, data_size,
-                                     &out_size);
-       if (!out_buf) {
-               fprintf(stderr, "delta operation failed (returned NULL)\n");
-               return 1;
-       }
-
-       fd = open (argv[4], O_WRONLY|O_CREAT|O_TRUNC, 0666);
-       if (fd < 0 || write_in_full(fd, out_buf, out_size) != out_size) {
-               perror(argv[4]);
-               return 1;
-       }
-
-       return 0;
-}
diff --git a/test-dump-cache-tree.c b/test-dump-cache-tree.c
deleted file mode 100644 (file)
index bb53c0a..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#include "cache.h"
-#include "tree.h"
-#include "cache-tree.h"
-
-
-static void dump_one(struct cache_tree *it, const char *pfx, const char *x)
-{
-       if (it->entry_count < 0)
-               printf("%-40s %s%s (%d subtrees)\n",
-                      "invalid", x, pfx, it->subtree_nr);
-       else
-               printf("%s %s%s (%d entries, %d subtrees)\n",
-                      sha1_to_hex(it->sha1), x, pfx,
-                      it->entry_count, it->subtree_nr);
-}
-
-static int dump_cache_tree(struct cache_tree *it,
-                          struct cache_tree *ref,
-                          const char *pfx)
-{
-       int i;
-       int errs = 0;
-
-       if (!it || !ref)
-               /* missing in either */
-               return 0;
-
-       if (it->entry_count < 0) {
-               /* invalid */
-               dump_one(it, pfx, "");
-               dump_one(ref, pfx, "#(ref) ");
-       }
-       else {
-               dump_one(it, pfx, "");
-               if (hashcmp(it->sha1, ref->sha1) ||
-                   ref->entry_count != it->entry_count ||
-                   ref->subtree_nr != it->subtree_nr) {
-                       /* claims to be valid but is lying */
-                       dump_one(ref, pfx, "#(ref) ");
-                       errs = 1;
-               }
-       }
-
-       for (i = 0; i < it->subtree_nr; i++) {
-               char path[PATH_MAX];
-               struct cache_tree_sub *down = it->down[i];
-               struct cache_tree_sub *rdwn;
-
-               rdwn = cache_tree_sub(ref, down->name);
-               xsnprintf(path, sizeof(path), "%s%.*s/", pfx, down->namelen, down->name);
-               if (dump_cache_tree(down->cache_tree, rdwn->cache_tree, path))
-                       errs = 1;
-       }
-       return errs;
-}
-
-int main(int ac, char **av)
-{
-       struct index_state istate;
-       struct cache_tree *another = cache_tree();
-       if (read_cache() < 0)
-               die("unable to read index file");
-       istate = the_index;
-       istate.cache_tree = another;
-       cache_tree_update(&istate, WRITE_TREE_DRY_RUN);
-       return dump_cache_tree(active_cache_tree, another, "");
-}
diff --git a/test-dump-split-index.c b/test-dump-split-index.c
deleted file mode 100644 (file)
index 861d28c..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#include "cache.h"
-#include "split-index.h"
-#include "ewah/ewok.h"
-
-static void show_bit(size_t pos, void *data)
-{
-       printf(" %d", (int)pos);
-}
-
-int main(int ac, char **av)
-{
-       struct split_index *si;
-       int i;
-
-       do_read_index(&the_index, av[1], 1);
-       printf("own %s\n", sha1_to_hex(the_index.sha1));
-       si = the_index.split_index;
-       if (!si) {
-               printf("not a split index\n");
-               return 0;
-       }
-       printf("base %s\n", sha1_to_hex(si->base_sha1));
-       for (i = 0; i < the_index.cache_nr; i++) {
-               struct cache_entry *ce = the_index.cache[i];
-               printf("%06o %s %d\t%s\n", ce->ce_mode,
-                      sha1_to_hex(ce->sha1), ce_stage(ce), ce->name);
-       }
-       printf("replacements:");
-       if (si->replace_bitmap)
-               ewah_each_bit(si->replace_bitmap, show_bit, NULL);
-       printf("\ndeletions:");
-       if (si->delete_bitmap)
-               ewah_each_bit(si->delete_bitmap, show_bit, NULL);
-       printf("\n");
-       return 0;
-}
diff --git a/test-dump-untracked-cache.c b/test-dump-untracked-cache.c
deleted file mode 100644 (file)
index 0a1c285..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#include "cache.h"
-#include "dir.h"
-
-static int compare_untracked(const void *a_, const void *b_)
-{
-       const char *const *a = a_;
-       const char *const *b = b_;
-       return strcmp(*a, *b);
-}
-
-static int compare_dir(const void *a_, const void *b_)
-{
-       const struct untracked_cache_dir *const *a = a_;
-       const struct untracked_cache_dir *const *b = b_;
-       return strcmp((*a)->name, (*b)->name);
-}
-
-static void dump(struct untracked_cache_dir *ucd, struct strbuf *base)
-{
-       int i, len;
-       qsort(ucd->untracked, ucd->untracked_nr, sizeof(*ucd->untracked),
-             compare_untracked);
-       qsort(ucd->dirs, ucd->dirs_nr, sizeof(*ucd->dirs),
-             compare_dir);
-       len = base->len;
-       strbuf_addf(base, "%s/", ucd->name);
-       printf("%s %s", base->buf,
-              sha1_to_hex(ucd->exclude_sha1));
-       if (ucd->recurse)
-               fputs(" recurse", stdout);
-       if (ucd->check_only)
-               fputs(" check_only", stdout);
-       if (ucd->valid)
-               fputs(" valid", stdout);
-       printf("\n");
-       for (i = 0; i < ucd->untracked_nr; i++)
-               printf("%s\n", ucd->untracked[i]);
-       for (i = 0; i < ucd->dirs_nr; i++)
-               dump(ucd->dirs[i], base);
-       strbuf_setlen(base, len);
-}
-
-int main(int ac, char **av)
-{
-       struct untracked_cache *uc;
-       struct strbuf base = STRBUF_INIT;
-
-       /* Hack to avoid modifying the untracked cache when we read it */
-       ignore_untracked_cache_config = 1;
-
-       setup_git_directory();
-       if (read_cache() < 0)
-               die("unable to read index file");
-       uc = the_index.untracked;
-       if (!uc) {
-               printf("no untracked cache\n");
-               return 0;
-       }
-       printf("info/exclude %s\n", sha1_to_hex(uc->ss_info_exclude.sha1));
-       printf("core.excludesfile %s\n", sha1_to_hex(uc->ss_excludes_file.sha1));
-       printf("exclude_per_dir %s\n", uc->exclude_per_dir);
-       printf("flags %08x\n", uc->dir_flags);
-       if (uc->root)
-               dump(uc->root, &base);
-       return 0;
-}
diff --git a/test-fake-ssh.c b/test-fake-ssh.c
deleted file mode 100644 (file)
index 980de21..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#include "git-compat-util.h"
-#include "run-command.h"
-#include "strbuf.h"
-
-int main(int argc, char **argv)
-{
-       const char *trash_directory = getenv("TRASH_DIRECTORY");
-       struct strbuf buf = STRBUF_INIT;
-       FILE *f;
-       int i;
-       const char *child_argv[] = { NULL, NULL };
-
-       /* First, print all parameters into $TRASH_DIRECTORY/ssh-output */
-       if (!trash_directory)
-               die("Need a TRASH_DIRECTORY!");
-       strbuf_addf(&buf, "%s/ssh-output", trash_directory);
-       f = fopen(buf.buf, "w");
-       if (!f)
-               die("Could not write to %s", buf.buf);
-       for (i = 0; i < argc; i++)
-               fprintf(f, "%s%s", i > 0 ? " " : "", i > 0 ? argv[i] : "ssh:");
-       fprintf(f, "\n");
-       fclose(f);
-
-       /* Now, evaluate the *last* parameter */
-       if (argc < 2)
-               return 0;
-       child_argv[0] = argv[argc - 1];
-       return run_command_v_opt(child_argv, RUN_USING_SHELL);
-}
diff --git a/test-genrandom.c b/test-genrandom.c
deleted file mode 100644 (file)
index 54824d0..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Simple random data generator used to create reproducible test files.
- * This is inspired from POSIX.1-2001 implementation example for rand().
- * Copyright (C) 2007 by Nicolas Pitre, licensed under the GPL version 2.
- */
-
-#include "git-compat-util.h"
-
-int main(int argc, char *argv[])
-{
-       unsigned long count, next = 0;
-       unsigned char *c;
-
-       if (argc < 2 || argc > 3) {
-               fprintf(stderr, "usage: %s <seed_string> [<size>]\n", argv[0]);
-               return 1;
-       }
-
-       c = (unsigned char *) argv[1];
-       do {
-               next = next * 11 + *c;
-       } while (*c++);
-
-       count = (argc == 3) ? strtoul(argv[2], NULL, 0) : -1L;
-
-       while (count--) {
-               next = next * 1103515245 + 12345;
-               if (putchar((next >> 16) & 0xff) == EOF)
-                       return -1;
-       }
-
-       return 0;
-}
diff --git a/test-hashmap.c b/test-hashmap.c
deleted file mode 100644 (file)
index cc2891d..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-#include "git-compat-util.h"
-#include "hashmap.h"
-
-struct test_entry
-{
-       struct hashmap_entry ent;
-       /* key and value as two \0-terminated strings */
-       char key[FLEX_ARRAY];
-};
-
-static const char *get_value(const struct test_entry *e)
-{
-       return e->key + strlen(e->key) + 1;
-}
-
-static int test_entry_cmp(const struct test_entry *e1,
-               const struct test_entry *e2, const char* key)
-{
-       return strcmp(e1->key, key ? key : e2->key);
-}
-
-static int test_entry_cmp_icase(const struct test_entry *e1,
-               const struct test_entry *e2, const char* key)
-{
-       return strcasecmp(e1->key, key ? key : e2->key);
-}
-
-static struct test_entry *alloc_test_entry(int hash, char *key, int klen,
-               char *value, int vlen)
-{
-       struct test_entry *entry = malloc(sizeof(struct test_entry) + klen
-                       + vlen + 2);
-       hashmap_entry_init(entry, hash);
-       memcpy(entry->key, key, klen + 1);
-       memcpy(entry->key + klen + 1, value, vlen + 1);
-       return entry;
-}
-
-#define HASH_METHOD_FNV 0
-#define HASH_METHOD_I 1
-#define HASH_METHOD_IDIV10 2
-#define HASH_METHOD_0 3
-#define HASH_METHOD_X2 4
-#define TEST_SPARSE 8
-#define TEST_ADD 16
-#define TEST_SIZE 100000
-
-static unsigned int hash(unsigned int method, unsigned int i, const char *key)
-{
-       unsigned int hash = 0;
-       switch (method & 3)
-       {
-       case HASH_METHOD_FNV:
-               hash = strhash(key);
-               break;
-       case HASH_METHOD_I:
-               hash = i;
-               break;
-       case HASH_METHOD_IDIV10:
-               hash = i / 10;
-               break;
-       case HASH_METHOD_0:
-               hash = 0;
-               break;
-       }
-
-       if (method & HASH_METHOD_X2)
-               hash = 2 * hash;
-       return hash;
-}
-
-/*
- * Test performance of hashmap.[ch]
- * Usage: time echo "perfhashmap method rounds" | test-hashmap
- */
-static void perf_hashmap(unsigned int method, unsigned int rounds)
-{
-       struct hashmap map;
-       char buf[16];
-       struct test_entry **entries;
-       unsigned int *hashes;
-       unsigned int i, j;
-
-       entries = malloc(TEST_SIZE * sizeof(struct test_entry *));
-       hashes = malloc(TEST_SIZE * sizeof(int));
-       for (i = 0; i < TEST_SIZE; i++) {
-               snprintf(buf, sizeof(buf), "%i", i);
-               entries[i] = alloc_test_entry(0, buf, strlen(buf), "", 0);
-               hashes[i] = hash(method, i, entries[i]->key);
-       }
-
-       if (method & TEST_ADD) {
-               /* test adding to the map */
-               for (j = 0; j < rounds; j++) {
-                       hashmap_init(&map, (hashmap_cmp_fn) test_entry_cmp, 0);
-
-                       /* add entries */
-                       for (i = 0; i < TEST_SIZE; i++) {
-                               hashmap_entry_init(entries[i], hashes[i]);
-                               hashmap_add(&map, entries[i]);
-                       }
-
-                       hashmap_free(&map, 0);
-               }
-       } else {
-               /* test map lookups */
-               hashmap_init(&map, (hashmap_cmp_fn) test_entry_cmp, 0);
-
-               /* fill the map (sparsely if specified) */
-               j = (method & TEST_SPARSE) ? TEST_SIZE / 10 : TEST_SIZE;
-               for (i = 0; i < j; i++) {
-                       hashmap_entry_init(entries[i], hashes[i]);
-                       hashmap_add(&map, entries[i]);
-               }
-
-               for (j = 0; j < rounds; j++) {
-                       for (i = 0; i < TEST_SIZE; i++) {
-                               hashmap_get_from_hash(&map, hashes[i],
-                                                     entries[i]->key);
-                       }
-               }
-
-               hashmap_free(&map, 0);
-       }
-}
-
-#define DELIM " \t\r\n"
-
-/*
- * Read stdin line by line and print result of commands to stdout:
- *
- * hash key -> strhash(key) memhash(key) strihash(key) memihash(key)
- * put key value -> NULL / old value
- * get key -> NULL / value
- * remove key -> NULL / old value
- * iterate -> key1 value1\nkey2 value2\n...
- * size -> tablesize numentries
- *
- * perfhashmap method rounds -> test hashmap.[ch] performance
- */
-int main(int argc, char *argv[])
-{
-       char line[1024];
-       struct hashmap map;
-       int icase;
-
-       /* init hash map */
-       icase = argc > 1 && !strcmp("ignorecase", argv[1]);
-       hashmap_init(&map, (hashmap_cmp_fn) (icase ? test_entry_cmp_icase
-                       : test_entry_cmp), 0);
-
-       /* process commands from stdin */
-       while (fgets(line, sizeof(line), stdin)) {
-               char *cmd, *p1 = NULL, *p2 = NULL;
-               int l1 = 0, l2 = 0, hash = 0;
-               struct test_entry *entry;
-
-               /* break line into command and up to two parameters */
-               cmd = strtok(line, DELIM);
-               /* ignore empty lines */
-               if (!cmd || *cmd == '#')
-                       continue;
-
-               p1 = strtok(NULL, DELIM);
-               if (p1) {
-                       l1 = strlen(p1);
-                       hash = icase ? strihash(p1) : strhash(p1);
-                       p2 = strtok(NULL, DELIM);
-                       if (p2)
-                               l2 = strlen(p2);
-               }
-
-               if (!strcmp("hash", cmd) && l1) {
-
-                       /* print results of different hash functions */
-                       printf("%u %u %u %u\n", strhash(p1), memhash(p1, l1),
-                                       strihash(p1), memihash(p1, l1));
-
-               } else if (!strcmp("add", cmd) && l1 && l2) {
-
-                       /* create entry with key = p1, value = p2 */
-                       entry = alloc_test_entry(hash, p1, l1, p2, l2);
-
-                       /* add to hashmap */
-                       hashmap_add(&map, entry);
-
-               } else if (!strcmp("put", cmd) && l1 && l2) {
-
-                       /* create entry with key = p1, value = p2 */
-                       entry = alloc_test_entry(hash, p1, l1, p2, l2);
-
-                       /* add / replace entry */
-                       entry = hashmap_put(&map, entry);
-
-                       /* print and free replaced entry, if any */
-                       puts(entry ? get_value(entry) : "NULL");
-                       free(entry);
-
-               } else if (!strcmp("get", cmd) && l1) {
-
-                       /* lookup entry in hashmap */
-                       entry = hashmap_get_from_hash(&map, hash, p1);
-
-                       /* print result */
-                       if (!entry)
-                               puts("NULL");
-                       while (entry) {
-                               puts(get_value(entry));
-                               entry = hashmap_get_next(&map, entry);
-                       }
-
-               } else if (!strcmp("remove", cmd) && l1) {
-
-                       /* setup static key */
-                       struct hashmap_entry key;
-                       hashmap_entry_init(&key, hash);
-
-                       /* remove entry from hashmap */
-                       entry = hashmap_remove(&map, &key, p1);
-
-                       /* print result and free entry*/
-                       puts(entry ? get_value(entry) : "NULL");
-                       free(entry);
-
-               } else if (!strcmp("iterate", cmd)) {
-
-                       struct hashmap_iter iter;
-                       hashmap_iter_init(&map, &iter);
-                       while ((entry = hashmap_iter_next(&iter)))
-                               printf("%s %s\n", entry->key, get_value(entry));
-
-               } else if (!strcmp("size", cmd)) {
-
-                       /* print table sizes */
-                       printf("%u %u\n", map.tablesize, map.size);
-
-               } else if (!strcmp("intern", cmd) && l1) {
-
-                       /* test that strintern works */
-                       const char *i1 = strintern(p1);
-                       const char *i2 = strintern(p1);
-                       if (strcmp(i1, p1))
-                               printf("strintern(%s) returns %s\n", p1, i1);
-                       else if (i1 == p1)
-                               printf("strintern(%s) returns input pointer\n", p1);
-                       else if (i1 != i2)
-                               printf("strintern(%s) != strintern(%s)", i1, i2);
-                       else
-                               printf("%s\n", i1);
-
-               } else if (!strcmp("perfhashmap", cmd) && l1 && l2) {
-
-                       perf_hashmap(atoi(p1), atoi(p2));
-
-               } else {
-
-                       printf("Unknown command %s\n", cmd);
-
-               }
-       }
-
-       hashmap_free(&map, 1);
-       return 0;
-}
diff --git a/test-index-version.c b/test-index-version.c
deleted file mode 100644 (file)
index 05d4699..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "cache.h"
-
-int main(int argc, char **argv)
-{
-       struct cache_header hdr;
-       int version;
-
-       memset(&hdr,0,sizeof(hdr));
-       if (read(0, &hdr, sizeof(hdr)) != sizeof(hdr))
-               return 0;
-       version = ntohl(hdr.hdr_version);
-       printf("%d\n", version);
-       return 0;
-}
diff --git a/test-line-buffer.c b/test-line-buffer.c
deleted file mode 100644 (file)
index 1e58f04..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * test-line-buffer.c: code to exercise the svn importer's input helper
- */
-
-#include "git-compat-util.h"
-#include "strbuf.h"
-#include "vcs-svn/line_buffer.h"
-
-static uint32_t strtouint32(const char *s)
-{
-       char *end;
-       uintmax_t n = strtoumax(s, &end, 10);
-       if (*s == '\0' || *end != '\0')
-               die("invalid count: %s", s);
-       return (uint32_t) n;
-}
-
-static void handle_command(const char *command, const char *arg, struct line_buffer *buf)
-{
-       switch (*command) {
-       case 'b':
-               if (starts_with(command, "binary ")) {
-                       struct strbuf sb = STRBUF_INIT;
-                       strbuf_addch(&sb, '>');
-                       buffer_read_binary(buf, &sb, strtouint32(arg));
-                       fwrite(sb.buf, 1, sb.len, stdout);
-                       strbuf_release(&sb);
-                       return;
-               }
-       case 'c':
-               if (starts_with(command, "copy ")) {
-                       buffer_copy_bytes(buf, strtouint32(arg));
-                       return;
-               }
-       case 's':
-               if (starts_with(command, "skip ")) {
-                       buffer_skip_bytes(buf, strtouint32(arg));
-                       return;
-               }
-       default:
-               die("unrecognized command: %s", command);
-       }
-}
-
-static void handle_line(const char *line, struct line_buffer *stdin_buf)
-{
-       const char *arg = strchr(line, ' ');
-       if (!arg)
-               die("no argument in line: %s", line);
-       handle_command(line, arg + 1, stdin_buf);
-}
-
-int main(int argc, char *argv[])
-{
-       struct line_buffer stdin_buf = LINE_BUFFER_INIT;
-       struct line_buffer file_buf = LINE_BUFFER_INIT;
-       struct line_buffer *input = &stdin_buf;
-       const char *filename;
-       char *s;
-
-       if (argc == 1)
-               filename = NULL;
-       else if (argc == 2)
-               filename = argv[1];
-       else
-               usage("test-line-buffer [file | &fd] < script");
-
-       if (buffer_init(&stdin_buf, NULL))
-               die_errno("open error");
-       if (filename) {
-               if (*filename == '&') {
-                       if (buffer_fdinit(&file_buf, strtouint32(filename + 1)))
-                               die_errno("error opening fd %s", filename + 1);
-               } else {
-                       if (buffer_init(&file_buf, filename))
-                               die_errno("error opening %s", filename);
-               }
-               input = &file_buf;
-       }
-
-       while ((s = buffer_read_line(&stdin_buf)))
-               handle_line(s, input);
-
-       if (filename && buffer_deinit(&file_buf))
-               die("error reading from %s", filename);
-       if (buffer_deinit(&stdin_buf))
-               die("input error");
-       if (ferror(stdout))
-               die("output error");
-       return 0;
-}
diff --git a/test-match-trees.c b/test-match-trees.c
deleted file mode 100644 (file)
index 4dad709..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#include "cache.h"
-#include "tree.h"
-
-int main(int ac, char **av)
-{
-       unsigned char hash1[20], hash2[20], shifted[20];
-       struct tree *one, *two;
-
-       setup_git_directory();
-
-       if (get_sha1(av[1], hash1))
-               die("cannot parse %s as an object name", av[1]);
-       if (get_sha1(av[2], hash2))
-               die("cannot parse %s as an object name", av[2]);
-       one = parse_tree_indirect(hash1);
-       if (!one)
-               die("not a tree-ish %s", av[1]);
-       two = parse_tree_indirect(hash2);
-       if (!two)
-               die("not a tree-ish %s", av[2]);
-
-       shift_tree(one->object.oid.hash, two->object.oid.hash, shifted, -1);
-       printf("shifted: %s\n", sha1_to_hex(shifted));
-
-       exit(0);
-}
diff --git a/test-mergesort.c b/test-mergesort.c
deleted file mode 100644 (file)
index ea3b959..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#include "cache.h"
-#include "mergesort.h"
-
-struct line {
-       char *text;
-       struct line *next;
-};
-
-static void *get_next(const void *a)
-{
-       return ((const struct line *)a)->next;
-}
-
-static void set_next(void *a, void *b)
-{
-       ((struct line *)a)->next = b;
-}
-
-static int compare_strings(const void *a, const void *b)
-{
-       const struct line *x = a, *y = b;
-       return strcmp(x->text, y->text);
-}
-
-int main(int argc, char **argv)
-{
-       struct line *line, *p = NULL, *lines = NULL;
-       struct strbuf sb = STRBUF_INIT;
-
-       for (;;) {
-               if (strbuf_getwholeline(&sb, stdin, '\n'))
-                       break;
-               line = xmalloc(sizeof(struct line));
-               line->text = strbuf_detach(&sb, NULL);
-               if (p) {
-                       line->next = p->next;
-                       p->next = line;
-               } else {
-                       line->next = NULL;
-                       lines = line;
-               }
-               p = line;
-       }
-
-       lines = llist_mergesort(lines, get_next, set_next, compare_strings);
-
-       while (lines) {
-               printf("%s", lines->text);
-               lines = lines->next;
-       }
-       return 0;
-}
diff --git a/test-mktemp.c b/test-mktemp.c
deleted file mode 100644 (file)
index c8c5421..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * test-mktemp.c: code to exercise the creation of temporary files
- */
-#include "git-compat-util.h"
-
-int main(int argc, char *argv[])
-{
-       if (argc != 2)
-               usage("Expected 1 parameter defining the temporary file template");
-
-       xmkstemp(xstrdup(argv[1]));
-
-       return 0;
-}
diff --git a/test-parse-options.c b/test-parse-options.c
deleted file mode 100644 (file)
index 2c8c8f1..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-#include "cache.h"
-#include "parse-options.h"
-#include "string-list.h"
-
-static int boolean = 0;
-static int integer = 0;
-static unsigned long magnitude = 0;
-static unsigned long timestamp;
-static int abbrev = 7;
-static int verbose = 0, dry_run = 0, quiet = 0;
-static char *string = NULL;
-static char *file = NULL;
-static int ambiguous;
-static struct string_list list;
-
-static int length_callback(const struct option *opt, const char *arg, int unset)
-{
-       printf("Callback: \"%s\", %d\n",
-               (arg ? arg : "not set"), unset);
-       if (unset)
-               return 1; /* do not support unset */
-
-       *(int *)opt->value = strlen(arg);
-       return 0;
-}
-
-static int number_callback(const struct option *opt, const char *arg, int unset)
-{
-       *(int *)opt->value = strtol(arg, NULL, 10);
-       return 0;
-}
-
-int main(int argc, char **argv)
-{
-       const char *prefix = "prefix/";
-       const char *usage[] = {
-               "test-parse-options <options>",
-               NULL
-       };
-       struct option options[] = {
-               OPT_BOOL(0, "yes", &boolean, "get a boolean"),
-               OPT_BOOL('D', "no-doubt", &boolean, "begins with 'no-'"),
-               { OPTION_SET_INT, 'B', "no-fear", &boolean, NULL,
-                 "be brave", PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 1 },
-               OPT_COUNTUP('b', "boolean", &boolean, "increment by one"),
-               OPT_BIT('4', "or4", &boolean,
-                       "bitwise-or boolean with ...0100", 4),
-               OPT_NEGBIT(0, "neg-or4", &boolean, "same as --no-or4", 4),
-               OPT_GROUP(""),
-               OPT_INTEGER('i', "integer", &integer, "get a integer"),
-               OPT_INTEGER('j', NULL, &integer, "get a integer, too"),
-               OPT_MAGNITUDE('m', "magnitude", &magnitude, "get a magnitude"),
-               OPT_SET_INT(0, "set23", &integer, "set integer to 23", 23),
-               OPT_DATE('t', NULL, &timestamp, "get timestamp of <time>"),
-               OPT_CALLBACK('L', "length", &integer, "str",
-                       "get length of <str>", length_callback),
-               OPT_FILENAME('F', "file", &file, "set file to <file>"),
-               OPT_GROUP("String options"),
-               OPT_STRING('s', "string", &string, "string", "get a string"),
-               OPT_STRING(0, "string2", &string, "str", "get another string"),
-               OPT_STRING(0, "st", &string, "st", "get another string (pervert ordering)"),
-               OPT_STRING('o', NULL, &string, "str", "get another string"),
-               OPT_NOOP_NOARG(0, "obsolete"),
-               OPT_STRING_LIST(0, "list", &list, "str", "add str to list"),
-               OPT_GROUP("Magic arguments"),
-               OPT_ARGUMENT("quux", "means --quux"),
-               OPT_NUMBER_CALLBACK(&integer, "set integer to NUM",
-                       number_callback),
-               { OPTION_COUNTUP, '+', NULL, &boolean, NULL, "same as -b",
-                 PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH },
-               { OPTION_COUNTUP, 0, "ambiguous", &ambiguous, NULL,
-                 "positive ambiguity", PARSE_OPT_NOARG | PARSE_OPT_NONEG },
-               { OPTION_COUNTUP, 0, "no-ambiguous", &ambiguous, NULL,
-                 "negative ambiguity", PARSE_OPT_NOARG | PARSE_OPT_NONEG },
-               OPT_GROUP("Standard options"),
-               OPT__ABBREV(&abbrev),
-               OPT__VERBOSE(&verbose, "be verbose"),
-               OPT__DRY_RUN(&dry_run, "dry run"),
-               OPT__QUIET(&quiet, "be quiet"),
-               OPT_END(),
-       };
-       int i;
-
-       argc = parse_options(argc, (const char **)argv, prefix, options, usage, 0);
-
-       printf("boolean: %d\n", boolean);
-       printf("integer: %d\n", integer);
-       printf("magnitude: %lu\n", magnitude);
-       printf("timestamp: %lu\n", timestamp);
-       printf("string: %s\n", string ? string : "(not set)");
-       printf("abbrev: %d\n", abbrev);
-       printf("verbose: %d\n", verbose);
-       printf("quiet: %s\n", quiet ? "yes" : "no");
-       printf("dry run: %s\n", dry_run ? "yes" : "no");
-       printf("file: %s\n", file ? file : "(not set)");
-
-       for (i = 0; i < list.nr; i++)
-               printf("list: %s\n", list.items[i].string);
-
-       for (i = 0; i < argc; i++)
-               printf("arg %02d: %s\n", i, argv[i]);
-
-       return 0;
-}
diff --git a/test-path-utils.c b/test-path-utils.c
deleted file mode 100644 (file)
index ba805b3..0000000
+++ /dev/null
@@ -1,262 +0,0 @@
-#include "cache.h"
-#include "string-list.h"
-
-/*
- * A "string_list_each_func_t" function that normalizes an entry from
- * GIT_CEILING_DIRECTORIES.  If the path is unusable for some reason,
- * die with an explanation.
- */
-static int normalize_ceiling_entry(struct string_list_item *item, void *unused)
-{
-       char *ceil = item->string;
-
-       if (!*ceil)
-               die("Empty path is not supported");
-       if (!is_absolute_path(ceil))
-               die("Path \"%s\" is not absolute", ceil);
-       if (normalize_path_copy(ceil, ceil) < 0)
-               die("Path \"%s\" could not be normalized", ceil);
-       return 1;
-}
-
-static void normalize_argv_string(const char **var, const char *input)
-{
-       if (!strcmp(input, "<null>"))
-               *var = NULL;
-       else if (!strcmp(input, "<empty>"))
-               *var = "";
-       else
-               *var = input;
-
-       if (*var && (**var == '<' || **var == '('))
-               die("Bad value: %s\n", input);
-}
-
-struct test_data {
-       const char *from;  /* input:  transform from this ... */
-       const char *to;    /* output: ... to this.            */
-       const char *alternative; /* output: ... or this.      */
-};
-
-static int test_function(struct test_data *data, char *(*func)(char *input),
-       const char *funcname)
-{
-       int failed = 0, i;
-       char buffer[1024];
-       char *to;
-
-       for (i = 0; data[i].to; i++) {
-               if (!data[i].from)
-                       to = func(NULL);
-               else {
-                       xsnprintf(buffer, sizeof(buffer), "%s", data[i].from);
-                       to = func(buffer);
-               }
-               if (!strcmp(to, data[i].to))
-                       continue;
-               if (!data[i].alternative)
-                       error("FAIL: %s(%s) => '%s' != '%s'\n",
-                               funcname, data[i].from, to, data[i].to);
-               else if (!strcmp(to, data[i].alternative))
-                       continue;
-               else
-                       error("FAIL: %s(%s) => '%s' != '%s', '%s'\n",
-                               funcname, data[i].from, to, data[i].to,
-                               data[i].alternative);
-               failed = 1;
-       }
-       return failed;
-}
-
-static struct test_data basename_data[] = {
-       /* --- POSIX type paths --- */
-       { NULL,              "."    },
-       { "",                "."    },
-       { ".",               "."    },
-       { "..",              ".."   },
-       { "/",               "/"    },
-       { "//",              "/", "//" },
-       { "///",             "/", "//" },
-       { "////",            "/", "//" },
-       { "usr",             "usr"  },
-       { "/usr",            "usr"  },
-       { "/usr/",           "usr"  },
-       { "/usr//",          "usr"  },
-       { "/usr/lib",        "lib"  },
-       { "usr/lib",         "lib"  },
-       { "usr/lib///",      "lib"  },
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-       /* --- win32 type paths --- */
-       { "\\usr",           "usr"  },
-       { "\\usr\\",         "usr"  },
-       { "\\usr\\\\",       "usr"  },
-       { "\\usr\\lib",      "lib"  },
-       { "usr\\lib",        "lib"  },
-       { "usr\\lib\\\\\\",  "lib"  },
-       { "C:/usr",          "usr"  },
-       { "C:/usr",          "usr"  },
-       { "C:/usr/",         "usr"  },
-       { "C:/usr//",        "usr"  },
-       { "C:/usr/lib",      "lib"  },
-       { "C:usr/lib",       "lib"  },
-       { "C:usr/lib///",    "lib"  },
-       { "C:",              "."    },
-       { "C:a",             "a"    },
-       { "C:/",             "/"    },
-       { "C:///",           "/"    },
-       { "\\",              "\\", "/" },
-       { "\\\\",            "\\", "/" },
-       { "\\\\\\",          "\\", "/" },
-#endif
-       { NULL,              NULL   }
-};
-
-static struct test_data dirname_data[] = {
-       /* --- POSIX type paths --- */
-       { NULL,              "."      },
-       { "",                "."      },
-       { ".",               "."      },
-       { "..",              "."      },
-       { "/",               "/"      },
-       { "//",              "/", "//" },
-       { "///",             "/", "//" },
-       { "////",            "/", "//" },
-       { "usr",             "."      },
-       { "/usr",            "/"      },
-       { "/usr/",           "/"      },
-       { "/usr//",          "/"      },
-       { "/usr/lib",        "/usr"   },
-       { "usr/lib",         "usr"    },
-       { "usr/lib///",      "usr"    },
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-       /* --- win32 type paths --- */
-       { "\\",              "\\"     },
-       { "\\\\",            "\\\\"   },
-       { "\\usr",           "\\"     },
-       { "\\usr\\",         "\\"     },
-       { "\\usr\\\\",       "\\"     },
-       { "\\usr\\lib",      "\\usr"  },
-       { "usr\\lib",        "usr"    },
-       { "usr\\lib\\\\\\",  "usr"    },
-       { "C:a",             "C:."    },
-       { "C:/",             "C:/"    },
-       { "C:///",           "C:/"    },
-       { "C:/usr",          "C:/"    },
-       { "C:/usr/",         "C:/"    },
-       { "C:/usr//",        "C:/"    },
-       { "C:/usr/lib",      "C:/usr" },
-       { "C:usr/lib",       "C:usr"  },
-       { "C:usr/lib///",    "C:usr"  },
-       { "\\\\\\",          "\\"     },
-       { "\\\\\\\\",        "\\"     },
-       { "C:",              "C:.", "." },
-#endif
-       { NULL,              NULL     }
-};
-
-int main(int argc, char **argv)
-{
-       if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) {
-               char *buf = xmallocz(strlen(argv[2]));
-               int rv = normalize_path_copy(buf, argv[2]);
-               if (rv)
-                       buf = "++failed++";
-               puts(buf);
-               return 0;
-       }
-
-       if (argc >= 2 && !strcmp(argv[1], "real_path")) {
-               while (argc > 2) {
-                       puts(real_path(argv[2]));
-                       argc--;
-                       argv++;
-               }
-               return 0;
-       }
-
-       if (argc >= 2 && !strcmp(argv[1], "absolute_path")) {
-               while (argc > 2) {
-                       puts(absolute_path(argv[2]));
-                       argc--;
-                       argv++;
-               }
-               return 0;
-       }
-
-       if (argc == 4 && !strcmp(argv[1], "longest_ancestor_length")) {
-               int len;
-               struct string_list ceiling_dirs = STRING_LIST_INIT_DUP;
-               char *path = xstrdup(argv[2]);
-
-               /*
-                * We have to normalize the arguments because under
-                * Windows, bash mangles arguments that look like
-                * absolute POSIX paths or colon-separate lists of
-                * absolute POSIX paths into DOS paths (e.g.,
-                * "/foo:/foo/bar" might be converted to
-                * "D:\Src\msysgit\foo;D:\Src\msysgit\foo\bar"),
-                * whereas longest_ancestor_length() requires paths
-                * that use forward slashes.
-                */
-               if (normalize_path_copy(path, path))
-                       die("Path \"%s\" could not be normalized", argv[2]);
-               string_list_split(&ceiling_dirs, argv[3], PATH_SEP, -1);
-               filter_string_list(&ceiling_dirs, 0,
-                                  normalize_ceiling_entry, NULL);
-               len = longest_ancestor_length(path, &ceiling_dirs);
-               string_list_clear(&ceiling_dirs, 0);
-               free(path);
-               printf("%d\n", len);
-               return 0;
-       }
-
-       if (argc >= 4 && !strcmp(argv[1], "prefix_path")) {
-               char *prefix = argv[2];
-               int prefix_len = strlen(prefix);
-               int nongit_ok;
-               setup_git_directory_gently(&nongit_ok);
-               while (argc > 3) {
-                       puts(prefix_path(prefix, prefix_len, argv[3]));
-                       argc--;
-                       argv++;
-               }
-               return 0;
-       }
-
-       if (argc == 4 && !strcmp(argv[1], "strip_path_suffix")) {
-               char *prefix = strip_path_suffix(argv[2], argv[3]);
-               printf("%s\n", prefix ? prefix : "(null)");
-               return 0;
-       }
-
-       if (argc == 3 && !strcmp(argv[1], "print_path")) {
-               puts(argv[2]);
-               return 0;
-       }
-
-       if (argc == 4 && !strcmp(argv[1], "relative_path")) {
-               struct strbuf sb = STRBUF_INIT;
-               const char *in, *prefix, *rel;
-               normalize_argv_string(&in, argv[2]);
-               normalize_argv_string(&prefix, argv[3]);
-               rel = relative_path(in, prefix, &sb);
-               if (!rel)
-                       puts("(null)");
-               else
-                       puts(strlen(rel) > 0 ? rel : "(empty)");
-               strbuf_release(&sb);
-               return 0;
-       }
-
-       if (argc == 2 && !strcmp(argv[1], "basename"))
-               return test_function(basename_data, basename, argv[1]);
-
-       if (argc == 2 && !strcmp(argv[1], "dirname"))
-               return test_function(dirname_data, dirname, argv[1]);
-
-       fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
-               argv[1] ? argv[1] : "(there was none)");
-       return 1;
-}
diff --git a/test-prio-queue.c b/test-prio-queue.c
deleted file mode 100644 (file)
index 7be72f0..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "cache.h"
-#include "prio-queue.h"
-
-static int intcmp(const void *va, const void *vb, void *data)
-{
-       const int *a = va, *b = vb;
-       return *a - *b;
-}
-
-static void show(int *v)
-{
-       if (!v)
-               printf("NULL\n");
-       else
-               printf("%d\n", *v);
-       free(v);
-}
-
-int main(int argc, char **argv)
-{
-       struct prio_queue pq = { intcmp };
-
-       while (*++argv) {
-               if (!strcmp(*argv, "get"))
-                       show(prio_queue_get(&pq));
-               else if (!strcmp(*argv, "dump")) {
-                       int *v;
-                       while ((v = prio_queue_get(&pq)))
-                              show(v);
-               }
-               else {
-                       int *v = malloc(sizeof(*v));
-                       *v = atoi(*argv);
-                       prio_queue_put(&pq, v);
-               }
-       }
-
-       return 0;
-}
diff --git a/test-read-cache.c b/test-read-cache.c
deleted file mode 100644 (file)
index b25bcf1..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "cache.h"
-
-int main (int argc, char **argv)
-{
-       int i, cnt = 1;
-       if (argc == 2)
-               cnt = strtol(argv[1], NULL, 0);
-       for (i = 0; i < cnt; i++) {
-               read_cache();
-               discard_cache();
-       }
-       return 0;
-}
diff --git a/test-regex.c b/test-regex.c
deleted file mode 100644 (file)
index 0dc598e..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "git-compat-util.h"
-
-int main(int argc, char **argv)
-{
-       char *pat = "[^={} \t]+";
-       char *str = "={}\nfred";
-       regex_t r;
-       regmatch_t m[1];
-
-       if (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE))
-               die("failed regcomp() for pattern '%s'", pat);
-       if (regexec(&r, str, 1, m, 0))
-               die("no match of pattern '%s' to string '%s'", pat, str);
-
-       /* http://sourceware.org/bugzilla/show_bug.cgi?id=3957  */
-       if (m[0].rm_so == 3) /* matches '\n' when it should not */
-               die("regex bug confirmed: re-build git with NO_REGEX=1");
-
-       exit(0);
-}
diff --git a/test-revision-walking.c b/test-revision-walking.c
deleted file mode 100644 (file)
index 3d03133..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * test-revision-walking.c: test revision walking API.
- *
- * (C) 2012 Heiko Voigt <hvoigt@hvoigt.net>
- *
- * This code is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include "cache.h"
-#include "commit.h"
-#include "diff.h"
-#include "revision.h"
-
-static void print_commit(struct commit *commit)
-{
-       struct strbuf sb = STRBUF_INIT;
-       struct pretty_print_context ctx = {0};
-       ctx.date_mode.type = DATE_NORMAL;
-       format_commit_message(commit, " %m %s", &sb, &ctx);
-       printf("%s\n", sb.buf);
-       strbuf_release(&sb);
-}
-
-static int run_revision_walk(void)
-{
-       struct rev_info rev;
-       struct commit *commit;
-       const char *argv[] = {NULL, "--all", NULL};
-       int argc = ARRAY_SIZE(argv) - 1;
-       int got_revision = 0;
-
-       init_revisions(&rev, NULL);
-       setup_revisions(argc, argv, &rev, NULL);
-       if (prepare_revision_walk(&rev))
-               die("revision walk setup failed");
-
-       while ((commit = get_revision(&rev)) != NULL) {
-               print_commit(commit);
-               got_revision = 1;
-       }
-
-       reset_revision_walk();
-       return got_revision;
-}
-
-int main(int argc, char **argv)
-{
-       if (argc < 2)
-               return 1;
-
-       setup_git_directory();
-
-       if (!strcmp(argv[1], "run-twice")) {
-               printf("1st\n");
-               if (!run_revision_walk())
-                       return 1;
-               printf("2nd\n");
-               if (!run_revision_walk())
-                       return 1;
-
-               return 0;
-       }
-
-       fprintf(stderr, "check usage\n");
-       return 1;
-}
diff --git a/test-run-command.c b/test-run-command.c
deleted file mode 100644 (file)
index 30a64a9..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * test-run-command.c: test run command API.
- *
- * (C) 2009 Ilari Liusvaara <ilari.liusvaara@elisanet.fi>
- *
- * This code is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include "git-compat-util.h"
-#include "run-command.h"
-#include "argv-array.h"
-#include "strbuf.h"
-#include <string.h>
-#include <errno.h>
-
-static int number_callbacks;
-static int parallel_next(struct child_process *cp,
-                        struct strbuf *err,
-                        void *cb,
-                        void **task_cb)
-{
-       struct child_process *d = cb;
-       if (number_callbacks >= 4)
-               return 0;
-
-       argv_array_pushv(&cp->args, d->argv);
-       strbuf_addf(err, "preloaded output of a child\n");
-       number_callbacks++;
-       return 1;
-}
-
-static int no_job(struct child_process *cp,
-                 struct strbuf *err,
-                 void *cb,
-                 void **task_cb)
-{
-       strbuf_addf(err, "no further jobs available\n");
-       return 0;
-}
-
-static int task_finished(int result,
-                        struct strbuf *err,
-                        void *pp_cb,
-                        void *pp_task_cb)
-{
-       strbuf_addf(err, "asking for a quick stop\n");
-       return 1;
-}
-
-int main(int argc, char **argv)
-{
-       struct child_process proc = CHILD_PROCESS_INIT;
-       int jobs;
-
-       if (argc < 3)
-               return 1;
-       proc.argv = (const char **)argv + 2;
-
-       if (!strcmp(argv[1], "start-command-ENOENT")) {
-               if (start_command(&proc) < 0 && errno == ENOENT)
-                       return 0;
-               fprintf(stderr, "FAIL %s\n", argv[1]);
-               return 1;
-       }
-       if (!strcmp(argv[1], "run-command"))
-               exit(run_command(&proc));
-
-       jobs = atoi(argv[2]);
-       proc.argv = (const char **)argv + 3;
-
-       if (!strcmp(argv[1], "run-command-parallel"))
-               exit(run_processes_parallel(jobs, parallel_next,
-                                           NULL, NULL, &proc));
-
-       if (!strcmp(argv[1], "run-command-abort"))
-               exit(run_processes_parallel(jobs, parallel_next,
-                                           NULL, task_finished, &proc));
-
-       if (!strcmp(argv[1], "run-command-no-jobs"))
-               exit(run_processes_parallel(jobs, no_job,
-                                           NULL, task_finished, &proc));
-
-       fprintf(stderr, "check usage\n");
-       return 1;
-}
diff --git a/test-scrap-cache-tree.c b/test-scrap-cache-tree.c
deleted file mode 100644 (file)
index 6efee31..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#include "cache.h"
-#include "lockfile.h"
-#include "tree.h"
-#include "cache-tree.h"
-
-static struct lock_file index_lock;
-
-int main(int ac, char **av)
-{
-       hold_locked_index(&index_lock, 1);
-       if (read_cache() < 0)
-               die("unable to read index file");
-       active_cache_tree = NULL;
-       if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
-               die("unable to write index file");
-       return 0;
-}
diff --git a/test-sha1-array.c b/test-sha1-array.c
deleted file mode 100644 (file)
index 60ea1d5..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#include "cache.h"
-#include "sha1-array.h"
-
-static void print_sha1(const unsigned char sha1[20], void *data)
-{
-       puts(sha1_to_hex(sha1));
-}
-
-int main(int argc, char **argv)
-{
-       struct sha1_array array = SHA1_ARRAY_INIT;
-       struct strbuf line = STRBUF_INIT;
-
-       while (strbuf_getline(&line, stdin) != EOF) {
-               const char *arg;
-               unsigned char sha1[20];
-
-               if (skip_prefix(line.buf, "append ", &arg)) {
-                       if (get_sha1_hex(arg, sha1))
-                               die("not a hexadecimal SHA1: %s", arg);
-                       sha1_array_append(&array, sha1);
-               } else if (skip_prefix(line.buf, "lookup ", &arg)) {
-                       if (get_sha1_hex(arg, sha1))
-                               die("not a hexadecimal SHA1: %s", arg);
-                       printf("%d\n", sha1_array_lookup(&array, sha1));
-               } else if (!strcmp(line.buf, "clear"))
-                       sha1_array_clear(&array);
-               else if (!strcmp(line.buf, "for_each_unique"))
-                       sha1_array_for_each_unique(&array, print_sha1, NULL);
-               else
-                       die("unknown command: %s", line.buf);
-       }
-       return 0;
-}
diff --git a/test-sha1.c b/test-sha1.c
deleted file mode 100644 (file)
index e57eae1..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#include "cache.h"
-
-int main(int ac, char **av)
-{
-       git_SHA_CTX ctx;
-       unsigned char sha1[20];
-       unsigned bufsz = 8192;
-       int binary = 0;
-       char *buffer;
-
-       if (ac == 2) {
-               if (!strcmp(av[1], "-b"))
-                       binary = 1;
-               else
-                       bufsz = strtoul(av[1], NULL, 10) * 1024 * 1024;
-       }
-
-       if (!bufsz)
-               bufsz = 8192;
-
-       while ((buffer = malloc(bufsz)) == NULL) {
-               fprintf(stderr, "bufsz %u is too big, halving...\n", bufsz);
-               bufsz /= 2;
-               if (bufsz < 1024)
-                       die("OOPS");
-       }
-
-       git_SHA1_Init(&ctx);
-
-       while (1) {
-               ssize_t sz, this_sz;
-               char *cp = buffer;
-               unsigned room = bufsz;
-               this_sz = 0;
-               while (room) {
-                       sz = xread(0, cp, room);
-                       if (sz == 0)
-                               break;
-                       if (sz < 0)
-                               die_errno("test-sha1");
-                       this_sz += sz;
-                       cp += sz;
-                       room -= sz;
-               }
-               if (this_sz == 0)
-                       break;
-               git_SHA1_Update(&ctx, buffer, this_sz);
-       }
-       git_SHA1_Final(sha1, &ctx);
-
-       if (binary)
-               fwrite(sha1, 1, 20, stdout);
-       else
-               puts(sha1_to_hex(sha1));
-       exit(0);
-}
diff --git a/test-sha1.sh b/test-sha1.sh
deleted file mode 100755 (executable)
index cef4bcc..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/bin/sh
-
-dd if=/dev/zero bs=1048576 count=100 2>/dev/null |
-/usr/bin/time ./test-sha1 >/dev/null
-
-while read expect cnt pfx
-do
-       case "$expect" in '#'*) continue ;; esac
-       actual=$(
-               {
-                       test -z "$pfx" || echo "$pfx"
-                       dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null |
-                       perl -pe 'y/\000/g/'
-               } | ./test-sha1 $cnt
-       )
-       if test "$expect" = "$actual"
-       then
-               echo "OK: $expect $cnt $pfx"
-       else
-               echo >&2 "OOPS: $cnt"
-               echo >&2 "expect: $expect"
-               echo >&2 "actual: $actual"
-               exit 1
-       fi
-done <<EOF
-da39a3ee5e6b4b0d3255bfef95601890afd80709 0
-3f786850e387550fdab836ed7e6dc881de23001b 0 a
-5277cbb45a15902137d332d97e89cf8136545485 0 ab
-03cfd743661f07975fa2f1220c5194cbaff48451 0 abc
-3330b4373640f9e4604991e73c7e86bfd8da2dc3 0 abcd
-ec11312386ad561674f724b8cca7cf1796e26d1d 0 abcde
-bdc37c074ec4ee6050d68bc133c6b912f36474df 0 abcdef
-69bca99b923859f2dc486b55b87f49689b7358c7 0 abcdefg
-e414af7161c9554089f4106d6f1797ef14a73666 0 abcdefgh
-0707f2970043f9f7c22029482db27733deaec029 0 abcdefghi
-a4dd8aa74a5636728fe52451636e2e17726033aa 1
-9986b45e2f4d7086372533bb6953a8652fa3644a 1 frotz
-23d8d4f788e8526b4877548a32577543cbaaf51f 10
-8cd23f822ab44c7f481b8c92d591f6d1fcad431c 10 frotz
-f3b5604a4e604899c1233edb3bf1cc0ede4d8c32 512
-b095bd837a371593048136e429e9ac4b476e1bb3 512 frotz
-08fa81d6190948de5ccca3966340cc48c10cceac 1200 xyzzy
-e33a291f42c30a159733dd98b8b3e4ff34158ca0 4090 4G
-#a3bf783bc20caa958f6cb24dd140a7b21984838d 9999 nitfol
-EOF
-
-exit
-
-# generating test vectors
-# inputs are number of megabytes followed by some random string to prefix.
-
-while read cnt pfx
-do
-       actual=$(
-               {
-                       test -z "$pfx" || echo "$pfx"
-                       dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null |
-                       perl -pe 'y/\000/g/'
-               } | sha1sum |
-               sed -e 's/ .*//'
-       )
-       echo "$actual $cnt $pfx"
-done <<EOF
-0
-0 a
-0 ab
-0 abc
-0 abcd
-0 abcde
-0 abcdef
-0 abcdefg
-0 abcdefgh
-0 abcdefghi
-1
-1 frotz
-10
-10 frotz
-512
-512 frotz
-1200 xyzzy
-4090 4G
-9999 nitfol
-EOF
diff --git a/test-sigchain.c b/test-sigchain.c
deleted file mode 100644 (file)
index e499fce..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#include "cache.h"
-#include "sigchain.h"
-
-#define X(f) \
-static void f(int sig) { \
-       puts(#f); \
-       fflush(stdout); \
-       sigchain_pop(sig); \
-       raise(sig); \
-}
-X(one)
-X(two)
-X(three)
-#undef X
-
-int main(int argc, char **argv) {
-       sigchain_push(SIGTERM, one);
-       sigchain_push(SIGTERM, two);
-       sigchain_push(SIGTERM, three);
-       raise(SIGTERM);
-       return 0;
-}
diff --git a/test-string-list.c b/test-string-list.c
deleted file mode 100644 (file)
index 14bdf9d..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-#include "cache.h"
-#include "string-list.h"
-
-/*
- * Parse an argument into a string list.  arg should either be a
- * ':'-separated list of strings, or "-" to indicate an empty string
- * list (as opposed to "", which indicates a string list containing a
- * single empty string).  list->strdup_strings must be set.
- */
-static void parse_string_list(struct string_list *list, const char *arg)
-{
-       if (!strcmp(arg, "-"))
-               return;
-
-       (void)string_list_split(list, arg, ':', -1);
-}
-
-static void write_list(const struct string_list *list)
-{
-       int i;
-       for (i = 0; i < list->nr; i++)
-               printf("[%d]: \"%s\"\n", i, list->items[i].string);
-}
-
-static void write_list_compact(const struct string_list *list)
-{
-       int i;
-       if (!list->nr)
-               printf("-\n");
-       else {
-               printf("%s", list->items[0].string);
-               for (i = 1; i < list->nr; i++)
-                       printf(":%s", list->items[i].string);
-               printf("\n");
-       }
-}
-
-static int prefix_cb(struct string_list_item *item, void *cb_data)
-{
-       const char *prefix = (const char *)cb_data;
-       return starts_with(item->string, prefix);
-}
-
-int main(int argc, char **argv)
-{
-       if (argc == 5 && !strcmp(argv[1], "split")) {
-               struct string_list list = STRING_LIST_INIT_DUP;
-               int i;
-               const char *s = argv[2];
-               int delim = *argv[3];
-               int maxsplit = atoi(argv[4]);
-
-               i = string_list_split(&list, s, delim, maxsplit);
-               printf("%d\n", i);
-               write_list(&list);
-               string_list_clear(&list, 0);
-               return 0;
-       }
-
-       if (argc == 5 && !strcmp(argv[1], "split_in_place")) {
-               struct string_list list = STRING_LIST_INIT_NODUP;
-               int i;
-               char *s = xstrdup(argv[2]);
-               int delim = *argv[3];
-               int maxsplit = atoi(argv[4]);
-
-               i = string_list_split_in_place(&list, s, delim, maxsplit);
-               printf("%d\n", i);
-               write_list(&list);
-               string_list_clear(&list, 0);
-               free(s);
-               return 0;
-       }
-
-       if (argc == 4 && !strcmp(argv[1], "filter")) {
-               /*
-                * Retain only the items that have the specified prefix.
-                * Arguments: list|- prefix
-                */
-               struct string_list list = STRING_LIST_INIT_DUP;
-               const char *prefix = argv[3];
-
-               parse_string_list(&list, argv[2]);
-               filter_string_list(&list, 0, prefix_cb, (void *)prefix);
-               write_list_compact(&list);
-               string_list_clear(&list, 0);
-               return 0;
-       }
-
-       if (argc == 3 && !strcmp(argv[1], "remove_duplicates")) {
-               struct string_list list = STRING_LIST_INIT_DUP;
-
-               parse_string_list(&list, argv[2]);
-               string_list_remove_duplicates(&list, 0);
-               write_list_compact(&list);
-               string_list_clear(&list, 0);
-               return 0;
-       }
-
-       fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
-               argv[1] ? argv[1] : "(there was none)");
-       return 1;
-}
diff --git a/test-submodule-config.c b/test-submodule-config.c
deleted file mode 100644 (file)
index dab8c27..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#include "cache.h"
-#include "submodule-config.h"
-#include "submodule.h"
-
-static void die_usage(int argc, char **argv, const char *msg)
-{
-       fprintf(stderr, "%s\n", msg);
-       fprintf(stderr, "Usage: %s [<commit> <submodulepath>] ...\n", argv[0]);
-       exit(1);
-}
-
-static int git_test_config(const char *var, const char *value, void *cb)
-{
-       return parse_submodule_config_option(var, value);
-}
-
-int main(int argc, char **argv)
-{
-       char **arg = argv;
-       int my_argc = argc;
-       int output_url = 0;
-       int lookup_name = 0;
-
-       arg++;
-       my_argc--;
-       while (starts_with(arg[0], "--")) {
-               if (!strcmp(arg[0], "--url"))
-                       output_url = 1;
-               if (!strcmp(arg[0], "--name"))
-                       lookup_name = 1;
-               arg++;
-               my_argc--;
-       }
-
-       if (my_argc % 2 != 0)
-               die_usage(argc, argv, "Wrong number of arguments.");
-
-       setup_git_directory();
-       gitmodules_config();
-       git_config(git_test_config, NULL);
-
-       while (*arg) {
-               unsigned char commit_sha1[20];
-               const struct submodule *submodule;
-               const char *commit;
-               const char *path_or_name;
-
-               commit = arg[0];
-               path_or_name = arg[1];
-
-               if (commit[0] == '\0')
-                       hashcpy(commit_sha1, null_sha1);
-               else if (get_sha1(commit, commit_sha1) < 0)
-                       die_usage(argc, argv, "Commit not found.");
-
-               if (lookup_name) {
-                       submodule = submodule_from_name(commit_sha1, path_or_name);
-               } else
-                       submodule = submodule_from_path(commit_sha1, path_or_name);
-               if (!submodule)
-                       die_usage(argc, argv, "Submodule not found.");
-
-               if (output_url)
-                       printf("Submodule url: '%s' for path '%s'\n",
-                                       submodule->url, submodule->path);
-               else
-                       printf("Submodule name: '%s' for path '%s'\n",
-                                       submodule->name, submodule->path);
-
-               arg += 2;
-       }
-
-       submodule_free();
-
-       return 0;
-}
diff --git a/test-subprocess.c b/test-subprocess.c
deleted file mode 100644 (file)
index 56881a0..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "cache.h"
-#include "run-command.h"
-
-int main(int argc, char **argv)
-{
-       struct child_process cp = CHILD_PROCESS_INIT;
-       int nogit = 0;
-
-       setup_git_directory_gently(&nogit);
-       if (nogit)
-               die("No git repo found");
-       if (argc > 1 && !strcmp(argv[1], "--setup-work-tree")) {
-               setup_work_tree();
-               argv++;
-       }
-       cp.git_cmd = 1;
-       cp.argv = (const char **)argv + 1;
-       return run_command(&cp);
-}
diff --git a/test-svn-fe.c b/test-svn-fe.c
deleted file mode 100644 (file)
index 120ec96..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * test-svn-fe: Code to exercise the svn import lib
- */
-
-#include "git-compat-util.h"
-#include "vcs-svn/svndump.h"
-#include "vcs-svn/svndiff.h"
-#include "vcs-svn/sliding_window.h"
-#include "vcs-svn/line_buffer.h"
-
-static const char test_svnfe_usage[] =
-       "test-svn-fe (<dumpfile> | [-d] <preimage> <delta> <len>)";
-
-static int apply_delta(int argc, char *argv[])
-{
-       struct line_buffer preimage = LINE_BUFFER_INIT;
-       struct line_buffer delta = LINE_BUFFER_INIT;
-       struct sliding_view preimage_view = SLIDING_VIEW_INIT(&preimage, -1);
-
-       if (argc != 5)
-               usage(test_svnfe_usage);
-
-       if (buffer_init(&preimage, argv[2]))
-               die_errno("cannot open preimage");
-       if (buffer_init(&delta, argv[3]))
-               die_errno("cannot open delta");
-       if (svndiff0_apply(&delta, (off_t) strtoumax(argv[4], NULL, 0),
-                                       &preimage_view, stdout))
-               return 1;
-       if (buffer_deinit(&preimage))
-               die_errno("cannot close preimage");
-       if (buffer_deinit(&delta))
-               die_errno("cannot close delta");
-       strbuf_release(&preimage_view.buf);
-       return 0;
-}
-
-int main(int argc, char *argv[])
-{
-       if (argc == 2) {
-               if (svndump_init(argv[1]))
-                       return 1;
-               svndump_read(NULL, "refs/heads/master", "refs/notes/svn/revs");
-               svndump_deinit();
-               svndump_reset();
-               return 0;
-       }
-
-       if (argc >= 2 && !strcmp(argv[1], "-d"))
-               return apply_delta(argc, argv);
-       usage(test_svnfe_usage);
-}
diff --git a/test-urlmatch-normalization.c b/test-urlmatch-normalization.c
deleted file mode 100644 (file)
index 090bf21..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#include "git-compat-util.h"
-#include "urlmatch.h"
-
-int main(int argc, char **argv)
-{
-       const char usage[] = "test-urlmatch-normalization [-p | -l] <url1> | <url1> <url2>";
-       char *url1, *url2;
-       int opt_p = 0, opt_l = 0;
-
-       /*
-        * For one url, succeed if url_normalize succeeds on it, fail otherwise.
-        * For two urls, succeed only if url_normalize succeeds on both and
-        * the results compare equal with strcmp.  If -p is given (one url only)
-        * and url_normalize succeeds, print the result followed by "\n".  If
-        * -l is given (one url only) and url_normalize succeeds, print the
-        * returned length in decimal followed by "\n".
-        */
-
-       if (argc > 1 && !strcmp(argv[1], "-p")) {
-               opt_p = 1;
-               argc--;
-               argv++;
-       } else if (argc > 1 && !strcmp(argv[1], "-l")) {
-               opt_l = 1;
-               argc--;
-               argv++;
-       }
-
-       if (argc < 2 || argc > 3)
-               die("%s", usage);
-
-       if (argc == 2) {
-               struct url_info info;
-               url1 = url_normalize(argv[1], &info);
-               if (!url1)
-                       return 1;
-               if (opt_p)
-                       printf("%s\n", url1);
-               if (opt_l)
-                       printf("%u\n", (unsigned)info.url_len);
-               return 0;
-       }
-
-       if (opt_p || opt_l)
-               die("%s", usage);
-
-       url1 = url_normalize(argv[1], NULL);
-       url2 = url_normalize(argv[2], NULL);
-       return (url1 && url2 && !strcmp(url1, url2)) ? 0 : 1;
-}
diff --git a/test-wildmatch.c b/test-wildmatch.c
deleted file mode 100644 (file)
index 578b164..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "cache.h"
-
-int main(int argc, char **argv)
-{
-       int i;
-       for (i = 2; i < argc; i++) {
-               if (argv[i][0] == '/')
-                       die("Forward slash is not allowed at the beginning of the\n"
-                           "pattern because Windows does not like it. Use `XXX/' instead.");
-               else if (!strncmp(argv[i], "XXX/", 4))
-                       argv[i] += 3;
-       }
-       if (!strcmp(argv[1], "wildmatch"))
-               return !!wildmatch(argv[3], argv[2], WM_PATHNAME, NULL);
-       else if (!strcmp(argv[1], "iwildmatch"))
-               return !!wildmatch(argv[3], argv[2], WM_PATHNAME | WM_CASEFOLD, NULL);
-       else if (!strcmp(argv[1], "pathmatch"))
-               return !!wildmatch(argv[3], argv[2], 0, NULL);
-       else
-               return 1;
-}