[PATCH] Skip writing out sha1 files for objects in packed git.
Now, there's still a misfeature there, which is that when you create a new object, it doesn't check whether that object already exists in the pack-file, so you'll end up with a few recent objects that you really don't need (notably tree objects), and this patch fixes it. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
cebe403bfe
commit
d410c0f5a9
39
sha1_file.c
39
sha1_file.c
@ -891,31 +891,46 @@ 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)
|
||||||
|
{
|
||||||
|
SHA_CTX c;
|
||||||
|
|
||||||
|
/* Generate the header */
|
||||||
|
*hdrlen = sprintf((char *)hdr, "%s %lu", type, len)+1;
|
||||||
|
|
||||||
|
/* Sha1.. */
|
||||||
|
SHA1_Init(&c);
|
||||||
|
SHA1_Update(&c, hdr, *hdrlen);
|
||||||
|
SHA1_Update(&c, buf, len);
|
||||||
|
SHA1_Final(sha1, &c);
|
||||||
|
|
||||||
|
return sha1_file_name(sha1);
|
||||||
|
}
|
||||||
|
|
||||||
int write_sha1_file(void *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;
|
int size;
|
||||||
unsigned char *compressed;
|
unsigned char *compressed;
|
||||||
z_stream stream;
|
z_stream stream;
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
SHA_CTX c;
|
|
||||||
char *filename;
|
char *filename;
|
||||||
static char tmpfile[PATH_MAX];
|
static char tmpfile[PATH_MAX];
|
||||||
unsigned char hdr[50];
|
unsigned char hdr[50];
|
||||||
int fd, hdrlen, ret;
|
int fd, hdrlen, ret;
|
||||||
|
|
||||||
/* Generate the header */
|
/* Normally if we have it in the pack then we do not bother writing
|
||||||
hdrlen = sprintf((char *)hdr, "%s %lu", type, len)+1;
|
* it out into .git/objects/??/?{38} file.
|
||||||
|
*/
|
||||||
/* Sha1.. */
|
filename = write_sha1_file_prepare(buf, len, type, sha1, hdr, &hdrlen);
|
||||||
SHA1_Init(&c);
|
|
||||||
SHA1_Update(&c, hdr, hdrlen);
|
|
||||||
SHA1_Update(&c, buf, len);
|
|
||||||
SHA1_Final(sha1, &c);
|
|
||||||
|
|
||||||
if (returnsha1)
|
if (returnsha1)
|
||||||
memcpy(returnsha1, sha1, 20);
|
memcpy(returnsha1, sha1, 20);
|
||||||
|
if (has_sha1_file(sha1))
|
||||||
filename = sha1_file_name(sha1);
|
return 0;
|
||||||
fd = open(filename, O_RDONLY);
|
fd = open(filename, O_RDONLY);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user