#include "LaTeXPackages.h"
-#include "Lexer.h"
-
#include "support/convert.h"
+#include "support/debug.h"
#include "support/FileName.h"
#include "support/filetools.h"
+#include "support/gettext.h"
+#include "support/Lexer.h"
#include "support/lstrings.h"
+#include "support/Package.h"
-#include <regex>
+#include "frontends/alert.h"
using namespace std;
LaTeXPackages::Packages LaTeXPackages::packages_;
-void LaTeXPackages::getAvailable()
+void LaTeXPackages::getAvailable(bool retry)
{
Lexer lex;
support::FileName const real_file = libFileSearch("", "packages.lst");
packages_.clear();
bool finished = false;
+ string lstformat = "1";
// Parse config-file
while (lex.isOK() && !finished) {
switch (lex.lex()) {
// Parse optional version info
lex.eatLine();
string const v = trim(lex.getString());
+ if (p == "!!fileformat") {
+ lstformat = v;
+ continue;
+ }
packages_.insert(make_pair(p, v));
}
}
}
+ // Check if the pkglist has current format.
+ // Reconfigure once and re-parse if not.
+ if (lstformat != "2") {
+ // If we have already reconfigured, check if there is an outdated config file
+ // which produces the outdated lstformat
+ if (retry) {
+ // check if we have an outdated chkconfig.ltx file in user dir
+ support::FileName chkconfig = fileSearch(addPath(package().user_support().absFileName(), ""),
+ "chkconfig.ltx", string(), must_exist);
+ if (chkconfig.empty()) {
+ // nothing found. So we can only warn
+ frontend::Alert::warning(_("Invalid package list format!"),
+ _("The format of your LaTeX packages list is wrong. Please file a bug report."));
+ return;
+ }
+ // Found. Try to rename and warn.
+ support::FileName chkconfig_bak;
+ chkconfig_bak.set(chkconfig.absFileName() + ".bak");
+ if (chkconfig.renameTo(chkconfig_bak))
+ // renaming succeeded
+ frontend::Alert::warning(_("Outdated configuration script detected!"),
+ _("We have detected an outdated script 'chkconfig.ltx' in your user directory.\n"
+ "The script has been renamed to 'chkconfig.ltx.bak'.\n"
+ "If you did not copy the script there by purpose, you can safely delete it."));
+ else {
+ // renaming failed
+ frontend::Alert::warning(_("Outdated configuration script detected!"),
+ bformat(_("We have detected an outdated script 'chkconfig.ltx' in your user directory\n"
+ "(%1$s).\n"
+ "Please delete or update this file!"), from_utf8(chkconfig.absFileName())));
+ return;
+ }
+ }
+ package().reconfigureUserLyXDir("");
+ getAvailable(true);
+ }
}
if (packages_.empty())
getAvailable();
- bool result = false;
- // Check for yyyy[-/]mm[-/]dd
- static regex const reg("([\\d]{4})[-/]?([\\d]{2})[-/]?([\\d]{2})");
+ // required date as int (yyyymmdd)
+ int const req_date = (y * 10000) + (m * 100) + d;
for (auto const & package : packages_) {
if (package.first == name && !package.second.empty()) {
- smatch sub;
- if (regex_match(package.second, sub, reg)) {
- // Test whether date is same or newer.
- //
- // Test for year first
- int const avail_y = convert<int>(sub.str(1));
- if (avail_y < y)
- // our year is older: bad!
- break;
- if (avail_y > y) {
- // our year is newer: good!
- result = true;
- break;
- }
- // Same year: now test month
- int const avail_m = convert<int>(sub.str(2));
- if (avail_m < m)
- // our month is older: bad!
- break;
- if (avail_m > m) {
- // our month is newer: good!
- result = true;
- break;
- }
- // Same year and month: test day
- if (convert<int>(sub.str(3)) >= d) {
- // day same or newer: good!
- result = true;
- break;
- }
+ if (!isStrInt(package.second)) {
+ LYXERR0("Warning: Invalid date of package "
+ << package.first << " (" << package.second << ")");
+ continue;
}
+ // required date not newer than available date
+ return req_date <= convert<int>(package.second);
}
}
- return result;
+ return false;
}
} // namespace lyx