diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/gistatic | 917 | ||||
-rw-r--r-- | src/gistatic.go | 79 | ||||
-rw-r--r-- | src/main.go | 7 |
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() +} |