701
}
702
703
static const char * const builtin_maintenance_run_usage[] = {
704
- N_("git maintenance run [--auto] [--[no-]quiet]"),
704
+ N_("git maintenance run [--auto] [--[no-]quiet] [--task=<task>]"),
705
NULL
706
};
707
759
const char *name;
760
maintenance_task_fn *fn;
761
unsigned enabled:1;
762
+
763
+ /* -1 if not selected. */
764
+ int selected_order;
765
};
766
767
enum maintenance_task_label {
784
},
785
};
786
787
+static int compare_tasks_by_selection(const void *a_, const void *b_)
788
+{
789
+ const struct maintenance_task *a, *b;
790
+
791
+ a = (const struct maintenance_task *)&a_;
792
+ b = (const struct maintenance_task *)&b_;
793
+
794
+ return b->selected_order - a->selected_order;
795
+}
796
+
797
static int maintenance_run_tasks(struct maintenance_run_opts *opts)
798
{
786
- int i;
799
+ int i, found_selected = 0;
800
int result = 0;
801
802
+ for (i = 0; !found_selected && i < TASK__COUNT; i++)
803
+ found_selected = tasks[i].selected_order >= 0;
804
+
805
+ if (found_selected)
806
+ QSORT(tasks, TASK__COUNT, compare_tasks_by_selection);
807
+
808
for (i = 0; i < TASK__COUNT; i++) {
790
- if (!tasks[i].enabled)
809
+ if (found_selected && tasks[i].selected_order < 0)
810
+ continue;
811
+
812
+ if (!found_selected && !tasks[i].enabled)
813
continue;
814
815
if (tasks[i].fn(opts)) {
821
return result;
822
}
823
824
+static int task_option_parse(const struct option *opt,
825
+ const char *arg, int unset)
826
+{
827
+ int i, num_selected = 0;
828
+ struct maintenance_task *task = NULL;
829
+
830
+ BUG_ON_OPT_NEG(unset);
831
+
832
+ for (i = 0; i < TASK__COUNT; i++) {
833
+ if (tasks[i].selected_order >= 0)
834
+ num_selected++;
835
+ if (!strcasecmp(tasks[i].name, arg)) {
836
+ task = &tasks[i];
837
+ }
838
+ }
839
+
840
+ if (!task) {
841
+ error(_("'%s' is not a valid task"), arg);
842
+ return 1;
843
+ }
844
+
845
+ if (task->selected_order >= 0) {
846
+ error(_("task '%s' cannot be selected multiple times"), arg);
847
+ return 1;
848
+ }
849
+
850
+ task->selected_order = num_selected + 1;
851
+
852
+ return 0;
853
+}
854
+
855
static int maintenance_run(int argc, const char **argv, const char *prefix)
856
{
857
+ int i;
858
struct maintenance_run_opts opts;
859
struct option builtin_maintenance_run_options[] = {
860
OPT_BOOL(0, "auto", &opts.auto_flag,
861
N_("run tasks based on the state of the repository")),
862
OPT_BOOL(0, "quiet", &opts.quiet,
863
N_("do not report progress or other information over stderr")),
864
+ OPT_CALLBACK_F(0, "task", NULL, N_("task"),
865
+ N_("run a specific task"),
866
+ PARSE_OPT_NONEG, task_option_parse),
867
OPT_END()
868
};
869
memset(&opts, 0, sizeof(opts));
870
871
opts.quiet = !isatty(2);
872
873
+ for (i = 0; i < TASK__COUNT; i++)
874
+ tasks[i].selected_order = -1;
875
+
876
argc = parse_options(argc, argv, prefix,
877
builtin_maintenance_run_options,
878
builtin_maintenance_run_usage,