Skip to content
Snippets Groups Projects
Commit 7672db20 authored by Bryan Larsen's avatar Bryan Larsen Committed by Linus Torvalds
Browse files

[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: default avatarBryan Larsen <bryan.larsen@gmail.com>
Signed-off-by: default avatarJunio C Hamano <junkio@cox.net>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 7558ef89
No related branches found
No related tags found
No related merge requests found
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
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
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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 \
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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
~~~~~~~~~~~
Loading
Loading
Loading
Loading
@@ -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 {
Loading
Loading
@@ -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);
 
Loading
Loading
Loading
Loading
@@ -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;
Loading
Loading
/*
* 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;
}
Loading
Loading
@@ -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;
 
Loading
Loading
@@ -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)
Loading
Loading
@@ -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;
Loading
Loading
Loading
Loading
@@ -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:
Loading
Loading
/*
* 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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment