You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.7 KiB
112 lines
2.7 KiB
#!/usr/bin/env python3
|
|
"""dirbuild
|
|
|
|
Usage:
|
|
dirbuild [-v]
|
|
dirbuild [-v] set <command>
|
|
dirbuild [-v] get
|
|
dirbuild [-v] build
|
|
dirbuild [-v] dump
|
|
|
|
Options:
|
|
-h --help Show this screen.
|
|
-v --verbose Show verbose information.
|
|
--version Show version.
|
|
|
|
"""
|
|
import logging
|
|
import os
|
|
import sqlite3
|
|
from sqlite3.dbapi2 import Cursor
|
|
|
|
from docopt import docopt
|
|
from xdg import BaseDirectory
|
|
|
|
logger: logging.Logger
|
|
|
|
|
|
def init_logger():
|
|
"""Initializes the application logger.
|
|
|
|
:returns: logger
|
|
|
|
"""
|
|
global logger
|
|
logger = logging.getLogger()
|
|
handler = logging.StreamHandler()
|
|
formatter = logging.Formatter("%(asctime)s %(name)-12s %(levelname)-8s %(message)s")
|
|
handler.setFormatter(formatter)
|
|
logger.addHandler(handler)
|
|
logger.setLevel(logging.ERROR)
|
|
|
|
|
|
def init_db() -> sqlite3.Connection:
|
|
path = BaseDirectory.save_data_path("dirbuild")
|
|
logging.debug("Using path for data: %s", path)
|
|
db_path = f"{path}/commands.db"
|
|
logging.debug("Using database %s", db_path)
|
|
conn = sqlite3.connect(db_path)
|
|
conn.cursor().execute(
|
|
"""CREATE TABLE IF NOT EXISTS commands (id INTEGER PRIMARY KEY AUTOINCREMENT, dir TEXT, cmd TEXT)"""
|
|
)
|
|
return conn
|
|
|
|
|
|
def set_command(cursor: Cursor, cwd: str, command: str):
|
|
"""Sets a command for the current directory
|
|
|
|
:db: sqlite Cursor
|
|
:cwd: String
|
|
:returns: None
|
|
|
|
"""
|
|
logger.debug("Setting command '%s' for directory %s", command, cwd)
|
|
cursor.execute(
|
|
"INSERT INTO commands (dir, cmd) VALUES (?, ?)",
|
|
(
|
|
cwd,
|
|
command,
|
|
),
|
|
)
|
|
|
|
|
|
def get_command(cursor: Cursor, cwd: str) -> str:
|
|
"""Get the command for the current directory"""
|
|
cmd = cursor.execute(
|
|
"SELECT cmd FROM commands WHERE dir = ? ORDER BY id DESC LIMIT 1", (cwd,)
|
|
).fetchone()
|
|
return cmd[0] if cmd is not None else ""
|
|
|
|
|
|
def dump_db(cursor: Cursor):
|
|
"""Dump all entries of the database"""
|
|
for row in cursor.execute("SELECT id, dir, cmd FROM commands"):
|
|
print(row)
|
|
|
|
|
|
def main():
|
|
""" Main function """
|
|
init_logger()
|
|
arguments = docopt(__doc__, version="dirbuild v0.1.0")
|
|
if arguments["--verbose"]:
|
|
logger.setLevel(logging.DEBUG)
|
|
logger.debug("arguments: %s", arguments)
|
|
db = init_db()
|
|
if arguments["set"]:
|
|
set_command(db.cursor(), os.getcwd(), arguments["<command>"])
|
|
print("Saved command successfully")
|
|
elif arguments["get"]:
|
|
print(get_command(db.cursor(), os.getcwd()))
|
|
elif arguments["dump"]:
|
|
dump_db(db.cursor())
|
|
else:
|
|
cmd = get_command(db.cursor(), str(os.getcwd()))
|
|
logger.debug("Executing '%s'", cmd)
|
|
os.system(cmd)
|
|
|
|
db.commit()
|
|
db.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|