> diff --git a/merge-recursive.c b/merge-recursive.c
> index 30894c1cc7..22c5e8e5c9 100644
> --- a/merge-recursive.c
> +++ b/merge-recursive.c
> +static struct hashmap *get_directory_renames(struct diff_queue_struct *pairs,
> + struct tree *tree)
> +{
> + struct hashmap *dir_renames;
> + struct hashmap_iter iter;
> + struct dir_rename_entry *entry;
> + int i;
> +
> + /*
> + * Typically, we think of a directory rename as all files from a
> + * certain directory being moved to a target directory. However,
> + * what if someone first moved two files from the original
> + * directory in one commit, and then renamed the directory
> + * somewhere else in a later commit? At merge time, we just know
> + * that files from the original directory went to two different
> + * places, and that the bulk of them ended up in the same place.
> + * We want each directory rename to represent where the bulk of the
> + * files from that directory end up; this function exists to find
> + * where the bulk of the files went.
> + *
> + * The first loop below simply iterates through the list of file
> + * renames, finding out how often each directory rename pair
> + * possibility occurs.
> + */
> + dir_renames = xmalloc(sizeof(struct hashmap));
Please use xmalloc(sizeof(*dir_renames)) instead, to avoid repeating the
data type.
> + dir_rename_init(dir_renames);
> + for (i = 0; i < pairs->nr; ++i) {
> + struct string_list_item *item;
> + int *count;
> + struct diff_filepair *pair = pairs->queue[i];
> + char *old_dir, *new_dir;
> +
> + /* File not part of directory rename if it wasn't renamed */
> + if (pair->status != 'R')
> + continue;
> +
> + get_renamed_dir_portion(pair->one->path, pair->two->path,
> + &old_dir, &new_dir);
> + if (!old_dir)
> + /* Directory didn't change at all; ignore this one. */
> + continue;
> +
> + entry = dir_rename_find_entry(dir_renames, old_dir);
> + if (!entry) {
> + entry = xmalloc(sizeof(struct dir_rename_entry));
Similarly: xmalloc(sizeof(*entry))