git: Patch to enable repos on shared filesystems
authorFredrik Fornwall <fredrik@fornwall.net>
Thu, 21 Apr 2016 23:32:02 +0000 (19:32 -0400)
committerFredrik Fornwall <fredrik@fornwall.net>
Thu, 21 Apr 2016 23:32:02 +0000 (19:32 -0400)
Fixes #227.

packages/git/build.sh
packages/git/config.c.patch [new file with mode: 0644]

index 0bb5c36..47dd68b 100755 (executable)
@@ -3,7 +3,7 @@ TERMUX_PKG_DESCRIPTION="Distributed version control system designed to handle ev
 # less is required as a pager for git log, and the busybox less does not handle used escape sequences.
 TERMUX_PKG_DEPENDS="libcurl, less"
 TERMUX_PKG_VERSION=2.8.1
-TERMUX_PKG_BUILD_REVISION=1
+TERMUX_PKG_BUILD_REVISION=2
 TERMUX_PKG_SRCURL=https://www.kernel.org/pub/software/scm/git/git-${TERMUX_PKG_VERSION}.tar.xz
 ## This requires a working $TERMUX_PREFIX/bin/sh on the host building:
 TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--without-tcltk --with-curl --with-shell=$TERMUX_PREFIX/bin/sh ac_cv_header_libintl_h=no ac_cv_fread_reads_directories=yes ac_cv_snprintf_returns_bogus=yes"
diff --git a/packages/git/config.c.patch b/packages/git/config.c.patch
new file mode 100644 (file)
index 0000000..05db635
--- /dev/null
@@ -0,0 +1,58 @@
+diff -u -r ../git-2.8.1/config.c ./config.c
+--- ../git-2.8.1/config.c      2016-04-03 15:07:18.000000000 -0400
++++ ./config.c 2016-04-21 18:37:26.707906688 -0400
+@@ -49,6 +49,25 @@
+  */
+ static struct config_set the_config_set;
++/*
++ * Protecting the project-specific git configuration file (.git/config) is
++ * not possible on a shared file system on Android, which on an unpatched
++ * git causes operations such as clone to fail with an error message.
++ *
++ * For the Termux git package we introduce a warning about the configuration
++ * file being unprotected, but proceed in order to allow git repositories
++ * to be cloned to shared storage accessible to other apps.
++ */
++static void termux_warn_once_about_lockfile()
++{
++      static int already_warned;
++      if (!already_warned) {
++              warning("Cannot protect .git/config on this file system"
++                              " - do not store sensitive information here.");
++              already_warned = 1;
++      }
++}
++
+ static int config_file_fgetc(struct config_source *conf)
+ {
+       return getc_unlocked(conf->u.file);
+@@ -2125,10 +2147,14 @@
+               in_fd = -1;
+               if (chmod(get_lock_file_path(lock), st.st_mode & 07777) < 0) {
++#ifdef __ANDROID__
++                      termux_warn_once_about_lockfile();
++#else
+                       error("chmod on %s failed: %s",
+                             get_lock_file_path(lock), strerror(errno));
+                       ret = CONFIG_NO_WRITE;
+                       goto out_free;
++#endif
+               }
+               if (store.seen == 0)
+@@ -2330,9 +2356,13 @@
+       fstat(fileno(config_file), &st);
+       if (chmod(get_lock_file_path(lock), st.st_mode & 07777) < 0) {
++#ifdef __ANDROID__
++              termux_warn_once_about_lockfile();
++#else
+               ret = error("chmod on %s failed: %s",
+                           get_lock_file_path(lock), strerror(errno));
+               goto out;
++#endif
+       }
+       while (fgets(buf, sizeof(buf), config_file)) {