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