From patchwork Tue Dec 21 18:05:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12690263 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 17B85C433F5 for ; Tue, 21 Dec 2021 18:05:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240817AbhLUSFx (ORCPT ); Tue, 21 Dec 2021 13:05:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40516 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234986AbhLUSFw (ORCPT ); Tue, 21 Dec 2021 13:05:52 -0500 Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5E13DC06173F for ; Tue, 21 Dec 2021 10:05:52 -0800 (PST) Received: by mail-wr1-x432.google.com with SMTP id i22so28530253wrb.13 for ; Tue, 21 Dec 2021 10:05:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=8lpUPq8Ich/Jxa9IhxYsmk1CI1jyDC2AW0SOvBStIhM=; b=LOUWR16HWYGl293QRYuTJnJZdTXVZjrLTUd0AQX6rB8fblDFro4cVsK7fHyoWq9MJz JOsn6UkT3RR7fqfcElOC+nVtaZHMbzDg3IrhmFvEJmSB750G2fvl1/N9bMGW08D9q9SX aFhx4hw3HvX+7sHwdoPQFsuwbf5QSgtg+Eu+sjUzv38Mms+G2D9P6JgVbE5qP279XGrm WeRG8mDgDBHAAjh0waXl92SZpwVG/xdrcN59GoNV1czXFSKZjw2aFEsg+JPFeQ+HBpVH 3P6xBs1czvunqXLmKhHdd1aUznHgK7Nxt6OueJ+jXFnjrAwvAoIysqxwDLbAOCVxXfrU joYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=8lpUPq8Ich/Jxa9IhxYsmk1CI1jyDC2AW0SOvBStIhM=; b=YJvIp+u/d2bd206qT+Tase0cDCkr4zQQdMhd74A5nSEf2026EwZVMkXDKImCO9RYoA zzP4cgjsxO9jqR0ko0eRo2BcI74lli6IQ7Lev5ocBSQPfwVTSjbgxvI5xpAO33qOcv/i fB7sMGSyzZcj+mzp6AvtG0EYMxn9n+fzWr5VZA8KUTr396u/AsDcu7UAHptJknzYAQPb 1e8n7oUD3Y4+7i+Wbos0K0h/2I8nYEyOevL0kHPHa6k4iAqQPuakFdg6+L/evdMm7uES yr/XdPVmnhGMzVkumAv6R9piKhKP3fZJqg9IISdf4gvIshIosjJO6ZMSScHFOuUaV5QL PrEg== X-Gm-Message-State: AOAM530udWjbhpXa6s1/l5sXw3iuJbxUJYs3vG9CZdacfaO0aDxEOOW3 h8DJRz+Cbxazb/OgbI598WPH30hkWpY= X-Google-Smtp-Source: ABdhPJzDqcGyX9E/O/FkzK4m5y+bJLNBAZOmLtBHYjddB2gIXdblB1BS7RDT6T8hrevZLVlRGIH7nQ== X-Received: by 2002:a05:6000:156c:: with SMTP id 12mr3657062wrz.502.1640109950882; Tue, 21 Dec 2021 10:05:50 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id l2sm1673062wrs.43.2021.12.21.10.05.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Dec 2021 10:05:50 -0800 (PST) Message-Id: In-Reply-To: References: Date: Tue, 21 Dec 2021 18:05:40 +0000 Subject: [PATCH 1/9] tmp_objdir: add a helper function for discarding all contained objects Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jeff King , Jonathan Nieder , Sergey Organov , Bagas Sanjaya , Elijah Newren , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Neeraj Singh , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren Signed-off-by: Elijah Newren --- tmp-objdir.c | 5 +++++ tmp-objdir.h | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/tmp-objdir.c b/tmp-objdir.c index 3d38eeab66b..adf6033549e 100644 --- a/tmp-objdir.c +++ b/tmp-objdir.c @@ -79,6 +79,11 @@ static void remove_tmp_objdir_on_signal(int signo) raise(signo); } +void tmp_objdir_discard_objects(struct tmp_objdir *t) +{ + remove_dir_recursively(&t->path, REMOVE_DIR_KEEP_TOPLEVEL); +} + /* * These env_* functions are for setting up the child environment; the * "replace" variant overrides the value of any existing variable with that diff --git a/tmp-objdir.h b/tmp-objdir.h index cda5ec76778..76efc7edee5 100644 --- a/tmp-objdir.h +++ b/tmp-objdir.h @@ -46,6 +46,12 @@ int tmp_objdir_migrate(struct tmp_objdir *); */ int tmp_objdir_destroy(struct tmp_objdir *); +/* + * Remove all objects from the temporary object directory, while leaving it + * around so more objects can be added. + */ +void tmp_objdir_discard_objects(struct tmp_objdir *); + /* * Add the temporary object directory as an alternate object store in the * current process. From patchwork Tue Dec 21 18:05:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12690265 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B506AC433EF for ; Tue, 21 Dec 2021 18:05:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240826AbhLUSF4 (ORCPT ); Tue, 21 Dec 2021 13:05:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40522 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234986AbhLUSFx (ORCPT ); Tue, 21 Dec 2021 13:05:53 -0500 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 56CFAC061574 for ; Tue, 21 Dec 2021 10:05:53 -0800 (PST) Received: by mail-wm1-x330.google.com with SMTP id a83-20020a1c9856000000b00344731e044bso11920wme.1 for ; Tue, 21 Dec 2021 10:05:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=JKgkxATVt3nFf9uUVvcrWx0GcG7RL3rPwsw2CdQtvBQ=; b=fQ044iFciTjUA+SFAm2W+ZTiqLu3WreaZLtrZTZ9xH5Xereqi205Orr68uJp50G8Yj r07OLk8aa9B7pPKbuRW3PZnpwEiHibs+5IK7CHTMkzVVo45pQWlCxrHRikvmlWJ0NitH ITZhpyrNx4WxgrxBz5eN09hTG6w7jVRvYSezmQRa1GOi7G36a+joWX9f+AjgMbIjRY4W JwRaihULrV9opYK0bpde3s3vejVYpQFzqaiOC3apyeNwklreGCHQQrUlCzhKPBAJ6XQk 4hu8SL5vs/hf7WalJV7K5VoYmlYussPGX8OOyadSY1Wv9YN/kMSL61//Yc4pNgyJ4Oe5 nHzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=JKgkxATVt3nFf9uUVvcrWx0GcG7RL3rPwsw2CdQtvBQ=; b=ReyLveJvDlQK/gLelIp07f3gSJ9Wx8/gScxqhfGCMYYMQI0yP4TKhKLM5OEnXoCSqJ G6+2evlls5g9ROh7EZj8VEqVZp4zaE46zIUUKHMYJY6NdSaP4rO+P44VSCkHrdViKg2V P/vXSNcIu7gvOExSIkOg8qqAIipjTtxrj+eFsrpgoLulnlB/uCYtOdIcvq9HWV5nO5fR 1g1kbqEb+VN8AaKQHt1T2PizqbG+dY/UvuFf/c1EnkQ6UQ5Fpe0490oWdShWZGjHiRGb Rg/7C/oGwAjAMtEy2HWMHKoOIfSsTPxJdrnSZn2k9vVU09sWC7tpFHXgS7IoDzb2HUrU ghUg== X-Gm-Message-State: AOAM532In1YPxdW/dSKDBxgHsxDSOVN4Fy0defl5xdS1e7zUgFpX4GKI +Iv5vKTYyJpQCOx1fOSBh1PndfQudlA= X-Google-Smtp-Source: ABdhPJzL/tJTGbVBBZc4Uq5ZOMSRVK5YFkI8fhGO5WpiKCHVLPFmqMYy79TJfY5phw3YnOXGkm46mQ== X-Received: by 2002:a7b:c017:: with SMTP id c23mr3673047wmb.137.1640109951552; Tue, 21 Dec 2021 10:05:51 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id b10sm19378262wrg.19.2021.12.21.10.05.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Dec 2021 10:05:51 -0800 (PST) Message-Id: In-Reply-To: References: Date: Tue, 21 Dec 2021 18:05:41 +0000 Subject: [PATCH 2/9] ll-merge: make callers responsible for showing warnings Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jeff King , Jonathan Nieder , Sergey Organov , Bagas Sanjaya , Elijah Newren , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Neeraj Singh , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren Since some callers may want to send warning messages to somewhere other than stdout/stderr, stop printing "warning: Cannot merge binary files" from ll-merge and instead modify the return status of ll_merge() to indicate when a merge of binary files has occurred. Note that my methodology included first modifying ll_merge() to return a struct, so that the compiler would catch all the callers for me and ensure I had modified all of them. After modifying all of them, I then changed the struct to an enum. Signed-off-by: Elijah Newren --- apply.c | 5 ++++- builtin/checkout.c | 12 ++++++++---- ll-merge.c | 40 ++++++++++++++++++++++------------------ ll-merge.h | 9 ++++++++- merge-blobs.c | 5 ++++- merge-ort.c | 5 ++++- merge-recursive.c | 5 ++++- notes-merge.c | 5 ++++- rerere.c | 10 +++++++--- 9 files changed, 65 insertions(+), 31 deletions(-) diff --git a/apply.c b/apply.c index 43a0aebf4ee..12ea9c72a6b 100644 --- a/apply.c +++ b/apply.c @@ -3492,7 +3492,7 @@ static int three_way_merge(struct apply_state *state, { mmfile_t base_file, our_file, their_file; mmbuffer_t result = { NULL }; - int status; + enum ll_merge_result status; /* resolve trivial cases first */ if (oideq(base, ours)) @@ -3509,6 +3509,9 @@ static int three_way_merge(struct apply_state *state, &their_file, "theirs", state->repo->index, NULL); + if (status == LL_MERGE_BINARY_CONFLICT) + warning("Cannot merge binary files: %s (%s vs. %s)", + "base", "ours", "theirs"); free(base_file.ptr); free(our_file.ptr); free(their_file.ptr); diff --git a/builtin/checkout.c b/builtin/checkout.c index cbf73b8c9f6..3a559d69303 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -237,6 +237,7 @@ static int checkout_merged(int pos, const struct checkout *state, struct cache_entry *ce = active_cache[pos]; const char *path = ce->name; mmfile_t ancestor, ours, theirs; + enum ll_merge_result merge_status; int status; struct object_id oid; mmbuffer_t result_buf; @@ -267,13 +268,16 @@ static int checkout_merged(int pos, const struct checkout *state, memset(&ll_opts, 0, sizeof(ll_opts)); git_config_get_bool("merge.renormalize", &renormalize); ll_opts.renormalize = renormalize; - status = ll_merge(&result_buf, path, &ancestor, "base", - &ours, "ours", &theirs, "theirs", - state->istate, &ll_opts); + merge_status = ll_merge(&result_buf, path, &ancestor, "base", + &ours, "ours", &theirs, "theirs", + state->istate, &ll_opts); free(ancestor.ptr); free(ours.ptr); free(theirs.ptr); - if (status < 0 || !result_buf.ptr) { + if (merge_status == LL_MERGE_BINARY_CONFLICT) + warning("Cannot merge binary files: %s (%s vs. %s)", + path, "ours", "theirs"); + if (merge_status < 0 || !result_buf.ptr) { free(result_buf.ptr); return error(_("path '%s': cannot merge"), path); } diff --git a/ll-merge.c b/ll-merge.c index 261657578c7..669c09eed6c 100644 --- a/ll-merge.c +++ b/ll-merge.c @@ -14,7 +14,7 @@ struct ll_merge_driver; -typedef int (*ll_merge_fn)(const struct ll_merge_driver *, +typedef enum ll_merge_result (*ll_merge_fn)(const struct ll_merge_driver *, mmbuffer_t *result, const char *path, mmfile_t *orig, const char *orig_name, @@ -49,7 +49,7 @@ void reset_merge_attributes(void) /* * Built-in low-levels */ -static int ll_binary_merge(const struct ll_merge_driver *drv_unused, +static enum ll_merge_result ll_binary_merge(const struct ll_merge_driver *drv_unused, mmbuffer_t *result, const char *path, mmfile_t *orig, const char *orig_name, @@ -58,6 +58,7 @@ static int ll_binary_merge(const struct ll_merge_driver *drv_unused, const struct ll_merge_options *opts, int marker_size) { + enum ll_merge_result ret; mmfile_t *stolen; assert(opts); @@ -68,16 +69,19 @@ static int ll_binary_merge(const struct ll_merge_driver *drv_unused, */ if (opts->virtual_ancestor) { stolen = orig; + ret = LL_MERGE_OK; } else { switch (opts->variant) { default: - warning("Cannot merge binary files: %s (%s vs. %s)", - path, name1, name2); - /* fallthru */ + ret = LL_MERGE_BINARY_CONFLICT; + stolen = src1; + break; case XDL_MERGE_FAVOR_OURS: + ret = LL_MERGE_OK; stolen = src1; break; case XDL_MERGE_FAVOR_THEIRS: + ret = LL_MERGE_OK; stolen = src2; break; } @@ -87,16 +91,10 @@ static int ll_binary_merge(const struct ll_merge_driver *drv_unused, result->size = stolen->size; stolen->ptr = NULL; - /* - * With -Xtheirs or -Xours, we have cleanly merged; - * otherwise we got a conflict. - */ - return opts->variant == XDL_MERGE_FAVOR_OURS || - opts->variant == XDL_MERGE_FAVOR_THEIRS ? - 0 : 1; + return ret; } -static int ll_xdl_merge(const struct ll_merge_driver *drv_unused, +static enum ll_merge_result ll_xdl_merge(const struct ll_merge_driver *drv_unused, mmbuffer_t *result, const char *path, mmfile_t *orig, const char *orig_name, @@ -105,7 +103,9 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused, const struct ll_merge_options *opts, int marker_size) { + enum ll_merge_result ret; xmparam_t xmp; + int status; assert(opts); if (orig->size > MAX_XDIFF_SIZE || @@ -133,10 +133,12 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused, xmp.ancestor = orig_name; xmp.file1 = name1; xmp.file2 = name2; - return xdl_merge(orig, src1, src2, &xmp, result); + status = xdl_merge(orig, src1, src2, &xmp, result); + ret = (status > 1 ) ? LL_MERGE_CONFLICT : status; + return ret; } -static int ll_union_merge(const struct ll_merge_driver *drv_unused, +static enum ll_merge_result ll_union_merge(const struct ll_merge_driver *drv_unused, mmbuffer_t *result, const char *path, mmfile_t *orig, const char *orig_name, @@ -178,7 +180,7 @@ static void create_temp(mmfile_t *src, char *path, size_t len) /* * User defined low-level merge driver support. */ -static int ll_ext_merge(const struct ll_merge_driver *fn, +static enum ll_merge_result ll_ext_merge(const struct ll_merge_driver *fn, mmbuffer_t *result, const char *path, mmfile_t *orig, const char *orig_name, @@ -194,6 +196,7 @@ static int ll_ext_merge(const struct ll_merge_driver *fn, const char *args[] = { NULL, NULL }; int status, fd, i; struct stat st; + enum ll_merge_result ret; assert(opts); sq_quote_buf(&path_sq, path); @@ -236,7 +239,8 @@ static int ll_ext_merge(const struct ll_merge_driver *fn, unlink_or_warn(temp[i]); strbuf_release(&cmd); strbuf_release(&path_sq); - return status; + ret = (status > 1) ? LL_MERGE_CONFLICT : status; + return ret; } /* @@ -362,7 +366,7 @@ static void normalize_file(mmfile_t *mm, const char *path, struct index_state *i } } -int ll_merge(mmbuffer_t *result_buf, +enum ll_merge_result ll_merge(mmbuffer_t *result_buf, const char *path, mmfile_t *ancestor, const char *ancestor_label, mmfile_t *ours, const char *our_label, diff --git a/ll-merge.h b/ll-merge.h index aceb1b24132..e4a20e81a3a 100644 --- a/ll-merge.h +++ b/ll-merge.h @@ -82,13 +82,20 @@ struct ll_merge_options { long xdl_opts; }; +enum ll_merge_result { + LL_MERGE_ERROR = -1, + LL_MERGE_OK = 0, + LL_MERGE_CONFLICT, + LL_MERGE_BINARY_CONFLICT, +}; + /** * Perform a three-way single-file merge in core. This is a thin wrapper * around `xdl_merge` that takes the path and any merge backend specified in * `.gitattributes` or `.git/info/attributes` into account. * Returns 0 for a clean merge. */ -int ll_merge(mmbuffer_t *result_buf, +enum ll_merge_result ll_merge(mmbuffer_t *result_buf, const char *path, mmfile_t *ancestor, const char *ancestor_label, mmfile_t *ours, const char *our_label, diff --git a/merge-blobs.c b/merge-blobs.c index ee0a0e90c94..8138090f81c 100644 --- a/merge-blobs.c +++ b/merge-blobs.c @@ -36,7 +36,7 @@ static void *three_way_filemerge(struct index_state *istate, mmfile_t *their, unsigned long *size) { - int merge_status; + enum ll_merge_result merge_status; mmbuffer_t res; /* @@ -50,6 +50,9 @@ static void *three_way_filemerge(struct index_state *istate, istate, NULL); if (merge_status < 0) return NULL; + if (merge_status == LL_MERGE_BINARY_CONFLICT) + warning("Cannot merge binary files: %s (%s vs. %s)", + path, ".our", ".their"); *size = res.size; return res.ptr; diff --git a/merge-ort.c b/merge-ort.c index 0342f104836..c24da2ba3cb 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -1743,7 +1743,7 @@ static int merge_3way(struct merge_options *opt, mmfile_t orig, src1, src2; struct ll_merge_options ll_opts = {0}; char *base, *name1, *name2; - int merge_status; + enum ll_merge_result merge_status; if (!opt->priv->attr_index.initialized) initialize_attr_index(opt); @@ -1787,6 +1787,9 @@ static int merge_3way(struct merge_options *opt, merge_status = ll_merge(result_buf, path, &orig, base, &src1, name1, &src2, name2, &opt->priv->attr_index, &ll_opts); + if (merge_status == LL_MERGE_BINARY_CONFLICT) + warning("Cannot merge binary files: %s (%s vs. %s)", + path, name1, name2); free(base); free(name1); diff --git a/merge-recursive.c b/merge-recursive.c index d9457797dbb..bc73c52dd84 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -1044,7 +1044,7 @@ static int merge_3way(struct merge_options *opt, mmfile_t orig, src1, src2; struct ll_merge_options ll_opts = {0}; char *base, *name1, *name2; - int merge_status; + enum ll_merge_result merge_status; ll_opts.renormalize = opt->renormalize; ll_opts.extra_marker_size = extra_marker_size; @@ -1090,6 +1090,9 @@ static int merge_3way(struct merge_options *opt, merge_status = ll_merge(result_buf, a->path, &orig, base, &src1, name1, &src2, name2, opt->repo->index, &ll_opts); + if (merge_status == LL_MERGE_BINARY_CONFLICT) + warning("Cannot merge binary files: %s (%s vs. %s)", + a->path, name1, name2); free(base); free(name1); diff --git a/notes-merge.c b/notes-merge.c index b4a3a903e86..01d596920ea 100644 --- a/notes-merge.c +++ b/notes-merge.c @@ -344,7 +344,7 @@ static int ll_merge_in_worktree(struct notes_merge_options *o, { mmbuffer_t result_buf; mmfile_t base, local, remote; - int status; + enum ll_merge_result status; read_mmblob(&base, &p->base); read_mmblob(&local, &p->local); @@ -358,6 +358,9 @@ static int ll_merge_in_worktree(struct notes_merge_options *o, free(local.ptr); free(remote.ptr); + if (status == LL_MERGE_BINARY_CONFLICT) + warning("Cannot merge binary files: %s (%s vs. %s)", + oid_to_hex(&p->obj), o->local_ref, o->remote_ref); if ((status < 0) || !result_buf.ptr) die("Failed to execute internal merge"); diff --git a/rerere.c b/rerere.c index d83d58df4fb..46fd01819b8 100644 --- a/rerere.c +++ b/rerere.c @@ -609,19 +609,23 @@ static int try_merge(struct index_state *istate, const struct rerere_id *id, const char *path, mmfile_t *cur, mmbuffer_t *result) { - int ret; + enum ll_merge_result ret; mmfile_t base = {NULL, 0}, other = {NULL, 0}; if (read_mmfile(&base, rerere_path(id, "preimage")) || read_mmfile(&other, rerere_path(id, "postimage"))) - ret = 1; - else + ret = LL_MERGE_CONFLICT; + else { /* * A three-way merge. Note that this honors user-customizable * low-level merge driver settings. */ ret = ll_merge(result, path, &base, NULL, cur, "", &other, "", istate, NULL); + if (ret == LL_MERGE_BINARY_CONFLICT) + warning("Cannot merge binary files: %s (%s vs. %s)", + path, "", ""); + } free(base.ptr); free(other.ptr); From patchwork Tue Dec 21 18:05:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12690267 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CAC86C433FE for ; Tue, 21 Dec 2021 18:05:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240829AbhLUSF4 (ORCPT ); Tue, 21 Dec 2021 13:05:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40528 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240818AbhLUSFy (ORCPT ); Tue, 21 Dec 2021 13:05:54 -0500 Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B9E5FC06173F for ; Tue, 21 Dec 2021 10:05:53 -0800 (PST) Received: by mail-wm1-x32d.google.com with SMTP id y83-20020a1c7d56000000b003456dfe7c5cso2302728wmc.1 for ; Tue, 21 Dec 2021 10:05:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=obkKWvubyxcsBWBqodq9GjqtIG2fyoJpZDBmj1ztp44=; b=Pq6bNlLE0V15qJi+Uxt8NfwB6TpmQrX3OZ0rvzIwW9nffeNSL6fEZb6pRwJyXHQfO6 yIyFa/iWYmsOkLbp5bwuVoDHpAeG8csmxObJ9Q/xbzspv/lWgtZGPCRN2/QxN1nDohgE /DPXao07ZUcjvh7gv0n6GTX54W0sQpf6+dycloCsTn6fcgVYZOFKelKUFzXF8ENEUhIB auA8OMnisXshzhvjrHUJXVB9FoA13do1p+jSkijts5uvKG3PdR+l54HbPZIZMc4Vxh3N VUOaK1ko8XWPq9dkKpS8M4oCUW4DbZDkuj0KwlTxp5J48FriK7uO+D3au5VMPAWFeEWJ 9owQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=obkKWvubyxcsBWBqodq9GjqtIG2fyoJpZDBmj1ztp44=; b=k4kjgKm8r+GKOubY5zTJbwojxpNcoKfsLb7SQW/+3ArWvFn38cLdblWAF7N9qQj5Ji crzLymv5lHls7Wpqyn4qwJ+u0/KgL9bDCQpTV9lgn7xP/Yjihqg6FV3b+A5oLvZiYZyX aza8NXhR3+rX7Chfuh+T6Z/JtEjOmLkA0q7Xm6OB8+f7grLUf3Uww5cw9Fpfw9+GyHxJ f65WRgOEL8D78Em/aXKYBGi/bqpwc8OD91Y1FxtaF3OWs0sN8oH9xr+W5IQDT/shKxGA l9vlBXqExFDbEIyOm67qTb+bkRgOUw3ZjGAU+wN88Tg7e/2k/8wcAeI0SvoNUay2arge xqOQ== X-Gm-Message-State: AOAM530hLOeqWF8RSF2WQcKTxBvBwMLkKoIMQI7zpENh0tCuaSiTX4Zw H5PzyuRzyi3rBsG8guCN/ABTVe+3Q6s= X-Google-Smtp-Source: ABdhPJzHLLLCnoc/B1WwkuaAuiArarj1rDl+tDm9UNsl+7ntHFDat/K615kbYscEEywBLP1kBvOvAw== X-Received: by 2002:a05:600c:34c1:: with SMTP id d1mr2589498wmq.118.1640109952269; Tue, 21 Dec 2021 10:05:52 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id j26sm921002wms.46.2021.12.21.10.05.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Dec 2021 10:05:51 -0800 (PST) Message-Id: In-Reply-To: References: Date: Tue, 21 Dec 2021 18:05:42 +0000 Subject: [PATCH 3/9] merge-ort: capture and print ll-merge warnings in our preferred fashion Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jeff King , Jonathan Nieder , Sergey Organov , Bagas Sanjaya , Elijah Newren , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Neeraj Singh , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren Instead of immediately printing ll-merge warnings to stderr, we save them in our output strbuf. Besides allowing us to move these warnings to a special file for --remerge-diff, this has two other benefits for regular merges done by merge-ort: * The deferral of messages ensures we can print all messages about any given path together (merge-recursive was known to sometimes intersperse messages about other paths, particularly when renames were involved). * The deferral of messages means we can avoid printing spurious conflict messages when we just end up aborting due to local user modifications in the way. (In contrast to merge-recursive.c which prematurely checks for local modifications in the way via unpack_trees() and gets the check wrong both in terms of false positives and false negatives relative to renames, merge-ort does not perform the local modifications in the way check until the checkout() step after the full merge has been computed.) Signed-off-by: Elijah Newren --- merge-ort.c | 5 +++-- t/t6404-recursive-merge.sh | 9 +++++++-- t/t6406-merge-attr.sh | 9 +++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/merge-ort.c b/merge-ort.c index c24da2ba3cb..a18f47e23c5 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -1788,8 +1788,9 @@ static int merge_3way(struct merge_options *opt, &src1, name1, &src2, name2, &opt->priv->attr_index, &ll_opts); if (merge_status == LL_MERGE_BINARY_CONFLICT) - warning("Cannot merge binary files: %s (%s vs. %s)", - path, name1, name2); + path_msg(opt, path, 0, + "warning: Cannot merge binary files: %s (%s vs. %s)", + path, name1, name2); free(base); free(name1); diff --git a/t/t6404-recursive-merge.sh b/t/t6404-recursive-merge.sh index eaf48e941e2..b8735c6db4d 100755 --- a/t/t6404-recursive-merge.sh +++ b/t/t6404-recursive-merge.sh @@ -108,8 +108,13 @@ test_expect_success 'refuse to merge binary files' ' printf "\0\0" >binary-file && git add binary-file && git commit -m binary2 && - test_must_fail git merge F >merge.out 2>merge.err && - grep "Cannot merge binary files: binary-file (HEAD vs. F)" merge.err + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_must_fail git merge F >merge_output + else + test_must_fail git merge F 2>merge_output + fi && + grep "Cannot merge binary files: binary-file (HEAD vs. F)" merge_output ' test_expect_success 'mark rename/delete as unmerged' ' diff --git a/t/t6406-merge-attr.sh b/t/t6406-merge-attr.sh index 84946458371..c41584eb33e 100755 --- a/t/t6406-merge-attr.sh +++ b/t/t6406-merge-attr.sh @@ -221,8 +221,13 @@ test_expect_success 'binary files with union attribute' ' printf "two\0" >bin.txt && git commit -am two && - test_must_fail git merge bin-main 2>stderr && - grep -i "warning.*cannot merge.*HEAD vs. bin-main" stderr + if test "$GIT_TEST_MERGE_ALGORITHM" = ort + then + test_must_fail git merge bin-main >output + else + test_must_fail git merge bin-main 2>output + fi && + grep -i "warning.*cannot merge.*HEAD vs. bin-main" output ' test_done From patchwork Tue Dec 21 18:05:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12690269 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A3A05C4332F for ; Tue, 21 Dec 2021 18:05:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240847AbhLUSF5 (ORCPT ); Tue, 21 Dec 2021 13:05:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40534 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240819AbhLUSFz (ORCPT ); Tue, 21 Dec 2021 13:05:55 -0500 Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A6F71C061401 for ; Tue, 21 Dec 2021 10:05:54 -0800 (PST) Received: by mail-wr1-x42e.google.com with SMTP id i22so28530418wrb.13 for ; Tue, 21 Dec 2021 10:05:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=zia31FE1XXB+wrIB/bIExMhGXsofgWrEwBEylqoR5lA=; b=VtBTP6UFCE9TJVVb1nYXyc0R16SGaGobAzVcDQK2hwZlgDgi5oH0/kr+VLpyCElKe3 S/k1wdc0pR9cl6cxkrpObO22fZ+/qpAdb1ct1NbC1vz7PRJrwDgMXeuyybjRyVKwUyz9 85paAkF2CXOZtbAFyr+5YYxWbf/DimuMWOjKDcWf87ep/R9uQGwYy4i+rqBFdaJurxWb YtFX7xVj72yTCpN3nxhNBg3aAQmlxXfIjK9rwHcUQjm363kIo5zTFBOZeoeqemeUb3Dl CdRvi8V0vvEtnbOma1EzdOsU82tKtKwQ15D8D85U2rZkrIEFW+z249DmUn+SEKFd+W8K Jhhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=zia31FE1XXB+wrIB/bIExMhGXsofgWrEwBEylqoR5lA=; b=FOFJVF0TszTpyKXfgRSlkPG6fZzrhyLtA4Iqy1qxmRHHmMQval9D4NeQ20+r1vtTsq 5nNkRdEmlPPmWXqepXUiOy/w6NQW5Yuwk4hcMdOLxAxzN9hxwJQ5jdulgmOIKy9gsUxs s5oWQa/T5dZgOPcYtw3ZThaAE56dfpZTuuOxzcXi+gLEQT9WUP8Tp+HUYfWnhAm3+SDh Hp75m/ghyblJ14ZiA6FIablas8V6cfbGflRALEWd3d5xjvVVQCEFr6+YCO8TlSJOLlQu UWEMAykYryk+xVHm9CW3iDx0YzK68pXz9f399aRB+Uk2XdE3F6ngASMpuzuczFE21aij BOBQ== X-Gm-Message-State: AOAM5327zv7CyQ4FvDluw1dPJFBfBxpsdhRcNmTFmk/l9lZA+ysBBeOV eZah2ZP5uyGZWYvv4lCaUyjuZnurEVw= X-Google-Smtp-Source: ABdhPJxQKeNtJmDBhGqwCgQ9Lp7cUgFODqQ1d7YCMU5Lghju30fUjzoo+7QQO+zad1ziSyi4/kJiCQ== X-Received: by 2002:adf:b1d5:: with SMTP id r21mr3627398wra.520.1640109953149; Tue, 21 Dec 2021 10:05:53 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id 9sm1797376wrz.90.2021.12.21.10.05.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Dec 2021 10:05:52 -0800 (PST) Message-Id: <1e7eef7705e2f7b4a456056e4335d82267680214.1640109948.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 21 Dec 2021 18:05:43 +0000 Subject: [PATCH 4/9] merge-ort: mark a few more conflict messages as omittable Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jeff King , Jonathan Nieder , Sergey Organov , Bagas Sanjaya , Elijah Newren , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Neeraj Singh , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren path_msg() has the ability to mark messages as omittable, designed for remerge-diff where we'll instead be showing conflict messages as diff headers for a subsequent diff. While all these messages are very useful when trying to create a merge initially, early use with the --remerge-diff feature (the only user of this omittable conflict message capability), suggests that the particular messages marked in this commit are just noise when trying to see what changes users made to create a merge commit. Mark them as omittable. Signed-off-by: Elijah Newren --- merge-ort.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/merge-ort.c b/merge-ort.c index a18f47e23c5..fe27870e73e 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -2420,7 +2420,7 @@ static void apply_directory_rename_modifications(struct merge_options *opt, */ ci->path_conflict = 1; if (pair->status == 'A') - path_msg(opt, new_path, 0, + path_msg(opt, new_path, 1, _("CONFLICT (file location): %s added in %s " "inside a directory that was renamed in %s, " "suggesting it should perhaps be moved to " @@ -2428,7 +2428,7 @@ static void apply_directory_rename_modifications(struct merge_options *opt, old_path, branch_with_new_path, branch_with_dir_rename, new_path); else - path_msg(opt, new_path, 0, + path_msg(opt, new_path, 1, _("CONFLICT (file location): %s renamed to %s " "in %s, inside a directory that was renamed " "in %s, suggesting it should perhaps be " @@ -3825,7 +3825,7 @@ static void process_entry(struct merge_options *opt, reason = _("add/add"); if (S_ISGITLINK(merged_file.mode)) reason = _("submodule"); - path_msg(opt, path, 0, + path_msg(opt, path, 1, _("CONFLICT (%s): Merge conflict in %s"), reason, path); } From patchwork Tue Dec 21 18:05:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12690271 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 90F7EC433FE for ; Tue, 21 Dec 2021 18:06:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240855AbhLUSF7 (ORCPT ); Tue, 21 Dec 2021 13:05:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40538 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240823AbhLUSFz (ORCPT ); Tue, 21 Dec 2021 13:05:55 -0500 Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3B39EC061574 for ; Tue, 21 Dec 2021 10:05:55 -0800 (PST) Received: by mail-wm1-x334.google.com with SMTP id b73so9652907wmd.0 for ; Tue, 21 Dec 2021 10:05:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=NL9gpskVh13Do2E5ujoRMKXPeq0YO/+28ekdWUSdz6c=; b=iwlk5V6CpUuUYIHnqU2h76Zh1YLhVwOAvk7dnZOEUmebWwQpP96MM1fZfMy/e7e7+/ 8ErRPCHZdhps+0VZ11crriI/4UIHmuUogkfK6YI4D5Hcz+2KvAFqKM2Gyl10eerlLO5k y5qRiGSNMTdpQrlFGNSKXIUhM8/f1JhqaNdXMQwUcxunfanu1AX7o0VJ0biGTI7SsKad c7g9pxPFhWsG/liWDKl7GNv9DzXhSIn0rtwoigdYtPng1U3y9UGq2Q8zBbcRMd1QUotD c4a/3L3xoA2C1TLmyyN9gbSFPdBLBLJZkV7ZtQhYFk59Bze7Fu4iGQbh0vn2ZEpPk/pu qh/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=NL9gpskVh13Do2E5ujoRMKXPeq0YO/+28ekdWUSdz6c=; b=d4H45r7JhLO+IVbYZgBXQ/KQIPEQS6G/EaPq3b7naeGH0TMtSlYPL805GaSjUvLTcz ykeO+DlNb93+wV71gjh8TqU3Rgpy6CCV1RkPuR3CSbP5BRdAWUK0twPpAfOw9Rn09Ejv BBSCJuyI7I5Vh5yJLwdf5nvhctdcFz6Ied9TYk5xYHJe1qrC/SLPKp9sqtzevKezmm4s ZTOFsG3r10CdQ3V6GSgxvSG3e60TQXzF68pz/uuonZD32a7s9NUgZlXDVcUR+QSnEAzf zwrtabIL6xwbMZCW5pXQlHQqAxJbVZ/xAqUTksddLHQBRclPBDxzMGhP3B1MBvJYFirQ Hzhw== X-Gm-Message-State: AOAM531/S+5tQdLBN1xJCpJIHFsEQ01b437gC5BSLAsZTZDaOuyljVug gciVwp5Zp0dXmaJlIoX6Ehlm0Vbqaok= X-Google-Smtp-Source: ABdhPJwporh0AC9Ozfb2O6mtFLLl9sddMxybK2RokzY1lIdFXhWXjF0ye7Wb9HijX7+2TV8s4acixA== X-Received: by 2002:a05:600c:204d:: with SMTP id p13mr3871971wmg.102.1640109953713; Tue, 21 Dec 2021 10:05:53 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id l8sm2933913wmc.40.2021.12.21.10.05.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Dec 2021 10:05:53 -0800 (PST) Message-Id: In-Reply-To: References: Date: Tue, 21 Dec 2021 18:05:44 +0000 Subject: [PATCH 5/9] merge-ort: make path_messages available to external callers Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jeff King , Jonathan Nieder , Sergey Organov , Bagas Sanjaya , Elijah Newren , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Neeraj Singh , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren merge-ort is designed to be more flexible so that it could be called as more of a library function. Part of that design is not writing to the working tree or index unless and until requested. Part of it is returning tree objects (rather than creating commits and making them part of HEAD), and allowing callers to do their own special thing with that merged tree. Along the same lines, we want to enable callers to do something special with output messages (conflicts and other warnings) besides just automatically displaying on stdout/stderr. Do so by making the output path messages accessible via a new member of struct merge_result named path_messages. Signed-off-by: Elijah Newren --- merge-ort.c | 1 + merge-ort.h | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/merge-ort.c b/merge-ort.c index fe27870e73e..c4d6c5c81cc 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -4547,6 +4547,7 @@ redo: trace2_region_leave("merge", "process_entries", opt->repo); /* Set return values */ + result->path_messages = &opt->priv->output; result->tree = parse_tree_indirect(&working_tree_oid); /* existence of conflicted entries implies unclean */ result->clean &= strmap_empty(&opt->priv->conflicted); diff --git a/merge-ort.h b/merge-ort.h index c011864ffeb..fe599b87868 100644 --- a/merge-ort.h +++ b/merge-ort.h @@ -5,6 +5,7 @@ struct commit; struct tree; +struct strmap; struct merge_result { /* @@ -23,6 +24,15 @@ struct merge_result { */ struct tree *tree; + /* + * Special messages and conflict notices for various paths + * + * This is a map of pathnames to strbufs. It contains various + * warning/conflict/notice messages (possibly multiple per path) + * that callers may want to use. + */ + struct strmap *path_messages; + /* * Additional metadata used by merge_switch_to_result() or future calls * to merge_incore_*(). Includes data needed to update the index (if From patchwork Tue Dec 21 18:05:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12690273 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A004BC433F5 for ; Tue, 21 Dec 2021 18:06:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240852AbhLUSGA (ORCPT ); Tue, 21 Dec 2021 13:06:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40542 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240822AbhLUSF4 (ORCPT ); Tue, 21 Dec 2021 13:05:56 -0500 Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EC80FC06173F for ; Tue, 21 Dec 2021 10:05:55 -0800 (PST) Received: by mail-wm1-x32d.google.com with SMTP id f134-20020a1c1f8c000000b00345c05bc12dso94111wmf.3 for ; Tue, 21 Dec 2021 10:05:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=Qk7OWItTzY/zhzBFtJSYFhrqUkHOCMHIT24pu++hZiw=; b=DPLdGnZfTFvpYHjshzBqvWpnK1wFU9Nx5b5PDnAS4Esg39KVuvZHWNzs4hXf61RKfM rmAs7vhBaDu+xKz03BY4O3Ay2dwSzlDfLLkcygwTMW+jn1ChymDY//nJQT96/vB+osdm srdLVOWRALhjATjtk3zKEQg0f5gDK4e8WvjWxiK9veWhVu9urW+cJDi97fZJvNSuo4HO OJEZdBHC77BFsMwo7Y6Owk9UNP0BXxnF8XJDhgpnkNiwbAp2+lZG7sNBlepi91gR1RC3 DBGjy4xUW8k9iOykzBjKE9+klhjhFn+5hvF5i7YptHGEWIdX3u+yJKT5Hh00GpB1HszC yrUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=Qk7OWItTzY/zhzBFtJSYFhrqUkHOCMHIT24pu++hZiw=; b=svI8pe3DmNeEpAlU0rP8hFDrLs+sAQdSTt5sPorBK2rCIykLpxomEEKV3xLOf/VlZu ziOuoMlSvMILINuAOQDJ3P8ln7cF09swNNzaYt8pAx5L5WhoNzYmBNRxCPzM6605g3+x Hs72lHxtlVJP44IaU3KirH1OSLGD0HL1Z28BqO3FWWDusxtu+u+DFr4Rn9lFy18BoxTo I21hRmwvUsKVJPgaeH/4v1z7AsVtOcYTmt5awGSFRPF/IdQ0BXhpl9ZDew6VSreACA0m hymm4xrw9SLl7rLxNDA3r0CsAWbB91aEwQvt4asusO/2saTEuyemRDDlaw0S2ZzMH9vP TGNQ== X-Gm-Message-State: AOAM532r5po/YnqmKxnnJgXilA1CF50kWiSKSqRLzVRE60srMMBkl5NN X7Cdn72jimnZpXNkQ0XJDv+fg22WtHU= X-Google-Smtp-Source: ABdhPJwPTSumNO0ytv+0j7dPCLeSLszyles1bgBN6p2pKPBRsOIIULUbLJn0iuKlhZhoKnPX47LnTg== X-Received: by 2002:a7b:c310:: with SMTP id k16mr3801763wmj.169.1640109954427; Tue, 21 Dec 2021 10:05:54 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id n41sm1267020wms.32.2021.12.21.10.05.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Dec 2021 10:05:54 -0800 (PST) Message-Id: <15600df925fb06ecf2c12afecd514f551a1bf7c2.1640109948.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 21 Dec 2021 18:05:45 +0000 Subject: [PATCH 6/9] diff: add ability to insert additional headers for paths Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jeff King , Jonathan Nieder , Sergey Organov , Bagas Sanjaya , Elijah Newren , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Neeraj Singh , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren In support of a remerge-diff ability we will add in a few commits, we want to be able to provide additional headers to show along with a diff. Add the plumbing necessary to enable this. Signed-off-by: Elijah Newren --- diff.c | 34 +++++++++++++++++++++++++++++++++- diff.h | 1 + 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/diff.c b/diff.c index 861282db1c3..a9490b9b2ba 100644 --- a/diff.c +++ b/diff.c @@ -27,6 +27,7 @@ #include "help.h" #include "promisor-remote.h" #include "dir.h" +#include "strmap.h" #ifdef NO_FAST_WORKING_DIRECTORY #define FAST_WORKING_DIRECTORY 0 @@ -3406,6 +3407,33 @@ struct userdiff_driver *get_textconv(struct repository *r, return userdiff_get_textconv(r, one->driver); } +static struct strbuf* additional_headers(struct diff_options *o, + const char *path) +{ + if (!o->additional_path_headers) + return NULL; + return strmap_get(o->additional_path_headers, path); +} + +static void add_formatted_headers(struct strbuf *msg, + struct strbuf *more_headers, + const char *line_prefix, + const char *meta, + const char *reset) +{ + char *next, *newline; + + next = more_headers->buf; + while ((newline = strchr(next, '\n'))) { + *newline = '\0'; + strbuf_addf(msg, "%s%s%s%s\n", line_prefix, meta, next, reset); + *newline = '\n'; + next = newline + 1; + } + if (*next) + strbuf_addf(msg, "%s%s%s%s\n", line_prefix, meta, next, reset); +} + static void builtin_diff(const char *name_a, const char *name_b, struct diff_filespec *one, @@ -4328,9 +4356,13 @@ static void fill_metainfo(struct strbuf *msg, const char *set = diff_get_color(use_color, DIFF_METAINFO); const char *reset = diff_get_color(use_color, DIFF_RESET); const char *line_prefix = diff_line_prefix(o); + struct strbuf *more_headers = NULL; *must_show_header = 1; strbuf_init(msg, PATH_MAX * 2 + 300); + if ((more_headers = additional_headers(o, name))) + add_formatted_headers(msg, more_headers, + line_prefix, set, reset); switch (p->status) { case DIFF_STATUS_COPIED: strbuf_addf(msg, "%s%ssimilarity index %d%%", @@ -5852,7 +5884,7 @@ int diff_unmodified_pair(struct diff_filepair *p) static void diff_flush_patch(struct diff_filepair *p, struct diff_options *o) { - if (diff_unmodified_pair(p)) + if (diff_unmodified_pair(p) && !additional_headers(o, p->one->path)) return; if ((DIFF_FILE_VALID(p->one) && S_ISDIR(p->one->mode)) || diff --git a/diff.h b/diff.h index 8ba85c5e605..289badf5643 100644 --- a/diff.h +++ b/diff.h @@ -395,6 +395,7 @@ struct diff_options { struct repository *repo; struct option *parseopts; + struct strmap *additional_path_headers; int no_free; }; From patchwork Tue Dec 21 18:05:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12690275 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1A7DDC433EF for ; Tue, 21 Dec 2021 18:06:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240867AbhLUSGB (ORCPT ); Tue, 21 Dec 2021 13:06:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40558 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240843AbhLUSF5 (ORCPT ); Tue, 21 Dec 2021 13:05:57 -0500 Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A8147C061751 for ; Tue, 21 Dec 2021 10:05:56 -0800 (PST) Received: by mail-wr1-x431.google.com with SMTP id q16so28594235wrg.7 for ; Tue, 21 Dec 2021 10:05:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=QCeuIUWG/mTK4FgLws1WBcsISG+R3tnkdkUxD7ZYhHM=; b=Gqtift7zndHCZPaWQbV9L7IwVpNiyAJWGm97xuDHdN8MMXlbA9M4vxWoQRUOfjY0IC ASIWN/HIn7qr0TBmB7Apcg60ezFLrKOk9WJH70IHXb2FeuMef/+fAMQ3YdmciY4WmxnM ydRh7HO5nW0/v2Z9eMktbvx9nVod/uiv9TwEpMyrNmwKN8onnJPmWyoyjXp3NHfML7xD 2d3YaPF2MaDK8bciRBRU+w4fbjWcG/6eFuLlvLqBafse+d00X5k4vHRHzIIADVwfFX7l 6Fk1ExHGJnDjRpHGuefib27WpCwmu0N04RDd21ex2bdyCQhsKbjHilzcEKKJ1GladV3g M8XA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=QCeuIUWG/mTK4FgLws1WBcsISG+R3tnkdkUxD7ZYhHM=; b=VNDW9/Hmq4Lz2LjGZD0tlQ55R9BPsO/Ox4WCJFnaJhBTUCQpXR9jGu0xLCn95payt7 of4PySlxl1AmH7ydFbKvuLqEKPpTFXI6C+pTbqNInMi3GuMlrlSR/qmVwKNEZRU8v9Tb sQGEFY04CXqyICRRJeJ0nw/H+DQ7aTePdn6Un9cKFKsXxxsFocFMcD4VH4IuMX2l1bmY ZHRNrQlO5htmmvLddtNSUui6TiuGmNh+fdoifEjx3Gt6eBg0B3uheaEPIpGfMrKZmM+/ F16MYdoAnCy0r4gX3TEuypLmqWyDQTbFmmn54yORUYgJ6faiVWESLhJZXh4yq4mponmF 3kug== X-Gm-Message-State: AOAM533sSt2a8DMaN4teaz5xbSw1gsPOFKXwkXuA+DyuP8eSp3vMst7G 3vy4V3wi42sFC/FsQPxNnJD0B2WOOiM= X-Google-Smtp-Source: ABdhPJxn6vB25CkRNbcG9vncgQgrsH9r5HznKfRy+YiIrUOB8lKM9HplSNKNadjFcEirbzlvNmS+TQ== X-Received: by 2002:adf:a10f:: with SMTP id o15mr3580575wro.592.1640109955051; Tue, 21 Dec 2021 10:05:55 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id c9sm2991306wml.12.2021.12.21.10.05.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Dec 2021 10:05:54 -0800 (PST) Message-Id: In-Reply-To: References: Date: Tue, 21 Dec 2021 18:05:46 +0000 Subject: [PATCH 7/9] merge-ort: format messages slightly different for use in headers Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jeff King , Jonathan Nieder , Sergey Organov , Bagas Sanjaya , Elijah Newren , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Neeraj Singh , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren We want to add an ability for users to run git show --remerge-diff $MERGE_COMMIT or even git log -p --remerge-diff ... and have git show the differences between where the merge machinery would stop and what is recorded in merge commits. However, in such cases, stdout is not an appropriate location to dump conflict messages. We instead want these messages to appear as headers in the subsequent diff. For them to work as headers, though, we need for any multiline messages to replace newlines with both a newline and a space. Add a new flag to signal when we want these messages modified in such a fashion, and use it in path_msg() to modify these messages this way. Signed-off-by: Elijah Newren --- merge-ort.c | 36 ++++++++++++++++++++++++++++++++++-- merge-recursive.c | 3 +++ merge-recursive.h | 1 + 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/merge-ort.c b/merge-ort.c index c4d6c5c81cc..0ae3e4ffa75 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -634,17 +634,46 @@ static void path_msg(struct merge_options *opt, const char *fmt, ...) { va_list ap; - struct strbuf *sb = strmap_get(&opt->priv->output, path); + struct strbuf *sb, *dest; + struct strbuf tmp = STRBUF_INIT; + + if (opt->record_conflict_msgs_as_headers && omittable_hint) + return; /* Do not record mere hints in tree */ + sb = strmap_get(&opt->priv->output, path); if (!sb) { sb = xmalloc(sizeof(*sb)); strbuf_init(sb, 0); strmap_put(&opt->priv->output, path, sb); } + dest = (opt->record_conflict_msgs_as_headers ? &tmp : sb); + va_start(ap, fmt); - strbuf_vaddf(sb, fmt, ap); + strbuf_vaddf(dest, fmt, ap); va_end(ap); + if (opt->record_conflict_msgs_as_headers) { + int i_sb = 0, i_tmp = 0; + + /* Copy tmp to sb, adding spaces after newlines */ + strbuf_grow(sb, 2*tmp.len); /* more than sufficient */ + for (; i_tmp < tmp.len; i_tmp++, i_sb++) { + /* Copy next character from tmp to sb */ + sb->buf[sb->len + i_sb] = tmp.buf[i_tmp]; + + /* If we copied a newline, add a space */ + if (tmp.buf[i_tmp] == '\n') + sb->buf[++i_sb] = ' '; + } + /* Update length and ensure it's NUL-terminated */ + sb->len += i_sb; + sb->buf[sb->len] = '\0'; + + /* Clean up tmp */ + strbuf_release(&tmp); + } + + /* Add final newline character to sb */ strbuf_addch(sb, '\n'); } @@ -4246,6 +4275,9 @@ void merge_switch_to_result(struct merge_options *opt, struct string_list olist = STRING_LIST_INIT_NODUP; int i; + if (opt->record_conflict_msgs_as_headers) + BUG("Either display conflict messages or record them as headers, not both"); + trace2_region_enter("merge", "display messages", opt->repo); /* Hack to pre-allocate olist to the desired size */ diff --git a/merge-recursive.c b/merge-recursive.c index bc73c52dd84..c9ba7e904a6 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -3714,6 +3714,9 @@ static int merge_start(struct merge_options *opt, struct tree *head) assert(opt->priv == NULL); + /* Not supported; option specific to merge-ort */ + assert(!opt->record_conflict_msgs_as_headers); + /* Sanity check on repo state; index must match head */ if (repo_index_has_changes(opt->repo, head, &sb)) { err(opt, _("Your local changes to the following files would be overwritten by merge:\n %s"), diff --git a/merge-recursive.h b/merge-recursive.h index 0795a1d3ec1..ebfdb7f994e 100644 --- a/merge-recursive.h +++ b/merge-recursive.h @@ -46,6 +46,7 @@ struct merge_options { /* miscellaneous control options */ const char *subtree_shift; unsigned renormalize : 1; + unsigned record_conflict_msgs_as_headers : 1; /* internal fields used by the implementation */ struct merge_options_internal *priv; From patchwork Tue Dec 21 18:05:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12690277 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C8DCEC433F5 for ; Tue, 21 Dec 2021 18:06:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240836AbhLUSGD (ORCPT ); Tue, 21 Dec 2021 13:06:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40562 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240845AbhLUSF5 (ORCPT ); Tue, 21 Dec 2021 13:05:57 -0500 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 50B77C06173F for ; Tue, 21 Dec 2021 10:05:57 -0800 (PST) Received: by mail-wr1-x42d.google.com with SMTP id e5so28559675wrc.5 for ; Tue, 21 Dec 2021 10:05:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=pKHlsgibmU/o0IOqbLJdVchR8Gx/wV+xrht4B9wnqOg=; b=Zn5jV/uMSwsS6fbIJ9yBjuRFJXyTLWD0vqrJn0W/OYFP2j53BPiJyYka1PKkK+urOt ZSBnHsey9X0V3yX3URRa+kyHiysOfIWiWUBhxegYxYg08/ATddJmUrh/rFpirFdN1AaL 6hE14PdDBoj8GwFYt4UvYd/coJ9z+cf840mFxUQuVzA51fRmMth4NmW9S4vBMFmGJtkG H282nCZ5csTUAIkAebrsupQl3zbDH35TkvVhz6fOLZwodIIM8nivnvyuD+de099FGFVi LZ5QNapbekkOBdaTdauU7xUkwgRUZ7IYzC/9aCvK4B5MZhVCxmUVrPt/lkpPPVMGAIkN 2NJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=pKHlsgibmU/o0IOqbLJdVchR8Gx/wV+xrht4B9wnqOg=; b=cnoKSCL+zjg+B5jAfqdOox7UYR+P4/z28rJ6T0k2T0COZfKBToM+ix4UQUGmT7REJc DIygyhBw4dqHaLh6es8ZGgr6NOjLT+WzWCG29vd1K5Ntn/QuMbfBbolR6Z3pJl/0ZKNH KJd9paxrC29azI1nf1pm2eZ6xEvOI9JZwEbkYfxTb1jIG7oa2UXZjgPNuSXJyRrmqtQI 5+ZpxBkjUDsZD1eq6byxyWZc4VMh2fb0x7ubA8UVu/EHpN+VmEAa8M3CRyk789LQ1y0Y zDl/gjcUMkW1PD3Lt+PFNGv+AR4YDOQHFHP9RrH9oGnEqFMbEvziXc7tDm+QMGKB5zGV uybA== X-Gm-Message-State: AOAM531e7lztrUj/bHivymOgUsV8GubqS+c2OX+5OHWzAfbjZtBCasH1 0J1Zf8MjdnAMFY/+V6bPf5iQsunMN6A= X-Google-Smtp-Source: ABdhPJwi2HqAZq1b5T/iQFrnk7l81ZsJ44Be6GVACkFvtNHMfAg+YuyU1C8+bOK+nrtm5LDMzmlu5Q== X-Received: by 2002:a5d:68cf:: with SMTP id p15mr3492811wrw.620.1640109955714; Tue, 21 Dec 2021 10:05:55 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id e4sm18419018wrh.56.2021.12.21.10.05.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Dec 2021 10:05:55 -0800 (PST) Message-Id: <5d5846be0bd67b8fd850ef2583beef064481a67d.1640109948.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 21 Dec 2021 18:05:47 +0000 Subject: [PATCH 8/9] show, log: provide a --remerge-diff capability Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jeff King , Jonathan Nieder , Sergey Organov , Bagas Sanjaya , Elijah Newren , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Neeraj Singh , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren When this option is specified, we remerge all (two parent) merge commits and diff the actual merge commit to the automatically created version, in order to show how users removed conflict markers, resolved the different conflict versions, and potentially added new changes outside of conflict regions in order to resolve semantic merge problems (or, possibly, just to hide other random changes). This capability works by creating a temporary object directory and marking it as the primary object store, so that any blobs or trees created during the automatic merge, can be easily removed afterwards by just deleting all objects from the temporary object directory. We can do this after handling each merge commit, in order to avoid the need to worry about doing `git gc --auto` runs while running `git log --remerge-diff`. Signed-off-by: Elijah Newren --- builtin/log.c | 16 ++++++++++++ diff-merges.c | 12 +++++++++ log-tree.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++ revision.h | 6 ++++- 4 files changed, 103 insertions(+), 1 deletion(-) diff --git a/builtin/log.c b/builtin/log.c index f75d87e8d7f..2b51d8b6aae 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -35,6 +35,8 @@ #include "repository.h" #include "commit-reach.h" #include "range-diff.h" +#include "dir.h" +#include "tmp-objdir.h" #define MAIL_DEFAULT_WRAP 72 #define COVER_FROM_AUTO_MAX_SUBJECT_LEN 100 @@ -407,6 +409,13 @@ static int cmd_log_walk(struct rev_info *rev) int saved_nrl = 0; int saved_dcctc = 0; + if (rev->remerge_diff) { + rev->remerge_objdir = tmp_objdir_create("remerge-diff"); + if (!rev->remerge_objdir) + die(_("unable to create temporary object directory")); + tmp_objdir_replace_primary_odb(rev->remerge_objdir, 1); + } + if (rev->early_output) setup_early_output(); @@ -449,6 +458,11 @@ static int cmd_log_walk(struct rev_info *rev) rev->diffopt.no_free = 0; diff_free(&rev->diffopt); + if (rev->remerge_diff) { + tmp_objdir_destroy(rev->remerge_objdir); + rev->remerge_objdir = NULL; + } + if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF && rev->diffopt.flags.check_failed) { return 02; @@ -1943,6 +1957,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) die(_("--name-status does not make sense")); if (rev.diffopt.output_format & DIFF_FORMAT_CHECKDIFF) die(_("--check does not make sense")); + if (rev.remerge_diff) + die(_("--remerge_diff does not make sense")); if (!use_patch_format && (!rev.diffopt.output_format || diff --git a/diff-merges.c b/diff-merges.c index 5060ccd890b..0af4b3f9191 100644 --- a/diff-merges.c +++ b/diff-merges.c @@ -17,6 +17,7 @@ static void suppress(struct rev_info *revs) revs->combined_all_paths = 0; revs->merges_imply_patch = 0; revs->merges_need_diff = 0; + revs->remerge_diff = 0; } static void set_separate(struct rev_info *revs) @@ -45,6 +46,12 @@ static void set_dense_combined(struct rev_info *revs) revs->dense_combined_merges = 1; } +static void set_remerge_diff(struct rev_info *revs) +{ + suppress(revs); + revs->remerge_diff = 1; +} + static diff_merges_setup_func_t func_by_opt(const char *optarg) { if (!strcmp(optarg, "off") || !strcmp(optarg, "none")) @@ -57,6 +64,8 @@ static diff_merges_setup_func_t func_by_opt(const char *optarg) return set_combined; else if (!strcmp(optarg, "cc") || !strcmp(optarg, "dense-combined")) return set_dense_combined; + else if (!strcmp(optarg, "r") || !strcmp(optarg, "remerge")) + return set_remerge_diff; else if (!strcmp(optarg, "m") || !strcmp(optarg, "on")) return set_to_default; return NULL; @@ -110,6 +119,9 @@ int diff_merges_parse_opts(struct rev_info *revs, const char **argv) } else if (!strcmp(arg, "--cc")) { set_dense_combined(revs); revs->merges_imply_patch = 1; + } else if (!strcmp(arg, "--remerge-diff")) { + set_remerge_diff(revs); + revs->merges_imply_patch = 1; } else if (!strcmp(arg, "--no-diff-merges")) { suppress(revs); } else if (!strcmp(arg, "--combined-all-paths")) { diff --git a/log-tree.c b/log-tree.c index 644893fd8cf..8fef9822a1e 100644 --- a/log-tree.c +++ b/log-tree.c @@ -1,12 +1,15 @@ #include "cache.h" +#include "commit-reach.h" #include "config.h" #include "diff.h" #include "object-store.h" #include "repository.h" +#include "tmp-objdir.h" #include "commit.h" #include "tag.h" #include "graph.h" #include "log-tree.h" +#include "merge-ort.h" #include "reflog-walk.h" #include "refs.h" #include "string-list.h" @@ -16,6 +19,7 @@ #include "line-log.h" #include "help.h" #include "range-diff.h" +#include "dir.h" static struct decoration name_decoration = { "object names" }; static int decoration_loaded; @@ -902,6 +906,60 @@ static int do_diff_combined(struct rev_info *opt, struct commit *commit) return !opt->loginfo; } +static int do_remerge_diff(struct rev_info *opt, + struct commit_list *parents, + struct object_id *oid, + struct commit *commit) +{ + struct merge_options o; + struct commit_list *bases; + struct merge_result res; + struct pretty_print_context ctx = {0}; + struct strbuf commit1 = STRBUF_INIT; + struct strbuf commit2 = STRBUF_INIT; + + /* Setup merge options */ + init_merge_options(&o, the_repository); + memset(&res, 0, sizeof(res)); + o.show_rename_progress = 0; + + ctx.abbrev = DEFAULT_ABBREV; + format_commit_message(parents->item, "%h (%s)", &commit1, &ctx); + format_commit_message(parents->next->item, "%h (%s)", &commit2, &ctx); + o.branch1 = commit1.buf; + o.branch2 = commit2.buf; + o.record_conflict_msgs_as_headers = 1; + + /* Parse the relevant commits and get the merge bases */ + parse_commit_or_die(parents->item); + parse_commit_or_die(parents->next->item); + bases = get_merge_bases(parents->item, parents->next->item); + + /* Re-merge the parents */ + merge_incore_recursive(&o, + bases, parents->item, parents->next->item, + &res); + + /* Show the diff */ + opt->diffopt.additional_path_headers = res.path_messages; + diff_tree_oid(&res.tree->object.oid, oid, "", &opt->diffopt); + log_tree_diff_flush(opt); + + /* Cleanup */ + opt->diffopt.additional_path_headers = NULL; + strbuf_release(&commit1); + strbuf_release(&commit2); + merge_finalize(&o, &res); + + /* Clean up the temporary object directory */ + if (opt->remerge_objdir != NULL) + tmp_objdir_discard_objects(opt->remerge_objdir); + else + BUG("unable to remove temporary object directory"); + + return !opt->loginfo; +} + /* * Show the diff of a commit. * @@ -936,6 +994,18 @@ static int log_tree_diff(struct rev_info *opt, struct commit *commit, struct log } if (is_merge) { + int octopus = (parents->next->next != NULL); + + if (opt->remerge_diff) { + if (octopus) { + show_log(opt); + fprintf(opt->diffopt.file, + "diff: warning: Skipping remerge-diff " + "for octopus merges.\n"); + return 1; + } + return do_remerge_diff(opt, parents, oid, commit); + } if (opt->combine_merges) return do_diff_combined(opt, commit); if (opt->separate_merges) { diff --git a/revision.h b/revision.h index 5578bb4720a..44efce3f410 100644 --- a/revision.h +++ b/revision.h @@ -195,7 +195,8 @@ struct rev_info { combine_merges:1, combined_all_paths:1, dense_combined_merges:1, - first_parent_merges:1; + first_parent_merges:1, + remerge_diff:1; /* Format info */ int show_notes; @@ -317,6 +318,9 @@ struct rev_info { /* misc. flags related to '--no-kept-objects' */ unsigned keep_pack_cache_flags; + + /* Location where temporary objects for remerge-diff are written. */ + struct tmp_objdir *remerge_objdir; }; int ref_excluded(struct string_list *, const char *path); From patchwork Tue Dec 21 18:05:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12690279 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F1B18C433EF for ; Tue, 21 Dec 2021 18:06:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240876AbhLUSGD (ORCPT ); Tue, 21 Dec 2021 13:06:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40538 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240819AbhLUSF6 (ORCPT ); Tue, 21 Dec 2021 13:05:58 -0500 Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 02699C061756 for ; Tue, 21 Dec 2021 10:05:58 -0800 (PST) Received: by mail-wr1-x42c.google.com with SMTP id d9so9068940wrb.0 for ; Tue, 21 Dec 2021 10:05:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=1KZlym63hsEmgZKhgF68sGOhw4+6yJaaNBmMEKsLv5I=; b=kVPhNG9hpkysK0X4P1+nh/8UbNa9IZGhITugJr/DHRy8DWxL2k/z4D7JMOxs0KbNUt UpF5HuT+ZnMG3W6RX1VwRXJCx+mQSLw1eKd8RZV6il+7fR6Ds2XPc5zEob+oI0j3v7lq 81irC0ctzW68dIgVoszdQbHejC/01NkgJAqcZSKB+BPqjy7G24DasGea7aFegQOzeY6E LRvEITpxldqS11wCkMYB9RTDoz2MClpMgqOnTXchFpDJxiTgkJ6xVs8pMcg1Tb05TJq7 Zy91GpHkHWfuB3CGQnnfQAtWraovqq2PvRiue2gobjwby9RqjFi+sX9mbLzwZK4TNGU9 LoTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=1KZlym63hsEmgZKhgF68sGOhw4+6yJaaNBmMEKsLv5I=; b=n9jkOz2wjtS7gjp+xUudRoClvxnpg54VwhCQWbhGQmJRgiMlztOFDalw6M/13jE82h 6tu4XEgKvU73oaB6k4roD5XZbwH2qXHZ3nH+HEnn5l33PrsO44XlNoVe32TvgLAeWz0T /dnj3idQpOrZ84ECjqO4Vx8N3We4Zqd5EcZDcwvuArWj2hAnxWs45ZWxGvj2+aYbm61X lFN4L1oVLpSGpF1UutGzMAf3SjVcGYjEm7BLxB0lAvUcK5z30WCXzf/vSwZB2d6ysYWt lE+3+hP9bTWltb4UZAfiMPkiUKseLQ4SMghUJdw2aRV/m928V4zHmBazj+vGtJ99En8q gaFA== X-Gm-Message-State: AOAM533JjAfm0V9KuWm/ZCFsfHUCJbaDswk9WDU0UYu8CsAKx0yY52v8 WK42QmNaWXDIyy/JY70Wq757ekk0coo= X-Google-Smtp-Source: ABdhPJwFdy3gN6HkERuW4cPOeveFlwyTt/hEgKyLds93rdP3byrrbMC7p62KeBeL3EnW0XAlVvYjXA== X-Received: by 2002:a05:6000:1a8e:: with SMTP id f14mr3412370wry.635.1640109956440; Tue, 21 Dec 2021 10:05:56 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id l13sm3400973wms.1.2021.12.21.10.05.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Dec 2021 10:05:56 -0800 (PST) Message-Id: <4f21969e35724ffac6938beb9e089a970f90c41a.1640109949.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 21 Dec 2021 18:05:48 +0000 Subject: [PATCH 9/9] doc/diff-options: explain the new --remerge-diff option Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jeff King , Jonathan Nieder , Sergey Organov , Bagas Sanjaya , Elijah Newren , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Neeraj Singh , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren Signed-off-by: Elijah Newren --- Documentation/diff-options.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index c89d530d3d1..b05f1c9f1c9 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -64,6 +64,14 @@ ifdef::git-log[] each of the parents. Separate log entry and diff is generated for each parent. + +--diff-merges=remerge::: +--diff-merges=r::: +--remerge-diff::: + With this option, two-parent merge commits are remerged to + create a temporary tree object -- potentially containing files + with conflict markers and such. A diff is then shown between + that temporary tree and the actual merge commit. ++ --diff-merges=combined::: --diff-merges=c::: -c:::