git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Justin Donnelly <justinrdonnelly@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: "Phillip Wood" <phillip.wood123@gmail.com>,
	"Justin Donnelly via GitGitGadget" <gitgitgadget@gmail.com>,
	git@vger.kernel.org, "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
	newren@gmail.com, phillip.wood@dunelm.org.uk,
	Johannes.Schindelin@gmx.de
Subject: Re: [PATCH v2] git-prompt: show presence of unresolved conflicts at command prompt
Date: Tue, 16 Aug 2022 19:32:43 -0400	[thread overview]
Message-ID: <CAGTqyRxt-+vLQPNbRCgKv3VvUMNEQF47DUH2Ht+CsKqDxgfjpw@mail.gmail.com> (raw)
In-Reply-To: <CAGTqyRyuV42-NRW_OKzy9F+LbFcZp-QZkM73LqrNkmOi60oU+w@mail.gmail.com>

On Tue, Aug 16, 2022 at 12:20 AM Justin Donnelly
<justinrdonnelly@gmail.com> wrote:
>
> On Mon, Aug 15, 2022 at 12:00 PM Junio C Hamano <gitster@pobox.com> wrote:
> >
> > Phillip Wood <phillip.wood123@gmail.com> writes:
> >
> > > I had not commented as I don't use the prompt. I have just had a quick
> > > read and I wonder if it would be more efficient to use
> > >     git diff --cached --quiet --diff-filter=U
> > > rather than
> > >     git ls-files --unmerged 2>/dev/null
> > > to check if there are unmerged entries,
> >
> > The former reads the on-disk index into in-core index, and reads
> > tree objects (recursively for subdirectories) referenced by the
> > HEAD, walks both in parallel to find differences and filters out the
> > result to unmerged (I am not sure how well diff-filter works with
> > unmerged paths, though).
> >
> > The latter rads the on-disk index into in-core index, scans the
> > entries and finds unmerged entries.
> >
> > So if we compare the overhead to run either command standalone, I am
> > reasonably sure that the latter would be a lot more efficient.
> >
>
> Here's how I tested performance. The setup and test execution code are
> below. I tested each technique (`git ls-files --unmerged 2>/dev/null`
> and `git diff --cached --quiet --diff-filter=U`) 3 times and listed
> the results. Please let me know if you see any problems with the
> methodology.
>
> Setup:
> mkdir -p /tmp/perf/base && cd /tmp/perf/base
> git clone https://github.com/torvalds/linux.git
>
> Each test:
> cd /tmp/perf
> rm -rf test
> cp -r base test
> cd test/linux/drivers/watchdog
> git switch --detach v6.0-rc1 # pick some commit for consistency
> for f in *; do echo "/* a */" >> $f; done # 182 files
> git stash
> for f in *; do echo "/* b */" >> $f; done
> git commit -am "adding to end of files in watchdog directory"
> git stash pop
> time [[ $(git ls-files --unmerged 2>/dev/null) ]]
> # OR run the next one instead
> # time ! git diff --cached --quiet --diff-filter=U 2>/dev/null
>
> Results (hopefully this text lines up better for others than it does for me):
> time [[ $(git ls-files --unmerged 2>/dev/null) ]]
>       run 1     run 2     run3
> real  0m0.008s  0m0.009s  0m0.008s
> user  0m0.005s  0m0.001s  0m0.004s
> sys   0m0.004s  0m0.008s  0m0.004s
>
> time ! git diff --cached --quiet --diff-filter=U 2>/dev/null
>       run 1     run 2     run3
> real  0m0.009s  0m0.009s  0m0.007s
> user  0m0.004s  0m0.009s  0m0.007s
> sys   0m0.004s  0m0.000s  0m0.000s
>

Actually, what's probably more important is how long the commands take
when there is no conflict (that will be a far more common situation).
I tested that today, and the numbers were about the same.

> As you can see, the results are basically the same. I'm not sure if
> real world usage would yield different results. So for now, I'll defer
> to Junio's analysis and stick with `ls-files --unmerged`.
>
> > But if the shell prompt code already needs to run the diff-index for
> > other reasons (e.g. to show if there is any modification added to
> > the index), that may change the equation.  Instead of adding a
> > separate and extra call to "ls-files -u", it might be more efficient
> > if you can somehow piggy-back on an existing diff-index call.  For
> > example, you may be running "git diff --cached --quiet" for exit code
> > to show if any change has been added, but you can instead run "git
> > diff --no-ext-diff --no-renames --cached --name-status" and (1) if
> > there is any output, then the index is dirty, and (2) if there is a
> > line that begins with "U", you have an unmerged path right there.
>
> It had not occurred to me to consolidate and piggy-back off of other
> commands. I find the idea intriguing, but am not sure it makes sense
> to do it for only a single feature (especially this feature since the
> time to determine the conflict is short). I think it would make the
> code more complex, and it might be better to take a holistic approach
> to such an effort. Let me know if you strongly disagree.
>
> Thanks,
> Justin

  reply	other threads:[~2022-08-16 23:35 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-26  1:23 [PATCH] git-prompt: show 'CONFLICT' indicator at command prompt Justin Donnelly via GitGitGadget
2022-07-27 20:13 ` Junio C Hamano
2022-07-28  2:17   ` Justin Donnelly
2022-07-28 17:44     ` Junio C Hamano
2022-07-28 23:33       ` Justin Donnelly
2022-07-29 22:08 ` [PATCH v2] git-prompt: show presence of unresolved conflicts " Justin Donnelly via GitGitGadget
2022-08-14 21:06   ` Justin Donnelly
2022-08-15  4:22     ` Junio C Hamano
2022-08-15 12:50       ` Johannes Schindelin
2022-08-16  3:36         ` Justin Donnelly
2022-08-15 13:04       ` Phillip Wood
2022-08-15 16:00         ` Junio C Hamano
2022-08-16  4:20           ` Justin Donnelly
2022-08-16 23:32             ` Justin Donnelly [this message]
2022-08-17  0:18   ` [PATCH v3] " Justin Donnelly via GitGitGadget
2022-08-19 11:29     ` Johannes Schindelin
2022-08-19 17:57       ` 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=CAGTqyRxt-+vLQPNbRCgKv3VvUMNEQF47DUH2Ht+CsKqDxgfjpw@mail.gmail.com \
    --to=justinrdonnelly@gmail.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=avarab@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=gitster@pobox.com \
    --cc=newren@gmail.com \
    --cc=phillip.wood123@gmail.com \
    --cc=phillip.wood@dunelm.org.uk \
    /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).