Commits

Bryan Larsen  committed 7672db2

[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 <bryan.larsen@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

  • Participants
  • Parent commits 7558ef8

Comments (0)

Files changed (11)

File Documentation/git-hash-object.txt

+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 <type>] [-w] <any-file-on-the-filesystem>
+
+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 <type> is not
+specified, it defaults to "blob". 
+
+
+Author
+------
+Written by Junio C Hamano <junkio@cox.net>
+
+Documentation
+--------------
+Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
+
+GIT
+---
+Part of the link:git.html[git] suite
+

File Documentation/git-write-blob.txt

-git-write-blob(1)
-=================
-v0.1, May 2005
-
-NAME
-----
-git-write-blob - Creates a blob from a file
-
-
-SYNOPSIS
---------
-'git-write-blob' <any-file-on-the-filesystem>
-
-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 <torvalds@osdl.org>
-
-Documentation
---------------
-Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
-
-GIT
----
-Part of the link:git.html[git] suite
-

File Documentation/git.txt

 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
 	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 \
 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
 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
 ~~~~~~~~~~~
 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 {
 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);
 

File git-cvsimport-script

 		$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;

File hash-object.c

+/*
+ * 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 <type>] [-w] <file>...";
+
+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;
+}
 	}
 }
 
-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;
 
 	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)
 	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;

File update-cache.c

 		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:

File write-blob.c

-/*
- * 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;
-}