aboutsummaryrefslogtreecommitdiff
blob: 5594a1297b215da30fa5c3f04650967e0c5731de (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
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    gs_db_tool.py
    ~~~~~~~~~~~~~
    
    CLI to manipulate with package DB
    
    :copyright: (c) 2013 by Jauhien Piatlicki
    :license: GPL-2, see LICENSE for more details.
"""

import argparse

from g_sorcery.package_db import PackageDB

def main():
    parser = \
            argparse.ArgumentParser(description='Package DB manipulation tool')
    parser.add_argument('db_dir')

    subparsers = parser.add_subparsers()

    p_ebuild_data = subparsers.add_parser('ebuild_data')
    p_ebuild_data_subparsers = p_ebuild_data.add_subparsers()

    p_ebuild_data_rename = p_ebuild_data_subparsers.add_parser('add_var')
    p_ebuild_data_rename.set_defaults(func=add_var)
    p_ebuild_data_rename.add_argument('name')
    p_ebuild_data_rename.add_argument('-f', '--function')
    p_ebuild_data_rename.add_argument('-l', '--lambda_function')
    p_ebuild_data_rename.add_argument('-v', '--value')

    p_ebuild_data_rename = p_ebuild_data_subparsers.add_parser('rename_var')
    p_ebuild_data_rename.set_defaults(func=rename_var)
    p_ebuild_data_rename.add_argument('old_name')
    p_ebuild_data_rename.add_argument('new_name')

    p_ebuild_data_show_all = p_ebuild_data_subparsers.add_parser('show_all')
    p_ebuild_data_show_all.set_defaults(func=show_all)

    p_ebuild_data_for_all = p_ebuild_data_subparsers.add_parser('for_all')
    p_ebuild_data_for_all.add_argument('function')
    p_ebuild_data_for_all.set_defaults(func=for_all)

    p_sync = subparsers.add_parser('sync')
    p_sync.set_defaults(func=sync)
    p_sync.add_argument('uri')

    args = parser.parse_args()
    pkg_db = PackageDB(args.db_dir)
    return args.func(pkg_db, args)


def transform_db(function):
    def transformator(pkg_db, args):
        pkg_db.read()
        function(pkg_db, args)
        pkg_db.write_and_manifest()
    return transformator


def read_db(function):
    def reader(pkg_db, args):
        pkg_db.read()
        function(pkg_db, args)
    return reader


@read_db
def for_all(pkg_db, args):
    for package, ebuild_data in pkg_db:
        exec(args.function)


@transform_db
def add_var(pkg_db, args):
    if args.function:
        for package, ebuild_data in pkg_db:
            exec(args.function)
            ebuild_data[args.name] = value
            pkg_db.add_package(package, ebuild_data)

    elif args.lambda_function:
        lmbd = "lambda ebuild_data: " + args.lambda_function
        f = eval(lmbd)
        for package, ebuild_data in pkg_db:
            value = f(ebuild_data)
            ebuild_data[args.name] = value
            pkg_db.add_package(package, ebuild_data)

    elif args.value:
        for package, ebuild_data in pkg_db:
            ebuild_data[args.name] = args.value
            pkg_db.add_package(package, ebuild_data)


@read_db
def show_all(pkg_db, args):
    for package, ebuild_data in pkg_db:
        print(package)
        print('-' * len(str(package)))
        for key, value in ebuild_data.items():
            print("    " + key + ": " + repr(value))
        print("")


def sync(pkg_db, args):
    pkg_db.sync(args.uri)


@transform_db
def rename_var(pkg_db, args):
    for package, ebuild_data in pkg_db:
        if args.old_name in ebuild_data:
            value = ebuild_data.pop(args.old_name)
            ebuild_data[args.new_name] = value
        pkg_db.add_package(package, ebuild_data)


if __name__ == "__main__":
    sys.exit(main())