# This file is part of GAnarchy - decentralized project hub # Copyright (C) 2020 Soni L. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """This module contains the CLI Run Targets. """ import click from ganarchy import cli from ganarchy.templating import environment #@cli.main.command() #@click.argument('out', required=True) #def run(out): # """Runs ganarchy standalone. # # This will run ganarchy so it regularly updates the output directory given by OUT. # Additionally, it'll also search for the following hooks in its config dirs: # # - post_object_update_hook - executed after an object is updated. # # - post_update_cycle_hook - executed after all objects in an update cycle are updated.""" # pass @ganarchy.command() @click.option('--update/--no-update', default=True) @click.argument('project', required=False) def cron_target(update, project): """Runs ganarchy as a cron target. "Deprecated". Useful if you want full control over how GAnarchy generates the pages. """ #conf = None ## reverse order is intentional #for d in reversed(config_dirs): # try: # conf = Config(open(d + "/config.toml", 'r', encoding='utf-8', newline=''), conf) # except (OSError, UnicodeDecodeError, qtoml.decoder.TOMLDecodeError): # pass #with open(config_home + "/config.toml", 'r', encoding='utf-8', newline='') as f: # conf = Config(f, conf) env = get_env() if project == "config": # render the config # doesn't have access to a GAnarchy object. this is deliberate. template = env.get_template('index.toml') click.echo(template.render(config = conf)) return if project == "project-list": # could be done with a template but eh w/e, this is probably better for project in conf.projects.keys(): click.echo(project) return # make sure the cache dir exists os.makedirs(cache_home, exist_ok=True) # make sure it is a git repo subprocess.call(["git", "-C", cache_home, "init", "-q"]) conn = sqlite3.connect(data_home + "/ganarchy.db") instance = GAnarchy(conn, conf, list_projects=project in ["index", "config"]) if project == "index": # render the index template = env.get_template('index.html') click.echo(template.render(ganarchy = instance)) return if not instance.base_url or not project: click.echo("No base URL or project commit specified", err=True) return entries = [] generate_html = [] c = conn.cursor() p = Project(conn, project, list_repos=True) results = p.update(update) for (repo, count) in results: if count is not None: entries.append((repo.url, count, repo.hash, repo.branch, project)) generate_html.append((repo.url, repo.message, count, repo.branch)) # sort stuff twice because reasons entries.sort(key=lambda x: x[1], reverse=True) generate_html.sort(key=lambda x: x[2], reverse=True) if update: c.executemany('''INSERT INTO "repo_history" ("url", "count", "head_commit", "branch", "project") VALUES (?, ?, ?, ?, ?)''', entries) conn.commit() html_entries = [] for (url, msg, count, branch) in generate_html: history = c.execute('''SELECT "count" FROM "repo_history" WHERE "url" = ? AND "branch" IS ? AND "project" IS ? ORDER BY "entry" ASC''', (url, branch, project)).fetchall() # TODO process history into SVG html_entries.append((url, msg, "", branch)) template = env.get_template('project.html') click.echo(template.render(project_title = p.title, project_desc = p.description, project_body = p.commit_body, project_commit = p.commit, repos = html_entries, base_url = instance.base_url, # I don't think this thing supports deprecating the above? project = p, ganarchy = instance))