Re: Add PG version number to NLS files - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: Add PG version number to NLS files
Date
Msg-id 200506250224.j5P2OVS04554@candle.pha.pa.us
Whole thread Raw
In response to Re: Add PG version number to NLS files  (Martin Pitt <mpitt@debian.org>)
Responses Re: Add PG version number to NLS files  (Peter Eisentraut <peter_e@gmx.net>)
List pgsql-patches
Martin Pitt wrote:
> /usr/lib/libpq3.so: libpq3
> /usr/lib/libpq4.so: libpq4
> /usr/lib/postgresql/7.4/bin/postmaster: postgres-7.4
> /usr/lib/postgresql/8.0/bin/postmaster: postgres-8.0
> /usr/lib/postgresql/7.4/bin/psql: psql-7.4
> /usr/lib/postgresql/8.0/bin/psql: psql-8.0
> [similar for all other client binaries)
>
> Without my domain patches, i. e. with upstream's scheme it would look
> like:
>
> /usr/lib/libpq3.so: libpq
> /usr/lib/libpq4.so: libpq
> /usr/lib/postgresql/7.4/bin/postmaster: postgres
> /usr/lib/postgresql/8.0/bin/postmaster: postgres
>
> As you see, there is a conflict, so to be able to install both
> pacakges at the same time, one translation version had to be picked
> and stuffed into a separate -translations package, which both versions
> depend on. That's ugly and would cause one version to have some
> missing translations, therefore I patched the domains to be
> version-specific.
>
> I do think that adopting my scheme at least for libpq really makes
> sense. Adopting it for the binaries would not do any harm, but it
> might not be conformant to your packaging policy, which I don't really
> know. The clashing domains are the only things that prevents the
> parallel installation of different major versions, so the question
> whether or not you want to adopt it mainly boils down to whether you
> want to support parallel server installations.
>
> I am grateful that you did the SONAME change upstream, that relieved
> Debian and probably other vendors of much pain. OTOH, the Debian
> specific translation domain changes are really simple and don't impose
> a significant maintenance overhead, so there is no urgency at all.

We absolutely want to support multiple installed versions of PostgreSQL.
In my understanding, it isn't just libpq that depends on
version-specific translation files, but all binaries that have
translations.

Also, it is possible for the SONAME not to change between major versions
(if the libpq API remains unchanged), but for the translations to
change.

For this reason, I think we should add the major number to all
bindtextdomain() calls, as is done in the attached patch.

Is this conclusion correct?

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/nls-global.mk
===================================================================
RCS file: /cvsroot/pgsql/src/nls-global.mk,v
retrieving revision 1.10
diff -c -c -r1.10 nls-global.mk
*** src/nls-global.mk    1 Jun 2004 03:32:28 -0000    1.10
--- src/nls-global.mk    15 Jun 2005 03:11:49 -0000
***************
*** 39,44 ****
--- 39,45 ----
  XGETTEXT += --foreign-user -ctranslator
  endif

+ CATALOG_NAME_VER=$(CATALOG_NAME).$(VERSION)

  all-po: $(MO_FILES)

***************
*** 47,56 ****

  ifdef XGETTEXT
  ifeq ($(word 1,$(GETTEXT_FILES)),+)
! po/$(CATALOG_NAME).pot: $(word 2, $(GETTEXT_FILES))
      $(XGETTEXT) -D $(srcdir) -n $(addprefix -k, $(GETTEXT_TRIGGERS)) -f $<
  else
! po/$(CATALOG_NAME).pot: $(GETTEXT_FILES)
  # Change to srcdir explicitly, don't rely on $^.  That way we get
  # consistent #: file references in the po files.
      $(XGETTEXT) -D $(srcdir) -n $(addprefix -k, $(GETTEXT_TRIGGERS)) $(GETTEXT_FILES)
--- 48,57 ----

  ifdef XGETTEXT
  ifeq ($(word 1,$(GETTEXT_FILES)),+)
! po/$(CATALOG_NAME_VER).pot: $(word 2, $(GETTEXT_FILES))
      $(XGETTEXT) -D $(srcdir) -n $(addprefix -k, $(GETTEXT_TRIGGERS)) -f $<
  else
! po/$(CATALOG_NAME_VER).pot: $(GETTEXT_FILES)
  # Change to srcdir explicitly, don't rely on $^.  That way we get
  # consistent #: file references in the po files.
      $(XGETTEXT) -D $(srcdir) -n $(addprefix -k, $(GETTEXT_TRIGGERS)) $(GETTEXT_FILES)
***************
*** 65,71 ****
  install-po: all-po installdirs-po
  ifneq (,$(LANGUAGES))
      for lang in $(LANGUAGES); do \
!       $(INSTALL_DATA) po/$$lang.mo $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(CATALOG_NAME).mo || exit 1; \
      done
  endif

--- 66,72 ----
  install-po: all-po installdirs-po
  ifneq (,$(LANGUAGES))
      for lang in $(LANGUAGES); do \
!       $(INSTALL_DATA) po/$$lang.mo $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(CATALOG_NAME_VER).mo || exit 1; \
      done
  endif

***************
*** 73,85 ****
      $(mkinstalldirs) $(foreach lang, $(LANGUAGES), $(DESTDIR)$(localedir)/$(lang)/LC_MESSAGES)

  uninstall-po:
!     rm -f $(foreach lang, $(LANGUAGES), $(DESTDIR)$(localedir)/$(lang)/LC_MESSAGES/$(CATALOG_NAME).mo)


  clean-po:
      rm -f $(MO_FILES)
      @rm -f $(addsuffix .old, $(PO_FILES))
!     rm -f po/$(CATALOG_NAME).pot


  maintainer-check-po: $(PO_FILES)
--- 74,86 ----
      $(mkinstalldirs) $(foreach lang, $(LANGUAGES), $(DESTDIR)$(localedir)/$(lang)/LC_MESSAGES)

  uninstall-po:
!     rm -f $(foreach lang, $(LANGUAGES), $(DESTDIR)$(localedir)/$(lang)/LC_MESSAGES/$(CATALOG_NAME_VER).mo)


  clean-po:
      rm -f $(MO_FILES)
      @rm -f $(addsuffix .old, $(PO_FILES))
!     rm -f po/$(CATALOG_NAME_VER).pot


  maintainer-check-po: $(PO_FILES)
***************
*** 88,97 ****
      done


! init-po: po/$(CATALOG_NAME).pot


! update-po: po/$(CATALOG_NAME).pot
  ifdef MSGMERGE
      @for lang in $(LANGUAGES); do \
        echo "merging $$lang:"; \
--- 89,98 ----
      done


! init-po: po/$(CATALOG_NAME_VER).pot


! update-po: po/$(CATALOG_NAME_VER).pot
  ifdef MSGMERGE
      @for lang in $(LANGUAGES); do \
        echo "merging $$lang:"; \
Index: src/interfaces/libpq/fe-misc.c
===================================================================
RCS file: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v
retrieving revision 1.114
diff -c -c -r1.114 fe-misc.c
*** src/interfaces/libpq/fe-misc.c    12 Jun 2005 00:00:21 -0000    1.114
--- src/interfaces/libpq/fe-misc.c    15 Jun 2005 03:11:52 -0000
***************
*** 1134,1140 ****
      {
          already_bound = 1;
          /* No relocatable lookup here because the binary could be anywhere */
!         bindtextdomain("libpq", getenv("PGLOCALEDIR") ? getenv("PGLOCALEDIR") : LOCALEDIR);
      }

      return dgettext("libpq", msgid);
--- 1134,1140 ----
      {
          already_bound = 1;
          /* No relocatable lookup here because the binary could be anywhere */
!         bindtextdomain("libpq" PG_VERSION, getenv("PGLOCALEDIR") ? getenv("PGLOCALEDIR") : LOCALEDIR);
      }

      return dgettext("libpq", msgid);
Index: src/port/path.c
===================================================================
RCS file: /cvsroot/pgsql/src/port/path.c,v
retrieving revision 1.51
diff -c -c -r1.51 path.c
*** src/port/path.c    26 Jan 2005 19:24:03 -0000    1.51
--- src/port/path.c    15 Jun 2005 03:11:53 -0000
***************
*** 507,513 ****
  void
  set_pglocale_pgservice(const char *argv0, const char *app)
  {
!     char        path[MAXPGPATH];
      char        my_exec_path[MAXPGPATH];
      char        env_path[MAXPGPATH + sizeof("PGSYSCONFDIR=")];    /* longer than
                                                                   * PGLOCALEDIR */
--- 507,514 ----
  void
  set_pglocale_pgservice(const char *argv0, const char *app)
  {
!     char        path[MAXPGPATH],
!                 app_with_version[MAXPGPATH + sizeof(PG_VERSION) - 1];
      char        my_exec_path[MAXPGPATH];
      char        env_path[MAXPGPATH + sizeof("PGSYSCONFDIR=")];    /* longer than
                                                                   * PGLOCALEDIR */
***************
*** 521,527 ****

  #ifdef ENABLE_NLS
      get_locale_path(my_exec_path, path);
!     bindtextdomain(app, path);
      textdomain(app);

      if (getenv("PGLOCALEDIR") == NULL)
--- 522,530 ----

  #ifdef ENABLE_NLS
      get_locale_path(my_exec_path, path);
!     StrNCpy(app_with_version, app, MAXPGPATH + sizeof(PG_VERSION) - 1);
!     strncat(app_with_version, PG_VERSION, MAXPGPATH + sizeof(PG_VERSION) - 2);
!     bindtextdomain(app_with_version, path);
      textdomain(app);

      if (getenv("PGLOCALEDIR") == NULL)

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: hash index work
Next
From: Bruce Momjian
Date:
Subject: Re: plperl features