]> git.saurik.com Git - apt.git/commitdiff
* aptconfiguration.cc:
authorDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 17 Feb 2010 23:35:25 +0000 (00:35 +0100)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 17 Feb 2010 23:35:25 +0000 (00:35 +0100)
  - include all existing Translation files in the Cache (Closes: 564137)

Previously if APT was executed with a different LC_* all these invocations
needed to rebuild the Cache as too many files were included or missing:
Now the lists-directory is checked for Translation-files and all these
will be included in getLanguages() regardless of the environment setting
(after a "none" so APT will not use them for displaying information).

apt-pkg/aptconfiguration.cc
apt-pkg/deb/debmetaindex.cc
debian/changelog
test/libapt/getlanguages_test.cc
test/libapt/run-tests.sh

index 9fd51ad5a95b6645ed8826f245d5365abe2d373f..b5f29472d556460ad55464f882d21f72ac0d4dcc 100644 (file)
 #include <apt-pkg/macros.h>
 #include <apt-pkg/strutl.h>
 
-#include <vector>
-#include <string>
+#include <sys/types.h>
+#include <dirent.h>
+
 #include <algorithm>
+#include <string>
+#include <vector>
                                                                        /*}}}*/
 namespace APT {
 // getCompressionTypes - Return Vector of usbale compressiontypes      /*{{{*/
@@ -119,6 +122,37 @@ std::vector<std::string> const Configuration::getLanguages(bool const &All,
                }
        }
 
+       // Include all Language codes we have a Translation file for in /var/lib/apt/lists
+       // so they will be all included in the Cache.
+       std::vector<string> builtin;
+       DIR *D = opendir(_config->FindDir("Dir::State::lists").c_str());
+       if (D != 0) {
+               builtin.push_back("none");
+               for (struct dirent *Ent = readdir(D); Ent != 0; Ent = readdir(D)) {
+                       string const name = Ent->d_name;
+                       size_t const foundDash = name.rfind("-");
+                       size_t const foundUnderscore = name.rfind("_");
+                       if (foundDash == string::npos || foundUnderscore == string::npos ||
+                           foundDash <= foundUnderscore ||
+                           name.substr(foundUnderscore+1, foundDash-(foundUnderscore+1)) != "Translation")
+                               continue;
+                       string const c = name.substr(foundDash+1);
+                       if (unlikely(c.empty() == true) || c == "en")
+                               continue;
+                       // Skip unusual files, like backups or that alike
+                       string::const_iterator s = c.begin();
+                       for (;s != c.end(); ++s) {
+                               if (isalpha(*s) == 0)
+                                       break;
+                       }
+                       if (s != c.end())
+                               continue;
+                       if (std::find(builtin.begin(), builtin.end(), c) != builtin.end())
+                               continue;
+                       builtin.push_back(c);
+               }
+       }
+
        // get the environment language codes: LC_MESSAGES (and later LANGUAGE)
        // we extract both, a long and a short code and then we will
        // check if we actually need both (rare) or if the short is enough
@@ -134,7 +168,11 @@ std::vector<std::string> const Configuration::getLanguages(bool const &All,
        if (envLong == "C") {
                codes.push_back("en");
                allCodes = codes;
-               return codes;
+               allCodes.insert(allCodes.end(), builtin.begin(), builtin.end());
+               if (All == true)
+                       return allCodes;
+               else
+                       return codes;
        }
 
        // to save the servers from unneeded queries, we only try also long codes
@@ -159,8 +197,16 @@ std::vector<std::string> const Configuration::getLanguages(bool const &All,
        if (oldAcquire.empty() == false && oldAcquire != "environment") {
                if (oldAcquire != "none")
                        codes.push_back(oldAcquire);
+               codes.push_back("en");
                allCodes = codes;
-               return codes;
+               for (std::vector<string>::const_iterator b = builtin.begin();
+                    b != builtin.end(); ++b)
+                       if (std::find(allCodes.begin(), allCodes.end(), *b) == allCodes.end())
+                               allCodes.push_back(*b);
+               if (All == true)
+                       return allCodes;
+               else
+                       return codes;
        }
 
        // It is very likely we will need to environment codes later,
@@ -207,7 +253,14 @@ std::vector<std::string> const Configuration::getLanguages(bool const &All,
                } else if (forceLang != "none")
                        codes.push_back(forceLang);
                allCodes = codes;
-               return codes;
+               for (std::vector<string>::const_iterator b = builtin.begin();
+                    b != builtin.end(); ++b)
+                       if (std::find(allCodes.begin(), allCodes.end(), *b) == allCodes.end())
+                               allCodes.push_back(*b);
+               if (All == true)
+                       return allCodes;
+               else
+                       return codes;
        }
 
        std::vector<string> const lang = _config->FindVector("Acquire::Languages");
@@ -217,7 +270,14 @@ std::vector<std::string> const Configuration::getLanguages(bool const &All,
                if (envShort != "en")
                        codes.push_back("en");
                allCodes = codes;
-               return codes;
+               for (std::vector<string>::const_iterator b = builtin.begin();
+                    b != builtin.end(); ++b)
+                       if (std::find(allCodes.begin(), allCodes.end(), *b) == allCodes.end())
+                               allCodes.push_back(*b);
+               if (All == true)
+                       return allCodes;
+               else
+                       return codes;
        }
 
        // the configs define the order, so add the environment
@@ -245,6 +305,12 @@ std::vector<std::string> const Configuration::getLanguages(bool const &All,
                        codes.push_back(*l);
                allCodes.push_back(*l);
        }
+
+       for (std::vector<string>::const_iterator b = builtin.begin();
+            b != builtin.end(); ++b)
+               if (std::find(allCodes.begin(), allCodes.end(), *b) == allCodes.end())
+                       allCodes.push_back(*b);
+
        if (All == true)
                return allCodes;
        else
index 8f28f053be887550eae6c64549ec11268b1cc718..520e94a807a0d80cb187ed0bab9bea062b2ca843 100644 (file)
@@ -181,6 +181,7 @@ bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool GetAll) const
       for (vector<string>::const_iterator l = lang.begin();
                l != lang.end(); l++)
       {
+       if (*l == "none") continue;
        debTranslationsIndex i = debTranslationsIndex(URI,Dist,(*I)->Section,(*l).c_str());
        i.GetIndexes(Owner);
       }
@@ -219,8 +220,10 @@ vector <pkgIndexFile *> *debReleaseIndex::GetIndexFiles()
          Indexes->push_back(new debPackagesIndex (URI, Dist, (*I)->Section, IsTrusted()));
 
         for (vector<string>::const_iterator l = lang.begin();
-               l != lang.end(); l++)
+               l != lang.end(); l++) {
+           if (*l == "none") continue;
            Indexes->push_back(new debTranslationsIndex(URI,Dist,(*I)->Section,(*l).c_str()));
+        }
       }
    }
 
index 47fe7adf9c14563b0087dac826b58d45d7db9216..d929fc18bd63e5bb1e6417700503f4a0c089d5d8 100644 (file)
@@ -26,6 +26,8 @@ apt (0.7.26) UNRELEASED; urgency=low
       Thanks to Aurelien Jarno for providing (again) a patch!
   * buildlib/apti18n.h.in, po/makefile:
     - add ngettext support with P_()
+  * aptconfiguration.cc:
+    - include all existing Translation files in the Cache (Closes: 564137)
 
   [ Ivan Masár ]
   * Slovak translation update. Closes: #568294
index fb7afb4ef675b0c11960ac67f01f686adf561bdf..0db190b507b9a0ff76ca78407d5f2fd4bcb99914 100644 (file)
@@ -16,9 +16,15 @@ void dumpVector(std::vector<std::string> vec) {
 
 int main(int argc,char *argv[])
 {
+       if (argc != 2) {
+               std::cout << "One parameter expected - given " << argc << std::endl;
+               return 100;
+       }
+
        char const* env[2];
        env[0] = "de_DE.UTF-8";
        env[1] = "";
+
        std::vector<std::string> vec = APT::Configuration::getLanguages(false, false, env);
        equals(vec.size(), 2);
        equals(vec[0], "de");
@@ -87,6 +93,16 @@ int main(int argc,char *argv[])
        equals(vec[0], "de");
        equals(vec[1], "en");
 
+       _config->Set("Dir::State::lists", argv[1]);
+       vec = APT::Configuration::getLanguages(true, false, env);
+       equals(vec.size(), 5);
+       equals(vec[0], "de");
+       equals(vec[1], "en");
+       equals(vec[2], "none");
+       equals(vec[3], "pt");
+       equals(vec[4], "tr");
+
+       _config->Set("Dir::State::lists", "/non-existing-dir");
        _config->Set("Acquire::Languages::1", "none");
        env[0] = "de_DE.UTF-8";
        vec = APT::Configuration::getLanguages(false, false, env);
@@ -113,12 +129,14 @@ int main(int argc,char *argv[])
                _config->Set("APT::Acquire::Translation", "ast_DE");
                env[0] = "de_DE.UTF-8";
                vec = APT::Configuration::getLanguages(true, false, env);
-               equals(vec.size(), 1);
+               equals(vec.size(), 2);
                equals(vec[0], "ast_DE");
+               equals(vec[1], "en");
                _config->Set("APT::Acquire::Translation", "none");
                env[0] = "de_DE.UTF-8";
                vec = APT::Configuration::getLanguages(true, false, env);
-               equals(vec.size(), 0);
+               equals(vec.size(), 1);
+               equals(vec[0], "en");
 
        return 0;
 }
index 1fcfb686110480de330042ca9f6dacb18fcfd2dd..f9df1af5fd21e505919ab1879bf46365a51c841e 100755 (executable)
@@ -39,6 +39,13 @@ do
                        "${tmppath}/01invalíd"
                ln -s "${tmppath}/anormalfile" "${tmppath}/linkedfile.list"
                ln -s "${tmppath}/non-existing-file" "${tmppath}/brokenlink.list"
+       elif [ $name = "getLanguages${EXT}" ]; then
+               echo "Prepare Testarea for \033[1;35m$name\033[0m ..."
+               tmppath=$(mktemp -d)
+               touch "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-tr" \
+                       "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-pt" \
+                       "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-se~" \
+                       "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-st.bak"
        fi
 
        echo -n "Testing with \033[1;35m${name}\033[0m ... "