~edwargix/git.sr.ht

a9d6125f0b28d445cdb7e3006e849d22c82e3424 — Drew DeVault 6 years ago 66c833f
Remove cgit support
9 files changed, 31 insertions(+), 1048 deletions(-)

M config.example.ini
M gitsrht/access.py
M gitsrht/app.py
M gitsrht/blueprints/api.py
M gitsrht/blueprints/public.py
A gitsrht/blueprints/repo.py
D gitsrht/templates/cgit.html
D scss/cgit.scss
M scss/main.scss
M config.example.ini => config.example.ini +0 -5
@@ 60,11 60,6 @@ oauth-client-secret=CHANGEME
# Path to git repositories on disk
repos=/var/lib/git/

[git.sr.ht::cgit]
#
# URL where cgit is being served (we proxy to it)
remote=http://cgit.local

[git.sr.ht::dispatch]
#
# The authorized keys hook uses this to dispatch to various handlers

M gitsrht/access.py => gitsrht/access.py +13 -0
@@ 12,6 12,19 @@ class UserAccess(IntFlag):
    write = 2
    manage = 4

def check_repo(user, repo, authorized=current_user):
    u = User.query.filter(User.username == user).first()
    if not u:
        abort(404)
    _repo = Repository.query.filter(Repository.owner_id == u.id)\
            .filter(Repository.name == repo).first()
    if not _repo:
        abort(404)
    if _repo.visibility == RepoVisibility.private:
        if not authorized or authorized.id != _repo.owner_id:
            abort(404)
    return u, _repo

def get_repo(owner_name, repo_name):
    if owner_name[0] == "~":
        user = User.query.filter(User.username == owner_name[1:]).first()

M gitsrht/app.py => gitsrht/app.py +2 -0
@@ 17,10 17,12 @@ class GitApp(SrhtFlask):

        from gitsrht.blueprints.api import api
        from gitsrht.blueprints.public import public
        from gitsrht.blueprints.repo import repo
        from gitsrht.blueprints.manage import manage

        self.register_blueprint(api)
        self.register_blueprint(public)
        self.register_blueprint(repo)
        self.register_blueprint(manage)

        meta_client_id = cfg("git.sr.ht", "oauth-client-id")

M gitsrht/blueprints/api.py => gitsrht/blueprints/api.py +1 -2
@@ 1,7 1,6 @@
from flask import Blueprint, request, redirect, abort, url_for
from gitsrht.types import Repository, RepoVisibility, User, Webhook, Redirect
from gitsrht.access import UserAccess, has_access, get_repo
from gitsrht.blueprints.public import check_repo
from gitsrht.access import UserAccess, has_access, get_repo, check_repo
from gitsrht.repos import create_repo
from srht.validation import Validation, valid_url
from srht.oauth import oauth

M gitsrht/blueprints/public.py => gitsrht/blueprints/public.py +4 -79
@@ 1,16 1,14 @@
from flask import Blueprint, Response, request, redirect, url_for
from flask import render_template, abort, stream_with_context
from flask import Blueprint, request
from flask import render_template, abort
from flask_login import current_user
import requests
from srht.config import cfg
from srht.flask import paginate_query
from gitsrht.types import User, Repository, RepoVisibility, Redirect
from gitsrht.access import UserAccess, has_access, get_repo
from gitsrht.types import User, Repository, RepoVisibility
from sqlalchemy import or_

public = Blueprint('cgit', __name__)
public = Blueprint('public', __name__)

upstream = cfg("git.sr.ht::cgit", "remote")
meta_uri = cfg("meta.sr.ht", "origin")

@public.route("/")


@@ 25,79 23,6 @@ def index():
        repos = None
    return render_template("index.html", repos=repos)

def check_repo(user, repo, authorized=current_user):
    u = User.query.filter(User.username == user).first()
    if not u:
        abort(404)
    _repo = Repository.query.filter(Repository.owner_id == u.id)\
            .filter(Repository.name == repo).first()
    if not _repo:
        abort(404)
    if _repo.visibility == RepoVisibility.private:
        if not authorized or authorized.id != _repo.owner_id:
            abort(404)
    return u, _repo

@public.route("/<owner_name>/<repo_name>")
@public.route("/<owner_name>/<repo_name>/")
@public.route("/<owner_name>/<repo_name>/<path:cgit_path>")
def cgit_passthrough(owner_name, repo_name, cgit_path=""):
    owner, repo = get_repo(owner_name, repo_name)
    if isinstance(repo, Redirect):
        return redirect(url_for(".cgit_passthrough",
            owner_name=owner_name, repo_name=repo.new_repo.name,
            cgit_path=cgit_path))
    if not has_access(repo, UserAccess.read):
        abort(404)
    r = requests.get("{}/{}".format(upstream, request.full_path))
    if r.status_code != 200:
        abort(r.status_code)
    base = (cfg("git.sr.ht", "origin")
        .replace("http://", "")
        .replace("https://", ""))
    clone_urls = ["https://{}/{}/{}", "git@{}:{}/{}"]
    our_clone_text = """
    <tr>
        <td colspan='2'><a rel="vcs-git" href="{}">{}</a></td>
        <td>(read-only)</td>
    </tr>
    <tr>
        <td colspan="2" style="color: black">{}</td>
        <td>(read/write)</td>
    </tr>
    """.format(
        clone_urls[0].format(base, owner_name, repo_name),
        clone_urls[0].format(base, owner_name, repo_name),
        clone_urls[1].format(base, owner_name, repo_name))
    their_clone_text = "<tr><td colspan='3'>" +\
        "<a rel='vcs-git' href='__CLONE_URL__' title='{}/{} Git repository'>__CLONE_URL__</a>".format(
                owner_name, repo_name) + "</td></tr>"
    if not their_clone_text in r.text:
        their_clone_text = their_clone_text.replace(" colspan='3'", "")
    text = r.text.replace(their_clone_text, our_clone_text)
    if "Repository seems to be empty" in r.text:
        text = text.replace("<th class='left'>Clone</th>", "<th class='left'>Push</th>")
    return render_template("cgit.html",
            cgit_html=text, owner=owner, repo=repo,
            has_access=has_access, UserAccess=UserAccess)

@public.route("/<owner_name>/<repo_name>/<op>")
@public.route("/<owner_name>/<repo_name>/<op>/")
@public.route("/<owner_name>/<repo_name>/<op>/<path:path>")
def cgit_plain(owner_name, repo_name, op, path=None):
    if not op in ["patch", "plain", "snapshot"]:
        return cgit_passthrough(owner_name, repo_name,
                op + ("/" + path if path else ""))
    owner, repo = get_repo(owner_name, repo_name)
    if isinstance(repo, Redirect):
        return redirect(url_for(".cgit_plain",
            owner_name=owner_name, repo_name=repo.new_repo.name,
            op=op, path=path))
    if not has_access(repo, UserAccess.read):
        abort(404)
    r = requests.get("{}/{}".format(upstream, request.full_path), stream=True)
    return Response(stream_with_context(r.iter_content()), content_type=r.headers['content-type'])

@public.route("/~<username>")
@public.route("/~<username>/")
def user_index(username):

A gitsrht/blueprints/repo.py => gitsrht/blueprints/repo.py +11 -0
@@ 0,0 1,11 @@
from flask import Blueprint
from flask_login import current_user
from gitsrht.types import User, Repository

repo = Blueprint('repo', __name__)

# TODO: !! SECURITY !!

@repo.route("/<owner>/<name>")
def summary(owner, name):
    return "hi!"

D gitsrht/templates/cgit.html => gitsrht/templates/cgit.html +0 -23
@@ 1,23 0,0 @@
{% extends "git.html" %}
{% block body %}
<div class="container">
  <div class="row">
    <div class="col-md-12">
      <h2>
        <a href="/{{ owner.canonical_name }}">{{ owner.canonical_name }}</a>/{{ repo.name }}
        <small class="text-muted">
        {% if repo.visibility.value != "public" %}
          {{ repo.visibility.value }}
        {% endif %}
        </small>
        <small class="repo-nav">
        {% if has_access(repo, UserAccess.manage) %}
          <a href="/{{ owner.canonical_name }}/{{ repo.name }}/settings/info">Settings</a>
        {% endif %}
        </small>
      </h2>
    </div>
  </div>
</div>
{{ cgit_html | safe }}
{% endblock %}

D scss/cgit.scss => scss/cgit.scss +0 -854
@@ 1,854 0,0 @@
div#cgit {
	padding: 0em;
	margin: 0em;
	font-family: sans-serif;
	font-size: 10pt;
	color: #333;
	background: white;
	padding: 4px;
}

div#cgit a {
	color: blue;
	text-decoration: none;
}

div#cgit a:hover {
	text-decoration: underline;
}

div#cgit table {
	border-collapse: collapse;
}

div#cgit table#header {
	width: 100%;
	margin-bottom: 1em;
}

div#cgit table#header td.logo {
	width: 96px;
	vertical-align: top;
}

div#cgit table#header td.main {
	font-size: 250%;
	padding-left: 10px;
	white-space: nowrap;
}

div#cgit table#header td.main a {
	color: #000;
}

div#cgit table#header td.form {
	text-align: right;
	vertical-align: bottom;
	padding-right: 1em;
	padding-bottom: 2px;
	white-space: nowrap;
}

div#cgit table#header td.form form,
div#cgit table#header td.form input,
div#cgit table#header td.form select {
	font-size: 90%;
}

div#cgit table#header td.sub {
	color: #777;
	border-top: solid 1px #ccc;
	padding-left: 10px;
}

div#cgit table.tabs {
	border-bottom: solid 3px #ccc;
	border-collapse: collapse;
	margin-top: 2em;
	margin-bottom: 0px;
	width: 100%;
}

div#cgit table.tabs td {
	padding: 0px 1em;
	vertical-align: bottom;
}

div#cgit table.tabs td a {
	padding: 2px 0.75em;
	color: #777;
	font-size: 110%;
}

div#cgit table.tabs td a.active {
	color: #000;
	background-color: #ccc;
}

div#cgit table.tabs a[href^="http://"]:after, div#cgit table.tabs a[href^="https://"]:after {
	content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfgAhcJDQY+gm2TAAAAHWlUWHRDb21tZW50AAAAAABDcmVhdGVkIHdpdGggR0lNUGQuZQcAAABbSURBVAhbY2BABs4MU4CwhYHBh2Erww4wrGFQZHjI8B8IgUIscJWyDHcggltQhI4zGDCcRwhChPggHIggP1QoAVmQkSETrGoHsiAEsACtBYN0oDAMbgU6EBcAAL2eHUt4XUU4AAAAAElFTkSuQmCC);
	opacity: 0.5;
	margin: 0 0 0 5px;
}

div#cgit table.tabs td.form {
	text-align: right;
}

div#cgit table.tabs td.form form {
	padding-bottom: 2px;
	font-size: 90%;
	white-space: nowrap;
}

div#cgit table.tabs td.form input,
div#cgit table.tabs td.form select {
	font-size: 90%;
}

div#cgit div.path {
	margin: 0px;
	padding: 5px 2em 2px 2em;
	color: #000;
	background-color: #eee;
}

div#cgit div.content {
	margin: 0px;
	padding: 2em;
	border-bottom: solid 3px #ccc;
}


div#cgit table.list {
	width: 100%;
	border: none;
	border-collapse: collapse;
}

div#cgit table.list tr {
	background: white;
}

div#cgit table.list tr.logheader {
	background: #eee;
}

div#cgit table.list tr:nth-child(even) {
	background: #f7f7f7;
}

div#cgit table.list tr:nth-child(odd) {
	background: white;
}

div#cgit table.list tr:hover {
	background: #eee;
}

div#cgit table.list tr.nohover {
	background: white;
}

div#cgit table.list tr.nohover:hover {
	background: white;
}

div#cgit table.list tr.nohover-highlight:hover:nth-child(even) {
	background: #f7f7f7;
}

div#cgit table.list tr.nohover-highlight:hover:nth-child(odd) {
	background: white;
}

div#cgit table.list th {
	font-weight: bold;
	/* color: #888;
	border-top: dashed 1px #888;
	border-bottom: dashed 1px #888;
	*/
	padding: 0.1em 0.5em 0.05em 0.5em;
	vertical-align: baseline;
}

div#cgit table.list td {
	border: none;
	padding: 0.1em 0.5em 0.1em 0.5em;
}

div#cgit table.list td.commitgraph {
	font-family: monospace;
	white-space: pre;
}

div#cgit table.list td.commitgraph .column1 {
	color: #a00;
}

div#cgit table.list td.commitgraph .column2 {
	color: #0a0;
}

div#cgit table.list td.commitgraph .column3 {
	color: #aa0;
}

div#cgit table.list td.commitgraph .column4 {
	color: #00a;
}

div#cgit table.list td.commitgraph .column5 {
	color: #a0a;
}

div#cgit table.list td.commitgraph .column6 {
	color: #0aa;
}

div#cgit table.list td.logsubject {
	font-family: monospace;
	font-weight: bold;
}

div#cgit table.list td.logmsg {
	font-family: monospace;
	white-space: pre;
	padding: 0 0.5em;
}

div#cgit table.list td a {
	color: black;
}

div#cgit table.list td a.ls-dir {
	font-weight: bold;
	color: #00f;
}

div#cgit table.list td a:hover {
	color: #00f;
}

div#cgit img {
	border: none;
}

div#cgit input#switch-btn {
	margin: 2px 0px 0px 0px;
}

div#cgit td#sidebar input.txt {
	width: 100%;
	margin: 2px 0px 0px 0px;
}

div#cgit table#grid {
	margin: 0px;
}

div#cgit td#content {
	vertical-align: top;
	padding: 1em 2em 1em 1em;
	border: none;
}

div#cgit div#summary {
	vertical-align: top;
	margin-bottom: 1em;
}

div#cgit table#downloads {
	float: right;
	border-collapse: collapse;
	border: solid 1px #777;
	margin-left: 0.5em;
	margin-bottom: 0.5em;
}

div#cgit table#downloads th {
	background-color: #ccc;
}

div#cgit div#blob {
	border: solid 1px black;
}

div#cgit div.error {
	color: red;
	font-weight: bold;
	margin: 1em 2em;
}

div#cgit a.ls-blob, div#cgit a.ls-dir, div#cgit .ls-mod {
	font-family: monospace;
}

div#cgit td.ls-size {
	text-align: right;
	font-family: monospace;
	width: 10em;
}

div#cgit td.ls-mode {
	font-family: monospace;
	width: 10em;
}

div#cgit table.blob {
	margin-top: 0.5em;
	border-top: solid 1px black;
}

div#cgit table.blob td.lines {
	margin: 0; padding: 0 0 0 0.5em;
	vertical-align: top;
	color: black;
}

div#cgit table.blob td.linenumbers {
	margin: 0; padding: 0 0.5em 0 0.5em;
	vertical-align: top;
	text-align: right;
	border-right: 1px solid gray;
}

div#cgit table.blob pre {
	padding: 0; margin: 0;
}

div#cgit table.blob td.linenumbers a,
div#cgit table.ssdiff td.lineno a {
	color: gray;
	text-align: right;
	text-decoration: none;
}

div#cgit table.blob td.linenumbers a:hover,
div#cgit table.ssdiff td.lineno a:hover {
	color: black;
}

div#cgit table.bin-blob {
	margin-top: 0.5em;
	border: solid 1px black;
}

div#cgit table.bin-blob th {
	font-family: monospace;
	white-space: pre;
	border: solid 1px #777;
	padding: 0.5em 1em;
}

div#cgit table.bin-blob td {
	font-family: monospace;
	white-space: pre;
	border-left: solid 1px #777;
	padding: 0em 1em;
}

div#cgit table.nowrap td {
	white-space: nowrap;
}

div#cgit table.commit-info {
	border-collapse: collapse;
	margin-top: 1.5em;
}

div#cgit div.cgit-panel {
	float: right;
	margin-top: 1.5em;
}

div#cgit div.cgit-panel table {
	border-collapse: collapse;
	border: solid 1px #aaa;
	background-color: #eee;
}

div#cgit div.cgit-panel th {
	text-align: center;
}

div#cgit div.cgit-panel td {
	padding: 0.25em 0.5em;
}

div#cgit div.cgit-panel td.label {
	padding-right: 0.5em;
}

div#cgit div.cgit-panel td.ctrl {
	padding-left: 0.5em;
}

div#cgit table.commit-info th {
	text-align: left;
	font-weight: normal;
	padding: 0.1em 1em 0.1em 0.1em;
	vertical-align: top;
}

div#cgit table.commit-info td {
	font-weight: normal;
	padding: 0.1em 1em 0.1em 0.1em;
}

div#cgit div.commit-subject {
	font-weight: bold;
	font-size: 125%;
	margin: 1.5em 0em 0.5em 0em;
	padding: 0em;
}

div#cgit div.commit-msg {
	white-space: pre;
	font-family: monospace;
}

div#cgit div.notes-header {
	font-weight: bold;
	padding-top: 1.5em;
}

div#cgit div.notes {
	white-space: pre;
	font-family: monospace;
	border: solid 1px #ee9;
	background-color: #ffd;
	padding: 0.3em 2em 0.3em 1em;
	float: left;
}

div#cgit div.notes-footer {
	clear: left;
}

div#cgit div.diffstat-header {
	font-weight: bold;
	padding-top: 1.5em;
}

div#cgit table.diffstat {
	border-collapse: collapse;
	border: solid 1px #aaa;
	background-color: #eee;
}

div#cgit table.diffstat th {
	font-weight: normal;
	text-align: left;
	text-decoration: underline;
	padding: 0.1em 1em 0.1em 0.1em;
	font-size: 100%;
}

div#cgit table.diffstat td {
	padding: 0.2em 0.2em 0.1em 0.1em;
	font-size: 100%;
	border: none;
}

div#cgit table.diffstat td.mode {
	white-space: nowrap;
}

div#cgit table.diffstat td span.modechange {
	padding-left: 1em;
	color: red;
}

div#cgit table.diffstat td.add a {
	color: green;
}

div#cgit table.diffstat td.del a {
	color: red;
}

div#cgit table.diffstat td.upd a {
	color: blue;
}

div#cgit table.diffstat td.graph {
	width: 500px;
	vertical-align: middle;
}

div#cgit table.diffstat td.graph table {
	border: none;
}

div#cgit table.diffstat td.graph td {
	padding: 0px;
	border: 0px;
	height: 7pt;
}

div#cgit table.diffstat td.graph td.add {
	background-color: #5c5;
}

div#cgit table.diffstat td.graph td.rem {
	background-color: #c55;
}

div#cgit div.diffstat-summary {
	color: #888;
	padding-top: 0.5em;
}

div#cgit table.diff {
	width: 100%;
}

div#cgit table.diff td {
	font-family: monospace;
	white-space: pre;
}

div#cgit table.diff td div.head {
	font-weight: bold;
	margin-top: 1em;
	color: black;
}

div#cgit table.diff td div.hunk {
	color: #009;
}

div#cgit table.diff td div.add {
	color: green;
}

div#cgit table.diff td div.del {
	color: red;
}

div#cgit .sha1 {
	font-family: monospace;
	font-size: 90%;
}

div#cgit .left {
	text-align: left;
}

div#cgit .right {
	text-align: right;
}

div#cgit table.list td.reposection {
	font-style: italic;
	color: #888;
}

div#cgit a.button {
	font-size: 80%;
	padding: 0em 0.5em;
}

div#cgit a.primary {
	font-size: 100%;
}

div#cgit a.secondary {
	font-size: 90%;
}

div#cgit td.toplevel-repo {

}

div#cgit table.list td.sublevel-repo {
	padding-left: 1.5em;
}

div#cgit ul.pager {
	list-style-type: none;
	text-align: center;
	margin: 1em 0em 0em 0em;
	padding: 0;
}

div#cgit ul.pager li {
	display: inline-block;
	margin: 0.25em 0.5em;
}

div#cgit ul.pager a {
	color: #777;
}

div#cgit ul.pager .current {
	font-weight: bold;
}

div#cgit span.age-mins {
	font-weight: bold;
	color: #080;
}

div#cgit span.age-hours {
	color: #080;
}

div#cgit span.age-days {
	color: #040;
}

div#cgit span.age-weeks {
	color: #444;
}

div#cgit span.age-months {
	color: #888;
}

div#cgit span.age-years {
	color: #bbb;
}

div#cgit span.insertions {
	color: #080;
}

div#cgit span.deletions {
	color: #800;
}

div#cgit div.footer {
	margin-top: 0.5em;
	text-align: center;
	font-size: 80%;
	color: #ccc;
}

div#cgit div.footer a {
	color: #ccc;
	text-decoration: none;
}

div#cgit div.footer a:hover {
	text-decoration: underline;
}

div#cgit a.branch-deco {
	color: #000;
	margin: 0px 0.5em;
	padding: 0px 0.25em;
	background-color: #88ff88;
	border: solid 1px #007700;
}

div#cgit a.tag-deco,
div#cgit a.tag-annotated-deco {
	color: #000;
	margin: 0px 0.5em;
	padding: 0px 0.25em;
	background-color: #ffff88;
	border: solid 1px #777700;
}

div#cgit a.remote-deco {
	color: #000;
	margin: 0px 0.5em;
	padding: 0px 0.25em;
	background-color: #ccccff;
	border: solid 1px #000077;
}

div#cgit a.deco {
	color: #000;
	margin: 0px 0.5em;
	padding: 0px 0.25em;
	background-color: #ff8888;
	border: solid 1px #770000;
}

div#cgit div.commit-subject a.branch-deco,
div#cgit div.commit-subject a.tag-deco,
div#cgit div.commit-subject a.tag-annotated-deco,
div#cgit div.commit-subject a.remote-deco,
div#cgit div.commit-subject a.deco {
	margin-left: 1em;
	font-size: 75%;
}

div#cgit table.stats {
	border: solid 1px black;
	border-collapse: collapse;
}

div#cgit table.stats th {
	text-align: left;
	padding: 1px 0.5em;
	background-color: #eee;
	border: solid 1px black;
}

div#cgit table.stats td {
	text-align: right;
	padding: 1px 0.5em;
	border: solid 1px black;
}

div#cgit table.stats td.total {
	font-weight: bold;
	text-align: left;
}

div#cgit table.stats td.sum {
	color: #c00;
	font-weight: bold;
/*	background-color: #eee; */
}

div#cgit table.stats td.left {
	text-align: left;
}

div#cgit table.vgraph {
	border-collapse: separate;
	border: solid 1px black;
	height: 200px;
}

div#cgit table.vgraph th {
	background-color: #eee;
	font-weight: bold;
	border: solid 1px white;
	padding: 1px 0.5em;
}

div#cgit table.vgraph td {
	vertical-align: bottom;
	padding: 0px 10px;
}

div#cgit table.vgraph div.bar {
	background-color: #eee;
}

div#cgit table.hgraph {
	border: solid 1px black;
	width: 800px;
}

div#cgit table.hgraph th {
	background-color: #eee;
	font-weight: bold;
	border: solid 1px black;
	padding: 1px 0.5em;
}

div#cgit table.hgraph td {
	vertical-align: middle;
	padding: 2px 2px;
}

div#cgit table.hgraph div.bar {
	background-color: #eee;
	height: 1em;
}

div#cgit table.ssdiff {
	width: 100%;
}

div#cgit table.ssdiff td {
	font-size: 75%;
	font-family: monospace;
	white-space: pre;
	padding: 1px 4px 1px 4px;
	border-left: solid 1px #aaa;
	border-right: solid 1px #aaa;
}

div#cgit table.ssdiff td.add {
	color: black;
	background: #cfc;
	min-width: 50%;
}

div#cgit table.ssdiff td.add_dark {
	color: black;
	background: #aca;
	min-width: 50%;
}

div#cgit table.ssdiff span.add {
	background: #cfc;
	font-weight: bold;
}

div#cgit table.ssdiff td.del {
	color: black;
	background: #fcc;
	min-width: 50%;
}

div#cgit table.ssdiff td.del_dark {
	color: black;
	background: #caa;
	min-width: 50%;
}

div#cgit table.ssdiff span.del {
	background: #fcc;
	font-weight: bold;
}

div#cgit table.ssdiff td.changed {
	color: black;
	background: #ffc;
	min-width: 50%;
}

div#cgit table.ssdiff td.changed_dark {
	color: black;
	background: #cca;
	min-width: 50%;
}

div#cgit table.ssdiff td.lineno {
	color: black;
	background: #eee;
	text-align: right;
	width: 3em;
	min-width: 3em;
}

div#cgit table.ssdiff td.hunk {
	color: black;
	background: #ccf;
	border-top: solid 1px #aaa;
	border-bottom: solid 1px #aaa;
}

div#cgit table.ssdiff td.head {
	border-top: solid 1px #aaa;
	border-bottom: solid 1px #aaa;
}

div#cgit table.ssdiff td.head div.head {
	font-weight: bold;
	color: black;
}

div#cgit table.ssdiff td.foot {
	border-top: solid 1px #aaa;
	border-left: none;
	border-right: none;
	border-bottom: none;
}

div#cgit table.ssdiff td.space {
	border: none;
}

div#cgit table.ssdiff td.space div {
	min-height: 3em;
}

M scss/main.scss => scss/main.scss +0 -85
@@ 1,5 1,4 @@
@import "base";
@import "cgit";

.filter-repos {
  .btn {


@@ 10,87 9,3 @@
.repo-nav {
  margin-left: 1rem;
}

div#cgit {
  padding: 0;
  font-size: inherit;

  table.tabs {
    margin-top: 0;
    border-bottom: 3px solid #ddd;

    td a {
      margin: 0 0.2rem;
      padding: 0 1rem 3px 1rem;
      font-size: inherit;
      border-width: 1px 1px 0px 1px;
      border-color: transparent;
      border-style: solid;
      text-decoration: none;

      &.active {
        background-color: #ddd;
      }

      &:hover, &.active {
        border-color: #ddd;
      }
    }

    input[type="text"] {
      border-width: 1px;
      border-style: solid;
      width: 8rem;
      padding: 0 0;
    }
  }

  pre {
    background: transparent;
    font-size: inherit !important;
  }

  div.path {
    background-color: #ddd;
    padding-top: 0;
    
    a {
      padding: 0 0.25rem;

      &:first-child {
        padding-left: 0;
      }

      &:last-child {
        padding-right: 0;
      }
    }
  }

  div.error {
    margin-left: 0;
  }

  table.list {
    th:first-child, td:first-child {
      padding-left: 0;
    }
  }

  // Recolor links
  a, table.list td a.ls-dir {
    color: $link-color;
    text-decoration: $link-decoration;

    &:hover {
      color: $link-hover-color;
      text-decoration: $link-hover-decoration;
    }
  }

  .highlight {
    .s, .s1, .s2, .si, .se {
      background: transparent;
    }
  }
}