summary refs log blame commit diff stats
path: root/ganarchy/cli/run_targets.py
blob: 5bf48d91bf9309e12d8508effc9d2c6db16b0c69 (plain) (tree)














































































































                                                                                                                                                                                  
# 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 <https://www.gnu.org/licenses/>.

"""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))