X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=walker.c;h=4984bf8b3d6658dc2571f66bd5142e67c0fe7d37;hb=a78305ffbca58e49a7cdad901df0ae779bbed8fb;hp=7b7e72b1201850f0ba494f8fc23a5c7f0e46d3eb;hpb=bc01ef0d3f3f79fc2f1a9e5e1a6ac0049e7a3c26;p=platform%2Fupstream%2Fgit.git diff --git a/walker.c b/walker.c index 7b7e72b..4984bf8 100644 --- a/walker.c +++ b/walker.c @@ -1,28 +1,35 @@ #include "cache.h" #include "walker.h" +#include "repository.h" +#include "object-store.h" #include "commit.h" #include "tree.h" #include "tree-walk.h" #include "tag.h" #include "blob.h" #include "refs.h" +#include "progress.h" -static unsigned char current_commit_sha1[20]; +static struct object_id current_commit_oid; -void walker_say(struct walker *walker, const char *fmt, const char *hex) +void walker_say(struct walker *walker, const char *fmt, ...) { - if (walker->get_verbosely) - fprintf(stderr, fmt, hex); + if (walker->get_verbosely) { + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + } } static void report_missing(const struct object *obj) { fprintf(stderr, "Cannot obtain needed %s %s\n", - obj->type ? typename(obj->type): "object", + obj->type ? type_name(obj->type): "object", oid_to_hex(&obj->oid)); - if (!is_null_sha1(current_commit_sha1)) + if (!is_null_oid(¤t_commit_oid)) fprintf(stderr, "while processing commit %s.\n", - sha1_to_hex(current_commit_sha1)); + oid_to_hex(¤t_commit_oid)); } static int process(struct walker *walker, struct object *obj); @@ -43,12 +50,14 @@ static int process_tree(struct walker *walker, struct tree *tree) if (S_ISGITLINK(entry.mode)) continue; if (S_ISDIR(entry.mode)) { - struct tree *tree = lookup_tree(entry.sha1); + struct tree *tree = lookup_tree(the_repository, + &entry.oid); if (tree) obj = &tree->object; } else { - struct blob *blob = lookup_blob(entry.sha1); + struct blob *blob = lookup_blob(the_repository, + &entry.oid); if (blob) obj = &blob->object; } @@ -68,6 +77,8 @@ static struct commit_list *complete = NULL; static int process_commit(struct walker *walker, struct commit *commit) { + struct commit_list *parents; + if (parse_commit(commit)) return -1; @@ -78,23 +89,18 @@ static int process_commit(struct walker *walker, struct commit *commit) if (commit->object.flags & COMPLETE) return 0; - hashcpy(current_commit_sha1, commit->object.oid.hash); + oidcpy(¤t_commit_oid, &commit->object.oid); walker_say(walker, "walk %s\n", oid_to_hex(&commit->object.oid)); - if (walker->get_tree) { - if (process(walker, &commit->tree->object)) + if (process(walker, &get_commit_tree(commit)->object)) + return -1; + + for (parents = commit->parents; parents; parents = parents->next) { + if (process(walker, &parents->item->object)) return -1; - if (!walker->get_all) - walker->get_tree = 0; - } - if (walker->get_history) { - struct commit_list *parents = commit->parents; - for (; parents; parents = parents->next) { - if (process(walker, &parents->item->object)) - return -1; - } } + return 0; } @@ -130,7 +136,7 @@ static int process_object(struct walker *walker, struct object *obj) } return error("Unable to determine requirements " "of type %s for %s", - typename(obj->type), oid_to_hex(&obj->oid)); + type_name(obj->type), oid_to_hex(&obj->oid)); } static int process(struct walker *walker, struct object *obj) @@ -157,6 +163,11 @@ static int process(struct walker *walker, struct object *obj) static int loop(struct walker *walker) { struct object_list *elem; + struct progress *progress = NULL; + uint64_t nr = 0; + + if (walker->get_progress) + progress = start_delayed_progress(_("Fetching objects"), 0); while (process_queue) { struct object *obj = process_queue->item; @@ -171,26 +182,31 @@ static int loop(struct walker *walker) */ if (! (obj->flags & TO_SCAN)) { if (walker->fetch(walker, obj->oid.hash)) { + stop_progress(&progress); report_missing(obj); return -1; } } if (!obj->type) - parse_object(obj->oid.hash); - if (process_object(walker, obj)) + parse_object(the_repository, &obj->oid); + if (process_object(walker, obj)) { + stop_progress(&progress); return -1; + } + display_progress(progress, ++nr); } + stop_progress(&progress); return 0; } -static int interpret_target(struct walker *walker, char *target, unsigned char *sha1) +static int interpret_target(struct walker *walker, char *target, struct object_id *oid) { - if (!get_sha1_hex(target, sha1)) + if (!get_oid_hex(target, oid)) return 0; if (!check_refname_format(target, 0)) { struct ref *ref = alloc_ref(target); if (!walker->fetch_ref(walker, ref)) { - hashcpy(sha1, ref->old_oid.hash); + oidcpy(oid, &ref->old_oid); free(ref); return 0; } @@ -202,7 +218,8 @@ static int interpret_target(struct walker *walker, char *target, unsigned char * static int mark_complete(const char *path, const struct object_id *oid, int flag, void *cb_data) { - struct commit *commit = lookup_commit_reference_gently(oid->hash, 1); + struct commit *commit = lookup_commit_reference_gently(the_repository, + oid, 1); if (commit) { commit->object.flags |= COMPLETE; @@ -220,7 +237,7 @@ int walker_targets_stdin(char ***target, const char ***write_ref) char *rf_one = NULL; char *tg_one; - if (strbuf_getline(&buf, stdin, '\n') == EOF) + if (strbuf_getline_lf(&buf, stdin) == EOF) break; tg_one = buf.buf; rf_one = strchr(tg_one, '\t'); @@ -255,12 +272,14 @@ int walker_fetch(struct walker *walker, int targets, char **target, struct strbuf refname = STRBUF_INIT; struct strbuf err = STRBUF_INIT; struct ref_transaction *transaction = NULL; - unsigned char *sha1 = xmalloc(targets * 20); + struct object_id *oids; char *msg = NULL; int i, ret = -1; save_commit_buffer = 0; + ALLOC_ARRAY(oids, targets); + if (write_ref) { transaction = ref_transaction_begin(&err); if (!transaction) { @@ -275,11 +294,11 @@ int walker_fetch(struct walker *walker, int targets, char **target, } for (i = 0; i < targets; i++) { - if (interpret_target(walker, target[i], &sha1[20 * i])) { + if (interpret_target(walker, target[i], oids + i)) { error("Could not interpret response from server '%s' as something to pull", target[i]); goto done; } - if (process(walker, lookup_unknown_object(&sha1[20 * i]))) + if (process(walker, lookup_unknown_object(&oids[i]))) goto done; } @@ -300,7 +319,7 @@ int walker_fetch(struct walker *walker, int targets, char **target, strbuf_reset(&refname); strbuf_addf(&refname, "refs/%s", write_ref[i]); if (ref_transaction_update(transaction, refname.buf, - &sha1[20 * i], NULL, 0, + oids + i, NULL, 0, msg ? msg : "fetch (unknown)", &err)) { error("%s", err.buf); @@ -317,7 +336,7 @@ int walker_fetch(struct walker *walker, int targets, char **target, done: ref_transaction_free(transaction); free(msg); - free(sha1); + free(oids); strbuf_release(&err); strbuf_release(&refname); return ret;