[setup - the official Cygwin setup program] branch master, updated. release_2.889-17-g5fa727e

jturney-9JcytcrH/[email protected]
Newsgroups gmane.os.cygwin.cvs.apps
Message-ID <[email protected]>


https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=5fa727e1cf705ad7564a9b3ee0b6f33c740970ab

commit 5fa727e1cf705ad7564a9b3ee0b6f33c740970ab
Author: Ken Brown <[email protected]>
Date:   Sun Mar 11 10:43:06 2018 -0400

    Make SolvableVersion::accessible() useful for local installs
    
    For local installs, we need SolvableVersion::accessible() indicate whether
    or not there is an archive available in the local cache.
    
    This is used in packagemeta::set_action() to prevent the chooser from
    offering unavailable versions for re-installation.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=972b2d9a1519183cfb697d1f2de1f071f15c9e02

commit 972b2d9a1519183cfb697d1f2de1f071f15c9e02
Author: Jon Turney <[email protected]>
Date:   Wed Mar 14 14:52:57 2018 +0000

    Remove packages not found by scan from solver
    
    Remove not-installed packages not found by scan from solver, as well as from
    packagemeta, to avoid solutions including them from being proposed.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=79438590ed53d2d6e34b939fdfbbc59dd7d25adb

commit 79438590ed53d2d6e34b939fdfbbc59dd7d25adb
Author: Jon Turney <[email protected]>
Date:   Wed Mar 7 14:47:45 2018 +0000

    Add a --version option
    
    Add a --version option, and make some related tweaks to output

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=e6433da618859ee351fb98c8cc2c240c482e6482

commit e6433da618859ee351fb98c8cc2c240c482e6482
Author: Jon Turney <[email protected]>
Date:   Wed Mar 7 15:28:12 2018 +0000

    Add conflicts: support

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=9c3e325621f42d5a1bbb84b5edf5f3d4b30726bd

commit 9c3e325621f42d5a1bbb84b5edf5f3d4b30726bd
Author: Jon Turney <[email protected]>
Date:   Wed Mar 7 15:20:56 2018 +0000

    Add provides: support


Diff:
---
 .gitignore             |   16 +++++++++-----
 IniDBBuilderPackage.cc |   49 ++++++++++++++++++++++++++++++++++++++++++++++++
 IniDBBuilderPackage.h  |    5 ++++
 choose.cc              |    7 +----
 inilex.ll              |    4 +++
 iniparse.yy            |   24 ++++++++++++++++++----
 libsolv.cc             |   41 ++++++++++++++++++++++++++++-----------
 libsolv.h              |    4 +++
 main.cc                |   21 +++++++++++++++----
 package_db.cc          |    4 +++
 package_meta.cc        |   30 ++++++++++++++--------------
 package_meta.h         |    2 +-
 splash.cc              |    2 +-
 13 files changed, 159 insertions(+), 50 deletions(-)

diff --git a/.gitignore b/.gitignore
index b5ae865..6241d8e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,15 +1,19 @@
+.dirstamp
+.libs
 aclocal.m4
+autoconf.h*
 autom4te.cache
 cfgaux
+config.cache
+config.status
 configure
 configure.lineno
+libtool
+Makefile
 Makefile.in
-GNUmakefile
-make.out
-CVS
-tags
-TAGS
-autoconf.h.in*
+stamp-h1
+
 inilex.cc
 iniparse.cc
 iniparse.hh
+setup_version.c
diff --git a/IniDBBuilderPackage.cc b/IniDBBuilderPackage.cc
index 8fa6ad9..d560cb7 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)
 {
@@ -88,12 +104,16 @@ IniDBBuilderPackage::buildPackage (const std::string& _name)
   cbpv.spkg_id = packageversion();
   cbpv.requires = NULL;
   cbpv.obsoletes = NULL;
+  cbpv.provides = NULL;
+  cbpv.conflicts = NULL;
   cbpv.archive = packagesource();
 
   currentSpec = NULL;
   currentNodeList = NULL;
   dependsNodeList = PackageDepends();
   obsoletesNodeList = PackageDepends();
+  providesNodeList = PackageDepends();
+  conflictsNodeList = PackageDepends();
 #if DEBUG
   Log (LOG_BABBLE) << "Created package " << name << endLog;
 #endif
@@ -161,6 +181,8 @@ IniDBBuilderPackage::buildPackageSource (const std::string& path,
   cspv.type = package_source;
   cspv.requires = NULL;
   cspv.obsoletes = NULL;
+  cspv.provides = NULL;
+  cspv.conflicts = NULL;
 
   /* set archive path, size, mirror, hash */
   cspv.archive = packagesource();
@@ -243,6 +265,30 @@ IniDBBuilderPackage::buildBeginObsoletes ()
 }
 
 void
+IniDBBuilderPackage::buildBeginProvides ()
+{
+#if DEBUG
+  Log (LOG_BABBLE) << "Beginning of a provides statement" << endLog;
+#endif
+  currentSpec = NULL;
+  providesNodeList = PackageDepends();
+  currentNodeList = &providesNodeList;
+  cbpv.provides = &providesNodeList;
+}
+
+void
+IniDBBuilderPackage::buildBeginConflicts ()
+{
+#if DEBUG
+  Log (LOG_BABBLE) << "Beginning of a conflicts statement" << endLog;
+#endif
+  currentSpec = NULL;
+  conflictsNodeList = PackageDepends();
+  currentNodeList = &conflictsNodeList;
+  cbpv.conflicts = &conflictsNodeList;
+}
+
+void
 IniDBBuilderPackage::buildSourceName (const std::string& _name)
 {
   // When there is a Source: line, that names a real source package
@@ -341,4 +387,7 @@ IniDBBuilderPackage::process ()
   cbpv.spkg = PackageSpecification();
   cbpv.spkg_id = packageversion();
   cbpv.archive = packagesource();
+  obsoletesNodeList = PackageDepends();
+  providesNodeList = PackageDepends();
+  conflictsNodeList = PackageDepends();
 }
diff --git a/IniDBBuilderPackage.h b/IniDBBuilderPackage.h
index da2d97d..79a864e 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& );
@@ -52,6 +53,8 @@ public:
   void buildBeginDepends ();
   void buildBeginBuildDepends ();
   void buildBeginObsoletes ();
+  void buildBeginProvides ();
+  void buildBeginConflicts ();
   void buildMessage (const std::string&, const std::string&);
   void buildSourceName (const std::string& );
   void buildSourceNameVersion (const std::string& );
@@ -82,6 +85,8 @@ private:
   PackageDepends *currentNodeList;
   PackageDepends dependsNodeList;
   PackageDepends obsoletesNodeList;
+  PackageDepends providesNodeList;
+  PackageDepends conflictsNodeList;
   SolverPool::addPackageData cbpv;
   std::set <std::string> replace_versions;
 
diff --git a/choose.cc b/choose.cc
index 9cf3a50..5a4d3ad 100644
--- a/choose.cc
+++ b/choose.cc
@@ -137,11 +137,8 @@ ChooserPage::createListview ()
 {
   SetBusy ();
   static std::vector<packagemeta *> empty_cat;
-  static Category dummy_cat (std::string ("No packages found."), empty_cat);
-  packagedb db;
-  packagedb::categoriesType::iterator it = db.categories.find("All");
-  Category &cat = (it == db.categories.end ()) ? dummy_cat : *it;
-  chooser = new PickView (cat);
+  static Category dummy_cat (std::string ("All"), empty_cat);
+  chooser = new PickView (dummy_cat);
   RECT r = getDefaultListViewSize();
   if (!chooser->Create(this, WS_CHILD | WS_HSCROLL | WS_VSCROLL | WS_VISIBLE,&r))
     throw new Exception (TOSTRING(__LINE__) " " __FILE__,
diff --git a/inilex.ll b/inilex.ll
index 95888cf..209152f 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;
@@ -125,6 +127,8 @@ B64	[a-zA-Z0-9_-]
 [dD]"epends:"		return DEPENDS;
 [dD]"epends2:"		return DEPENDS;
 [oO]"bsoletes:"	return OBSOLETES;
+[pP]"rovides:"		return PROVIDES;
+[cC]"onflicts:"	return CONFLICTS;
 
 ^{STR}":"		ignore_line ();
 
diff --git a/iniparse.yy b/iniparse.yy
index 1999536..f85fe13 100644
--- a/iniparse.yy
+++ b/iniparse.yy
@@ -35,10 +35,21 @@ 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 CATEGORY
+%token DEPENDS
+%token REQUIRES
+%token PROVIDES
+%token CONFLICTS
 %token T_PREV T_CURR T_TEST T_OTHER
 %token MD5 SHA512
 %token SOURCEPACKAGE
@@ -59,12 +70,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 */
@@ -106,6 +118,8 @@ singleitem /* non-empty */
  | REQUIRES { iniBuilder->buildBeginDepends(); } versionedpackagelistsp NL
  | BUILDDEPENDS { iniBuilder->buildBeginBuildDepends(); } versionedpackagelist NL
  | OBSOLETES { iniBuilder->buildBeginObsoletes(); } versionedpackagelist NL
+ | PROVIDES { iniBuilder->buildBeginProvides(); } versionedpackagelist NL
+ | CONFLICTS { iniBuilder->buildBeginConflicts(); } versionedpackagelist NL
  | REPLACE_VERSIONS versionlist NL
 
  | MESSAGE STRING STRING NL	{ iniBuilder->buildMessage ($2, $3); }
diff --git a/libsolv.cc b/libsolv.cc
index 0dc7557..2eb04e2 100644
--- a/libsolv.cc
+++ b/libsolv.cc
@@ -14,6 +14,7 @@
 #include "libsolv.h"
 #include "package_db.h"
 #include "package_meta.h"
+#include "resource.h"
 
 #include "solv/solver.h"
 #include "solv/solverdebug.h"
@@ -242,18 +243,20 @@ SolvableVersion::source() const
 bool
 SolvableVersion::accessible () const
 {
-  // The 'accessible' check used to test if an archive was available locally or
-  // from a mirror.
-  //
-  // This seems utterly pointless. as binary packages which aren't 'accessible'
-  // never get to appear in the package list.
-  //
-  // For source packages, it's equivalent to the bool conversion operator.)
+  // empty packages are never accessible
+  if (id == 0)
+    return false;
+
+  // If we're doing a local re-install, is there an archive available?
   //
-  if (id != 0)
-    return TRUE;
-  else
-    return FALSE;
+  // (This assumes that packagemeta::ScanDownloadedFiles() has already been
+  // called to check for presence in the package cache, which would have removed
+  // the version if not available, unless it is already installed)
+  if (::source == IDC_SOURCE_LOCALDIR)
+    return source ()->Cached ();
+
+  // Otherwise, package is (presumably) retrievable
+  return true;
 }
 
 package_stability_t
@@ -304,6 +307,16 @@ SolvableVersion::compareVersions(const SolvableVersion &a,
   return pool_evrcmp(pool, evra, evrb, EVRCMP_COMPARE);
 }
 
+void
+SolvableVersion::remove() const
+{
+  if (!id)
+    return;
+
+  Solvable *solvable = pool_id2solvable(pool, id);
+  repo_free_solvable(solvable->repo, id, 0);
+}
+
 // ---------------------------------------------------------------------------
 // implements class SolverPool
 //
@@ -438,8 +451,10 @@ SolverPool::addPackage(const std::string& pkgname, const addPackageData &pkgdata
   solvable->arch = (pkgdata.type == package_binary) ? ARCH_ANY : ARCH_SRC;
   solvable->evr = pool_str2id(repo->pool, pkgdata.version.c_str(), 1);
   solvable->vendor = pool_str2id(repo->pool, pkgdata.vendor.c_str(), 1);
+  if (pkgdata.provides)
+    solvable->provides = makedeps(repo, pkgdata.provides);
   /* in the absence of specific provides, we provide what we obsolete */
-  if (pkgdata.obsoletes)
+  else if (pkgdata.obsoletes)
     solvable->provides = makedeps(repo, pkgdata.obsoletes);
   /* we always provide ourselves */
   solvable->provides = repo_addid_dep(repo, solvable->provides, pool_rel2id(pool, solvable->name, solvable->evr, REL_EQ, 1), 0);
@@ -447,6 +462,8 @@ SolverPool::addPackage(const std::string& pkgname, const addPackageData &pkgdata
     solvable->requires = makedeps(repo, pkgdata.requires);
   if (pkgdata.obsoletes)
     solvable->obsoletes = makedeps(repo, pkgdata.obsoletes);
+  if (pkgdata.conflicts)
+    solvable->conflicts = makedeps(repo, pkgdata.conflicts);
 
   /* a solvable can also store arbitrary attributes not needed for dependency
      resolution, if we need them */
diff --git a/libsolv.h b/libsolv.h
index 6a6e0b3..7bb0be2 100644
--- a/libsolv.h
+++ b/libsolv.h
@@ -88,6 +88,8 @@ class SolvableVersion
   bool operator > (SolvableVersion const &) const;
   bool operator >= (SolvableVersion const &) const;
 
+  void remove() const;
+
  private:
   Id id;
   Pool *pool;
@@ -148,6 +150,8 @@ public:
     SolvableVersion spkg_id;
     PackageDepends *requires;
     PackageDepends *obsoletes;
+    PackageDepends *provides;
+    PackageDepends *conflicts;
   };
 
   SolvableVersion addPackage(const std::string& pkgname,
diff --git a/main.cc b/main.cc
index 2e57f94..9ca3f25 100644
--- a/main.cc
+++ b/main.cc
@@ -94,6 +94,7 @@ static BoolOption PackageManagerOption (false, 'M', "package-manager", "Semi-att
 static BoolOption NoAdminOption (false, 'B', "no-admin", "Do not check for and enforce running as Administrator");
 static BoolOption WaitOption (false, 'W', "wait", "When elevating, wait for elevated child process");
 static BoolOption HelpOption (false, 'h', "help", "Print help");
+static BoolOption VersionOption (false, 'V', "version", "Show version");
 static StringOption SetupBaseNameOpt ("setup", 'i', "ini-basename", "Use a different basename, e.g. \"foo\", instead of \"setup\"", false);
 BoolOption UnsupportedOption (false, '\0', "allow-unsupported-windows", "Allow old, unsupported Windows versions");
 std::string SetupBaseName;
@@ -262,7 +263,9 @@ WinMain (HINSTANCE h,
     unattended_mode = PackageManagerOption ? chooseronly
 			: (UnattendedOption ? unattended : attended);
 
-    if (unattended_mode || help_option)
+    bool output_only = help_option || VersionOption;
+
+    if (unattended_mode || output_only)
       set_cout ();
 
     SetupBaseName = SetupBaseNameOpt;
@@ -273,7 +276,7 @@ WinMain (HINSTANCE h,
        supposed to elevate. */
     nt_sec.initialiseWellKnownSIDs ();
     /* Check if we have to elevate. */
-    bool elevate = !help_option && OSMajorVersion () >= 6
+    bool elevate = !output_only && OSMajorVersion () >= 6
 		   && !NoAdminOption && !nt_sec.isRunAsAdmin ();
 
     /* Start logging only if we don't elevate.  Same for setting default
@@ -281,8 +284,8 @@ WinMain (HINSTANCE h,
     LogSingleton::SetInstance (*LogFile::createLogFile ());
     const char *sep = isdirsep (local_dir[local_dir.size () - 1])
 				? "" : "\\";
-    /* Don't create log files for help output only. */
-    if (!elevate && !help_option)
+    /* Don't create log files for help or version output only. */
+    if (!elevate && !output_only)
       {
 	Logger ().setFile (LOG_BABBLE, local_dir + sep + "setup.log.full",
 			   false);
@@ -294,7 +297,8 @@ WinMain (HINSTANCE h,
     if (help_option)
       {
 	if (invalid_option)
-	  Log (LOG_PLAIN) << "\nError during option processing." << endLog;
+	  Log (LOG_PLAIN) << "\nError during option processing.\n" << endLog;
+        Log (LOG_PLAIN) << "Cygwin setup " << setup_version << endLog;
 	Log (LOG_PLAIN) << "\nCommand Line Options:\n" << endLog;
 	GetOption::GetInstance ().ParameterUsage (Log (LOG_PLAIN));
 	Log (LOG_PLAIN) << endLog;
@@ -303,6 +307,13 @@ WinMain (HINSTANCE h,
 	goto finish_up;
       }
 
+    if (VersionOption)
+      {
+        Log (LOG_PLAIN) << "Cygwin setup " << setup_version << endLog;
+        Logger ().exit (0, false);
+        goto finish_up;
+      }
+
     /* Check if Cygwin works on this Windows version */
     if (!UnsupportedOption && (OSMajorVersion () < 6))
       {
diff --git a/package_db.cc b/package_db.cc
index 730cb78..072b419 100644
--- a/package_db.cc
+++ b/package_db.cc
@@ -134,6 +134,8 @@ packagedb::read ()
                   data.vendor = "cygwin";
                   data.requires = NULL;
                   data.obsoletes = NULL;
+                  data.provides = NULL;
+                  data.conflicts = NULL;
                   data.sdesc = "";
                   data.ldesc = "";
                   data.stability = TRUST_UNKNOWN;
@@ -206,6 +208,8 @@ packagedb::makeBase()
   data.sdesc = "Ficitious package that requires all Base packages";
   data.ldesc = "Ficitious package that requires all Base packages";
   data.obsoletes = NULL;
+  data.provides = NULL;
+  data.conflicts = NULL;
   data.stability = TRUST_CURR;
   // data.spkg = PackageSpecification();
   // data.spkg_id = packageversion();
diff --git a/package_meta.cc b/package_meta.cc
index c488e35..7f8110d 100644
--- a/package_meta.cc
+++ b/package_meta.cc
@@ -664,33 +664,30 @@ packagemeta::logSelectionStatus() const
 }
 
 /* scan for local copies of package */
-void
+bool
 packagemeta::scan (const packageversion &pkg, bool mirror_mode)
 {
-  /* Already have something */
+  /* empty version */
   if (!pkg)
-    return;
+    return false;
 
-  /* Remove mirror sites.
-   * FIXME: This is a bit of a hack.
-   */
   try
     {
       if (!check_for_cached (*(pkg.source ()), NULL, mirror_mode, false)
-	  && ::source == IDC_SOURCE_LOCALDIR)
-	pkg.source ()->sites.clear ();
+          && ::source == IDC_SOURCE_LOCALDIR)
+        return false;
     }
   catch (Exception * e)
     {
       // We can ignore these, since we're clearing the source list anyway
       if (e->errNo () == APPERR_CORRUPT_PACKAGE)
-	{
-	  pkg.source ()->sites.clear ();
-	  return;
-	}
+        return false;
+
       // Unexpected exception.
       throw e;
     }
+
+  return true;
 }
 
 void
@@ -712,22 +709,25 @@ packagemeta::ScanDownloadedFiles (bool mirror_mode)
 			   && (*i != pkg.installed
 			       || pkg.installed == pkg.curr
 			       || pkg.installed == pkg.exp);
-	  scan (*i, lazy_scan);
+	  bool accessible = scan (*i, lazy_scan);
 	  packageversion foo = *i;
 	  packageversion pkgsrcver = foo.sourcePackage ();
-	  scan (pkgsrcver, lazy_scan);
+	  bool src_accessible = scan (pkgsrcver, lazy_scan);
 
 	  /* For local installs, if there is no src and no bin, the version
 	   * is unavailable
 	   */
-	  if (!i->accessible () && !pkgsrcver.accessible ()
+	  if (!accessible && !src_accessible
 	      && *i != pkg.installed)
 	    {
 	      if (pkg.curr == *i)
 		pkg.curr = packageversion ();
 	      if (pkg.exp == *i)
 		pkg.exp = packageversion ();
+
+	      i->remove();
 	      pkg.versions.erase (i++);
+
 	      /* For now, leave the source version alone */
 	    }
 	  else
diff --git a/package_meta.h b/package_meta.h
index 32372e2..600a163 100644
--- a/package_meta.h
+++ b/package_meta.h
@@ -170,7 +170,7 @@ protected:
 private:
   std::string trustLabel(packageversion const &) const;
   std::vector <Script> scripts_;
-  static void scan (const packageversion &pkg, bool mirror_mode);
+  static bool scan (const packageversion &pkg, bool mirror_mode);
 
   bool _picked; /* true if desired version is to be (re)installed */
   bool _srcpicked;
diff --git a/splash.cc b/splash.cc
index 265c3eb..8f24d2f 100644
--- a/splash.cc
+++ b/splash.cc
@@ -44,7 +44,7 @@ SplashPage::Create ()
 void
 SplashPage::OnInit ()
 {
-  std::string ver = "Setup.exe version ";
+  std::string ver = "Setup version ";
   ver += (setup_version[0] ? setup_version : "[unknown]");
   ver += is_64bit ? " (64 bit)" : " (32 bit)";
   SetDlgItemFont(IDC_VERSION, "Arial", 10, FW_BOLD);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.