From patchwork Tue Aug 4 22:31:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Raymond E. Pasco" X-Patchwork-Id: 11701073 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8C40613B6 for ; Tue, 4 Aug 2020 22:32:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7CDBB22B45 for ; Tue, 4 Aug 2020 22:32:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ameretat.dev header.i=@ameretat.dev header.b="bcWf0scR" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726688AbgHDWco (ORCPT ); Tue, 4 Aug 2020 18:32:44 -0400 Received: from out1.migadu.com ([91.121.223.63]:64590 "EHLO out1.migadu.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726282AbgHDWco (ORCPT ); Tue, 4 Aug 2020 18:32:44 -0400 X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ameretat.dev; s=default; t=1596580359; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gQJ+a3xcLjMVog/B8K9xGGHrAE0yKgZzHSErC+5nE6E=; b=bcWf0scR6BIx3HMPdwbzcsHeAp3OkUk8EnBQ8kHY4tFIlxRZldkv+qEAqxGzt+0rnd/3Vr Tx7NixzgtYSwOw+yd77rA97HnEt4NAjmIJ+mgd7aSep12URF2Nnde3W1NR6EsHJkc02igj 5RzEHrHSURLVcf3v8FoBpm3Mse7A0BA= From: "Raymond E. Pasco" To: git@vger.kernel.org Cc: "Raymond E. Pasco" , Junio C Hamano Subject: [PATCH v2] apply: allow "new file" patches on i-t-a entries Date: Tue, 4 Aug 2020 18:31:55 -0400 Message-Id: <20200804223155.7727-1-ray@ameretat.dev> In-Reply-To: References: MIME-Version: 1.0 X-Spam-Score: 0.00 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org diff-files recently changed to treat "intent to add" entries as new file diffs rather than diffs from the empty blob. However, apply refuses to apply new file diffs on top of existing index entries, except in the case of renames. This causes "git add -p", which uses apply, to fail when attempting to stage hunks from a file when intent to add has been recorded. This changes the logic in check_to_create() which checks if an entry already exists in an index in two ways: first, we only search for an index entry at all if ok_if_exists is false; second, we check for the CE_INTENT_TO_ADD flag on any index entries we find and allow the apply to proceed if it is set. Helped-by: Junio C Hamano Signed-off-by: Raymond E. Pasco --- apply.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apply.c b/apply.c index 8bff604dbe..4cba4ce71a 100644 --- a/apply.c +++ b/apply.c @@ -3747,10 +3747,13 @@ static int check_to_create(struct apply_state *state, { struct stat nst; - if (state->check_index && - index_name_pos(state->repo->index, new_name, strlen(new_name)) >= 0 && - !ok_if_exists) - return EXISTS_IN_INDEX; + if (state->check_index && !ok_if_exists) { + int pos = index_name_pos(state->repo->index, new_name, strlen(new_name)); + if (pos >= 0 && + !(state->repo->index->cache[pos]->ce_flags & CE_INTENT_TO_ADD)) + return EXISTS_IN_INDEX; + } + if (state->cached) return 0;