aboutsummaryrefslogtreecommitdiff
path: root/0.8.0/paludis/qa/qa_environment.cc
blob: 4f42b31afb62124449e2d3ccd1f66069eb00b431 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* vim: set sw=4 sts=4 et foldmethod=syntax : */

/*
 * Copyright (c) 2006 Ciaran McCreesh <ciaranm@ciaranm.org>
 * Copyright (c) 2006 David Morgan <david.morgan@wadham.oxford.ac.uk>
 *
 * 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/package_database_entry.hh>
#include <paludis/qa/qa_environment.hh>
#include <paludis/util/collection_concrete.hh>
#include <paludis/util/tokeniser.hh>
#include <paludis/util/log.hh>
#include <paludis/config_file.hh>
#include <map>

using namespace paludis;
using namespace paludis::qa;

namespace paludis
{
    namespace qa
    {
#include <paludis/qa/qa_environment-sr.hh>
#include <paludis/qa/qa_environment-sr.cc>
    }

    template<>
    struct Implementation<QAEnvironmentBase> :
        InternalCounted<QAEnvironmentBase>
    {
        std::vector<PackageDatabasesEntry> package_databases;

        Implementation(const FSEntry & base, const Environment * const env)
        {
            Context context("When creating package databases from profiles.desc under '"
                    + stringify(base / "profiles") + "':");

            LineConfigFile profiles_desc(base / "profiles" / "profiles.desc");
            for (LineConfigFile::Iterator line(profiles_desc.begin()), line_end(profiles_desc.end()) ;
                    line != line_end ; ++line)
            {
                std::vector<std::string> tokens;
                WhitespaceTokeniser::get_instance()->tokenise(*line, std::back_inserter(tokens));

                if (tokens.size() != 3)
                {
                    Log::get_instance()->message(ll_warning, lc_context, "Skipping invalid line '"
                            + *line + "'");
                    continue;
                }

                PackageDatabase::Pointer db(new PackageDatabase(env));

                /* create our portage repository */
                AssociativeCollection<std::string, std::string>::Pointer keys(
                        new AssociativeCollection<std::string, std::string>::Concrete);

                keys->insert("format", "portage");
                keys->insert("importace", "1");
                keys->insert("location", stringify(base));
                keys->insert("cache", "/var/empty");
                keys->insert("profiles", stringify(base / "profiles" / tokens.at(1)));

                db->add_repository(RepositoryMaker::get_instance()->find_maker("portage")(env,
                            db.raw_pointer(), keys));

                /* create our virtuals repository */
                db->add_repository(RepositoryMaker::get_instance()->find_maker("virtuals")(env,
                            db.raw_pointer(), AssociativeCollection<std::string, std::string>::Pointer(0)));

                /* make the entry */
                package_databases.push_back(PackageDatabasesEntry(PackageDatabasesEntry::create()
                            .arch(UseFlagName(tokens.at(0)))
                            .location(base / "profiles" / tokens.at(1))
                            .status(tokens.at(2))
                            .package_database(db)));
            }

            if (package_databases.empty())
                throw ProfilesDescError("No profiles.desc entries found");
        }
    };
}

QAEnvironmentBase::QAEnvironmentBase(const FSEntry & b, const Environment * const env) :
    PrivateImplementationPattern<QAEnvironmentBase>(new Implementation<QAEnvironmentBase>(b, env))
{
}

QAEnvironmentBase::~QAEnvironmentBase()
{
}

QAEnvironment::QAEnvironment(const FSEntry & base) :
    QAEnvironmentBase(base, this),
    Environment(_imp->package_databases.begin()->package_database)
{
}

QAEnvironment::~QAEnvironment()
{
}

std::string
QAEnvironment::paludis_command() const
{
    return "diefunc 'qa_environment.cc' 'QAEnvironment::paludis_command()' "
        "'paludis_command called from within QAEnvironment'";
}

ProfilesDescError::ProfilesDescError(const std::string & our_message) throw () :
    ConfigurationError("Bad profiles.desc: " + our_message)
{
}