/* * test-run-command.c: test run command API. * * (C) 2009 Ilari Liusvaara <ilari.liusvaara@elisanet.fi> * * This code is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include "test-tool.h" #include "git-compat-util.h" #include "run-command.h" #include "argv-array.h" #include "strbuf.h" #include <string.h> #include <errno.h> static int number_callbacks; static int parallel_next(struct child_process *cp, struct strbuf *err, void *cb, void **task_cb) { struct child_process *d = cb; if (number_callbacks >= 4) return 0; argv_array_pushv(&cp->args, d->argv); strbuf_addstr(err, "preloaded output of a child\n"); number_callbacks++; return 1; } static int no_job(struct child_process *cp, struct strbuf *err, void *cb, void **task_cb) { strbuf_addstr(err, "no further jobs available\n"); return 0; } static int task_finished(int result, struct strbuf *err, void *pp_cb, void *pp_task_cb) { strbuf_addstr(err, "asking for a quick stop\n"); return 1; } int cmd__run_command(int argc, const char **argv) { struct child_process proc = CHILD_PROCESS_INIT; int jobs; if (argc < 3) return 1; while (!strcmp(argv[1], "env")) { if (!argv[2]) die("env specifier without a value"); argv_array_push(&proc.env_array, argv[2]); argv += 2; argc -= 2; } if (argc < 3) return 1; proc.argv = (const char **)argv + 2; if (!strcmp(argv[1], "start-command-ENOENT")) { if (start_command(&proc) < 0 && errno == ENOENT) return 0; fprintf(stderr, "FAIL %s\n", argv[1]); return 1; } if (!strcmp(argv[1], "run-command")) exit(run_command(&proc)); jobs = atoi(argv[2]); proc.argv = (const char **)argv + 3; if (!strcmp(argv[1], "run-command-parallel")) exit(run_processes_parallel(jobs, parallel_next, NULL, NULL, &proc)); if (!strcmp(argv[1], "run-command-abort")) exit(run_processes_parallel(jobs, parallel_next, NULL, task_finished, &proc)); if (!strcmp(argv[1], "run-command-no-jobs")) exit(run_processes_parallel(jobs, no_job, NULL, task_finished, &proc)); fprintf(stderr, "check usage\n"); return 1; }