From: Junio C Hamano Date: Mon, 3 Mar 2008 07:59:50 +0000 (-0800) Subject: Merge branch 'maint' X-Git-Tag: v1.5.5-rc0~79 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/6b48990354b6380665565f21c3f89d2f7109c459?ds=inline;hp=-c Merge branch 'maint' * maint: Update draft release notes for 1.5.4.4 revert: actually check for a dirty index tests: introduce test_must_fail git-submodule: Fix typo 'url' which should be '$url' receive-pack: Initialize PATH to include exec-dir. Conflicts: builtin-revert.c --- 6b48990354b6380665565f21c3f89d2f7109c459 diff --combined builtin-revert.c index b6dee6a56c,64f0d0ee02..607a2f0337 --- a/builtin-revert.c +++ b/builtin-revert.c @@@ -8,7 -8,8 +8,9 @@@ #include "exec_cmd.h" #include "utf8.h" #include "parse-options.h" +#include "cache-tree.h" + #include "diff.h" + #include "revision.h" /* * This implements the builtins revert and cherry-pick. @@@ -246,6 -247,17 +248,17 @@@ static char *help_msg(const unsigned ch return helpbuf; } + static int index_is_dirty(void) + { + struct rev_info rev; + init_revisions(&rev, NULL); + setup_revisions(0, NULL, &rev, "HEAD"); + DIFF_OPT_SET(&rev.diffopt, QUIET); + DIFF_OPT_SET(&rev.diffopt, EXIT_WITH_STATUS); + run_diff_index(&rev, 1); + return !!DIFF_OPT_TST(&rev.diffopt, HAS_CHANGES); + } + static int revert_or_cherry_pick(int argc, const char **argv) { unsigned char head[20]; @@@ -271,15 -283,14 +284,14 @@@ * that represents the "current" state for merge-recursive * to work on. */ - if (write_tree(head, 0, NULL)) + if (write_cache_as_tree(head, 0, NULL)) die ("Your index file is unmerged."); } else { - struct wt_status s; - if (get_sha1("HEAD", head)) die ("You do not have a valid HEAD"); - wt_status_prepare(&s); - if (s.commitable) + if (read_cache() < 0) + die("could not read the index"); + if (index_is_dirty()) die ("Dirty index: cannot %s", me); discard_cache(); } @@@ -358,7 -369,7 +370,7 @@@ if (merge_recursive(sha1_to_hex(base->object.sha1), sha1_to_hex(head), "HEAD", sha1_to_hex(next->object.sha1), oneline) || - write_tree(head, 0, NULL)) { + write_cache_as_tree(head, 0, NULL)) { add_to_msg("\nConflicts:\n\n"); read_cache(); for (i = 0; i < active_nr;) { @@@ -397,7 -408,8 +409,7 @@@ else return execl_git_cmd("commit", "-n", "-F", defmsg, NULL); } - if (reencoded_message) - free(reencoded_message); + free(reencoded_message); return 0; } diff --combined receive-pack.c index 0ca2a80bf0,c90ec7dde2..de7e18c49e --- a/receive-pack.c +++ b/receive-pack.c @@@ -10,7 -10,6 +10,7 @@@ static const char receive_pack_usage[] = "git-receive-pack "; static int deny_non_fast_forwards = 0; +static int receive_fsck_objects = 1; static int receive_unpack_limit = -1; static int transfer_unpack_limit = -1; static int unpack_limit = 100; @@@ -36,11 -35,6 +36,11 @@@ static int receive_pack_config(const ch return 0; } + if (strcmp(var, "receive.fsckobjects") == 0) { + receive_fsck_objects = git_config_bool(var, value); + return 0; + } + return git_default_config(var, value); } @@@ -138,7 -132,6 +138,7 @@@ static int run_hook(const char *hook_na break; } } + close(proc.in); return hook_status(finish_command(&proc), hook_name); } @@@ -374,13 -367,11 +374,13 @@@ static const char *unpack(void ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries)); if (ntohl(hdr.hdr_entries) < unpack_limit) { - int code; - const char *unpacker[3]; - unpacker[0] = "unpack-objects"; - unpacker[1] = hdr_arg; - unpacker[2] = NULL; + int code, i = 0; + const char *unpacker[4]; + unpacker[i++] = "unpack-objects"; + if (receive_fsck_objects) + unpacker[i++] = "--strict"; + unpacker[i++] = hdr_arg; + unpacker[i++] = NULL; code = run_command_v_opt(unpacker, RUN_GIT_CMD); switch (code) { case 0: @@@ -401,8 -392,8 +401,8 @@@ return "unpacker exited with error code"; } } else { - const char *keeper[6]; - int s, status; + const char *keeper[7]; + int s, status, i = 0; char keep_arg[256]; struct child_process ip; @@@ -410,14 -401,12 +410,14 @@@ if (gethostname(keep_arg + s, sizeof(keep_arg) - s)) strcpy(keep_arg + s, "localhost"); - keeper[0] = "index-pack"; - keeper[1] = "--stdin"; - keeper[2] = "--fix-thin"; - keeper[3] = hdr_arg; - keeper[4] = keep_arg; - keeper[5] = NULL; + keeper[i++] = "index-pack"; + keeper[i++] = "--stdin"; + if (receive_fsck_objects) + keeper[i++] = "--strict"; + keeper[i++] = "--fix-thin"; + keeper[i++] = hdr_arg; + keeper[i++] = keep_arg; + keeper[i++] = NULL; memset(&ip, 0, sizeof(ip)); ip.argv = keeper; ip.out = -1; @@@ -425,7 -414,6 +425,7 @@@ if (start_command(&ip)) return "index-pack fork failed"; pack_lockfile = index_pack_lockfile(ip.out); + close(ip.out); status = finish_command(&ip); if (!status) { reprepare_packed_git(); @@@ -481,6 -469,8 +481,8 @@@ int main(int argc, char **argv if (!dir) usage(receive_pack_usage); + setup_path(NULL); + if (!enter_repo(dir, 0)) die("'%s': unable to chdir or not a git archive", dir);