Merge branch 'jn/maint-c99-format'
authorJunio C Hamano <gitster@pobox.com>
Wed, 23 Mar 2011 21:55:46 +0000 (14:55 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 23 Mar 2011 21:55:46 +0000 (14:55 -0700)
* jn/maint-c99-format:
unbreak and eliminate NO_C99_FORMAT
mktag: avoid %td in format string

1  2 
Makefile
builtin/mktag.c
sha1_file.c
diff --combined Makefile
index 654d8ac7e14a2118b1fd2014fb13a6b5d4c50c64,d9243aad9b734b241517e2d5b24715a104c85f4c..b0f155ab305d1795ada45060460c52594e7a366a
+++ b/Makefile
@@@ -45,11 -45,6 +45,6 @@@ all:
  # Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
  # d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7).
  #
- # Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)
- # do not support the 'size specifiers' introduced by C99, namely ll, hh,
- # j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
- # some C compilers supported these specifiers prior to C99 as an extension.
- #
  # Define NO_STRCASESTR if you don't have strcasestr.
  #
  # Define NO_MEMMEM if you don't have memmem.
  #
  # Define NO_REGEX if you have no or inferior regex support in your C library.
  #
 +# Define GETTEXT_POISON if you are debugging the choice of strings marked
 +# for translation.  In a GETTEXT_POISON build, you can turn all strings marked
 +# for translation into gibberish by setting the GIT_GETTEXT_POISON variable
 +# (to any value) in your environment.
 +#
  # Define JSMIN to point to JavaScript minifier that functions as
  # a filter to have gitweb.js minified.
  #
@@@ -321,7 -311,6 +316,7 @@@ INSTALL = instal
  RPMBUILD = rpmbuild
  TCL_PATH = tclsh
  TCLTK_PATH = wish
 +XGETTEXT = xgettext
  PTHREAD_LIBS = -lpthread
  PTHREAD_CFLAGS =
  GCOV = gcov
@@@ -441,7 -430,6 +436,7 @@@ TEST_PROGRAMS_NEED_X += test-subproces
  TEST_PROGRAMS_NEED_X += test-svn-fe
  TEST_PROGRAMS_NEED_X += test-treap
  TEST_PROGRAMS_NEED_X += test-index-version
 +TEST_PROGRAMS_NEED_X += test-mktemp
  
  TEST_PROGRAMS = $(patsubst %,%$X,$(TEST_PROGRAMS_NEED_X))
  
@@@ -521,7 -509,6 +516,7 @@@ LIB_H += diff.
  LIB_H += dir.h
  LIB_H += exec_cmd.h
  LIB_H += fsck.h
 +LIB_H += gettext.h
  LIB_H += git-compat-util.h
  LIB_H += graph.h
  LIB_H += grep.h
@@@ -878,7 -865,6 +873,6 @@@ ifeq ($(uname_S),SunOS
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
                NO_STRLCPY = YesPlease
-               NO_C99_FORMAT = YesPlease
                NO_STRTOUMAX = YesPlease
                GIT_TEST_CMP = cmp
        endif
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
                NO_STRLCPY = YesPlease
-               NO_C99_FORMAT = YesPlease
                NO_STRTOUMAX = YesPlease
                GIT_TEST_CMP = cmp
        endif
        ifeq ($(uname_R),5.8)
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
-               NO_C99_FORMAT = YesPlease
                NO_STRTOUMAX = YesPlease
                GIT_TEST_CMP = cmp
        endif
        ifeq ($(uname_R),5.9)
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
-               NO_C99_FORMAT = YesPlease
                NO_STRTOUMAX = YesPlease
                GIT_TEST_CMP = cmp
        endif
@@@ -1049,7 -1032,6 +1040,7 @@@ ifeq ($(uname_S),HP-UX
        NO_UNSETENV = YesPlease
        NO_HSTRERROR = YesPlease
        NO_SYS_SELECT_H = YesPlease
 +      NO_FNMATCH_CASEFOLD = YesPlease
        SNPRINTF_RETURNS_BOGUS = YesPlease
        NO_NSEC = YesPlease
        ifeq ($(uname_R),B.11.00)
@@@ -1083,7 -1065,6 +1074,6 @@@ ifeq ($(uname_S),Windows
        NO_MEMMEM = YesPlease
        # NEEDS_LIBICONV = YesPlease
        NO_ICONV = YesPlease
-       NO_C99_FORMAT = YesPlease
        NO_STRTOUMAX = YesPlease
        NO_STRTOULL = YesPlease
        NO_MKDTEMP = YesPlease
@@@ -1160,7 -1141,6 +1150,6 @@@ ifneq (,$(findstring MINGW,$(uname_S))
        NO_MEMMEM = YesPlease
        NEEDS_LIBICONV = YesPlease
        OLD_ICONV = YesPlease
-       NO_C99_FORMAT = YesPlease
        NO_STRTOUMAX = YesPlease
        NO_MKDTEMP = YesPlease
        NO_MKSTEMPS = YesPlease
@@@ -1363,9 -1343,6 +1352,6 @@@ endi
  ifdef NO_NSEC
        BASIC_CFLAGS += -DNO_NSEC
  endif
- ifdef NO_C99_FORMAT
-       BASIC_CFLAGS += -DNO_C99_FORMAT
- endif
  ifdef SNPRINTF_RETURNS_BOGUS
        COMPAT_CFLAGS += -DSNPRINTF_RETURNS_BOGUS
        COMPAT_OBJS += compat/snprintf.o
@@@ -1377,10 -1354,6 +1363,10 @@@ endi
  ifdef NO_SYMLINK_HEAD
        BASIC_CFLAGS += -DNO_SYMLINK_HEAD
  endif
 +ifdef GETTEXT_POISON
 +      LIB_OBJS += gettext.o
 +      BASIC_CFLAGS += -DGETTEXT_POISON
 +endif
  ifdef NO_STRCASESTR
        COMPAT_CFLAGS += -DNO_STRCASESTR
        COMPAT_OBJS += compat/strcasestr.o
@@@ -1592,7 -1565,6 +1578,7 @@@ ifndef 
        QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
        QUIET_GEN      = @echo '   ' GEN $@;
        QUIET_LNCP     = @echo '   ' LN/CP $@;
 +      QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
        QUIET_GCOV     = @echo '   ' GCOV $@;
        QUIET_SUBDIR0  = +@subdir=
        QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
@@@ -2060,20 -2032,6 +2046,20 @@@ info
  pdf:
        $(MAKE) -C Documentation pdf
  
 +XGETTEXT_FLAGS = \
 +      --force-po \
 +      --add-comments \
 +      --msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
 +      --from-code=UTF-8
 +XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --keyword=_ --keyword=N_ --language=C
 +LOCALIZED_C := $(C_OBJ:o=c)
 +
 +po/git.pot: $(LOCALIZED_C)
 +      $(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C) && \
 +      mv $@+ $@
 +
 +pot: po/git.pot
 +
  $(ETAGS_TARGET): FORCE
        $(RM) $(ETAGS_TARGET)
        $(FIND) . -name '*.[hcS]' -print | xargs etags -a -o $(ETAGS_TARGET)
@@@ -2115,7 -2073,6 +2101,7 @@@ endi
  ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
        @echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@
  endif
 +      @echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@
  
  ### Detect Tck/Tk interpreter path changes
  ifndef NO_TCLTK
@@@ -2341,7 -2298,6 +2327,7 @@@ dist-doc
  
  distclean: clean
        $(RM) configure
 +      $(RM) po/git.pot
  
  clean:
        $(RM) *.o block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o xdiff/*.o vcs-svn/*.o \
diff --combined builtin/mktag.c
index d0ccbb22227ac9667ded5fc5687ca64b7fd66afc,bc05227b521d2c5b01e6550924ecd6582179dbda..324a267163d758b5dea51405265ae89042a657ad
@@@ -1,5 -1,6 +1,5 @@@
 -#include "cache.h"
 +#include "builtin.h"
  #include "tag.h"
 -#include "exec_cmd.h"
  
  /*
   * A signature file has a very simple fixed format: four lines
@@@ -34,12 -35,6 +34,6 @@@ static int verify_object(const unsigne
        return ret;
  }
  
- #ifdef NO_C99_FORMAT
- #define PD_FMT "%d"
- #else
- #define PD_FMT "%td"
- #endif
  static int verify_tag(char *buffer, unsigned long size)
  {
        int typelen;
        /* Verify tag-line */
        tag_line = strchr(type_line, '\n');
        if (!tag_line)
-               return error("char" PD_FMT ": could not find next \"\\n\"", type_line - buffer);
+               return error("char%"PRIuMAX": could not find next \"\\n\"",
+                               (uintmax_t) (type_line - buffer));
        tag_line++;
        if (memcmp(tag_line, "tag ", 4) || tag_line[4] == '\n')
-               return error("char" PD_FMT ": no \"tag \" found", tag_line - buffer);
+               return error("char%"PRIuMAX": no \"tag \" found",
+                               (uintmax_t) (tag_line - buffer));
  
        /* Get the actual type */
        typelen = tag_line - type_line - strlen("type \n");
        if (typelen >= sizeof(type))
-               return error("char" PD_FMT ": type too long", type_line+5 - buffer);
+               return error("char%"PRIuMAX": type too long",
+                               (uintmax_t) (type_line+5 - buffer));
  
        memcpy(type, type_line+5, typelen);
        type[typelen] = 0;
                        break;
                if (c > ' ')
                        continue;
-               return error("char" PD_FMT ": could not verify tag name", tag_line - buffer);
+               return error("char%"PRIuMAX": could not verify tag name",
+                               (uintmax_t) (tag_line - buffer));
        }
  
        /* Verify the tagger line */
        tagger_line = tag_line;
  
        if (memcmp(tagger_line, "tagger ", 7))
-               return error("char" PD_FMT ": could not find \"tagger \"",
-                       tagger_line - buffer);
+               return error("char%"PRIuMAX": could not find \"tagger \"",
+                       (uintmax_t) (tagger_line - buffer));
  
        /*
         * Check for correct form for name and email
        if (!(lb = strstr(tagger_line, " <")) || !(rb = strstr(lb+2, "> ")) ||
                strpbrk(tagger_line, "<>\n") != lb+1 ||
                strpbrk(lb+2, "><\n ") != rb)
-               return error("char" PD_FMT ": malformed tagger field",
-                       tagger_line - buffer);
+               return error("char%"PRIuMAX": malformed tagger field",
+                       (uintmax_t) (tagger_line - buffer));
  
        /* Check for author name, at least one character, space is acceptable */
        if (lb == tagger_line)
-               return error("char" PD_FMT ": missing tagger name",
-                       tagger_line - buffer);
+               return error("char%"PRIuMAX": missing tagger name",
+                       (uintmax_t) (tagger_line - buffer));
  
        /* timestamp, 1 or more digits followed by space */
        tagger_line = rb + 2;
        if (!(len = strspn(tagger_line, "0123456789")))
-               return error("char" PD_FMT ": missing tag timestamp",
-                       tagger_line - buffer);
+               return error("char%"PRIuMAX": missing tag timestamp",
+                       (uintmax_t) (tagger_line - buffer));
        tagger_line += len;
        if (*tagger_line != ' ')
-               return error("char" PD_FMT ": malformed tag timestamp",
-                       tagger_line - buffer);
+               return error("char%"PRIuMAX": malformed tag timestamp",
+                       (uintmax_t) (tagger_line - buffer));
        tagger_line++;
  
        /* timezone, 5 digits [+-]hhmm, max. 1400 */
        if (!((tagger_line[0] == '+' || tagger_line[0] == '-') &&
              strspn(tagger_line+1, "0123456789") == 4 &&
              tagger_line[5] == '\n' && atoi(tagger_line+1) <= 1400))
-               return error("char" PD_FMT ": malformed tag timezone",
-                       tagger_line - buffer);
+               return error("char%"PRIuMAX": malformed tag timezone",
+                       (uintmax_t) (tagger_line - buffer));
        tagger_line += 6;
  
        /* Verify the blank line separating the header from the body */
        if (*tagger_line != '\n')
-               return error("char" PD_FMT ": trailing garbage in tag header",
-                       tagger_line - buffer);
+               return error("char%"PRIuMAX": trailing garbage in tag header",
+                       (uintmax_t) (tagger_line - buffer));
  
        /* The actual stuff afterwards we don't care about.. */
        return 0;
  }
  
- #undef PD_FMT
  int cmd_mktag(int argc, const char **argv, const char *prefix)
  {
        struct strbuf buf = STRBUF_INIT;
diff --combined sha1_file.c
index b4fcca8ffdbfe48b11478709c61eb90cd64de20d,ea99f6f313e8e6071b37706dd7e7b2a76463a311..7829d615d4b6d85283aa8469be5307c419d70292
@@@ -13,7 -13,6 +13,7 @@@
  #include "commit.h"
  #include "tag.h"
  #include "tree.h"
 +#include "tree-walk.h"
  #include "refs.h"
  #include "pack-revindex.h"
  #include "sha1-lookup.h"
  #endif
  #endif
  
- #ifdef NO_C99_FORMAT
- #define SZ_FMT "lu"
- static unsigned long sz_fmt(size_t s) { return (unsigned long)s; }
- #else
- #define SZ_FMT "zu"
- static size_t sz_fmt(size_t s) { return s; }
- #endif
+ #define SZ_FMT PRIuMAX
+ static inline uintmax_t sz_fmt(size_t s) { return s; }
  
  const unsigned char null_sha1[20];
  
@@@ -418,8 -412,6 +413,8 @@@ static unsigned int pack_used_ctr
  static unsigned int pack_mmap_calls;
  static unsigned int peak_pack_open_windows;
  static unsigned int pack_open_windows;
 +static unsigned int pack_open_fds;
 +static unsigned int pack_max_fds;
  static size_t peak_pack_mapped;
  static size_t pack_mapped;
  struct packed_git *packed_git;
@@@ -597,10 -589,8 +592,10 @@@ static int unuse_one_window(struct pack
                        lru_l->next = lru_w->next;
                else {
                        lru_p->windows = lru_w->next;
 -                      if (!lru_p->windows && lru_p->pack_fd != keep_fd) {
 +                      if (!lru_p->windows && lru_p->pack_fd != -1
 +                              && lru_p->pack_fd != keep_fd) {
                                close(lru_p->pack_fd);
 +                              pack_open_fds--;
                                lru_p->pack_fd = -1;
                        }
                }
@@@ -685,10 -675,8 +680,10 @@@ void free_pack_by_name(const char *pack
                if (strcmp(pack_name, p->pack_name) == 0) {
                        clear_delta_base_cache();
                        close_pack_windows(p);
 -                      if (p->pack_fd != -1)
 +                      if (p->pack_fd != -1) {
                                close(p->pack_fd);
 +                              pack_open_fds--;
 +                      }
                        close_pack_index(p);
                        free(p->bad_object_sha1);
                        *pp = p->next;
@@@ -714,29 -702,9 +709,29 @@@ static int open_packed_git_1(struct pac
        if (!p->index_data && open_pack_index(p))
                return error("packfile %s index unavailable", p->pack_name);
  
 +      if (!pack_max_fds) {
 +              struct rlimit lim;
 +              unsigned int max_fds;
 +
 +              if (getrlimit(RLIMIT_NOFILE, &lim))
 +                      die_errno("cannot get RLIMIT_NOFILE");
 +
 +              max_fds = lim.rlim_cur;
 +
 +              /* Save 3 for stdin/stdout/stderr, 22 for work */
 +              if (25 < max_fds)
 +                      pack_max_fds = max_fds - 25;
 +              else
 +                      pack_max_fds = 1;
 +      }
 +
 +      while (pack_max_fds <= pack_open_fds && unuse_one_window(NULL, -1))
 +              ; /* nothing */
 +
        p->pack_fd = git_open_noatime(p->pack_name, p);
        if (p->pack_fd < 0 || fstat(p->pack_fd, &st))
                return -1;
 +      pack_open_fds++;
  
        /* If we created the struct before we had the pack we lack size. */
        if (!p->pack_size) {
@@@ -788,7 -756,6 +783,7 @@@ static int open_packed_git(struct packe
                return 0;
        if (p->pack_fd != -1) {
                close(p->pack_fd);
 +              pack_open_fds--;
                p->pack_fd = -1;
        }
        return -1;
@@@ -814,13 -781,14 +809,13 @@@ unsigned char *use_pack(struct packed_g
  {
        struct pack_window *win = *w_cursor;
  
 -      if (p->pack_fd == -1 && open_packed_git(p))
 -              die("packfile %s cannot be accessed", p->pack_name);
 -
        /* Since packfiles end in a hash of their content and it's
         * pointless to ask for an offset into the middle of that
         * hash, and the in_window function above wouldn't match
         * don't allow an offset too close to the end of the file.
         */
 +      if (!p->pack_size && p->pack_fd == -1 && open_packed_git(p))
 +              die("packfile %s cannot be accessed", p->pack_name);
        if (offset > (p->pack_size - 20))
                die("offset beyond end of packfile (truncated pack?)");
  
                if (!win) {
                        size_t window_align = packed_git_window_size / 2;
                        off_t len;
 +
 +                      if (p->pack_fd == -1 && open_packed_git(p))
 +                              die("packfile %s cannot be accessed", p->pack_name);
 +
                        win = xcalloc(1, sizeof(*win));
                        win->offset = (offset / window_align) * window_align;
                        len = p->pack_size - win->offset;
                                die("packfile %s cannot be mapped: %s",
                                        p->pack_name,
                                        strerror(errno));
 +                      if (!win->offset && win->len == p->pack_size
 +                              && !p->do_not_close) {
 +                              close(p->pack_fd);
 +                              pack_open_fds--;
 +                              p->pack_fd = -1;
 +                      }
                        pack_mmap_calls++;
                        pack_open_windows++;
                        if (pack_mapped > peak_pack_mapped)
@@@ -955,9 -913,6 +950,9 @@@ struct packed_git *parse_pack_index(uns
  
  void install_packed_git(struct packed_git *pack)
  {
 +      if (pack->pack_fd != -1)
 +              pack_open_fds++;
 +
        pack->next = packed_git;
        packed_git = pack;
  }
@@@ -975,6 -930,8 +970,6 @@@ static void prepare_packed_git_one(cha
        sprintf(path, "%s/pack", objdir);
        len = strlen(path);
        dir = opendir(path);
 -      while (!dir && errno == EMFILE && unuse_one_window(NULL, -1))
 -              dir = opendir(path);
        if (!dir) {
                if (errno != ENOENT)
                        error("unable to open object pack directory: %s: %s",
@@@ -1130,6 -1087,14 +1125,6 @@@ static int git_open_noatime(const char 
                if (fd >= 0)
                        return fd;
  
 -              /* Might the failure be insufficient file descriptors? */
 -              if (errno == EMFILE) {
 -                      if (unuse_one_window(p, -1))
 -                              continue;
 -                      else
 -                              return -1;
 -              }
 -
                /* Might the failure be due to O_NOATIME? */
                if (errno != ENOENT && sha1_file_open_flag) {
                        sha1_file_open_flag = 0;
@@@ -1961,27 -1926,6 +1956,27 @@@ off_t find_pack_entry_one(const unsigne
        return 0;
  }
  
 +static int is_pack_valid(struct packed_git *p)
 +{
 +      /* An already open pack is known to be valid. */
 +      if (p->pack_fd != -1)
 +              return 1;
 +
 +      /* If the pack has one window completely covering the
 +       * file size, the pack is known to be valid even if
 +       * the descriptor is not currently open.
 +       */
 +      if (p->windows) {
 +              struct pack_window *w = p->windows;
 +
 +              if (!w->offset && w->len == p->pack_size)
 +                      return 1;
 +      }
 +
 +      /* Force the pack to open to prove its valid. */
 +      return !open_packed_git(p);
 +}
 +
  static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e)
  {
        static struct packed_git *last_found = (void *)1;
                         * it may have been deleted since the index
                         * was loaded!
                         */
 -                      if (p->pack_fd == -1 && open_packed_git(p)) {
 +                      if (!is_pack_valid(p)) {
                                error("packfile %s cannot be accessed", p->pack_name);
                                goto next;
                        }
@@@ -2410,6 -2354,8 +2405,6 @@@ static int write_loose_object(const uns
  
        filename = sha1_file_name(sha1);
        fd = create_tmpfile(tmpfile, sizeof(tmpfile), filename);
 -      while (fd < 0 && errno == EMFILE && unuse_one_window(NULL, -1))
 -              fd = create_tmpfile(tmpfile, sizeof(tmpfile), filename);
        if (fd < 0) {
                if (errno == EACCES)
                        return error("insufficient permission for adding an object to repository database %s\n", get_object_directory());
@@@ -2528,37 -2474,8 +2523,37 @@@ int has_sha1_file(const unsigned char *
        return has_loose_object(sha1);
  }
  
 +static void check_tree(const void *buf, size_t size)
 +{
 +      struct tree_desc desc;
 +      struct name_entry entry;
 +
 +      init_tree_desc(&desc, buf, size);
 +      while (tree_entry(&desc, &entry))
 +              /* do nothing
 +               * tree_entry() will die() on malformed entries */
 +              ;
 +}
 +
 +static void check_commit(const void *buf, size_t size)
 +{
 +      struct commit c;
 +      memset(&c, 0, sizeof(c));
 +      if (parse_commit_buffer(&c, buf, size))
 +              die("corrupt commit");
 +}
 +
 +static void check_tag(const void *buf, size_t size)
 +{
 +      struct tag t;
 +      memset(&t, 0, sizeof(t));
 +      if (parse_tag_buffer(&t, buf, size))
 +              die("corrupt tag");
 +}
 +
  static int index_mem(unsigned char *sha1, void *buf, size_t size,
 -                   int write_object, enum object_type type, const char *path)
 +                   int write_object, enum object_type type,
 +                   const char *path, int format_check)
  {
        int ret, re_allocated = 0;
  
                        re_allocated = 1;
                }
        }
 +      if (format_check) {
 +              if (type == OBJ_TREE)
 +                      check_tree(buf, size);
 +              if (type == OBJ_COMMIT)
 +                      check_commit(buf, size);
 +              if (type == OBJ_TAG)
 +                      check_tag(buf, size);
 +      }
  
        if (write_object)
                ret = write_sha1_file(buf, size, typename(type), sha1);
  #define SMALL_FILE_SIZE (32*1024)
  
  int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object,
 -           enum object_type type, const char *path)
 +           enum object_type type, const char *path, int format_check)
  {
        int ret;
        size_t size = xsize_t(st->st_size);
                struct strbuf sbuf = STRBUF_INIT;
                if (strbuf_read(&sbuf, fd, 4096) >= 0)
                        ret = index_mem(sha1, sbuf.buf, sbuf.len, write_object,
 -                                      type, path);
 +                                      type, path, format_check);
                else
                        ret = -1;
                strbuf_release(&sbuf);
        } else if (!size) {
 -              ret = index_mem(sha1, NULL, size, write_object, type, path);
 +              ret = index_mem(sha1, NULL, size, write_object, type, path,
 +                              format_check);
        } else if (size <= SMALL_FILE_SIZE) {
                char *buf = xmalloc(size);
                if (size == read_in_full(fd, buf, size))
                        ret = index_mem(sha1, buf, size, write_object, type,
 -                                      path);
 +                                      path, format_check);
                else
                        ret = error("short read %s", strerror(errno));
                free(buf);
        } else {
                void *buf = xmmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
 -              ret = index_mem(sha1, buf, size, write_object, type, path);
 +              ret = index_mem(sha1, buf, size, write_object, type, path,
 +                              format_check);
                munmap(buf, size);
        }
        close(fd);
@@@ -2642,7 -2549,7 +2637,7 @@@ int index_path(unsigned char *sha1, con
                if (fd < 0)
                        return error("open(\"%s\"): %s", path,
                                     strerror(errno));
 -              if (index_fd(sha1, fd, st, write_object, OBJ_BLOB, path) < 0)
 +              if (index_fd(sha1, fd, st, write_object, OBJ_BLOB, path, 0) < 0)
                        return error("%s: failed to insert into database",
                                     path);
                break;