self.versions = []
self.emerge_time = "infinity"
+ self.plotData = []
+
def add_version(self, version, emerge_time, emerge_date):
"""Add version to the class version list"""
self.versions.append((version, emerge_time, emerge_date))
+ def seek_versions(self, whatToSeek, Input):
+
+ if whatToSeek == "date":
+ for i in self.versions:
+ if i[1] == Input:
+ return i[2]
+
+ if whatToSeek == "version":
+ for i in self.versions:
+ if i[1] == Input:
+ return i[0]
+
+
def average_time(self):
"""Return average time from class version list"""
total_time = 0
return total_time
- def max_time(self):
- """Return maximum time from class version list"""
+ def min_max_time(self, setting):
+ """Return maximum or minimum time from class version list"""
emerge_times = []
for i in self.versions:
emerge_times.sort()
- return emerge_times[-1]
-
-
- def min_time(self):
- """Return minimum time from class version list"""
-
- emerge_times = []
- for i in self.versions:
- emerge_times.append(i[1])
-
- emerge_times.sort()
+ if setting == "max":
+ return emerge_times[-1]
+ elif setting == "min":
+ return emerge_times[0]
- return emerge_times[0]
if len(self.versions) == 1:
print("\t last time: "),
- print(give_time(self.average_time())),
+ print(give_time(self.average_time()), end='')
elif len(self.versions) > 1:
- print("\t average time:"),
- print(give_time(self.average_time())),
+ print("\t average time: ", end='')
+ print(give_time(self.average_time()), end='')
else:
print("\t average time: " + GREEN("unknown\n")),
return
- print("\n\t " + '-'*45),
+ print("\n\t " + '-'*45, end='')
- print("\n\t time to finish:"),
+ print("\n\t time to finish: ", end='')
if type(self.emerge_time) != str:
finish_time = self.average_time() - self.emerge_time
if finish_time > 0:
- print(give_time(finish_time))
+ print(give_time(finish_time), "\n")
else:
print(GREEN("any time now"))
else:
if len(give_time(p[1], True)) > time_length:
time_length = len(give_time(p[1], True))
+ # Create the data for plotting in the format (emerge time, emerge date)
+ self.plotData.append((p[1], p[2]))
+
dots = (version_length + time_length + len(self.name)
+ len(give_date(self.versions[0][2])) + 14)
if len(self.versions) == 1:
return
- maxi = self.max_time()
- mini = self.min_time()
+ maxi = self.min_max_time("max")
+ mini = self.min_max_time("min")
average = self.average_time()
total = self.total_time()
- print("Max time:\t" + give_time(maxi) +
- "\nMin time:\t" + give_time(mini) +
- "\nAverage time:\t" + give_time(average) +
- "\nIn total spent:\t" + give_time(total) +
- "emerging " + GREEN(self.name))
+ print("-"*20 +
+ "\nMaximum emerge time:\n" +
+ give_time(maxi) + "for version " +
+ GREEN(self.seek_versions("version", maxi).lstrip("-"))
+ + " on " +
+ give_date(self.seek_versions("date", maxi)))
+
+ print("-"*20 +
+ "\nMinimum emerge time:\n" +
+ give_time(mini) + "for version " +
+ GREEN(self.seek_versions("version", mini).lstrip("-"))
+ + " on " +
+ give_date(self.seek_versions("date", mini)))
+
+ print("-"*20 +
+ "\nAverage emerge time:\n" +
+ give_time(average))
+
+ print("-"*20 +
+ "\nIn total spent:\n" +
+ give_time(total))
+
+
+ def plotToScreen(self):
+ dates = []
+ times = []
+
+ for i in self.plotData:
+ dates.append(datetime.date.fromtimestamp(i[1]))
+ times.append(i[0])
+
+ fig = plt.figure()
+
+ plt.plot_date(dates, times, xdate=True, ydate=False)
+
+ plt.ylabel("Emerge time [s]")
+ plt.suptitle(self.name)
+ plt.grid()
+ fig.autofmt_xdate()
+ plt.show()
try:
f = open(LOGFILE, 'r')
except IOError as detail:
- print detail
+ print(detail)
sys.exit(1)
return f
elif ((":::" in line) and ("completed emerge" in line)):
for p in all_packages:
if p[0] in line:
- stop_time = float(line.partition(':')[0])
-
print("\t" + give_date(p[1]) + " >>> " + GREEN(p[0]))
- total_emerge_time += stop_time - p[1]
emerge_number += 1
all_packages.pop(all_packages.index(p))
- print("\nTotal emerge time of " + GREEN(str(emerge_number)) +
- " merges: " + give_time(total_emerge_time))
+
+ print("\n" + GREEN(str(emerge_number)) + " emerges in total found.")
if len(PACKAGES) == 0:
- print "No current emerge process found."
+ print("No current emerge process found.")
return 1
timestamp = datetime.datetime.fromtimestamp(time)
difference = (now - timestamp).total_seconds()
- if ((difference < p.emerge_time) or
- (p.emerge_time == "infinity")):
+ if ((p.emerge_time == "infinity") or
+ (difference < p.emerge_time)):
p.emerge_time = difference
return 0
+def search_syncs():
+ f = open_log()
+
+ print("These emerge syncs found")
+ print("\tDate Server")
+ print("\t------------------------------")
+
+ a = 0
+ for line in f:
+ if "=== Sync completed with" in line:
+ time = float(line.partition(' ')[0].strip(":"))
+ server = line.rpartition(' ')[2]
+
+ print("\t" + GREEN(give_date(time)) +
+ " === " + server),
+ a += 1
+
+ print("\n" + GREEN(str(a)) + " emerge syncs found. ")
+
+
def main(status, user_package=None):
try:
_main(status, user_package)
def _main(status, user_package=None):
- """Main function. Hanlde all the different modes of operation."""
+ """Main function. Handle all the different modes of operation."""
if status == "package":
for p in user_package:
pack.print_versions()
pack.print_min_max_ave()
+ if matplotWorking:
+ pack.plotToScreen()
+
else:
print("Package " + GREEN(pack.name)
+ " has never been emerged.")
+ elif status == "sync":
+ search_syncs()
+ return
+
+
elif status == "list":
search_log_for_all_packages()
return
if list_emerge_processes():
return
- print "Currently emerging:"
+ print("Currently emerging:")
for p in PACKAGES:
search_log_for_package(p)
elif status == "pretended":
list_pretended()
- print "This is how long these packages would take to emerge"
+ print("This is how long these packages would take to emerge")
total_pretended_time = 0
\t-c, --current \t Show time until currently compiling package finishes
\t-p, --pretended Calculate compile time from piped 'emerge -p' output
\t-l, --list \t List all emerged packages
+\t-s, --sync \t Show emerge sync history
\t-h, --help \t Show this helpscreen
\t-q, --quiet \t Be less verbose
\t--no-color \t Use colorless output
-\t--simulate \t Do a simulation run"""
+\t--plot \t\t Plot emerge times into a 2D scatter plot
+\t\t\t (needs matlibplot installed for this to work)"""
+
- print usage
+ print(usage)
sys.exit(0)
mode = "package"
input_packages = None
simulation = False
+ matplotWorking = False
for arg in sys.argv[1:]:
if arg == "-l" or arg == "--list":
mode = "list"
+ if arg == "-s" or arg == "--sync":
+ mode = "sync"
+
if arg == "-q" or arg == "--quiet":
QUIET = True
sys.argv.pop(sys.argv.index(arg))
+ if arg == "--plot":
+ try:
+ import matplotlib.pyplot as plt
+ matplotWorking = True
+ except ImportError:
+ print(RED("Cannot initialize matplotlib!"))
+ print(RED("Check that you have properly installed matplotlib.\n"))
+ matplotWorking = False
+
+ sys.argv.pop(sys.argv.index(arg))
+
if arg == "--no-color":
green_start = ""
color_stop = ""
else:
usage()
- if simulation == True:
-
- print(RED("\n" + '*'*25 + "\n" + "THIS IS A SIMULATION RUN\n"
- + '*'*25 + "\n"))
-
- print(RED("Beginning 'package' mode check"))
-
- print(RED("Checking for one emerge\n"))
-
- LOGFILE = "simulate/fake_emerge.log"
- PORTDIR = "simulate/"
-
- main("package", "first_fake_package")
-
- print(RED("\nChecking for three emerges\n"))
-
- main("package", "second_fake_package")
-
- print(RED("\n'package' mode check complete\n"))
-
- print(RED(30*'*'))
-
- print(RED("\nBeginning 'current' mode check"))
- print(RED("Current emerge with no emerge process\n"))
-
- main("current", None)
-
- print(RED("\nCurrent emerge with emerge processes\n"))
-
- PACKAGES.append(package("test-group/second_fake_package", "2.9-r2"))
- PACKAGES[0].emerge_time = 60
- PACKAGES.append(package("test-group/first_fake_package", "1.10.2-r1"))
- PACKAGES[1].emerge_time = 120
-
- main("current", None)
-
- print(RED("\nCurrent emerge with incomplete emerge log " +
- "(causes error in some cases)\n"))
-
- PACKAGES = []
- PACKAGES.append(package("test-group/third_fake_package", "2.9-r2"))
-
- main("current", None)
-
- print(RED("\n" + '*'*20 + "\n" + "SIMULATION FINISHED\n" +
- '*'*20))
-
-
- else:
- main(mode, input_packages)
+ main(mode, input_packages)