[PATCH] Enhance sha1_file_size() into sha1_object_info()
[git.git] / sha1_file.c
index 6d6073d..4225c67 100644 (file)
@@ -7,7 +7,6 @@
  * creation etc.
  */
 #include "cache.h"
-#include "delta.h"
 
 #ifndef O_NOATIME
 #if defined(__linux__) && (defined(__i386__) || defined(__PPC__))
@@ -410,92 +409,26 @@ void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned l
        return unpack_sha1_rest(&stream, hdr, *size);
 }
 
-int sha1_delta_base(const unsigned char *sha1, unsigned char *base_sha1)
+int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep)
 {
-       int ret;
+       int status;
        unsigned long mapsize, size;
        void *map;
        z_stream stream;
-       char hdr[64], type[20];
-       void *delta_data_head;
+       char hdr[128];
 
        map = map_sha1_file(sha1, &mapsize);
        if (!map)
-               return -1;
-       ret = unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr));
-       if (ret < Z_OK || parse_sha1_header(hdr, type, &size) < 0) {
-               ret = -1;
-               goto out;
-       }
-       if (strcmp(type, "delta")) {
-               ret = 0;
-               goto out;
-       }
-
-       delta_data_head = hdr + strlen(hdr) + 1;
-       ret = 1;
-       memcpy(base_sha1, delta_data_head, 20);
- out:
-       inflateEnd(&stream);
-       munmap(map, mapsize);
-       return ret;
-}
-
-int sha1_file_size(const unsigned char *sha1, unsigned long *sizep)
-{
-       int ret, status;
-       unsigned long mapsize, size;
-       void *map;
-       z_stream stream;
-       char hdr[64], type[20];
-       const unsigned char *data;
-       unsigned char cmd;
-       int i;
-
-       map = map_sha1_file(sha1, &mapsize);
-       if (!map)
-               return -1;
-       ret = unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr));
-       status = -1;
-       if (ret < Z_OK || parse_sha1_header(hdr, type, &size) < 0)
-               goto out;
-       if (strcmp(type, "delta")) {
-               *sizep = size;
+               return error("unable to map %s", sha1_to_hex(sha1));
+       if (unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)) < 0)
+               status = error("unable to unpack %s header",
+                              sha1_to_hex(sha1));
+       if (parse_sha1_header(hdr, type, &size) < 0)
+               status = error("unable to parse %s header", sha1_to_hex(sha1));
+       else {
                status = 0;
-               goto out;
-       }
-
-       /* We are dealing with a delta object.  Inflated, the first
-        * 20 bytes hold the base object SHA1, and delta data follows
-        * immediately after it.
-        *
-        * The initial part of the delta starts at delta_data_head +
-        * 20.  Borrow code from patch-delta to read the result size.
-        */
-       data = (unsigned char *)(hdr + strlen(hdr) + 1 + 20);
-
-       /* Skip over the source size; we are not interested in
-        * it and we cannot verify it because we do not want
-        * to read the base object.
-        */
-       cmd = *data++;
-       while (cmd) {
-               if (cmd & 1)
-                       data++;
-               cmd >>= 1;
-       }
-       /* Read the result size */
-       size = i = 0;
-       cmd = *data++;
-       while (cmd) {
-               if (cmd & 1)
-                       size |= *data++ << i;
-               i += 8;
-               cmd >>= 1;
+               *sizep = size;
        }
-       *sizep = size;
-       status = 0;
- out:
        inflateEnd(&stream);
        munmap(map, mapsize);
        return status;
@@ -510,19 +443,6 @@ void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size
        if (map) {
                buf = unpack_sha1_file(map, mapsize, type, size);
                munmap(map, mapsize);
-               if (buf && !strcmp(type, "delta")) {
-                       void *ref = NULL, *delta = buf;
-                       unsigned long ref_size, delta_size = *size;
-                       buf = NULL;
-                       if (delta_size > 20)
-                               ref = read_sha1_file(delta, type, &ref_size);
-                       if (ref)
-                               buf = patch_delta(ref, ref_size,
-                                                 delta+20, delta_size-20, 
-                                                 size);
-                       free(delta);
-                       free(ref);
-               }
                return buf;
        }
        return NULL;