зеркало из https://github.com/microsoft/git.git
[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>
This commit is contained in:
Родитель
7558ef89ed
Коммит
7672db20c2
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
4
Makefile
4
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
|
||||
|
|
4
README
4
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
|
||||
~~~~~~~~~~~
|
||||
|
|
8
cache.h
8
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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
sha1_file.c
25
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;
|
||||
|
|
|
@ -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:
|
||||
|
|
25
write-blob.c
25
write-blob.c
|
@ -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;
|
||||
}
|
Загрузка…
Ссылка в новой задаче