Skip to content

Commit

Permalink
Make git-*-pull say who wants them for missing objects.
Browse files Browse the repository at this point in the history
This patch updates pull.c, the engine that decides which objects are
needed, given a commit to traverse from, to report which commit was
calling for the object that cannot be retrieved from the remote side.
This complements git-fsck-cache in that it checks the consistency of
the remote repository for reachability.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed May 4, 2005
1 parent a31c6d0 commit b2d62f1
Showing 1 changed file with 30 additions and 7 deletions.
37 changes: 30 additions & 7 deletions pull.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,31 @@
int get_tree = 0;
int get_history = 0;
int get_all = 0;
static unsigned char current_commit_sha1[20];

static int make_sure_we_have_it(unsigned char *sha1)
static const char commitS[] = "commit";
static const char treeS[] = "tree";
static const char blobS[] = "blob";

static void report_missing(const char *what, const unsigned char *missing)
{
char missing_hex[41];

strcpy(missing_hex, sha1_to_hex(missing));;
fprintf(stderr,
"Cannot obtain needed %s %s\nwhile processing commit %s.\n",
what, missing_hex, sha1_to_hex(current_commit_sha1));
}

static int make_sure_we_have_it(const char *what, unsigned char *sha1)
{
int status;
if (has_sha1_file(sha1))
return 0;
return fetch(sha1);
status = fetch(sha1);
if (status && what)
report_missing(what, sha1);
return status;
}

static int process_tree(unsigned char *sha1)
Expand All @@ -24,7 +43,8 @@ static int process_tree(unsigned char *sha1)
return -1;

for (entries = tree->entries; entries; entries = entries->next) {
if (make_sure_we_have_it(entries->item.tree->object.sha1))
const char *what = entries->directory ? treeS : blobS;
if (make_sure_we_have_it(what, entries->item.tree->object.sha1))
return -1;
if (entries->directory) {
if (process_tree(entries->item.tree->object.sha1))
Expand All @@ -38,14 +58,14 @@ static int process_commit(unsigned char *sha1)
{
struct commit *obj = lookup_commit(sha1);

if (make_sure_we_have_it(sha1))
if (make_sure_we_have_it(commitS, sha1))
return -1;

if (parse_commit(obj))
return -1;

if (get_tree) {
if (make_sure_we_have_it(obj->tree->object.sha1))
if (make_sure_we_have_it(treeS, obj->tree->object.sha1))
return -1;
if (process_tree(obj->tree->object.sha1))
return -1;
Expand All @@ -57,14 +77,16 @@ static int process_commit(unsigned char *sha1)
for (; parents; parents = parents->next) {
if (has_sha1_file(parents->item->object.sha1))
continue;
if (make_sure_we_have_it(parents->item->object.sha1)) {
if (make_sure_we_have_it(NULL,
parents->item->object.sha1)) {
/* The server might not have it, and
* we don't mind.
*/
continue;
}
if (process_commit(parents->item->object.sha1))
return -1;
memcpy(current_commit_sha1, sha1, 20);
}
}
return 0;
Expand All @@ -77,8 +99,9 @@ int pull(char *target)
retval = get_sha1_hex(target, sha1);
if (retval)
return retval;
retval = make_sure_we_have_it(sha1);
retval = make_sure_we_have_it(commitS, sha1);
if (retval)
return retval;
memcpy(current_commit_sha1, sha1, 20);
return process_commit(sha1);
}

0 comments on commit b2d62f1

Please sign in to comment.