Merge branch 'ag/rebase-p'
[gitweb.git] / walker.c
index 274f1a4935798cba3e8cc7250559f14305678419..0b162a09b95a3eadeef47f3e6d314d386215cc9f 100644 (file)
--- a/walker.c
+++ b/walker.c
@@ -7,7 +7,7 @@
 #include "blob.h"
 #include "refs.h"
 
-static unsigned char current_commit_sha1[20];
+static struct object_id current_commit_oid;
 
 void walker_say(struct walker *walker, const char *fmt, ...)
 {
@@ -22,11 +22,11 @@ void walker_say(struct walker *walker, const char *fmt, ...)
 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(&current_commit_oid))
                fprintf(stderr, "while processing commit %s.\n",
-                       sha1_to_hex(current_commit_sha1));
+                       oid_to_hex(&current_commit_oid));
 }
 
 static int process(struct walker *walker, struct object *obj);
@@ -72,6 +72,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;
 
@@ -82,23 +84,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(&current_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;
 }
 
@@ -134,7 +131,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)
@@ -187,14 +184,14 @@ static int loop(struct walker *walker)
        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;
                }
@@ -259,7 +256,7 @@ 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 = xmalloc(targets * sizeof(struct object_id));
        char *msg = NULL;
        int i, ret = -1;
 
@@ -279,11 +276,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].hash)))
                        goto done;
        }
 
@@ -304,7 +301,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);
@@ -321,7 +318,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;