From 7672db20c2060f20b01788e4a4289ebc5f818605 Mon Sep 17 00:00:00 2001 From: Bryan Larsen Date: Fri, 8 Jul 2005 16:51:55 -0700 Subject: [PATCH] [PATCH] Expose object ID computation functions. This patch makes the first half of write_sha1_file() and index_fd() externally visible, to allow callers to compute the object ID without actually storing it in the object database. [JC demangled the whitespaces himself because he liked the patch so much, and reworked the interface to index_fd() slightly, taking suggestion from Linus and of his own.] Signed-off-by: Bryan Larsen Signed-off-by: Junio C Hamano Signed-off-by: Linus Torvalds --- Documentation/git-hash-object.txt | 36 +++++++++++++++++++++++++ Documentation/git-write-blob.txt | 33 ----------------------- Documentation/git.txt | 4 +-- Makefile | 4 +-- README | 4 +-- cache.h | 8 +++++- git-cvsimport-script | 2 +- hash-object.c | 45 +++++++++++++++++++++++++++++++ sha1_file.c | 25 +++++++++++------ update-cache.c | 2 +- write-blob.c | 25 ----------------- 11 files changed, 113 insertions(+), 75 deletions(-) create mode 100644 Documentation/git-hash-object.txt delete mode 100644 Documentation/git-write-blob.txt create mode 100644 hash-object.c delete mode 100644 write-blob.c diff --git a/Documentation/git-hash-object.txt b/Documentation/git-hash-object.txt new file mode 100644 index 0000000000..8790d19b2f --- /dev/null +++ b/Documentation/git-hash-object.txt @@ -0,0 +1,36 @@ +git-hash-object(1) +================== +v0.1, May 2005 + +NAME +---- +git-hash-object - Computes object ID and optionally creates a blob from a file. + + +SYNOPSIS +-------- +'git-hash-object' [-t ] [-w] + +DESCRIPTION +----------- +Computes the object ID value for an object with specified type +with the contents of the named file (which can be outside of the +work tree), and optionally writes the resulting object into the +object database. Reports its object ID to its standard output. +This is used by "git-cvsimport-script" to update the cache +without modifying files in the work tree. When is not +specified, it defaults to "blob". + + +Author +------ +Written by Junio C Hamano + +Documentation +-------------- +Documentation by David Greaves, Junio C Hamano and the git-list . + +GIT +--- +Part of the link:git.html[git] suite + diff --git a/Documentation/git-write-blob.txt b/Documentation/git-write-blob.txt deleted file mode 100644 index 22d75556e2..0000000000 --- a/Documentation/git-write-blob.txt +++ /dev/null @@ -1,33 +0,0 @@ -git-write-blob(1) -================= -v0.1, May 2005 - -NAME ----- -git-write-blob - Creates a blob from a file - - -SYNOPSIS --------- -'git-write-blob' - -DESCRIPTION ------------ -Writes the contents of the named file (which can be outside of the work -tree) as a blob into the object database, and reports its object ID to its -standard output. This is used by "git-merge-one-file-script" to update the -cache without modifying files in the work tree. - - -Author ------- -Written by Linus Torvalds - -Documentation --------------- -Documentation by David Greaves, Junio C Hamano and the git-list . - -GIT ---- -Part of the link:git.html[git] suite - diff --git a/Documentation/git.txt b/Documentation/git.txt index 797eb33278..06205024b2 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -60,8 +60,8 @@ link:git-read-tree.html[git-read-tree]:: link:git-update-cache.html[git-update-cache]:: Modifies the index or directory cache -link:git-write-blob.html[git-write-blob]:: - Creates a blob from a file +link:git-hash-object.html[git-hash-object]:: + Computes the object ID from a file. link:git-write-tree.html[git-write-tree]:: Creates a tree from the current cache diff --git a/Makefile b/Makefile index 1add2ae6f5..11f5bcd90f 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ PROG= git-update-cache git-diff-files git-init-db git-write-tree \ git-check-files git-ls-tree git-merge-base git-merge-cache \ git-unpack-file git-export git-diff-cache git-convert-cache \ git-http-pull git-ssh-push git-ssh-pull git-rev-list git-mktag \ - git-diff-helper git-tar-tree git-local-pull git-write-blob \ + git-diff-helper git-tar-tree git-local-pull git-hash-object \ git-get-tar-commit-id git-apply git-stripspace \ git-diff-stages git-rev-parse git-patch-id git-pack-objects \ git-unpack-objects git-verify-pack git-receive-pack git-send-pack \ @@ -135,7 +135,7 @@ git-rev-list: rev-list.c git-mktag: mktag.c git-diff-helper: diff-helper.c git-tar-tree: tar-tree.c -git-write-blob: write-blob.c +git-hash-object: hash-object.c git-stripspace: stripspace.c git-diff-stages: diff-stages.c git-rev-parse: rev-parse.c diff --git a/README b/README index 1b8d9b8b97..80cc27913e 100644 --- a/README +++ b/README @@ -102,8 +102,8 @@ object. The object is totally independent of it's location in the directory tree, and renaming a file does not change the object that file is associated with in any way. -A blob is created with link:git-write-blob.html[git-write-blob] and -it's data can be accessed by link:git-cat-file.html[git-cat-file] +A blob is typically created when link:git-update-cache.html[git-update-cache] +is run, and it's data can be accessed by link:git-cat-file.html[git-cat-file]. Tree Object ~~~~~~~~~~~ diff --git a/cache.h b/cache.h index ff0321341d..84d43d366c 100644 --- a/cache.h +++ b/cache.h @@ -138,7 +138,7 @@ extern int remove_cache_entry_at(int pos); extern int remove_file_from_cache(char *path); extern int ce_same_name(struct cache_entry *a, struct cache_entry *b); extern int ce_match_stat(struct cache_entry *ce, struct stat *st); -extern int index_fd(unsigned char *sha1, int fd, struct stat *st); +extern int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, const char *type); extern void fill_stat_cache_info(struct cache_entry *ce, struct stat *st); struct cache_file { @@ -172,6 +172,12 @@ extern int sha1_object_info(const unsigned char *, char *, unsigned long *); extern void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned long *size); extern void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size); extern int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *return_sha1); +extern char *write_sha1_file_prepare(void *buf, + unsigned long len, + const char *type, + unsigned char *sha1, + unsigned char *hdr, + int *hdrlen); extern int check_sha1_signature(const unsigned char *sha1, void *buf, unsigned long size, const char *type); diff --git a/git-cvsimport-script b/git-cvsimport-script index 6d5a7fad38..666de6f09a 100755 --- a/git-cvsimport-script +++ b/git-cvsimport-script @@ -683,7 +683,7 @@ while() { $fn =~ s#^/+##; my ($tmpname, $size) = $cvs->file($fn,$rev); print "".($init ? "New" : "Update")." $fn: $size bytes.\n" if $opt_v; - open my $F, '-|', "git-write-blob $tmpname" + open my $F, '-|', "git-hash-object -w $tmpname" or die "Cannot create object: $!\n"; my $sha = <$F>; chomp $sha; diff --git a/hash-object.c b/hash-object.c new file mode 100644 index 0000000000..0821e543f5 --- /dev/null +++ b/hash-object.c @@ -0,0 +1,45 @@ +/* + * GIT - The information manager from hell + * + * Copyright (C) Linus Torvalds, 2005 + * Copyright (C) Junio C Hamano, 2005 + */ +#include "cache.h" + +static void hash_object(const char *path, const char *type, int write_object) +{ + int fd; + struct stat st; + unsigned char sha1[20]; + fd = open(path, O_RDONLY); + if (fd < 0 || + fstat(fd, &st) < 0 || + index_fd(sha1, fd, &st, write_object, type)) + die(write_object + ? "Unable to add %s to database" + : "Unable to hash %s", path); + printf("%s\n", sha1_to_hex(sha1)); +} + +static const char *hash_object_usage = +"git-hash-object [-t ] [-w] ..."; + +int main(int argc, char **argv) +{ + int i; + const char *type = "blob"; + int write_object = 0; + + for (i = 1 ; i < argc; i++) { + if (!strcmp(argv[i], "-t")) { + if (argc <= ++i) + die(hash_object_usage); + type = argv[i]; + } + else if (!strcmp(argv[i], "-w")) + write_object = 1; + else + hash_object(argv[i], type, write_object); + } + return 0; +} diff --git a/sha1_file.c b/sha1_file.c index fc4e6bf91f..b2914dd2ea 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1100,12 +1100,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; @@ -1299,11 +1299,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) @@ -1312,7 +1314,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; diff --git a/update-cache.c b/update-cache.c index 7c2698df6e..d5225c3764 100644 --- a/update-cache.c +++ b/update-cache.c @@ -68,7 +68,7 @@ static int add_file_to_cache(char *path) fd = open(path, O_RDONLY); if (fd < 0) return -1; - if (index_fd(ce->sha1, fd, &st) < 0) + if (index_fd(ce->sha1, fd, &st, 1, NULL) < 0) return -1; break; case S_IFLNK: diff --git a/write-blob.c b/write-blob.c deleted file mode 100644 index 8bfd57615a..0000000000 --- a/write-blob.c +++ /dev/null @@ -1,25 +0,0 @@ -/* - * GIT - The information manager from hell - * - * Copyright (C) Linus Torvalds, 2005 - */ -#include "cache.h" - -int main(int argc, char **argv) -{ - int i; - - for (i = 1 ; i < argc; i++) { - char *path = argv[i]; - int fd; - struct stat st; - unsigned char sha1[20]; - fd = open(path, O_RDONLY); - if (fd < 0 || - fstat(fd, &st) < 0 || - index_fd(sha1, fd, &st) < 0) - die("Unable to add blob %s to database", path); - printf("%s\n", sha1_to_hex(sha1)); - } - return 0; -}