aboutsummaryrefslogtreecommitdiff
path: root/paludis/repositories/e/make_archive_strings.cc
blob: b1cea06e720e3a1809886d32f6ccf0d1096a796f (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
/* vim: set sw=4 sts=4 et foldmethod=syntax : */

/*
 * Copyright (c) 2011 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/make_archive_strings.hh>
#include <paludis/repositories/e/a_finder.hh>
#include <paludis/repositories/e/aa_visitor.hh>
#include <paludis/repositories/e/eapi.hh>

#include <paludis/metadata_key.hh>
#include <paludis/package_id.hh>

#include <set>

using namespace paludis;
using namespace paludis::erepository;

std::pair<std::string, std::string>
paludis::erepository::make_archives_strings(
        const Environment * const env,
        const std::shared_ptr<const ERepositoryID> & id)
{
    std::string archives, all_archives;
    std::set<std::string> already_in_archives;

    std::shared_ptr<const FetchableURISpecTree> fetches;
    if (id->fetches_key())
        fetches = id->fetches_key()->parse_value();

    /* make A */
    AFinder f(env, id);
    if (fetches)
        fetches->top()->accept(f);

    for (AFinder::ConstIterator i(f.begin()), i_end(f.end()) ; i != i_end ; ++i)
    {
        const FetchableURIDepSpec * const spec(static_cast<const FetchableURIDepSpec *>(i->first));

        if (already_in_archives.end() == already_in_archives.find(spec->filename()))
        {
            archives.append(spec->filename());
            already_in_archives.insert(spec->filename());
        }
        archives.append(" ");
    }

    /* make AA */
    if (! id->eapi()->supported()->ebuild_environment_variables()->env_aa().empty())
    {
        AAVisitor g;
        if (fetches)
            fetches->top()->accept(g);
        std::set<std::string> already_in_all_archives;

        for (AAVisitor::ConstIterator gg(g.begin()), gg_end(g.end()) ; gg != gg_end ; ++gg)
        {
            if (already_in_all_archives.end() == already_in_all_archives.find(*gg))
            {
                all_archives.append(*gg);
                already_in_all_archives.insert(*gg);
            }
            all_archives.append(" ");
        }
    }
    else
        all_archives = "AA-not-set-for-this-EAPI";

    return std::make_pair(archives, all_archives);
}