From 2ef8997fe939afdfd7c2c09c393a3073897633bd Mon Sep 17 00:00:00 2001 From: Dan Vanderkam Date: Sun, 22 Mar 2015 10:31:00 -0400 Subject: [PATCH] move scripts into subdir --- check-combined-unaffected.sh | 15 --- generate-documentation.py | 219 -------------------------------------- generate-download.py | 90 ---------------- generate-jsdoc.sh | 19 ---- push-to-web.sh | 46 -------- release.sh | 85 --------------- scripts/generate-documentation.py | 219 ++++++++++++++++++++++++++++++++++++++ scripts/generate-download.py | 90 ++++++++++++++++ scripts/generate-jsdoc.sh | 19 ++++ scripts/push-to-web.sh | 46 ++++++++ scripts/release.sh | 85 +++++++++++++++ test.sh | 24 ----- 12 files changed, 459 insertions(+), 498 deletions(-) delete mode 100755 check-combined-unaffected.sh delete mode 100755 generate-documentation.py delete mode 100755 generate-download.py delete mode 100755 generate-jsdoc.sh delete mode 100755 push-to-web.sh delete mode 100755 release.sh create mode 100755 scripts/generate-documentation.py create mode 100755 scripts/generate-download.py create mode 100755 scripts/generate-jsdoc.sh create mode 100755 scripts/push-to-web.sh create mode 100755 scripts/release.sh delete mode 100755 test.sh diff --git a/check-combined-unaffected.sh b/check-combined-unaffected.sh deleted file mode 100755 index de1721e..0000000 --- a/check-combined-unaffected.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# Ensures that dygraph-combined.js is unaffected. -# Helpful for pull requests, where this is a common mistake. - -grep 'var' dygraph-combined.js > /dev/null -if [ $? -eq 0 ]; then - echo 'Please revert changes to dygraph-combined.js' >&2 - echo 'You can do this by running: ' >& 2 - echo '' >& 2 - echo ' git checkout dygraph-combined.js' >&2 - echo '' >& 2 - exit 1 -fi - -exit 0 diff --git a/generate-documentation.py b/generate-documentation.py deleted file mode 100755 index 31781b9..0000000 --- a/generate-documentation.py +++ /dev/null @@ -1,219 +0,0 @@ -#!/usr/bin/env python - -# Generate docs/options.html - -import glob -import json -import os -import re -import sys - -# Set this to the path to a test file to get debug output for just that test -# file. Can be helpful to figure out why a test is not being shown for a -# particular option. -debug_tests = [] # [ 'tests/zoom.html' ] - -# Pull options reference JSON out of dygraph.js -js = '' -in_json = False -for line in file('dygraph-options-reference.js'): - if '' in line: - in_json = True - elif '' in line: - in_json = False - elif in_json: - js += line - -# TODO(danvk): better errors here. -assert js -docs = json.loads(js) - -# Go through the tests and find uses of each option. -for opt in docs: - docs[opt]['tests'] = [] - docs[opt]['gallery'] = [] - -# This is helpful for differentiating uses of options like 'width' and 'height' -# from appearances of identically-named options in CSS. -def find_braces(txt): - """Really primitive method to find text inside of {..} braces. - Doesn't work if there's an unmatched brace in a string, e.g. '{'. """ - out = '' - level = 0 - for char in txt: - if char == '{': - level += 1 - if level >= 1: - out += char - if char == '}': - level -= 1 - return out - -def search_files(type, files): - # Find text followed by a colon. These won't all be options, but those that - # have the same name as a Dygraph option probably will be. - prop_re = re.compile(r'\b([a-zA-Z0-9]+) *:') - for test_file in files: - if os.path.isfile(test_file): # Basically skips directories - text = file(test_file).read() - - # Hack for slipping past gallery demos that have title in their attributes - # so they don't appear as reasons for the demo to have 'title' options. - if type == "gallery": - idx = text.find("function(") - if idx >= 0: - text = text[idx:] - braced_html = find_braces(text) - if debug_tests: - print braced_html - - ms = re.findall(prop_re, braced_html) - for opt in ms: - if debug_tests: print '\n'.join(ms) - if opt in docs and test_file not in docs[opt][type]: - docs[opt][type].append(test_file) - -search_files("tests", glob.glob("tests/*.html")) -search_files("gallery", glob.glob("gallery/*.js")) #TODO add grep "Gallery.register\(" - -if debug_tests: sys.exit(0) - -# Extract a labels list. -labels = [] -for _, opt in docs.iteritems(): - for label in opt['labels']: - if label not in labels: - labels.append(label) - -print """ - - - - - - -""" - -print """ -
-
-
\n\n' - -print """ -
-

Options Reference

-

Dygraphs tries to do a good job of displaying your data without any further configuration. But inevitably, you're going to want to tinker. Dygraphs provides a rich set of options for configuring its display and behavior.

- -

Usage

-

You specify options in the third parameter to the dygraphs constructor:

-
g = new Dygraph(div,
-                data,
-                {
-                  option1: value1,
-                  option2: value2,
-                  ...
-                });
-
- -

After you've created a Dygraph, you can change an option by calling the updateOptions method:

-
g.updateOptions({
-                  new_option1: value1,
-                  new_option2: value2
-                });
-
- -

Some options can be set on a per-axis and per-series basis. See the docs on per-axis and per-series options to learn how to do this. The options which may be set in this way are marked as such on this page.

- -

For options which are functions (e.g. callbacks and formatters), the value of this is set to the Dygraph object.

- -

And, without further ado, here's the complete list of options:

-""" - -def test_name(f): - """Takes 'tests/demo.html' -> 'demo'""" - return f.replace('tests/', '').replace('.html', '') - -def gallery_name(f): - """Takes 'gallery/demo.js' -> 'demo'""" - return f.replace('gallery/', '').replace('.js', '') - -def urlify_gallery(f): - """Takes 'gallery/demo.js' -> 'demo'""" - return f.replace('gallery/', 'gallery/#g/').replace('.js', '') - - -for label in sorted(labels): - print '

%s

\n' % (label, label) - - for opt_name in sorted(docs.keys()): - opt = docs[opt_name] - if label not in opt['labels']: continue - tests = opt['tests'] - if not tests: - examples_html = 'NONE' - else: - examples_html = ' '.join( - '%s' % (f, test_name(f)) for f in tests) - - gallery = opt['gallery'] - if not gallery: - gallery_html = 'NONE' - else: - gallery_html = ' '.join( - '%s' % (urlify_gallery(f), gallery_name(f)) for f in gallery) - - if 'parameters' in opt: - parameters = opt['parameters'] - parameters_html = '\n'.join("%s: %s
" % (p[0], p[1]) for p in parameters) - parameters_html = "\n
\n%s
" % (parameters_html); - else: - parameters_html = '' - - if not opt['type']: opt['type'] = '(missing)' - if not opt['default']: opt['default'] = '(missing)' - if not opt['description']: opt['description'] = '(missing)' - - print """ -
%(name)s - # -
-

%(desc)s

- Type: %(type)s
%(parameters)s - Default: %(default)s

- Gallery Samples: %(gallery_html)s
- Other Examples: %(examples_html)s
-
- """ % { 'name': opt_name, - 'type': opt['type'], - 'parameters': parameters_html, - 'default': opt['default'], - 'desc': opt['description'], - 'examples_html': examples_html, - 'gallery_html': gallery_html} - - -print """ -

Point Properties

-Some callbacks take a point argument. Its properties are:
- -
- - -""" - -# This page was super-helpful: -# http://jsbeautifier.org/ diff --git a/generate-download.py b/generate-download.py deleted file mode 100755 index 2d2dd48..0000000 --- a/generate-download.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python - -# Generates docs/download.html -# Run: -# ./generate-download.py > docs/download.html - -import json - -releases = json.load(file('releases.json')) - -def file_links(release): - v = release['version'] - return ['%(f)s' % { - 'f': f, 'v': v} for f in release['files']] - - -# Validation of releases.json -for idx, release in enumerate(releases): - if idx == 0: continue - assert 'version' in release, 'Release missing version: %s' % release - assert 'files' in release, 'Release missing files: %s' % release - assert release['version'] < releases[idx - 1]['version'], ( - 'Releases should be in reverse chronological order in releases.json') - -current_html = '

' + ('

'.join(file_links(releases[0]))) + '

' - - -previous_lis = [] -for release in releases[1:]: - previous_lis.append('
  • %(v)s: %(files)s (%(v)s docs)' % { - 'v': release['version'], - 'files': ', '.join(file_links(release)) - }) - - -print ''' - - - - - -

    The current version of dygraphs is %(version)s. Most users will want to download minified files for this version:

    - -
    -%(current_html)s -
    - -

    There's a hosted version of dygraphs on cdnjs.com:

    - -
    <script src="//cdnjs.cloudflare.com/ajax/libs/dygraph/%(version)s/dygraph-combined.js"></script>
    - -

    You can install dygraphs using NPM or Bower.

    - -

    To install using NPM:

    -
    $ npm install dygraphs
    -# dygraphs is now in node_modules/dygraphs/dygraph-combined.js
    - -

    To install using bower:

    -
    $ bower install dygraphs
    -# dygraphs is now in bower_components/dygraphs/dygraph-combined.js
    - -

    Most distributions include a source map. For non-concatenated JS, see dygraph-dev.js on github. - -

    To generate your own minified JS, run:

    - -
    git clone https://github.com/danvk/dygraphs.git
    -./generate-combined.sh
    -
    - -

    This will create a dygraph.min.js file in the dygraphs directory.

    - -

    You may also download files for previously-released versions:

    - - - -

    See Version History for more information on each release.

    - - - -''' % { - 'version': releases[0]['version'], - 'current_html': current_html, - 'previous_lis': '\n'.join(previous_lis) - } diff --git a/generate-jsdoc.sh b/generate-jsdoc.sh deleted file mode 100755 index 6512fb0..0000000 --- a/generate-jsdoc.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# -# Generates JSDoc in the /jsdoc dir. Clears any existing jsdoc there. - -rm -rf jsdoc -echo Generating JSDoc... -java -jar jsdoc-toolkit/jsrun.jar \ - jsdoc-toolkit/app/run.js \ - -d=jsdoc -t=jsdoc-toolkit/templates/jsdoc \ - dygraph.js \ -| tee /tmp/dygraphs-jsdocerrors.txt - -if [ -s /tmp/dygraphs-jsdocerrors.txt ]; then - echo Please fix any jsdoc errors/warnings before sending patches. -fi - -chmod -R a+rX jsdoc - -echo Done diff --git a/push-to-web.sh b/push-to-web.sh deleted file mode 100755 index 0ea59ac..0000000 --- a/push-to-web.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash -# This script generates the combined JS file, pushes all content to a web site -# and then reverts the combined file. - -if [ "$1" == "" ] ; then - echo "usage: $0 destination" - exit 1 -fi - -set -x -site=$1 - -# Produce dygraph-combined.js and dygraph-combined-dev.js -./generate-combined.sh -./generate-combined.sh cat-dev > dygraph-combined-dev.js - -# Generate documentation. -./generate-documentation.py > docs/options.html -chmod a+r docs/options.html -if [ -s docs/options.html ] ; then - ./generate-jsdoc.sh - ./generate-download.py > docs/download.html - - temp_dir=$(mktemp -d /tmp/dygraphs-docs.XXXX) - cd docs - ./ssi_expander.py $temp_dir - cd .. - - # Make sure everything will be readable on the web. - # This is like "chmod -R a+rX", but excludes the .git directory. - find . -path ./.git -prune -o -print | xargs chmod a+rX - - # Copy everything to the site. - rsync -avzr gallery common tests jsdoc experimental plugins datahandler polyfills extras $site \ - && \ - rsync -avzr --copy-links dashed-canvas.js dygraph*.js gadget.xml thumbnail.png screenshot.png $temp_dir/* $site/ -else - echo "generate-documentation.py failed" -fi - -# Revert changes to dygraph-combined.js and docs. -make clean-combined-test -rm dygraph-combined-dev.js -git checkout docs/download.html -rm docs/options.html -rm -rf $temp_dir diff --git a/release.sh b/release.sh deleted file mode 100755 index 21c0c34..0000000 --- a/release.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/bash -# This script "releases" a version of dygraphs. - -if [ $# -ne 1 ]; then - echo "Usage: $0 X.Y.Z" >&2 - exit 1 -fi - -VERSION=$1 -echo $VERSION | egrep '\d+\.\d+\.\d+' > /dev/null -if [ $? -ne 0 ]; then - echo "Version must be of the form 1.2.3 (got '$VERSION')" >&2 - exit 1 -fi - -# Make sure this is being run from a release branch with the correct name. -branch=$(git rev-parse --abbrev-ref HEAD) -if [ $branch != "release-$VERSION" ]; then - echo "Must be on a branch named 'release-$VERSION' (found '$branch')" >&2 - exit 1 -fi - -git status | grep 'working directory clean' > /dev/null -if [ $? -ne 0 ]; then - echo "Must release with a clean working directory. Commit your changes." >&2 - exit 1 -fi - -grep "$VERSION" package.json -if [ $? -ne 0 ]; then - echo "Version in package.json doesn't match command line argument." >&2 - exit 1 -fi - -grep "v$VERSION" bower.json -if [ $? -ne 0 ]; then - echo "Version in bower.json doesn't match command line argument." >&2 - exit 1 -fi - -grep "$VERSION" releases.json -if [ $? -ne 0 ]; then - echo "Version $VERSION does not appear in releases.json." >&2 - exit 1 -fi - -rm dygraph-combined.js # changes to this will make the tests fail. -make lint test test-combined -if [ $? -ne 0 ]; then - echo "Tests failed. Won't release!" >&2 - exit 1 -fi -git reset --hard # make test-combined deletes the source map - -# Push a permanent copy of documentation & generated files to a versioned copy -# of the site. This is where the downloadable files are generated. -# TODO(danvk): make sure this actually generates the downloadable files! -echo "Pushing docs and generated files to dygraphs.com/$VERSION" -./push-to-web.sh dygraphs.com:dygraphs.com/$VERSION -if [ $? -ne 0 ]; then - echo "Push to web failed" >&2 - exit 1 -fi - -# Everything is good. -# Switch to the "releases" branch, merge this change and tag it. -echo "Switching branches to do the release." -git checkout releases -git merge --no-ff $branch - -COMMIT=$(git rev-parse HEAD) -echo "Tagging commit $COMMIT as version $VERSION" -git tag -a "v$VERSION" -m "Release of version $VERSION" -git push --tags - -echo "Release was successful!" -echo "Pushing the new version to dygraphs.com..." -./push-to-web.sh dygraphs.com:dygraphs.com - -echo "Success!\n" -echo "Don't forget to merge changes on this branch back into master:" -echo "git merge --no-ff $branch" - -# Discourage users from working on the "releases" branch. -git checkout master diff --git a/scripts/generate-documentation.py b/scripts/generate-documentation.py new file mode 100755 index 0000000..31781b9 --- /dev/null +++ b/scripts/generate-documentation.py @@ -0,0 +1,219 @@ +#!/usr/bin/env python + +# Generate docs/options.html + +import glob +import json +import os +import re +import sys + +# Set this to the path to a test file to get debug output for just that test +# file. Can be helpful to figure out why a test is not being shown for a +# particular option. +debug_tests = [] # [ 'tests/zoom.html' ] + +# Pull options reference JSON out of dygraph.js +js = '' +in_json = False +for line in file('dygraph-options-reference.js'): + if '' in line: + in_json = True + elif '' in line: + in_json = False + elif in_json: + js += line + +# TODO(danvk): better errors here. +assert js +docs = json.loads(js) + +# Go through the tests and find uses of each option. +for opt in docs: + docs[opt]['tests'] = [] + docs[opt]['gallery'] = [] + +# This is helpful for differentiating uses of options like 'width' and 'height' +# from appearances of identically-named options in CSS. +def find_braces(txt): + """Really primitive method to find text inside of {..} braces. + Doesn't work if there's an unmatched brace in a string, e.g. '{'. """ + out = '' + level = 0 + for char in txt: + if char == '{': + level += 1 + if level >= 1: + out += char + if char == '}': + level -= 1 + return out + +def search_files(type, files): + # Find text followed by a colon. These won't all be options, but those that + # have the same name as a Dygraph option probably will be. + prop_re = re.compile(r'\b([a-zA-Z0-9]+) *:') + for test_file in files: + if os.path.isfile(test_file): # Basically skips directories + text = file(test_file).read() + + # Hack for slipping past gallery demos that have title in their attributes + # so they don't appear as reasons for the demo to have 'title' options. + if type == "gallery": + idx = text.find("function(") + if idx >= 0: + text = text[idx:] + braced_html = find_braces(text) + if debug_tests: + print braced_html + + ms = re.findall(prop_re, braced_html) + for opt in ms: + if debug_tests: print '\n'.join(ms) + if opt in docs and test_file not in docs[opt][type]: + docs[opt][type].append(test_file) + +search_files("tests", glob.glob("tests/*.html")) +search_files("gallery", glob.glob("gallery/*.js")) #TODO add grep "Gallery.register\(" + +if debug_tests: sys.exit(0) + +# Extract a labels list. +labels = [] +for _, opt in docs.iteritems(): + for label in opt['labels']: + if label not in labels: + labels.append(label) + +print """ + + + + + + +""" + +print """ +
    +
    +
    \n\n' + +print """ +
    +

    Options Reference

    +

    Dygraphs tries to do a good job of displaying your data without any further configuration. But inevitably, you're going to want to tinker. Dygraphs provides a rich set of options for configuring its display and behavior.

    + +

    Usage

    +

    You specify options in the third parameter to the dygraphs constructor:

    +
    g = new Dygraph(div,
    +                data,
    +                {
    +                  option1: value1,
    +                  option2: value2,
    +                  ...
    +                });
    +
    + +

    After you've created a Dygraph, you can change an option by calling the updateOptions method:

    +
    g.updateOptions({
    +                  new_option1: value1,
    +                  new_option2: value2
    +                });
    +
    + +

    Some options can be set on a per-axis and per-series basis. See the docs on per-axis and per-series options to learn how to do this. The options which may be set in this way are marked as such on this page.

    + +

    For options which are functions (e.g. callbacks and formatters), the value of this is set to the Dygraph object.

    + +

    And, without further ado, here's the complete list of options:

    +""" + +def test_name(f): + """Takes 'tests/demo.html' -> 'demo'""" + return f.replace('tests/', '').replace('.html', '') + +def gallery_name(f): + """Takes 'gallery/demo.js' -> 'demo'""" + return f.replace('gallery/', '').replace('.js', '') + +def urlify_gallery(f): + """Takes 'gallery/demo.js' -> 'demo'""" + return f.replace('gallery/', 'gallery/#g/').replace('.js', '') + + +for label in sorted(labels): + print '

    %s

    \n' % (label, label) + + for opt_name in sorted(docs.keys()): + opt = docs[opt_name] + if label not in opt['labels']: continue + tests = opt['tests'] + if not tests: + examples_html = 'NONE' + else: + examples_html = ' '.join( + '%s' % (f, test_name(f)) for f in tests) + + gallery = opt['gallery'] + if not gallery: + gallery_html = 'NONE' + else: + gallery_html = ' '.join( + '%s' % (urlify_gallery(f), gallery_name(f)) for f in gallery) + + if 'parameters' in opt: + parameters = opt['parameters'] + parameters_html = '\n'.join("%s: %s
    " % (p[0], p[1]) for p in parameters) + parameters_html = "\n
    \n%s
    " % (parameters_html); + else: + parameters_html = '' + + if not opt['type']: opt['type'] = '(missing)' + if not opt['default']: opt['default'] = '(missing)' + if not opt['description']: opt['description'] = '(missing)' + + print """ +
    %(name)s + # +
    +

    %(desc)s

    + Type: %(type)s
    %(parameters)s + Default: %(default)s

    + Gallery Samples: %(gallery_html)s
    + Other Examples: %(examples_html)s
    +
    + """ % { 'name': opt_name, + 'type': opt['type'], + 'parameters': parameters_html, + 'default': opt['default'], + 'desc': opt['description'], + 'examples_html': examples_html, + 'gallery_html': gallery_html} + + +print """ +

    Point Properties

    +Some callbacks take a point argument. Its properties are:
    +
      +
    • xval/yval: The data coordinates of the point (with dates/times as millis since epoch)
    • +
    • canvasx/canvasy: The canvas coordinates at which the point is drawn.
    • +
    • name: The name of the data series to which the point belongs
    • +
    • idx: The row number of the point in the data set
    • +
    +
    + + +""" + +# This page was super-helpful: +# http://jsbeautifier.org/ diff --git a/scripts/generate-download.py b/scripts/generate-download.py new file mode 100755 index 0000000..2d2dd48 --- /dev/null +++ b/scripts/generate-download.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python + +# Generates docs/download.html +# Run: +# ./generate-download.py > docs/download.html + +import json + +releases = json.load(file('releases.json')) + +def file_links(release): + v = release['version'] + return ['%(f)s' % { + 'f': f, 'v': v} for f in release['files']] + + +# Validation of releases.json +for idx, release in enumerate(releases): + if idx == 0: continue + assert 'version' in release, 'Release missing version: %s' % release + assert 'files' in release, 'Release missing files: %s' % release + assert release['version'] < releases[idx - 1]['version'], ( + 'Releases should be in reverse chronological order in releases.json') + +current_html = '

    ' + ('

    '.join(file_links(releases[0]))) + '

    ' + + +previous_lis = [] +for release in releases[1:]: + previous_lis.append('
  • %(v)s: %(files)s (%(v)s docs)' % { + 'v': release['version'], + 'files': ', '.join(file_links(release)) + }) + + +print ''' + + + + + +

    The current version of dygraphs is %(version)s. Most users will want to download minified files for this version:

    + +
    +%(current_html)s +
    + +

    There's a hosted version of dygraphs on cdnjs.com:

    + +
    <script src="//cdnjs.cloudflare.com/ajax/libs/dygraph/%(version)s/dygraph-combined.js"></script>
    + +

    You can install dygraphs using NPM or Bower.

    + +

    To install using NPM:

    +
    $ npm install dygraphs
    +# dygraphs is now in node_modules/dygraphs/dygraph-combined.js
    + +

    To install using bower:

    +
    $ bower install dygraphs
    +# dygraphs is now in bower_components/dygraphs/dygraph-combined.js
    + +

    Most distributions include a source map. For non-concatenated JS, see dygraph-dev.js on github. + +

    To generate your own minified JS, run:

    + +
    git clone https://github.com/danvk/dygraphs.git
    +./generate-combined.sh
    +
    + +

    This will create a dygraph.min.js file in the dygraphs directory.

    + +

    You may also download files for previously-released versions:

    + + + +

    See Version History for more information on each release.

    + + + +''' % { + 'version': releases[0]['version'], + 'current_html': current_html, + 'previous_lis': '\n'.join(previous_lis) + } diff --git a/scripts/generate-jsdoc.sh b/scripts/generate-jsdoc.sh new file mode 100755 index 0000000..6512fb0 --- /dev/null +++ b/scripts/generate-jsdoc.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# +# Generates JSDoc in the /jsdoc dir. Clears any existing jsdoc there. + +rm -rf jsdoc +echo Generating JSDoc... +java -jar jsdoc-toolkit/jsrun.jar \ + jsdoc-toolkit/app/run.js \ + -d=jsdoc -t=jsdoc-toolkit/templates/jsdoc \ + dygraph.js \ +| tee /tmp/dygraphs-jsdocerrors.txt + +if [ -s /tmp/dygraphs-jsdocerrors.txt ]; then + echo Please fix any jsdoc errors/warnings before sending patches. +fi + +chmod -R a+rX jsdoc + +echo Done diff --git a/scripts/push-to-web.sh b/scripts/push-to-web.sh new file mode 100755 index 0000000..0ea59ac --- /dev/null +++ b/scripts/push-to-web.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# This script generates the combined JS file, pushes all content to a web site +# and then reverts the combined file. + +if [ "$1" == "" ] ; then + echo "usage: $0 destination" + exit 1 +fi + +set -x +site=$1 + +# Produce dygraph-combined.js and dygraph-combined-dev.js +./generate-combined.sh +./generate-combined.sh cat-dev > dygraph-combined-dev.js + +# Generate documentation. +./generate-documentation.py > docs/options.html +chmod a+r docs/options.html +if [ -s docs/options.html ] ; then + ./generate-jsdoc.sh + ./generate-download.py > docs/download.html + + temp_dir=$(mktemp -d /tmp/dygraphs-docs.XXXX) + cd docs + ./ssi_expander.py $temp_dir + cd .. + + # Make sure everything will be readable on the web. + # This is like "chmod -R a+rX", but excludes the .git directory. + find . -path ./.git -prune -o -print | xargs chmod a+rX + + # Copy everything to the site. + rsync -avzr gallery common tests jsdoc experimental plugins datahandler polyfills extras $site \ + && \ + rsync -avzr --copy-links dashed-canvas.js dygraph*.js gadget.xml thumbnail.png screenshot.png $temp_dir/* $site/ +else + echo "generate-documentation.py failed" +fi + +# Revert changes to dygraph-combined.js and docs. +make clean-combined-test +rm dygraph-combined-dev.js +git checkout docs/download.html +rm docs/options.html +rm -rf $temp_dir diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..21c0c34 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,85 @@ +#!/bin/bash +# This script "releases" a version of dygraphs. + +if [ $# -ne 1 ]; then + echo "Usage: $0 X.Y.Z" >&2 + exit 1 +fi + +VERSION=$1 +echo $VERSION | egrep '\d+\.\d+\.\d+' > /dev/null +if [ $? -ne 0 ]; then + echo "Version must be of the form 1.2.3 (got '$VERSION')" >&2 + exit 1 +fi + +# Make sure this is being run from a release branch with the correct name. +branch=$(git rev-parse --abbrev-ref HEAD) +if [ $branch != "release-$VERSION" ]; then + echo "Must be on a branch named 'release-$VERSION' (found '$branch')" >&2 + exit 1 +fi + +git status | grep 'working directory clean' > /dev/null +if [ $? -ne 0 ]; then + echo "Must release with a clean working directory. Commit your changes." >&2 + exit 1 +fi + +grep "$VERSION" package.json +if [ $? -ne 0 ]; then + echo "Version in package.json doesn't match command line argument." >&2 + exit 1 +fi + +grep "v$VERSION" bower.json +if [ $? -ne 0 ]; then + echo "Version in bower.json doesn't match command line argument." >&2 + exit 1 +fi + +grep "$VERSION" releases.json +if [ $? -ne 0 ]; then + echo "Version $VERSION does not appear in releases.json." >&2 + exit 1 +fi + +rm dygraph-combined.js # changes to this will make the tests fail. +make lint test test-combined +if [ $? -ne 0 ]; then + echo "Tests failed. Won't release!" >&2 + exit 1 +fi +git reset --hard # make test-combined deletes the source map + +# Push a permanent copy of documentation & generated files to a versioned copy +# of the site. This is where the downloadable files are generated. +# TODO(danvk): make sure this actually generates the downloadable files! +echo "Pushing docs and generated files to dygraphs.com/$VERSION" +./push-to-web.sh dygraphs.com:dygraphs.com/$VERSION +if [ $? -ne 0 ]; then + echo "Push to web failed" >&2 + exit 1 +fi + +# Everything is good. +# Switch to the "releases" branch, merge this change and tag it. +echo "Switching branches to do the release." +git checkout releases +git merge --no-ff $branch + +COMMIT=$(git rev-parse HEAD) +echo "Tagging commit $COMMIT as version $VERSION" +git tag -a "v$VERSION" -m "Release of version $VERSION" +git push --tags + +echo "Release was successful!" +echo "Pushing the new version to dygraphs.com..." +./push-to-web.sh dygraphs.com:dygraphs.com + +echo "Success!\n" +echo "Don't forget to merge changes on this branch back into master:" +echo "git merge --no-ff $branch" + +# Discourage users from working on the "releases" branch. +git checkout master diff --git a/test.sh b/test.sh deleted file mode 100755 index 3194c72..0000000 --- a/test.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -which phantomjs > /dev/null -if [ $? != 0 ]; then - echo You must install phantomjs to use command-line testing. - echo Visit http://www.phantomjs.org/ to get it. - echo - echo OR open auto_tests/misc/local.html in a browser. - echo OR follow the instructions in auto_tests/README - exit 1 -fi - -# Don't run tests if the documentation doesn't parse. -./generate-documentation.py > /dev/null -if [ $? != 0 ]; then - echo Failed to generate documentation. Fix this before running tests. - exit 1 -fi - -phantomjs phantom-driver.js $* | tee /tmp/test-results.txt -trap "rm -f /tmp/test-results.txt" EXIT -if grep -q 'FAIL' /tmp/test-results.txt; then - echo One or more tests failed. - exit 1 -fi -- 2.7.4