]> git.ipfire.org Git - thirdparty/git.git/blobdiff - revision.c
Merge branch 'master' of github.com:vnwildman/git
[thirdparty/git.git] / revision.c
index 442a705ad0314bc3361a1077716710ed7d559d2e..0e39b2b8a59e7ab47d729602aa9bf2231691d133 100644 (file)
@@ -28,6 +28,7 @@
 #include "commit-graph.h"
 #include "prio-queue.h"
 #include "hashmap.h"
+#include "utf8.h"
 
 volatile show_early_output_fn_t show_early_output;
 
@@ -107,30 +108,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 +146,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 +241,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);
@@ -2687,6 +2692,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
 
        grep_commit_pattern_type(GREP_PATTERN_TYPE_UNSPECIFIED,
                                 &revs->grep_filter);
+       if (!is_encoding_utf8(get_log_output_encoding()))
+               revs->grep_filter.ignore_locale = 1;
        compile_grep_patterns(&revs->grep_filter);
 
        if (revs->reverse && revs->reflog_info)