aboutsummaryrefslogtreecommitdiff
blob: 5d456a342e81c4992d8fcf45ff69c7e81a9589af (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/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):
    """
    Decorator for functions that change database.
    """
    def transformator(pkg_db, args):
        pkg_db.read()
        function(pkg_db, args)
        pkg_db.write_and_manifest()
    return transformator


def read_db(function):
    """
    Decorator for functions that read from database.
    """
    def reader(pkg_db, args):
        pkg_db.read()
        function(pkg_db, args)
    return reader


@read_db
def for_all(pkg_db, args):
    """
    Execute a given python code for all DB entries.
    """
    for package, ebuild_data in pkg_db:
        exec(args.function)


@transform_db
def add_var(pkg_db, args):
    """
    Add new variable to every entry.
    """
    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 package, ebuild_data: " + args.lambda_function
        f = eval(lmbd)
        for package, ebuild_data in pkg_db:
            value = f(package, 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):
    """
    Display all DB entries.
    """
    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):
    """
    Synchronize database.
    """
    pkg_db.sync(args.uri)


@transform_db
def rename_var(pkg_db, args):
    """
    Rename variable in all entries.
    """
    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())