Move install langs to per-transaction level
authorPanu Matilainen <pmatilai@redhat.com>
Sun, 30 Nov 2008 12:07:03 +0000 (14:07 +0200)
committerPanu Matilainen <pmatilai@redhat.com>
Sun, 30 Nov 2008 12:07:03 +0000 (14:07 +0200)
- install langs is clearly a per-transaction thing, avoid checking
  and splitting etc over and over for every package
- also if any of the %{_install_lang} is "all", disable all language
  processing as we'll be installing every language anyway

lib/rpmts.c
lib/rpmts_internal.h
lib/transaction.c

index 498ee66..a771f57 100644 (file)
@@ -600,6 +600,7 @@ rpmts rpmtsFree(rpmts ts)
 
     ts->keyring = rpmKeyringFree(ts->keyring);
     ts->netsharedPaths = argvFree(ts->netsharedPaths);
+    ts->installLangs = argvFree(ts->installLangs);
 
     if (_rpmts_stats)
        rpmtsPrintStats(ts);
@@ -1110,11 +1111,27 @@ rpmts rpmtsCreate(void)
     ts->prefcolor = rpmExpandNumeric("%{?_prefer_color}")?:2;
 
     ts->netsharedPaths = NULL;
+    ts->installLangs = NULL;
     {  char *tmp = rpmExpand("%{_netsharedpath}", NULL);
        if (tmp && *tmp != '%') {
            argvSplit(&ts->netsharedPaths, tmp, ":");
        }
        free(tmp);
+
+       tmp = rpmExpand("%{_install_langs}", NULL);
+       if (tmp && *tmp != '%') {
+           ARGV_t langs = NULL;
+           argvSplit(&langs, tmp, ":");        
+           /* If we'll be installing all languages anyway, don't bother */
+           for (ARGV_t l = langs; *l; l++) {
+               if (strcmp(*l, "all") == 0) {
+                   langs = argvFree(langs);
+                   break;
+               }
+           }
+           ts->installLangs = langs;
+       }
+       free(tmp);
     }
 
     ts->numRemovedPackages = 0;
index f138d87..793cdbd 100644 (file)
@@ -89,6 +89,7 @@ struct rpmts_s {
     rpmKeyring keyring;                /*!< Keyring in use. */
 
     ARGV_t netsharedPaths;     /*!< From %{_netsharedpath} */
+    ARGV_t installLangs;       /*!< From %{_install_langs} */
 
     struct rpmop_s ops[RPMTS_OP_MAX];
 
index a76b1a8..fc193f2 100644 (file)
@@ -394,7 +394,6 @@ static void skipFiles(const rpmts ts, rpmfi fi)
     rpm_color_t FColor;
     int noConfigs = (rpmtsFlags(ts) & RPMTRANS_FLAG_NOCONFIGS);
     int noDocs = (rpmtsFlags(ts) & RPMTRANS_FLAG_NODOCS);
-    ARGV_t languages = NULL;
     const char * dn, * bn;
     size_t dnlen, bnlen;
     char * s;
@@ -406,15 +405,6 @@ static void skipFiles(const rpmts ts, rpmfi fi)
     if (!noDocs)
        noDocs = rpmExpandNumeric("%{_excludedocs}");
 
-    s = rpmExpand("%{_install_langs}", NULL);
-    if (!(s && *s != '%'))
-       s = _free(s);
-    if (s) {
-       argvSplit(&languages, s, ":");  
-       s = _free(s);
-    } else
-       languages = NULL;
-
     /* Compute directory refcount, skip directory if now empty. */
     dc = rpmfiDC(fi);
     drc = xcalloc(dc, sizeof(*drc));
@@ -494,13 +484,10 @@ static void skipFiles(const rpmts ts, rpmfi fi)
        /*
         * Skip i18n language specific files.
         */
-       flangs = rpmfiFLangs(fi);
-       if (languages != NULL && flangs != NULL) {
+       if (ts->installLangs != NULL && (flangs = rpmfiFLangs(fi)) != NULL) {
            const char *l, *le;
            char **lang;
-           for (lang = languages; *lang != NULL; lang++) {
-               if (!strcmp(*lang, "all"))
-                   break;
+           for (lang = ts->installLangs; *lang != NULL; lang++) {
                for (l = flangs; *l != '\0'; l = le) {
                    for (le = l; *le != '\0' && *le != '|'; le++)
                        {};
@@ -589,7 +576,6 @@ static void skipFiles(const rpmts ts, rpmfi fi)
        }
     }
 
-    if (languages) argvFree(languages);
     free(drc);
     free(dff);
 }