#!/usr/bin/env python

import argparse
import os.path
import re
import requests
import sys

parser = argparse.ArgumentParser(description='paste a file to gist')
parser.add_argument('filename', metavar='file', type=str, nargs='?',
        help='file to paste; if not specified, read from stdin')
parser.add_argument('--language', '-l', dest='language',
        help='the language to use (default: Text if stdin, autodetect based on extension otherwise)')

args = parser.parse_args()

rs = requests.Session()

if args.filename is None:
    args.filename = ''
    f = sys.stdin
    if args.language is None:
        args.language = 'Text'
else:
    f = open(args.filename, 'r')
    args.filename = os.path.basename(args.filename)
    if args.language is None:
        r = rs.get('https://gist.github.com/languages/detect', params={'name': args.filename})
        if type(r.json) == dict:
          args.language = r.json['language'] # old requests behavior
        else:
          args.language = r.json()['language'] # new requests behavior

r = rs.get('https://gist.github.com/') # also gets _gist_session cookie
match = re.search('<meta content="([A-Za-z0-9+/]+=*)" name="csrf-token" />', r.content)
csrf_token = match.group(1)
content = f.read()
data = {
    'gist[description]': '',
    'gist[files][][content]': content,
    'gist[files][][language]': args.language,
    'gist[files][][name]': args.filename,
    'gist[files][][oid]': '',
    'gist[public]': 0,
    'indent': 'Tabs',
    'authenticity_token': csrf_token,
}
r = rs.post('https://gist.github.com/gists', data=data, allow_redirects=False)
if 'location' in r.headers:
    print r.headers['location']
else:
    print r.headers['status']
    print '\n' + r.content
