@@ -16,90 +16,62 @@ int commit_patch_id(struct commit *commit, struct diff_options *options,
1616 return diff_flush_patch_id (options , sha1 );
1717}
1818
19- static const unsigned char * patch_id_access (size_t index , void * table )
19+ static int patch_id_cmp (struct patch_id * a ,
20+ struct patch_id * b ,
21+ void * keydata )
2022{
21- struct patch_id * * id_table = table ;
22- return id_table [index ]-> patch_id ;
23+ return hashcmp (a -> patch_id , b -> patch_id );
2324}
2425
25- static int patch_pos (struct patch_id * * table , int nr , const unsigned char * id )
26- {
27- return sha1_pos (id , table , nr , patch_id_access );
28- }
29-
30- #define BUCKET_SIZE 190 /* 190 * 21 = 3990, with slop close enough to 4K */
31- struct patch_id_bucket {
32- struct patch_id_bucket * next ;
33- int nr ;
34- struct patch_id bucket [BUCKET_SIZE ];
35- };
36-
3726int init_patch_ids (struct patch_ids * ids )
3827{
3928 memset (ids , 0 , sizeof (* ids ));
4029 diff_setup (& ids -> diffopts );
4130 DIFF_OPT_SET (& ids -> diffopts , RECURSIVE );
4231 diff_setup_done (& ids -> diffopts );
32+ hashmap_init (& ids -> patches , (hashmap_cmp_fn )patch_id_cmp , 256 );
4333 return 0 ;
4434}
4535
4636int free_patch_ids (struct patch_ids * ids )
4737{
48- struct patch_id_bucket * next , * patches ;
49-
50- free (ids -> table );
51- for (patches = ids -> patches ; patches ; patches = next ) {
52- next = patches -> next ;
53- free (patches );
54- }
38+ hashmap_free (& ids -> patches , 1 );
5539 return 0 ;
5640}
5741
58- static struct patch_id * add_commit (struct commit * commit ,
59- struct patch_ids * ids ,
60- int no_add )
42+ static int init_patch_id_entry (struct patch_id * patch ,
43+ struct commit * commit ,
44+ struct patch_ids * ids )
6145{
62- struct patch_id_bucket * bucket ;
63- struct patch_id * ent ;
64- unsigned char sha1 [20 ];
65- int pos ;
66-
67- if (commit_patch_id (commit , & ids -> diffopts , sha1 ))
68- return NULL ;
69- pos = patch_pos (ids -> table , ids -> nr , sha1 );
70- if (0 <= pos )
71- return ids -> table [pos ];
72- if (no_add )
73- return NULL ;
74-
75- pos = -1 - pos ;
46+ if (commit_patch_id (commit , & ids -> diffopts , patch -> patch_id ))
47+ return -1 ;
7648
77- bucket = ids -> patches ;
78- if (!bucket || (BUCKET_SIZE <= bucket -> nr )) {
79- bucket = xcalloc (1 , sizeof (* bucket ));
80- bucket -> next = ids -> patches ;
81- ids -> patches = bucket ;
82- }
83- ent = & bucket -> bucket [bucket -> nr ++ ];
84- hashcpy (ent -> patch_id , sha1 );
85-
86- ALLOC_GROW (ids -> table , ids -> nr + 1 , ids -> alloc );
87- if (pos < ids -> nr )
88- memmove (ids -> table + pos + 1 , ids -> table + pos ,
89- sizeof (ent ) * (ids -> nr - pos ));
90- ids -> nr ++ ;
91- ids -> table [pos ] = ent ;
92- return ids -> table [pos ];
49+ hashmap_entry_init (patch , sha1hash (patch -> patch_id ));
50+ return 0 ;
9351}
9452
9553struct patch_id * has_commit_patch_id (struct commit * commit ,
9654 struct patch_ids * ids )
9755{
98- return add_commit (commit , ids , 1 );
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 );
9963}
10064
10165struct patch_id * add_commit_patch_id (struct commit * commit ,
10266 struct patch_ids * ids )
10367{
104- return add_commit (commit , ids , 0 );
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 ;
10577}
0 commit comments