Blob Blame History Raw
diff --git a/dnf.spec b/dnf.spec
index 2deea95..00025db 100644
--- a/dnf.spec
+++ b/dnf.spec
@@ -11,7 +11,7 @@
 
 Name:		dnf
 Version:	0.6.4
-Release:	5%{?snapshot}%{?dist}
+Release:	6%{?snapshot}%{?dist}
 Summary:	Package manager forked from Yum, using libsolv as a dependency resolver
 # For a breakdown of the licensing, see PACKAGE-LICENSING
 License:	GPLv2+ and GPLv2 and GPL
@@ -125,6 +125,7 @@ mkdir -p $RPM_BUILD_ROOT%{pluginconfpath}
 mkdir -p $RPM_BUILD_ROOT%{py2pluginpath}
 mkdir -p $RPM_BUILD_ROOT%{py3pluginpath}/__pycache__
 mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log
+mkdir -p $RPM_BUILD_ROOT%{_var}/cache/dnf
 touch $RPM_BUILD_ROOT%{_localstatedir}/log/%{name}.log
 ln -sr $RPM_BUILD_ROOT%{_bindir}/dnf $RPM_BUILD_ROOT%{_bindir}/yum
 
@@ -152,6 +153,7 @@ popd
 %{_mandir}/man5/dnf.conf.5.gz
 %{_unitdir}/dnf-makecache.service
 %{_unitdir}/dnf-makecache.timer
+%{_var}/cache/dnf
 %{_tmpfilesdir}/dnf.conf
 %exclude %{python_sitelib}/dnf/automatic
 %{python_sitelib}/dnf/
@@ -187,6 +189,13 @@ popd
 %postun
 %systemd_postun_with_restart dnf-makecache.timer
 
+%posttrans
+# cleanup pre-1.0.2 style cache
+for arch in armv7hl i686 x86_64 ; do
+    rm -rf /var/cache/dnf/$arch
+done
+exit 0
+
 %post automatic
 %systemd_post dnf-automatic.timer
 
@@ -197,12 +206,19 @@ popd
 %systemd_postun_with_restart dnf-automatic.timer
 
 %changelog
+* Wed Aug 26 2015 Michal Luscon <mluscon@redhat.com> 0.6.4-6
+- test: don't compute hash from absolute local file path (introduced in
+  10518b6) 
+- cleanup old cache in posttrans 
+- include /var/cache/dnf into rpm 
+- do not use releasever in cache path (related to RhBug:1173107)
+
 * Thu Apr 16 2015 Michal Luscon <mluscon@redhat.com> 0.6.4-5
 - Revert "completion: work with just python(3)-dnf"
 - Revert "bash-completion: use python method to get commands (RhBug:1187579)"
 
 * Thu Apr 16 2015 Michal Luscon <mluscon@redhat.com> 0.6.4-4
-- upload correct source archive 0.6.4 
+- upload correct source archive 0.6.4
 
 * Mon Apr 13 2015 Michal Luscon <mluscon@redhat.com> 0.6.4-3
 - rel-eng: use distro releaser
diff --git a/dnf/base.py b/dnf/base.py
index 725937b..f3df45c 100644
--- a/dnf/base.py
+++ b/dnf/base.py
@@ -127,9 +127,8 @@ class Base(object):
         subst = conf.substitutions
         if 'releasever' not in subst:
             subst['releasever'] = \
-                dnf.rpm.detect_releasever(conf.installroot) or ''
-        suffix = dnf.conf.parser.substitute(dnf.const.CACHEDIR_SUFFIX, subst)
-        cache_dirs = dnf.conf.CliCache(conf.cachedir, suffix)
+                dnf.rpm.detect_releasever(conf.installroot)
+        cache_dirs = dnf.conf.CliCache(conf.cachedir)
 
         conf.cachedir = cache_dirs.cachedir
         return conf
diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
index 2c6c40e..0bbd337 100644
--- a/dnf/cli/cli.py
+++ b/dnf/cli/cli.py
@@ -101,9 +101,7 @@ def _list_cmd_calc_columns(output, ypl):
 
 
 def cachedir_fit(conf):
-    subst = conf.substitutions
-    suffix = dnf.conf.parser.substitute(dnf.const.CACHEDIR_SUFFIX, subst)
-    cli_cache = dnf.conf.CliCache(conf.cachedir, suffix)
+    cli_cache = dnf.conf.CliCache(conf.cachedir)
     return cli_cache.cachedir, cli_cache.system_cachedir
 
 
@@ -1021,10 +1019,6 @@ class Cli(object):
         conf.read(path)
         if releasever is None:
             releasever = dnf.rpm.detect_releasever(root)
-            if releasever is None:
-                msg = _('releasever not given and can not be detected '
-                        'from the installroot.')
-                raise dnf.exceptions.ConfigError(msg)
         conf.releasever = releasever
         subst = conf.substitutions
         subst.update_from_etc(root)
@@ -1039,12 +1033,6 @@ class Cli(object):
 
         self.base.logging.setup_from_dnf_conf(conf)
 
-        # repos are ver/arch specific so add $basearch/$releasever
-        conf._repos_persistdir = os.path.normpath(
-            '%s/repos/%s/%s/' % (conf.persistdir,
-                                 subst.get('basearch', '$basearch'),
-                                 subst.get('releasever', '$releasever')))
-
         timer()
         return conf
 
diff --git a/dnf/conf/__init__.py b/dnf/conf/__init__.py
index f26f81b..ec03229 100644
--- a/dnf/conf/__init__.py
+++ b/dnf/conf/__init__.py
@@ -49,10 +49,9 @@ logger = logging.getLogger('dnf')
 
 
 class CliCache(object):
-    def __init__(self, prefix, suffix):
+    def __init__(self, prefix):
         # set from the client, at most once:
         self.prefix = prefix
-        self.suffix = suffix
         # internal:
         self._ready = False
         self._cachedir = None
@@ -63,19 +62,16 @@ class CliCache(object):
             return
 
         self._ready = True
-        self._system_cachedir = self._retdir(self.prefix)
+        self._system_cachedir = self.prefix
         if util.am_i_root():
             self._cachedir = self._system_cachedir
         else:
             try:
                 user_prefix = misc.getCacheDir()
-                self._cachedir = self._retdir(user_prefix)
+                self._cachedir = user_prefix
             except (IOError, OSError) as e:
                 logger.critical(_('Could not set cachedir: %s'), ucd(e))
 
-    def _retdir(self, dir):
-        return os.path.join(dir, self.suffix)
-
     @property
     def cachedir(self):
         self._make_ready()
diff --git a/dnf/const.py.in b/dnf/const.py.in
index 3c498c9..652ec62 100644
--- a/dnf/const.py.in
+++ b/dnf/const.py.in
@@ -21,7 +21,6 @@
 from __future__ import unicode_literals
 import distutils.sysconfig
 
-CACHEDIR_SUFFIX='$basearch/$releasever'
 CONF_FILENAME='/etc/dnf/dnf.conf' # :api
 CONF_AUTOMATIC_FILENAME='/etc/dnf/automatic.conf'
 DISTROVERPKG=('system-release(releasever)', 'redhat-release')
diff --git a/dnf/repo.py b/dnf/repo.py
index 5b9bddf..d0c6f33 100644
--- a/dnf/repo.py
+++ b/dnf/repo.py
@@ -33,6 +33,7 @@ import dnf.util
 import dnf.yum.config
 import dnf.yum.misc
 import functools
+import hashlib
 import hawkey
 import logging
 import librepo
@@ -447,7 +448,14 @@ class Repo(dnf.yum.config.RepoConf):
 
     @property
     def cachedir(self):
-        return os.path.join(self.basecachedir, self.id)
+        url = self.metalink or self.mirrorlist \
+              or (self.baseurl and self.baseurl[0])
+        if url:
+            digest = hashlib.sha256(url.encode('utf8')).hexdigest()[:16]
+            repodir = "%s-%s" % (self.id, digest)
+        else:
+            repodir = self.id
+        return os.path.join(self.basecachedir, repodir)
 
     @property
     def filelists_fn(self):
diff --git a/rel-eng/packages/dnf b/rel-eng/packages/dnf
index 126e3e7..40ad0fa 100644
--- a/rel-eng/packages/dnf
+++ b/rel-eng/packages/dnf
@@ -1 +1 @@
-0.6.4-5 ./
+0.6.4-6 ./
diff --git a/tests/test_base.py b/tests/test_base.py
index 4014c95..c56f94f 100644
--- a/tests/test_base.py
+++ b/tests/test_base.py
@@ -42,7 +42,7 @@ class BaseTest(support.TestCase):
         base = dnf.Base()
         self.assertIsNotNone(base.conf)
         self.assertIsNotNone(base.conf.cachedir)
-        reg = re.compile('/var/cache/dnf/[a-zA-Z0-9_]+/x')
+        reg = re.compile('/var/cache/dnf')
         self.assertIsNotNone(reg.match(base.conf.cachedir))
 
     @mock.patch('dnf.rpm.detect_releasever', lambda x: 'x')
@@ -51,7 +51,7 @@ class BaseTest(support.TestCase):
         base = dnf.Base()
         self.assertIsNotNone(base.conf)
         self.assertIsNotNone(base.conf.cachedir)
-        reg = re.compile('/var/tmp/dnf-[a-zA-Z0-9_-]+/[a-zA-Z0-9_]+/x')
+        reg = re.compile('/var/tmp/dnf-[a-zA-Z0-9_-]+')
         self.assertIsNotNone(reg.match(base.conf.cachedir))
 
     def test_reset(self):
diff --git a/tests/test_cli.py b/tests/test_cli.py
index b51a64f..34409da 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -194,7 +194,7 @@ class ConfigureTest(TestCase):
     def test_configure_user(self):
         """ Test Cli.configure as user."""
         self.cli.configure(['update', '-c', self.conffile])
-        reg = re.compile('^/var/tmp/dnf-[a-zA-Z0-9_-]+/[a-zA-Z0-9_]+/[0-9]+$')
+        reg = re.compile('^/var/tmp/dnf-[a-zA-Z0-9_-]+$')
         self.assertIsNotNone(reg.match(self.base.conf.cachedir))
         self.assertEqual(self.cli.cmdstring, "dnf update -c %s " % self.conffile)
 
@@ -202,7 +202,7 @@ class ConfigureTest(TestCase):
     def test_configure_root(self):
         """ Test Cli.configure as root."""
         self.cli.configure(['update', '-c', self.conffile])
-        reg = re.compile('^/var/cache/dnf/[a-zA-Z0-9_]+/[0-9]+$')
+        reg = re.compile('^/var/cache/dnf$')
         self.assertIsNotNone(reg.match(self.base.conf.cachedir))
         self.assertEqual(self.cli.cmdstring, "dnf update -c %s " % self.conffile)
 
diff --git a/tests/test_config.py b/tests/test_config.py
index 7f8d380..c59270e 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -39,23 +39,26 @@ class OptionTest(unittest.TestCase):
             self.fail("option should be deleted now.")
 
 class CacheTest(TestCase):
-     @mock.patch('dnf.util.am_i_root', return_value=True)
-     def test_root(self, unused_am_i_root):
-         cache = CliCache('/var/lib/spinning', 'i286/20')
-         self.assertEqual(cache.system_cachedir, '/var/lib/spinning/i286/20')
-         self.assertEqual(cache.cachedir, '/var/lib/spinning/i286/20')
 
-     @mock.patch('dnf.yum.misc.getCacheDir', return_value="/notmp/dnf-walr-yeAH")
-     @mock.patch('dnf.util.am_i_root', return_value=False)
-     def test_noroot(self, fn_root, fn_getcachedir):
-         cache = CliCache('/var/lib/spinning', 'i286/20')
-         self.assertEqual(fn_getcachedir.call_count, 0)
-         self.assertEqual(cache.cachedir, '/notmp/dnf-walr-yeAH/i286/20')
-         self.assertEqual(fn_getcachedir.call_count, 1)
+    @mock.patch('dnf.util.am_i_root', return_value=True)
+    def test_root(self, unused_am_i_root):
+        cache = CliCache('/var/lib/spinning')
+        self.assertEqual(cache.system_cachedir, '/var/lib/spinning')
+        self.assertEqual(cache.cachedir, '/var/lib/spinning')
+
+    @mock.patch('dnf.yum.misc.getCacheDir',
+                return_value="/notmp/dnf-walr-yeAH")
+    @mock.patch('dnf.util.am_i_root', return_value=False)
+    def test_noroot(self, fn_root, fn_getcachedir):
+        cache = CliCache('/var/lib/spinning')
+        self.assertEqual(fn_getcachedir.call_count, 0)
+        self.assertEqual(cache.cachedir, '/notmp/dnf-walr-yeAH')
+        self.assertEqual(fn_getcachedir.call_count, 1)
+
+        # the cachedirs are cached now, getCacheDir is not called again:
+        self.assertEqual(cache.cachedir, '/notmp/dnf-walr-yeAH')
+        self.assertEqual(fn_getcachedir.call_count, 1)
 
-         # the cachedirs are cached now, getCacheDir is not called again:
-         self.assertEqual(cache.cachedir, '/notmp/dnf-walr-yeAH/i286/20')
-         self.assertEqual(fn_getcachedir.call_count, 1)
 
 class YumConfTest(TestCase):
     def test_bugtracker(self):
diff --git a/tests/test_package.py b/tests/test_package.py
index e30a2e5..225749c 100644
--- a/tests/test_package.py
+++ b/tests/test_package.py
@@ -74,7 +74,8 @@ class PackageTest(support.TestCase):
         self.assertEquals(self.pkg.localPkg(), '/mnt/cd/f/foo.rpm')
         self.pkg.repo.baseurl = ['http://remote']
         self.assertFalse(self.pkg.repo.local)
-        self.assertEquals(self.pkg.localPkg(), '/cachedir/main/packages/foo.rpm')
+        self.assertEquals(self.pkg.localPkg(),
+                          self.pkg.repo.cachedir + '/packages/foo.rpm')
 
     def test_verify(self):
         with mock.patch.object(self.pkg, 'localPkg',
diff --git a/tests/test_repo.py b/tests/test_repo.py
index 5677ea9..a9bd4fc 100644
--- a/tests/test_repo.py
+++ b/tests/test_repo.py
@@ -142,9 +142,13 @@ class RepoTest(RepoTestMixin, support.TestCase):
     def setUp(self):
         self.repo = self.build_repo('r', 'r for riot')
 
+    def tearDown(self):
+        dnf.util.rm_rf(self.repo.cachedir)
+
     def test_cachedir(self):
+        self.repo.baseurl = ["http://download.repo.org/r"]
         self.assertEqual(self.repo.cachedir,
-                         os.path.join(self.TMP_CACHEDIR, self.repo.id))
+                         os.path.join(self.TMP_CACHEDIR, 'r-0824b1db602c8695'))
 
     def test_dump(self):
         dump = self.repo.dump()
@@ -198,6 +202,7 @@ class RepoTest(RepoTestMixin, support.TestCase):
         # the second time we only hit the cache:
         del self.repo
         self.repo = dnf.repo.Repo("r", self.TMP_CACHEDIR)
+        self.repo.baseurl = [BASEURL]
         self.assertFalse(self.repo.load())
         self.assertIsNotNone(self.repo.metadata)
 
@@ -206,7 +211,7 @@ class RepoTest(RepoTestMixin, support.TestCase):
         self.assertIsNone(repo.metadata)
         self.assertTrue(repo.load())
         self.assertIsNotNone(repo.metadata)
-        repomd = os.path.join(self.TMP_CACHEDIR, "r/repodata/repomd.xml")
+        repomd = os.path.join(self.repo.cachedir, "repodata/repomd.xml")
         self.assertTrue(os.path.isfile(repomd))
         self.assertTrue(repo.metadata.fresh)
 
@@ -339,7 +344,8 @@ class LocalRepoTest(support.TestCase):
                         ('sha1', 'd5f18c856e765cd88a50dbf1bfaea51de3b5e516'),
                         ('sha256', 'ead48d5c448a481bd66a4413d7be28bd44ce5de1ee59ecb723c78dcf4e441696'),
                         ('sha512', '9a3131485c0c0a3f65bb5f25155e89d2d6b09e74ffdaa1c3339d3874885d160d8b4667a4a83dbd7d2702a5d41a4e1bc5622c4783b77dcf1f69626c68975202ce')]}
-        self.assertTrue(self.repo.load())
+        with mock.patch('dnf.repo.Repo.cachedir', REPOS + "/rpm"):
+            self.assertTrue(self.repo.load())
         self.assertTrue(remote_handle_m.fetchmirrors)
         self.assertFalse(self.repo._expired)
         reset_age_m.assert_called()
@@ -422,7 +428,7 @@ class DownloadPayloadsTest(RepoTestMixin, support.TestCase):
         errs = dnf.repo.download_payloads([pload], drpm)
         self.assertEmpty(errs.recoverable)
         self.assertEmpty(errs.irrecoverable)
-        path = os.path.join(self.TMP_CACHEDIR, 'r/packages/tour-4-4.noarch.rpm')
+        path = os.path.join(repo.cachedir, 'packages/tour-4-4.noarch.rpm')
         self.assertFile(path)