ref: aded4d3b5d13b8c9838afc8fd4d87f62677e4cd7
dir: /shithub/
#!/bin/rc -e
cd $1
shift
rfork ne
nl='
'
fn htcat {
sed '
s/&/\&/g;
s/</\</g;
s/>/\>/g;
s/"/\"/g;
s/''/\'/g
' $*
}
fn resolveref {
if(~ $refname HEAD)
echo $refname
if not if(test -d /mnt/git/branch/$refname/tree)
echo branch/$refname
if not if(test -d /mnt/git/object/$refname/tree)
echo object/$refname
if not
status='bad ref'
}
fn repons {
mntgen
mntgen /mnt/mnt
ramfs -m /mnt/tmp
bind /bin /mnt/bin
bind /rc /mnt/rc
bind /sys /mnt/sys
bind -c /env /mnt/env
bind /dev /mnt/dev
bind $1/$2 /mnt/$repo
bind /mnt /
cd /mnt/$repo
git/fs
mntgen /mnt/scratch
rfork m
}
fn formatcommit {
phash=$1
message=`{htcat /mnt/git/object/$phash/msg | sed 1q}
date=`{date -t `{mtime /mnt/git/object/$phash/msg | awk '{print $1}'}}
author=`"{htcat /mnt/git/object/$phash/author | awk '{print $1}'}
shorthash=`{echo $phash | awk '{print substr($0, 0, 8)}'}
echo ' <div id="commit">
<a href=/git/'$gituser/$repo/$phash'/commit.html>'$shorthash'</a>
– '$author' – '$"date'
<pre>'$"message'</pre>
</div>'
}
fn shortlog {
ref=$1
commitcount=$2
d=`{pwd}
commithash=`{cat /mnt/git/$ref/hash | sed 1q}
count=()
while (! ~ $#commithash 0 && ! ~ $#count $commitcount) {
count=($count 1)
formatcommit $commithash
echo '<br/>'
commithash=`{cat /mnt/git/object/$commithash/parent | sed 1q}
}
cd $d
}
fn difftohtml {
awk '
BEGIN { started = 0; diff = 0; }
/^---$/ { diff = 1; next }
/^diff .*$/ { if(diff && !started) started = 1; next }
/^\+\+\+ .*$/ { if(started) printf "<pre id='files'>%s</pre>\n", $0; next }
/^--- .*$/ { if(started) printf "<pre id='files'>%s</pre>\n", $0; next }
/^@@ .*$/ { if(started) printf "<pre id='sep'>%s</pre>\n", $0; next }
/^\+.*$/ { if(started) printf "<pre id='add'>%s</pre>\n", $0; next }
/^-.*$/ { if(started) printf "<pre id='del'>%s</pre>\n", $0; next }
{ if(started) { printf "<pre id=ctx>%s</pre>\n", substr($0, 2); } }
'
}
fn prelude {
echo '
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
body{
padding: 3em;
margin: auto;
max-width: 50em;
font-family: sans-serif;
tab-space: 8;
}
h1{
font-size: 1.5em;
color: #4c4c99;
}
h2{
font-size: 1.3em;
color: #4c4c99;
}
h3{
font-size: 1em;
color: #4c4c99;
}
#code{
background: #ffffea;
border: 1px solid #99994c;
overflow: auto;
padding: 4px;
}
#commit{
font-family: sans-serif;
background: #eeeeee;
border: 1px solid #cccccc;
padding: 4px;
}
#diff{
font-family: monospace;
border: 2px solid #efefef;
}
#diff #files{
background: #efefef;
margin: 0em;
}
#diff #sep{
background: #eaffff;
margin: 0em;
}
#diff #add{
background: #e6ffed;
margin: 0em;
}
#diff #del{
background: #ffeef0;
margin: 0em;
}
#diff #ctx{
margin: 0em;
}
</style>
<link rel="alternate" type="application/rss+xml" href="feed.rss" title="rss">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Shithub: '$"1'</title>
</head>
<body>
'
}
fn user_prelude {
puser=$1
prepo=$2
phash=$3
prelude $prepo
echo ' <h1><a href="/git/repos.html">Git</a>:
<a href="/git/'$puser/$prepo/$phash'/info.html">'$prepo'</a></h1>
<div id="linkbar">
<a href="/git/'$puser/$prepo/$phash'/info.html">Info</a>
•
<a href="/git/'$puser/$prepo/$phash'/files.html">Files</a>
•
<a href="/git/'$puser/$prepo/$phash'/log.html">Log</a>
</div>'
}
switch($1){
case 'list'
rfork m
prelude Repolist
echo ' <h1>Repos</h1>'
udir=()
for(repo in `$nl{ls */}){
ndir=`{basename -d $repo}
if(! ~ $udir $ndir)
echo '</dl>'
if(! ~ $udir $ndir){
echo '<h3>'$ndir'</h3>'
echo '<dl>'
udir=$ndir
}
if(test -e $repo/.git/webpublish){
echo '<dt><a href="/git/'$repo'/HEAD/info.html">'$repo'</a></dt>'
echo '<dd>'
if(test -f $repo/.git/desc)
htcat $repo/.git/desc
if not if(test -f $repo/.git/description)
htcat $repo/.git/description
if not
echo 'probably some code'
echo '</dd>'
}
}
case 'tar'
gituser=$2
repo=$3
refname=$4
repons $gituser $repo
if(! ref=`{resolveref $refname}){
echo '<b>invalid ref '$refname'</b>'
exit
}
bind /mnt/git/$ref/tree /mnt/$repo
cd /mnt
tar cz $repo
case 'info'
gituser=$2
repo=$3
refname=$4
repons $gituser $repo
repodir=/mnt/$repo/.git
if(! ref=`{resolveref $refname}){
echo '<b>invalid ref '$refname'</b>'
exit
}
if(test -f /mnt/git/$ref/hash)
hash=`{cat /mnt/git/$ref/hash}
if not
hash=$ref
user_prelude $gituser $repo $hash
echo ' <h3>Clone</h3>
<div>
<b>clone:</b> git://shithub.us/'$gituser/$repo' gits://shithub.us/'$gituser/$repo'<br>
<b>push:</b> hjgit://shithub.us/'$gituser/$repo'<br>'
if(test -f $repodir/contact)
echo ' <b>patches to: </b>'^`$nl{cat $repodir/contact}^'<br>'
echo ' </div>'
if(test -f /mnt/git/object/$hash/msg){
echo ' <h3>Last commit</h3>'
formatcommit $hash
}
echo ' <h3>About</h3>
<pre id="desc">'
if(test -f $repodir/README)
htcat $repodir/README
if not if(test -f README)
htcat README
if not if (test -f README.md)
htcat README.md
if not if(test -f $repodir/desc)
htcat $repodir/desc
if not if(test -f $repodir/description)
htcat $repodir/description
if not
echo 'this repo has no description'
echo '
</pre>
</body>
</html>
'
case 'files'
gituser=$2
repo=$3
refname=$4
repons $gituser $repo
repodir=/mnt/$repo/.git
if(! ref=`{resolveref $refname}){
echo '<b>invalid ref '$refname'</b>'
exit
}
if(test -f /mnt/git/$ref/hash)
hash=`{cat /mnt/git/$ref/hash}
if not
hash=$ref
user_prelude $gituser $repo $hash
if(! test -d /mnt/git/$ref/tree){
echo ' <p>No code pushed</p>
</body>
</html>
'
exit
}
cd /mnt/git/$ref/tree
echo ' <p>
<b>ref:</b> <a href="'/git/$gituser/$repo/$hash/files.html'">'$hash'</a><br/>
<b>tar:</b> <a href="'/git/$gituser/$repo/$hash/snap.tar.gz'">snap.tar.gz</a><br/></p>'
echo '<p><div id="code">'
for(f in `$nl{ls}){
url=`$nl{echo -n $f/f.html | urlencode}
fname=`$nl{echo -n $f | htcat}
echo -n '<a href="'$url'">'$fname
if (test -d $f) echo '/'
echo '</a><br/>'
}
echo ' </div>
</p>
</body>
</html>'
case 'view'
gituser=$2
repo=$3
refname=$4
file=$5
repons $gituser $repo
if(! ref=`{resolveref $refname}){
echo '<b>invalid ref '$refname'</b>'
exit
}
cd /mnt/git/$ref/tree
if(~ $file '')
file='.'
hash=`{cat /mnt/git/$ref/hash}
user_prelude $gituser $repo $hash
echo ' <p>
<b>ref:</b> <a href="'/git/$gituser/$repo/$hash/files.html'">'$hash'</a><br/>
</p>'
if(test -f $file){
echo ' <a href="'/git/$gituser/$repo/$hash/$file'/raw">View raw version</a>'
type=`{file -m $file}
switch($type){
case text/*
echo ' <pre id="code">'
htcat $file
echo ' </pre>'
case image/*
echo ' <br/><div><img src="'/git/$gituser/$repo/$hash/$file'/raw" /></div>'
case *
echo ' <p>Binary file not displayed</p>'
}
}
if not if(test -d $file){
cd $file
echo ' <div id="code">'
for(f in `$nl{ls}){
url=`$nl{echo -n $f/f.html | urlencode}
fname=`$nl{echo -n $f | htcat}
echo '<a href="'$url'">'$fname'</a>'
}
echo ' </div>'
}
echo ' </body>
</html>'
case 'viewraw'
gituser=$2
repo=$3
refname=$4
file=$5
repons $gituser $repo
if(! ref=`{resolveref $refname}){
echo 'invalid ref '$refname''
exit
}
cd /mnt/git/$ref/tree
cat $file
case 'log'
gituser=$2
repo=$3
refname=$4
repons $gituser $repo
repodir=/mnt/$repo/.git
if(! ref=`{resolveref $refname}){
echo '<b>invalid ref '$refname'</b>'
exit
}
if(test -f /mnt/git/$ref/hash)
hash=`{cat /mnt/git/$ref/hash}
if not
hash=$ref
user_prelude $gituser $repo $hash
if(! test -d /mnt/git/$ref/tree){
echo ' <p>No commits yet.</p>
</body>
</html>
'
exit
}
cd /mnt/git/$ref/tree
echo ' <p>'
shortlog $ref 100
echo ' </p>'
if(! ~ $"commithash '')
echo '<a href="/git/'$gituser/$repo/$commithash'/log.html">Next</a>'
echo ' </body>
</html>'
case 'show'
gituser=$2
repo=$3
refname=$4
repons $gituser $repo
repodir=/mnt/$repo/.git
if(! ref=`{resolveref $refname}){
echo '<b>invalid ref '$refname'</b>'
exit
}
user_prelude $gituser $repo $refname
oldcommit=`{cat /mnt/git/$ref/parent}
author=`''{htcat /mnt/git/$ref/author}
date=`''{date `{mtime /mnt/git/$ref/msg | awk '{print $1}'}}
msg=`''{htcat /mnt/git/$ref/msg}
echo ' <p>
<a href="/git/'$gituser/$repo/$refname'/patch">Download patch</a><br/>
</p>
<p>
<b>ref:</b> <a href="/git/'$gituser/$repo/$refname'/files.html">'$refname'</a><br/>'
if(! ~ $#oldcommit 0) {
echo '<b>parent:</b> <a href="/git/'$gituser/$repo/$oldcommit'/files.html">'$oldcommit'</a><br/>'
}
echo ' <b>author:</b> '$author'<br/>
<b>date:</b> '$date'
<pre id="commit">'$msg'</pre><br/>
</p>'
cd /mnt/$repo
echo ' <div id="diff">'
git/export $refname | htcat | difftohtml
echo ' </div>
</body>
</html>'
case 'patch'
gituser=$2
repo=$3
hash=$4
repons $gituser $repo
cd /mnt/$repo
git/export $hash
}