git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Cc: "Martin Ågren" <martin.agren@gmail.com>,
	"Git Mailing List" <git@vger.kernel.org>,
	"Junio C Hamano" <gitster@pobox.com>,
	"Dan Jacques" <dnj@google.com>
Subject: Re: [PATCH 1/3] gettext: avoid initialization if the locale dir is not present
Date: Fri, 20 Apr 2018 21:35:53 +0200 (DST)	[thread overview]
Message-ID: <nycvar.QRO.7.76.6.1804202110550.4241@ZVAVAG-6OXH6DA.rhebcr.pbec.zvpebfbsg.pbz> (raw)
In-Reply-To: <87lgdidt30.fsf@evledraar.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 8422 bytes --]

Hi Ævar,

On Fri, 20 Apr 2018, Ævar Arnfjörð Bjarmason wrote:

> On Fri, Apr 20 2018, Martin Ågren wrote:
> 
> > On 20 April 2018 at 11:59, Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
> >>
> >> On Fri, Apr 20 2018, Johannes Schindelin wrote:
> >>
> >>> The runtime of a simple `git.exe version` call on Windows is currently
> >>> dominated by the gettext setup, adding a whopping ~150ms to the ~210ms
> >>> total.
> >>>
> >>> Given that this cost is added to each and every git.exe invocation goes
> >>> through common-main's invocation of git_setup_gettext(), and given that
> >>> scripts have to call git.exe dozens, if not hundreds, of times, this is
> >>> a substantial performance penalty.
> >>>
> >>> This is particularly pointless when considering that Git for Windows
> >>> ships without localization (to keep the installer's size to a bearable
> >>> ~34MB): all that time setting up gettext is for naught.
> >>>
> >>> So let's be smart about it and skip setting up gettext if the locale
> >>> directory is not even present.
> >
> >> If you don't ship git for windows with gettext or a podir, then compile
> >> with NO_GETTEXT, then we won't even compile this function you're
> >> patching here. See line 30 and beyond of gettext.h.
> >>
> >> Are you instead compiling git for windows with gettext support with an
> >> optional add-on package for i18n, so then this podir conditional would
> >> pass?
> >>
> >> In any case, if this is actually the desired behavior I think it's worth
> >> clearly explaining the interaction with NO_GETTEXT in the commit
> >> message, and if you *actually* don't want NO_GETTEXT I think it's useful
> >> to guard this with something like MAYBE_GETTEXT on top, so this code
> >> doesn't unintentionally hide installation errors on other
> >> platforms. I.e. something like:
> >>
> >>         int have_podir = is_directory(podir);
> >>         if (!have_podir)
> >> #ifdef MAYBE_GETTEXT
> >>                 return;
> >> #else
> >>                 BUG("Broken installation, can't find '%s'!", podir);
> >> #endif
> >
> > Is it fair to say that such a broken installation would function more or
> > less well before and after Dscho's patch, and that your approach would
> > render such an installation quite useless?
> 
> Yes my thown out there for the purposes of discussion suggestion may
> break things for Dscho, or not. I'm just saying that we should document
> *what* the use-case is.

I think you underestimate the scope of your willful breakage. It is not
just "break things for Dscho". It is breaking things for every single last
user of Git for Windows. If we ever do that, I will make sure to announce
that together with your name and your postal address on it.

> Because it's not just important to massage the code so it works now, but
> to document what the use-case is, so someone down the line who things
> "oh why are we doing that" has a clear answer.

Let's face it: if gettext would ever fail to work in case of a missing
podir, then it would fail for every installation using a locale for which
we just happen not to have any translation.

So we know that your patch would not only break things, but break things
totally without reason!

> > Do we have some other similar
> > cases where we go BUG("I could not find a resource. I could manage
> > fairly well without it, but you seemed to want it when you installed
> > me.")? I wonder what other well-respected software do if they can't find
> > their translations.
> 
> E.g. my recent 1aca69c019 ("perl Git::LoadCPAN: emit better errors under
> NO_PERL_CPAN_FALLBACKS", 2018-03-03) does similar things, we *could*
> carry on in certain cases instead of dying there (or not, depending on
> the codepath).
> 
> But in general, I don't think there's any reasonable use-cases for git
> needing to repair from a broken or semi-broken installation that aren't
> so specific that they can be explicitly declared, e.g. in this
> hypothetical MAYBE_GETTEXT case.

Ævar, you need to understand one thing, and you need to understand it
right now: the vast majority of Git users will not compile their Git. Not.
Ever. Really, I am not kidding. They use whatever built version they can
get most conveniently.

It is even more true on Windows, where it may be easier to build Git for
Windows now (what with all the work I put into the Git for Windows SDK),
but it is still an expensive endeavor.

And that is even assuming that every Git user is at liberty to build their
own software, which is completely untrue in a large chunk of our business.

So in order to give users who want localization what they want, without
burdening users who do not want localization, we use the exact same build
of Git for Windows for both, and the entire difference is that one comes
with the podir, and the other without.

Okay, I am lying, at the moment we do not even have anything end-user
facing that ships with the podir. But I distinctly want to leave the door
open for that.

And if you think that this is out of sheer laziness on my part, then I
hate to break it to you that this is for *very* good reasons: maintenance
cost.

It probably has not crossed your mind that the entire Git test suite fails
to pass if you run it on Git for Windows when built with NO_GETTEXT
defined?

Yep. It fails. With a honking

	BUG: your vsnprintf is broken (returned -1)

And if you build it without NO_GETTEXT, it passes without that error.
Crazy, huh?

So unless you acquire quite a bit more experience with maintaining Git on
a common platform, I would like to implore you to stop trying to break it.
Thank you very much.

> Otherwise if it's not conditional, e.g. my git on Debian that won't ever
> need this is going to just subtly regress because the FS is broken or
> whatever, and I don't think we should have such code in git running
> unconditionally.

I have not the faintest idea what the heck you are talking about.

If the podir exists, then it is used. No change from before.

If the podir does not exist (which is unlikely in your setup, but there
you go, it might happen), the *only* difference you might notice is that
things get slightly faster (but probably not even noticably so, on your
platform). That is literally the only difference you could possibly notice
with vs without my patch. Seriously.

> > I suppose the logic could be the other way round, i.e., with a flag
> > REALLY_REQUIRE_GETTEXT_AT_RUNTIME. But I also wonder if a user who does
> > not notice that the installation is broken without us screaming BUG in
> > their face, really minds the "brokenness" that much.
> 
> Without the BUG(...) that user is going to spend time fiddling with his

Don't exclude half of humanity, for your own sake.

> i18n settings before finally realizing that his package is broken, much
> better to just emit an error so it's obvious that things are broken,
> rather than taking the fallback path.

And then you will also add code to output BUG BUG BUG when the actual
*language* subdirectory is missing?

You would *need* to do that, and you know this as well as I do, because
even if your Git installation is "broken" and does not bring its l18n
stuff, *another package will have it*, and therefore podir *exists*! And
therefore your suggested change would not only break Git for Windows, it
would also totally not do what you want it to do!

And even then, I totally, utterly hate to break it to you: even on Ubuntu,
it is quite, quite common to have the git package installed *without* the
language-pack-de-base or whatever you need for your locale.

The reason is the same as for Git for Windows: we want to save on space,
so you do not get localization files that you are not even interested in,
instead you get a leaner download.

And in this case -- even on Ubuntu -- your patch does not make sense, but
simply breaks things for no reason other than some well-intended but
horribly broken idea that you should force the user to have a
/usr/share/locale/ even if they may never even want it, and even if things
work very well without it, thankyouverymuch.

In short: I totally disagree with your reasoning to break things that work
very well, with a BUG() that is prone to confuse and scare end users no
less.

Ciao,
Dscho

  reply	other threads:[~2018-04-20 19:36 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-20  8:03 [PATCH 0/3] Some add-on patches on top of dj/runtime-prefix Johannes Schindelin
2018-04-20  8:03 ` [PATCH 1/3] gettext: avoid initialization if the locale dir is not present Johannes Schindelin
2018-04-20  9:59   ` Ævar Arnfjörð Bjarmason
2018-04-20 10:54     ` Martin Ågren
2018-04-20 11:18       ` Ævar Arnfjörð Bjarmason
2018-04-20 19:35         ` Johannes Schindelin [this message]
2018-04-21  7:43           ` Ævar Arnfjörð Bjarmason
2018-04-21 10:17             ` Johannes Schindelin
2018-04-20  8:03 ` [PATCH 2/3] git_setup_gettext: plug memory leak Johannes Schindelin
2018-04-20  8:04 ` [PATCH 3/3] Avoid multiple PREFIX definitions Johannes Schindelin
2018-04-22 15:32   ` Philip Oakley
2018-04-21 11:13 ` [PATCH v2 0/3] Some add-on patches on top of dj/runtime-prefix Johannes Schindelin
2018-04-21 11:14   ` [PATCH v2 1/3] gettext: avoid initialization if the locale dir is not present Johannes Schindelin
2018-04-21 11:14   ` [PATCH v2 2/3] git_setup_gettext: plug memory leak Johannes Schindelin
2018-04-21 11:18   ` [PATCH v2 3/3] Avoid multiple PREFIX definitions Johannes Schindelin
2018-04-24  1:44   ` [PATCH v2 0/3] Some add-on patches on top of dj/runtime-prefix Junio C Hamano
2018-04-24  1:50     ` Junio C Hamano
2018-04-24  2:41       ` Junio C Hamano
2018-04-24 14:48         ` Johannes Schindelin
2018-04-25  1:28           ` Junio C Hamano
2018-04-25  7:46             ` Johannes Schindelin

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=nycvar.QRO.7.76.6.1804202110550.4241@ZVAVAG-6OXH6DA.rhebcr.pbec.zvpebfbsg.pbz \
    --to=johannes.schindelin@gmx.de \
    --cc=avarab@gmail.com \
    --cc=dnj@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=martin.agren@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).