Merge branch 'jk/submodule-fsck-loose-fixup'
authorJunio C Hamano <gitster@pobox.com>
Wed, 13 Jun 2018 19:50:44 +0000 (12:50 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 13 Jun 2018 19:50:44 +0000 (12:50 -0700)
Finishing touches to a topic that already is in 'maint'.

* jk/submodule-fsck-loose-fixup:
fsck: avoid looking at NULL blob->object
t7415: don't bother creating commit for symlink test

1  2 
fsck.c
diff --combined fsck.c
index bcae2c30e6531f6a71f518877a71d9a5a9b232ae,35af51553dbd2b04fbb57435eae44b42b04a00d0..48e7e36869a7cbcb47e2e2a0401dd1047612e5d7
--- 1/fsck.c
--- 2/fsck.c
+++ b/fsck.c
@@@ -409,11 -409,9 +409,11 @@@ static int fsck_walk_commit(struct comm
  
        name = get_object_name(options, &commit->object);
        if (name)
 -              put_object_name(options, &commit->tree->object, "%s:", name);
 +              put_object_name(options, &get_commit_tree(commit)->object,
 +                              "%s:", name);
  
 -      result = options->walk((struct object *)commit->tree, OBJ_TREE, data, options);
 +      result = options->walk((struct object *)get_commit_tree(commit),
 +                             OBJ_TREE, data, options);
        if (result < 0)
                return result;
        res = result;
@@@ -734,31 -732,30 +734,31 @@@ static int fsck_ident(const char **iden
  static int fsck_commit_buffer(struct commit *commit, const char *buffer,
        unsigned long size, struct fsck_options *options)
  {
 -      unsigned char tree_sha1[20], sha1[20];
 +      struct object_id tree_oid, oid;
        struct commit_graft *graft;
        unsigned parent_count, parent_line_count = 0, author_count;
        int err;
        const char *buffer_begin = buffer;
 +      const char *p;
  
        if (verify_headers(buffer, size, &commit->object, options))
                return -1;
  
        if (!skip_prefix(buffer, "tree ", &buffer))
                return report(options, &commit->object, FSCK_MSG_MISSING_TREE, "invalid format - expected 'tree' line");
 -      if (get_sha1_hex(buffer, tree_sha1) || buffer[40] != '\n') {
 +      if (parse_oid_hex(buffer, &tree_oid, &p) || *p != '\n') {
                err = report(options, &commit->object, FSCK_MSG_BAD_TREE_SHA1, "invalid 'tree' line format - bad sha1");
                if (err)
                        return err;
        }
 -      buffer += 41;
 +      buffer = p + 1;
        while (skip_prefix(buffer, "parent ", &buffer)) {
 -              if (get_sha1_hex(buffer, sha1) || buffer[40] != '\n') {
 +              if (parse_oid_hex(buffer, &oid, &p) || *p != '\n') {
                        err = report(options, &commit->object, FSCK_MSG_BAD_PARENT_SHA1, "invalid 'parent' line format - bad sha1");
                        if (err)
                                return err;
                }
 -              buffer += 41;
 +              buffer = p + 1;
                parent_line_count++;
        }
        graft = lookup_commit_graft(&commit->object.oid);
        err = fsck_ident(&buffer, &commit->object, options);
        if (err)
                return err;
 -      if (!commit->tree) {
 -              err = report(options, &commit->object, FSCK_MSG_BAD_TREE, "could not load commit's tree %s", sha1_to_hex(tree_sha1));
 +      if (!get_commit_tree(commit)) {
 +              err = report(options, &commit->object, FSCK_MSG_BAD_TREE, "could not load commit's tree %s", oid_to_hex(&tree_oid));
                if (err)
                        return err;
        }
@@@ -823,12 -820,11 +823,12 @@@ static int fsck_commit(struct commit *c
  static int fsck_tag_buffer(struct tag *tag, const char *data,
        unsigned long size, struct fsck_options *options)
  {
 -      unsigned char sha1[20];
 +      struct object_id oid;
        int ret = 0;
        const char *buffer;
        char *to_free = NULL, *eol;
        struct strbuf sb = STRBUF_INIT;
 +      const char *p;
  
        if (data)
                buffer = data;
                enum object_type type;
  
                buffer = to_free =
 -                      read_sha1_file(tag->object.oid.hash, &type, &size);
 +                      read_object_file(&tag->object.oid, &type, &size);
                if (!buffer)
                        return report(options, &tag->object,
                                FSCK_MSG_MISSING_TAG_OBJECT,
                ret = report(options, &tag->object, FSCK_MSG_MISSING_OBJECT, "invalid format - expected 'object' line");
                goto done;
        }
 -      if (get_sha1_hex(buffer, sha1) || buffer[40] != '\n') {
 +      if (parse_oid_hex(buffer, &oid, &p) || *p != '\n') {
                ret = report(options, &tag->object, FSCK_MSG_BAD_OBJECT_SHA1, "invalid 'object' line format - bad sha1");
                if (ret)
                        goto done;
        }
 -      buffer += 41;
 +      buffer = p + 1;
  
        if (!skip_prefix(buffer, "type ", &buffer)) {
                ret = report(options, &tag->object, FSCK_MSG_MISSING_TYPE_ENTRY, "invalid format - expected 'type' line");
@@@ -1036,13 -1032,14 +1036,14 @@@ int fsck_finish(struct fsck_options *op
  
                blob = lookup_blob(oid);
                if (!blob) {
-                       ret |= report(options, &blob->object,
+                       struct object *obj = lookup_unknown_object(oid->hash);
+                       ret |= report(options, obj,
                                      FSCK_MSG_GITMODULES_BLOB,
                                      "non-blob found at .gitmodules");
                        continue;
                }
  
 -              buf = read_sha1_file(oid->hash, &type, &size);
 +              buf = read_object_file(oid, &type, &size);
                if (!buf) {
                        if (is_promisor_object(&blob->object.oid))
                                continue;