This is the mail archive of the cygwin-apps mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH setup] Add setup-minimum-version: to setup.ini


This allows setup.ini to require a certain setup version, rather than advise
a newer version when one is available.

Unfortunately, versions of setup prior to this one don't implement this, but
at least we have this going forward.

When we want to start using this, we can break backwards compatibility with
even older setup in a less clean way, simply by using setup.ini grammar that
they can't parse.
---
 IniDBBuilderPackage.cc | 16 ++++++++++++++++
 IniDBBuilderPackage.h  |  1 +
 inilex.ll              |  2 ++
 iniparse.yy            | 16 ++++++++++++----
 4 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/IniDBBuilderPackage.cc b/IniDBBuilderPackage.cc
index 8fa6ad9..ed861a5 100644
--- a/IniDBBuilderPackage.cc
+++ b/IniDBBuilderPackage.cc
@@ -65,6 +65,22 @@ IniDBBuilderPackage::buildVersion (const std::string& aVersion)
     }
 }
 
+const std::string
+IniDBBuilderPackage::buildMinimumVersion (const std::string& minimum)
+{
+  if (version_compare(setup_version, minimum) < 0)
+    {
+      char min_vers[256];
+      snprintf (min_vers, sizeof(min_vers),
+                "The current ini file requires at least version %s of setup.\n"
+                "Please download a newer version from http://www.cygwin.com/setup-%s.exe";,
+                minimum.c_str(),
+                is_64bit ? "x86_64" : "x86");
+      return min_vers;
+    }
+  return "";
+}
+
 void
 IniDBBuilderPackage::buildPackage (const std::string& _name)
 {
diff --git a/IniDBBuilderPackage.h b/IniDBBuilderPackage.h
index da2d97d..1fed420 100644
--- a/IniDBBuilderPackage.h
+++ b/IniDBBuilderPackage.h
@@ -37,6 +37,7 @@ public:
 
   void buildTimestamp (const std::string& );
   void buildVersion (const std::string& );
+  const std::string buildMinimumVersion(const std::string &);
   void buildPackage (const std::string& );
   void buildPackageVersion (const std::string& );
   void buildPackageSDesc (const std::string& );
diff --git a/inilex.ll b/inilex.ll
index 95888cf..41bf6a2 100644
--- a/inilex.ll
+++ b/inilex.ll
@@ -107,7 +107,9 @@ B64	[a-zA-Z0-9_-]
 
 "setup-timestamp:"	return SETUP_TIMESTAMP;
 "setup-version:"	return SETUP_VERSION;
+"setup-minimum-version:"	return SETUP_MINIMUM_VERSION;
 "arch:"			return ARCH;
+
 "release:"		return RELEASE;
 "Package:"		return PACKAGENAME;
 [vV]"ersion:"		return PACKAGEVERSION;
diff --git a/iniparse.yy b/iniparse.yy
index 1999536..991e788 100644
--- a/iniparse.yy
+++ b/iniparse.yy
@@ -35,8 +35,15 @@ IniDBBuilderPackage *iniBuilder;
 extern int yylineno;
 %}
 
-%token STRING 
-%token SETUP_TIMESTAMP SETUP_VERSION PACKAGEVERSION INSTALL SOURCE SDESC LDESC
+%token STRING
+%token SETUP_TIMESTAMP
+%token SETUP_VERSION
+%token SETUP_MINIMUM_VERSION
+%token PACKAGEVERSION
+%token INSTALL
+%token SOURCE
+%token SDESC
+%token LDESC
 %token REPLACE_VERSIONS
 %token CATEGORY DEPENDS REQUIRES
 %token T_PREV T_CURR T_TEST T_OTHER
@@ -59,12 +66,13 @@ whole_file
 setup_headers: /* empty */
  | setup_headers header
  ;
- 
+
 header /* non-empty */
  : SETUP_TIMESTAMP STRING	{ iniBuilder->buildTimestamp ($2); } NL
  | SETUP_VERSION STRING		{ iniBuilder->buildVersion ($2); } NL
  | RELEASE STRING		{ iniBuilder->set_release ($2); } NL
- | ARCH STRING 			{ iniBuilder->set_arch ($2); } NL
+ | ARCH STRING			{ iniBuilder->set_arch ($2); } NL
+ | SETUP_MINIMUM_VERSION STRING { std::string e = iniBuilder->buildMinimumVersion ($2); if (!e.empty()) { yyerror(e); } } NL
  ;
 
 packages: /* empty */
-- 
2.16.2


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]