aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/gistatic917
-rw-r--r--src/gistatic.go79
-rw-r--r--src/main.go7
3 files changed, 86 insertions, 917 deletions
diff --git a/src/gistatic b/src/gistatic
deleted file mode 100755
index a7ad6fe..0000000
--- a/src/gistatic
+++ /dev/null
@@ -1,917 +0,0 @@
-#!/bin/sh
-set -eu
-
-
-usage() {
- cat <<-'EOF'
- Usage:
- gistatic -i -o DIRECTORY REPOSITORY...
- gistatic -o DIRECTORY -u CLONE_URL [-b MAIN_BRANCH] REPOSITORY'
- EOF
-}
-
-
-LANGNAME="$(printf '%s' "${LANG:-en}" | cut -d_ -f1)"
-LANGNAME='en'
-
-MSG_MISSING_CLIARG='Missing %s'
-MSG_INCOMPATIBLE_OPTIONS='Incompatible options: '
-MSG_MISSING_ARGS='REPOSITORY'
-MSG_INDEX_DESCRIPTION='Index of repositories'
-MSG_TITLE_INDEX='Repositories'
-MSG_LOGO_ALT_INDEX='Logo image of the repository list'
-MSG_LOGO_ALT_REPOSITORY='Logo image of the repository'
-MSG_NAME='Name'
-MSG_DESCRIPTION='Description'
-MSG_LAST_COMMIT='Last commit'
-MSG_COMMIT_FEED='commit feed'
-MSG_TAGS_FEED='tags feed'
-MSG_NAV_FILES='files'
-MSG_NAV_LOG='log'
-MSG_NAV_REFS='refs'
-MSG_THEAD_BRANCH='Branch'
-MSG_THEAD_COMMITMSG='Commit message'
-MSG_THEAD_AUTHOR='Author'
-MSG_THEAD_DATE='Date'
-MSG_THEAD_TAG='Tag'
-MSG_TITLE_REFS='refs'
-MSG_GENERATING_LOG='Generating %s...'
-
-# HTML escaped messages
-MSG_ESCAPED_FOOTER_TEMPLATE='Generated with <a href="https://euandreh.xyz/gistatic/">gistatic</a>.'
-
-
-
-t() {
- gettext 'gistatic' "$1"
-}
-
-#
-# Template strings
-#
-
-print_logo() {
- color="$1"
- cat <<EOF
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
- <path fill="$color" d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" />
- <path fill="$color" d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" />
- <path fill="$color" d="M 1 8 L 2 8 L 2 9 L 1 9 L 1 8 Z" />
- <path fill="$color" d="M 1 13 L 2 13 L 2 14 L 1 14 L 1 13 Z" />
- <path fill="$color" d="M 2 8 L 3 8 L 3 9 L 2 9 L 2 8 Z" />
- <path fill="$color" d="M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 Z" />
- <path fill="$color" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" />
- <path fill="$color" d="M 3 13 L 4 13 L 4 14 L 3 14 L 3 13 Z" />
- <path fill="$color" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" />
- <path fill="$color" d="M 4 8 L 5 8 L 5 9 L 4 9 L 4 8 Z" />
- <path fill="$color" d="M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 Z" />
- <path fill="$color" d="M 5 6 L 6 6 L 6 7 L 5 7 L 5 6 Z" />
- <path fill="$color" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" />
- <path fill="$color" d="M 5 13 L 6 13 L 6 14 L 5 14 L 5 13 Z" />
- <path fill="$color" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" />
- <path fill="$color" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" />
- <path fill="$color" d="M 6 14 L 7 14 L 7 15 L 6 15 L 6 14 Z" />
- <path fill="$color" d="M 7 1 L 8 1 L 8 2 L 7 2 L 7 1 Z" />
- <path fill="$color" d="M 7 14 L 8 14 L 8 15 L 7 15 L 7 14 Z" />
- <path fill="$color" d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" />
- <path fill="$color" d="M 7 2 L 8 2 L 8 3 L 7 3 L 7 2 Z" />
- <path fill="$color" d="M 7 3 L 8 3 L 8 4 L 7 4 L 7 3 Z" />
- <path fill="$color" d="M 7 4 L 8 4 L 8 5 L 7 5 L 7 4 Z" />
- <path fill="$color" d="M 7 5 L 8 5 L 8 6 L 7 6 L 7 5 Z" />
- <path fill="$color" d="M 8 1 L 9 1 L 9 2 L 8 2 L 8 1 Z" />
- <path fill="$color" d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" />
- <path fill="$color" d="M 9 1 L 10 1 L 10 2 L 9 2 L 9 1 Z" />
- <path fill="$color" d="M 9 2 L 10 2 L 10 3 L 9 3 L 9 2 Z" />
- <path fill="$color" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" />
- <path fill="$color" d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" />
- <path fill="$color" d="M 10 2 L 11 2 L 11 3 L 10 3 L 10 2 Z" />
- <path fill="$color" d="M 10 3 L 11 3 L 11 4 L 10 4 L 10 3 Z" />
- <path fill="$color" d="M 10 4 L 11 4 L 11 5 L 10 5 L 10 4 Z" />
- <path fill="$color" d="M 10 5 L 11 5 L 11 6 L 10 6 L 10 5 Z" />
- <path fill="$color" d="M 10 6 L 11 6 L 11 7 L 10 7 L 10 6 Z" />
- <path fill="$color" d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" />
- <path fill="$color" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" />
- <path fill="$color" d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" />
- <path fill="$color" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" />
- <path fill="$color" d="M 11 12 L 12 12 L 12 13 L 11 13 L 11 12 Z" />
- <path fill="$color" d="M 11 14 L 12 14 L 12 15 L 11 15 L 11 14 Z" />
- <path fill="$color" d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" />
- <path fill="$color" d="M 12 6 L 13 6 L 13 7 L 12 7 L 12 6 Z" />
- <path fill="$color" d="M 12 8 L 13 8 L 13 9 L 12 9 L 12 8 Z" />
- <path fill="$color" d="M 12 10 L 13 10 L 13 11 L 12 11 L 12 10 Z" />
- <path fill="$color" d="M 12 12 L 13 12 L 13 13 L 12 13 L 12 12 Z" />
- <path fill="$color" d="M 12 14 L 13 14 L 13 15 L 12 15 L 12 14 Z" />
- <path fill="$color" d="M 13 6 L 14 6 L 14 7 L 13 7 L 13 6 Z" />
- <path fill="$color" d="M 13 8 L 14 8 L 14 9 L 13 9 L 13 8 Z" />
- <path fill="$color" d="M 13 10 L 14 10 L 14 11 L 13 11 L 13 10 Z" />
- <path fill="$color" d="M 13 12 L 14 12 L 14 13 L 13 13 L 13 12 Z" />
- <path fill="$color" d="M 13 13 L 14 13 L 14 14 L 13 14 L 13 13 Z" />
- <path fill="$color" d="M 13 14 L 14 14 L 14 15 L 13 15 L 13 14 Z" />
- <path fill="$color" d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" />
- <path fill="$color" d="M 14 8 L 15 8 L 15 9 L 14 9 L 14 8 Z" />
- <path fill="$color" d="M 14 9 L 15 9 L 15 10 L 14 10 L 14 9 Z" />
- <path fill="$color" d="M 14 10 L 15 10 L 15 11 L 14 11 L 14 10 Z" />
- <path fill="$color" d="M 14 11 L 15 11 L 15 12 L 14 12 L 14 11 Z" />
- <path fill="$color" d="M 14 12 L 15 12 L 15 13 L 14 13 L 14 12 Z" />
-</svg>
-EOF
-}
-
-print_style() {
- cat <<'EOF'
-:root {
- --color: black;
- --background-color: white;
- --background-contrast-color: hsl(0, 0%, 98%);
- --hover-color: hsl(0, 0%, 93%);
- --nav-color: hsl(0, 0%, 87%);
- --selected-color: hsl(0, 0%, 80%);
- --diff-added-color: hsl(120, 100%, 23%);
- --diff-removed-color: hsl(0, 100%, 47%);
-}
-
-@media(prefers-color-scheme: dark) {
- :root {
- --color: white;
- --background-color: black;
- --background-contrast-color: hsl(0, 0%, 2%);
- --hover-color: hsl(0, 0%, 7%);
- --nav-color: hsl(0, 0%, 13%);
- --selected-color: hsl(0, 0%, 20%);
- }
-
- body {
- color: var(--color);
- background-color: var(--background-color);
- }
-
- a {
- color: hsl(211, 100%, 60%);
- }
-
- a:visited {
- color: hsl(242, 100%, 80%);
- }
-}
-
-body {
- font-family: monospace;
- max-width: 1100px;
- margin: 0 auto 0 auto;
-}
-
-.logo {
- height: 6em;
- width: 6em;
-}
-
-.header-horizontal-grouping {
- display: flex;
- align-items: center;
- margin-top: 1em;
- margin-bottom: 1em;
-}
-
-.header-description {
- margin-left: 2em;
-}
-
-nav {
- margin-top: 2em;
-}
-
-nav ul {
- display: flex;
- list-style-type: none;
- margin-bottom: 0;
-}
-
-nav li {
- margin-left: 10px;
-}
-
-nav a, nav a:visited {
- padding: 2px 8px 0px 8px;
- color: var(--color);
-}
-
-.selected-nav-item {
- background-color: var(--nav-color);
-}
-
-hr {
- margin-top: 0;
- border: 0;
- border-top: 3px solid var(--nav-color);
-}
-
-table {
- margin: 2em auto;
-}
-
-th {
- padding-bottom: 1em;
-}
-
-tbody tr:hover {
- background-color: var(--hover-color);
-}
-
-td {
- padding-left: 1em;
- padding-right: 1em;
-}
-
-
-/* commit page */
-
-.diff-added, .diff-removed {
- text-decoration: none;
-}
-
-.diff-added:target, .diff-removed:target {
- background-color: var(--selected-color);
-}
-
-.diff-added, .diff-added:visited {
- color: var(--diff-added-color);
-}
-
-.diff-removed, .diff-removed:visited {
- color: var(--diff-removed-color);
-}
-
-
-/* log page */
-
-.log-commit-box {
- padding: 1em;
- margin: 1em;
- background-color: var(--background-contrast-color);
-}
-
-.log-commit-tag {
- padding: 2px;
- border: 1px solid;
- color: var(--color);
-}
-
-.log-head-highlight {
- background-color: #ff8888; /* FIXME: hsl + dark-mode */
-}
-
-.log-branch-highlight {
- background-color: #88ff88; /* FIXME: hsl + dark-mode */
-}
-
-.log-tag-highlight {
- background-color: #ffff88; /* FIXME: hsl + dark-mode */
-}
-
-.pre-wrapping {
- overflow: auto;
- margin: 1em;
-}
-
-.log-notes {
- /* FIXME: yellow box goes until the end of the screen */
- padding: 1em;
- background-color: #ffd; /* FIXME: hsl + dark-mode */
-}
-
-.log-pagination {
- text-align: center;
- margin: 2em;
-}
-
-
-footer {
- text-align: center;
-}
-EOF
-}
-
-print_index_header() {
- cat <<EOF
-<!DOCTYPE html>
-<html lang="$LANGNAME">
- <head>
- <meta charset="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <meta name="description" content="$(t "$MSG_INDEX_DESCRIPTION")" />
- <link rel="icon" type="image/svg+xml" href="img/favicon.svg" />
- <link rel="stylesheet" type="text/css" href="style.css" />
- <title>$(t "$MSG_TITLE_INDEX")</title>
- </head>
- <body>
- <header>
- <div class="header-horizontal-grouping">
- <picture>
- <source srcset="img/logo/dark.svg" media="(prefers-color-scheme: dark)" />
- <img src="img/logo/light.svg" alt="$(t "$MSG_LOGO_ALT_INDEX")" />
- </picture>
- <h1 class="header-description">
- $(t "$MSG_TITLE_INDEX")
- </h1>
- </div>
- <hr />
- </header>
- <main>
- <table>
- <thead>
- <tr>
- <th>
- $(t "$MSG_NAME")
- </th>
- <th>
- $(t "$MSG_DESCRIPTION")
- </th>
- <th>
- $(t "$MSG_LAST_COMMIT")
- </th>
- </tr>
- </thead>
- <tbody>
-EOF
-}
-
-print_index_row() {
- path="$1"
- repo_vars "$path"
-
- last_commit_date="$(git log -1 --format=%cd --date='format:%Y-%m:%d %H:%M' 2>/dev/null ||:)"
- cat <<EOF
- <tr>
- <td>
- <a href="$(printf '%s' "$FULLNAME" | htmlesc)">
- $(printf '%s' "$FULLNAME" | htmlesc)
- </a>
- </td>
- <td>
- $(printf '%s' "$DESCRIPTION" | htmlesc)
- </td>
- <td>
- $(printf '%s' "$last_commit_date" | htmlesc)
- </td>
- </tr>
-EOF
-}
-
-print_index_footer() {
- cat <<EOF
- </tbody>
- </table>
- </main>
- <footer>
- <hr />
- <p>
- $(t "$MSG_ESCAPED_FOOTER_TEMPLATE")
- </p>
- </footer>
- </body>
-</html>
-EOF
-}
-
-imgs() {
- DIR="$1"
- mkdir -p "$DIR"/img/logo
- print_logo black > "$DIR"/img/favicon.svg
- print_logo black > "$DIR"/img/logo/light.svg
- print_logo white > "$DIR"/img/logo/dark.svg
- print_style > "$DIR"/style.css
-}
-
-index_write() {
- mkdir -p "$OUTDIR"
- {
- print_index_header
- for r in "$@"; do
- print_index_row "$r"
- done
- print_index_footer
- } > "$OUTDIR/index.html"
- imgs "$OUTDIR"
-}
-
-genlog() {
- if [ "$VERBOSE" = true ]; then
- : # printf "$MSXG_GENERATING_LOG\n" "$1" >&2 # FIXME
- fi
-}
-
-# FIXME: get from config?
-# exts() { }
-
-# FIXME: emit signatures code
-repo_tarballs_mk() {
- git branch --format '%(refname:lstrip=2)' | while read -r branch; do
- cat <<EOF
-all: $OUTDIR/$FULLNAME/tarball/$NAME-$branch.$EXT
-
-$OUTDIR/$FULLNAME/tarball/$NAME-$branch.$EXT: $REPO/refs/heads/$branch
- env GIT_DIR="$REPO" git archive --prefix $NAME-$branch/ -o \$@ $branch
-
-EOF
- done
-
- git tag | while read -r tag; do
- cat <<EOF
-all: $OUTDIR/$FULLNAME/tarball/$NAME-$tag.$EXT
-
-$OUTDIR/$FULLNAME/tarball/$NAME-$tag.$EXT: $REPO/refs/tags/$tag
- env GIT_DIR="$REPO" git archive --prefix $NAME-$tag/ -o \$@ $tag
-
-EOF
- done
-}
-
-repo_commits_mk() {
- git log --format='format:%H' | while read -r commit; do
- cat <<EOF
-all: $OUTDIR/$FULLNAME/commit/$commit.html
-
-$OUTDIR/$FULLNAME/commit/$commit.html:
- $0 -u "$CLONE_URL" -x commit "$REPO" $commit > \$@
-EOF
- done
-}
-
-repo_refs_mk() {
- cat <<EOF
-all: $OUTDIR/$FULLNAME/refs.html
-
-$OUTDIR/$FULLNAME/refs.html: $REPO/refs/heads/ $REPO/refs/tags/
- $0 -u "$CLONE_URL" -x refs "$REPO" > \$@
-
-EOF
-}
-# FIXME: translate commits.xml and tags.xml
-
-print_clone_url() {
- if [ -z "$CLONE_URL" ]; then
- return
- fi
-
- cat <<EOF
- <code>
- git clone $(printf '%s/%s' "$CLONE_URL" "$FULLNAME"/ | htmlesc)
- </code>
-EOF
-}
-
-exec_refs() {
- repo_vars "$1"
- cat <<EOF | sed '/^$/d'
-<!DOCTYPE html>
-<html lang="$LANGNAME">
- <head>
- <meta charset="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <meta name="description" content="$(printf '%s' "$DESCRIPTION" | htmlesc)" />
- <link rel="icon" type="image/svg+xml" href="img/favicon.svg" />
- <link rel="stylesheet" type="text/css" href="style.css" />
- <link rel="alternate" type="application/atom+xml" href="commits.xml" title="$(printf '%s' "$NAME" | htmlesc) - $(t "$MSG_COMMIT_FEED")" hreflang="$LANGNAME" />
- <link rel="alternate" type="application/atom+xml" href="tags.xml" title="$(printf '%s' "$NAME" | htmlesc) - $(t "$MSG_TAGS_FEED")" hreflang="$LANGNAME" />
- <title>$(printf '%s' "$NAME" | htmlesc) - $(t "$MSG_TITLE_REFS")</title>
- </head>
- <body>
- <header>
- <div class="header-horizontal-grouping">
- <a href="../">
- <picture>
- <source srcset="img/logo/dark.svg" media="(prefers-color-scheme: dark)" />
- <img src="img/logo/light.svg" alt="$(t "$MSG_LOGO_ALT_INDEX")" />
- </picture>
- </a>
- <div class="header-description">
- <h1>
- <a href="./">
- $(printf '%s' "$NAME" | htmlesc)
- </a>
- </h1>
- <h2>
- $DESCRIPTION
- </h2>
-$(print_clone_url)
- </div>
- </div>
- <nav>
- <ul>
- <li>
- <a href="./">
- $(t "$MSG_NAV_FILES")
- </a>
- </li>
- <li>
- <a href="log/$(printf '%s' "$MAIN_BRANCH" | htmlesc).html">
- $(t "$MSG_NAV_LOG")
- </a>
- </li>
- <li class="selected-nav-item">
- <a href="refs.html">
- $(t "$MSG_NAV_REFS")
- </a>
- </li>
- </ul>
- </nav>
- <hr />
- </header>
- <main>
- <table>
- <thead>
- <tr>
- <th>
- $(t "$MSG_THEAD_BRANCH")
- </th>
- <th>
- $(t "$MSG_THEAD_COMMITMSG")
- </th>
- <th>
- $(t "$MSG_THEAD_AUTHOR")
- </th>
- <th>
- $(t "$MSG_THEAD_DATE")
- </th>
- </tr>
- </thead>
- <tbody>
-EOF
-
- for branch in $(git branch --format '%(refname:lstrip=2)'); do
- commit="$(git rev-parse "$branch")"
- cat <<EOF
- <tr>
- <td>
- <a href="log/$(printf '%s' "$branch" | htmlesc).html">
- $(printf '%s' "$branch" | htmlesc)
- </a>
- </td>
- <td>
- <a href="commit/$(printf '%s' "$commit" | htmlesc).html">
- $(printf '%s\n' "$(git log -1 --format=%s "$commit")" | htmlesc)
- </a>
- </td>
- <td>
- $(printf '%s\n' "$(git log -1 --format=%an "$commit")" | htmlesc)
- </td>
- <td>
- $(printf '%s\n' "$(git log -1 --format=%cd --date='format:%Y-%m:%d %H:%M' "$commit")" | htmlesc)
- </td>
- </tr>
-EOF
- done
-
- cat <<EOF
- </tbody>
- </table>
-EOF
- PRINTED_TABLE_OPEN=false
-
- for tag in $(git tag | tac); do
- commit="$(git rev-parse "$tag")"
- if [ "$PRINTED_TABLE_OPEN" = false ]; then
- PRINTED_TABLE_OPEN=true
- cat <<EOF
- <table>
- <thead>
- <tr>
- <th>
- $(t "$MSG_THEAD_TAG")
- </th>
- <th>
- $(t "$MSG_THEAD_COMMITMSG")
- </th>
- <th>
- $(t "$MSG_THEAD_AUTHOR")
- </th>
- <th>
- $(t "$MSG_THEAD_DATE")
- </th>
- </tr>
- </thead>
- <tbody>
-EOF
- fi
-
- if false && [ -e "$CACHE_DIR/tarball/$repo-$tag.$EXT.asc" ]; then
- tarball_link="(<a href=\"tarballs/$(printf '%s' "$repo" | htmlesc)-$(printf '%s' "$tag" | htmlesc).$EXT\">tarball</a>,
- <a href=\"tarballs/$(printf '%s' "$repo" | htmlesc)-$(printf '%s' "$tag" | htmlesc).$EXT.asc\">sig</a>)"
- else
- tarball_link="(<a href=\"tarballs/$(printf '%s' "$FULLNAME" | htmlesc)-$(printf '%s' "$tag" | htmlesc).$EXT\">tarball</a>)"
- fi
-
- # FIXME: translate tag/
- cat <<EOF
- <tr>
- <td>
- <a href="tag/$(printf '%s' "$tag" | htmlesc).html">
- $(printf '%s' "$tag" | htmlesc)
- </a>
- $tarball_link
- </td>
- <td>
- <a href="commit/$(printf '%s' "$commit" | htmlesc).html">
- $(printf '%s\n' "$(git log -1 --format=%s "$commit")" | htmlesc)
- </a>
- </td>
- <td>
- $(printf '%s\n' "$(git log -1 --format=%an "$tag")" | htmlesc)
- </td>
- <td>
- $(printf '%s\n' "$(git log -1 --format=%cd --date='format:%Y-%m:%d %H:%M' "$tag")" | htmlesc)
- </td>
- </tr>
-EOF
- done
-
- if [ "$PRINTED_TABLE_OPEN" = true ]; then
- cat <<EOF
- </tbody>
- </table>
-EOF
- fi
-
- cat <<EOF
- </main>
- <footer>
- <hr />
- <p>
- $(t "$MSG_ESCAPED_FOOTER_TEMPLATE")
- </p>
- </footer>
- </body>
-</html>
-EOF
-}
-
-exec_commit() {
- repo_vars "$1"
- commit="$2"
- previous_commit="$(git rev-parse "$commit^" 2>/dev/null ||:)"
- subject="$(git log -1 --format='%s')"
- cat <<EOF | sed '/^$/d'
-<!DOCTYPE html>
-<html lang="$LANGNAME">
- <head>
- <meta charset="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <meta name="description" content="$(printf '%s' "$DESCRIPTION" | htmlesc)" />
- <link rel="icon" type="image/svg+xml" href="../img/favicon.svg" />
- <link rel="stylesheet" type="text/css" href="../style.css" />
- <link rel="alternate" type="application/atom+xml" href="../commits.xml" title="$(printf '%s' "$NAME" | htmlesc) - $(t "$MSG_COMMIT_FEED")" hreflang="$LANGNAME" />
- <link rel="alternate" type="application/atom+xml" href="../tags.xml" title="$(printf '%s' "$NAME" | htmlesc) - $(t "$MSG_TAGS_FEED")" hreflang="$LANGNAME" />
- <title>$(printf '%s@%s - %s' "$NAME" "$commit" "$subject" | htmlesc)</title>
- </head>
- <body>
- <header>
- <div class="header-horizontal-grouping">
- <a href="../../">
- <picture>
- <source srcset="../img/logo/dark.svg" media="(prefers-color-scheme: dark)" />
- <img src="../img/logo/light.svg" alt="$(t "$MSG_LOGO_ALT_INDEX")" />
- </picture>
- </a>
- <div class="header-description">
- <h1>
- <a href="../">
- $(printf '%s' "$NAME" | htmlesc)
- </a>
- </h1>
- <h2>
- $(printf '%s' "$DESCRIPTION" | htmlesc)
- </h2>
-$(print_clone_url)
- </div>
- </div>
- <nav>
- <ul>
- <li>
- <a href="./">
- $(t "$MSG_NAV_FILES")
- </a>
- </li>
- <li>
- <a href="log/$(printf '%s' "$MAIN_BRANCH" | htmlesc).html">
- $(t "$MSG_NAV_LOG")
- </a>
- </li>
- <li>
- <a href="refs.html">
- $(t "$MSG_NAV_REFS")
- </a>
- </li>
- </ul>
- </nav>
- <hr />
- </header>
- <main>
-EOF
-
- print_formatted_diff "$commit" "$previous_commit"
-
- cat <<EOF
- </main>
- <footer>
- <hr />
- <p>
- $(t "$MSG_ESCAPED_FOOTER_TEMPLATE")
- </p>
- </footer>
- </body>
-</html>
-EOF
-}
-
-print_formatted_diff() {
- commit="$1"
- previous_commit="$2"
- printf '<pre class="pre-wrapping">'
- # git show -p --stat "$sha"
- # FIXME: translate tree/
- git show -p --full-index "$commit" | htmlesc | awk \
- -v COMMIT="$commit" -v PREVIOUS_COMMIT="$previous_commit" '
- BEGIN {
- diff_init = 0
- diffl = 0
- }
-
- /^(diff|index) / {
- diff_init = 1
- print $0
- next
- }
-
- diff_init == 1 && /^--- a\// {
- fname = substr($0, 7)
- printf "--- a/<a href=\"../tree/%s/%s.html\">%s</a>\n",
- PREVIOUS_COMMIT, fname, fname
- next
- }
-
- diff_init == 1 && /^\+\+\+ b\// {
- fname = substr($0, 7)
- printf "--- b/<a href=\"../tree/%s/%s.html\">%s</a>\n",
- COMMIT, fname, fname
- next
- }
-
- { diff_init = 0 }
-
- /^-/ {
- diffl++
- printf "<a id=\"l%s\" href=\"#l%s\" class=\"diff-removed\">%s</a>\n",
- diffl, diffl, $0
- next
- }
-
- /^\+/ {
- diffl++
- printf "<a id=\"l%s\" href=\"#l%s\" class=\"diff-added\">%s</a>\n",
- diffl, diffl, $0
- next
- }
-
- { print $0 }
- '
- printf '</pre>\n'
-}
-
-preamble_mk() {
- cat <<EOF
-.POSIX:
-
-all:
-ALWAYS:
-
-
-EOF
-}
-
-repo_vars() {
- REPO="$1"
-
- unset GIT_DIR
- GIT_DIR="$REPO"/"$(git -C "$REPO" rev-parse --git-dir)"
- GIT_DIR="$(realpath --relative-to=. "$GIT_DIR")"
- export GIT_DIR
-
- is_bare="$(git rev-parse --is-bare-repository)"
-
- NAME="$(realpath --relative-to=. "$REPO")"
- if [ "$is_bare" = false ] && [ "$NAME" = "$GIT_DIR" ]; then
- NAME="$(dirname -- "$NAME")"
- else
- NAME="${NAME%.git}"
- fi
- FULLNAME="$NAME"
- NAME="$(basename -- "$NAME")"
-
- EXT=tar.gz
- DESCRIPTION="$(cat "$GIT_DIR"/description 2>/dev/null ||:)"
-}
-
-repo_write() {
- path="$1"
- repo_vars "$path"
- mkdir -p \
- "$OUTDIR"/"$FULLNAME"/commit \
- "$OUTDIR"/"$FULLNAME"/tarball \
-
- {
- preamble_mk
- repo_tarballs_mk
- repo_commits_mk
- repo_refs_mk
- } | tee f | (unset GIT_DIR; make -f- -j`nproc`)
- imgs "$OUTDIR"/"$FULLNAME"
-}
-
-
-VERBOSE=true
-INDEX=false
-OUTDIR=.
-CLONE_URL=
-MAX_JOBS=1
-MAIN_BRANCH='main'
-MAIN_BRANCH_SET=false
-REPO=
-DESCRIPTION=
-CMD='ln'
-EXEC=
-while getopts 'b:o:u:j:isqx:' flag; do
- case "$flag" in
- (b)
- MAIN_BRANCH="$OPTARG"
- MAIN_BRANCH_SET=true
- ;;
- (o)
- OUTDIR="$OPTARG"
- ;;
- (u)
- CLONE_URL="$OPTARG"
- ;;
- (j)
- MAX_JOBS="$OPTARG"
- ;;
- (i)
- INDEX=true
- ;;
- (q)
- VERBOSE=false
- ;;
- (s)
- CMD='ln -s'
- ;;
- (x)
- EXEC="$OPTARG"
- ;;
- (*)
- usage >&2
- exit 2
- ;;
- esac
-done
-shift $((OPTIND - 1))
-
-if [ -n "$EXEC" ]; then
- "exec_$EXEC" "$@"
- exit
-fi
-
-if false; then
-if [ "$INDEX" = false ]; then
- assert_arg "$CLONE_URL" '-u CLONE_URL'
-elif [ -n "$CLONE_URL" ] || [ "$MAIN_BRANCH_SET" = true ]; then
- {
- printf '%s' "$MSG_INCOMPATIBLE_OPTIONS" # FIXME
- printf -- '-i'
- if [ -n "$CLONE_URL" ]; then
- printf -- ' -u'
- fi
- if [ "$MAIN_BRANCH_SET" = true ]; then
- printf -- ' -b'
- fi
- printf '\n\n'
-
- usage
- } >&2
- exit 2
-fi
-fi
-
-eval "$(assert-arg "${1:-}" "$MSG_MISSING_ARGS")" # FIXME
-
-if false; then
-if [ "$INDEX" = true ]; then
- index_write "$@"
-else
- repo_write "$1"
-fi
-fi
-
-index_write "$@"
-for path in "$@"; do
- repo_write "$path"
-done
diff --git a/src/gistatic.go b/src/gistatic.go
new file mode 100644
index 0000000..b4ad501
--- /dev/null
+++ b/src/gistatic.go
@@ -0,0 +1,79 @@
+package gistatic
+
+import (
+ "flag"
+ "fmt"
+ "io"
+ "os"
+
+ g "gobang"
+)
+
+
+
+type argsT struct{
+ outputPath string
+ cloneUrl string
+ allArgs []string
+}
+
+
+func usage(argv0 string, w io.Writer) {
+ fmt.Fprintf(
+ w,
+ "Usage: %s [-o DIRECTORY] [-u CLONE_URL] REPOSITORY",
+ argv0,
+ )
+}
+
+func getopt(allArgs []string, w io.Writer) (argsT, int) {
+ argv0 := allArgs[0]
+ argv := allArgs[1:]
+ fs := flag.NewFlagSet("", flag.ContinueOnError)
+ fs.Usage = func() {}
+ fs.SetOutput(w)
+ outputPath := fs.String(
+ "o",
+ g.Must(os.Getwd()),
+ "The directory where to write the generated files",
+ )
+ cloneUrl := fs.String(
+ "u",
+ "",
+ "The prefix of the online cloning addresss",
+ )
+ if fs.Parse(argv) != nil {
+ usage(argv0, w)
+ return argsT{}, 2
+ }
+
+ subArgs := fs.Args()
+ if len(subArgs) == 0 {
+ fmt.Fprintf(w, "Missing DIRECTORY.\n")
+ usage(argv0, w)
+ return argsT{}, 2
+ }
+
+ args := argsT{
+ outputPath: *outputPath,
+ cloneUrl: *cloneUrl,
+ allArgs: allArgs,
+ }
+
+ return args, 0
+}
+
+func run(args argsT, stdin io.Reader, stdout io.Writer, stderr io.Writer) int {
+ return 0
+}
+
+
+
+func Main() {
+ g.Init()
+ args, rc := getopt(os.Args, os.Stderr)
+ if rc != 0 {
+ os.Exit(rc)
+ }
+ os.Exit(run(args, os.Stdin, os.Stdout, os.Stderr))
+}
diff --git a/src/main.go b/src/main.go
new file mode 100644
index 0000000..2edb2fc
--- /dev/null
+++ b/src/main.go
@@ -0,0 +1,7 @@
+package main
+
+import "gistatic"
+
+func main() {
+ gistatic.Main()
+}