97 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
	
		
			2.2 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 "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;
 | 
						|
}
 |