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):
22 def add_version(self, version, emerge_time, emerge_date):
24 self.versions.append((version, emerge_time, emerge_date))
27 def average_total_time(self):
29 for i in self.versions:
32 average_time = total_time/len(self.versions)
34 return (average_time, total_time)
37 def max_min_time(self):
40 min_time = self.versions[0][1]
41 max_time = self.versions[len(self.versions)-1][1]
43 return (max_time, min_time)
46 def print_versions(self):
47 for p in self.versions:
49 green_start + self.name + p[0] + color_stop + " >>> " +
50 self.time(p[1]) + " >>> " +
52 print('-'*90 + "\n" + "Package " + green_start + self.name + color_stop +
53 " emerged " + str(len(self.versions)) + " times.")
57 def print_min_max_ave(self):
58 max_min = self.max_min_time()
59 ave_total = self.average_total_time()
61 print("Max time: \t" + self.time(max_min[0]) +
62 "\nMin time: \t" + self.time(max_min[1]) +
63 "\nAverage time: \t" + self.time(ave_total[0]) +
64 "\nIn total spent " + self.time(ave_total[1]) +
65 " emerging " + green_start + self.name + color_stop)
70 hours = (days - int(days))*24
71 minutes = (hours - int(hours))*60
72 seconds = (minutes - int(minutes))*60
76 minutes = int(minutes)
77 seconds = int(round(seconds))
85 pdays = (green_start + str(days) + color_stop + " day ")
87 pdays = (green_start + str(days) + color_stop + " days ")
90 phours = (green_start + str(hours) + color_stop + " hour ")
92 phours = (green_start + str(hours) + color_stop + " hours ")
95 pminutes = (green_start + str(minutes) + color_stop + " minute ")
97 pminutes = (green_start + str(minutes) + color_stop + " minutes ")
99 pseconds = (green_start + str(seconds) + color_stop + " second ")
101 pseconds = (green_start + str(seconds) + color_stop + " seconds ")
103 return (pdays + phours + pminutes + pseconds)
106 def date(self, emerge_date):
107 date = datetime.datetime.fromtimestamp(emerge_date)
109 year = str(date.year)
110 month = str(date.month)
112 hour = str(date.hour)
113 minute = str(date.minute)
114 second = str(date.second)
116 date = "{:%d.%m.%Y %H:%M:%S}".format(date)
123 """Attempt to open the LOGFILE."""
126 f = open(LOGFILE, 'r')
127 except IOError as detail:
135 def search_log_for_package(user_package):
139 packages.insert(0, package(user_package))
142 if ((">>>" in line) and ("emerge" in line)):
143 if user_package in line:
144 version = line.partition(user_package)[2].partition(' ')[0]
145 digit = version.strip('-')[0].isdigit()
148 time_string = line.partition(">>>")
149 start_time = float(time_string[0].strip().strip(':'))
151 elif ((":::" in line) and ("completed emerge" in line)):
152 if user_package in line:
154 time_string = line.partition(":::")
155 stop_time = float(time_string[0].strip().strip(':'))
157 emerge_time = stop_time - start_time
159 packages[0].add_version(version, emerge_time, start_time)
162 def get_package(name):
163 """Take the user-input package name and search for it
166 dirlist = os.listdir(PORTDIR)
167 possible_package = []
170 # If the given name is in the format xxx/zzz
171 # assume that xxx is the package group
173 group = name.partition('/')[0]
174 pkg = name.partition('/')[2]
175 directory = PORTDIR + group
178 dirs = os.listdir(directory)
180 possible_package.append(name)
183 # Go through the directory listing searching for anything
184 # that matches the given name
186 directory = PORTDIR + i
187 if os.path.isdir(directory):
188 dirs = os.listdir(directory)
190 possible_package.append(i + '/' + name)
193 if len(possible_package) > 1:
194 print("Multiple packages found for '" + name + "'.")
195 print("Possible packages: ")
196 for value in possible_package:
200 elif len(possible_package) == 1:
201 package = possible_package[0]
206 print("No package '" + name + "' found")
213 def main(status, user_package=None):
215 if status == "package":
216 user_package = get_package(user_package)
218 search_log_for_package(user_package)
219 packages[0].print_versions()
220 packages[0].print_min_max_ave()
223 elif status == "current":
227 elif status == "pretended":
233 if __name__ == "__main__":
235 if len(sys.argv) == 1:
239 elif sys.argv[1] == "-p":
243 elif len(sys.argv) > 1:
244 main("package", sys.argv[1])