about summary refs log tree commit diff
path: root/shadowbox.py
diff options
context:
space:
mode:
Diffstat (limited to 'shadowbox.py')
-rw-r--r--shadowbox.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/shadowbox.py b/shadowbox.py
new file mode 100644
index 0000000..93e08e9
--- /dev/null
+++ b/shadowbox.py
@@ -0,0 +1,61 @@
+from dataclasses import dataclass
+from flask import Flask, render_template
+from pathlib import Path
+import commonmark
+import os
+import subprocess
+
+root = Path(os.environ['HOME'])/'devil'
+app = Flask(__name__)
+
+@app.route('/')
+def list_repos():
+	repos = find_repos().values()
+	return render_template('repo-list.html', title='Shadowbox', repos=repos)
+
+@app.route('/<path:name>')
+def show_repo(name):
+	repo = find_repos()[name]
+
+	cmd = '/usr/bin/git log --oneline'
+	commits = subprocess.run(cmd, cwd=root/name, shell=True, capture_output=True, text=True).stdout.splitlines()
+
+	readme = get_readme(name)
+
+	return render_template('repo.html', title=f'{repo.name} - {repo.description}', repo=repo, commits=commits, readme=readme)
+
+def get_readme(name):
+	path = root/name/'README.md'
+	if path.exists():
+		with(root/name/'README.md').open() as f:
+			content = f.read()
+			ast = commonmark.Parser().parse(content)
+			readme = commonmark.HtmlRenderer().render(ast)
+		return readme
+	else:
+		return None
+
+@dataclass
+class Repo:
+	name: str
+	description: str
+	last_update: str # date
+
+def find_repos() -> dict[Repo]:
+	# iterate through all subdirectories, looking for things that look like git repos
+	cmd = '/usr/bin/find . -type d -execdir /usr/bin/git -C {} rev-parse ";" -printf "%P\n" -prune'
+	repo_folders = subprocess.run(cmd, cwd=root, shell=True, capture_output=True, text=True).stdout.splitlines()
+
+	repos = {}
+	for folder in repo_folders:
+		# description is at ./description for bare repos, ./.git/description for normal repos
+		loc = root/folder/'description' if (root/folder/'description').exists() else root/folder/'.git'/'description'
+		with loc.open() as f:
+			desc = f.readline()
+
+		cmd = '/usr/bin/git show --no-patch --format="%cr"'
+		last = subprocess.run(cmd, cwd=root/folder, shell=True, capture_output=True, text=True).stdout
+
+		repos[folder] = Repo(folder, desc, last)
+	return repos
+