88 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
| /*
 | |
|  * 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 "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_main(int argc, const char **argv)
 | |
| {
 | |
| 	struct child_process proc = CHILD_PROCESS_INIT;
 | |
| 	int jobs;
 | |
| 
 | |
| 	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;
 | |
| }
 |