Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hesselink/8285419 to your computer and use it in GitHub Desktop.
Save hesselink/8285419 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python2
"""
Uploads haddocks to Hackage.
Use it when Hackage can't build your documentation (e.g. missing libraries).
Inspired by:
http://fuuzetsu.co.uk/blog/posts/2014-01-06-Fix-your-Hackage-documentation.html
"""
import getpass
import glob
import os
import re
# Find package version
print "Finding package name and version"
cabalfile = glob.glob('*.cabal')[0]
package = cabalfile.rstrip('.cabal')
version = re.search(r'^version:\s*(\S+)', open(cabalfile).read(), re.MULTILINE | re.IGNORECASE).group(1)
raw_input("Using '%s-%s'. Confirm with Enter..." % (package, version))
def run(cmd):
print cmd
os.system(cmd)
# Build haddocks
print "Building haddocks"
print
run('cabal haddock --hyperlink-source')
# Go to doc directory
print 'cd dist/doc/html/'; os.chdir('dist/doc/html/')
# Tar the docs
run('rm -rf %s-%s-docs' % (package, version))
run('mv %s %s-%s-docs' % (package, package, version))
run('tar -c -v -z --format=ustar -f %s-%s-docs.tar.gz %s-%s-docs' % (package, version, package, version))
# Upload the docs
print "\nReady to upload.\n"
username = raw_input('Hackage username: ')
pw = getpass.getpass('Hackage password: ')
# Don't use run() to not show the pw
print "curl -X PUT -H 'Content-Type: application/x-tar' -H 'Content-Encoding: gzip' --data-binary '@%s-%s-docs.tar.gz' 'http://%s:%s@hackage.haskell.org/package/%s-%s/docs'" % (package, version, username, '***', package, version)
os.system("curl -X PUT -H 'Content-Type: application/x-tar' -H 'Content-Encoding: gzip' --data-binary '@%s-%s-docs.tar.gz' 'http://%s:%s@hackage.haskell.org/package/%s-%s/docs'" % (package, version, username, pw, package, version))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment