]> git.ipfire.org Git - thirdparty/git.git/blobdiff - wt-status.c
The fourteenth batch
[thirdparty/git.git] / wt-status.c
index b17ca58f8bf8256aaab93ce57d0c8959495ca55d..2db4bb3a1293bb69e081efcf98489a63ca2d812a 100644 (file)
@@ -1093,8 +1093,11 @@ size_t wt_status_locate_end(const char *s, size_t len)
        strbuf_addf(&pattern, "\n%c %s", comment_line_char, cut_line);
        if (starts_with(s, pattern.buf + 1))
                len = 0;
-       else if ((p = strstr(s, pattern.buf)))
-               len = p - s + 1;
+       else if ((p = strstr(s, pattern.buf))) {
+               size_t newlen = p - s + 1;
+               if (newlen < len)
+                       len = newlen;
+       }
        strbuf_release(&pattern);
        return len;
 }
@@ -1300,26 +1303,32 @@ static char *read_line_from_git_path(const char *filename)
 static int split_commit_in_progress(struct wt_status *s)
 {
        int split_in_progress = 0;
-       char *head, *orig_head, *rebase_amend, *rebase_orig_head;
+       struct object_id head_oid, orig_head_oid;
+       char *rebase_amend, *rebase_orig_head;
+       int head_flags, orig_head_flags;
 
        if ((!s->amend && !s->nowarn && !s->workdir_dirty) ||
            !s->branch || strcmp(s->branch, "HEAD"))
                return 0;
 
-       head = read_line_from_git_path("HEAD");
-       orig_head = read_line_from_git_path("ORIG_HEAD");
+       if (read_ref_full("HEAD", RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
+                         &head_oid, &head_flags) ||
+           read_ref_full("ORIG_HEAD", RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
+                         &orig_head_oid, &orig_head_flags))
+               return 0;
+       if (head_flags & REF_ISSYMREF || orig_head_flags & REF_ISSYMREF)
+               return 0;
+
        rebase_amend = read_line_from_git_path("rebase-merge/amend");
        rebase_orig_head = read_line_from_git_path("rebase-merge/orig-head");
 
-       if (!head || !orig_head || !rebase_amend || !rebase_orig_head)
+       if (!rebase_amend || !rebase_orig_head)
                ; /* fall through, no split in progress */
        else if (!strcmp(rebase_amend, rebase_orig_head))
-               split_in_progress = !!strcmp(head, rebase_amend);
-       else if (strcmp(orig_head, rebase_orig_head))
+               split_in_progress = !!strcmp(oid_to_hex(&head_oid), rebase_amend);
+       else if (strcmp(oid_to_hex(&orig_head_oid), rebase_orig_head))
                split_in_progress = 1;
 
-       free(head);
-       free(orig_head);
        free(rebase_amend);
        free(rebase_orig_head);