]> git.ipfire.org Git - thirdparty/git.git/blobdiff - refs/reftable-backend.c
Merge branch 'ps/reftable-iteration-perf-part2'
[thirdparty/git.git] / refs / reftable-backend.c
index 39e9a9d4e250436a44ce728c5c6c98dd91ce6932..74dab18eda50f8158f3e8c133a8dde70299ce3cb 100644 (file)
@@ -346,6 +346,7 @@ struct reftable_ref_iterator {
        struct object_id oid;
 
        const char *prefix;
+       size_t prefix_len;
        unsigned int flags;
        int err;
 };
@@ -364,15 +365,18 @@ static int reftable_ref_iterator_advance(struct ref_iterator *ref_iterator)
                        break;
 
                /*
-                * The files backend only lists references contained in
-                * "refs/". We emulate the same behaviour here and thus skip
-                * all references that don't start with this prefix.
+                * The files backend only lists references contained in "refs/" unless
+                * the root refs are to be included. We emulate the same behaviour here.
                 */
-               if (!starts_with(iter->ref.refname, "refs/"))
+               if (!starts_with(iter->ref.refname, "refs/") &&
+                   !(iter->flags & DO_FOR_EACH_INCLUDE_ROOT_REFS &&
+                    (is_pseudoref(&iter->refs->base, iter->ref.refname) ||
+                     is_headref(&iter->refs->base, iter->ref.refname)))) {
                        continue;
+               }
 
-               if (iter->prefix &&
-                   strncmp(iter->prefix, iter->ref.refname, strlen(iter->prefix))) {
+               if (iter->prefix_len &&
+                   strncmp(iter->prefix, iter->ref.refname, iter->prefix_len)) {
                        iter->err = 1;
                        break;
                }
@@ -481,6 +485,7 @@ static struct reftable_ref_iterator *ref_iterator_for_stack(struct reftable_ref_
        iter = xcalloc(1, sizeof(*iter));
        base_ref_iterator_init(&iter->base, &reftable_ref_iterator_vtable);
        iter->prefix = prefix;
+       iter->prefix_len = prefix ? strlen(prefix) : 0;
        iter->base.oid = &iter->oid;
        iter->flags = flags;
        iter->refs = refs;
@@ -778,6 +783,7 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store,
                                      &head_referent, &head_type);
        if (ret < 0)
                goto done;
+       ret = 0;
 
        for (i = 0; i < transaction->nr; i++) {
                struct ref_update *u = transaction->updates[i];
@@ -1594,7 +1600,6 @@ struct reftable_reflog_iterator {
        struct reftable_ref_store *refs;
        struct reftable_iterator iter;
        struct reftable_log_record log;
-       struct object_id oid;
        char *last_name;
        int err;
 };
@@ -1605,8 +1610,6 @@ static int reftable_reflog_iterator_advance(struct ref_iterator *ref_iterator)
                (struct reftable_reflog_iterator *)ref_iterator;
 
        while (!iter->err) {
-               int flags;
-
                iter->err = reftable_iterator_next_log(&iter->iter, &iter->log);
                if (iter->err)
                        break;
@@ -1619,17 +1622,13 @@ static int reftable_reflog_iterator_advance(struct ref_iterator *ref_iterator)
                if (iter->last_name && !strcmp(iter->log.refname, iter->last_name))
                        continue;
 
-               if (!refs_resolve_ref_unsafe(&iter->refs->base, iter->log.refname,
-                                            0, &iter->oid, &flags)) {
-                       error(_("bad ref for %s"), iter->log.refname);
+               if (check_refname_format(iter->log.refname,
+                                        REFNAME_ALLOW_ONELEVEL))
                        continue;
-               }
 
                free(iter->last_name);
                iter->last_name = xstrdup(iter->log.refname);
                iter->base.refname = iter->log.refname;
-               iter->base.oid = &iter->oid;
-               iter->base.flags = flags;
 
                break;
        }
@@ -1682,7 +1681,6 @@ static struct reftable_reflog_iterator *reflog_iterator_for_stack(struct reftabl
        iter = xcalloc(1, sizeof(*iter));
        base_ref_iterator_init(&iter->base, &reftable_reflog_iterator_vtable);
        iter->refs = refs;
-       iter->base.oid = &iter->oid;
 
        ret = refs->err;
        if (ret)