[paludis-commits] r4550 - in trunk: . paludis/repositories/e

dleverton at svn.pioto.org dleverton at svn.pioto.org
Fri Apr 11 13:41:43 UTC 2008


Author: dleverton
Date: 2008-04-11 13:41:42 +0000 (Fri, 11 Apr 2008)
New Revision: 4550

Modified:
   trunk/ChangeLog
   trunk/paludis/repositories/e/vdb_repository.cc
   trunk/paludis/repositories/e/vdb_repository_TEST.cc
   trunk/paludis/repositories/e/vdb_repository_TEST_setup.sh
Log:
Fix reinstalling a package with an equivalent but textually different version.


Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-04-09 21:09:05 UTC (rev 4549)
+++ trunk/ChangeLog	2008-04-11 13:41:42 UTC (rev 4550)
@@ -5,6 +5,11 @@
 only listed in SVN log. For a summary of what has changed between releases,
 see the NEWS file. This file is occasionally pruned to ChangeLog.old.bz2.
 
+2008-04-11 David Leverton
+
+	* paludis/repositories/e/: Fix reinstalling a package with an
+	equivalent but textually different version.
+
 2008-04-09 David Leverton
 
 	* paludis/: Speed up NDBAM a little.

Modified: trunk/paludis/repositories/e/vdb_repository.cc
===================================================================
--- trunk/paludis/repositories/e/vdb_repository.cc	2008-04-09 21:09:05 UTC (rev 4549)
+++ trunk/paludis/repositories/e/vdb_repository.cc	2008-04-11 13:41:42 UTC (rev 4550)
@@ -464,13 +464,13 @@
             }
         if (only)
             _imp->names_cache->remove(id->name());
+    }
 
-        if (_imp->used_provides_cache || (! _imp->tried_provides_cache && load_provided_using_cache()))
-        {
-            _imp->provides_map->erase(std::make_pair(id->name(), id->version()));
-            write_provides_cache();
-            _imp->provides.reset();
-        }
+    if (_imp->used_provides_cache || (! _imp->tried_provides_cache && load_provided_using_cache()))
+    {
+        _imp->provides_map->erase(std::make_pair(id->name(), id->version()));
+        write_provides_cache();
+        _imp->provides.reset();
     }
 }
 
@@ -824,12 +824,16 @@
 
     if (is_replace)
     {
-        if ((vdb_dir.dirname() / ("-reinstalling-" + vdb_dir.basename())).exists())
-            throw InstallActionError("Directory '" + stringify(vdb_dir.dirname() /
-                        ("-reinstalling-" + vdb_dir.basename())) + "' already exists, probably due to "
+        FSEntry old_vdb_dir(_imp->params.location);
+        old_vdb_dir /= stringify(is_replace->name().category);
+        old_vdb_dir /= (stringify(is_replace->name().package) + "-" + stringify(is_replace->version()));
+
+        if ((old_vdb_dir.dirname() / ("-reinstalling-" + old_vdb_dir.basename())).exists())
+            throw InstallActionError("Directory '" + stringify(old_vdb_dir.dirname() /
+                        ("-reinstalling-" + old_vdb_dir.basename())) + "' already exists, probably due to "
                     "a previous failed upgrade. If it is safe to do so, remove this directory and try "
                     "again.");
-        vdb_dir.rename(vdb_dir.dirname() / ("-reinstalling-" + vdb_dir.basename()));
+        old_vdb_dir.rename(old_vdb_dir.dirname() / ("-reinstalling-" + old_vdb_dir.basename()));
     }
 
     tmp_vdb_dir.rename(vdb_dir);

Modified: trunk/paludis/repositories/e/vdb_repository_TEST.cc
===================================================================
--- trunk/paludis/repositories/e/vdb_repository_TEST.cc	2008-04-09 21:09:05 UTC (rev 4549)
+++ trunk/paludis/repositories/e/vdb_repository_TEST.cc	2008-04-11 13:41:42 UTC (rev 4550)
@@ -975,6 +975,17 @@
             }
 
             {
+                TestMessageSuffix suffix("reinstall equivalent", true);
+                const tr1::shared_ptr<const PackageID> id(*env.package_database()->query(query::Matches(
+                                PackageDepSpec(parse_user_package_dep_spec("=cat1/pkg1-1.1::providesincrtest_src2",
+                                        UserPackageDepSpecOptions()))), qo_require_exactly_one)->last());
+                id->perform_action(install_action);
+                vdb_repo->invalidate();
+
+                TEST_CHECK_EQUAL(read_file(provides_cache), "paludis-3\ninstalled\ncat1/pkg1 1.1-r0 virtual/foo\n");
+            }
+
+            {
                 TestMessageSuffix suffix("downgrade", true);
                 const tr1::shared_ptr<const PackageID> id(*env.package_database()->query(query::Matches(
                                 PackageDepSpec(parse_user_package_dep_spec("=cat1/pkg1-1::providesincrtest_src1",
@@ -1066,5 +1077,110 @@
             return ss.str();
         }
     } test_provides_cache_incremental;
+
+    struct ReinstallTest : TestCase
+    {
+        ReinstallTest() : TestCase("reinstall") { }
+
+        bool repeatable() const
+        {
+            return false;
+        }
+
+        unsigned max_run_time() const
+        {
+            return 3000;
+        }
+
+        void run()
+        {
+            TestEnvironment env;
+            env.set_paludis_command("/bin/false");
+            tr1::shared_ptr<Map<std::string, std::string> > keys(new Map<std::string, std::string>);
+            keys->insert("format", "ebuild");
+            keys->insert("names_cache", "/var/empty");
+            keys->insert("location", "vdb_repository_TEST_dir/reinstalltest_src1");
+            keys->insert("profiles", "vdb_repository_TEST_dir/reinstalltest_src1/profiles/profile");
+            keys->insert("layout", "traditional");
+            keys->insert("eapi_when_unknown", "0");
+            keys->insert("eapi_when_unspecified", "0");
+            keys->insert("profile_eapi", "0");
+            keys->insert("distdir", stringify(FSEntry::cwd() / "vdb_repository_TEST_dir" / "distdir"));
+            keys->insert("builddir", stringify(FSEntry::cwd() / "vdb_repository_TEST_dir" / "build"));
+            keys->insert("root", stringify(FSEntry("vdb_repository_TEST_dir/root").realpath()));
+            tr1::shared_ptr<ERepository> repo1(make_ebuild_repository(&env, keys));
+            env.package_database()->add_repository(1, repo1);
+
+            keys.reset(new Map<std::string, std::string>);
+            keys->insert("format", "ebuild");
+            keys->insert("names_cache", "/var/empty");
+            keys->insert("location", "vdb_repository_TEST_dir/reinstalltest_src2");
+            keys->insert("profiles", "vdb_repository_TEST_dir/reinstalltest_src1/profiles/profile");
+            keys->insert("layout", "traditional");
+            keys->insert("eapi_when_unknown", "0");
+            keys->insert("eapi_when_unspecified", "0");
+            keys->insert("profile_eapi", "0");
+            keys->insert("distdir", stringify(FSEntry::cwd() / "vdb_repository_TEST_dir" / "distdir"));
+            keys->insert("builddir", stringify(FSEntry::cwd() / "vdb_repository_TEST_dir" / "build"));
+            keys->insert("root", stringify(FSEntry("vdb_repository_TEST_dir/root").realpath()));
+            tr1::shared_ptr<ERepository> repo2(make_ebuild_repository(&env, keys));
+            env.package_database()->add_repository(2, repo2);
+
+            keys.reset(new Map<std::string, std::string>);
+            keys->insert("format", "vdb");
+            keys->insert("names_cache", "/var/empty");
+            keys->insert("provides_cache", "/var/empty");
+            keys->insert("location", "vdb_repository_TEST_dir/reinstalltest");
+            keys->insert("builddir", stringify(FSEntry::cwd() / "vdb_repository_TEST_dir" / "build"));
+            keys->insert("root", stringify(FSEntry("vdb_repository_TEST_dir/root").realpath()));
+            tr1::shared_ptr<Repository> vdb_repo(VDBRepository::make_vdb_repository(&env, keys));
+            env.package_database()->add_repository(0, vdb_repo);
+
+            InstallAction install_action(InstallActionOptions::named_create()
+                    (k::debug_build(), iado_none)
+                    (k::checks(), iaco_default)
+                    (k::no_config_protect(), false)
+                    (k::destination(), vdb_repo)
+                    );
+
+            TEST_CHECK(vdb_repo->package_ids(QualifiedPackageName("cat/pkg"))->empty());
+
+            {
+                TestMessageSuffix suffix("install", true);
+                const tr1::shared_ptr<const PackageID> id(*env.package_database()->query(query::Matches(
+                                PackageDepSpec(parse_user_package_dep_spec("=cat/pkg-1::reinstalltest_src1",
+                                        UserPackageDepSpecOptions()))), qo_require_exactly_one)->last());
+                id->perform_action(install_action);
+                vdb_repo->invalidate();
+
+                tr1::shared_ptr<const PackageIDSequence> ids(vdb_repo->package_ids(QualifiedPackageName("cat/pkg")));
+                TEST_CHECK_EQUAL(join(indirect_iterator(ids->begin()), indirect_iterator(ids->end()), " "), "cat/pkg-1::installed");
+            }
+
+            {
+                TestMessageSuffix suffix("reinstall", true);
+                const tr1::shared_ptr<const PackageID> id(*env.package_database()->query(query::Matches(
+                                PackageDepSpec(parse_user_package_dep_spec("=cat/pkg-1::reinstalltest_src1",
+                                        UserPackageDepSpecOptions()))), qo_require_exactly_one)->last());
+                id->perform_action(install_action);
+                vdb_repo->invalidate();
+
+                tr1::shared_ptr<const PackageIDSequence> ids(vdb_repo->package_ids(QualifiedPackageName("cat/pkg")));
+                TEST_CHECK_EQUAL(join(indirect_iterator(ids->begin()), indirect_iterator(ids->end()), " "), "cat/pkg-1::installed");
+            }
+
+            {
+                TestMessageSuffix suffix("reinstall equivalent", true);
+                const tr1::shared_ptr<const PackageID> id(*env.package_database()->query(query::Matches(
+                                PackageDepSpec(parse_user_package_dep_spec("=cat/pkg-1::reinstalltest_src2",
+                                        UserPackageDepSpecOptions()))), qo_require_exactly_one)->last());
+                id->perform_action(install_action);
+                vdb_repo->invalidate();
+
+                tr1::shared_ptr<const PackageIDSequence> ids(vdb_repo->package_ids(QualifiedPackageName("cat/pkg")));
+                TEST_CHECK_EQUAL(join(indirect_iterator(ids->begin()), indirect_iterator(ids->end()), " "), "cat/pkg-1-r0::installed");
+            }
+        }
+    } reinstall_test;
 }
 

Modified: trunk/paludis/repositories/e/vdb_repository_TEST_setup.sh
===================================================================
--- trunk/paludis/repositories/e/vdb_repository_TEST_setup.sh	2008-04-09 21:09:05 UTC (rev 4549)
+++ trunk/paludis/repositories/e/vdb_repository_TEST_setup.sh	2008-04-11 13:41:42 UTC (rev 4550)
@@ -422,6 +422,7 @@
 cp providesincrtest_src1/cat1/pkg1/pkg1-{1,1.1}.ebuild
 cp providesincrtest_src1/cat1/pkg1/pkg1-{1,2}.ebuild
 cp providesincrtest_src1/cat1/{pkg1/pkg1,pkg2/pkg2}-1.ebuild
+cp providesincrtest_src1/cat1/pkg1/pkg1-1.1.ebuild providesincrtest_src2/cat1/pkg1/pkg1-1.1-r0.ebuild
 
 cat <<END >providesincrtest_src2/cat1/pkg1/pkg1-1.ebuild
 KEYWORDS="test"
@@ -429,3 +430,22 @@
 PROVIDE="enabled? ( virtual/bar ) disabled? ( virtual/foo )"
 END
 
+mkdir -p reinstalltest reinstalltest_src{1,2}/{eclass,profiles/profile,cat/pkg} || exit 1
+
+cat <<END > reinstalltest_src1/profiles/profile/make.defaults
+ARCH=test
+USERLAND="GNU"
+KERNEL="linux"
+CHOST="i286-badger-linux-gnu"
+END
+echo reinstalltest_src1 >reinstalltest_src1/profiles/repo_name
+echo reinstalltest_src2 >reinstalltest_src2/profiles/repo_name
+echo cat >reinstalltest_src1/profiles/categories
+echo cat >reinstalltest_src2/profiles/categories
+
+cat <<END >reinstalltest_src1/cat/pkg/pkg-1.ebuild
+KEYWORDS="test"
+SLOT="0"
+END
+cp reinstalltest_src1/cat/pkg/pkg-1.ebuild reinstalltest_src2/cat/pkg/pkg-1-r0.ebuild
+



More information about the paludis-commits mailing list