mirror of
				https://github.com/ItsDrike/dotfiles.git
				synced 2025-11-04 09:16:36 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			119 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/env python3
 | 
						|
 | 
						|
import sys
 | 
						|
import subprocess
 | 
						|
from datetime import datetime
 | 
						|
from dataclasses import dataclass
 | 
						|
 | 
						|
 | 
						|
@dataclass
 | 
						|
class CompiledPackage:
 | 
						|
    name: str
 | 
						|
    date: datetime
 | 
						|
    compile_time: int
 | 
						|
 | 
						|
    def __repr__(self) -> str:
 | 
						|
        name = self.name
 | 
						|
        date = self.date.strftime("%a %b %d %H:%M:%S %Y")
 | 
						|
        compile_time = get_readable_duration(self.compile_time)
 | 
						|
        return f"CompiledPackage({name=}, {date=}, {compile_time=})"
 | 
						|
 | 
						|
 | 
						|
def parse_time(time_line: str) -> int:
 | 
						|
    """Parse a line that contains time info, return seconds"""
 | 
						|
    time = 0
 | 
						|
    words = time_line.split()
 | 
						|
 | 
						|
    if "hour" in words[1]:
 | 
						|
        time += int(words[0]) * 60 * 60
 | 
						|
    elif "minute" in words[1]:
 | 
						|
        time += int(words[0]) * 60
 | 
						|
    elif "second" in words[1]:
 | 
						|
        time += int(words[0])
 | 
						|
 | 
						|
    try:
 | 
						|
        if "second" in words[3]:
 | 
						|
            time += int(words[2])
 | 
						|
        elif "minute" in words[3]:
 | 
						|
            time += int(words[2]) * 60
 | 
						|
    except IndexError:
 | 
						|
        pass
 | 
						|
 | 
						|
    return time
 | 
						|
 | 
						|
 | 
						|
def get_readable_duration(total_seconds: int) -> str:
 | 
						|
    """Get readable time duration string from total seconds"""
 | 
						|
    hours, rem = divmod(total_seconds, 3600)
 | 
						|
    minutes, rem = divmod(rem, 60)
 | 
						|
    seconds = rem
 | 
						|
 | 
						|
    output = []
 | 
						|
    if hours > 0:
 | 
						|
        output.append(f"{hours} hour{'s' if hours > 1 else ''}")
 | 
						|
    if minutes > 0:
 | 
						|
        output.append(f"{minutes} minute{'s' if minutes > 1 else ''}")
 | 
						|
    if seconds > 0:
 | 
						|
        output.append(f"{seconds} second{'s' if seconds > 1 else ''}")
 | 
						|
 | 
						|
    if len(output) > 1:
 | 
						|
        output.insert(-1, "and")
 | 
						|
 | 
						|
    return " ".join(output)
 | 
						|
 | 
						|
 | 
						|
def get_packages() -> list[CompiledPackage]:
 | 
						|
    """Obtain compilation times for every compiled package"""
 | 
						|
    x = subprocess.run(
 | 
						|
        "sudo genlop -nlt",
 | 
						|
        stdout=subprocess.PIPE,
 | 
						|
        shell=True
 | 
						|
    )
 | 
						|
    txt = x.stdout.decode("utf-8")
 | 
						|
 | 
						|
    # Cleanup the output
 | 
						|
    txt = txt.replace("* packages merged:\n\n", "")
 | 
						|
    txt = txt.replace("merge time: ", "")
 | 
						|
    txt = txt.replace("and ", "")
 | 
						|
    txt = txt.replace(".", "")
 | 
						|
 | 
						|
    # Remove indents
 | 
						|
    clean_lines = [line.lstrip() for line in txt.split("\n")]
 | 
						|
    txt = "\n".join(clean_lines)
 | 
						|
 | 
						|
    # Store (package name, date, compile time) for each package
 | 
						|
    packages = []
 | 
						|
    for pkg_txt in txt.split("\n\n"):
 | 
						|
        if len(pkg_txt) == 0:
 | 
						|
            continue
 | 
						|
 | 
						|
        pkg_lines = pkg_txt.split("\n")
 | 
						|
 | 
						|
        date, name = pkg_lines[0].split(" >>> ")
 | 
						|
        time = parse_time(pkg_lines[1])
 | 
						|
        date = datetime.strptime(date, "%a %b %d %H:%M:%S %Y")
 | 
						|
 | 
						|
        pkg = CompiledPackage(name, date, time)
 | 
						|
        packages.append(pkg)
 | 
						|
 | 
						|
    return packages
 | 
						|
 | 
						|
 | 
						|
def get_compile_time(package_amount: int) -> int:
 | 
						|
    """Get compilation time of last n specified packages (seconds)"""
 | 
						|
    packages = get_packages()
 | 
						|
    last_packages = packages[-package_amount:]
 | 
						|
    return sum(package.compile_time for package in last_packages)
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    try:
 | 
						|
        package_amt = int(sys.argv[1])
 | 
						|
    except IndexError:
 | 
						|
        print("Missing required argument: package amount")
 | 
						|
    except TypeError:
 | 
						|
        print("Argument must be a number (package amount)")
 | 
						|
    else:
 | 
						|
        time = get_compile_time(package_amt)
 | 
						|
        print(get_readable_duration(time))
 | 
						|
 |