4 import sys, subprocess, datetime, os, re
7 PORTDIR = "/usr/portage/"
8 LOGFILE = "/var/log/emerge.log"
10 green_start = "\033[32m"
17 def __init__(self, name, version=0):
19 self.version = version
22 def add_version(self, version, emerge_time, emerge_date):
24 self.versions.append((version, emerge_time, emerge_date))
27 def average_time(self):
29 for i in self.versions:
32 average_time = total_time/len(self.versions)
38 for i in self.versions:
47 return self.versions[len(self.versions)-1][1]
53 return self.versions[0][1]
56 def print_versions(self):
57 for p in self.versions:
59 green_start + self.name + p[0] + color_stop + " >>> " +
60 self.time(p[1]) + " >>> " +
62 print('-'*90 + "\n" + "Package " + green_start + self.name + color_stop +
63 " emerged " + str(len(self.versions)) + " times.")
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()))
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()
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)
86 hours = (days - int(days))*24
87 minutes = (hours - int(hours))*60
88 seconds = (minutes - int(minutes))*60
92 minutes = int(minutes)
93 seconds = int(round(seconds))
101 pdays = (green_start + str(days) + color_stop + " day ")
103 pdays = (green_start + str(days) + color_stop + " days ")
106 phours = (green_start + str(hours) + color_stop + " hour ")
108 phours = (green_start + str(hours) + color_stop + " hours ")
111 pminutes = (green_start + str(minutes) + color_stop + " minute ")
113 pminutes = (green_start + str(minutes) + color_stop + " minutes ")
115 pseconds = (green_start + str(seconds) + color_stop + " second ")
117 pseconds = (green_start + str(seconds) + color_stop + " seconds ")
119 return (pdays + phours + pminutes + pseconds)
122 def date(self, emerge_date):
123 date = datetime.datetime.fromtimestamp(emerge_date)
125 year = str(date.year)
126 month = str(date.month)
128 hour = str(date.hour)
129 minute = str(date.minute)
130 second = str(date.second)
132 date = "{:%d.%m.%Y %H:%M:%S}".format(date)
139 """Attempt to open the LOGFILE."""
142 f = open(LOGFILE, 'r')
143 except IOError as detail:
151 def search_log_for_package(package_class):
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()
162 time_string = line.partition(">>>")
163 start_time = float(time_string[0].strip().strip(':'))
165 elif ((":::" in line) and ("completed emerge" in line)):
166 if package_class.name in line:
168 time_string = line.partition(":::")
169 stop_time = float(time_string[0].strip().strip(':'))
171 emerge_time = stop_time - start_time
173 package_class.add_version(version, emerge_time, start_time)
176 def get_package(name):
177 """Take the user-input package name and search for it
180 dirlist = os.listdir(PORTDIR)
181 possible_package = []
184 # If the given name is in the format xxx/zzz
185 # assume that xxx is the package group
187 group = name.partition('/')[0]
188 pkg = name.partition('/')[2]
189 directory = PORTDIR + group
192 dirs = os.listdir(directory)
194 possible_package.append(name)
197 # Go through the directory listing searching for anything
198 # that matches the given name
200 directory = PORTDIR + i
201 if os.path.isdir(directory):
202 dirs = os.listdir(directory)
204 possible_package.append(i + '/' + name)
207 if len(possible_package) > 1:
208 print("Multiple packages found for '" + name + "'.")
209 print("Possible packages: ")
210 for value in possible_package:
214 elif len(possible_package) == 1:
215 package = possible_package[0]
220 print("No package '" + name + "' found")
226 def list_pretended():
229 for line in sys.stdin:
230 if "[ebuild" in line:
231 full_name = line.partition("] ")[2].partition(' ')[0]
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]
238 packages.append(package(package_name, version))
242 def main(status, user_package=None):
244 if status == "package":
245 user_package = get_package(user_package)
247 pack = package(user_package)
249 search_log_for_package(pack)
250 pack.print_versions()
251 pack.print_min_max_ave()
254 elif status == "current":
258 elif status == "pretended":
261 print "This is how long these packages would take to emerge"
264 search_log_for_package(p)
265 p.print_pretended_times()
269 if __name__ == "__main__":
271 if len(sys.argv) == 1:
275 elif sys.argv[1] == "-p":
279 elif len(sys.argv) > 1:
280 main("package", sys.argv[1])