Skip to content

Commit

Permalink
[PATCH] Expose object ID computation functions.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Bryan Larsen authored and Linus Torvalds committed Jul 9, 2005
1 parent 7558ef8 commit 7672db2
Show file tree
Hide file tree
Showing 11 changed files with 113 additions and 75 deletions.
36 changes: 36 additions & 0 deletions Documentation/git-hash-object.txt
Original file line number Diff line number Diff line change
@@ -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

33 changes: 0 additions & 33 deletions Documentation/git-write-blob.txt

This file was deleted.

4 changes: 2 additions & 2 deletions Documentation/git.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions README
Original file line number Diff line number Diff line change
Expand Up @@ -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
~~~~~~~~~~~
Expand Down
8 changes: 7 additions & 1 deletion cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion git-cvsimport-script
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
45 changes: 45 additions & 0 deletions hash-object.c
Original file line number Diff line number Diff line change
@@ -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;
}
25 changes: 17 additions & 8 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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)
Expand All @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion update-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
25 changes: 0 additions & 25 deletions write-blob.c

This file was deleted.

0 comments on commit 7672db2

Please sign in to comment.