 19614330dd
			
		
	
	19614330dd
	
	
	
		
			
			The earlier one conflated update and post-update hooks for no good reason. Correct that ugly hack. Now post-update hooks will take the list of successfully updated refs. Signed-off-by: Junio C Hamano <junkio@cox.net>
		
			
				
	
	
		
			59 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "cache.h"
 | |
| #include "run-command.h"
 | |
| #include <sys/wait.h>
 | |
| 
 | |
| int run_command_v(int argc, char **argv)
 | |
| {
 | |
| 	pid_t pid = fork();
 | |
| 
 | |
| 	if (pid < 0)
 | |
| 		return -ERR_RUN_COMMAND_FORK;
 | |
| 	if (!pid) {
 | |
| 		execvp(argv[0], (char *const*) argv);
 | |
| 		die("exec %s failed.", argv[0]);
 | |
| 	}
 | |
| 	for (;;) {
 | |
| 		int status, code;
 | |
| 		int retval = waitpid(pid, &status, 0);
 | |
| 
 | |
| 		if (retval < 0) {
 | |
| 			if (errno == EINTR)
 | |
| 				continue;
 | |
| 			error("waitpid failed (%s)", strerror(retval));
 | |
| 			return -ERR_RUN_COMMAND_WAITPID;
 | |
| 		}
 | |
| 		if (retval != pid)
 | |
| 			return -ERR_RUN_COMMAND_WAITPID_WRONG_PID;
 | |
| 		if (WIFSIGNALED(status))
 | |
| 			return -ERR_RUN_COMMAND_WAITPID_SIGNAL;
 | |
| 
 | |
| 		if (!WIFEXITED(status))
 | |
| 			return -ERR_RUN_COMMAND_WAITPID_NOEXIT;
 | |
| 		code = WEXITSTATUS(status);
 | |
| 		if (code)
 | |
| 			return -code;
 | |
| 		return 0;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| int run_command(const char *cmd, ...)
 | |
| {
 | |
| 	int argc;
 | |
| 	char *argv[MAX_RUN_COMMAND_ARGS];
 | |
| 	const char *arg;
 | |
| 	va_list param;
 | |
| 
 | |
| 	va_start(param, cmd);
 | |
| 	argv[0] = (char*) cmd;
 | |
| 	argc = 1;
 | |
| 	while (argc < MAX_RUN_COMMAND_ARGS) {
 | |
| 		arg = argv[argc++] = va_arg(param, char *);
 | |
| 		if (!arg)
 | |
| 			break;
 | |
| 	}
 | |
| 	va_end(param);
 | |
| 	if (MAX_RUN_COMMAND_ARGS <= argc)
 | |
| 		return error("too many args to run %s", cmd);
 | |
| 	return run_command_v(argc, argv);
 | |
| }
 |