Subject: git interix support

From: Markus Duft <[email-masked]>
Date: Tue, 09 Mar 2010 11:35:02 +0100

Hey.

i have "ported" git to interix (haha, wasn't so much of a problem after
all ;)). i have a small patch (attached). i know that it sure doesn't
have production quality yet, but i try gathering ideas/input here.

additionally to the patch i'm setting:

147     if [[ ${CHOST} == *-interix* ]] ; then
148         myopts="${myopts} NO_IPV6=YesPlease"
149         myopts="${myopts} NO_MEMMEM=YesPlease"
150         myopts="${myopts} NO_MKDTEMP=YesPlease"
151         myopts="${myopts} NO_STRTOUMAX=YesPlease"
152         myopts="${myopts} NO_STRTOULL=YesPlease"
153         myopts="${myopts} NO_INET_NTOP=YesPlease"
154         myopts="${myopts} NO_INET_PTON=YesPlease"
155         myopts="${myopts} NO_NSEC=YesPlease"
156         myopts="${myopts} NO_MKSTEMPS=YesPlease"
157     fi

interix lacks propper poll() support (poll is there but broken), so some
of the things in git have to be disabled for now, or replaced by a
select() code (but that'd take precious time of mine to implement (argh)).

any comments on the patch? any chance to get stuff upstream?

(BTW. i know that this is not the most current git release i'm patching
(1.6.6.1), and i'll have to forward port the patch at some point anyway
- i hope i'll get to this soon...)

Thanks in advance!

Cheers, Markus
diff -ru git-1.6.6.1.orig/builtin-upload-archive.c git-1.6.6.1/builtin-upload-archive.c
--- git-1.6.6.1.orig/builtin-upload-archive.c	2010-03-09 10:51:28 +0100
+++ git-1.6.6.1/builtin-upload-archive.c	2010-03-09 11:06:45 +0100
@@ -132,8 +132,9 @@
 	packet_flush(1);
 
 	while (1) {
-		struct pollfd pfd[2];
 		int status;
+#ifndef __INTERIX
+		struct pollfd pfd[2];
 
 		pfd[0].fd = fd1[0];
 		pfd[0].events = POLLIN;
@@ -156,6 +157,8 @@
 			if (process_input(pfd[0].fd, 1))
 				continue;
 
+#endif
+
 		if (waitpid(writer, &status, 0) < 0)
 			error_clnt("%s", lostchild);
 		else if (!WIFEXITED(status) || WEXITSTATUS(status) > 0)
diff -ru git-1.6.6.1.orig/daemon.c git-1.6.6.1/daemon.c
--- git-1.6.6.1.orig/daemon.c	2010-03-09 10:51:28 +0100
+++ git-1.6.6.1/daemon.c	2010-03-09 11:00:50 +0100
@@ -14,6 +14,8 @@
 #define NI_MAXSERV 32
 #endif
 
+#ifndef __INTERIX /* not available on interix! */
+
 static int log_syslog;
 static int verbose;
 static int reuseaddr;
@@ -922,8 +924,13 @@
 	return service_loop(socknum, socklist);
 }
 
+#endif /* __INTERIX */
+
 int main(int argc, char **argv)
 {
+#ifdef __INTERIX
+	die("not implemented on interix!");
+#else /* !__INTERIX */
 	int listen_port = 0;
 	char *listen_addr = NULL;
 	int inetd_mode = 0;
@@ -1121,4 +1128,5 @@
 		store_pid(pid_file);
 
 	return serve(listen_addr, listen_port, pass, gid);
+#endif /* __INTERIX */
 }
diff -ru git-1.6.6.1.orig/git-compat-util.h git-1.6.6.1/git-compat-util.h
--- git-1.6.6.1.orig/git-compat-util.h	2010-03-09 10:51:29 +0100
+++ git-1.6.6.1/git-compat-util.h	2010-03-09 10:53:59 +0100
@@ -93,7 +93,9 @@
 #include <utime.h>
 #ifndef __MINGW32__
 #include <sys/wait.h>
+#ifndef __INTERIX
 #include <sys/poll.h>
+#endif
 #include <sys/socket.h>
 #include <sys/ioctl.h>
 #ifndef NO_SYS_SELECT_H
@@ -104,7 +106,11 @@
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <pwd.h>
+#ifndef __INTERIX
 #include <inttypes.h>
+#else
+#include <stdint.h>
+#endif
 #if defined(__CYGWIN__)
 #undef _XOPEN_SOURCE
 #include <grp.h>
diff -ru git-1.6.6.1.orig/upload-pack.c git-1.6.6.1/upload-pack.c
--- git-1.6.6.1.orig/upload-pack.c	2010-03-09 10:51:33 +0100
+++ git-1.6.6.1/upload-pack.c	2010-03-09 10:58:02 +0100
@@ -150,6 +150,7 @@
 
 static void create_pack_file(void)
 {
+#ifndef __INTERIX
 	struct async rev_list;
 	struct child_process pack_objects;
 	int create_full_pack = (nr_our_refs == want_obj.nr && !have_obj.nr);
@@ -328,6 +329,9 @@
  fail:
 	send_client_data(3, abort_msg, sizeof(abort_msg));
 	die("git upload-pack: %s", abort_msg);
+#else /* __INTERIX */
+	die("git upload-pack: not implemented on interix!");
+#endif /* __INTERIX */
 }
 
 static int got_sha1(char *hex, unsigned char *sha1)