Merge branch 'jc/maint-1.6.0-pack-directory'
authorJunio C Hamano <gitster@pobox.com>
Wed, 25 Feb 2009 22:48:30 +0000 (14:48 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Feb 2009 22:50:05 +0000 (14:50 -0800)
* jc/maint-1.6.0-pack-directory:
  Make sure objects/pack exists before creating a new pack

1  2 
builtin-pack-objects.c
fast-import.c
git-compat-util.h
index-pack.c
pack-write.c
t/t5300-pack-object.sh
wrapper.c

Simple merge
diff --cc fast-import.c
@@@ -879,12 -876,11 +878,11 @@@ static char *create_index(void
                c = next;
        }
  
-       snprintf(tmpfile, sizeof(tmpfile),
-               "%s/pack/tmp_idx_XXXXXX", get_object_directory());
-       idx_fd = xmkstemp(tmpfile);
+       idx_fd = odb_mkstemp(tmpfile, sizeof(tmpfile),
+                            "pack/tmp_idx_XXXXXX");
        f = sha1fd(idx_fd, tmpfile);
        sha1write(f, array, 256 * sizeof(int));
 -      SHA1_Init(&ctx);
 +      git_SHA1_Init(&ctx);
        for (c = idx; c != last; c++) {
                uint32_t offset = htonl((*c)->offset);
                sha1write(f, &offset, 4);
Simple merge
diff --cc index-pack.c
Simple merge
diff --cc pack-write.c
Simple merge
Simple merge
diff --cc wrapper.c
+++ b/wrapper.c
@@@ -197,62 -197,34 +197,94 @@@ int xmkstemp(char *template
        return fd;
  }
  
 +/*
 + * zlib wrappers to make sure we don't silently miss errors
 + * at init time.
 + */
 +void git_inflate_init(z_streamp strm)
 +{
 +      const char *err;
 +
 +      switch (inflateInit(strm)) {
 +      case Z_OK:
 +              return;
 +
 +      case Z_MEM_ERROR:
 +              err = "out of memory";
 +              break;
 +      case Z_VERSION_ERROR:
 +              err = "wrong version";
 +              break;
 +      default:
 +              err = "error";
 +      }
 +      die("inflateInit: %s (%s)", err, strm->msg ? strm->msg : "no message");
 +}
 +
 +void git_inflate_end(z_streamp strm)
 +{
 +      if (inflateEnd(strm) != Z_OK)
 +              error("inflateEnd: %s", strm->msg ? strm->msg : "failed");
 +}
 +
 +int git_inflate(z_streamp strm, int flush)
 +{
 +      int ret = inflate(strm, flush);
 +      const char *err;
 +
 +      switch (ret) {
 +      /* Out of memory is fatal. */
 +      case Z_MEM_ERROR:
 +              die("inflate: out of memory");
 +
 +      /* Data corruption errors: we may want to recover from them (fsck) */
 +      case Z_NEED_DICT:
 +              err = "needs dictionary"; break;
 +      case Z_DATA_ERROR:
 +              err = "data stream error"; break;
 +      case Z_STREAM_ERROR:
 +              err = "stream consistency error"; break;
 +      default:
 +              err = "unknown error"; break;
 +
 +      /* Z_BUF_ERROR: normal, needs more space in the output buffer */
 +      case Z_BUF_ERROR:
 +      case Z_OK:
 +      case Z_STREAM_END:
 +              return ret;
 +      }
 +      error("inflate: %s (%s)", err, strm->msg ? strm->msg : "no message");
 +      return ret;
 +}
++
+ int odb_mkstemp(char *template, size_t limit, const char *pattern)
+ {
+       int fd;
+       snprintf(template, limit, "%s/%s",
+                get_object_directory(), pattern);
+       fd = mkstemp(template);
+       if (0 <= fd)
+               return fd;
+       /* slow path */
+       safe_create_leading_directories(template);
+       snprintf(template, limit, "%s/%s",
+                get_object_directory(), pattern);
+       return xmkstemp(template);
+ }
+ int odb_pack_keep(char *name, size_t namesz, unsigned char *sha1)
+ {
+       int fd;
+       snprintf(name, namesz, "%s/pack/pack-%s.keep",
+                get_object_directory(), sha1_to_hex(sha1));
+       fd = open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
+       if (0 <= fd)
+               return fd;
+       /* slow path */
+       safe_create_leading_directories(name);
+       return open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
+ }