Merge branch 'jt/diff-lazy-fetch-submodule-fix'
authorJunio C Hamano <gitster@pobox.com>
Mon, 9 Sep 2019 19:26:38 +0000 (12:26 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 9 Sep 2019 19:26:38 +0000 (12:26 -0700)
On-demand object fetching in lazy clone incorrectly tried to fetch
commits from submodule projects, while still working in the
superproject, which has been corrected.

* jt/diff-lazy-fetch-submodule-fix:
diff: skip GITLINK when lazy fetching missing objs

1  2 
diff.c
diff --combined diff.c
index efe42b341ae15ebceb1e216518ab3a542be361dc,9a2aa07a0e87b8e5e0ffe086c1605d6d893e9bf0..e28b463f5757e7dd56752702db13d8195a3d39bc
--- 1/diff.c
--- 2/diff.c
+++ b/diff.c
@@@ -1673,10 -1673,7 +1673,10 @@@ static void emit_hunk_header(struct emi
        if (ecbdata->opt->flags.dual_color_diffed_diffs)
                strbuf_addstr(&msgbuf, reverse);
        strbuf_addstr(&msgbuf, frag);
 -      strbuf_add(&msgbuf, line, ep - line);
 +      if (ecbdata->opt->flags.suppress_hunk_header_line_count)
 +              strbuf_add(&msgbuf, atat, sizeof(atat));
 +      else
 +              strbuf_add(&msgbuf, line, ep - line);
        strbuf_addstr(&msgbuf, reset);
  
        /*
@@@ -5995,22 -5992,6 +5995,22 @@@ static int remove_space(char *line, in
        return dst - line;
  }
  
 +void flush_one_hunk(struct object_id *result, git_SHA_CTX *ctx)
 +{
 +      unsigned char hash[GIT_MAX_RAWSZ];
 +      unsigned short carry = 0;
 +      int i;
 +
 +      git_SHA1_Final(hash, ctx);
 +      git_SHA1_Init(ctx);
 +      /* 20-byte sum, with carry */
 +      for (i = 0; i < GIT_SHA1_RAWSZ; ++i) {
 +              carry += result->hash[i] + hash[i];
 +              result->hash[i] = carry;
 +              carry >>= 8;
 +      }
 +}
 +
  static void patch_id_consume(void *priv, char *line, unsigned long len)
  {
        struct patch_id_t *data = priv;
@@@ -6035,8 -6016,8 +6035,8 @@@ static void patch_id_add_mode(git_SHA_C
        git_SHA1_Update(ctx, buf, len);
  }
  
 -/* returns 0 upon success, and writes result into sha1 */
 -static int diff_get_patch_id(struct diff_options *options, struct object_id *oid, int diff_header_only)
 +/* returns 0 upon success, and writes result into oid */
 +static int diff_get_patch_id(struct diff_options *options, struct object_id *oid, int diff_header_only, int stable)
  {
        struct diff_queue_struct *q = &diff_queued_diff;
        int i;
        git_SHA1_Init(&ctx);
        memset(&data, 0, sizeof(struct patch_id_t));
        data.ctx = &ctx;
 +      oidclr(oid);
  
        for (i = 0; i < q->nr; i++) {
                xpparam_t xpp;
                                  patch_id_consume, &data, &xpp, &xecfg))
                        return error("unable to generate patch-id diff for %s",
                                     p->one->path);
 +
 +              if (stable)
 +                      flush_one_hunk(oid, &ctx);
        }
  
 -      git_SHA1_Final(oid->hash, &ctx);
 +      if (!stable)
 +              git_SHA1_Final(oid->hash, &ctx);
 +
        return 0;
  }
  
 -int diff_flush_patch_id(struct diff_options *options, struct object_id *oid, int diff_header_only)
 +int diff_flush_patch_id(struct diff_options *options, struct object_id *oid, int diff_header_only, int stable)
  {
        struct diff_queue_struct *q = &diff_queued_diff;
        int i;
 -      int result = diff_get_patch_id(options, oid, diff_header_only);
 +      int result = diff_get_patch_id(options, oid, diff_header_only, stable);
  
        for (i = 0; i < q->nr; i++)
                diff_free_filepair(q->queue[i]);
@@@ -6512,6 -6487,7 +6512,7 @@@ static void add_if_missing(struct repos
                           const struct diff_filespec *filespec)
  {
        if (filespec && filespec->oid_valid &&
+           !S_ISGITLINK(filespec->mode) &&
            oid_object_info_extended(r, &filespec->oid, NULL,
                                     OBJECT_INFO_FOR_PREFETCH))
                oid_array_append(to_fetch, &filespec->oid);