Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Setup gh-pages #1107

Merged
merged 7 commits into from
Jul 19, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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