[paludis-commits] r4554 - in trunk: . paludis paludis/repositories/cran paludis/repositories/e paludis/repositories/fake paludis/repositories/gems paludis/repositories/unpackaged paludis/repositories/virtuals src/output

ciaranm at svn.pioto.org ciaranm at svn.pioto.org
Sat Apr 12 21:53:12 UTC 2008


Author: ciaranm
Date: 2008-04-12 21:53:11 +0000 (Sat, 12 Apr 2008)
New Revision: 4554

Added:
   trunk/paludis/repositories/e/pretend_fetch_visitor.cc
   trunk/paludis/repositories/e/pretend_fetch_visitor.hh
Removed:
   trunk/paludis/repositories/e/distfiles_size_visitor.cc
   trunk/paludis/repositories/e/distfiles_size_visitor.hh
Modified:
   trunk/ChangeLog
   trunk/paludis/action-fwd.hh
   trunk/paludis/action.cc
   trunk/paludis/action.hh
   trunk/paludis/install_task.cc
   trunk/paludis/install_task.hh
   trunk/paludis/package_id.hh
   trunk/paludis/repositories/cran/cran_installed_repository.cc
   trunk/paludis/repositories/cran/cran_package_id.cc
   trunk/paludis/repositories/cran/cran_package_id.hh
   trunk/paludis/repositories/cran/cran_repository.cc
   trunk/paludis/repositories/e/Makefile.am
   trunk/paludis/repositories/e/e_installed_repository.cc
   trunk/paludis/repositories/e/e_installed_repository_id.cc
   trunk/paludis/repositories/e/e_installed_repository_id.hh
   trunk/paludis/repositories/e/e_key.cc
   trunk/paludis/repositories/e/e_key.hh
   trunk/paludis/repositories/e/e_repository.cc
   trunk/paludis/repositories/e/e_repository_TEST.cc
   trunk/paludis/repositories/e/e_repository_entries.hh
   trunk/paludis/repositories/e/ebuild_entries.cc
   trunk/paludis/repositories/e/ebuild_entries.hh
   trunk/paludis/repositories/e/ebuild_id.cc
   trunk/paludis/repositories/e/ebuild_id.hh
   trunk/paludis/repositories/fake/fake_installed_repository.cc
   trunk/paludis/repositories/fake/fake_package_id.cc
   trunk/paludis/repositories/fake/fake_repository.cc
   trunk/paludis/repositories/gems/gem_specification.cc
   trunk/paludis/repositories/gems/gem_specification.hh
   trunk/paludis/repositories/gems/gems_repository.cc
   trunk/paludis/repositories/gems/installed_gems_repository.cc
   trunk/paludis/repositories/unpackaged/installed_id.cc
   trunk/paludis/repositories/unpackaged/installed_id.hh
   trunk/paludis/repositories/unpackaged/installed_repository.cc
   trunk/paludis/repositories/unpackaged/unpackaged_id.cc
   trunk/paludis/repositories/unpackaged/unpackaged_id.hh
   trunk/paludis/repositories/virtuals/installed_virtuals_repository.cc
   trunk/paludis/repositories/virtuals/package_id.cc
   trunk/paludis/repositories/virtuals/package_id.hh
   trunk/paludis/repositories/virtuals/virtuals_repository.cc
   trunk/src/output/console_install_task.cc
   trunk/src/output/console_install_task.hh
Log:
Use PretendFetchAction to get download sizes. Fixes: ticket:504


Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/ChangeLog	2008-04-12 21:53:11 UTC (rev 4554)
@@ -5,6 +5,12 @@
 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-12 Ciaran McCreesh
+
+	* (lots): Use PretendFetchAction to get download sizes.
+
+	+ Fixes: ticket:504
+
 2008-04-12 Richard Brown
 
 	* ruby/Makefile.am: Only install playman symlink with --enable-ruby.

Modified: trunk/paludis/action-fwd.hh
===================================================================
--- trunk/paludis/action-fwd.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/action-fwd.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -43,6 +43,7 @@
     class ConfigAction;
     class FetchAction;
     class InfoAction;
+    class PretendFetchAction;
 
     class SupportsActionTestBase;
     template <typename A_> class SupportsActionTest;

Modified: trunk/paludis/action.cc
===================================================================
--- trunk/paludis/action.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/action.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -158,6 +158,30 @@
     _imp->failed = true;
 }
 
+namespace paludis
+{
+    template <>
+    struct Implementation<PretendFetchAction>
+    {
+        const FetchActionOptions options;
+
+        Implementation(const FetchActionOptions & o) :
+            options(o)
+        {
+        }
+    };
+}
+
+PretendFetchAction::PretendFetchAction(const FetchActionOptions & o) :
+    PrivateImplementationPattern<PretendFetchAction>(new Implementation<PretendFetchAction>(o)),
+    options(_imp->options)
+{
+}
+
+PretendFetchAction::~PretendFetchAction()
+{
+}
+
 SupportsActionTestBase::~SupportsActionTestBase()
 {
 }
@@ -217,6 +241,11 @@
         {
             s << "fetch";
         }
+
+        void visit(const PretendFetchAction &)
+        {
+            s << "pretend fetch";
+        }
     };
 }
 

Modified: trunk/paludis/action.hh
===================================================================
--- trunk/paludis/action.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/action.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -58,7 +58,8 @@
             UninstallAction,
             PretendAction,
             ConfigAction,
-            InfoAction
+            InfoAction,
+            PretendFetchAction
         >
     {
     };
@@ -80,7 +81,8 @@
             SupportsActionTest<UninstallAction>,
             SupportsActionTest<PretendAction>,
             SupportsActionTest<ConfigAction>,
-            SupportsActionTest<InfoAction>
+            SupportsActionTest<InfoAction>,
+            SupportsActionTest<PretendFetchAction>
         >
     {
     };
@@ -228,6 +230,35 @@
     };
 
     /**
+     * A PretendFetchAction is used to get information about a fetch that will take
+     * place on a PackageID.
+     *
+     * \since 0.26
+     * \ingroup g_actions
+     * \nosubgrouping
+     */
+    class PALUDIS_VISIBLE PretendFetchAction :
+        public Action,
+        private PrivateImplementationPattern<PretendFetchAction>,
+        public AcceptInterfaceVisitsThis<ActionVisitorTypes, PretendFetchAction>
+    {
+        public:
+            ///\name Basic operations
+            ///\{
+
+            PretendFetchAction(const FetchActionOptions &);
+            ~PretendFetchAction();
+
+            ///\}
+
+            /// Options for the FetchAction we will use.
+            const FetchActionOptions & options;
+
+            /// Signal that we will fetch a particular file.
+            virtual void will_fetch(const FSEntry & destination, const unsigned long size_in_bytes) = 0;
+    };
+
+    /**
      * A ConfigAction is used via PackageID::perform_action to execute
      * post-install configuration (for example, via 'paludis --config')
      * on a PackageID.

Modified: trunk/paludis/install_task.cc
===================================================================
--- trunk/paludis/install_task.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/install_task.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -1654,3 +1654,9 @@
     return v.result;
 }
 
+FetchActionOptions &
+InstallTask::fetch_action_options()
+{
+    return _imp->fetch_options;
+}
+

Modified: trunk/paludis/install_task.hh
===================================================================
--- trunk/paludis/install_task.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/install_task.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -81,6 +81,7 @@
             ///\}
 
             bool already_done(const DepListEntry &) const PALUDIS_ATTRIBUTE((warn_unused_result));
+            FetchActionOptions & fetch_action_options() PALUDIS_ATTRIBUTE((warn_unused_result));
 
         public:
             ///\name Basic operations

Modified: trunk/paludis/package_id.hh
===================================================================
--- trunk/paludis/package_id.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/package_id.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -273,20 +273,6 @@
             virtual const tr1::shared_ptr<const MetadataValueKey<FSEntry> > fs_location_key() const = 0;
 
             /**
-             * The size_of_download_required_key, if non-zero, contains a
-             * long integer representing the size of distfiles that still need
-             * to be downloaded.
-             */
-            virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_download_required_key() const = 0;
-
-            /**
-             * The size_of_all_distfiles_key, if non-zero, contains a long
-             * integer representing the size of all distfiles used by the
-             * package with the current USE settings.
-             */
-            virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_all_distfiles_key() const = 0;
-
-            /**
              * The transient_key, if non-zero, indicates whether this
              * PackageID's originating repository is volatile.
              */

Modified: trunk/paludis/repositories/cran/cran_installed_repository.cc
===================================================================
--- trunk/paludis/repositories/cran/cran_installed_repository.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/cran/cran_installed_repository.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -538,6 +538,10 @@
         {
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+        }
+
         void visit(const SupportsActionTest<UninstallAction> &)
         {
             result = true;

Modified: trunk/paludis/repositories/cran/cran_package_id.cc
===================================================================
--- trunk/paludis/repositories/cran/cran_package_id.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/cran/cran_package_id.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -486,6 +486,11 @@
             result = cran_repository;
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+            result = cran_repository;
+        }
+
         void visit(const SupportsActionTest<InstallAction> &)
         {
             result = cran_repository;
@@ -541,18 +546,6 @@
     return _imp->fs_location_key;
 }
 
-const tr1::shared_ptr<const MetadataValueKey<long> >
-CRANPackageID::size_of_download_required_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
-const tr1::shared_ptr<const MetadataValueKey<long> >
-CRANPackageID::size_of_all_distfiles_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
 const tr1::shared_ptr<const MetadataValueKey<bool> >
 CRANPackageID::transient_key() const
 {

Modified: trunk/paludis/repositories/cran/cran_package_id.hh
===================================================================
--- trunk/paludis/repositories/cran/cran_package_id.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/cran/cran_package_id.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -76,8 +76,6 @@
                 virtual const tr1::shared_ptr<const MetadataCollectionKey<PackageIDSequence> > contains_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<tr1::shared_ptr<const PackageID> > > contained_in_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<FSEntry> > fs_location_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_download_required_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_all_distfiles_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<bool> > transient_key() const;
  
 

Modified: trunk/paludis/repositories/cran/cran_repository.cc
===================================================================
--- trunk/paludis/repositories/cran/cran_repository.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/cran/cran_repository.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -491,6 +491,11 @@
             result = true;
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+            result = true;
+        }
+
         void visit(const SupportsActionTest<UninstallAction> &)
         {
         }

Modified: trunk/paludis/repositories/e/Makefile.am
===================================================================
--- trunk/paludis/repositories/e/Makefile.am	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/Makefile.am	2008-04-12 21:53:11 UTC (rev 4554)
@@ -73,6 +73,7 @@
 	exndbam_repository.hh \
 	exndbam_repository-sr.hh \
 	fetch_visitor.hh \
+	pretend_fetch_visitor.hh \
 	fix_locked_dependencies.hh \
 	glsa-sr.hh \
 	glsa.hh \
@@ -80,7 +81,6 @@
 	make_ebuild_repository.hh \
 	manifest2_entry-sr.hh \
 	manifest2_reader.hh \
-	distfiles_size_visitor.hh \
 	package_dep_spec.hh \
 	pipe_command_handler.hh \
 	source_uri_finder.hh \
@@ -128,12 +128,12 @@
 	exndbam_repository.cc \
 	exheres_layout.cc \
 	fetch_visitor.cc \
+	pretend_fetch_visitor.cc \
 	fix_locked_dependencies.cc \
 	glsa.cc \
 	layout.cc \
 	make_ebuild_repository.cc \
 	manifest2_reader.cc \
-	distfiles_size_visitor.cc \
 	package_dep_spec.cc \
 	pipe_command_handler.cc \
 	registration.cc \

Deleted: trunk/paludis/repositories/e/distfiles_size_visitor.cc
===================================================================
--- trunk/paludis/repositories/e/distfiles_size_visitor.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/distfiles_size_visitor.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -1,148 +0,0 @@
-/* vim: set sw=4 sts=4 et foldmethod=syntax : */
-
-/*
- * Copyright (c) 2007 Mike Kelly
- *
- * This file is part of the Paludis package manager. Paludis is free software;
- * you can redistribute it and/or modify it under the terms of the GNU General
- * Public License version 2, as published by the Free Software Foundation.
- *
- * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <paludis/repositories/e/distfiles_size_visitor.hh>
-#include <paludis/repositories/e/source_uri_finder.hh>
-#include <paludis/repositories/e/e_repository_id.hh>
-#include <paludis/repositories/e/dep_parser.hh>
-#include <paludis/repositories/e/manifest2_reader.hh>
-#include <paludis/dep_spec.hh>
-#include <paludis/environment.hh>
-#include <paludis/package_id.hh>
-#include <paludis/action.hh>
-#include <paludis/repository.hh>
-#include <paludis/about.hh>
-#include <paludis/util/visitor-impl.hh>
-#include <paludis/util/system.hh>
-#include <paludis/util/private_implementation_pattern-impl.hh>
-#include <paludis/util/fs_entry.hh>
-#include <paludis/util/log.hh>
-#include <paludis/util/join.hh>
-#include <paludis/util/stringify.hh>
-#include <paludis/util/make_shared_ptr.hh>
-#include <iostream>
-#include <list>
-
-using namespace paludis;
-using namespace paludis::erepository;
-
-namespace paludis
-{
-    template <>
-    struct Implementation<DistfilesSizeVisitor>
-    {
-        const Environment * const env;
-        const tr1::shared_ptr<const PackageID> id;
-        const FSEntry distdir;
-        tr1::shared_ptr<const URILabel> default_label;
-        bool everything;
-        const tr1::shared_ptr<Manifest2Reader> m2r;
-
-        std::list<const URILabel *> labels;
-        size_t size;
-
-        Implementation(
-                const Environment * const e,
-                const tr1::shared_ptr<const PackageID> & i,
-                const FSEntry & d,
-                const tr1::shared_ptr<const URILabel> & n,
-                const bool ev,
-                const tr1::shared_ptr<Manifest2Reader> mr) :
-            env(e),
-            id(i),
-            distdir(d),
-            default_label(n),
-            everything(ev),
-            m2r(mr),
-            size(0)
-        {
-            labels.push_front(default_label.get());
-        }
-    };
-}
-
-DistfilesSizeVisitor::DistfilesSizeVisitor(
-        const Environment * const e,
-        const tr1::shared_ptr<const PackageID> & i,
-        const FSEntry & d,
-        const tr1::shared_ptr<const URILabel> & n,
-        const bool ev,
-        const tr1::shared_ptr<Manifest2Reader> mr) :
-    PrivateImplementationPattern<DistfilesSizeVisitor>(new Implementation<DistfilesSizeVisitor>(e, i, d, n, ev, mr))
-{
-}
-
-DistfilesSizeVisitor::~DistfilesSizeVisitor()
-{
-}
-
-void
-DistfilesSizeVisitor::visit_sequence(const ConditionalDepSpec & u,
-        FetchableURISpecTree::ConstSequenceIterator cur,
-        FetchableURISpecTree::ConstSequenceIterator end)
-{
-    if (u.condition_met())
-    {
-        _imp->labels.push_front(* _imp->labels.begin());
-        std::for_each(cur, end, accept_visitor(*this));
-        _imp->labels.pop_front();
-    }
-}
-
-void
-DistfilesSizeVisitor::visit_sequence(const AllDepSpec &,
-        FetchableURISpecTree::ConstSequenceIterator cur,
-        FetchableURISpecTree::ConstSequenceIterator end)
-{
-    _imp->labels.push_front(* _imp->labels.begin());
-    std::for_each(cur, end, accept_visitor(*this));
-    _imp->labels.pop_front();
-}
-
-void
-DistfilesSizeVisitor::visit_leaf(const URILabelsDepSpec & l)
-{
-    for (URILabelsDepSpec::ConstIterator i(l.begin()), i_end(l.end()) ;
-            i != i_end ; ++i)
-        *_imp->labels.begin() = i->get();
-}
-
-void
-DistfilesSizeVisitor::visit_leaf(const FetchableURIDepSpec & u)
-{
-    Context context("When visiting URI dep spec '" + stringify(u.text()) + "':");
-
-    FSEntry destination(_imp->distdir / u.filename());
-
-    if (destination.exists() && ! _imp->everything)
-        return;
-    Manifest2Reader::ConstIterator m(_imp->m2r->find("DIST", u.filename()));
-    if (_imp->m2r->end() == m)
-        return;
-    long s(m->size);
-    Log::get_instance()->message(ll_debug, lc_context) << "Adding " << s << " to size. Was "
-        << _imp->size << ", is now " << (_imp->size + s);
-    _imp->size += s;
-}
-
-long
-DistfilesSizeVisitor::size()
-{
-    return _imp->size;
-}

Deleted: trunk/paludis/repositories/e/distfiles_size_visitor.hh
===================================================================
--- trunk/paludis/repositories/e/distfiles_size_visitor.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/distfiles_size_visitor.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -1,71 +0,0 @@
-/* vim: set sw=4 sts=4 et foldmethod=syntax : */
-
-/*
- * Copyright (c) 2007 Mike Kelly
- *
- * This file is part of the Paludis package manager. Paludis is free software;
- * you can redistribute it and/or modify it under the terms of the GNU General
- * Public License version 2, as published by the Free Software Foundation.
- *
- * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef PALUDIS_GUARD_PALUDIS_REPOSITORIES_E_FETCH_VISITOR_HH
-#define PALUDIS_GUARD_PALUDIS_REPOSITORIES_E_FETCH_VISITOR_HH 1
-
-#include <paludis/repositories/e/eapi-fwd.hh>
-#include <paludis/repositories/e/manifest2_reader.hh>
-#include <paludis/util/attributes.hh>
-#include <paludis/util/private_implementation_pattern.hh>
-#include <paludis/util/visitor-fwd.hh>
-#include <paludis/util/fs_entry-fwd.hh>
-#include <paludis/util/tr1_memory.hh>
-#include <paludis/dep_spec.hh>
-#include <paludis/dep_tree.hh>
-#include <paludis/package_id-fwd.hh>
-#include <paludis/environment-fwd.hh>
-
-namespace paludis
-{
-    namespace erepository
-    {
-        class PALUDIS_VISIBLE DistfilesSizeVisitor :
-            private PrivateImplementationPattern<DistfilesSizeVisitor>,
-            public ConstVisitor<FetchableURISpecTree>
-        {
-            public:
-                DistfilesSizeVisitor(
-                        const Environment * const,
-                        const tr1::shared_ptr<const PackageID> &,
-                        const FSEntry &,
-                        const tr1::shared_ptr<const URILabel> &,
-                        const bool,
-                        const tr1::shared_ptr<Manifest2Reader>);
-
-                ~DistfilesSizeVisitor();
-
-                void visit_sequence(const AllDepSpec &,
-                        FetchableURISpecTree::ConstSequenceIterator,
-                        FetchableURISpecTree::ConstSequenceIterator);
-
-                void visit_sequence(const ConditionalDepSpec &,
-                        FetchableURISpecTree::ConstSequenceIterator,
-                        FetchableURISpecTree::ConstSequenceIterator);
-
-                void visit_leaf(const URILabelsDepSpec &);
-
-                void visit_leaf(const FetchableURIDepSpec &);
-
-                long size();
-        };
-    }
-}
-
-#endif

Modified: trunk/paludis/repositories/e/e_installed_repository.cc
===================================================================
--- trunk/paludis/repositories/e/e_installed_repository.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/e_installed_repository.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -113,6 +113,11 @@
             result = false;
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+            result = false;
+        }
+
         void visit(const SupportsActionTest<InstallAction> &)
         {
             result = false;

Modified: trunk/paludis/repositories/e/e_installed_repository_id.cc
===================================================================
--- trunk/paludis/repositories/e/e_installed_repository_id.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/e_installed_repository_id.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -640,19 +640,6 @@
     return _imp->fs_location;
 }
 
-const tr1::shared_ptr<const MetadataValueKey<long> >
-EInstalledRepositoryID::size_of_download_required_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
-const tr1::shared_ptr<const MetadataValueKey<long> >
-EInstalledRepositoryID::size_of_all_distfiles_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
-
 bool
 EInstalledRepositoryID::arbitrary_less_than_comparison(const PackageID &) const
 {
@@ -695,6 +682,10 @@
         {
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+        }
+
         void visit(const SupportsActionTest<PretendAction> &)
         {
         }
@@ -754,6 +745,7 @@
         void visit(const InstallAction & a) PALUDIS_ATTRIBUTE((noreturn));
         void visit(const PretendAction & a) PALUDIS_ATTRIBUTE((noreturn));
         void visit(const FetchAction & a) PALUDIS_ATTRIBUTE((noreturn));
+        void visit(const PretendFetchAction & a) PALUDIS_ATTRIBUTE((noreturn));
     };
 
     void PerformAction::visit(const InstallAction & a)
@@ -770,6 +762,11 @@
     {
         throw UnsupportedActionError(*id, a);
     }
+
+    void PerformAction::visit(const PretendFetchAction & a)
+    {
+        throw UnsupportedActionError(*id, a);
+    }
 }
 
 void

Modified: trunk/paludis/repositories/e/e_installed_repository_id.hh
===================================================================
--- trunk/paludis/repositories/e/e_installed_repository_id.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/e_installed_repository_id.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -79,8 +79,6 @@
                 virtual const tr1::shared_ptr<const MetadataCollectionKey<PackageIDSequence> > contains_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<tr1::shared_ptr<const PackageID> > > contained_in_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<FSEntry> > fs_location_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_download_required_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_all_distfiles_key() const;
 
                 virtual const tr1::shared_ptr<const MetadataCollectionKey<UseFlagNameSet> > use_key() const;
                 virtual const tr1::shared_ptr<const MetadataCollectionKey<Set<std::string> > > inherited_key() const;

Modified: trunk/paludis/repositories/e/e_key.cc
===================================================================
--- trunk/paludis/repositories/e/e_key.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/e_key.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -1091,58 +1091,3 @@
     return *_imp->value;
 }
 
-namespace paludis
-{
-    template <>
-    struct Implementation<EDistSizeKey>
-    {
-        const tr1::shared_ptr<const EFetchableURIKey> src_uri;
-        const tr1::shared_ptr<DistfilesSizeVisitor> dsv;
-        mutable Mutex value_mutex;
-        mutable tr1::shared_ptr<long> value;
-
-        Implementation(const tr1::shared_ptr<const EFetchableURIKey> & s,
-                const tr1::shared_ptr<DistfilesSizeVisitor> & d) :
-            src_uri(s),
-            dsv(d)
-        {
-        }
-    };
-}
-
-EDistSizeKey::EDistSizeKey(const std::string & r, const std::string & h, const MetadataKeyType t,
-        const tr1::shared_ptr<const EFetchableURIKey> & s,
-        const tr1::shared_ptr<DistfilesSizeVisitor> & d) :
-    MetadataValueKey<long> (r, h, t),
-    PrivateImplementationPattern<EDistSizeKey>(new Implementation<EDistSizeKey>(s, d)),
-    _imp(PrivateImplementationPattern<EDistSizeKey>::_imp)
-{
-}
-
-EDistSizeKey::~EDistSizeKey()
-{
-}
-
-const long
-EDistSizeKey::value() const
-{
-    Lock l(_imp->value_mutex);
-
-    if (_imp->value)
-        return *_imp->value;
-
-    _imp->value.reset(new long(0));
-
-    if (_imp->src_uri)
-        _imp->src_uri->value()->accept(*_imp->dsv);
-
-    *_imp->value = _imp->dsv->size();
-
-    return *_imp->value;
-}
-
-std::string
-EDistSizeKey::pretty_print() const
-{
-    return pretty_print_bytes(value());
-}

Modified: trunk/paludis/repositories/e/e_key.hh
===================================================================
--- trunk/paludis/repositories/e/e_key.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/e_key.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -24,8 +24,6 @@
 #include <paludis/util/fs_entry.hh>
 #include <paludis/util/set.hh>
 
-#include <paludis/repositories/e/distfiles_size_visitor.hh>
-
 namespace paludis
 {
     namespace erepository
@@ -318,27 +316,6 @@
                 time_t value() const
                     PALUDIS_ATTRIBUTE((warn_unused_result));
         };
-
-        class EDistSizeKey:
-            public MetadataValueKey<long>,
-            private PrivateImplementationPattern<EDistSizeKey>
-        {
-            private:
-                PrivateImplementationPattern<EDistSizeKey>::ImpPtr & _imp;
-
-            public:
-                EDistSizeKey(const std::string &, const std::string &, const MetadataKeyType,
-                        const tr1::shared_ptr<const EFetchableURIKey> &,
-                        const tr1::shared_ptr<DistfilesSizeVisitor> &);
-
-                ~EDistSizeKey();
-
-                const long value() const
-                    PALUDIS_ATTRIBUTE((warn_unused_result));
-
-                std::string pretty_print() const
-                    PALUDIS_ATTRIBUTE((warn_unused_result));
-        };
     }
 }
 

Modified: trunk/paludis/repositories/e/e_repository.cc
===================================================================
--- trunk/paludis/repositories/e/e_repository.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/e_repository.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -1276,6 +1276,11 @@
             result = true;
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+            result = true;
+        }
+
         void visit(const SupportsActionTest<UninstallAction> &)
         {
         }

Modified: trunk/paludis/repositories/e/e_repository_TEST.cc
===================================================================
--- trunk/paludis/repositories/e/e_repository_TEST.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/e_repository_TEST.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -1628,50 +1628,6 @@
         }
     } test_e_repository_install_exheres_0;
 
-    /**
-     * \test Test ERepository Distfile Size querying (total needed to
-     * download, and amount downloaded.
-     */
-    struct ERepositoryDistSizeTest : TestCase
-    {
-        ERepositoryDistSizeTest() : TestCase("dist_size") { }
-
-        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", "e_repository_TEST_dir/repo16");
-            keys->insert("profiles", "e_repository_TEST_dir/repo16/profiles/profile");
-            tr1::shared_ptr<ERepository> repo(make_ebuild_repository(
-                        &env, keys));
-            env.package_database()->add_repository(1, repo);
-
-            const tr1::shared_ptr<const PackageID> ida(*env.package_database()->
-                    query(query::Matches(
-                            PackageDepSpec(parse_user_package_dep_spec("category/package-a",
-                                    UserPackageDepSpecOptions()))), qo_order_by_version)->last());
-            const tr1::shared_ptr<const PackageID> idb(*env.package_database()->
-                    query(query::Matches(
-                            PackageDepSpec(parse_user_package_dep_spec("category/package-b",
-                                    UserPackageDepSpecOptions()))), qo_order_by_version)->last());
-            const tr1::shared_ptr<const PackageID> idc(*env.package_database()->
-                    query(query::Matches(
-                            PackageDepSpec(parse_user_package_dep_spec("category/package-c",
-                                    UserPackageDepSpecOptions()))), qo_order_by_version)->last());
-
-            TEST_CHECK_EQUAL(ida->size_of_download_required_key()->value(), 0);
-            TEST_CHECK_EQUAL(ida->size_of_all_distfiles_key()->value(), 10);
-            TEST_CHECK_EQUAL(idb->size_of_download_required_key()->value(),
-                    idb->size_of_all_distfiles_key()->value());
-            TEST_CHECK_EQUAL(idc->size_of_download_required_key()->value(), 12);
-            TEST_CHECK_EQUAL(idc->size_of_all_distfiles_key()->value(), 22);
-        }
-    } test_e_repository_dist_size;
-
     struct ERepositoryDependenciesRewriterTest : TestCase
     {
         ERepositoryDependenciesRewriterTest() : TestCase("dependencies_rewriter") { }

Modified: trunk/paludis/repositories/e/e_repository_entries.hh
===================================================================
--- trunk/paludis/repositories/e/e_repository_entries.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/e_repository_entries.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -93,6 +93,12 @@
                         tr1::shared_ptr<const ERepositoryProfile>) const = 0;
 
                 /**
+                 * Handle a pretend fetch.
+                 */
+                virtual void pretend_fetch(const tr1::shared_ptr<const ERepositoryID> &, PretendFetchAction &,
+                        tr1::shared_ptr<const ERepositoryProfile>) const = 0;
+
+                /**
                  * Handle a pretend.
                  */
                 virtual bool pretend(const tr1::shared_ptr<const ERepositoryID> &,

Modified: trunk/paludis/repositories/e/ebuild_entries.cc
===================================================================
--- trunk/paludis/repositories/e/ebuild_entries.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/ebuild_entries.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -26,6 +26,7 @@
 #include <paludis/repositories/e/eapi.hh>
 #include <paludis/repositories/e/dep_parser.hh>
 #include <paludis/repositories/e/fetch_visitor.hh>
+#include <paludis/repositories/e/pretend_fetch_visitor.hh>
 #include <paludis/repositories/e/check_fetched_files_visitor.hh>
 #include <paludis/repositories/e/aa_visitor.hh>
 #include <paludis/repositories/e/e_stripper.hh>
@@ -475,6 +476,23 @@
 }
 
 void
+EbuildEntries::pretend_fetch(const tr1::shared_ptr<const ERepositoryID> & id,
+        PretendFetchAction & a, tr1::shared_ptr<const ERepositoryProfile>) const
+{
+    using namespace tr1::placeholders;
+
+    Context context("When pretending to fetch ID '" + stringify(*id) + "':");
+
+    if (id->fetches_key())
+    {
+        PretendFetchVisitor f(_imp->params.environment, id, *id->eapi(),
+                _imp->e_repository->params().distdir, a.options[k::fetch_unneeded()],
+                id->fetches_key()->initial_label(), a);
+        id->fetches_key()->value()->accept(f);
+    }
+}
+
+void
 EbuildEntries::install(const tr1::shared_ptr<const ERepositoryID> & id,
         const InstallActionOptions & o, tr1::shared_ptr<const ERepositoryProfile> p) const
 {

Modified: trunk/paludis/repositories/e/ebuild_entries.hh
===================================================================
--- trunk/paludis/repositories/e/ebuild_entries.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/ebuild_entries.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -84,6 +84,9 @@
                 virtual void fetch(const tr1::shared_ptr<const ERepositoryID> &, const FetchActionOptions &,
                         tr1::shared_ptr<const ERepositoryProfile>) const;
 
+                virtual void pretend_fetch(const tr1::shared_ptr<const ERepositoryID> &, PretendFetchAction &,
+                        tr1::shared_ptr<const ERepositoryProfile>) const;
+
                 virtual void install(const tr1::shared_ptr<const ERepositoryID> &, const InstallActionOptions &,
                         tr1::shared_ptr<const ERepositoryProfile>) const;
 

Modified: trunk/paludis/repositories/e/ebuild_id.cc
===================================================================
--- trunk/paludis/repositories/e/ebuild_id.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/ebuild_id.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -26,7 +26,6 @@
 #include <paludis/repositories/e/e_key.hh>
 #include <paludis/repositories/e/e_mask.hh>
 #include <paludis/repositories/e/eapi.hh>
-#include <paludis/repositories/e/distfiles_size_visitor.hh>
 #include <paludis/repositories/e/manifest2_reader.hh>
 
 #include <paludis/name.hh>
@@ -77,8 +76,6 @@
         mutable tr1::shared_ptr<const EDependenciesKey> build_dependencies;
         mutable tr1::shared_ptr<const EDependenciesKey> run_dependencies;
         mutable tr1::shared_ptr<const EDependenciesKey> post_dependencies;
-        mutable tr1::shared_ptr<const EDistSizeKey> size_of_download_required;
-        mutable tr1::shared_ptr<const EDistSizeKey> size_of_all_distfiles;
         mutable tr1::shared_ptr<const EProvideKey> provide;
         mutable tr1::shared_ptr<const ERestrictKey> restrictions;
         mutable tr1::shared_ptr<const EFetchableURIKey> src_uri;
@@ -264,33 +261,6 @@
     _imp->profile_mask = make_shared_ptr(new EMutableRepositoryMaskInfoKey(shared_from_this(), "profile_mask", "Profile masked",
         tr1::static_pointer_cast<const ERepository>(repository())->profile()->profile_masked(*this), mkt_internal));
     add_metadata_key(_imp->profile_mask);
-
-    FSEntry m2(_imp->repository->layout()->package_directory(_imp->name) / "Manifest");
-    if (_imp->src_uri && m2.exists())
-    {
-        tr1::shared_ptr<Manifest2Reader> m2r(new Manifest2Reader(m2));
-
-        tr1::shared_ptr<DistfilesSizeVisitor> dsv(new DistfilesSizeVisitor(_imp->environment,
-                shared_from_this(),
-                _imp->repository->params().distdir,
-                _imp->src_uri->initial_label(),
-                false,
-                m2r));
-        tr1::shared_ptr<DistfilesSizeVisitor> dsv2(new DistfilesSizeVisitor(_imp->environment,
-                shared_from_this(),
-                _imp->repository->params().distdir,
-                _imp->src_uri->initial_label(),
-                true,
-                m2r));
-
-        _imp->size_of_download_required.reset(new EDistSizeKey("UNDOWNLOADEDDISTFILESIZE",
-                    "Undownloaded Size", mkt_normal, _imp->src_uri, dsv));
-        add_metadata_key(_imp->size_of_download_required);
-
-        _imp->size_of_all_distfiles.reset(new EDistSizeKey("TOTALDISTFILESIZE",
-                    "Total Distfiles Size", mkt_normal, _imp->src_uri, dsv2));
-        add_metadata_key(_imp->size_of_all_distfiles);
-    }
 }
 
 namespace
@@ -654,20 +624,6 @@
     return _imp->fs_location;
 }
 
-const tr1::shared_ptr<const MetadataValueKey<long> >
-EbuildID::size_of_download_required_key() const
-{
-    need_keys_added();
-    return _imp->size_of_download_required;
-}
-
-const tr1::shared_ptr<const MetadataValueKey<long> >
-EbuildID::size_of_all_distfiles_key() const
-{
-    need_keys_added();
-    return _imp->size_of_all_distfiles;
-}
-
 bool
 EbuildID::arbitrary_less_than_comparison(const PackageID &) const
 {
@@ -836,6 +792,11 @@
             result = true;
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+            result = true;
+        }
+
         void visit(const SupportsActionTest<InstallAction> &)
         {
             result = true;
@@ -873,7 +834,7 @@
 namespace
 {
     struct PerformAction :
-        ConstVisitor<ActionVisitorTypes>
+        Visitor<ActionVisitorTypes>
     {
         const tr1::shared_ptr<const PackageID> id;
 
@@ -882,7 +843,7 @@
         {
         }
 
-        void visit(const InstallAction & a)
+        void visit(InstallAction & a)
         {
             tr1::static_pointer_cast<const ERepository>(id->repository())->entries()->install(
                     tr1::static_pointer_cast<const ERepositoryID>(id),
@@ -890,7 +851,7 @@
                     tr1::static_pointer_cast<const ERepository>(id->repository())->profile());
         }
 
-        void visit(const FetchAction & a)
+        void visit(FetchAction & a)
         {
             tr1::static_pointer_cast<const ERepository>(id->repository())->entries()->fetch(
                     tr1::static_pointer_cast<const ERepositoryID>(id),
@@ -898,36 +859,44 @@
                     tr1::static_pointer_cast<const ERepository>(id->repository())->profile());
         }
 
-        void visit(const PretendAction &)
+        void visit(PretendFetchAction & a)
         {
+            tr1::static_pointer_cast<const ERepository>(id->repository())->entries()->pretend_fetch(
+                    tr1::static_pointer_cast<const ERepositoryID>(id),
+                    a,
+                    tr1::static_pointer_cast<const ERepository>(id->repository())->profile());
+        }
+
+        void visit(PretendAction &)
+        {
             tr1::static_pointer_cast<const ERepository>(id->repository())->entries()->pretend(
                     tr1::static_pointer_cast<const ERepositoryID>(id),
                     tr1::static_pointer_cast<const ERepository>(id->repository())->profile());
         }
 
-        void visit(const InfoAction &)
+        void visit(InfoAction &)
         {
             tr1::static_pointer_cast<const ERepository>(id->repository())->entries()->info(
                     tr1::static_pointer_cast<const ERepositoryID>(id),
                     tr1::static_pointer_cast<const ERepository>(id->repository())->profile());
         }
 
-        void visit(const InstalledAction & a) PALUDIS_ATTRIBUTE((noreturn));
-        void visit(const UninstallAction & a) PALUDIS_ATTRIBUTE((noreturn));
-        void visit(const ConfigAction & a) PALUDIS_ATTRIBUTE((noreturn));
+        void visit(InstalledAction & a) PALUDIS_ATTRIBUTE((noreturn));
+        void visit(UninstallAction & a) PALUDIS_ATTRIBUTE((noreturn));
+        void visit(ConfigAction & a) PALUDIS_ATTRIBUTE((noreturn));
     };
 
-    void PerformAction::visit(const InstalledAction & a)
+    void PerformAction::visit(InstalledAction & a)
     {
         throw UnsupportedActionError(*id, a);
     }
 
-    void PerformAction::visit(const UninstallAction & a)
+    void PerformAction::visit(UninstallAction & a)
     {
         throw UnsupportedActionError(*id, a);
     }
 
-    void PerformAction::visit(const ConfigAction & a)
+    void PerformAction::visit(ConfigAction & a)
     {
         throw UnsupportedActionError(*id, a);
     }

Modified: trunk/paludis/repositories/e/ebuild_id.hh
===================================================================
--- trunk/paludis/repositories/e/ebuild_id.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/e/ebuild_id.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -83,8 +83,6 @@
                 virtual const tr1::shared_ptr<const MetadataCollectionKey<PackageIDSequence> > contains_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<tr1::shared_ptr<const PackageID> > > contained_in_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<FSEntry> > fs_location_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_download_required_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_all_distfiles_key() const;
 
                 const tr1::shared_ptr<const MetadataCollectionKey<Set<std::string> > > inherited_key() const;
                 const tr1::shared_ptr<const MetadataSpecTreeKey<LicenseSpecTree> > license_key() const;

Copied: trunk/paludis/repositories/e/pretend_fetch_visitor.cc (from rev 4553, trunk/paludis/repositories/e/distfiles_size_visitor.cc)
===================================================================
--- trunk/paludis/repositories/e/pretend_fetch_visitor.cc	                        (rev 0)
+++ trunk/paludis/repositories/e/pretend_fetch_visitor.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -0,0 +1,142 @@
+/* vim: set sw=4 sts=4 et foldmethod=syntax : */
+
+/*
+ * Copyright (c) 2008 Ciaran McCreesh
+ *
+ * This file is part of the Paludis package manager. Paludis is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU General
+ * Public License version 2, as published by the Free Software Foundation.
+ *
+ * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <paludis/repositories/e/pretend_fetch_visitor.hh>
+#include <paludis/repositories/e/e_repository_id.hh>
+#include <paludis/repositories/e/manifest2_reader.hh>
+#include <paludis/dep_spec.hh>
+#include <paludis/environment.hh>
+#include <paludis/package_id.hh>
+#include <paludis/action.hh>
+#include <paludis/metadata_key.hh>
+#include <paludis/util/visitor-impl.hh>
+#include <paludis/util/private_implementation_pattern-impl.hh>
+#include <paludis/util/fs_entry.hh>
+#include <paludis/util/log.hh>
+#include <paludis/util/stringify.hh>
+#include <paludis/util/make_shared_ptr.hh>
+#include <list>
+#include <set>
+
+using namespace paludis;
+using namespace paludis::erepository;
+
+namespace paludis
+{
+    template <>
+    struct Implementation<PretendFetchVisitor>
+    {
+        const Environment * const env;
+        const tr1::shared_ptr<const PackageID> id;
+        const EAPI & eapi;
+        const FSEntry distdir;
+        const bool fetch_unneeded;
+        tr1::shared_ptr<const URILabel> default_label;
+        PretendFetchAction & action;
+
+        std::set<std::string> already_done;
+        std::list<const URILabel *> labels;
+        Manifest2Reader manifest;
+
+        Implementation(
+                const Environment * const e,
+                const tr1::shared_ptr<const PackageID> & i,
+                const EAPI & p,
+                const FSEntry & d,
+                const bool f,
+                const tr1::shared_ptr<const URILabel> & n,
+                PretendFetchAction & a) :
+            env(e),
+            id(i),
+            eapi(p),
+            distdir(d),
+            fetch_unneeded(f),
+            default_label(n),
+            action(a),
+            manifest(id->fs_location_key()->value().dirname() / "Manifest")
+        {
+            labels.push_front(default_label.get());
+        }
+    };
+}
+
+PretendFetchVisitor::PretendFetchVisitor(
+        const Environment * const e,
+        const tr1::shared_ptr<const PackageID> & i,
+        const EAPI & p,
+        const FSEntry & d,
+        const bool f,
+        const tr1::shared_ptr<const URILabel> & n,
+        PretendFetchAction & a) :
+    PrivateImplementationPattern<PretendFetchVisitor>(new Implementation<PretendFetchVisitor>(e, i, p, d, f, n, a))
+{
+}
+
+PretendFetchVisitor::~PretendFetchVisitor()
+{
+}
+
+void
+PretendFetchVisitor::visit_sequence(const ConditionalDepSpec & u,
+        FetchableURISpecTree::ConstSequenceIterator cur,
+        FetchableURISpecTree::ConstSequenceIterator end)
+{
+    if ((_imp->fetch_unneeded) || (u.condition_met()))
+    {
+        _imp->labels.push_front(* _imp->labels.begin());
+        std::for_each(cur, end, accept_visitor(*this));
+        _imp->labels.pop_front();
+    }
+}
+
+void
+PretendFetchVisitor::visit_sequence(const AllDepSpec &,
+        FetchableURISpecTree::ConstSequenceIterator cur,
+        FetchableURISpecTree::ConstSequenceIterator end)
+{
+    _imp->labels.push_front(* _imp->labels.begin());
+    std::for_each(cur, end, accept_visitor(*this));
+    _imp->labels.pop_front();
+}
+
+void
+PretendFetchVisitor::visit_leaf(const URILabelsDepSpec & l)
+{
+    for (URILabelsDepSpec::ConstIterator i(l.begin()), i_end(l.end()) ;
+            i != i_end ; ++i)
+        *_imp->labels.begin() = i->get();
+}
+
+void
+PretendFetchVisitor::visit_leaf(const FetchableURIDepSpec & u)
+{
+    if (! _imp->already_done.insert(u.filename()).second)
+        return;
+
+    FSEntry destination(_imp->distdir / u.filename());
+    if (destination.exists())
+        return;
+
+    Manifest2Reader::ConstIterator m(_imp->manifest.find("DIST", u.filename()));
+    if (_imp->manifest.end() == m)
+        return;
+
+    _imp->action.will_fetch(destination, m->size);
+}
+

Copied: trunk/paludis/repositories/e/pretend_fetch_visitor.hh (from rev 4553, trunk/paludis/repositories/e/distfiles_size_visitor.hh)
===================================================================
--- trunk/paludis/repositories/e/pretend_fetch_visitor.hh	                        (rev 0)
+++ trunk/paludis/repositories/e/pretend_fetch_visitor.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -0,0 +1,67 @@
+/* vim: set sw=4 sts=4 et foldmethod=syntax : */
+
+/*
+ * Copyright (c) 2008 Ciaran McCreesh
+ *
+ * This file is part of the Paludis package manager. Paludis is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU General
+ * Public License version 2, as published by the Free Software Foundation.
+ *
+ * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef PALUDIS_GUARD_PALUDIS_REPOSITORIES_E_PRETEND_FETCH_VISITOR_HH
+#define PALUDIS_GUARD_PALUDIS_REPOSITORIES_E_PRETEND_FETCH_VISITOR_HH 1
+
+#include <paludis/action-fwd.hh>
+#include <paludis/dep_label-fwd.hh>
+#include <paludis/dep_tree.hh>
+#include <paludis/package_id-fwd.hh>
+#include <paludis/repositories/e/eapi-fwd.hh>
+#include <paludis/util/fs_entry-fwd.hh>
+#include <paludis/util/private_implementation_pattern.hh>
+
+namespace paludis
+{
+    namespace erepository
+    {
+        class PALUDIS_VISIBLE PretendFetchVisitor :
+            private PrivateImplementationPattern<PretendFetchVisitor>,
+            public ConstVisitor<FetchableURISpecTree>
+        {
+            public:
+                PretendFetchVisitor(
+                        const Environment * const,
+                        const tr1::shared_ptr<const PackageID> &,
+                        const EAPI & eapi,
+                        const FSEntry & distdir,
+                        const bool fetch_unneeded,
+                        const tr1::shared_ptr<const URILabel> & initial_label,
+                        PretendFetchAction & action);
+
+                ~PretendFetchVisitor();
+
+                void visit_sequence(const AllDepSpec &,
+                        FetchableURISpecTree::ConstSequenceIterator,
+                        FetchableURISpecTree::ConstSequenceIterator);
+
+                void visit_sequence(const ConditionalDepSpec &,
+                        FetchableURISpecTree::ConstSequenceIterator,
+                        FetchableURISpecTree::ConstSequenceIterator);
+
+                void visit_leaf(const URILabelsDepSpec &);
+
+                void visit_leaf(const FetchableURIDepSpec &);
+        };
+
+    }
+}
+
+#endif

Modified: trunk/paludis/repositories/fake/fake_installed_repository.cc
===================================================================
--- trunk/paludis/repositories/fake/fake_installed_repository.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/fake/fake_installed_repository.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -169,6 +169,10 @@
         {
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+        }
+
         void visit(const SupportsActionTest<InfoAction> &)
         {
         }

Modified: trunk/paludis/repositories/fake/fake_package_id.cc
===================================================================
--- trunk/paludis/repositories/fake/fake_package_id.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/fake/fake_package_id.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -903,6 +903,13 @@
             if (! id->repository()->some_ids_might_support_action(t))
                 throw UnsupportedActionError(*id, a);
         }
+
+        void visit(const PretendFetchAction & a)
+        {
+            SupportsActionTest<PretendFetchAction> t;
+            if (! id->repository()->some_ids_might_support_action(t))
+                throw UnsupportedActionError(*id, a);
+        }
     };
 }
 

Modified: trunk/paludis/repositories/fake/fake_repository.cc
===================================================================
--- trunk/paludis/repositories/fake/fake_repository.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/fake/fake_repository.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -163,6 +163,10 @@
         {
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+        }
+
         void visit(const SupportsActionTest<FetchAction> &)
         {
         }

Modified: trunk/paludis/repositories/gems/gem_specification.cc
===================================================================
--- trunk/paludis/repositories/gems/gem_specification.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/gems/gem_specification.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -444,18 +444,6 @@
     return tr1::shared_ptr<const MetadataValueKey<tr1::shared_ptr<const PackageID> > >();
 }
 
-const tr1::shared_ptr<const MetadataValueKey<long> >
-GemSpecification::size_of_download_required_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
-const tr1::shared_ptr<const MetadataValueKey<long> >
-GemSpecification::size_of_all_distfiles_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
 const tr1::shared_ptr<const MetadataValueKey<bool> >
 GemSpecification::transient_key() const
 {
@@ -581,6 +569,13 @@
             if (! id->repository()->some_ids_might_support_action(t))
                 throw UnsupportedActionError(*id, a);
         }
+
+        void visit(const PretendFetchAction & a)
+        {
+            SupportsActionTest<PretendFetchAction> t;
+            if (! id->repository()->some_ids_might_support_action(t))
+                throw UnsupportedActionError(*id, a);
+        }
     };
 }
 

Modified: trunk/paludis/repositories/gems/gem_specification.hh
===================================================================
--- trunk/paludis/repositories/gems/gem_specification.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/gems/gem_specification.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -111,8 +111,6 @@
                 virtual const tr1::shared_ptr<const MetadataValueKey<std::string> > source_origin_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<std::string> > binary_origin_key() const;
 
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_download_required_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_all_distfiles_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<bool> > transient_key() const;
 
                 virtual bool supports_action(const SupportsActionTestBase &) const PALUDIS_ATTRIBUTE((warn_unused_result));

Modified: trunk/paludis/repositories/gems/gems_repository.cc
===================================================================
--- trunk/paludis/repositories/gems/gems_repository.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/gems/gems_repository.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -302,6 +302,10 @@
         {
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+        }
+
         void visit(const SupportsActionTest<ConfigAction> &)
         {
         }

Modified: trunk/paludis/repositories/gems/installed_gems_repository.cc
===================================================================
--- trunk/paludis/repositories/gems/installed_gems_repository.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/gems/installed_gems_repository.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -328,6 +328,10 @@
         {
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+        }
+
         void visit(const SupportsActionTest<InfoAction> &)
         {
         }

Modified: trunk/paludis/repositories/unpackaged/installed_id.cc
===================================================================
--- trunk/paludis/repositories/unpackaged/installed_id.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/unpackaged/installed_id.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -506,18 +506,6 @@
     return _imp->fs_location_key;
 }
 
-const tr1::shared_ptr<const MetadataValueKey<long> >
-InstalledUnpackagedID::size_of_download_required_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
-const tr1::shared_ptr<const MetadataValueKey<long> >
-InstalledUnpackagedID::size_of_all_distfiles_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
 namespace paludis
 {
     class InstalledUnpackagedTransientKey :
@@ -594,6 +582,11 @@
         {
             result = false;
         }
+
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+            result = false;
+        }
     };
 
     struct PerformAction :
@@ -626,6 +619,11 @@
             throw UnsupportedActionError(*id, a);
         }
 
+        void visit(PretendFetchAction & a) PALUDIS_ATTRIBUTE((noreturn))
+        {
+            throw UnsupportedActionError(*id, a);
+        }
+
         void visit(InfoAction & a) PALUDIS_ATTRIBUTE((noreturn))
         {
             throw UnsupportedActionError(*id, a);

Modified: trunk/paludis/repositories/unpackaged/installed_id.hh
===================================================================
--- trunk/paludis/repositories/unpackaged/installed_id.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/unpackaged/installed_id.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -76,8 +76,6 @@
                 virtual const tr1::shared_ptr<const MetadataValueKey<std::string> > source_origin_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<std::string> > binary_origin_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<FSEntry> > fs_location_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_download_required_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_all_distfiles_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<bool> > transient_key() const;
 
                 virtual bool supports_action(const SupportsActionTestBase &) const PALUDIS_ATTRIBUTE((warn_unused_result));

Modified: trunk/paludis/repositories/unpackaged/installed_repository.cc
===================================================================
--- trunk/paludis/repositories/unpackaged/installed_repository.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/unpackaged/installed_repository.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -203,6 +203,11 @@
             result = false;
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+            result = false;
+        }
+
         void visit(const SupportsActionTest<InstallAction> &)
         {
             result = false;

Modified: trunk/paludis/repositories/unpackaged/unpackaged_id.cc
===================================================================
--- trunk/paludis/repositories/unpackaged/unpackaged_id.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/unpackaged/unpackaged_id.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -277,18 +277,6 @@
     return _imp->fs_location_key;
 }
 
-const tr1::shared_ptr<const MetadataValueKey<long> >
-UnpackagedID::size_of_download_required_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
-const tr1::shared_ptr<const MetadataValueKey<long> >
-UnpackagedID::size_of_all_distfiles_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
 const tr1::shared_ptr<const MetadataValueKey<bool> >
 UnpackagedID::transient_key() const
 {

Modified: trunk/paludis/repositories/unpackaged/unpackaged_id.hh
===================================================================
--- trunk/paludis/repositories/unpackaged/unpackaged_id.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/unpackaged/unpackaged_id.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -74,8 +74,6 @@
                 virtual const tr1::shared_ptr<const MetadataValueKey<std::string> > source_origin_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<std::string> > binary_origin_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<FSEntry> > fs_location_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_download_required_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_all_distfiles_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<bool> > transient_key() const;
 
                 virtual bool supports_action(const SupportsActionTestBase &) const PALUDIS_ATTRIBUTE((warn_unused_result));

Modified: trunk/paludis/repositories/virtuals/installed_virtuals_repository.cc
===================================================================
--- trunk/paludis/repositories/virtuals/installed_virtuals_repository.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/virtuals/installed_virtuals_repository.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -298,6 +298,10 @@
         {
         }
 
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+        }
+
         void visit(const SupportsActionTest<InfoAction> &)
         {
         }

Modified: trunk/paludis/repositories/virtuals/package_id.cc
===================================================================
--- trunk/paludis/repositories/virtuals/package_id.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/virtuals/package_id.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -418,6 +418,13 @@
             if (! id->repository()->some_ids_might_support_action(t))
                 throw UnsupportedActionError(*id, a);
         }
+
+        void visit(const PretendFetchAction & a)
+        {
+            SupportsActionTest<PretendFetchAction> t;
+            if (! id->repository()->some_ids_might_support_action(t))
+                throw UnsupportedActionError(*id, a);
+        }
     };
 }
 
@@ -515,18 +522,6 @@
     return tr1::shared_ptr<const MetadataValueKey<FSEntry> >();
 }
 
-const tr1::shared_ptr<const MetadataValueKey<long> >
-VirtualsPackageID::size_of_download_required_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
-const tr1::shared_ptr<const MetadataValueKey<long> >
-VirtualsPackageID::size_of_all_distfiles_key() const
-{
-    return tr1::shared_ptr<const MetadataValueKey<long> >();
-}
-
 const tr1::shared_ptr<const MetadataValueKey<bool> >
 VirtualsPackageID::transient_key() const
 {

Modified: trunk/paludis/repositories/virtuals/package_id.hh
===================================================================
--- trunk/paludis/repositories/virtuals/package_id.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/virtuals/package_id.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -102,8 +102,6 @@
                 virtual const tr1::shared_ptr<const MetadataCollectionKey<PackageIDSequence> > contains_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<tr1::shared_ptr<const PackageID> > > contained_in_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<FSEntry> > fs_location_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_download_required_key() const;
-                virtual const tr1::shared_ptr<const MetadataValueKey<long> > size_of_all_distfiles_key() const;
                 virtual const tr1::shared_ptr<const MetadataValueKey<bool> > transient_key() const;
 
                 virtual bool supports_action(const SupportsActionTestBase &) const PALUDIS_ATTRIBUTE((warn_unused_result));

Modified: trunk/paludis/repositories/virtuals/virtuals_repository.cc
===================================================================
--- trunk/paludis/repositories/virtuals/virtuals_repository.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/paludis/repositories/virtuals/virtuals_repository.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -394,6 +394,10 @@
         void visit(const SupportsActionTest<UninstallAction> &)
         {
         }
+
+        void visit(const SupportsActionTest<PretendFetchAction> &)
+        {
+        }
     };
 }
 

Modified: trunk/src/output/console_install_task.cc
===================================================================
--- trunk/src/output/console_install_task.cc	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/src/output/console_install_task.cc	2008-04-12 21:53:11 UTC (rev 4554)
@@ -38,6 +38,7 @@
 #include <paludis/util/visitor_cast.hh>
 #include <paludis/util/kc.hh>
 #include <paludis/util/make_shared_ptr.hh>
+#include <paludis/util/pretty_print.hh>
 #include <paludis/query.hh>
 #include <paludis/action.hh>
 #include <paludis/repository.hh>
@@ -127,9 +128,11 @@
         tr1::shared_ptr<const DestinationsSet> d) :
     InstallTask(env, options, d),
     _download_size(0),
+    _download_size_overflow(false),
     _all_tags(new Set<DepTagEntry>),
     _all_use_descriptions(new Set<UseDescription, UseDescriptionComparator>),
     _all_expand_prefixes(new UseFlagNameSet),
+    _already_downloaded(new Set<FSEntry>),
     _resolution_finished(false)
 {
     std::fill_n(_counts, static_cast<int>(last_count), 0);
@@ -625,7 +628,10 @@
 
         if (get_download_size())
         {
-            s << ", at most " << pretty_print_bytes(get_download_size()) << " to download";
+            if (_download_size_overflow)
+                s << ", more than " << pretty_print_bytes(std::numeric_limits<unsigned long>::max()) << " to download";
+            else
+                s << ", at most " << pretty_print_bytes(get_download_size()) << " to download";
         }
     }
 
@@ -1229,6 +1235,37 @@
             _all_expand_prefixes->inserter());
 }
 
+namespace
+{
+    struct FindDistfilesSize :
+        PretendFetchAction
+    {
+        tr1::shared_ptr<Set<FSEntry> > already_downloaded;
+        unsigned long size;
+        bool overflow;
+
+        FindDistfilesSize(const FetchActionOptions & o, const tr1::shared_ptr<Set<FSEntry> > & a) :
+            PretendFetchAction(o),
+            already_downloaded(a),
+            size(0),
+            overflow(false)
+        {
+        }
+
+        void will_fetch(const FSEntry & destination, const unsigned long size_in_bytes)
+        {
+            if (already_downloaded->end() != already_downloaded->find(destination))
+                return;
+            already_downloaded->insert(destination);
+            unsigned long new_size(size + size_in_bytes);
+            if (new_size < size)
+                overflow = true;
+            else
+                size = new_size;
+        }
+    };
+}
+
 void
 ConsoleInstallTask::display_merge_list_entry_distsize(const DepListEntry & d,
         const DisplayMode m)
@@ -1236,9 +1273,16 @@
     if (normal_entry != m && suggested_entry != m)
         return;
 
-    if (! d.package_id->size_of_download_required_key() || d.package_id->size_of_download_required_key()->value() == 0)
+    SupportsActionTest<PretendFetchAction> action_test;
+    if (! d.package_id->supports_action(action_test))
         return;
 
+    FindDistfilesSize action(fetch_action_options(), _already_downloaded);
+    d.package_id->perform_action(action);
+
+    if (! action.size)
+        return;
+
     if (want_compact())
         output_no_endl(" ");
     else
@@ -1247,9 +1291,22 @@
         output_no_endl("    ");
     }
 
-    output_stream() << d.package_id->size_of_download_required_key()->pretty_print()
-        << " to download";
-    set_download_size(get_download_size() + d.package_id->size_of_download_required_key()->value());
+    if (action.overflow)
+        output_stream() << "more than " << pretty_print_bytes(std::numeric_limits<unsigned long>::max())
+            << " to download";
+    else
+        output_stream() << pretty_print_bytes(action.size) << " to download";
+
+    if (action.overflow)
+        _download_size_overflow = true;
+    else
+    {
+        unsigned long new_size(_download_size + action.size);
+        if (new_size < _download_size)
+            _download_size_overflow = true;
+        else
+            _download_size = new_size;
+    }
 }
 
 void

Modified: trunk/src/output/console_install_task.hh
===================================================================
--- trunk/src/output/console_install_task.hh	2008-04-12 16:21:19 UTC (rev 4553)
+++ trunk/src/output/console_install_task.hh	2008-04-12 21:53:11 UTC (rev 4554)
@@ -113,10 +113,12 @@
 
         private:
             int _counts[last_count];
-            long _download_size;
+            unsigned long _download_size;
+            bool _download_size_overflow;
             tr1::shared_ptr<Set<DepTagEntry> > _all_tags;
             tr1::shared_ptr<Set<UseDescription, UseDescriptionComparator> > _all_use_descriptions;
             tr1::shared_ptr<UseFlagNameSet> _all_expand_prefixes;
+            tr1::shared_ptr<Set<FSEntry> > _already_downloaded;
 
             void _add_descriptions(tr1::shared_ptr<const UseFlagNameSet>,
                     const tr1::shared_ptr<const PackageID> &, UseDescriptionState);
@@ -284,11 +286,6 @@
                 return _download_size;
             }
 
-            void set_download_size(const long value)
-            {
-                _download_size = value;
-            }
-
             tr1::shared_ptr<Set<DepTagEntry> > all_tags()
             {
                 return _all_tags;



More information about the paludis-commits mailing list