Merge branch 'maint'
authorJunio C Hamano <gitster@pobox.com>
Mon, 3 Mar 2008 07:59:50 +0000 (23:59 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 3 Mar 2008 07:59:50 +0000 (23:59 -0800)
* 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

1  2 
builtin-revert.c
receive-pack.c
diff --combined builtin-revert.c
index b6dee6a56c21be816725a4366f448dac98e62ae6,64f0d0ee028fd143ea065cad93ce7be03d94839d..607a2f0337c3d3f1fb8bdac7443e3a7f56e92305
@@@ -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];
                 * 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();
        }
        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;) {
                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 0ca2a80bf00b76a2b07b749bb1ff7cb77d44f7ee,c90ec7dde28ec135f0c90e6c731b730ad4a1f7a8..de7e18c49e5593f3e9251edd9def7639ac64a2c6
@@@ -10,7 -10,6 +10,7 @@@
  static const char receive_pack_usage[] = "git-receive-pack <git-dir>";
  
  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:
                        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;
  
                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;
                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);