Skip to content

Commit

Permalink
Merge pull request #1107 from Manishearth/setup-gh-pages
Browse files Browse the repository at this point in the history
Setup gh-pages
  • Loading branch information
mcarton authored Jul 19, 2016
2 parents a371558 + 01c61a7 commit 8383e56
Show file tree
Hide file tree
Showing 7 changed files with 416 additions and 0 deletions.
16 changes: 16 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# editorconfig.org

root = true

[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 4

[*.md]
trim_trailing_whitespace = false
66 changes: 66 additions & 0 deletions .github/deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#!/bin/bash
# Automatically deploy on gh-pages

set -e

SOURCE_BRANCH="master"
TARGET_BRANCH="gh-pages"

# Save some useful information
REPO=$(git config remote.origin.url)
SSH_REPO=${REPO/https:\/\/github.com\//git@github.com:}
SHA=$(git rev-parse --verify HEAD)

# Clone the existing gh-pages for this repo into out/
(
git clone "$REPO" out
cd out
git checkout $TARGET_BRANCH
)

# Remove the current doc for master
rm -rf out/master/ || exit 0

# Make the doc for master
mkdir out/master/
cp util/gh-pages/index.html out/master
./util/export.py out/master/lints.json

# Save the doc for the current tag and point current/ to it
if [ -n "$TRAVIS_TAG" ]; then
cp -r out/master "out/$TRAVIS_TAG"
rm -f out/current
ln -s "$TRAVIS_TAG" out/current
fi

# Pull requests and commits to other branches shouldn't try to deploy, just build to verify
if [ "$TRAVIS_PULL_REQUEST" != "false" ] || [ "$TRAVIS_BRANCH" != "$SOURCE_BRANCH" ]; then
echo "Generated, won't push"
exit 0
fi

# Now let's go have some fun with the cloned repo
cd out
git config user.name "Travis CI"
git config user.email "travis@ci.invalid"

if [ -z "$(git diff --exit-code)" ]; then
echo "No changes to the output on this push; exiting."
exit 0
fi

git add .
git commit -m "Automatic deploy to GitHub Pages: ${SHA}"

# Get the deploy key by using Travis's stored variables to decrypt deploy_key.enc
ENCRYPTED_KEY_VAR="encrypted_${ENCRYPTION_LABEL}_key"
ENCRYPTED_IV_VAR="encrypted_${ENCRYPTION_LABEL}_iv"
ENCRYPTED_KEY=${!ENCRYPTED_KEY_VAR}
ENCRYPTED_IV=${!ENCRYPTED_IV_VAR}
openssl aes-256-cbc -K "$ENCRYPTED_KEY" -iv "$ENCRYPTED_IV" -in deploy_key.enc -out deploy_key -d
chmod 600 deploy_key
eval $(ssh-agent -s)
ssh-add deploy_key

# Now that we're all set up, we can push.
git push "$SSH_REPO" "$TARGET_BRANCH"
Binary file added .github/deploy_key.enc
Binary file not shown.
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# Used by Travis to be able to push:
/.github/deploy_key
out

# Compiled files
*.o
*.so
Expand All @@ -16,3 +20,6 @@ Cargo.lock

# Generated by dogfood
/target_recur/

# gh pages docs
util/gh-pages/lints.json
8 changes: 8 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,11 @@ after_success:
else
echo "Ignored"
fi
- |
if [ "$TRAVIS_PULL_REQUEST" == "false" ] &&
[ "$TRAVIS_REPO_SLUG" == "Manishearth/rust-clippy" ] &&
[ "$TRAVIS_BRANCH" == "master" ] ; then
python util/export.py
fi
162 changes: 162 additions & 0 deletions util/export.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
#!/usr/bin/env python
# Build the gh-pages

import json
import os
import re
import sys


level_re = re.compile(r'''(Forbid|Deny|Warn|Allow)''')
conf_re = re.compile(r'''define_Conf! {\n([^}]*)\n}''', re.MULTILINE)
confvar_re = re.compile(r'''/// Lint: (\w+). (.*).*\n *\("([^"]*)", (?:[^,]*), (.*) => (.*)\),''')
lint_subheadline = re.compile(r'''^\*\*([\w\s]+?)[:?.!]?\*\*(.*)''')

conf_template = """
This lint has the following configuration variables:
* `%s: %s`: %s (defaults to `%s`).
"""


# TODO: actual logging
def warn(*args):
print(*args)


def debug(*args):
print(*args)


def info(*args):
print(*args)


def parse_path(p="clippy_lints/src"):
lints = []
for f in os.listdir(p):
if f.endswith(".rs"):
parse_file(lints, os.path.join(p, f))

conf = parse_conf(p)
info(conf)

for lint_id in conf:
lint = next(l for l in lints if l['id'] == lint_id)
if lint:
lint['docs']['Configuration'] = (conf_template % conf[lint_id]).strip()

return lints


def parse_conf(p):
c = {}
with open(p + '/utils/conf.rs') as f:
f = f.read()

m = re.search(conf_re, f)
m = m.groups()[0]

m = re.findall(confvar_re, m)

for (lint, doc, name, default, ty) in m:
c[lint.lower()] = (name, ty, doc, default)

return c


def parseLintDef(level, comment, name):
lint = {}
lint['id'] = name
lint['level'] = level
lint['docs'] = {}

last_section = None

for line in comment:
if len(line.strip()) == 0:
continue

match = re.match(lint_subheadline, line)
if match:
last_section = match.groups()[0]
if match:
text = match.groups()[1]
else:
text = line

if not last_section:
warn("Skipping comment line as it was not preceded by a heading")
debug("in lint `%s`, line `%s`" % name, line)

lint['docs'][last_section] = (lint['docs'].get(last_section, "") + "\n" + text).strip()

return lint


def parse_file(d, f):
last_comment = []
comment = True

with open(f) as rs:
for line in rs:
if comment:
if line.startswith("///"):
if line.startswith("/// "):
last_comment.append(line[4:])
else:
last_comment.append(line[3:])
elif line.startswith("declare_lint!"):
comment = False
deprecated = False
restriction = False
elif line.startswith("declare_restriction_lint!"):
comment = False
deprecated = False
restriction = True
elif line.startswith("declare_deprecated_lint!"):
comment = False
deprecated = True
else:
last_comment = []
if not comment:
l = line.strip()
m = re.search(r"pub\s+([A-Z_][A-Z_0-9]*)", l)

if m:
name = m.group(1).lower()

# Intentionally either a never looping or infinite loop
while not deprecated and not restriction:
m = re.search(level_re, line)
if m:
level = m.group(0)
break

line = next(rs)

if deprecated:
level = "Deprecated"
elif restriction:
level = "Allow"

info("found %s with level %s in %s" % (name, level, f))
d.append(parseLintDef(level, last_comment, name=name))
last_comment = []
comment = True
if "}" in l:
warn("Warning: Missing Lint-Name in", f)
comment = True


def main():
lints = parse_path()
info("got %s lints" % len(lints))

outdir = sys.argv[1] if len(sys.argv) > 1 else "util/gh-pages/lints.json"
with open(outdir, "w") as file:
json.dump(lints, file, indent=2)
info("wrote JSON for great justice")

if __name__ == "__main__":
main()
Loading

0 comments on commit 8383e56

Please sign in to comment.