summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Larsen <bryan.larsen@gmail.com>2005-07-08 23:51:55 (GMT)
committerLinus Torvalds <torvalds@g5.osdl.org>2005-07-09 00:07:37 (GMT)
commit7672db20c2060f20b01788e4a4289ebc5f818605 (patch)
tree0b5c5ed90d81628aa03df60ee5116d707f4a0803
parent7558ef89edce07555c6436cfcb98c31388dd99b0 (diff)
downloadgit-7672db20c2060f20b01788e4a4289ebc5f818605.zip
git-7672db20c2060f20b01788e4a4289ebc5f818605.tar.gz
git-7672db20c2060f20b01788e4a4289ebc5f818605.tar.bz2
[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>
-rw-r--r--Documentation/git-hash-object.txt36
-rw-r--r--Documentation/git-write-blob.txt33
-rw-r--r--Documentation/git.txt4
-rw-r--r--Makefile4
-rw-r--r--README4
-rw-r--r--cache.h8
-rwxr-xr-xgit-cvsimport-script2
-rw-r--r--hash-object.c45
-rw-r--r--sha1_file.c25
-rw-r--r--update-cache.c2
-rw-r--r--write-blob.c25
11 files changed, 113 insertions, 75 deletions
diff --git a/Documentation/git-hash-object.txt b/Documentation/git-hash-object.txt
new file mode 100644
index 0000000..8790d19
--- /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 <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
+
diff --git a/Documentation/git-write-blob.txt b/Documentation/git-write-blob.txt
deleted file mode 100644
index 22d7555..0000000
--- 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' <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
-
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 797eb33..0620502 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 1add2ae..11f5bcd 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 1b8d9b8..80cc279 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 ff03213..84d43d3 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 6d5a7fa..666de6f 100755
--- a/git-cvsimport-script
+++ b/git-cvsimport-script
@@ -683,7 +683,7 @@ while(<CVS>) {
$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 0000000..0821e54
--- /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 <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;
+}
diff --git a/sha1_file.c b/sha1_file.c
index fc4e6bf..b2914dd 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 7c2698d..d5225c3 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 8bfd576..0000000
--- 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;
-}