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.")
56 def print_min_max_ave(self):
57 max_min = self.max_min_time()
58 ave_total = self.average_total_time()
60 print("Max time: \t" + self.time(max_min[0]) +
61 "\nMin time: \t" + self.time(max_min[1]) +
62 "\nAverage time: \t" + self.time(ave_total[0]) +
63 "\nIn total spent " + self.time(ave_total[1]) +
64 " emerging " + self.name)
69 hours = (days - int(days))*24
70 minutes = (hours - int(hours))*60
71 seconds = (minutes - int(minutes))*60
75 minutes = int(minutes)
76 seconds = int(round(seconds))
84 pdays = (green_start + str(days) + color_stop + " day ")
89 phours = (green_start + str(hours) + color_stop + " hour ")
94 pminutes = (green_start + str(minutes) + color_stop + " minute ")
98 pseconds = (green_start + str(seconds) + color_stop + " second ")
102 return (pdays + phours + pminutes + pdays)
105 def date(self, emerge_date):
106 date = datetime.datetime.fromtimestamp(emerge_date)
108 year = str(date.year)
109 month = str(date.month)
111 hour = str(date.hour)
112 minute = str(date.minute)
113 second = str(date.second)
115 date = "{:%d.%m.%Y %H:%M:%S}".format(date)
122 """Attempt to open the LOGFILE."""
125 f = open(LOGFILE, 'r')
126 except IOError as detail:
134 def search_log_for_package(user_package):
138 packages.insert(0, package(user_package))
141 if ((">>>" in line) and ("emerge" in line)):
142 if user_package in line:
143 version = line.partition(user_package)[2].partition(' ')[0]
144 digit = version.strip('-')[0].isdigit()
147 time_string = line.partition(">>>")
148 start_time = float(time_string[0].strip().strip(':'))
150 elif ((":::" in line) and ("completed emerge" in line)):
151 if user_package in line:
153 time_string = line.partition(":::")
154 stop_time = float(time_string[0].strip().strip(':'))
156 emerge_time = stop_time - start_time
158 packages[0].add_version(version, emerge_time, start_time)
161 def get_package(name):
162 """Take the user-input package name and search for it
165 dirlist = os.listdir(PORTDIR)
166 possible_package = []
169 # If the given name is in the format xxx/zzz
170 # assume that xxx is the package group
172 group = name.partition('/')[0]
173 pkg = name.partition('/')[2]
174 directory = PORTDIR + group
177 dirs = os.listdir(directory)
179 possible_package.append(name)
182 # Go through the directory listing searching for anything
183 # that matches the given name
185 directory = PORTDIR + i
186 if os.path.isdir(directory):
187 dirs = os.listdir(directory)
189 possible_package.append(i + '/' + name)
192 if len(possible_package) > 1:
193 print("Multiple packages found for '" + name + "'.")
194 print("Possible packages: ")
195 for value in possible_package:
199 elif len(possible_package) == 1:
200 package = possible_package[0]
205 print("No package '" + name + "' found")
212 def main(status, user_package=None):
214 if status == "package":
215 user_package = get_package(user_package)
217 search_log_for_package(user_package)
218 packages[0].print_versions()
219 packages[0].print_min_max_ave()
222 elif status == "current":
226 elif status == "pretended":
232 if __name__ == "__main__":
234 if len(sys.argv) == 1:
238 elif sys.argv[1] == "-p":
242 elif len(sys.argv) > 1:
243 main("package", sys.argv[1])