X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=revision.c;h=7d32a89b0eca858113829e9219e80ff15e66e953;hb=63f328290a0edda617c0881a356c07280fbba459;hp=1f4590b89649a9d1397af2f35af142cc6ab36847;hpb=5bd148bfe8a4f2df8487e029cd4ee6809bc4c963;p=git.git diff --git a/revision.c b/revision.c index 1f4590b89..7d32a89b0 100644 --- a/revision.c +++ b/revision.c @@ -118,10 +118,11 @@ static void add_pending_object_with_mode(struct rev_info *revs, struct object *o { if (revs->no_walk && (obj->flags & UNINTERESTING)) die("object ranges do not make sense when not walking revisions"); + if (revs->reflog_info && obj->type == OBJ_COMMIT && + add_reflog_for_walk(revs->reflog_info, + (struct commit *)obj, name)) + return; add_object_array_with_mode(obj, name, &revs->pending, mode); - if (revs->reflog_info && obj->type == OBJ_COMMIT) - add_reflog_for_walk(revs->reflog_info, - (struct commit *)obj, name); } void add_pending_object(struct rev_info *revs, struct object *obj, const char *name) @@ -437,7 +438,7 @@ static int add_parents_to_list(struct rev_info *revs, struct commit *commit, str 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; @@ -458,6 +459,11 @@ static void cherry_pick_list(struct commit_list *list) 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) { @@ -546,7 +552,7 @@ static int limit_list(struct rev_info *revs) 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; @@ -667,7 +673,6 @@ void init_revisions(struct rev_info *revs, const char *prefix) revs->min_age = -1; revs->skip_count = -1; revs->max_count = -1; - revs->subject_prefix = "PATCH"; revs->prune_fn = NULL; revs->prune_data = NULL; @@ -1129,6 +1134,14 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch 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")) @@ -1137,6 +1150,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch die("unknown date format %s", arg); continue; } + if (!strcmp(arg, "--log-size")) { + revs->show_log_size = 1; + continue; + } /* * Grepping the commit log @@ -1153,11 +1170,13 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch add_message_grep(revs, arg+7); continue; } - if (!prefixcmp(arg, "--extended-regexp")) { + if (!strcmp(arg, "--extended-regexp") || + !strcmp(arg, "-E")) { regflags |= REG_EXTENDED; continue; } - if (!prefixcmp(arg, "--regexp-ignore-case")) { + if (!strcmp(arg, "--regexp-ignore-case") || + !strcmp(arg, "-i")) { regflags |= REG_ICASE; continue; } @@ -1177,6 +1196,14 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch revs->reverse ^= 1; continue; } + if (!strcmp(arg, "--no-walk")) { + revs->no_walk = 1; + continue; + } + if (!strcmp(arg, "--do-walk")) { + revs->no_walk = 0; + continue; + } opts = diff_opt_parse(&revs->diffopt, argv+i, argc-i); if (opts > 0) { @@ -1230,7 +1257,9 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch 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); } @@ -1307,6 +1336,26 @@ static enum rewrite_result rewrite_one(struct rev_info *revs, struct commit **pp } } +static void remove_duplicate_parents(struct commit *commit) +{ + struct commit_list **pp, *p; + + /* Examine existing parents while marking ones we have seen... */ + pp = &commit->parents; + while ((p = *pp) != NULL) { + struct commit *parent = p->item; + if (parent->object.flags & TMP_MARK) { + *pp = p->next; + continue; + } + parent->object.flags |= TMP_MARK; + 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; @@ -1323,6 +1372,7 @@ static int rewrite_parents(struct rev_info *revs, struct commit *commit) } pp = &parent->next; } + remove_duplicate_parents(commit); return 0; }