* This handles basic git sha1 object files - packing, unpacking,
* creation etc.
*/
-#include <stdarg.h>
-#include <limits.h>
#include "cache.h"
+#include "delta.h"
#ifndef O_NOATIME
#if defined(__linux__) && (defined(__i386__) || defined(__PPC__))
return 0;
}
-int get_sha1_file(const char *path, unsigned char *result)
+static int get_sha1_file(const char *path, unsigned char *result)
{
char buffer[60];
int fd = open(path, O_RDONLY);
{
int pass, totlen, i;
const char *cp, *last;
- char *op = 0;
+ char *op = NULL;
const char *alt = gitenv(ALTERNATE_DB_ENVIRONMENT) ? : "";
/* The first pass counts how large an area to allocate to
if (pass)
break;
alt_odb = xmalloc(sizeof(*alt_odb) * (i + 1) + totlen);
- alt_odb[i].base = alt_odb[i].name = 0;
+ alt_odb[i].base = alt_odb[i].name = NULL;
op = (char*)(&alt_odb[i+1]);
}
}
int ret, bytes;
z_stream stream;
char buffer[8192];
- char *buf;
+ unsigned char *buf;
/* Get the data stream */
memset(&stream, 0, sizeof(stream));
stream.next_in = map;
stream.avail_in = mapsize;
- stream.next_out = buffer;
+ stream.next_out = (unsigned char *)buffer;
stream.avail_out = sizeof(buffer);
inflateInit(&stream);
return NULL;
bytes = strlen(buffer) + 1;
- buf = xmalloc(*size);
+ buf = xmalloc(1+*size);
memcpy(buf, buffer + bytes, stream.total_out - bytes);
bytes = stream.total_out - bytes;
while (inflate(&stream, Z_FINISH) == Z_OK)
/* nothing */;
}
+ buf[*size] = 0;
inflateEnd(&stream);
return buf;
}
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;
}
void *read_object_with_reference(const unsigned char *sha1,
- const unsigned char *required_type,
+ const char *required_type,
unsigned long *size,
unsigned char *actual_sha1_return)
{
}
}
-int write_sha1_file(char *buf, unsigned long len, const char *type, unsigned char *returnsha1)
+int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *returnsha1)
{
int size;
- char *compressed;
+ unsigned char *compressed;
z_stream stream;
unsigned char sha1[20];
SHA_CTX c;
char *filename;
static char tmpfile[PATH_MAX];
- char hdr[50];
+ unsigned char hdr[50];
int fd, hdrlen, ret;
/* Generate the header */
- hdrlen = sprintf(hdr, "%s %lu", type, len)+1;
+ hdrlen = sprintf((char *)hdr, "%s %lu", type, len)+1;
/* Sha1.. */
SHA1_Init(&c);
stream.next_in = hdr;
stream.avail_in = hdrlen;
while (deflate(&stream, 0) == Z_OK)
- /* nothing */
+ /* nothing */;
/* Then the data itself.. */
stream.next_in = buf;
int local;
z_stream stream;
unsigned char real_sha1[20];
- char buf[4096];
- char discard[4096];
+ unsigned char buf[4096];
+ unsigned char discard[4096];
int ret;
SHA_CTX c;