[PATCH] Remove map_sha1_file
[gitweb.git] / sha1_file.c
index fd6096f4170f2db58320dc7d7e16f25b6c7fd0c9..15fd6e04360c2a963766d940b73775002abb0b77 100644 (file)
@@ -102,34 +102,6 @@ char *get_index_file(void)
        return git_index_file;
 }
 
-char *git_path(const char *fmt, ...)
-{
-       static char pathname[PATH_MAX], *ret;
-       va_list args;
-       int len;
-
-       if (!git_dir)
-               setup_git_env();
-       len = strlen(git_dir);
-       if (len > PATH_MAX-100)
-               return "pad-path";
-       memcpy(pathname, git_dir, len);
-       if (len && git_dir[len-1] != '/')
-               pathname[len++] = '/';
-       va_start(args, fmt);
-       vsnprintf(pathname + len, sizeof(pathname) - len, fmt, args);
-       va_end(args);
-       ret = pathname;
-
-       /* Clean it up */
-       if (!memcmp(pathname, "./", 2)) {
-               ret += 2;
-               while (*ret == '/')
-                       ret++;
-       }
-       return ret;
-}
-
 int safe_create_leading_directories(char *path)
 {
        char *pos = path;
@@ -515,8 +487,7 @@ int check_sha1_signature(const unsigned char *sha1, void *map, unsigned long siz
 }
 
 static void *map_sha1_file_internal(const unsigned char *sha1,
-                                   unsigned long *size,
-                                   int say_error)
+                                   unsigned long *size)
 {
        struct stat st;
        void *map;
@@ -524,8 +495,6 @@ static void *map_sha1_file_internal(const unsigned char *sha1,
        char *filename = find_sha1_file(sha1, &st);
 
        if (!filename) {
-               if (say_error)
-                       error("cannot map sha1 file %s", sha1_to_hex(sha1));
                return NULL;
        }
 
@@ -539,8 +508,6 @@ static void *map_sha1_file_internal(const unsigned char *sha1,
                                break;
                /* Fallthrough */
                case 0:
-                       if (say_error)
-                               perror(filename);
                        return NULL;
                }
 
@@ -557,11 +524,6 @@ static void *map_sha1_file_internal(const unsigned char *sha1,
        return map;
 }
 
-void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
-{
-       return map_sha1_file_internal(sha1, size, 1);
-}
-
 int unpack_sha1_header(z_stream *stream, void *map, unsigned long mapsize, void *buffer, unsigned long size)
 {
        /* Get the data stream */
@@ -1035,7 +997,7 @@ int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep
        z_stream stream;
        char hdr[128];
 
-       map = map_sha1_file_internal(sha1, &mapsize, 0);
+       map = map_sha1_file_internal(sha1, &mapsize);
        if (!map) {
                struct pack_entry e;
 
@@ -1074,7 +1036,7 @@ void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size
        unsigned long mapsize;
        void *map, *buf;
 
-       map = map_sha1_file_internal(sha1, &mapsize, 0);
+       map = map_sha1_file_internal(sha1, &mapsize);
        if (map) {
                buf = unpack_sha1_file(map, mapsize, type, size);
                munmap(map, mapsize);
@@ -1128,12 +1090,12 @@ void *read_object_with_reference(const unsigned char *sha1,
        }
 }
 
-static char *write_sha1_file_prepare(void *buf,
-                                    unsigned long len,
-                                    const char *type,
-                                    unsigned char *sha1,
-                                    unsigned char *hdr,
-                                    int *hdrlen)
+char *write_sha1_file_prepare(void *buf,
+                             unsigned long len,
+                             const char *type,
+                             unsigned char *sha1,
+                             unsigned char *hdr,
+                             int *hdrlen)
 {
        SHA_CTX c;
 
@@ -1249,6 +1211,65 @@ int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned cha
        return 0;
 }
 
+int write_sha1_to_fd(int fd, const unsigned char *sha1)
+{
+       ssize_t size;
+       unsigned long objsize;
+       int posn = 0;
+       char *buf = map_sha1_file_internal(sha1, &objsize);
+       z_stream stream;
+       if (!buf) {
+               unsigned char *unpacked;
+               unsigned long len;
+               char type[20];
+               char hdr[50];
+               int hdrlen;
+               // need to unpack and recompress it by itself
+               unpacked = read_packed_sha1(sha1, type, &len);
+
+               hdrlen = sprintf(hdr, "%s %lu", type, len) + 1;
+
+               /* Set it up */
+               memset(&stream, 0, sizeof(stream));
+               deflateInit(&stream, Z_BEST_COMPRESSION);
+               size = deflateBound(&stream, len + hdrlen);
+               buf = xmalloc(size);
+
+               /* Compress it */
+               stream.next_out = buf;
+               stream.avail_out = size;
+               
+               /* First header.. */
+               stream.next_in = hdr;
+               stream.avail_in = hdrlen;
+               while (deflate(&stream, 0) == Z_OK)
+                       /* nothing */;
+
+               /* Then the data itself.. */
+               stream.next_in = unpacked;
+               stream.avail_in = len;
+               while (deflate(&stream, Z_FINISH) == Z_OK)
+                       /* nothing */;
+               deflateEnd(&stream);
+               
+               objsize = stream.total_out;
+       }
+
+       do {
+               size = write(fd, buf + posn, objsize - posn);
+               if (size <= 0) {
+                       if (!size) {
+                               fprintf(stderr, "write closed");
+                       } else {
+                               perror("write ");
+                       }
+                       return -1;
+               }
+               posn += size;
+       } while (posn < objsize);
+       return 0;
+}
+
 int write_sha1_from_fd(const unsigned char *sha1, int fd)
 {
        char *filename = sha1_file_name(sha1);
@@ -1327,11 +1348,13 @@ int has_sha1_file(const unsigned char *sha1)
        return find_pack_entry(sha1, &e);
 }
 
-int index_fd(unsigned char *sha1, int fd, struct stat *st)
+int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, const char *type)
 {
        unsigned long size = st->st_size;
        void *buf;
        int ret;
+       unsigned char hdr[50];
+       int hdrlen;
 
        buf = "";
        if (size)
@@ -1340,7 +1363,14 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st)
        if ((int)(long)buf == -1)
                return -1;
 
-       ret = write_sha1_file(buf, size, "blob", sha1);
+       if (!type)
+               type = "blob";
+       if (write_object)
+               ret = write_sha1_file(buf, size, type, sha1);
+       else {
+               write_sha1_file_prepare(buf, size, type, sha1, hdr, &hdrlen);
+               ret = 0;
+       }
        if (size)
                munmap(buf, size);
        return ret;