Merge branch 'jc/maint-1.6.0-pack-directory' into maint-1.6.1
authorJunio C Hamano <gitster@pobox.com>
Sun, 22 Mar 2009 05:53:36 +0000 (22:53 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 22 Mar 2009 05:53:36 +0000 (22:53 -0700)
* jc/maint-1.6.0-pack-directory:
  Fix odb_mkstemp() on AIX
  Make sure objects/pack exists before creating a new pack

Conflicts:
wrapper.c

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
index 23e970d581ad00c97ba8ea870c0e43b16258b219,f0114948ec1a48b5fa8fa848c231e0c37c2e7426..f246d5347b4131f274edad5c7c687fb7ddbbd99e
@@@ -878,12 -876,11 +877,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
index c85ca52ec63a679a2da7bd8980ad4e2df4e38794,5e9de294d51c158cbbe60a9a04c1b13765c353e8..d8efb1365a01104db568633fa8f6aef0c67b4cd1
+++ b/wrapper.c
@@@ -197,62 -197,35 +197,95 @@@ 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 */
+       /* some mkstemp implementations erase template on failure */
+       snprintf(template, limit, "%s/%s",
+                get_object_directory(), pattern);
+       safe_create_leading_directories(template);
+       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);
+ }