git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Ghanshyam Thakkar <shyamthakkar001@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH v2 1/3] read-cache: optionally collect pathspec matching info
Date: Fri, 29 Mar 2024 14:35:34 -0700	[thread overview]
Message-ID: <xmqqjzlkwwk9.fsf@gitster.g> (raw)
In-Reply-To: <20240329205649.1483032-3-shyamthakkar001@gmail.com> (Ghanshyam Thakkar's message of "Sat, 30 Mar 2024 02:26:19 +0530")

Ghanshyam Thakkar <shyamthakkar001@gmail.com> writes:

> The add_files_to_cache() adds files to the index. And
> add_files_to_cache() in turn calls run_diff_files() to perform this
> operation. The run_diff_files() uses ce_path_match() to match the
> pathspec against cache entries. However, it is called with NULL value
> for the seen parameter, which collects the pathspec matching
> information.

", which collects" -> ", which means we lose"

> Therefore, introduce a new parameter 'char *ps_matched' to 

"Therefore, introduce" -> "Introduce"

> add_files_to_cache() and in turn to run_diff_files(), to feed it to
> ce_path_match() to optionally collect the pathspec matching
> information. This will be helpful in reporting error in case of an
> untracked path being passed when the expectation is a known path. Thus,
> this will be used in the subsequent commits to fix 'commit -i' and 'add
> -u' not erroring out when given untracked paths.

A new parameter to run_diff_files() came as a bit of surprise to me.

When I responded to the previous round, I somehow thought that we'd
add a new member to the rev structure that points at an optional
.ps_matched member next to the existing .prune_data member.  

That way, it would hopefully be easy for a future code to see if a
"diff" invocation, not necessarily run_diff_files() that compares
the working tree and the index, consumed all the pathspec elements.
If such a new .ps_matched member is initialized to NULL, all the
patch noise we see in this patch will become unnecessary, no?

> diff --git a/diff-lib.c b/diff-lib.c
> index 5e8717c774..2dc3864abd 100644
> --- a/diff-lib.c
> +++ b/diff-lib.c
> @@ -101,7 +101,8 @@ static int match_stat_with_submodule(struct diff_options *diffopt,
>  	return changed;
>  }
>  
> -void run_diff_files(struct rev_info *revs, unsigned int option)
> +void run_diff_files(struct rev_info *revs, char *ps_matched,
> +		    unsigned int option)
>  {
>  	int entries, i;
>  	int diff_unmerged_stage = revs->max_count;
> @@ -127,7 +128,7 @@ void run_diff_files(struct rev_info *revs, unsigned int option)
>  		if (diff_can_quit_early(&revs->diffopt))
>  			break;
>  
> -		if (!ce_path_match(istate, ce, &revs->prune_data, NULL))
> +		if (!ce_path_match(istate, ce, &revs->prune_data, ps_matched))
>  			continue;
>  
>  		if (revs->diffopt.prefix &&

This may be a non-issue, but after this point we see the beginning
of another filter to reject paths outside the hierarchy "--relative"
specifies.  It is possible that a pathspec element matches ce->name
but the matched cache entry is outside the current area.  Shouldn't
we then consider that the pathspec element did not match?  E.g., in
our project, what should happen if we did this?

    $ echo >>diff.h
    $ cd t
    $ git diff --relative \*.h

The command should show nothing.  Did the pathspec '*.h' match?  From
those who know how the machinery works, yes it did before the resulting
paths were further filtered out, but from the end-user's point of view,
because "--relative" limits the diff to the current directory and below,
and because 't' and below did not have any C header files, wouldn't it
be more natural and useful to say the pathspec wasn't used?

This does not matter right now because we are not planning to add a
new "--error-unmatch" option to "git diff", but when/if we do, it
starts to matter.  The hunk at least needs a NEEDSWORK comment,
summarizing the above.

	/*
	 * NEEDSWORK:
	 * Here we filter with pathspec but the result is further
	 * filtered out when --relative is in effect.  To end-users,
         * a pathspec element that matched only to paths outside the
         * current directory is like not matching anything at all;
         * the handling of ps_matched[] here may become problematic
	 * if/when we add the "--error-unmatch" option to "git diff".
	 */ 

A solution to that problem might be just a matter of swapping the
order of filtering, but it may have performance implications and I'd
rather not have to worry about it right now in the context of the
current topic, hence a NEEDSWORK comment without attempting to "fix"
it would be the most preferred approach to such a side issue.


  reply	other threads:[~2024-03-29 21:35 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-18 15:51 [PATCH 0/2] fix certain cases of add and commit with untracked path not erroring out Ghanshyam Thakkar
2024-03-18 15:51 ` [PATCH 1/2] builtin/commit: error out when passing untracked path with -i Ghanshyam Thakkar
2024-03-18 17:27   ` Junio C Hamano
2024-03-18 15:52 ` [PATCH 2/2] builtin/add: error out when passing untracked path with -u Ghanshyam Thakkar
2024-03-18 17:31   ` Junio C Hamano
2024-03-29 20:56 ` [PATCH v2 0/3] commit, add: error out when passing untracked path Ghanshyam Thakkar
2024-04-02 21:36   ` [PATCH v3 0/3] commit, add: error out when passing untracked paths Ghanshyam Thakkar
2024-04-03 18:14     ` [PATCH v4 0/3] commit,add: error out when passing untracked path Ghanshyam Thakkar
2024-04-03 18:14     ` [PATCH v4 1/3] revision: optionally record matches with pathspec elements Ghanshyam Thakkar
2024-04-03 18:14     ` [PATCH v4 2/3] builtin/commit: error out when passing untracked path with -i Ghanshyam Thakkar
2024-04-03 18:14     ` [PATCH v4 3/3] builtin/add: error out when passing untracked path with -u Ghanshyam Thakkar
2024-04-02 21:36   ` [PATCH v3 1/3] revision: optionally record matches with pathspec elements Ghanshyam Thakkar
2024-04-02 21:36   ` [PATCH v3 2/3] builtin/commit: error out when passing untracked path with -i Ghanshyam Thakkar
2024-04-02 21:47     ` Junio C Hamano
2024-04-02 21:58       ` Ghanshyam Thakkar
2024-04-02 21:36   ` [PATCH v3 3/3] builtin/add: error out when passing untracked path with -u Ghanshyam Thakkar
2024-04-02 21:49     ` Junio C Hamano
2024-04-02 22:00       ` Ghanshyam Thakkar
2024-03-29 20:56 ` [PATCH v2 1/3] read-cache: optionally collect pathspec matching info Ghanshyam Thakkar
2024-03-29 21:35   ` Junio C Hamano [this message]
2024-03-29 22:16     ` Junio C Hamano
2024-03-30 14:27       ` Ghanshyam Thakkar
2024-03-30 16:27         ` Junio C Hamano
2024-03-29 20:56 ` [PATCH v2 2/3] builtin/commit: error out when passing untracked path with -i Ghanshyam Thakkar
2024-03-29 21:38   ` Junio C Hamano
2024-03-29 20:56 ` [PATCH v2 3/3] builtin/add: error out when passing untracked path with -u Ghanshyam Thakkar
2024-03-29 21:43   ` Junio C Hamano
2024-03-30 14:18     ` Ghanshyam Thakkar
2024-03-30 16:49       ` Junio C Hamano
2024-04-01 13:27         ` Ghanshyam Thakkar
2024-04-01 16:31           ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqjzlkwwk9.fsf@gitster.g \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=shyamthakkar001@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).