From patchwork Mon Dec 20 14:32:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12688007 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 2371FC433F5 for ; Mon, 20 Dec 2021 14:33:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233697AbhLTOdC (ORCPT ); Mon, 20 Dec 2021 09:33:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58286 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233666AbhLTOdB (ORCPT ); Mon, 20 Dec 2021 09:33:01 -0500 Received: from mail-wm1-x332.google.com (mail-wm1-x332.google.com [IPv6:2a00:1450:4864:20::332]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8874CC06173E for ; Mon, 20 Dec 2021 06:33:00 -0800 (PST) Received: by mail-wm1-x332.google.com with SMTP id y83-20020a1c7d56000000b003456dfe7c5cso8813610wmc.1 for ; Mon, 20 Dec 2021 06:33:00 -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=qxLEDaVVXuSkRbZPv11EOStJOOrvJtXLEYzIeB0ifgQ=; b=TTw78Iu3egxl9bwxbIB37myp27wZHtlQE4cRiknNVrCwzhhq3JfkqBSju96j2Max9T GhwShpqEhDYPzTS8mj+jVqF8UddGpZ2JW8dHNgkjzRE8Ang5EvGS7nltt0tuY9/YTojt kW+7ZoGwB589RBnCNMqXSjO3bdrSgTCulhW515K1Lv+yWjH77rZxbh8aWdvI9LgF4VRW fgnzjKtxtUG55y33XpKJwoC2apP44IqUmiFfNbGBjQVQS14F7F03LITJXF+HZKnsQ3fU MscGIV/kCSEzE8orWTmqCiKmG/S9dA6szeriy3kBZUSj86X7ML1j0etdICougLfNBnij 0DmQ== 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=qxLEDaVVXuSkRbZPv11EOStJOOrvJtXLEYzIeB0ifgQ=; b=63LLSSaMJZP0uSGbsaR2yRzZjEwu8EggQLr860ovF92b8al9nLPdjIJkIy+kHrZum9 53ZX254yc2EvLGlCdNR8hiFs31Za2Btty0Mz8yAB0B3773RdiW3mVFaNDRhLoJyve1yl vE4vMUod9j/EeXGYQX9LqMobbsaHP9bwX9lBNZSwvzaJta+PauUoWqTOGhILm/yDkomA z1z/2VdQB2fGT8xS3dca4PMgH+r4hFGTInwlqHrlmMCi/7nurnopyqiewG7nY9ec8WKi cEqEx9z8Rl/JruVbxFc8JDzAPYtUxc7UV+TCdY/A39RDc3Rh/ivYRnvLJEr+S4crcDtq 2jkA== X-Gm-Message-State: AOAM531dyMdpyRSIuxgnuGI7jxcb4aIsDmEZ7CHKUmcmHrQyDtZM5NVA FsOi/2yEOkEmi1dZvzGKxvf/1njUJ0Q= X-Google-Smtp-Source: ABdhPJw7M8W04Ii0Sxhq8CGS53ZneXu2UhoXL7gzjnUJ31NlhyH3BwBeRlAkSeKpmVxgahCigG6cmg== X-Received: by 2002:a05:600c:3d94:: with SMTP id bi20mr21206838wmb.83.1640010779027; Mon, 20 Dec 2021 06:32:59 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id bg12sm19736192wmb.5.2021.12.20.06.32.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Dec 2021 06:32:58 -0800 (PST) Message-Id: In-Reply-To: References: Date: Mon, 20 Dec 2021 14:32:56 +0000 Subject: [PATCH 1/2] t3701: clean up hunk splitting tests Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Johannes Schindelin , SZEDER =?utf-8?b?R8Oh?= =?utf-8?b?Ym9y?= , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood Clean up some test constructs in preparation for extending the tests in the next commit. There are three small changes, I've grouped them together as they're so small it didn't seem worth creating three separate commits. 1 - "cat file | sed expression" is better written as "sed expression file". 2 - Follow our usual practice of redirecting the output of git commands to a file rather than piping it into another command. 3 - Use test_write_lines rather than 'printf "%s\n"'. Signed-off-by: Phillip Wood --- t/t3701-add-interactive.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh index 207714655f2..77de0029ba5 100755 --- a/t/t3701-add-interactive.sh +++ b/t/t3701-add-interactive.sh @@ -347,7 +347,7 @@ test_expect_success 'setup patch' ' # Expected output, diff is similar to the patch but w/ diff at the top test_expect_success 'setup expected' ' echo diff --git a/file b/file >expected && - cat patch |sed "/^index/s/ 100644/ 100755/" >>expected && + sed "/^index/s/ 100644/ 100755/" patch >>expected && cat >expected-output <<-\EOF --- a/file +++ b/file @@ -373,9 +373,9 @@ test_expect_success 'setup expected' ' test_expect_success 'add first line works' ' git commit -am "clear local changes" && git apply patch && - printf "%s\n" s y y | git add -p file 2>error | - sed -n -e "s/^([1-2]\/[1-2]) Stage this hunk[^@]*\(@@ .*\)/\1/" \ - -e "/^[-+@ \\\\]"/p >output && + test_write_lines s y y | git add -p file 2>error >raw-output && + sed -n -e "s/^([1-2]\/[1-2]) Stage this hunk[^@]*\(@@ .*\)/\1/" \ + -e "/^[-+@ \\\\]"/p raw-output >output && test_must_be_empty error && git diff --cached >diff && diff_cmp expected diff && From patchwork Mon Dec 20 14:32:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12688009 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 06232C433FE for ; Mon, 20 Dec 2021 14:33:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233666AbhLTOdD (ORCPT ); Mon, 20 Dec 2021 09:33:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58292 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233686AbhLTOdB (ORCPT ); Mon, 20 Dec 2021 09:33:01 -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 3B825C061574 for ; Mon, 20 Dec 2021 06:33:01 -0800 (PST) Received: by mail-wr1-x431.google.com with SMTP id v7so13205264wrv.12 for ; Mon, 20 Dec 2021 06:33:01 -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:mime-version :content-transfer-encoding:fcc:to:cc; bh=2nBxaaOeoIalmnk3wfIjaUQCc0NzBmAu432EKKwphxQ=; b=aDdu+5sytKHkGrX8GkvNQQ5L7jt0b8i3w0FAiYBnebdlaVcTo/9B6zmw0qSyK9wrLC QWRaRRz7cZmrYqXfXhqwW2/02wSNM7ZSAJGIQtnVokvuSmjdP3KbDbSzKQAqGyc7e5ie f+QAPAv1jdfna7B/9U1gk4pkLSM2utQNxTmKgVkC/jI3wIE4yRCc6ETh/FnVPOoLk77/ i/QfqLculsO774dzwV93T2e4GkB68AeurH7W7u2VufYiVoTpDIWK0Qum5YGlr7soWlyU hH7zy4pZC+rgOJaEZZyDHs3f6uHMncj5+qH2me6UNSmJtrBfeZEaDZCDYD2tD80mPj81 Fdcg== 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:mime-version:content-transfer-encoding:fcc:to:cc; bh=2nBxaaOeoIalmnk3wfIjaUQCc0NzBmAu432EKKwphxQ=; b=Mp/YkTlrQM/sv0sZakrgw/0k/AjknKhSynczmeVKryY+BEAZRyiKdvm3in5vXxZ9Ao qzydYIU9yldbXe5SHU0I+7VjviwyQa0gy4FO0bnsU4GgnFeWxXJaioVlPkMmEYBpvwK/ lIQczEPTM3UblxM1jbTmc194cqdVYLAmTWpSVT/Mn9zkCVSqq5RW81aH2yWWdvnxcD8h RmcXjMW01Ah9AnV1teMpE8Yu8auI6TtUVS2vS8dKQqvrwFHHApiJXfPHYG7IW3VufWYp edZLvVFKrz7xMc/gs5oOzDumCrUWAM+NX1rlxCL6MvvIm/kyrlySFmQ+7Nl7xwh9VVVI q0kw== X-Gm-Message-State: AOAM531e3OwVVTot9+7bOd0l8af7VQYUgBGQ4ExgSquK8nC6a+P+G3Xz UnikVeEnE377nk1yihufo31mrBbF68Q= X-Google-Smtp-Source: ABdhPJxw7Bkp/zRLDpwAHzc3thqpIIOsvr/Kd/u/JrHvd+TxB9MfL5XQ3q1FLVdoIudk7GHDyoLj2w== X-Received: by 2002:adf:f3c5:: with SMTP id g5mr13379360wrp.683.1640010779647; Mon, 20 Dec 2021 06:32:59 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id e11sm18578396wrq.28.2021.12.20.06.32.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Dec 2021 06:32:59 -0800 (PST) Message-Id: <5d5639c2b0474680850b7adbb7c5ec81d124eb50.1640010777.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 20 Dec 2021 14:32:57 +0000 Subject: [PATCH 2/2] builtin add -p: fix hunk splitting MIME-Version: 1.0 Fcc: Sent To: git@vger.kernel.org Cc: Johannes Schindelin , SZEDER =?utf-8?b?R8Oh?= =?utf-8?b?Ym9y?= , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood To determine whether a hunk can be split a counter is incremented each time a context line follows an insertion or deletion. If at the end of the hunk the value of this counter is greater than one then the hunk can be split into that number of smaller hunks. If the last hunk in a file ends with an insertion or deletion then there is no following context line and the counter will not be incremented. This case is already handled at the end of the loop where counter is incremented if the last hunk ended with an insertion or deletion. Unfortunately there is no similar check between files (likely because the perl version only ever parses one diff at a time). Fix this by checking if the last hunk ended with an insertion or deletion when we see the diff header of a new file and extend the existing regression test. Reproted-by: SZEDER Gábor Signed-off-by: Phillip Wood --- add-patch.c | 7 ++++++ t/t3701-add-interactive.sh | 46 ++++++++++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/add-patch.c b/add-patch.c index 8c41cdfe39b..5cea70666e9 100644 --- a/add-patch.c +++ b/add-patch.c @@ -472,6 +472,13 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps) eol = pend; if (starts_with(p, "diff ")) { + if (marker == '-' || marker == '+') + /* + * Last hunk ended in non-context line (i.e. it + * appended lines to the file, so there are no + * trailing context lines). + */ + hunk->splittable_into++; ALLOC_GROW_BY(s->file_diff, s->file_diff_nr, 1, file_diff_alloc); file_diff = s->file_diff + s->file_diff_nr - 1; diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh index 77de0029ba5..94537a6b40a 100755 --- a/t/t3701-add-interactive.sh +++ b/t/t3701-add-interactive.sh @@ -326,7 +326,9 @@ test_expect_success 'correct message when there is nothing to do' ' test_expect_success 'setup again' ' git reset --hard && test_chmod +x file && - echo content >>file + echo content >>file && + test_write_lines A B C D>file2 && + git add file2 ' # Write the patch file with a new line at the top and bottom @@ -341,13 +343,27 @@ test_expect_success 'setup patch' ' content +lastline \ No newline at end of file + diff --git a/file2 b/file2 + index 8422d40..35b930a 100644 + --- a/file2 + +++ b/file2 + @@ -1,4 +1,5 @@ + -A + +Z + B + +Y + C + -D + +X EOF ' # Expected output, diff is similar to the patch but w/ diff at the top test_expect_success 'setup expected' ' echo diff --git a/file b/file >expected && - sed "/^index/s/ 100644/ 100755/" patch >>expected && + sed -e "/^index 180b47c/s/ 100644/ 100755/" \ + -e /1,5/s//1,4/ \ + -e /Y/d patch >>expected && cat >expected-output <<-\EOF --- a/file +++ b/file @@ -366,6 +382,28 @@ test_expect_success 'setup expected' ' content +lastline \ No newline at end of file + --- a/file2 + +++ b/file2 + @@ -1,4 +1,5 @@ + -A + +Z + B + +Y + C + -D + +X + @@ -1,2 +1,2 @@ + -A + +Z + B + @@ -2,2 +2,3 @@ + B + +Y + C + @@ -3,2 +4,2 @@ + C + -D + +X EOF ' @@ -373,8 +411,8 @@ test_expect_success 'setup expected' ' test_expect_success 'add first line works' ' git commit -am "clear local changes" && git apply patch && - test_write_lines s y y | git add -p file 2>error >raw-output && - sed -n -e "s/^([1-2]\/[1-2]) Stage this hunk[^@]*\(@@ .*\)/\1/" \ + test_write_lines s y y s y n y | git add -p 2>error >raw-output && + sed -n -e "s/^([1-9]\/[1-9]) Stage this hunk[^@]*\(@@ .*\)/\1/" \ -e "/^[-+@ \\\\]"/p raw-output >output && test_must_be_empty error && git diff --cached >diff &&