diff --git a/revision.c b/revision.c
index 5184716bf0af35298d2a1bd3b9411b518be09e14..e76da0d448f81d8b6b496990bc2568fef3662671 100644 (file)
--- 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->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);
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)
}
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;
}
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;
{
struct commit_list *p;
int left_count = 0, right_count = 0;
left_first = left_count < right_count;
init_patch_ids(&ids);
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) {
/* Compute patch-ids for one side */
for (p = list; p; p = p->next) {
p = &commit_list_insert(commit, p)->next;
}
if (revs->cherry_pick)
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->commits = newlist;
return 0;
@@ -890,7 +896,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
continue;
argv[i] = NULL;
argc = i;
continue;
argv[i] = NULL;
argc = i;
- revs->prune_data = get_pathspec(revs->prefix, argv + i + 1);
+ if (argv[i + 1])
+ revs->prune_data = get_pathspec(revs->prefix, argv + i + 1);
seen_dashdash = 1;
break;
}
seen_dashdash = 1;
break;
}
@@ -1017,6 +1024,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
}
if (!strcmp(arg, "--cherry-pick")) {
revs->cherry_pick = 1;
}
if (!strcmp(arg, "--cherry-pick")) {
revs->cherry_pick = 1;
+ revs->limited = 1;
continue;
}
if (!strcmp(arg, "--objects")) {
continue;
}
if (!strcmp(arg, "--objects")) {
@@ -1126,14 +1134,11 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
continue;
}
if (!strncmp(arg, "--date=", 7)) {
continue;
}
if (!strncmp(arg, "--date=", 7)) {
- if (!strcmp(arg + 7, "relative"))
- revs->date_mode = DATE_RELATIVE;
- else if (!strcmp(arg + 7, "local"))
- revs->date_mode = DATE_LOCAL;
- else if (!strcmp(arg + 7, "default"))
- revs->date_mode = DATE_NORMAL;
- else
- die("unknown date format %s", arg);
+ revs->date_mode = parse_date_format(arg + 7);
+ continue;
+ }
+ if (!strcmp(arg, "--log-size")) {
+ revs->show_log_size = 1;
continue;
}
continue;
}
@@ -1152,11 +1157,13 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
add_message_grep(revs, arg+7);
continue;
}
add_message_grep(revs, arg+7);
continue;
}
- if (!prefixcmp(arg, "--extended-regexp")) {
+ if (!strcmp(arg, "--extended-regexp") ||
+ !strcmp(arg, "-E")) {
regflags |= REG_EXTENDED;
continue;
}
regflags |= REG_EXTENDED;
continue;
}
- if (!prefixcmp(arg, "--regexp-ignore-case")) {
+ if (!strcmp(arg, "--regexp-ignore-case") ||
+ !strcmp(arg, "-i")) {
regflags |= REG_ICASE;
continue;
}
regflags |= REG_ICASE;
continue;
}
@@ -1176,11 +1183,17 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
revs->reverse ^= 1;
continue;
}
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) {
opts = diff_opt_parse(&revs->diffopt, argv+i, argc-i);
if (opts > 0) {
- if (strcmp(argv[i], "-z"))
- revs->diff = 1;
i += opts - 1;
continue;
}
i += opts - 1;
continue;
}
@@ -1224,6 +1237,14 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
add_pending_object_with_mode(revs, object, def, mode);
}
add_pending_object_with_mode(revs, object, def, mode);
}
+ /* Did the user ask for any diff output? Run the diff! */
+ if (revs->diffopt.output_format & ~DIFF_FORMAT_NO_OUTPUT)
+ revs->diff = 1;
+
+ /* Pickaxe and rename following needs diffs */
+ if (revs->diffopt.pickaxe || revs->diffopt.follow_renames)
+ revs->diff = 1;
+
if (revs->topo_order)
revs->limited = 1;
if (revs->topo_order)
revs->limited = 1;
@@ -1249,6 +1270,9 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
compile_grep_patterns(revs->grep_filter);
}
compile_grep_patterns(revs->grep_filter);
}
+ if (revs->reverse && revs->reflog_info)
+ die("cannot combine --reverse with --walk-reflogs");
+
return left;
}
return left;
}
@@ -1308,6 +1332,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;
static int rewrite_parents(struct rev_info *revs, struct commit *commit)
{
struct commit_list **pp = &commit->parents;
}
pp = &parent->next;
}
}
pp = &parent->next;
}
+ remove_duplicate_parents(commit);
return 0;
}
return 0;
}