Behavior change: "--exclude --blah --remotes" will not exclude remote branches any more. Only "--exclude --remotes" does. This is because --exclude is going to have a new friend --decorate-reflog who haves the same way. When you allow a distant --remotes to complement a previous option, things get complicated. In --exclude .. --decorate-reflog ... --remotes Does it mean decorate remote reflogs, or does it mean exclude remotes from the selected revisions? Granted, there may be valid use cases for such a combination (e.g. "decorate all reflogs except remote ones") but I feel option order is not a good fit to express them. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- revision.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/revision.c b/revision.c index cda2606c66..45cffcab44 100644 --- a/revision.c +++ b/revision.c @@ -2152,10 +2152,24 @@ static int handle_refs_pseudo_opt(const char *submodule, return 0; } - clear_ref_exclusion(&revs->ref_excludes); return 1; } +static int handle_revision_pseudo_opt(const char *, struct rev_info *, int, const char **, int *); + +static int handle_revision_pseudo_opt_after_exclude(const char *submodule, + struct rev_info *revs, + int argc, const char **argv, + int *flags) +{ + int ret; + + ret = handle_revision_pseudo_opt(submodule, revs, argc, argv, flags); + clear_ref_exclusion(&revs->ref_excludes); + revs->handle_pseudo_opt = NULL; + return ret; +} + static int handle_revision_pseudo_opt(const char *submodule, struct rev_info *revs, int argc, const char **argv, int *flags) @@ -2184,6 +2198,7 @@ static int handle_revision_pseudo_opt(const char *submodule, revs->bisect = 1; } else if ((argcount = parse_long_opt("exclude", argv, &optarg))) { add_ref_exclusion(&revs->ref_excludes, optarg); + revs->handle_pseudo_opt = handle_revision_pseudo_opt_after_exclude; return argcount; } else if (!strcmp(arg, "--reflog")) { add_reflogs_to_pending(revs, *flags); -- 2.11.0.157.gd943d85