#!/usr/bin/python
-import sys, subprocess, datetime, os
+
+import sys, subprocess, datetime, os, re
+
PORTDIR = "/usr/portage/"
LOGFILE = "/var/log/emerge.log"
-try:
- f = open(LOGFILE, 'r')
-except IOError:
- print "Permission denied: ", LOGFILE
- sys.exit(1)
+green_start = "\033[32m"
+color_stop = "\033[m"
+
+packages = []
+
+
+class package:
+ def __init__(self, name):
+ self.name = name
+
+ self.versions = []
+
+ def add_version(self, version, emerge_time, emerge_date):
+
+ self.versions.append((version, emerge_time, emerge_date))
+
+
+ def print_versions(self):
+ for p in self.versions:
+ print("\t" + self.name + p[0] + " >>> " +
+ self.time(p[1]) + " >>> " +
+ green_start + self.date(p[2]) + color_stop)
+
+
+ def time(self, time):
+
+ days = time/(3600*24)
+ hours = (days - int(days))*24
+ minutes = (hours - int(hours))*60
+ seconds = (minutes - int(minutes))*60
+
+ days = int(days)
+ hours = int(hours)
+ minutes = int(minutes)
+ seconds = int(round(seconds))
+
+ pdays = str()
+ phours = str()
+ pminutes = str()
+ pseconds = str()
+
+ if days > 0:
+ pdays = (green_start + str(days) + color_stop + " day")
+ if days != 1:
+ pdays += "s"
+
+ if hours > 0:
+ phours = (green_start + str(hours) + color_stop + " hour")
+ if hours != 1:
+ phours += "s"
+
+ if minutes > 0:
+ pminutes = (green_start + str(minutes) + color_stop + " minute")
+ if minutes != 1:
+ pminutes += "s"
+
+ pseconds = (green_start + str(seconds) + color_stop + " second")
+ if seconds != 1:
+ pseconds += "s"
+
+ return (pdays + phours + pminutes + pdays)
-try:
- package_name = sys.argv[1]
-except IndexError:
- f.close()
- sys.exit(1)
-
-emerge_number = 0
-times = []
-
-lista = []
-green_start = "\033[1;32m"
-color_stop = "\033[1;m"
-
-def get_time(string, part):
- if part == 1:
- string = string.partition(">>>")
- elif part == 2:
- string = line.partition(":::")
- time = float(string[0].strip().strip(":"))
- return time
-
-def organize_times(time):
- days = time/(3600*24)
- hours = (days - int(days))*24
- minutes = (hours - int(hours))*60
- seconds = (minutes - int(minutes))*60
+ def date(self, emerge_date):
+ date = datetime.datetime.fromtimestamp(emerge_date)
- days = int(round(days))
- hours = int(round(hours))
- minutes = int(round(minutes))
- seconds = int(round(seconds))
-
- if days > 0:
- print_days = (green_start + str(days) + color_stop + " day")
- if days != 1:
- print_days += "s"
- print print_days,
-
- if hours > 0:
- print_hours = (green_start + str(hours) + color_stop + " hour")
- if hours != 1:
- print_hours += "s"
- print print_hours,
+ year = str(date.year)
+ month = str(date.month)
+ day = str(date.day)
+ hour = str(date.hour)
+ minute = str(date.minute)
+ second = str(date.second)
- if minutes > 0:
- print_minutes = (green_start + str(minutes) + color_stop + " minute")
- if minutes != 1:
- print_minutes += "s"
- print print_minutes,
+ date = "{:%d.%m.%Y %H:%M:%S}".format(date)
- printable_sec = (green_start + str(seconds) + color_stop + " second")
- if seconds != 1:
- printable_sec += "s"
- print printable_sec,
+ return date
-def date_printer(package, time1, time2):
- global emerge_time
- date = datetime.date.fromtimestamp(time1)
- emerge_time = time2-time1
- date = (str(date.day) + "/" + str(date.month)
- + "/" + str(date.year))
+def open_log():
+ """Attempt to open the LOGFILE."""
- print("Started emerging " + green_start + package + color_stop +
- " at " + date)
+ try:
+ f = open(LOGFILE, 'r')
+ except IOError as detail:
+ print detail
+ sys.exit(1)
+ finally:
+ return f
- print "merge time",
- organize_times(emerge_time)
- print "\n"
- return date
+def search_log_for_package(user_package):
-def get_package(name):
- global package
- dirlist = os.listdir(PORTDIR)
+ log = open_log()
- for i in dirlist:
- directory = PORTDIR + i
- if os.path.isdir(directory):
- dirs = os.listdir(directory)
- if name in dirs:
- package = i + '/' + name
- return
+ packages.insert(0, package(user_package))
- print("No package '" + name + "' found")
- sys.exit(1)
+ for line in log:
+ if ((">>>" in line) and ("emerge" in line)):
+ if user_package in line:
+ version = line.partition(user_package)[2].partition(' ')[0]
+ digit = version.strip('-')[0].isdigit()
+ if digit:
+ time_string = line.partition(">>>")
+ start_time = float(time_string[0].strip().strip(':'))
-def print_times(times):
- times.sort()
- times.reverse()
+ elif ((":::" in line) and ("completed emerge" in line)):
+ if user_package in line:
+ if digit:
+ time_string = line.partition(":::")
+ stop_time = float(time_string[0].strip().strip(':'))
- print(green_start + package + color_stop + " emerged " + green_start +
- str(emerge_number) + color_stop + " time(s)\n")
+ emerge_time = stop_time - start_time
- if emerge_number == 1:
- print "merge time",
- organize_times(times[0][0])
+ packages[0].add_version(version, emerge_time, start_time)
- else:
- print "Max time:",
- organize_times(times[0][0])
- print "at", times[0][1]
- print "Min time:",
- organize_times(times[len(times)-1][0])
- print "at", times[len(times)-1][1]
- all_times = 0
- for i in times:
- all_times += i[0]
+def print_stuff():
+ for p in packages:
+ p.print_versions()
- print "Average time",
- organize_times(all_times/len(times))
- print
- print "In total spent",
- organize_times(all_times)
- print("emerging " + green_start +
- package + color_stop)
-get_package(package_name)
+def main(status, user_package=None):
-for line in f:
- if package in line:
- if (">>>" in line) and ("emerge" in line):
- st = line.split(' ')
- for string in st:
- if package in string:
- if string[len(package)+1].isdigit():
- full_package = st[st.index(string)]
+ if status == "package":
+ search_log_for_package(user_package)
+ print_stuff()
- time = get_time(line, 1)
- if (":::" in line) and ("completed emerge" in line):
- emerge_number += 1
+ elif status == "current":
+ pass
- time2 = get_time(line, 2)
+ elif status == "pretended":
+ pass
- date = date_printer(full_package, time, time2)
- times.append((emerge_time, date))
- lista.append([date, int(emerge_time)])
-if emerge_number == 0:
- print "No package named", package_name, "found"
- sys.exit(1)
-f.close()
+if __name__ == "__main__":
-print_times(times)
+ if len(sys.argv) == 1:
+ main("current")
+ sys.exit(1)
-g = open('times', 'w')
+ elif sys.argv[1] == "-p":
+ main("pretended")
+ sys.exit(1)
-for i in lista:
- line = str(i[0]) + " " + str(i[1]) + "\n"
- g.write(line)
+ elif len(sys.argv) > 1:
+ main("package", sys.argv[1])
-g.close()