]> git.itanic.dy.fi Git - emerge-timer/blob - emerge-timer.py
Add pretended packages
[emerge-timer] / emerge-timer.py
1 #!/usr/bin/python
2
3
4 import sys, subprocess, datetime, os, re
5
6
7 PORTDIR = "/usr/portage/"
8 LOGFILE = "/var/log/emerge.log"
9
10 green_start = "\033[32m"
11 color_stop = "\033[m"
12
13 packages = []
14
15
16 class package:
17     def __init__(self, name, version=0):
18         self.name = name
19         self.version = version
20         self.versions = []
21
22     def add_version(self, version, emerge_time, emerge_date):
23
24         self.versions.append((version, emerge_time, emerge_date))
25
26
27     def average_total_time(self):
28         total_time = 0
29         for i in self.versions:
30             total_time += i[1]
31
32         average_time = total_time/len(self.versions)
33
34         return (average_time, total_time)
35
36
37     def max_min_time(self):
38         self.versions.sort()
39
40         min_time = self.versions[0][1]
41         max_time = self.versions[len(self.versions)-1][1]
42
43         return (max_time, min_time)
44
45
46     def print_versions(self):
47         for p in self.versions:
48             print('-'*90 + "\n" +
49                   green_start + self.name + p[0] + color_stop + "  >>>  " +
50                   self.time(p[1]) + "  >>>  " +
51                   self.date(p[2]))
52         print('-'*90 + "\n" + "Package " + green_start + self.name + color_stop +
53               " emerged " + str(len(self.versions)) + " times.")
54         print
55
56     def print_pretended_times(self):
57         ave_time = self.average_total_time()[0]
58
59         print(green_start + self.name + '-' + self.version + color_stop +
60               "\naverage time: " + self.time(ave_time))
61
62
63     def print_min_max_ave(self):
64         max_min = self.max_min_time()
65         ave_total = self.average_total_time()
66
67         print("Max time: \t" + self.time(max_min[0]) +
68               "\nMin time: \t" + self.time(max_min[1]) +
69               "\nAverage time: \t" + self.time(ave_total[0]) +
70               "\nIn total spent " + self.time(ave_total[1]) +
71               " emerging " + green_start + self.name + color_stop)
72
73     def time(self, time):
74
75         days = time/(3600*24)
76         hours = (days - int(days))*24
77         minutes = (hours - int(hours))*60
78         seconds = (minutes - int(minutes))*60
79
80         days = int(days)
81         hours = int(hours)
82         minutes = int(minutes)
83         seconds = int(round(seconds))
84
85         pdays = str()
86         phours = str()
87         pminutes = str()
88         pseconds = str()
89
90         if days > 0:
91             pdays = (green_start + str(days) + color_stop + " day ")
92             if days != 1:
93                 pdays = (green_start + str(days) + color_stop + " days ")
94
95         if hours > 0:
96             phours = (green_start + str(hours) + color_stop + " hour ")
97             if hours != 1:
98                 phours = (green_start + str(hours) + color_stop + " hours ")
99
100         if minutes > 0:
101             pminutes = (green_start + str(minutes) + color_stop + " minute ")
102             if minutes != 1:
103                 pminutes = (green_start + str(minutes) + color_stop + " minutes ")
104
105         pseconds = (green_start + str(seconds) + color_stop + " second ")
106         if seconds != 1:
107             pseconds = (green_start + str(seconds) + color_stop + " seconds ")
108
109         return (pdays + phours + pminutes + pseconds)
110
111
112     def date(self, emerge_date):
113         date = datetime.datetime.fromtimestamp(emerge_date)
114
115         year = str(date.year)
116         month = str(date.month)
117         day = str(date.day)
118         hour = str(date.hour)
119         minute = str(date.minute)
120         second = str(date.second)
121
122         date = "{:%d.%m.%Y %H:%M:%S}".format(date)
123
124         return date
125
126
127
128 def open_log():
129     """Attempt to open the LOGFILE."""
130
131     try:
132         f = open(LOGFILE, 'r')
133     except IOError as detail:
134         print detail
135         sys.exit(1)
136     finally:
137         return f
138
139
140
141 def search_log_for_package(package_class):
142
143     log = open_log()
144
145     for line in log:
146         if ((">>>" in line) and ("emerge" in line)):
147             if package_class.name in line:
148                 version = line.partition(package_class.name)[2].partition(' ')[0]
149                 digit = version.strip('-')[0].isdigit()
150
151                 if digit:
152                     time_string = line.partition(">>>")
153                     start_time = float(time_string[0].strip().strip(':'))
154
155         elif ((":::" in line) and ("completed emerge" in line)):
156             if package_class.name in line:
157                 if digit:
158                     time_string = line.partition(":::")
159                     stop_time = float(time_string[0].strip().strip(':'))
160
161                     emerge_time = stop_time - start_time
162
163                     package_class.add_version(version, emerge_time, start_time)
164
165
166 def get_package(name):
167     """Take the user-input package name and search for it
168     in PORTDIR. """
169
170     dirlist = os.listdir(PORTDIR)
171     possible_package = []
172
173
174     # If the given name is in the format xxx/zzz
175     # assume that xxx is the package group
176     if '/' in name:
177         group = name.partition('/')[0]
178         pkg = name.partition('/')[2]
179         directory = PORTDIR + group
180
181         if group in dirlist:
182             dirs = os.listdir(directory)
183             if pkg in dirs:
184                 possible_package.append(name)
185
186
187     # Go through the directory listing searching for anything
188     # that matches the given name
189     for i in dirlist:
190         directory = PORTDIR + i
191         if os.path.isdir(directory):
192             dirs = os.listdir(directory)
193             if name in dirs:
194                 possible_package.append(i + '/' + name)
195
196
197     if len(possible_package) > 1:
198         print("Multiple packages found for '" + name + "'.")
199         print("Possible packages: ")
200         for value in possible_package:
201             print("\t" + value)
202
203
204     elif len(possible_package) == 1:
205         package = possible_package[0]
206         return package
207
208
209     else:
210         print("No package '" + name + "' found")
211
212
213     sys.exit(1)
214
215
216 def list_pretended():
217     log = open_log()
218
219     for line in sys.stdin:
220         if "[ebuild" in line:
221             full_name = line.partition("] ")[2].partition(' ')[0]
222
223             version = full_name.partition('/')[2].partition('-')[2]
224             while not version[0].isdigit():
225                 version = version.partition('-')[2]
226             package_name = full_name[:-len(version)-1]
227
228             packages.append(package(package_name, version))
229
230
231
232 def main(status, user_package=None):
233
234     if status == "package":
235         user_package = get_package(user_package)
236
237         pack = package(user_package)
238
239         search_log_for_package(pack)
240         pack.print_versions()
241         pack.print_min_max_ave()
242
243
244     elif status == "current":
245         pass
246
247
248     elif status == "pretended":
249         list_pretended()
250
251         print "This is how long these packages would take to emerge"
252
253         for p in packages:
254             search_log_for_package(p)
255             p.print_pretended_times()
256             print
257
258
259 if __name__ == "__main__":
260
261     if len(sys.argv) == 1:
262         main("current")
263         sys.exit(1)
264
265     elif sys.argv[1] == "-p":
266         main("pretended")
267         sys.exit(1)
268
269     elif len(sys.argv) > 1:
270         main("package", sys.argv[1])
271