Staging
v0.5.2
https://github.com/git/git
Revision d09e79cb1c474b3bb323356e6d1072922ab7ccb2 authored by Linus Torvalds on 16 November 2006, 19:47:22 UTC, committed by Junio C Hamano on 17 November 2006, 07:45:48 UTC
We used to complain that we cannot merge anything we fetched
with a local branch that does not exist yet.  Just treat the
case as a natural extension of fast forwarding and make the
local branch'es tip point at the same commit we just fetched.
After all an empty repository without an initial commit is an
ancestor of any commit.

[jc: I added a trivial test.  We've become sloppy but we should
 stick to the discipline of covering new behaviour with new
 tests. ]

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent 73fbd33
Raw File
Tip revision: d09e79cb1c474b3bb323356e6d1072922ab7ccb2 authored by Linus Torvalds on 16 November 2006, 19:47:22 UTC
git-pull: allow pulling into an empty repository
Tip revision: d09e79c
run-command.c
#include "cache.h"
#include "run-command.h"
#include <sys/wait.h>
#include "exec_cmd.h"

int run_command_v_opt(int argc, const char **argv, int flags)
{
	pid_t pid = fork();

	if (pid < 0)
		return -ERR_RUN_COMMAND_FORK;
	if (!pid) {
		if (flags & RUN_COMMAND_NO_STDIO) {
			int fd = open("/dev/null", O_RDWR);
			dup2(fd, 0);
			dup2(fd, 1);
			close(fd);
		}
		if (flags & RUN_GIT_CMD) {
			execv_git_cmd(argv);
		} else {
			execvp(argv[0], (char *const*) argv);
		}
		die("exec %s failed.", argv[0]);
	}
	for (;;) {
		int status, code;
		pid_t waiting = waitpid(pid, &status, 0);

		if (waiting < 0) {
			if (errno == EINTR)
				continue;
			error("waitpid failed (%s)", strerror(errno));
			return -ERR_RUN_COMMAND_WAITPID;
		}
		if (waiting != 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_v(int argc, const char **argv)
{
	return run_command_v_opt(argc, argv, 0);
}

int run_command(const char *cmd, ...)
{
	int argc;
	const 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_opt(argc, argv, 0);
}
back to top