summaryrefslogtreecommitdiff
path: root/portato/helper.py
blob: ec3c70f8c7a074905776503c28a70b0f32e3b40c (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
# -*- coding: utf-8 -*-
#
# File: portato/helper.py
# This file is part of the Portato-Project, a graphical portage-frontend.
#
# Copyright (C) 2006-2009 René 'Necoro' Neumann
# This is free software.  You may redistribute copies of it under the terms of
# the GNU General Public License version 2.
# There is NO WARRANTY, to the extent permitted by law.
#
# Written by René 'Necoro' Neumann <necoro@necoro.net> et.al.

"""
Some nice functions used in the program.
"""
from __future__ import absolute_import, with_statement

import os, logging

debug         = logging.getLogger("portatoLogger").debug
info         = logging.getLogger("portatoLogger").info
warning     = logging.getLogger("portatoLogger").warning
error         = logging.getLogger("portatoLogger").error
critical     = logging.getLogger("portatoLogger").critical

def N_ (s):
    return s

def get_runsystem ():
     # check for sabayon first, as sabayon also has the gentoo release
    for sp in ("/etc/sabayon-release", "/etc/sabayon-edition"):
        if os.path.exists(sp):
            with open(sp) as r:
                return ("Sabayon", r.readline().strip())
    
    if os.path.exists("/etc/gentoo-release"):
            return ("Gentoo", "")

    else: return ("Unknown", "")

def paren_reduce(mystr):
    """
    Take a string and convert all paren enclosed entities into sublists, optionally
    futher splitting the list elements by spaces.
    
    This function is copied from portage.

    Example usage:
        >>> paren_reduce('foobar foo ( bar baz )')
        ['foobar', 'foo', ['bar', 'baz']]

    @param mystr: The string to reduce
    @type mystr: String
    @rtype: Array
    @return: The reduced string in an array
    """
    mylist = []
    while mystr:
        left_paren = mystr.find("(")
        has_left_paren = left_paren != -1
        right_paren = mystr.find(")")
        has_right_paren = right_paren != -1
        if not has_left_paren and not has_right_paren:
            freesec = mystr
            subsec = None
            tail = ""
        elif mystr[0] == ")":
            return [mylist,mystr[1:]]
        elif has_left_paren and not has_right_paren:
            error(_("Invalid dependency string"))
            return []
        elif has_left_paren and left_paren < right_paren:
            freesec,subsec = mystr.split("(",1)
            subsec,tail = paren_reduce(subsec)
        else:
            subsec,tail = mystr.split(")",1)
            subsec = filter(None, subsec.split(" "))
            return [mylist+subsec,tail]
        mystr = tail
        if freesec:
            mylist = mylist + filter(None, freesec.split(" "))
        if subsec is not None:
            mylist = mylist + [subsec]
    return mylist

def flatten (listOfLists):
    """Flattens the given list of lists.

    @param listOfLists: the list of lists to flatten
    @type listOfLists: list of lists
    @returns: flattend list
    @rtype: list"""

    if not isinstance(listOfLists, list):
        return [listOfLists]

    ret = []
    for r in listOfLists:
        ret.extend(flatten(r))

    return ret

def detect_desktop_environment():
    # stolen from wicd :)

    desktop_environment = 'generic'
    if os.environ.get('KDE_FULL_SESSION') == 'true':
        desktop_environment = 'kde'
    elif os.environ.get('GNOME_DESKTOP_SESSION_ID'):
        desktop_environment = 'gnome'
    #else: # no need for this part as of now
    #    try:
    #        info = commands.getoutput('xprop -root _DT_SAVE_MODE')
    #        if ' = "xfce4"' in info:
    #            desktop_environment = 'xfce'
    #    except (OSError, RuntimeError):
    #       pass
    
    return desktop_environment