patch-ids: stop using a hand-rolled hashmap implementation
[git/git.git] / patch-ids.c
CommitLineData
5d23e133
JH
1#include "cache.h"
2#include "diff.h"
3#include "commit.h"
5289bae1 4#include "sha1-lookup.h"
5d23e133
JH
5#include "patch-ids.h"
6
ded2c097 7int commit_patch_id(struct commit *commit, struct diff_options *options,
5d23e133
JH
8 unsigned char *sha1)
9{
10 if (commit->parents)
ed1c9977 11 diff_tree_sha1(commit->parents->item->object.oid.hash,
12 commit->object.oid.hash, "", options);
5d23e133 13 else
ed1c9977 14 diff_root_tree_sha1(commit->object.oid.hash, "", options);
5d23e133
JH
15 diffcore_std(options);
16 return diff_flush_patch_id(options, sha1);
17}
18
dfb7a1b4
KW
19static int patch_id_cmp(struct patch_id *a,
20 struct patch_id *b,
21 void *keydata)
5d23e133 22{
dfb7a1b4 23 return hashcmp(a->patch_id, b->patch_id);
5d23e133
JH
24}
25
5d23e133
JH
26int init_patch_ids(struct patch_ids *ids)
27{
28 memset(ids, 0, sizeof(*ids));
29 diff_setup(&ids->diffopts);
8f67f8ae 30 DIFF_OPT_SET(&ids->diffopts, RECURSIVE);
28452655 31 diff_setup_done(&ids->diffopts);
dfb7a1b4 32 hashmap_init(&ids->patches, (hashmap_cmp_fn)patch_id_cmp, 256);
5d23e133
JH
33 return 0;
34}
35
36int free_patch_ids(struct patch_ids *ids)
37{
dfb7a1b4 38 hashmap_free(&ids->patches, 1);
5d23e133
JH
39 return 0;
40}
41
dfb7a1b4
KW
42static int init_patch_id_entry(struct patch_id *patch,
43 struct commit *commit,
44 struct patch_ids *ids)
5d23e133 45{
dfb7a1b4
KW
46 if (commit_patch_id(commit, &ids->diffopts, patch->patch_id))
47 return -1;
5d23e133 48
dfb7a1b4
KW
49 hashmap_entry_init(patch, sha1hash(patch->patch_id));
50 return 0;
5d23e133
JH
51}
52
53struct patch_id *has_commit_patch_id(struct commit *commit,
54 struct patch_ids *ids)
55{
dfb7a1b4
KW
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);
5d23e133
JH
63}
64
65struct patch_id *add_commit_patch_id(struct commit *commit,
66 struct patch_ids *ids)
67{
dfb7a1b4
KW
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;
5d23e133 77}