shithub: shithub

ref: 653a66db903cea4e30c1958a3fe4050876404e01
dir: /shithub/

View raw version
#!/bin/rc -e

cd $1
shift

rfork ne
nl='
'

fn htcat {
	sed '
		s/&/\&/g;
		s/</\&lt;/g;
		s/>/\&gt;/g;
		s/"/\&quot;/g;
		s/''/\&#39;/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
	bind /bin /mnt/bin
	bind /tmp /mnt/tmp
	bind -c /env /mnt/env
	bind $1/$2 /mnt/$repo
	bind /mnt /
	cd /mnt/$repo
	git/fs
	rfork m
}


fn prelude {
	echo '
	<!DOCTYPE html>
	<html>
	
	<head>
		<style type="text/css">
			body{
				margin: 3em auto;
				max-width: 50em;
				font-family: sans-serif;
			}
			h1{
				font-size: 1.5em;
				color: #4c4c99;
			}
			h2{
				font-size: 1.3em;
				color: #4c4c99;
			}
			h3{
				font-size: 1em;
				color: #4c4c99;
			}

			#code{
				background: #ffffea;
				border: #99994cff
			}
		</style>
	 	<link rel="alternate" type="application/rss+xml" href="feed.rss" title="rss">
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>Shithub: '$*'</title>
	</head>
	<body>
	'
}

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 '<h3>'$ndir'</h3>'
			echo '<dl>'
		}
		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/desc)
				htcat $repo/.git/desc
			if not
				echo 'code some guy wrote'
			echo '</dd>'
		}
		if(! ~ $udir $ndir){
			echo '</dl>'
			udir=$ndir
		}
	}
	echo '</dl>'

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
	}

	prelude $repo $ref
	if(! test -d /mnt/git/$ref/tree){
		echo '	<h1><a href="/git/repos.html">Git</a>: <a
			href=/git/'$gituser/$repo'/'$ref'/info.html>'$repo'</a></h1>
			<p>
			<b>clone:</b> git://shithub.us/'$gituser/$repo', gits://shithub.us/'$gituser/$repo'<br>
			<b>push:</b> hjgit://shithub.us/'$gituser/$repo'<br>
			</p>
			<h2>No code pushed</h2>
			</body>
			</html>
		'
		exit
	}
		
	cd /mnt/git/$ref/tree
	hash=`{cat /mnt/git/$ref/hash}

	echo '	<h1><a href="/git/repos.html">Git</a>: <a
		href=/git/'$gituser/$repo'/'$ref'/info.html>'$repo'</a></h1>
		<p>'$repo' @ <a href='/git/$gituser/$repo/$hash/f.html'>'$hash'</a>
		<pre id="desc">'
	htcat /mnt/git/object/$hash/msg
	echo '	</pre>
		<h2>Code</h2>
		<p>
		<b>clone:</b> git://shithub.us/'$gituser/$repo', gits://shithub.us/'$gituser/$repo'<br>
		<b>push:</b> hjgit://shithub.us/'$gituser/$repo'<br>
		<b>tar:</b> <a href="'/git/$gituser/$repo/$hash/snap.tar.gz'">snap.tar.gz</a><br>'
	if(test -f $repodir/contact)
		echo '<b>patches to: </b>'^`$nl{cat $repodir/contact}^'<br>
			</p>'

	echo '<pre 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 '</pre>

		<h2>About This Repo</h2>
		<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 '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}

	prelude $repo $file
	echo '	<h1><a href="/git/repos.html">Git</a>: <a
		href='/git/$gituser/$repo/$ref/info.html'>'$repo'</a></h1>
		<p>'$repo' @ <a href="'/git/$gituser/$repo/$hash/f.html'">'$hash'</a>
		<pre id="code">'
	if(test -f $file){
		htcat $file
	}
	if not if(test -d $file){
		cd $file
		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 '	</pre>
		</body>
		</html>'
}