return 0;
}
-static void cherry_pick_list(struct commit_list *list)
+static void cherry_pick_list(struct commit_list *list, struct rev_info *revs)
{
struct commit_list *p;
int left_count = 0, right_count = 0;
left_first = left_count < right_count;
init_patch_ids(&ids);
+ if (revs->diffopt.nr_paths) {
+ ids.diffopts.nr_paths = revs->diffopt.nr_paths;
+ ids.diffopts.paths = revs->diffopt.paths;
+ ids.diffopts.pathlens = revs->diffopt.pathlens;
+ }
/* Compute patch-ids for one side */
for (p = list; p; p = p->next) {
p = &commit_list_insert(commit, p)->next;
}
if (revs->cherry_pick)
- cherry_pick_list(newlist);
+ cherry_pick_list(newlist, revs);
revs->commits = newlist;
return 0;
revs->min_age = -1;
revs->skip_count = -1;
revs->max_count = -1;
- revs->subject_prefix = "PATCH";
revs->prune_fn = NULL;
revs->prune_data = NULL;
if (!strncmp(arg, "--date=", 7)) {
if (!strcmp(arg + 7, "relative"))
revs->date_mode = DATE_RELATIVE;
+ else if (!strcmp(arg + 7, "iso8601") ||
+ !strcmp(arg + 7, "iso"))
+ revs->date_mode = DATE_ISO8601;
+ else if (!strcmp(arg + 7, "rfc2822") ||
+ !strcmp(arg + 7, "rfc"))
+ revs->date_mode = DATE_RFC2822;
+ else if (!strcmp(arg + 7, "short"))
+ revs->date_mode = DATE_SHORT;
else if (!strcmp(arg + 7, "local"))
revs->date_mode = DATE_LOCAL;
else if (!strcmp(arg + 7, "default"))
if (revs->prune_data) {
diff_tree_setup_paths(revs->prune_data, &revs->pruning);
- revs->prune_fn = try_to_simplify_commit;
+ /* Can't prune commits with rename following: the paths change.. */
+ if (!revs->diffopt.follow_renames)
+ revs->prune_fn = try_to_simplify_commit;
if (!revs->full_diff)
diff_tree_setup_paths(revs->prune_data, &revs->diffopt);
}
}
}
+static void remove_duplicate_parents(struct commit *commit)
+{
+ struct commit_list *p;
+ struct commit_list **pp = &commit->parents;
+
+ /* Examine existing parents while marking ones we have seen... */
+ for (p = commit->parents; p; p = p->next) {
+ struct commit *parent = p->item;
+ if (parent->object.flags & TMP_MARK)
+ continue;
+ parent->object.flags |= TMP_MARK;
+ *pp = p;
+ pp = &p->next;
+ }
+ /* ... and clear the temporary mark */
+ for (p = commit->parents; p; p = p->next)
+ p->item->object.flags &= ~TMP_MARK;
+}
+
static int rewrite_parents(struct rev_info *revs, struct commit *commit)
{
struct commit_list **pp = &commit->parents;
}
pp = &parent->next;
}
+ remove_duplicate_parents(commit);
return 0;
}