From patchwork Fri Mar 5 00:55:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12117203 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E5E96C433DB for ; Fri, 5 Mar 2021 00:55:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B5BE864FF0 for ; Fri, 5 Mar 2021 00:55:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231985AbhCEAzm (ORCPT ); Thu, 4 Mar 2021 19:55:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57488 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229563AbhCEAzl (ORCPT ); Thu, 4 Mar 2021 19:55:41 -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 46AF1C061574 for ; Thu, 4 Mar 2021 16:55:41 -0800 (PST) Received: by mail-wr1-x42e.google.com with SMTP id 7so258918wrz.0 for ; Thu, 04 Mar 2021 16:55:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=nZUKeGnNFRF3r6KguNhsE8AYlzwtAyHtm9VlL4qyA2s=; b=Vr+8Uz4ec2XdYc2ugDQMf888cIElFoq+BLW9ZWFpV2r0TtAGWpcihn7RzhybcnqhFO 3obybpUFLT3vDLF7BWFmMy1YDSAHiF8PhFTQOfRhdkEdIhMpQaKFCssti6QLO7/bbIZ/ HA2jeS8GZh/k4rl5+CB3yxel1SobXJt6I1G7QDbYP6nm6e/4VJ4oOoat1WW+WxqT2TbK 0gLdTYMacfM6GGy/RgqBr1mf+z0ZAhX8MCqxvNy18jyvHSL0yul3FiTeylnGIp6MOXlP c0Rt/Dr9hkXutyuI4VKhD8PTwsd9oL4xk5mqoXY9NfWugqubh5hzK6PuiIIyiCeC44mo 5/FQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=nZUKeGnNFRF3r6KguNhsE8AYlzwtAyHtm9VlL4qyA2s=; b=OOIkYSCXGyCOYHBhVCxRjKQQPM4TvTG9Mo4QYQ+MCPkC7QDO/6PddcOpyaFYGIZlTg Wu3HX/x1D9ddF0pSabzgVuFYIse56B8jLLfZGCopB5Xbt8TOVz72JvrVmzX1Js1LZ74O ILgFR9f3GR+aBKP5V6oj9wvCb/s+RsT0o4vSkeL1C5+/DO6ygXItcZLp/QnUQvk1cPwi lDcvCfsU65560p6fgYNtX1KjY0tIGmd4C5cKv93mNXveMu+D3P4Ux5OuCyPBSz8+oALf Yzcdmb9Brwe6ici5duWKTKPED3KkKQ6RGIRrivWEKk2MjVTNpAQN1V246/vpUEC7h4PM h1/w== X-Gm-Message-State: AOAM533DOPM4CXlJy2Dy5tNTrRlfnbAhv45oKREonWvVjRuk1iek7nFj spmzikXfFLtl/prSoK+eF0XyF5bGB7c= X-Google-Smtp-Source: ABdhPJyApWQp9i/lIhgZsVElpLthag03EbgRGVbjtt+b2/z5xqENXwJiBsrSVl3A3IHBPqPO8INVNg== X-Received: by 2002:a5d:6b45:: with SMTP id x5mr6320148wrw.415.1614905739916; Thu, 04 Mar 2021 16:55:39 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id i8sm1665860wry.90.2021.03.04.16.55.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 16:55:39 -0800 (PST) Message-Id: <3ca16a5e3466914c1c7efa79843395a4dfc3c3f1.1614905738.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 05 Mar 2021 00:55:27 +0000 Subject: [PATCH 01/11] merge-ort: use STABLE_QSORT instead of QSORT where required Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jonathan Nieder , Derrick Stolee , Junio C Hamano , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren rename/rename conflict handling depends on the fact that if both sides renamed the same path, that the one on the MERGE_SIDE1 will appear first in the combined diff_queue_struct passed to process_renames(). Since we add all pairs from MERGE_SIDE1 to combined first, and then all pairs from MERGE_SIDE2, and then sort based on filename, this will only be true if the sort used is stable. This was found due to the fact that Mac, unlike Linux, apparently has a system-defined qsort that is not stable. While we are at it, review the other callers of QSORT and add comments about why they can remain as calls to QSORT instead of being modified to call STABLE_QSORT. Signed-off-by: Elijah Newren --- merge-ort.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/merge-ort.c b/merge-ort.c index 603d30c52170..5309488fd9d8 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -2289,7 +2289,7 @@ static int detect_and_process_renames(struct merge_options *opt, clean &= collect_renames(opt, &combined, MERGE_SIDE2, &renames->dir_renames[1], &renames->dir_renames[2]); - QSORT(combined.queue, combined.nr, compare_pairs); + STABLE_QSORT(combined.queue, combined.nr, compare_pairs); trace2_region_leave("merge", "directory renames", opt->repo); trace2_region_enter("merge", "process renames", opt->repo); @@ -2415,6 +2415,7 @@ static void write_tree(struct object_id *result_oid, */ relevant_entries.items = versions->items + offset; relevant_entries.nr = versions->nr - offset; + /* No need for STABLE_QSORT -- filenames must be unique */ QSORT(relevant_entries.items, relevant_entries.nr, tree_entry_order); /* Pre-allocate some space in buf */ @@ -3190,6 +3191,11 @@ static int record_conflicted_index_entries(struct merge_options *opt, * entries we added to the end into their right locations. */ remove_marked_cache_entries(index, 1); + /* + * No need for STABLE_QSORT -- cmp_cache_name_compare sorts primarily + * on filename and secondarily on stage, and (name, stage #) are a + * unique tuple. + */ QSORT(index->cache, index->cache_nr, cmp_cache_name_compare); return errs; From patchwork Fri Mar 5 00:55:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12117205 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9222EC433E6 for ; Fri, 5 Mar 2021 00:55:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4A8EE64FF0 for ; Fri, 5 Mar 2021 00:55:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232007AbhCEAzn (ORCPT ); Thu, 4 Mar 2021 19:55:43 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57490 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231718AbhCEAzm (ORCPT ); Thu, 4 Mar 2021 19:55:42 -0500 Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A0636C061756 for ; Thu, 4 Mar 2021 16:55:41 -0800 (PST) Received: by mail-wr1-x42a.google.com with SMTP id j2so225738wrx.9 for ; Thu, 04 Mar 2021 16:55:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=+SeWPFdImdnYO4XXes7FXQjYB3PNMLwsm8j9cD3i6nw=; b=uNgaBIInflwpCCr/7T01AySb45Sect38QsxI4WAQC9rFsif29/IF4IE9WLtNhvlPZU u7W3gHfzYhVi6FmMdVdC4gh2CHyfX0FpaDl7uxqfMr0VG66Da6yb+qgTy3uTW0knboii E/9KASk+Yz9b9HxnbES8yBWin49PCmdw2SnNmw7B4HYAUldZUUMafh1jz6QxFvFhryk0 Rhm2ILe8Ksx7K47v94ihSGxQvg5v3UVgc4WvUjuhHvZeirBNJ6QcZMFTBBYrKHwyll7w XBwQ3mNcIa5QOuhMaG1EVZV2ulLxZZl8ZsejjE3Q77AN3D1Nrt8IvS2z4Zej4fcRheFu bEOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=+SeWPFdImdnYO4XXes7FXQjYB3PNMLwsm8j9cD3i6nw=; b=IwRQOlwNPBIQf0999zDmt1cCwRBcb/cgUolX/XjsFaDDu0Zrw38J8qJvQ7UZxkUMC7 BMec6tPxKw1Zfoll+Y92aKCdQxBj8+cEwgaLUu5UbYPglAfp7qaT5Sf44Wo/YZot8HD9 NKlEeQNdZ8ixAheezfFy/ky0g7Vjf/WjX4y5Qw567aDaf4A6XdGxFUEVB2Nawnul+Ivn D7ojdhPJL5DhAObVscJzZyWBYYpw1u6MC+BcpwGDBukvsoJxYLPN3eluErbFPx6zWnOL rnacSVqWFGDL6zYvTW6kk6qts8HTrVhBgZQ01EgckOUSwjaEF8EqHhbzUq8Wvgnxl3al 0XHA== X-Gm-Message-State: AOAM532dGaHORMy5Y+EeqDonR79t9K4S8a1fRxYGpaCGHPpBe3Pzs7QH SQ5IFV4V0wMhTYycBH7cCC2OD8E4ew0= X-Google-Smtp-Source: ABdhPJy+sNw7y4on1fRqq5BdPncpL4hg/oYezjmqbbJgm4DkqBdY1bk7E/9tfkuxju47o8d2lLl22g== X-Received: by 2002:a5d:5411:: with SMTP id g17mr6702996wrv.194.1614905740466; Thu, 04 Mar 2021 16:55:40 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id u137sm1646117wmu.20.2021.03.04.16.55.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 16:55:40 -0800 (PST) Message-Id: <24454e67b186992b9ef7a8ac6f220cbb4aaafd6b.1614905738.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 05 Mar 2021 00:55:28 +0000 Subject: [PATCH 02/11] merge-ort: add a special minimal index just for renormalization Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jonathan Nieder , Derrick Stolee , Junio C Hamano , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren renormalize_buffer() requires an index_state, which is something that merge-ort does not operate with. However, all the renormalization code needs is an index with a .gitattributes file...plus a little bit of setup. Create such an index, along with the deallocation and attr_direction handling. A subsequent commit will add a function to finish the initialization of this index. Signed-off-by: Elijah Newren --- merge-ort.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/merge-ort.c b/merge-ort.c index 5309488fd9d8..d91b66a052b6 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -18,6 +18,7 @@ #include "merge-ort.h" #include "alloc.h" +#include "attr.h" #include "blob.h" #include "cache-tree.h" #include "commit.h" @@ -170,6 +171,16 @@ struct merge_options_internal { */ struct rename_info renames; + /* + * attr_index: hacky minimal index used for renormalization + * + * renormalization code _requires_ an index, though it only needs to + * find a .gitattributes file within the index. So, when + * renormalization is important, we create a special index with just + * that one file. + */ + struct index_state attr_index; + /* * current_dir_name, toplevel_dir: temporary vars * @@ -349,6 +360,9 @@ static void clear_or_reinit_internal_opts(struct merge_options_internal *opti, string_list_clear(&opti->paths_to_free, 0); opti->paths_to_free.strdup_strings = 0; + if (opti->attr_index.cache_nr) + discard_index(&opti->attr_index); + /* Free memory used by various renames maps */ for (i = MERGE_SIDE1; i <= MERGE_SIDE2; ++i) { struct hashmap_iter iter; @@ -3272,6 +3286,8 @@ void merge_finalize(struct merge_options *opt, { struct merge_options_internal *opti = result->priv; + if (opt->renormalize) + git_attr_set_direction(GIT_ATTR_CHECKIN); assert(opt->priv == NULL); clear_or_reinit_internal_opts(opti, 0); @@ -3347,6 +3363,10 @@ static void merge_start(struct merge_options *opt, struct merge_result *result) /* Default to histogram diff. Actually, just hardcode it...for now. */ opt->xdl_opts = DIFF_WITH_ALG(opt, HISTOGRAM_DIFF); + /* Handle attr direction stuff for renormalization */ + if (opt->renormalize) + git_attr_set_direction(GIT_ATTR_CHECKOUT); + /* Initialization of opt->priv, our internal merge data */ trace2_region_enter("merge", "allocate/init", opt->repo); if (opt->priv) { From patchwork Fri Mar 5 00:55:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12117207 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 36E16C433DB for ; Fri, 5 Mar 2021 00:55:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 06BD264F59 for ; Fri, 5 Mar 2021 00:55:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231384AbhCEAzq (ORCPT ); Thu, 4 Mar 2021 19:55:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57498 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231993AbhCEAzm (ORCPT ); Thu, 4 Mar 2021 19:55:42 -0500 Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 44321C061574 for ; Thu, 4 Mar 2021 16:55:42 -0800 (PST) Received: by mail-wr1-x42f.google.com with SMTP id l12so252722wry.2 for ; Thu, 04 Mar 2021 16:55:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=1m5gwebwysSqPY8ol6mtnZ1CYvl2KEt25N49Yi1cJKU=; b=Ac4uXuRph1kWA84HXvzwfcwrwtT74ZcclSt5DdSfAyDzV9yyr1if8+qdB22jRzA3Q7 d5zlh5qg2tub1RBAw+Mto0ywIF9PF3I5jgrLf9tFdm8NzQTjKsC+9FbeDL9kIrDHyINj B27jfPoLE0UL/uGFLB9ydG/JmJyCZuwPXJCprL3wJ3qlWeHPFzKBlzlyl4PbbmyDg/Qi YtBz1XBKvDOLC/GT7x47E9lQKyukZ9aH2CgUJYi6bnz+TBxZJ9//xyoP4RGC/wSX/EeW +zFJMAXebThqEeG7Ldpd+Wh2nUvI2rve6u8Dt5Gw7ggvUNKhiWyJkXBnR9qj1ab1ePDU uodA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=1m5gwebwysSqPY8ol6mtnZ1CYvl2KEt25N49Yi1cJKU=; b=sUjCo/vPrrGq9ps3TK30xBpngcSHlPvCMXvT8OdX9nyyrVl+JjeBxABZmYT0nilRE7 A7no9XyUrq761GfOztjDHWO7CbNEEDskNEC0hnbz44DB1iwDNLEDVh7nxeJ4Zk2SZIm5 JSeQLUQZFAUjxDHeIRmXJub9/DUjuTyRYrSFHqlSUSWkqr1GZOpUApDVoMoXiDT1qc2j rplZeyPsZAi7zJbenbuFzO/HP1ZjXGdwsTJhuoqcM4lSmgZ80UYFfQvi6JMb9LdHOko2 a4mgwtlcbwEEKYs3QfYyfsUYPS58GFq4ljYbVykAtEj7TuCnHD6ulQSyGmvv1dg33diY NyiQ== X-Gm-Message-State: AOAM533D2GxDVU6YMcwLuu8yz1gsbSf5R/E+vXJuMRgknHcUbq78oVuT Gbb8/3eqKb1oWdCT5NFPgjgkwd8NTpg= X-Google-Smtp-Source: ABdhPJyjCDeO36YviyvLpvSHzHOSWGqSyKZvUuDe5gaX3Bez3jVZCtJZ/vbisLqOsZ+PnRUPkZm2Uw== X-Received: by 2002:adf:d236:: with SMTP id k22mr6653858wrh.144.1614905741042; Thu, 04 Mar 2021 16:55:41 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id i10sm1539182wrs.11.2021.03.04.16.55.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 16:55:40 -0800 (PST) Message-Id: <815af5d30ebd5e7f80aa42e4a54808af2e3781e0.1614905738.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 05 Mar 2021 00:55:29 +0000 Subject: [PATCH 03/11] merge-ort: add a function for initializing our special attr_index Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jonathan Nieder , Derrick Stolee , Junio C Hamano , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren Add a function which can be called to populate the attr_index with the appropriate .gitattributes contents when necessary. Make it return early if the attr_index is already initialized or if we are not renormalizing files. NOTE 1: Even if the user has a working copy or a real index (which is not a given as merge-ort can be used in bare repositories), we explicitly ignore any .gitattributes file from either of these locations. merge-ort can be used to merge two branches that are unrelated to HEAD, so .gitattributes from the working copy and current index should not be considered relevant. NOTE 2: Since we are in the middle of merging, there is a risk that .gitattributes itself is conflicted...leaving us with an ill-defined situation about how to perform the rest of the merge. It could be that the .gitattributes file does not even exist on one of the sides of the merge, or that it has been modified on both sides. If it's been modified on both sides, it's possible that it could itself be merged cleanly, though it's also possible that it only merges cleanly if you use the right version of the .gitattributes file to drive the merge. It gets kind of complicated. The only test we ever had that attempted to test behavior in this area was seemingly unaware of the undefined behavior, but knew the test wouldn't work for lack of attribute handling support, marked it as test_expect_failure from the beginning, but managed to fail for several reasons unrelated to attribute handling. See commit 6f6e7cfb52 ("t6038: remove problematic test", 2020-08-03) for details. So there are probably various ways to improve what initialize_attr_index() picks in the case of a conflicted .gitattributes but for now I just implemented something simple -- look for whatever .gitattributes file we can find in any of the higher order stages and use it. Signed-off-by: Elijah Newren --- merge-ort.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/merge-ort.c b/merge-ort.c index d91b66a052b6..028d1adcd2c9 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -988,6 +988,67 @@ static int merge_submodule(struct merge_options *opt, return 0; } +MAYBE_UNUSED +static void initialize_attr_index(struct merge_options *opt) +{ + /* + * The renormalize_buffer() functions require attributes, and + * annoyingly those can only be read from the working tree or from + * an index_state. merge-ort doesn't have an index_state, so we + * generate a fake one containing only attribute information. + */ + struct merged_info *mi; + struct index_state *attr_index = &opt->priv->attr_index; + struct cache_entry *ce; + + if (!opt->renormalize) + return; + + if (attr_index->initialized) + return; + attr_index->initialized = 1; + + mi = strmap_get(&opt->priv->paths, GITATTRIBUTES_FILE); + if (!mi) + return; + + if (mi->clean) { + int len = strlen(GITATTRIBUTES_FILE); + ce = make_empty_cache_entry(attr_index, len); + ce->ce_mode = create_ce_mode(mi->result.mode); + ce->ce_flags = create_ce_flags(0); + ce->ce_namelen = len; + oidcpy(&ce->oid, &mi->result.oid); + memcpy(ce->name, GITATTRIBUTES_FILE, len); + add_index_entry(attr_index, ce, + ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE); + get_stream_filter(attr_index, GITATTRIBUTES_FILE, &ce->oid); + } + else { + int stage, len; + struct conflict_info *ci; + + ASSIGN_AND_VERIFY_CI(ci, mi); + for (stage=0; stage<3; ++stage) { + unsigned stage_mask = (1 << stage); + + if (!(ci->filemask & stage_mask)) + continue; + len = strlen(GITATTRIBUTES_FILE); + ce = make_empty_cache_entry(attr_index, len); + ce->ce_mode = create_ce_mode(ci->stages[stage].mode); + ce->ce_flags = create_ce_flags(stage); + ce->ce_namelen = len; + oidcpy(&ce->oid, &ci->stages[stage].oid); + memcpy(ce->name, GITATTRIBUTES_FILE, len); + add_index_entry(attr_index, ce, + ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE); + get_stream_filter(attr_index, GITATTRIBUTES_FILE, + &ce->oid); + } + } +} + static int merge_3way(struct merge_options *opt, const char *path, const struct object_id *o, From patchwork Fri Mar 5 00:55:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12117209 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 373E9C433E6 for ; Fri, 5 Mar 2021 00:55:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0AF5E64FD3 for ; Fri, 5 Mar 2021 00:55:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232063AbhCEAzr (ORCPT ); Thu, 4 Mar 2021 19:55:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57500 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232016AbhCEAzn (ORCPT ); Thu, 4 Mar 2021 19:55:43 -0500 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AC87DC061756 for ; Thu, 4 Mar 2021 16:55:42 -0800 (PST) Received: by mail-wr1-x435.google.com with SMTP id b18so235480wrn.6 for ; Thu, 04 Mar 2021 16:55:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=z/aJo75dNhsQ7aTf5zagZWSLinhoohO+zk07aKf06jI=; b=KcALPoxPerN6b1KIiITkWQ/SFnDWz62CW9EZtS63A6S4mIVyiXcCL48ijy3q4de86n qYQfAZsPs9d9SO/lypHPlW/dpI+8a9V0oPbHmsP4DIeGlxjeJ1Uase/ksTyPafFwN2ms hx0cwL4G/S4OOQC5cXej6O3/02MzYxwAZ1Zpb1o0LKOCKn+NVCzS99vxbYRyQnybXW0a XAe09cnOssfF2KiUf90tvFsJ/8rFNPdL79HN3wK2SDUhVwbURlO/SuLEqwgD5qiCLMMF UtiMLabLqPsuki8u4y95/NVv1XXal0rH0y+U9Y8MaL+TVKsSFOFa7UHovTRSWn4IlgJ0 uTnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=z/aJo75dNhsQ7aTf5zagZWSLinhoohO+zk07aKf06jI=; b=YWnfNoKxXzGvMKM6QkJ/PeTK3EhPUwpcENrnYRkvMelFx1V/FwJVSDiyGFT3SPyW/i LEH9ieQXx8U3yYzsen+HGKfZv4vL/KklklU8Jzu+FnTp6jegCoc9qaITU/oJTi0rb/iP Wp/rg2wTCbcxTxS4N7d9ssqfPd7ImK+R24RrYFsYMap+f6v93Ix/WILe1+Jha/6MT6Xd EODa5lDpuZqFHJv82cPxUxp5gP2Lbez16E1OLvZB93ppmthJ977nQZ5BDrvW5auDxTSJ 4sHItL+N838XJJC4WkhyN0ui3kW282U6zipTz2WYBkFaISoLC3+RX5wHeUGE10m3xxln yvEQ== X-Gm-Message-State: AOAM533Iy7TQb+iLyBkeXXD4uIKhb6ZxnSc3eF4vLp7d1SsnHhgh2Y5R S/8FgYIOTLqGFFT8xISN5gojKX28S10= X-Google-Smtp-Source: ABdhPJwtiAE5v4bqiJFNtmDLESHeOEeA7E5OiK/SvOv21POfEFyww9JBKD0ircVwfnPQafScc8TfpA== X-Received: by 2002:adf:e94a:: with SMTP id m10mr6519598wrn.55.1614905741566; Thu, 04 Mar 2021 16:55:41 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id 91sm1768662wrl.20.2021.03.04.16.55.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 16:55:41 -0800 (PST) Message-Id: In-Reply-To: References: Date: Fri, 05 Mar 2021 00:55:30 +0000 Subject: [PATCH 04/11] merge-ort: have ll_merge() calls use the attr_index for renormalization Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jonathan Nieder , Derrick Stolee , Junio C Hamano , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren ll_merge() needs an index when renormalization is requested. Give it the special one we created exactly for that purpose. This fixes t6418.4 and t6418.5 under GIT_TEST_MERGE_ALGORITHM=ort. Signed-off-by: Elijah Newren --- merge-ort.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/merge-ort.c b/merge-ort.c index 028d1adcd2c9..87c553c0882c 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -360,7 +360,7 @@ static void clear_or_reinit_internal_opts(struct merge_options_internal *opti, string_list_clear(&opti->paths_to_free, 0); opti->paths_to_free.strdup_strings = 0; - if (opti->attr_index.cache_nr) + if (opti->attr_index.cache_nr) /* true iff opt->renormalize */ discard_index(&opti->attr_index); /* Free memory used by various renames maps */ @@ -988,7 +988,6 @@ static int merge_submodule(struct merge_options *opt, return 0; } -MAYBE_UNUSED static void initialize_attr_index(struct merge_options *opt) { /* @@ -1063,6 +1062,8 @@ static int merge_3way(struct merge_options *opt, char *base, *name1, *name2; int merge_status; + initialize_attr_index(opt); + ll_opts.renormalize = opt->renormalize; ll_opts.extra_marker_size = extra_marker_size; ll_opts.xdl_opts = opt->xdl_opts; @@ -1101,7 +1102,7 @@ static int merge_3way(struct merge_options *opt, merge_status = ll_merge(result_buf, path, &orig, base, &src1, name1, &src2, name2, - opt->repo->index, &ll_opts); + &opt->priv->attr_index, &ll_opts); free(base); free(name1); From patchwork Fri Mar 5 00:55:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12117211 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0EEE9C433E0 for ; Fri, 5 Mar 2021 00:55:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CEB836500A for ; Fri, 5 Mar 2021 00:55:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232002AbhCEAzs (ORCPT ); Thu, 4 Mar 2021 19:55:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57504 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232024AbhCEAzn (ORCPT ); Thu, 4 Mar 2021 19:55:43 -0500 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 42BB4C06175F for ; Thu, 4 Mar 2021 16:55:43 -0800 (PST) Received: by mail-wr1-x42b.google.com with SMTP id u14so248341wri.3 for ; Thu, 04 Mar 2021 16:55:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=2XHT0qtqnB4tNtQ0moq3xlQD5oEUDKqsLTsQNqfCRBk=; b=Hez0efFKxol3PEfuAMtSMu0UOEniaU5QI9Oxkn8jsZ1wh8ANUl7pN8FcQOaOp1JbZh muSESHKWi4Y3fdEH1qVAUFxZxj7vezt+S+MkZjQL+zV+HHfD/ibd6+JGU1FalYx/2mqk Qn1Uxra/WbwDDqAsTnc3UWdzDeQmaDe2CDUWniPE/ZncTW8HYdqi2D5EiyxMfDFhxCXF B9J7F+gHw+xtvpqKJPiH/pR0r84kMJIMvJsB9X1CGBtYkEBUkvzR8LPoMsptX/ty7lRt aiXvYKrfTbCV/VVMTlrUahU8/rUz2J+ghhTou/+vCpTcBX+YZHnWvyyJWFTQoMIBriT/ ukZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=2XHT0qtqnB4tNtQ0moq3xlQD5oEUDKqsLTsQNqfCRBk=; b=Hev4+l0uSH0Ha+hJnmQx8CZQWxEH9K4I0Q/oDf2DopMX2aXQiZaB50tNQfK4cFfShx PSEpkiDjBpi1ClleVw2/rs0L+v5zIAdCLJ9LYwVHLec2ZzgN/a5fHNfqndZV7JqGRWIx x+kWQJwT/xoqHrZ+WYDH7Cc6qhVxqYg5nXRdYiaelSvFQLJGGkMPCIfyhgft2xjt7ioT pgeUzpVm4W38MPozDQxu8wLcEHrUeQD4UPoM55doa1C3T/4igjBBFU1f6CKUWW1nRzBC IxrYGQXXc3CBKzP9sRohYNwmO7Ue2lfj4s3sRfmt5rGc940c+ZM9trN877KwB6qO4ru1 RqJw== X-Gm-Message-State: AOAM532kmqFQKtbaj+mokKOHDrfPMSUQHtd3BuMd1t71xQ7tcyM3Rmgx 2DFXTJZY6dM+fCqg1lb/Z2bwBgeBsRk= X-Google-Smtp-Source: ABdhPJxWeuEBbelUbODEjQJmhQfdpT3Kce0+fLkbnjW8gnx0AN+PhLl2Jbb7DdmNfM5W6kWIL//czw== X-Received: by 2002:a5d:4e8d:: with SMTP id e13mr6844532wru.251.1614905742091; Thu, 04 Mar 2021 16:55:42 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id o13sm1707852wro.15.2021.03.04.16.55.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 16:55:41 -0800 (PST) Message-Id: In-Reply-To: References: Date: Fri, 05 Mar 2021 00:55:31 +0000 Subject: [PATCH 05/11] merge-ort: let renormalization change modify/delete into clean delete Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jonathan Nieder , Derrick Stolee , Junio C Hamano , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren When we have a modify/delete conflict, but the only change to the modification is e.g. change of line endings, then if renormalization is requested then we should be able to recognize such a case as a not-modified/delete and resolve the conflict automatically. This fixes t6418.10 under GIT_TEST_MERGE_ALGORITHM=ort. Signed-off-by: Elijah Newren --- merge-ort.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/merge-ort.c b/merge-ort.c index 87c553c0882c..c4bd88b9d3db 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -2416,6 +2416,60 @@ static int string_list_df_name_compare(const char *one, const char *two) return onelen - twolen; } +static int read_oid_strbuf(struct merge_options *opt, + const struct object_id *oid, + struct strbuf *dst) +{ + void *buf; + enum object_type type; + unsigned long size; + buf = read_object_file(oid, &type, &size); + if (!buf) + return err(opt, _("cannot read object %s"), oid_to_hex(oid)); + if (type != OBJ_BLOB) { + free(buf); + return err(opt, _("object %s is not a blob"), oid_to_hex(oid)); + } + strbuf_attach(dst, buf, size, size + 1); + return 0; +} + +static int blob_unchanged(struct merge_options *opt, + const struct version_info *base, + const struct version_info *side, + const char *path) +{ + struct strbuf basebuf = STRBUF_INIT; + struct strbuf sidebuf = STRBUF_INIT; + int ret = 0; /* assume changed for safety */ + const struct index_state *idx = &opt->priv->attr_index; + + initialize_attr_index(opt); + + if (base->mode != side->mode) + return 0; + if (oideq(&base->oid, &side->oid)) + return 1; + + if (read_oid_strbuf(opt, &base->oid, &basebuf) || + read_oid_strbuf(opt, &side->oid, &sidebuf)) + goto error_return; + /* + * Note: binary | is used so that both renormalizations are + * performed. Comparison can be skipped if both files are + * unchanged since their sha1s have already been compared. + */ + if (renormalize_buffer(idx, path, basebuf.buf, basebuf.len, &basebuf) | + renormalize_buffer(idx, path, sidebuf.buf, sidebuf.len, &sidebuf)) + ret = (basebuf.len == sidebuf.len && + !memcmp(basebuf.buf, sidebuf.buf, basebuf.len)); + +error_return: + strbuf_release(&basebuf); + strbuf_release(&sidebuf); + return ret; +} + struct directory_versions { /* * versions: list of (basename -> version_info) @@ -3003,8 +3057,13 @@ static void process_entry(struct merge_options *opt, modify_branch = (side == 1) ? opt->branch1 : opt->branch2; delete_branch = (side == 1) ? opt->branch2 : opt->branch1; - if (ci->path_conflict && - oideq(&ci->stages[0].oid, &ci->stages[side].oid)) { + if (opt->renormalize && + blob_unchanged(opt, &ci->stages[0], &ci->stages[side], + path)) { + ci->merged.is_null = 1; + ci->merged.clean = 1; + } else if (ci->path_conflict && + oideq(&ci->stages[0].oid, &ci->stages[side].oid)) { /* * This came from a rename/delete; no action to take, * but avoid printing "modify/delete" conflict notice From patchwork Fri Mar 5 00:55:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12117213 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 77ACDC433E6 for ; Fri, 5 Mar 2021 00:55:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2DBAD6500A for ; Fri, 5 Mar 2021 00:55:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232101AbhCEAzs (ORCPT ); Thu, 4 Mar 2021 19:55:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57506 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231718AbhCEAzo (ORCPT ); Thu, 4 Mar 2021 19:55:44 -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 BE5BDC061760 for ; Thu, 4 Mar 2021 16:55:43 -0800 (PST) Received: by mail-wr1-x431.google.com with SMTP id d11so232377wrj.7 for ; Thu, 04 Mar 2021 16:55:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=ZzgMfaPXSLniEgS5NzuFkxH1zntUo1RC9iPpEaSe0jk=; b=USxzTgDjgu953EDJJpVZSahPRx3Mvyx1Sr3/eCZwPfRn7uM+cObheWeWlsJDnsIal1 5O0QpELWGyxlCAeFMiMppZXZszKivcaRG6s2NmZzPmNJSdLinY6aRWnFa8a+zgCf0ri5 UjnZQg6NM0dw/8IvEj5dcH8FNKzlceiisg/4wuKqPwJ+ehKAtJE6khEDXcipWYEJMn6w uAWRKcfp9munFF4GTJEhwtpKNjb523L4kivPGs1YYFGVfcbcDSrPzZghPN9IgYDR2MNt wYPrN7ncn+CjZ5xmEtBXBAh4VG0gs4P6ZLtnaS7eR8wo2pN+wljjrlTQK7C14fs/oKr3 re0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=ZzgMfaPXSLniEgS5NzuFkxH1zntUo1RC9iPpEaSe0jk=; b=RHC+p6rpDe2D1CUXkxa1Ne0Dl7Hgl/Ct5x8m97uU4t7OmiFP/mhAvaA/SFH/a8yFCW j43KdCdwDvPxP/lGUw1NWiIQNU55h0V43utjcsrTvNXc8Bai2HpUfLI9v+uL2fXsr+uq Bmj7xSh5baW7qIPxytpsJpQEl9c8voIma1KtYbkdmoh2ivXiJDlA3jxmZmQYDHemOcTE ThpMmLQBBfOC7XjOlB/balFVfzbLGs3FKBHE/DqnncYaa3zH9Ef5iFxoW5Cz2KGkaGL+ gtM6K8zfhGxx69p/+eTpqhxjmIXV+IZC5vYrzyHylLK2OPJm9bFv076nvbzQCiqiPsQf 3GUw== X-Gm-Message-State: AOAM530I0R52driOKG6AVmGhFaUUkylEc1SmXnzTt7FZ5bJQ2WkTQnDn eRrn7r4j4bQ4IF0WLQyHc0v7CY+2pyk= X-Google-Smtp-Source: ABdhPJyinJKJrLciuVrkxQGHvnem3YQAeG0LzaHnBh9kJQYdSoMWsVDUj0JMF6v9iE0wy0tdChZpPQ== X-Received: by 2002:a5d:684d:: with SMTP id o13mr6769826wrw.235.1614905742631; Thu, 04 Mar 2021 16:55:42 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id w18sm1635751wrr.7.2021.03.04.16.55.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 16:55:42 -0800 (PST) Message-Id: In-Reply-To: References: Date: Fri, 05 Mar 2021 00:55:32 +0000 Subject: [PATCH 06/11] merge-ort: support subtree shifting Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jonathan Nieder , Derrick Stolee , Junio C Hamano , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren merge-recursive has some simple code to support subtree shifting; copy it over to merge-ort. This fixes t6409.12 under GIT_TEST_MERGE_ALGORITHM=ort. Signed-off-by: Elijah Newren --- merge-ort.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/merge-ort.c b/merge-ort.c index c4bd88b9d3db..a998f843a1da 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -3417,6 +3417,23 @@ void merge_finalize(struct merge_options *opt, /*** Function Grouping: helper functions for merge_incore_*() ***/ +static struct tree *shift_tree_object(struct repository *repo, + struct tree *one, struct tree *two, + const char *subtree_shift) +{ + struct object_id shifted; + + if (!*subtree_shift) { + shift_tree(repo, &one->object.oid, &two->object.oid, &shifted, 0); + } else { + shift_tree_by(repo, &one->object.oid, &two->object.oid, &shifted, + subtree_shift); + } + if (oideq(&two->object.oid, &shifted)) + return two; + return lookup_tree(repo, &shifted); +} + static inline void set_commit_tree(struct commit *c, struct tree *t) { c->maybe_tree = t; @@ -3544,6 +3561,13 @@ static void merge_ort_nonrecursive_internal(struct merge_options *opt, { struct object_id working_tree_oid; + if (opt->subtree_shift) { + side2 = shift_tree_object(opt->repo, side1, side2, + opt->subtree_shift); + merge_base = shift_tree_object(opt->repo, side1, merge_base, + opt->subtree_shift); + } + trace2_region_enter("merge", "collect_merge_info", opt->repo); if (collect_merge_info(opt, merge_base, side1, side2) != 0) { /* From patchwork Fri Mar 5 00:55:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12117215 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B6B6CC433DB for ; Fri, 5 Mar 2021 00:55:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8AC3E6500A for ; Fri, 5 Mar 2021 00:55:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232136AbhCEAzu (ORCPT ); Thu, 4 Mar 2021 19:55:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57516 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231402AbhCEAzp (ORCPT ); Thu, 4 Mar 2021 19:55:45 -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 75AD6C061762 for ; Thu, 4 Mar 2021 16:55:44 -0800 (PST) Received: by mail-wr1-x42c.google.com with SMTP id f12so227558wrx.8 for ; Thu, 04 Mar 2021 16:55:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=XXkada0tjiFQqfS5wUUxv6rDq4t4jraSD+9f2/tJEHk=; b=VtiUjj6o/39d0dJgZ0CcYycu5U3CU+IslD65EiPU7nhOrnw6KANyGodCaiCKMZqeb0 BVrE9n9LhlOfBsCRy8sFTsdI5IGiCEDIZWiecX3CINPW7belopR/Zxtn0lbN74f4r0Ee MmIxf15+1dAtigGUEqTNJcrpJYiBXDx/PI9SQ+JVvMSOmyDkC0qJ2HZDtqYRZ//Djnr7 76kHvDZj3oxJ73M0LpKPi3LtYWJI7jmXZQjrj5pguPHEeb3t9bmB0TBZsn+LcPzT3fAS cc5vBCcyMSLcSphg+0MEi4omA1ud3MHWd+sycwIEHtgKC+N/DcgkP1P+uUZ7bR7Iy7fQ wsgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=XXkada0tjiFQqfS5wUUxv6rDq4t4jraSD+9f2/tJEHk=; b=qKA/iLIWEFD5KRbWs/cXjoBk6PfRYaxGXeB416RxhyLZvMZVafWe4GLRuarEo6c/Rk aGrejdOODqEJMFzB8c4NgggGdDvwzv7J20rZl5DbnU3j1kPiv08pwt44EZAHQs0zA+hp QTI6rGxToMw1gyR8cBNtm7ipttDztSQVHU2fx0xjhtWMp7joXSB9PIIyAHHcAkQLkjhQ jZZ/+mlMMrvMCTsAeLqiF1DB5Q2fd31Vm1l+9rIgsv7i57ogtw/aluV/BERUY0950jq/ 0T5/Od67zmdPqv7AkWa7OB6lhFqO9Id+gfvve7VIVVptsctYJbjEfgoOiFdudhu29HCA RDsw== X-Gm-Message-State: AOAM530IBcTOHOQ6VAlUfWkMj8jSyEwLtRGz7Y8xqiIVcICCs1qZV5pQ jRDoNNwhb8gtfhezOAo6b5oe/pdbRYQ= X-Google-Smtp-Source: ABdhPJwMVw3C7RZQkYO+v0Wt+5XZkTRwxQ+of2cGa9Y4Hsw0V2YTOhStkBsJO7uAAZq+GVg/yGRK3w== X-Received: by 2002:adf:f905:: with SMTP id b5mr6305896wrr.129.1614905743160; Thu, 04 Mar 2021 16:55:43 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id i26sm1825621wmb.18.2021.03.04.16.55.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 16:55:42 -0800 (PST) Message-Id: <6ccb24b557fc9c9d8e3d307d3e142d8393920414.1614905738.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 05 Mar 2021 00:55:33 +0000 Subject: [PATCH 07/11] t6428: new test for SKIP_WORKTREE handling and conflicts Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jonathan Nieder , Derrick Stolee , Junio C Hamano , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren If there is a conflict during a merge for a SKIP_WORKTREE entry, we expect that file to be written to the working copy and have the SKIP_WORKTREE bit cleared in the index. If the user had manually created a file in the working tree despite SKIP_WORKTREE being set, we do not want to clobber their changes to that file, but want to move it out of the way. Add tests that check for these behaviors. Signed-off-by: Elijah Newren --- t/t6428-merge-conflicts-sparse.sh | 158 ++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100755 t/t6428-merge-conflicts-sparse.sh diff --git a/t/t6428-merge-conflicts-sparse.sh b/t/t6428-merge-conflicts-sparse.sh new file mode 100755 index 000000000000..1bb52ff6f38c --- /dev/null +++ b/t/t6428-merge-conflicts-sparse.sh @@ -0,0 +1,158 @@ +#!/bin/sh + +test_description="merge cases" + +# The setup for all of them, pictorially, is: +# +# A +# o +# / \ +# O o ? +# \ / +# o +# B +# +# To help make it easier to follow the flow of tests, they have been +# divided into sections and each test will start with a quick explanation +# of what commits O, A, and B contain. +# +# Notation: +# z/{b,c} means files z/b and z/c both exist +# x/d_1 means file x/d exists with content d1. (Purpose of the +# underscore notation is to differentiate different +# files that might be renamed into each other's paths.) + +. ./test-lib.sh +. "$TEST_DIRECTORY"/lib-merge.sh + + +# Testcase basic, conflicting changes in 'numerals' + +test_setup_numerals () { + test_create_repo numerals_$1 && + ( + cd numerals_$1 && + + >README && + test_write_lines I II III >numerals && + git add README numerals && + test_tick && + git commit -m "O" && + + git branch O && + git branch A && + git branch B && + + git checkout A && + test_write_lines I II III IIII >numerals && + git add numerals && + test_tick && + git commit -m "A" && + + git checkout B && + test_write_lines I II III IV >numerals && + git add numerals && + test_tick && + git commit -m "B" && + + cat <<-EOF >expected-index && + H README + M numerals + M numerals + M numerals + EOF + + cat <<-EOF >expected-merge + I + II + III + <<<<<<< HEAD + IIII + ======= + IV + >>>>>>> B^0 + EOF + + ) +} + +test_expect_merge_algorithm success failure 'conflicting entries written to worktree even if sparse' ' + test_setup_numerals plain && + ( + cd numerals_plain && + + git checkout A^0 && + + test_path_is_file README && + test_path_is_file numerals && + + git sparse-checkout init && + git sparse-checkout set README && + + test_path_is_file README && + test_path_is_missing numerals && + + test_must_fail git merge -s recursive B^0 && + + git ls-files -t >index_files && + test_cmp expected-index index_files && + + test_path_is_file README && + test_path_is_file numerals && + + test_cmp expected-merge numerals && + + # 4 other files: + # * expected-merge + # * expected-index + # * index_files + # * others + git ls-files -o >others && + test_line_count = 4 others + ) +' + +test_expect_merge_algorithm failure failure 'present-despite-SKIP_WORKTREE handled reasonably' ' + test_setup_numerals in_the_way && + ( + cd numerals_in_the_way && + + git checkout A^0 && + + test_path_is_file README && + test_path_is_file numerals && + + git sparse-checkout init && + git sparse-checkout set README && + + test_path_is_file README && + test_path_is_missing numerals && + + echo foobar >numerals && + + test_must_fail git merge -s recursive B^0 && + + git ls-files -t >index_files && + test_cmp expected-index index_files && + + test_path_is_file README && + test_path_is_file numerals && + + test_cmp expected-merge numerals && + + # There should still be a file with "foobar" in it + grep foobar * && + + # 5 other files: + # * expected-merge + # * expected-index + # * index_files + # * others + # * whatever name was given to the numerals file that had + # "foobar" in it + git ls-files -o >others && + test_line_count = 5 others + ) +' + +test_done From patchwork Fri Mar 5 00:55:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12117217 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B26DEC433E6 for ; Fri, 5 Mar 2021 00:55:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7C4C16500D for ; Fri, 5 Mar 2021 00:55:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232145AbhCEAzv (ORCPT ); Thu, 4 Mar 2021 19:55:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232046AbhCEAzp (ORCPT ); Thu, 4 Mar 2021 19:55:45 -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 EE7C2C061764 for ; Thu, 4 Mar 2021 16:55:44 -0800 (PST) Received: by mail-wm1-x334.google.com with SMTP id n11-20020a05600c4f8bb029010e5cf86347so29285wmq.1 for ; Thu, 04 Mar 2021 16:55:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=YNuqdkSwV2cIic9vEbecM9+TnslptJncu2l6f6dvy1g=; b=ffwXLIG5I29NKm7Eu0zpHFTGpEAGYF0FUKlqswnnHfYWMVbbI/DHByT4HMCuTwDOf8 PsBu9O1eG0+8D98er6pLKRntgbIBdlhigu0EPSzrtvg9a11cH1e53DlOPmYUH86pRTUQ 3E6JAT8rF/c/9J81/gru2jyi2Ak3NEArxlQi8dbNw2j3WfHSIsLFmqZT3EZ02lAXlIyj 0//Wm/CS+kYXCoFqao3pxS5mWKK89EefkiWD0ZpNVZuWTiIFXyTJz+Ina83ugkpPExDZ 1SuCscNC1zduMElfsH4Skmibu0BIpF2YqoRUP7v31TZB63ynW4OvJQQ1jPp5GMNJX4Hr ldaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=YNuqdkSwV2cIic9vEbecM9+TnslptJncu2l6f6dvy1g=; b=E3zjkkyn9tCc6854XyscUobRAKZVdSg0/DrjAAKHwWwLLEGxDdiokwlWmIdmrkqBIn FzbSPwPjbHXYsIVI2wzfaskdGTsRDEl1X8pk2qRWDBVIN0++7eCR5+DkWtV/CnOyjH0k HuBuPKMtBebYe2zm+5+k0bgZJwKuHR3q0RfovDZhYrpY2xF8EAI50StkEm1l39JxE8Bi tfzp5dBSnTr9bxL66/6pMdvHdzPdh3H9cHtk3PGKAO+5vp2AKoMOYpEzriT1hb0eNXau uadhZMDwas50cyVYe3ikEqiP11QF3jlNRuMBCiSKz8ArsBmNQR7RetEt8Qc/YVDKWQYC 7kug== X-Gm-Message-State: AOAM530gUy1F9MAPeLf3nP3uHi/sPIl4/hkF0Igl/3a/sLLyluGS5EAp 4ZhmMM/NrWijUJAyMP6HNeMS8akd5+Y= X-Google-Smtp-Source: ABdhPJwUJ0yXwcdInQbdKqYXMB94InypJOPs9eyWbusJTCCEcXLApynnFPdc28Xq4Y3m8iLfXzBLDQ== X-Received: by 2002:a1c:730a:: with SMTP id d10mr6184668wmb.53.1614905743700; Thu, 04 Mar 2021 16:55:43 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id a75sm1804391wme.10.2021.03.04.16.55.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 16:55:43 -0800 (PST) Message-Id: <100c0187bdfeef5c560ecd17160ed7c9a3032156.1614905738.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 05 Mar 2021 00:55:34 +0000 Subject: [PATCH 08/11] merge-ort: implement CE_SKIP_WORKTREE handling with conflicted entries Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jonathan Nieder , Derrick Stolee , Junio C Hamano , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren When merge conflicts occur in paths removed by a sparse-checkout, we need to unsparsify those paths (clear the SKIP_WORKTREE bit), and write out the conflicted file to the working copy. In the very unlikely case that someone manually put a file into the working copy at the location of the SKIP_WORKTREE file, we need to avoid overwriting whatever edits they have made and move that file to a different location first. Signed-off-by: Elijah Newren --- merge-ort.c | 43 +++++++++++++++++++++---------- t/t6428-merge-conflicts-sparse.sh | 4 +-- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/merge-ort.c b/merge-ort.c index a998f843a1da..37b69cbe0f9a 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -3235,23 +3235,27 @@ static int checkout(struct merge_options *opt, return ret; } -static int record_conflicted_index_entries(struct merge_options *opt, - struct index_state *index, - struct strmap *paths, - struct strmap *conflicted) +static int record_conflicted_index_entries(struct merge_options *opt) { struct hashmap_iter iter; struct strmap_entry *e; + struct index_state *index = opt->repo->index; + struct checkout state = CHECKOUT_INIT; int errs = 0; int original_cache_nr; - if (strmap_empty(conflicted)) + if (strmap_empty(&opt->priv->conflicted)) return 0; + /* If any entries have skip_worktree set, we'll have to check 'em out */ + state.force = 1; + state.quiet = 1; + state.refresh_cache = 1; + state.istate = index; original_cache_nr = index->cache_nr; /* Put every entry from paths into plist, then sort */ - strmap_for_each_entry(conflicted, &iter, e) { + strmap_for_each_entry(&opt->priv->conflicted, &iter, e) { const char *path = e->key; struct conflict_info *ci = e->value; int pos; @@ -3292,9 +3296,23 @@ static int record_conflicted_index_entries(struct merge_options *opt, * the higher order stages. Thus, we need override * the CE_SKIP_WORKTREE bit and manually write those * files to the working disk here. - * - * TODO: Implement this CE_SKIP_WORKTREE fixup. */ + if (ce_skip_worktree(ce)) { + struct stat st; + + if (!lstat(path, &st)) { + char *new_name = unique_path(&opt->priv->paths, + path, + "cruft"); + + path_msg(opt, path, 1, + _("Note: %s not up to date and in way of checking out conflicted version; old copy renamed to %s"), + path, new_name); + errs |= rename(path, new_name); + free(new_name); + } + errs |= checkout_entry(ce, &state, NULL, NULL); + } /* * Mark this cache entry for removal and instead add @@ -3344,8 +3362,6 @@ void merge_switch_to_result(struct merge_options *opt, { assert(opt->priv == NULL); if (result->clean >= 0 && update_worktree_and_index) { - struct merge_options_internal *opti = result->priv; - trace2_region_enter("merge", "checkout", opt->repo); if (checkout(opt, head, result->tree)) { /* failure to function */ @@ -3355,13 +3371,14 @@ void merge_switch_to_result(struct merge_options *opt, trace2_region_leave("merge", "checkout", opt->repo); trace2_region_enter("merge", "record_conflicted", opt->repo); - if (record_conflicted_index_entries(opt, opt->repo->index, - &opti->paths, - &opti->conflicted)) { + opt->priv = result->priv; + if (record_conflicted_index_entries(opt)) { /* failure to function */ + opt->priv = NULL; result->clean = -1; return; } + opt->priv = NULL; trace2_region_leave("merge", "record_conflicted", opt->repo); } diff --git a/t/t6428-merge-conflicts-sparse.sh b/t/t6428-merge-conflicts-sparse.sh index 1bb52ff6f38c..7e8bf497f821 100755 --- a/t/t6428-merge-conflicts-sparse.sh +++ b/t/t6428-merge-conflicts-sparse.sh @@ -76,7 +76,7 @@ test_setup_numerals () { ) } -test_expect_merge_algorithm success failure 'conflicting entries written to worktree even if sparse' ' +test_expect_success 'conflicting entries written to worktree even if sparse' ' test_setup_numerals plain && ( cd numerals_plain && @@ -112,7 +112,7 @@ test_expect_merge_algorithm success failure 'conflicting entries written to work ) ' -test_expect_merge_algorithm failure failure 'present-despite-SKIP_WORKTREE handled reasonably' ' +test_expect_merge_algorithm failure success 'present-despite-SKIP_WORKTREE handled reasonably' ' test_setup_numerals in_the_way && ( cd numerals_in_the_way && From patchwork Fri Mar 5 00:55:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12117219 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A7D79C433E9 for ; Fri, 5 Mar 2021 00:55:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7B74A6500D for ; Fri, 5 Mar 2021 00:55:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232167AbhCEAzw (ORCPT ); Thu, 4 Mar 2021 19:55:52 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57522 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231997AbhCEAzp (ORCPT ); Thu, 4 Mar 2021 19:55:45 -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 7C8EDC061574 for ; Thu, 4 Mar 2021 16:55:45 -0800 (PST) Received: by mail-wr1-x42e.google.com with SMTP id u16so256089wrt.1 for ; Thu, 04 Mar 2021 16:55:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=kFAR3lPFyTOoA/h/2yvQnPWqUxpbDTIwz7iQYMsYeSA=; b=GB65Nh9o/rMET0qkI2IvMc40Mv1gt/M0TM7VP1WfHvhtlP06nMa5Va4jtO4qbHuEvX +fCNZNIHaoN36LwfxNO4MUOD0Tca76JZtE5xzgFpFXTXyXZ9ijP8Dix7MeI7UMXeLfVU LTHcbAqOasyNwA7sGZcnSxNvwFtUd6tJ6WenqEW6Yh2jtIJ1RnhmSm1kc+TiljprVUAa I8iaDlxc2IBCkWbdZKBB7prpBdVJTLhtlrHfQXv7Pu4+874GfEQQrJSEhUtG+BJZakvm j7H9pmLcjgUmtGjBl3SJccakW5r3vcX4sCpF6HIXeeiXr0CmQfYBUrKHrHx4SBWEtXzt 6c+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=kFAR3lPFyTOoA/h/2yvQnPWqUxpbDTIwz7iQYMsYeSA=; b=QmDFudihxm9LTP06zc9D1cLR4eXZN3nIpaS88Py+9dz3LeN/RAMSvX/ZmXWzdFAxM+ 7LTAUe4aUS2aAezSwqHOXyKl6qtluSjrGRGUvp7WVUU4CE8LA42d3S5SUTf+odI0WSRj tUdQA8/yYwZVahRl/9slW0R4BUdsuFI/YAnDEqETkxOqdOYfecNVCnClKVaec/T/omXl 4tIIupHyYs3sFVGoM95JEEyvQFyjw1+44VtYz4sERISlbaTHQJMN3e675LLVK+AYxSh8 jbQw6vC3L83CqfJ67JCdNvVmVWEMnsNy5Sxn2uuYwzpE4W4ulWzs8tQIDSq9gbvy/0iQ 4zbQ== X-Gm-Message-State: AOAM5320fqwq6735g8YqkRE/D8kXKXVwfyN/IJVjo31H13lANAljRVPd OVRWOkvzjoI9RkrEUtLG8f9aMvfBH8Q= X-Google-Smtp-Source: ABdhPJyf6oCkWdi9Azm6M1GD8bNuNioOpQ21HLydiSZY/SMK5T5rvA0iJ446wANpkSorIlV08NeinA== X-Received: by 2002:a05:6000:1788:: with SMTP id e8mr6638602wrg.171.1614905744310; Thu, 04 Mar 2021 16:55:44 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id f16sm1474970wrt.21.2021.03.04.16.55.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 16:55:44 -0800 (PST) Message-Id: <95a6c0abe558f6fe2c570602650b4511d33296b2.1614905738.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 05 Mar 2021 00:55:35 +0000 Subject: [PATCH 09/11] t: mark several submodule merging tests as fixed under merge-ort Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jonathan Nieder , Derrick Stolee , Junio C Hamano , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren merge-ort handles submodules (and directory/file conflicts in general) differently than merge-recursive does; it basically puts all the special handling for different filetypes into one place in the codebase instead of needing special handling for different filetypes in many different code paths. This one code path in merge-ort could perhaps use some work still (there are still test_expect_failure cases in the testsuite), but it passes all the tests that merge-recursive does as well as 12 additional ones that merge-recursive fails. Mark those 12 tests as test_expect_success under merge-ort. Signed-off-by: Elijah Newren --- t/t3512-cherry-pick-submodule.sh | 9 +++++++-- t/t3513-revert-submodule.sh | 7 ++++++- t/t5572-pull-submodule.sh | 9 +++++++-- t/t6437-submodule-merge.sh | 5 +++-- t/t6438-submodule-directory-file-conflicts.sh | 9 +++++++-- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/t/t3512-cherry-pick-submodule.sh b/t/t3512-cherry-pick-submodule.sh index 822f2d4bfbd5..eb7a47b9d98a 100755 --- a/t/t3512-cherry-pick-submodule.sh +++ b/t/t3512-cherry-pick-submodule.sh @@ -8,8 +8,13 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh . "$TEST_DIRECTORY"/lib-submodule-update.sh -KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 -KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +if test "$GIT_TEST_MERGE_ALGORITHM" = ort +then + : # No special additional KNOWN_FAILURE knobs to set +else + KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 + KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +fi test_submodule_switch "cherry-pick" test_expect_success 'unrelated submodule/file conflict is ignored' ' diff --git a/t/t3513-revert-submodule.sh b/t/t3513-revert-submodule.sh index a759f12cbb1d..1f8157ad5ba5 100755 --- a/t/t3513-revert-submodule.sh +++ b/t/t3513-revert-submodule.sh @@ -30,7 +30,12 @@ git_revert () { git revert HEAD } -KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 +if test "$GIT_TEST_MERGE_ALGORITHM" = ort +then + : # No special additional KNOWN_FAILURE knobs to set +else + KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 +fi test_submodule_switch_func "git_revert" test_done diff --git a/t/t5572-pull-submodule.sh b/t/t5572-pull-submodule.sh index 29537f4798ef..4b4495613d04 100755 --- a/t/t5572-pull-submodule.sh +++ b/t/t5572-pull-submodule.sh @@ -42,8 +42,13 @@ git_pull_noff () { $2 git pull --no-ff } -KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 -KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +if test "$GIT_TEST_MERGE_ALGORITHM" = ort +then + : # No special additional KNOWN_FAILURE knobs to set +else + KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 + KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +fi test_submodule_switch_func "git_pull_noff" test_expect_success 'pull --recurse-submodule setup' ' diff --git a/t/t6437-submodule-merge.sh b/t/t6437-submodule-merge.sh index 0f92bcf326c8..e5e89c2045e7 100755 --- a/t/t6437-submodule-merge.sh +++ b/t/t6437-submodule-merge.sh @@ -6,6 +6,7 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-merge.sh # # history @@ -328,7 +329,7 @@ test_expect_success 'setup file/submodule conflict' ' ) ' -test_expect_failure 'file/submodule conflict' ' +test_expect_merge_algorithm failure success 'file/submodule conflict' ' test_when_finished "git -C file-submodule reset --hard" && ( cd file-submodule && @@ -437,7 +438,7 @@ test_expect_failure 'directory/submodule conflict; keep submodule clean' ' ) ' -test_expect_failure !FAIL_PREREQS 'directory/submodule conflict; should not treat submodule files as untracked or in the way' ' +test_expect_merge_algorithm failure success !FAIL_PREREQS 'directory/submodule conflict; should not treat submodule files as untracked or in the way' ' test_when_finished "git -C directory-submodule/path reset --hard" && test_when_finished "git -C directory-submodule reset --hard" && ( diff --git a/t/t6438-submodule-directory-file-conflicts.sh b/t/t6438-submodule-directory-file-conflicts.sh index 04bf4be7d792..abfa59d3684c 100755 --- a/t/t6438-submodule-directory-file-conflicts.sh +++ b/t/t6438-submodule-directory-file-conflicts.sh @@ -12,8 +12,13 @@ test_submodule_switch "merge --ff" test_submodule_switch "merge --ff-only" -KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 -KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +if test "$GIT_TEST_MERGE_ALGORITHM" = ort +then + : # No special additional KNOWN_FAILURE knobs to set +else + KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 + KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 +fi test_submodule_switch "merge --no-ff" test_done From patchwork Fri Mar 5 00:55:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12117221 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C35EC433DB for ; Fri, 5 Mar 2021 00:55:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6B6EE64FD3 for ; Fri, 5 Mar 2021 00:55:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232105AbhCEAzx (ORCPT ); Thu, 4 Mar 2021 19:55:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57530 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232038AbhCEAzq (ORCPT ); Thu, 4 Mar 2021 19:55:46 -0500 Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 184F5C061756 for ; Thu, 4 Mar 2021 16:55:46 -0800 (PST) Received: by mail-wr1-x42f.google.com with SMTP id j2so225887wrx.9 for ; Thu, 04 Mar 2021 16:55:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=vjGwdS+uBGI/lu02cnJvieRUbNNmigRK/VGjLMkjBZ4=; b=BCc5lwjn28PlEiNDR+FpRJZpKoh+UQTJlVmVBEPE9dsZcl+9k8tXrLT+ONy22X8roK 2Q1RreQRSogAZK0SGqubteG/5Zhe1jGL1TwEC48SjiupTAiyMur4T8Q8hIjk/jZG5zTR 4yRoe5bbQAl62YhGskUyLsngyQGlN5E28E8zmv38t7xi3seJsoFTUYPk1keLHwvjVO9E d5bco37bxo+uE72aJTcQOWCG+Hq1Alj/wQEn72cD9Q/2IZqUAw/RLSJ0pkV7p5mhHd1E vK5mQoexmLiIqJE++3kphSjoFHXfmlBCn9L4xBFE6vKpRgoHi4qKH1t8R2tiFpSldXpA Tu9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=vjGwdS+uBGI/lu02cnJvieRUbNNmigRK/VGjLMkjBZ4=; b=SqlhRRR4BuZj7wt0SQz4NOAd/fGp+eBhMFNa5lrwNwHD7yZ3gWrDofA4WTnEo7WS2N WQOvKEI3bqxGhj4jQIWfgQyo2hnPYV+riFzeuBDCSY8PdbIW+kForYxgMrCP2xyRGIgM 4uaMFh1AkJ4tMJj1ybQIip7Lbbm3dHnx3g03+MifpJfsYXnjriIQOVbDijy5FhLEv6BX XkAPGl6TRYsYMYKltFkUrmeB/IupO/GryVphDB8toccwd1noXj67DCePYpPOR/lsa59V J/zM6ONlc7Cysw1Xbpi5LOImPyqbHDYOR2OAsVfqlrfpJnkikPsYz4BdYKGkSBwHXqyW Amyg== X-Gm-Message-State: AOAM533iWQqiAoQjUZ348H1Fpxf6Fy+l2hpFdWZ0iXD458Q1eXDPjj7H mCCEHoUrVID4qrCLq4JZn/16ZvQG1Wo= X-Google-Smtp-Source: ABdhPJzFul8XkTIvQBlGidfL30kpRS8jM23yfxdTAFpvjddpX4rYhEge8JSUr6/i+3v5GzNxCXIV5w== X-Received: by 2002:adf:e412:: with SMTP id g18mr6754473wrm.159.1614905744859; Thu, 04 Mar 2021 16:55:44 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id d204sm1744230wmc.17.2021.03.04.16.55.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 16:55:44 -0800 (PST) Message-Id: In-Reply-To: References: Date: Fri, 05 Mar 2021 00:55:36 +0000 Subject: [PATCH 10/11] merge-ort: write $GIT_DIR/AUTO_MERGE whenever we hit a conflict Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jonathan Nieder , Derrick Stolee , Junio C Hamano , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren There are a variety of questions users might ask while resolving conflicts: * What changes have been made since the previous (first) parent? * What changes are staged? * What is still unstaged? (or what is still conflicted?) * What changes did I make to resolve conflicts so far? The first three of these have simple answers: * git diff HEAD * git diff --cached * git diff There was no way to answer the final question previously. Adding one is trivial in merge-ort, since it works by creating a tree representing what should be written to the working copy complete with conflict markers. Simply write that tree to .git/AUTO_MERGE, allowing users to answer the fourth question with * git diff AUTO_MERGE I avoided using a name like "MERGE_AUTO", because that would be merge-specific (much like MERGE_HEAD, REBASE_HEAD, REVERT_HEAD, CHERRY_PICK_HEAD) and I wanted a name that didn't change depending on which type of operation the merge was part of. Ensure that paths which clean out other temporary operation-specific files (e.g. CHERRY_PICK_HEAD, MERGE_MSG, rebase-merge/ state directory) also clean out this AUTO_MERGE file. Signed-off-by: Elijah Newren --- branch.c | 1 + builtin/rebase.c | 1 + merge-ort.c | 10 ++++++++++ path.c | 1 + path.h | 2 ++ sequencer.c | 5 +++++ 6 files changed, 20 insertions(+) diff --git a/branch.c b/branch.c index 9c9dae1eae32..b71a2de29dbe 100644 --- a/branch.c +++ b/branch.c @@ -344,6 +344,7 @@ void remove_merge_branch_state(struct repository *r) unlink(git_path_merge_rr(r)); unlink(git_path_merge_msg(r)); unlink(git_path_merge_mode(r)); + unlink(git_path_auto_merge(r)); save_autostash(git_path_merge_autostash(r)); } diff --git a/builtin/rebase.c b/builtin/rebase.c index de400f9a1973..7d9afe118fd4 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -739,6 +739,7 @@ static int finish_rebase(struct rebase_options *opts) int ret = 0; delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF); + unlink(git_path_auto_merge(the_repository)); apply_autostash(state_dir_path("autostash", opts)); close_object_store(the_repository->objects); /* diff --git a/merge-ort.c b/merge-ort.c index 37b69cbe0f9a..cf927cd160e1 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -3362,6 +3362,9 @@ void merge_switch_to_result(struct merge_options *opt, { assert(opt->priv == NULL); if (result->clean >= 0 && update_worktree_and_index) { + const char *filename; + FILE *fp; + trace2_region_enter("merge", "checkout", opt->repo); if (checkout(opt, head, result->tree)) { /* failure to function */ @@ -3380,6 +3383,13 @@ void merge_switch_to_result(struct merge_options *opt, } opt->priv = NULL; trace2_region_leave("merge", "record_conflicted", opt->repo); + + trace2_region_enter("merge", "write_auto_merge", opt->repo); + filename = git_path_auto_merge(opt->repo); + fp = xfopen(filename, "w"); + fprintf(fp, "%s\n", oid_to_hex(&result->tree->object.oid)); + fclose(fp); + trace2_region_leave("merge", "write_auto_merge", opt->repo); } if (display_update_msgs) { diff --git a/path.c b/path.c index 7b385e5eb282..9e883eb52446 100644 --- a/path.c +++ b/path.c @@ -1534,5 +1534,6 @@ REPO_GIT_PATH_FUNC(merge_rr, "MERGE_RR") REPO_GIT_PATH_FUNC(merge_mode, "MERGE_MODE") REPO_GIT_PATH_FUNC(merge_head, "MERGE_HEAD") REPO_GIT_PATH_FUNC(merge_autostash, "MERGE_AUTOSTASH") +REPO_GIT_PATH_FUNC(auto_merge, "AUTO_MERGE") REPO_GIT_PATH_FUNC(fetch_head, "FETCH_HEAD") REPO_GIT_PATH_FUNC(shallow, "shallow") diff --git a/path.h b/path.h index e7e77da6aaa5..251c78d98000 100644 --- a/path.h +++ b/path.h @@ -176,6 +176,7 @@ struct path_cache { const char *merge_mode; const char *merge_head; const char *merge_autostash; + const char *auto_merge; const char *fetch_head; const char *shallow; }; @@ -191,6 +192,7 @@ const char *git_path_merge_rr(struct repository *r); const char *git_path_merge_mode(struct repository *r); const char *git_path_merge_head(struct repository *r); const char *git_path_merge_autostash(struct repository *r); +const char *git_path_auto_merge(struct repository *r); const char *git_path_fetch_head(struct repository *r); const char *git_path_shallow(struct repository *r); diff --git a/sequencer.c b/sequencer.c index d2332d3e1787..472cdd8c620d 100644 --- a/sequencer.c +++ b/sequencer.c @@ -2096,6 +2096,7 @@ static int do_pick_commit(struct repository *r, refs_delete_ref(get_main_ref_store(r), "", "CHERRY_PICK_HEAD", NULL, 0); unlink(git_path_merge_msg(r)); + unlink(git_path_auto_merge(r)); fprintf(stderr, _("dropping %s %s -- patch contents already upstream\n"), oid_to_hex(&commit->object.oid), msg.subject); @@ -2451,6 +2452,8 @@ void sequencer_post_commit_cleanup(struct repository *r, int verbose) need_cleanup = 1; } + unlink(git_path_auto_merge(r)); + if (!need_cleanup) return; @@ -4111,6 +4114,7 @@ static int pick_commits(struct repository *r, unlink(rebase_path_stopped_sha()); unlink(rebase_path_amend()); unlink(git_path_merge_head(r)); + unlink(git_path_auto_merge(r)); delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF); if (item->command == TODO_BREAK) { @@ -4505,6 +4509,7 @@ static int commit_staged_changes(struct repository *r, return error(_("could not commit staged changes.")); unlink(rebase_path_amend()); unlink(git_path_merge_head(r)); + unlink(git_path_auto_merge(r)); if (final_fixup) { unlink(rebase_path_fixup_msg()); unlink(rebase_path_squash_msg()); From patchwork Fri Mar 5 00:55:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 12117223 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9DC02C433E6 for ; Fri, 5 Mar 2021 00:55:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 712E36500A for ; Fri, 5 Mar 2021 00:55:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232102AbhCEAzy (ORCPT ); Thu, 4 Mar 2021 19:55:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57534 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232069AbhCEAzr (ORCPT ); Thu, 4 Mar 2021 19:55:47 -0500 Received: from mail-wm1-x333.google.com (mail-wm1-x333.google.com [IPv6:2a00:1450:4864:20::333]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B2456C061574 for ; Thu, 4 Mar 2021 16:55:46 -0800 (PST) Received: by mail-wm1-x333.google.com with SMTP id u187so204151wmg.4 for ; Thu, 04 Mar 2021 16:55:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=BUOkwACFk1ATS5lxNPwdjLfxguOc0uEUsQow7Zl+Re4=; b=fDrWKab+8Rx9AMGDcVBmyMqkg0oKeBi/1c+28H4eCHKy+d9KpY5rNl36f5wLv4Inmv FhRg2EYtEpjrgm2KP9qIWZhRL0Bf/WQgvMyBmiL+mtsbV/GfCC39PnHUU/EOnrapY+XB /QHLm7oN8pMR4oo1uuMemOJNpVd5JXDtXQat89BbJSSSF3hergx5y2SE6uywxqTO5GYH Q4m3BU1SDqw5H+UfzFLQv2Mg7yIaE4Uzy2xVit961VT7trF+XrezOsWvM9RZH6uH/nmr JZ0/Ri7Acr91W33ZF0CHuH9AUoOQ0CkoeZat2743bqr9uF4eILatdSDvs3TuGbH79V1E IXZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=BUOkwACFk1ATS5lxNPwdjLfxguOc0uEUsQow7Zl+Re4=; b=Z7zC2uys8w5SiQiM9aIQZST3SCUORBtj3lgNfhNhkUZclD6ngw4YsQ5hd27q44yC5l CJ+HStoXc5mXgqx9j4yVgQNlaQ2/ZhQDEoQAmrsi/NlmoS8waLtGi3R3ljUSMsa50eT+ I7pffERtRdOQSTdq3xPYxgWrCa3/m58cIXPAQbn4KgiMX/7fRqCIr/hc2sAPmUrjsVRJ LU0MLun17JDu3kZux8Q9xbJm+9haYVYNciLeL03f3TbH4F2OIGak1pdd2xnxkfX1GQBy SiJl/I11+Trvz1VFETSFXeAjIs4QwBLbVxAX3HzGegcECVmAbELR4Leh71BH0XzhQafM AvhA== X-Gm-Message-State: AOAM532Tg+QpSu/YG05jF97aBkLs86zLtJsRbtRwy4gW3nme+s7jlbqT 42/20awdQ23+QRaOy/3wmt/CDCmEEhA= X-Google-Smtp-Source: ABdhPJz9ni4zM/8PI/g3bwRvFFwLNscNmLI/nW9AD0tNBPxceCfy4lO0Q60Vd197JEnCsLfm8t3z5w== X-Received: by 2002:a1c:400b:: with SMTP id n11mr6209565wma.167.1614905745459; Thu, 04 Mar 2021 16:55:45 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id v1sm1650020wmj.31.2021.03.04.16.55.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Mar 2021 16:55:45 -0800 (PST) Message-Id: <0409118d4ff76a8dc0285c436f89478176752955.1614905738.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Fri, 05 Mar 2021 00:55:37 +0000 Subject: [PATCH 11/11] merge-recursive: add a bunch of FIXME comments documenting known bugs Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jonathan Nieder , Derrick Stolee , Junio C Hamano , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren The plan is to just delete merge-recursive, but not until everyone is comfortable with merge-ort as a replacement. Given that I haven't switched all callers of merge-recursive over yet (e.g. git-am still uses merge-recursive), maybe there's some value documenting known bugs in the algorithm in case we end up keeping it or someone wants to dig it up in the future. Signed-off-by: Elijah Newren --- merge-recursive.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/merge-recursive.c b/merge-recursive.c index b052974f191c..99a197597db5 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -1075,6 +1075,11 @@ static int merge_3way(struct merge_options *opt, read_mmblob(&src1, &a->oid); read_mmblob(&src2, &b->oid); + /* + * FIXME: Using a->path for normalization rules in ll_merge could be + * wrong if we renamed from a->path to b->path. We should use the + * target path for where the file will be written. + */ merge_status = ll_merge(result_buf, a->path, &orig, base, &src1, name1, &src2, name2, opt->repo->index, &ll_opts); @@ -1154,6 +1159,8 @@ static void print_commit(struct commit *commit) struct strbuf sb = STRBUF_INIT; struct pretty_print_context ctx = {0}; ctx.date_mode.type = DATE_NORMAL; + /* FIXME: Merge this with output_commit_title() */ + assert(!merge_remote_util(commit)); format_commit_message(commit, " %h: %m %s", &sb, &ctx); fprintf(stderr, "%s\n", sb.buf); strbuf_release(&sb); @@ -1177,6 +1184,11 @@ static int merge_submodule(struct merge_options *opt, int search = !opt->priv->call_depth; /* store a in result in case we fail */ + /* FIXME: This is the WRONG resolution for the recursive case when + * we need to be careful to avoid accidentally matching either side. + * Should probably use o instead there, much like we do for merging + * binaries. + */ oidcpy(result, a); /* we can not handle deletion conflicts */ @@ -1301,6 +1313,13 @@ static int merge_mode_and_contents(struct merge_options *opt, if ((S_IFMT & a->mode) != (S_IFMT & b->mode)) { result->clean = 0; + /* + * FIXME: This is a bad resolution for recursive case; for + * the recursive case we want something that is unlikely to + * accidentally match either side. Also, while it makes + * sense to prefer regular files over symlinks, it doesn't + * make sense to prefer regular files over submodules. + */ if (S_ISREG(a->mode)) { result->blob.mode = a->mode; oidcpy(&result->blob.oid, &a->oid); @@ -1349,6 +1368,7 @@ static int merge_mode_and_contents(struct merge_options *opt, free(result_buf.ptr); if (ret) return ret; + /* FIXME: bug, what if modes didn't match? */ result->clean = (merge_status == 0); } else if (S_ISGITLINK(a->mode)) { result->clean = merge_submodule(opt, &result->blob.oid, @@ -2664,6 +2684,14 @@ static int process_renames(struct merge_options *opt, struct string_list b_by_dst = STRING_LIST_INIT_NODUP; const struct rename *sre; + /* + * FIXME: As string-list.h notes, it's O(n^2) to build a sorted + * string_list one-by-one, but O(n log n) to build it unsorted and + * then sort it. Note that as we build the list, we do not need to + * check if the existing destination path is already in the list, + * because the structure of diffcore_rename guarantees we won't + * have duplicates. + */ for (i = 0; i < a_renames->nr; i++) { sre = a_renames->items[i].util; string_list_insert(&a_by_dst, sre->pair->two->path)->util @@ -3602,6 +3630,15 @@ static int merge_recursive_internal(struct merge_options *opt, return err(opt, _("merge returned no commit")); } + /* + * FIXME: Since merge_recursive_internal() is only ever called by + * places that ensure the index is loaded first + * (e.g. builtin/merge.c, rebase/sequencer, etc.), in the common + * case where the merge base was unique that means when we get here + * we immediately discard the index and re-read it, which is a + * complete waste of time. We should only be discarding and + * re-reading if we were forced to recurse. + */ discard_index(opt->repo->index); if (!opt->priv->call_depth) repo_read_index(opt->repo);