patch-ids.con commit patch-ids: stop using a hand-rolled hashmap implementation (dfb7a1b)
   1#include "cache.h"
   2#include "diff.h"
   3#include "commit.h"
   4#include "sha1-lookup.h"
   5#include "patch-ids.h"
   6
   7int commit_patch_id(struct commit *commit, struct diff_options *options,
   8                    unsigned char *sha1)
   9{
  10        if (commit->parents)
  11                diff_tree_sha1(commit->parents->item->object.oid.hash,
  12                               commit->object.oid.hash, "", options);
  13        else
  14                diff_root_tree_sha1(commit->object.oid.hash, "", options);
  15        diffcore_std(options);
  16        return diff_flush_patch_id(options, sha1);
  17}
  18
  19static int patch_id_cmp(struct patch_id *a,
  20                        struct patch_id *b,
  21                        void *keydata)
  22{
  23        return hashcmp(a->patch_id, b->patch_id);
  24}
  25
  26int init_patch_ids(struct patch_ids *ids)
  27{
  28        memset(ids, 0, sizeof(*ids));
  29        diff_setup(&ids->diffopts);
  30        DIFF_OPT_SET(&ids->diffopts, RECURSIVE);
  31        diff_setup_done(&ids->diffopts);
  32        hashmap_init(&ids->patches, (hashmap_cmp_fn)patch_id_cmp, 256);
  33        return 0;
  34}
  35
  36int free_patch_ids(struct patch_ids *ids)
  37{
  38        hashmap_free(&ids->patches, 1);
  39        return 0;
  40}
  41
  42static int init_patch_id_entry(struct patch_id *patch,
  43                               struct commit *commit,
  44                               struct patch_ids *ids)
  45{
  46        if (commit_patch_id(commit, &ids->diffopts, patch->patch_id))
  47                return -1;
  48
  49        hashmap_entry_init(patch, sha1hash(patch->patch_id));
  50        return 0;
  51}
  52
  53struct patch_id *has_commit_patch_id(struct commit *commit,
  54                                     struct patch_ids *ids)
  55{
  56        struct patch_id patch;
  57
  58        memset(&patch, 0, sizeof(patch));
  59        if (init_patch_id_entry(&patch, commit, ids))
  60                return NULL;
  61
  62        return hashmap_get(&ids->patches, &patch, NULL);
  63}
  64
  65struct patch_id *add_commit_patch_id(struct commit *commit,
  66                                     struct patch_ids *ids)
  67{
  68        struct patch_id *key = xcalloc(1, sizeof(*key));
  69
  70        if (init_patch_id_entry(key, commit, ids)) {
  71                free(key);
  72                return NULL;
  73        }
  74
  75        hashmap_add(&ids->patches, key);
  76        return key;
  77}