On Mon, May 23, 2022 at 4:19 PM Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> wrote: > > > On Mon, May 23 2022, Ævar Arnfjörð Bjarmason wrote: > > > On Mon, May 23 2022, Jiang Xin wrote: > > > >> From: Jiang Xin <zhiyou.jx@xxxxxxxxxxxxxxx> > >> > >> A workflow change for translators are being proposed. > >> > >> Changes since v2: > >> > >> 1. Patch 1/9: reword. > >> 2. Patch 2/9: reword. > >> 3. Patch 3/9: reword, and add "FORCE" to prerequisites of "po/git.pot". > >> 4. Patch 6/9: remove "FORCE" from prerequisites of "po/git.pot". > >> 5. Patch 8/9: reword, and reuse "$(gen_pot_header)" to prepare pot > >> header for "po/git-core.pot". > >> 6. Patch 9/9: various updates on po/README.md. > > > > From skimming this the *.c.po v.s. *.c extension is still left in > > comments. I'm not saying you need to go for my suggestions, but it would > > be very useful in CL's to note things that were suggested but not > > changed, such as that. > > > > Right now I haven't paged that v2 discussion into my brain again, so I > > don't know if that was the only thing, it's the only thing I remember > > right now... > > This fix-up below implements what I suggested on v2, so now the comments > in the generated file are correct, and don't refer to our intermediate > files: > > $ grep '#-#' po/git.pot > #. #-#-#-#-# git-add--interactive.perl #-#-#-#-# > #. #-#-#-#-# add-patch.c #-#-#-#-# > #. #-#-#-#-# git-add--interactive.perl #-#-#-#-# > #. #-#-#-#-# branch.c #-#-#-#-# > #. #-#-#-#-# object-name.c #-#-#-#-# > #. #-#-#-#-# grep.c #-#-#-#-# > > I gathered that the reason you preferred the whole "grep -q PRItime" was > because you wanted to mitigate the effects of your IDE discovering these > files. > > With the below you can define AGGRESSIVE_INTERMEDIATE and when you "make > pot" the generated *.c files will only exist for as long as they're > needed to generate the next step. > > But if you do a subsequent "make pot" will be slower, as we'll of course > need to generate them again. > > I think it's better to go in this direction, and rename that > AGGRESSIVE_INTERMEDIATE to something like > MAKE_AVOID_REAL_EXTENSIONS_IN_GITIGNORED_FILES or whatever. > > I.e. our correctness shouldn't suffer because we're trying to work > around some issue in a specific (and optional) developer tooling. > > There's also the fix there for the "header" dependency, but as noted in > another reply it should probably be dropped altogether... > > diff --git a/Makefile b/Makefile > index d3eae150de9..0b96b55b63f 100644 > --- a/Makefile > +++ b/Makefile > @@ -2736,6 +2736,7 @@ endif > ## "po/git.pot" file. > LOCALIZED_ALL_GEN_PO = > > +LOCALIZED_C_GEN_C = $(LOCALIZED_C:%=.build/pot/po-munged/%) Intermediate C source files copied from the original location, and PRItime will be replaced by PRIuMAX, if any. > LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po) > LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO) > > @@ -2745,26 +2746,19 @@ LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO) > LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po) > LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO) > > -## Gettext tools cannot work with our own custom PRItime type, so > -## we replace PRItime with PRIuMAX. We need to update this to > -## PRIdMAX if we switch to a signed type later. > -$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: % > +ifdef AGGRESSIVE_INTERMEDIATE > +.INTERMEDIATE: $(LOCALIZED_C_GEN_C) Intermediate files "$(LOCALIZED_C_GEN_C)" will be removed automatically. > +endif > +$(LOCALIZED_C_GEN_C): .build/pot/po-munged/%: % > $(call mkdir_p_parent_template) > - $(QUIET_XGETTEXT) \ > - if grep -q PRItime $<; then \ > - (\ > - sed -e 's|PRItime|PRIuMAX|g' <$< \ > - >.build/pot/po/$< && \ > - cd .build/pot/po && \ > - $(XGETTEXT) --omit-header \ > - -o $(@:.build/pot/po/%=%) \ > - $(XGETTEXT_FLAGS_C) $< && \ > - rm $<; \ > - ); \ > - else \ > - $(XGETTEXT) --omit-header \ > - -o $@ $(XGETTEXT_FLAGS_C) $<; \ > - fi > + $(QUIET_GEN)sed -e 's|PRItime|PRIuMAX|g' <$< >$@ Copy each source files in $(LOCALIZED_C) to corresponding intermediate file ($(LOCALIZED_C_GEN_C)) in ".build/pot/po-munged/", replacing PRItime with PRIuMAX if any. > + > +$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: .build/pot/po-munged/% > + $(call mkdir_p_parent_template) > + $(QUIET_XGETTEXT)( \ > + cd $(<D) && \ > + $(XGETTEXT) $(XGETTEXT_FLAGS_C) --omit-header -o - $(<F) \ > + ) >$@ For each intermediate C source files in ".build/pot/po-munged/", call xgettext to create corresponding po file in ".build/pot/po/" directory. > $(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: % > $(call mkdir_p_parent_template) > @@ -2786,11 +2780,24 @@ sed -e 's|charset=CHARSET|charset=UTF-8|' \ > echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@ > endef > > -.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO) > +.build/pot/git.header: No. We should rebuild the pot header if any po file need to be update, because we want to refresh the timestamp in the "POT-Creation-Date:" filed of the pot header. > $(call mkdir_p_parent_template) > $(QUIET_GEN)$(gen_pot_header) > > -po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) > +# We go through this dance of having a prepared > +# e.g. .build/pot/po/grep.c.po and copying it to > +# .build/pot/to-cat/grep.c only because some IDEs (e.g. VSCode) pick > +# up on the "real" extension for the purposes of auto-completion, even > +# if the .build directiory is in .gitignore. > +LOCALIZED_ALL_GEN_TO_CAT = $(LOCALIZED_ALL_GEN_PO:.build/pot/po/%.po=.build/pot/to-cat/%) > +ifdef AGGRESSIVE_INTERMEDIATE > +.INTERMEDIATE: $(LOCALIZED_ALL_GEN_TO_CAT) > +endif > +$(LOCALIZED_ALL_GEN_TO_CAT): .build/pot/to-cat/%: .build/pot/po/%.po > + $(call mkdir_p_parent_template) > + $(QUIET_GEN)cat $< >$@ Copy each po file in ".build/pot/po/" to another location ".build/pot/to-cat/", but without the ".po" extension. Let's take "date.c" as an example: 1. Copy "date.c" to an intermediate C source file ".build/pot/po-munged/date.c" and replace PRItime with PRIuMAX in it. 2. Call xgettext to create ".build/pot/po/date.c.po" from the intermediate C source file ".build/pot/po-munged/date.c". 3. Optionally remove intermediate C source files like ".build/pot/po-munged/date.c". To have two identical C source files in the same worktree is not good, some software may break. So I choose to remove them. 4. Copy the po file (".build/pot/po/date.c.po") created in step 2 to an intermediate fake C source file ".build/pot/to-cat/date.c" which is a file without the ".po" extension. Please note this intermediate fake C source file ".build/pot/to-cat/date.c" is not a valid C file, but a PO file. 5. Call msgcat to create "po/git.pot" from all the intermediate fake C source files including ".build/pot/to-cat/date.c". 6. Optionally remove all the intermediate fake C source files in ".build/pot/to-cat/". I choose to remove them, because leave lots of invalid C source files in worktree is not good. For example, ".build/pot/po/date.c.po" was created from > + > +po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_TO_CAT) > $(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@ 7. "po/git.pot" depends on the intermediate fake C source files. If any single C source file has been changed, will run step 6 to copy all po files in ".build/pot/po" to corresponding fake C source files in ".build/pot/to-cat/", if we choose to remove these intermediate fake C source files. This implementation is too heavy to solve a trivial issue. I think we can push forward this patch series and leave these comments in "po/git.pot": > $ grep '#-#' po/git.pot > #. #-#-#-#-# git-add--interactive.perl.po #-#-#-#-# > #. #-#-#-#-# add-patch.c.po #-#-#-#-# > #. #-#-#-#-# git-add--interactive.perl.po #-#-#-#-# > #. #-#-#-#-# branch.c.po #-#-#-#-# > #. #-#-#-#-# object-name.c.po #-#-#-#-# > #. #-#-#-#-# grep.c.po #-#-#-#-#