]> git.ipfire.org Git - thirdparty/git.git/blobdiff - revision.c
hashmap: remove type arg from hashmap_{get,put,remove}_entry
[thirdparty/git.git] / revision.c
index d4aaf0ef257943029923f741b4ae383bb00d7f5f..6688f89d0de798c80ac8607725ccd1f313452b5f 100644 (file)
@@ -107,30 +107,34 @@ struct path_and_oids_entry {
 };
 
 static int path_and_oids_cmp(const void *hashmap_cmp_fn_data,
-                            const struct path_and_oids_entry *e1,
-                            const struct path_and_oids_entry *e2,
+                            const struct hashmap_entry *eptr,
+                            const struct hashmap_entry *entry_or_key,
                             const void *keydata)
 {
+       const struct path_and_oids_entry *e1, *e2;
+
+       e1 = container_of(eptr, const struct path_and_oids_entry, ent);
+       e2 = container_of(entry_or_key, const struct path_and_oids_entry, ent);
+
        return strcmp(e1->path, e2->path);
 }
 
 static void paths_and_oids_init(struct hashmap *map)
 {
-       hashmap_init(map, (hashmap_cmp_fn) path_and_oids_cmp, NULL, 0);
+       hashmap_init(map, path_and_oids_cmp, NULL, 0);
 }
 
 static void paths_and_oids_clear(struct hashmap *map)
 {
        struct hashmap_iter iter;
        struct path_and_oids_entry *entry;
-       hashmap_iter_init(map, &iter);
 
-       while ((entry = (struct path_and_oids_entry *)hashmap_iter_next(&iter))) {
+       hashmap_for_each_entry(map, &iter, entry, ent /* member name */) {
                oidset_clear(&entry->trees);
                free(entry->path);
        }
 
-       hashmap_free(map, 1);
+       hashmap_free_entries(map, struct path_and_oids_entry, ent);
 }
 
 static void paths_and_oids_insert(struct hashmap *map,
@@ -141,18 +145,19 @@ static void paths_and_oids_insert(struct hashmap *map,
        struct path_and_oids_entry key;
        struct path_and_oids_entry *entry;
 
-       hashmap_entry_init(&key, hash);
+       hashmap_entry_init(&key.ent, hash);
 
        /* use a shallow copy for the lookup */
        key.path = (char *)path;
        oidset_init(&key.trees, 0);
 
-       if (!(entry = (struct path_and_oids_entry *)hashmap_get(map, &key, NULL))) {
+       entry = hashmap_get_entry(map, &key, ent, NULL);
+       if (!entry) {
                entry = xcalloc(1, sizeof(struct path_and_oids_entry));
-               hashmap_entry_init(entry, hash);
+               hashmap_entry_init(&entry->ent, hash);
                entry->path = xstrdup(key.path);
                oidset_init(&entry->trees, 16);
-               hashmap_put(map, entry);
+               hashmap_put(map, &entry->ent);
        }
 
        oidset_insert(&entry->trees, oid);
@@ -235,8 +240,7 @@ void mark_trees_uninteresting_sparse(struct repository *r,
                add_children_by_path(r, tree, &map);
        }
 
-       hashmap_iter_init(&map, &map_iter);
-       while ((entry = hashmap_iter_next(&map_iter)))
+       hashmap_for_each_entry(&map, &map_iter, entry, ent /* member name */)
                mark_trees_uninteresting_sparse(r, &entry->trees);
 
        paths_and_oids_clear(&map);
@@ -436,7 +440,9 @@ static struct commit *handle_commit(struct rev_info *revs,
                        die("unable to parse commit %s", name);
                if (flags & UNINTERESTING) {
                        mark_parents_uninteresting(commit);
-                       revs->limited = 1;
+
+                       if (!revs->topo_order || !generation_numbers_enabled(the_repository))
+                               revs->limited = 1;
                }
                if (revs->sources) {
                        char **slot = revision_sources_at(revs->sources, commit);
@@ -1552,6 +1558,32 @@ void add_index_objects_to_pending(struct rev_info *revs, unsigned int flags)
        free_worktrees(worktrees);
 }
 
+struct add_alternate_refs_data {
+       struct rev_info *revs;
+       unsigned int flags;
+};
+
+static void add_one_alternate_ref(const struct object_id *oid,
+                                 void *vdata)
+{
+       const char *name = ".alternate";
+       struct add_alternate_refs_data *data = vdata;
+       struct object *obj;
+
+       obj = get_reference(data->revs, name, oid, data->flags);
+       add_rev_cmdline(data->revs, obj, name, REV_CMD_REV, data->flags);
+       add_pending_object(data->revs, obj, name);
+}
+
+static void add_alternate_refs_to_pending(struct rev_info *revs,
+                                         unsigned int flags)
+{
+       struct add_alternate_refs_data data;
+       data.revs = revs;
+       data.flags = flags;
+       for_each_alternate_ref(add_one_alternate_ref, &data);
+}
+
 static int add_parents_only(struct rev_info *revs, const char *arg_, int flags,
                            int exclude_parent)
 {
@@ -1954,6 +1986,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
            !strcmp(arg, "--no-walk") || !strcmp(arg, "--do-walk") ||
            !strcmp(arg, "--bisect") || starts_with(arg, "--glob=") ||
            !strcmp(arg, "--indexed-objects") ||
+           !strcmp(arg, "--alternate-refs") ||
            starts_with(arg, "--exclude=") ||
            starts_with(arg, "--branches=") || starts_with(arg, "--tags=") ||
            starts_with(arg, "--remotes=") || starts_with(arg, "--no-walk="))
@@ -2440,6 +2473,8 @@ static int handle_revision_pseudo_opt(const char *submodule,
                add_reflogs_to_pending(revs, *flags);
        } else if (!strcmp(arg, "--indexed-objects")) {
                add_index_objects_to_pending(revs, *flags);
+       } else if (!strcmp(arg, "--alternate-refs")) {
+               add_alternate_refs_to_pending(revs, *flags);
        } else if (!strcmp(arg, "--not")) {
                *flags ^= UNINTERESTING | BOTTOM;
        } else if (!strcmp(arg, "--no-walk")) {
@@ -3263,6 +3298,9 @@ static void expand_topo_walk(struct rev_info *revs, struct commit *commit)
                struct commit *parent = p->item;
                int *pi;
 
+               if (parent->object.flags & UNINTERESTING)
+                       continue;
+
                if (parse_commit_gently(parent, 1) < 0)
                        continue;