This repository is now retired
The Release Management Team ceased using this months ago. Its contents are replaced with a retirement notice so that potential users will realize it is no longer maintained. Publicly announced at: http://lists.openstack.org/pipermail/openstack-dev/2018-June/131920.html Change-Id: Ia30884174c43ef1c1afcc1f4a18b3c0051a89d8e Depends-On: https://review.openstack.org/579185
This commit is contained in:
parent
0abf645cc3
commit
39a82df080
60
.gitignore
vendored
60
.gitignore
vendored
@ -1,60 +0,0 @@
|
||||
*.py[cod]
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Packages
|
||||
*.egg
|
||||
.eggs
|
||||
*.egg-info
|
||||
dist
|
||||
build
|
||||
eggs
|
||||
parts
|
||||
bin
|
||||
var
|
||||
sdist
|
||||
develop-eggs
|
||||
.installed.cfg
|
||||
./lib
|
||||
lib64
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
.coverage
|
||||
.tox
|
||||
nosetests.xml
|
||||
.testrepository
|
||||
.venv
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
|
||||
# Mr Developer
|
||||
.mr.developer.cfg
|
||||
.project
|
||||
.pydevproject
|
||||
.idea
|
||||
|
||||
# Complexity
|
||||
output/*.html
|
||||
output/*/index.html
|
||||
|
||||
# Sphinx
|
||||
doc/build
|
||||
|
||||
# pbr generates these
|
||||
AUTHORS
|
||||
ChangeLog
|
||||
|
||||
# Editors
|
||||
*~
|
||||
.*.swp
|
||||
|
||||
# local temporary directory
|
||||
release-tag-*
|
||||
list-unreleased-*
|
||||
feature-branch-*
|
||||
relnotes
|
@ -1,4 +0,0 @@
|
||||
[gerrit]
|
||||
host=review.openstack.org
|
||||
port=29418
|
||||
project=openstack-infra/release-tools.git
|
@ -1,4 +0,0 @@
|
||||
[DEFAULT]
|
||||
test_command=OS_STDOUT_CAPTURE=1 OS_STDERR_CAPTURE=1 OS_TEST_TIMEOUT=60 ${PYTHON:-python} -m subunit.run discover -t ./ . $LISTOPT $IDOPTION
|
||||
test_id_option=--load-list $IDFILE
|
||||
test_list_option=--list
|
176
LICENSE
176
LICENSE
@ -1,176 +0,0 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
925
README.rst
925
README.rst
@ -1,919 +1,10 @@
|
||||
==========================================================================
|
||||
openstack-releasing - A set of scripts to handle OpenStack release process
|
||||
==========================================================================
|
||||
This project is no longer maintained.
|
||||
|
||||
How to Release
|
||||
==============
|
||||
The contents of this repository are still available in the Git
|
||||
source code management system. To see the contents of this
|
||||
repository before it reached its end of life, please check out the
|
||||
previous commit with "git checkout HEAD^1".
|
||||
|
||||
Deliverables should all be using post-versioning, getting their version
|
||||
information from git tags and not having any version specifier in the
|
||||
``setup.cfg``.
|
||||
|
||||
Release requests are filed as patches to deliverables files in
|
||||
the ``openstack/releases`` repository, see the README there for more
|
||||
details.
|
||||
|
||||
Before beginning this process, you need to set up ``gpg`` with a valid
|
||||
key, and authorize launchpad to run the release tools
|
||||
commands. Authorizing launchpad can be tricky on a system that only
|
||||
provides a terminal-based browser, since the launchpad site does not
|
||||
work well with the default configuration of ``lynx`` (cookies and
|
||||
referrer headers need to be enabled for the launchpad site). Newer
|
||||
versions of launchpadlib also rely on keyring, which may require a
|
||||
password for every command being run if you are not in a graphical
|
||||
environment with a better interactive key manager. Talk with dhellmann
|
||||
if you start a release and run into trouble with launchpad auth.
|
||||
|
||||
When a release request is ready to be approved, follow these steps:
|
||||
|
||||
#. The release team member taking responsibility for the
|
||||
release should approve the change in ``openstack/releases``.
|
||||
Release requests should not be approved until we are actually ready
|
||||
to cut the release.
|
||||
|
||||
#. After the release request merges, check out or update a local copy
|
||||
of ``openstack/releases`` to get the new version of the file under
|
||||
the ``deliverables`` directory. Make sure you check out the
|
||||
releases repository to the commit with the new release request you
|
||||
want to process, in case multiple requests merge around the same
|
||||
time. The release tools only look at the most recent commit to
|
||||
detect which deliverable files have changed.
|
||||
|
||||
#. Check out or update a local copy of
|
||||
``openstack-infra/project-config`` repository, which contains the
|
||||
tools for tagging a release.
|
||||
|
||||
#. Change directories to
|
||||
``project-config/jenkins/scripts/release-tools``.
|
||||
|
||||
#. Create or update a virtualenv and install all of the dependencies
|
||||
for the release tools using
|
||||
``openstack-infra/project-config/jenkins/scripts/release-tools/requirements.txt``
|
||||
as the basis.
|
||||
|
||||
For example::
|
||||
|
||||
$ virtualenv .venv
|
||||
$ source .venv/bin/activate
|
||||
$ pip install -U -r requirements.txt
|
||||
|
||||
#. Run ``release_from_yaml.sh``, giving the path to the
|
||||
``openstack/releases`` repository.
|
||||
|
||||
For example::
|
||||
|
||||
$ ./release_from_yaml.sh ~/repos/openstack/releases
|
||||
|
||||
#. As the release script runs, it will prompt you for your GPG key
|
||||
passphrase before adding the tag. This gives you a last chance to
|
||||
review the proposed tag before proceeding. After the tag is created
|
||||
locally and pushed up to the remote server, the script will push
|
||||
comments to closed Launchpad bugs since the previous tag.
|
||||
|
||||
#. Announce the release.
|
||||
|
||||
1. Milestones are manually announced once all projects are done
|
||||
(usually at the closing of the milestone window), using an email
|
||||
recapitulating all projects that did a milestone tag and
|
||||
pointing to milestone tarballs. The process to follow for
|
||||
announcements of releases will be added here soon.
|
||||
|
||||
2. Library and tool releases are announced via one of the OpenStack
|
||||
mailing lists. See the instructions for running announce.sh
|
||||
below.
|
||||
|
||||
|
||||
Prerequisites
|
||||
=============
|
||||
|
||||
The prerequisites for all of the scripts are defined in
|
||||
``requirements.txt``.
|
||||
|
||||
Each shell script should try to create a Python virtualenv to install
|
||||
the packages before running any of the commands written in Python. If
|
||||
you start seeing import errors after updating your sandbox, it is
|
||||
likely that a new dependency was added. Try removing ``.tox/venv`` and
|
||||
running the command again.
|
||||
|
||||
Top-level scripts
|
||||
=================
|
||||
|
||||
The top-level scripts call the various base tools to get their work done.
|
||||
|
||||
.. note::
|
||||
|
||||
The scripts involved in tagging releases have moved from this
|
||||
repository to
|
||||
``openstack-infra/project-config/jenkins/scripts/release-tools``.
|
||||
|
||||
rccut.sh
|
||||
--------
|
||||
|
||||
Final release for pre-versioned components follows a slightly different
|
||||
process. Just before RC1 we need to create a stable/* release branch.
|
||||
rccut.sh creates a stable/$SERIES branch from the specified SHA, and turns
|
||||
all Launchpad bugs for the RC1 milestone to FixReleased (which means
|
||||
"present in the release branch").
|
||||
|
||||
It supports deliverables with multiple repositories, using an additional
|
||||
parameter to point to the main deliverable (in which case it skips Launchpad
|
||||
update). It special-cases oslo-incubator, where it doesn't wait for a tarball
|
||||
to be built.
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
./rccut.sh 7432f32d838ab346c liberty nova
|
||||
|
||||
Create a series/liberty branch for Nova at commit 7432f32d838ab346c, and
|
||||
mark FixCommitted bugs FixReleased, while targeting them to the juno-rc1
|
||||
milestone.
|
||||
|
||||
::
|
||||
|
||||
./rccut.sh 3472368b3a546d liberty neutron-fwaas neutron
|
||||
|
||||
Create a series/liberty branch for neutron-fwaas at commit 3472368b3a546d.
|
||||
|
||||
|
||||
rcdelivery.sh
|
||||
-------------
|
||||
|
||||
This script is used for pre-versioned projects to publish RCs and final
|
||||
release from the stable/$SERIES branch. It applies the RC or final tag,
|
||||
pushes it, waits for the tarball build, and uploads the resulting
|
||||
tarball to Launchpad (while marking it released).
|
||||
|
||||
It supports deliverables with multiple repositories, using an additional
|
||||
parameter to point to the main deliverable (in which case it uploads to the
|
||||
main Launchpad page). It special-cases oslo-incubator, where no tarball is
|
||||
generated or needs to be uploaded.
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
./rcdelivery.sh kilo rc1 cinder
|
||||
|
||||
Push 2015.1.0rc1 tag to current cinder stable/kilo branch HEAD, wait for
|
||||
the tarball build, and upload the resulting tarball to Launchpad (while
|
||||
marking it released).
|
||||
|
||||
::
|
||||
|
||||
./rcdelivery kilo final neutron-fwaas neutron
|
||||
|
||||
Push 2015.1.0 final tag to current neutron-fwaas stable/kilo branch HEAD
|
||||
(which should be the last RC), wait for the tarball build, and upload the
|
||||
resulting tarball to the "neutron" Launchpad page.
|
||||
|
||||
|
||||
release-notes
|
||||
-------------
|
||||
|
||||
This produces a set of release notes intended to be sent as an
|
||||
announcement email when a new library or package is produced. It is
|
||||
more suitable for libraries than for the major projects, because it
|
||||
includes a list of all of the changes and diff-stats output to show
|
||||
which files changed.
|
||||
|
||||
The script parses the README.rst to find a line matching "``Bugs:``",
|
||||
extracts the URL following the colon, and includes that information in
|
||||
the output.
|
||||
|
||||
The bugs URL is converted to a launchpad project URL and combined with
|
||||
the final version number to produce a *milestone* URL.
|
||||
|
||||
The script uses ``python setup.py`` to determine the project name and
|
||||
the one-line description to include in the output text.
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
release-notes ~/repos/openstack/oslo.config 1.7.0 1.8.0
|
||||
|
||||
Print the release notes between versions 1.7.0 and 1.8.0 for the
|
||||
project in the ``~/repos/openstack/oslo.config`` directory.
|
||||
|
||||
::
|
||||
|
||||
release-notes --show-dates --changes-only ~/repos/openstack/oslo.config 1.8.0 HEAD
|
||||
|
||||
Print the list of changes after 1.8.0 for the project in the
|
||||
``~/repos/openstack/oslo.config`` directory, including the date of
|
||||
the change but leaving out the email message boilerplate. This mode
|
||||
is useful for examining the list of unreleased changes in a project
|
||||
to decide if a release is warranted and to pick a version number.
|
||||
|
||||
|
||||
|
||||
launchpad-login
|
||||
---------------
|
||||
|
||||
Test or configure the launchpad credentials. This will set up a
|
||||
keyring entry for the launchpad site, prompt for credentials, and
|
||||
handle the OAuth handshake. All of the other launchpad-connected
|
||||
commands will do these steps, too, but this command takes no other
|
||||
action after logging in so it is safe to run it repeatedly.
|
||||
|
||||
|
||||
check_library_constraints.sh
|
||||
----------------------------
|
||||
|
||||
Script to check the current list of constraints against the most
|
||||
recent release for all of the library projects. This script can be
|
||||
used at any point, but is especially intended to ensure that the
|
||||
constraints for things we release are all updated at the end of a
|
||||
release cycle. To run the script, check out both the release-tools and
|
||||
requirements repositories and then run the script as::
|
||||
|
||||
$ check_library_constraints.sh /path/to/requirements-repository stable/mitaka
|
||||
|
||||
|
||||
milestone-checkup
|
||||
-----------------
|
||||
|
||||
Tool to report on the status of milestone tags for projects using the
|
||||
cycle-with-milestone release model.
|
||||
|
||||
::
|
||||
|
||||
$ milestone-checkup ~/repos/openstack/releases newton 2
|
||||
training-labs (Documentation)
|
||||
did not find /home/dhellmann/repos/openstack/releases/deliverables/newton/training-labs.yaml
|
||||
|
||||
aodh (Telemetry)
|
||||
did not find /home/dhellmann/repos/openstack/releases/deliverables/newton/aodh.yaml
|
||||
|
||||
ceilometer (Telemetry)
|
||||
did not find /home/dhellmann/repos/openstack/releases/deliverables/newton/ceilometer.yaml
|
||||
|
||||
astara (astara)
|
||||
...
|
||||
|
||||
|
||||
Base tools
|
||||
==========
|
||||
|
||||
milestone-close
|
||||
---------------
|
||||
|
||||
Marks a Launchpad milestone as released and sets it inactive so no
|
||||
more bugs or blueprints can be targeted to it.
|
||||
|
||||
Example::
|
||||
|
||||
milestone-close oslotest 1.8.0
|
||||
|
||||
|
||||
milestone-rename
|
||||
----------------
|
||||
|
||||
Renames a Launchpad milestone.
|
||||
|
||||
Example:
|
||||
|
||||
::
|
||||
|
||||
milestone-rename oslo.rootwrap next-juno 1.3.0
|
||||
|
||||
Rename oslo.rootwrap next-juno milestone to 1.3.0.
|
||||
|
||||
|
||||
ms2version.py
|
||||
-------------
|
||||
|
||||
Converts milestone code names (juno-1) to version numbers suitable for tags
|
||||
(2014.2.b1). If used with --onlycheck, only checks that the milestone
|
||||
exists in Launchpad (useful for Swift where the rules are different).
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
./ms2version.py nova kilo-3
|
||||
|
||||
Returns 2015.1.0b3 (after checking that the kilo-3 milestone exists in Nova)
|
||||
|
||||
::
|
||||
|
||||
./ms2version.py swift 2.1.0 --onlycheck
|
||||
|
||||
Exists successfully if there is a 2.1.0 milestone in Swift.
|
||||
|
||||
|
||||
repo_tarball_diff.sh
|
||||
--------------------
|
||||
|
||||
This script fetches a specific branch from a git repository into a temp
|
||||
directory and compares its content with the content of a tarball produced
|
||||
from it (using "python setup.py sdist"). The difference should only contain
|
||||
additional generated files (Changelog, AUTHORS...) and missing ignored
|
||||
files (.gitignore...).
|
||||
|
||||
Example:
|
||||
|
||||
::
|
||||
|
||||
./repo_tarball_diff.sh nova master
|
||||
|
||||
Check the difference between Nova master branch contant and a tarball
|
||||
that would be generated from it.
|
||||
|
||||
compare_tarball_diff.sh
|
||||
-----------------------
|
||||
|
||||
Download published tarballs and compare them against what is produced
|
||||
by running the sdist command locally. This can be used to verify that
|
||||
a tarball published for download was built correctly and has not been
|
||||
modified.
|
||||
|
||||
Example:
|
||||
|
||||
::
|
||||
|
||||
./compare_tarball_diff.sh openstack/nova 13.0.0
|
||||
|
||||
validate_tarballs.sh
|
||||
--------------------
|
||||
|
||||
Given a release series, download and validate all of the tarballs to
|
||||
ensure that they match what was tagged.
|
||||
|
||||
Example:
|
||||
|
||||
::
|
||||
|
||||
./validate_tarballs.sh ~/repos/openstack/releases mitaka
|
||||
|
||||
pre_expire.py
|
||||
-------------
|
||||
|
||||
This script fetches opened bugs for a project in order to prepare bugs with no
|
||||
activity in the last D days for expiration by:
|
||||
- unsetting bug assignee
|
||||
- unsetting bug milestone
|
||||
- setting bug status to Incomplete
|
||||
- adding a comment explaining why we updated the bug
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
./pre_expire_bugs.py neutron --days 180
|
||||
|
||||
Prepare for expiration neutron bugs with no activity not updated in the last
|
||||
180 days.
|
||||
|
||||
::
|
||||
|
||||
./pre_expire_bugs.py glance --days 365 --test
|
||||
|
||||
Test prepare for expiration on Launchpad Staging servers.
|
||||
|
||||
::
|
||||
|
||||
./pre_expire_bugs.py glance --days 365 --dry-run
|
||||
|
||||
Prepare for expiration dry-run: print actions without executing them.
|
||||
|
||||
|
||||
expire_old_bug_reports.py
|
||||
-------------------------
|
||||
|
||||
Closes *Launchpad* bug reports which are older than the oldest stable release
|
||||
(usually 18 months, see ``DAYS_SINCE_CREATED``). It ignores bug reports which:
|
||||
* have a special comment (see constant ``STILL_VALID_FLAG``).
|
||||
* have the status ``In Progress``
|
||||
* have the importance ``Wishlist``
|
||||
By default it uses a *dry-run* to not accidentally close bug reports. You
|
||||
have to use a flag to make it a real execution.
|
||||
|
||||
Closed bug reports will have:
|
||||
* status = ``Won't Fix``
|
||||
* assignee = ``None``
|
||||
* importance = ``Undecided``
|
||||
* a comment which explains *why* this was done.
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
./expire_old_bug_reports.py nova --verbose
|
||||
|
||||
Show which bug reports of *Nova* **would be** expired (a dry-run is the
|
||||
default).
|
||||
|
||||
::
|
||||
|
||||
./expire_old_bug_reports.py nova --no-dry-run
|
||||
|
||||
Actually expire old bug reports of *Nova*.
|
||||
|
||||
::
|
||||
|
||||
./expire_old_bug_reports.py nova --no-dry-run --credentials-file cred.txt
|
||||
|
||||
Use a credentials file to expire bug reports (see `launchpad-login`_).
|
||||
|
||||
::
|
||||
|
||||
export LP_CREDS_FILE=path/to/my/lp/credentials/files/cred.txt
|
||||
./expire_old_bug_reports.py nova --no-dry-run
|
||||
|
||||
Use an environment variable to access the credentials file instead of the
|
||||
``--credentials-file`` flag.
|
||||
|
||||
|
||||
process_bugs.py
|
||||
---------------
|
||||
|
||||
This script fetches bugs for a project (by default all "FixCommitted" bugs,
|
||||
or all open bugs targeted to a given milestone if you pass the --milestone
|
||||
argument) and sets a milestone target for them (--settarget) and/or sets their
|
||||
status to "Fix Released" (--fixrelease).
|
||||
|
||||
It ignores bugs that have already a milestone set, if that milestone does
|
||||
not match the one in --settarget.
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
./process_bugs.py nova --settarget=grizzly-3 --fixrelease
|
||||
|
||||
Sets the target for all Nova FixCommitted bugs to grizzly-3 and mark
|
||||
them 'Fix Released'.
|
||||
|
||||
::
|
||||
|
||||
./process_bugs.py glance --settarget=grizzly-2 --status='Fix Released' --test
|
||||
|
||||
Test setting the target for all untargeted Glance FixReleased bugs to
|
||||
grizzly-2 on Launchpad Staging servers.
|
||||
|
||||
::
|
||||
|
||||
./process_bugs.py neutron --milestone juno-3 --settarget juno-rc1
|
||||
|
||||
Move all juno-3 open bugs from juno-3 to juno-rc1 milestone.
|
||||
|
||||
|
||||
wait_for_tarball.py
|
||||
-------------------
|
||||
|
||||
This script queries Jenkins tarball-building jobs to find either a job
|
||||
matching the provided --mpsha SHA building milestone-proposed.tar.gz,
|
||||
or a job matching the provided --tag. It then waits for that job completion
|
||||
and reports the built tarball name.
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
./wait_for_tarball.py cinder --mpsha=59089e56f674f5f94f67c5986e9a616bb669d846
|
||||
|
||||
Looks for a cinder-branch-tarball job matching SHA 59089e... which would
|
||||
produce a milestone-proposed.tar.gz tarball, and waits for completion
|
||||
|
||||
::
|
||||
|
||||
./wait_for_tarball.py cinder --tag=2013.1.1
|
||||
|
||||
Looks for a cinder-tarball job for tag "2013.1.1" and waits for completion.
|
||||
|
||||
|
||||
upload_release.py
|
||||
-----------------
|
||||
|
||||
This script grabs a tarball from tarballs.openstack.org and uploads it
|
||||
to Launchpad, marking the milestone released and inactive in the process.
|
||||
If used with the --nop argument, it will only mark the milestone released and
|
||||
inactive (this is used for projects like oslo-incubator which do not release
|
||||
source code).
|
||||
|
||||
The script prompts you to confirm that the tarball looks like the one you
|
||||
intend to release, and to sign the tarball upload.
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
./upload_release.py nova 2015.1.0 --milestone=kilo-3
|
||||
|
||||
Uploads Nova's nova-2015.1.0b3.tar.gz to the kilo-3 milestone page.
|
||||
|
||||
::
|
||||
|
||||
./upload_release.py glance 2015.1.0 --test
|
||||
|
||||
Uploads Glance's glance-2015.1.0.tar.gz to the final "2015.1.0" milestone
|
||||
as glance-2015.1.0.tar.gz, on Launchpad staging server
|
||||
|
||||
::
|
||||
|
||||
./upload_release.py cinder 2012.2.3 --tarball=stable-folsom
|
||||
|
||||
Uploads Cinder's current cinder-stable-folsom.tar.gz to the 2012.2.3
|
||||
milestone as cinder-2012.2.3.tar.gz
|
||||
|
||||
|
||||
consolidate_release_page.py
|
||||
---------------------------
|
||||
|
||||
This script moves blueprints and bugs from interim milestones to the final
|
||||
release milestone page, in order to show all bugs and features fixed during
|
||||
the cycle. For Swift, this will only move X-rc* bugs and blueprints to
|
||||
final X release.
|
||||
|
||||
The --copytask mode is an experimental variant where a series bugtask is
|
||||
created and the release milestone is set on that bugtask, preserving the
|
||||
information from the "development" bugtask (and the milestone the bug was
|
||||
fixed in).
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
./consolidate_release_page.py cinder kilo 2015.1.0
|
||||
|
||||
Moves Cinder blueprints and bugs from intermediary kilo milestones
|
||||
to the final 2015.1 milestone page.
|
||||
|
||||
::
|
||||
|
||||
./consolidate_release_page.py --test swift grizzly 1.8.0
|
||||
|
||||
Moves Swift 1.8.0-rc* blueprints and bugs to the final 1.8.0 page, on
|
||||
Launchpad staging server
|
||||
|
||||
::
|
||||
|
||||
./consolidate_release_page.py --copytask glance kilo 2015.1.0
|
||||
|
||||
Moves Glance blueprints from intermediary kilo milestones to the final
|
||||
2015.1.0 milestone page. Creates kilo series task for all grizzly bugs
|
||||
and sets the milestone for those to 2015.1.0.
|
||||
|
||||
|
||||
milestones-create
|
||||
-----------------
|
||||
|
||||
This script lets you create milestones in Launchpad in bulk. It is given a
|
||||
YAML description of the milestone dates and the projects to add milestones
|
||||
to. The script is idempotent and can safely be run multiple times. See
|
||||
create_milestones.sample.yaml for an example configuration file.
|
||||
|
||||
Example::
|
||||
|
||||
milestones-create havana.yaml
|
||||
|
||||
|
||||
milestone-ensure
|
||||
----------------
|
||||
|
||||
This script lets you create one series and milestone in Launchpad. The
|
||||
script is idempotent and can safely be run multiple times.
|
||||
|
||||
Example::
|
||||
|
||||
milestone-ensure oslo.config liberty next-liberty
|
||||
|
||||
|
||||
spec2bp.py
|
||||
----------
|
||||
|
||||
This experimental script facilitates setting blueprint fields for approved
|
||||
specs. It takes the project and blueprint name as arguments. For specs that
|
||||
are still under review (--in-review) it will set them to "Blocked" (and
|
||||
definition status to Review). For approved specs it will set definition
|
||||
status to Approved, and set Spec URL. In both cases it will set the target
|
||||
milestone, approver name and specified priority (by default, 'Low').
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
./spec2bp.py glance super-spec --milestone=juno-2 --priority=Medium
|
||||
|
||||
Glance's super-spec.rst was approved and you want to add it to juno-2,
|
||||
with Medium priority. This will do it all for you.
|
||||
|
||||
::
|
||||
|
||||
./spec2bp.py nova --specpath=specs/kilo/approved/my-awesome-spec.rst
|
||||
--in-review --milestone=juno-2
|
||||
|
||||
Nova's my-awesome-spec.rst is still under review, but you would like to
|
||||
add the my-awesome-spec blueprint to juno-2 (marked Blocked). Since it's
|
||||
located in a non-standard path, we specify it using --specpath parameter.
|
||||
|
||||
::
|
||||
|
||||
./spec2bp.py nova my-awesome-spec --priority=High
|
||||
|
||||
my-awesome-spec is now approved. You want to flip all the approval bits,
|
||||
but also change its priority to High. There is no need to pass --specpath
|
||||
again, spec2bp will infer it from the blueprint URL field.
|
||||
|
||||
|
||||
stable_freeze.py
|
||||
----------------
|
||||
|
||||
A script that can be used to quickly "freeze" all open reviews to a stable
|
||||
branch. It may also be used to "thaw" frozen reviews upon re-opening of
|
||||
the branch for merges. Reviews are frozen by adding a -2 and thawed by
|
||||
reverting that and adding a 0.
|
||||
|
||||
Examples:
|
||||
|
||||
To view open reviews for stable/icehouse 2014.1.4:
|
||||
|
||||
::
|
||||
|
||||
./stable_freeze.py -r 2014.1.4 query
|
||||
|
||||
View open reviews for stable/icehouse 2014.1.4.
|
||||
|
||||
::
|
||||
|
||||
./stable_freeze.py -r 2014.1.4 -o ~/openstack/2014.1.4-freeze.txt
|
||||
|
||||
Freeze all open reviews proposed to stable/icehouse. 2014.1.4-freeze.txt will
|
||||
contain all frozen reviews and this can be used to thaw later on.
|
||||
|
||||
::
|
||||
|
||||
./stable_freeze -r 2014.1.4 -i ~/openstack/2014.1.4-freeze.txt thaw
|
||||
|
||||
Thaw all reviews previously frozen and stored in 2014.1.4-freeze.txt.
|
||||
|
||||
::
|
||||
|
||||
./stable_freeze -r 2014.1.4 -i ~/openstack/2014.1.4-freeze.txt \
|
||||
-c 123777 -c 123778 freeze
|
||||
|
||||
Freeze individual changes that have been proposed after the stable freeze
|
||||
period started. References to these reviews will be appended to
|
||||
2014.1.4-freeze.txt to be unfrozen later on.
|
||||
|
||||
autokick.py
|
||||
-----------
|
||||
|
||||
A script to periodically clean up blueprints (adjusting series goal based on
|
||||
target milestone, and optionally kicking unpriotized blueprints from the
|
||||
milestone. ttx is running it in a cron so you don't have to.
|
||||
|
||||
Examples:
|
||||
|
||||
To clean up Nova kilo blueprints::
|
||||
|
||||
./autokick.py nova kilo
|
||||
|
||||
|
||||
translation-cleanup.sh
|
||||
----------------------
|
||||
|
||||
A script to cleanup translations for a release. It updates all
|
||||
translation source files, downloads translation files and removes
|
||||
translation files that are not sufficiently translated. It results in
|
||||
a change that then needs to get reviewed and send to gerrits.
|
||||
|
||||
Examples:
|
||||
|
||||
To generate a cleanup patch for nova::
|
||||
|
||||
./translation-cleanup.sh kilo nova
|
||||
|
||||
|
||||
adjust_blueprints.py
|
||||
--------------------
|
||||
|
||||
Run around milestone release time, this script retrieves and parses the list
|
||||
of blueprints for a given project and:
|
||||
|
||||
* sets the milestone target and series goal on recently-implemented blueprints
|
||||
|
||||
* removes the milestone target on incomplete milestone-targeted blueprints
|
||||
|
||||
Examples:
|
||||
|
||||
::
|
||||
|
||||
./adjust_blueprints.py nova liberty-1
|
||||
|
||||
Displays proposed adjustments around Nova liberty-1 blueprints.
|
||||
|
||||
::
|
||||
|
||||
./adjust_blueprints.py nova liberty-1 --target --clean
|
||||
|
||||
Targets missing implemented blueprints and cleans incomplete ones for Nova
|
||||
in liberty-1.
|
||||
|
||||
|
||||
add-comment
|
||||
-----------
|
||||
|
||||
Add a comment to a set of Launchpad bugs. This command requires basic
|
||||
Launchpad credentials (see launchpad-login).
|
||||
|
||||
Example::
|
||||
|
||||
add-comment --subject='Winner' --content='You won!' 1000000 2000000
|
||||
|
||||
Add a 'You won!' comment (with subject line 'Winner') to Launchpad
|
||||
bugs #1000000 and #2000000
|
||||
|
||||
|
||||
update_reviews
|
||||
--------------
|
||||
|
||||
Lift your -2 reviews from a project. Use this after the stable branch has been
|
||||
created and the project is ready for accept new features.
|
||||
|
||||
This tool uses the Gerrit REST API. So you need to provide your username and
|
||||
password somehow. You probably already have a .gertty.yaml, if not make one.
|
||||
|
||||
Example::
|
||||
|
||||
update_reviews oslo.config
|
||||
|
||||
The tool looks for all of the changes in the project that you have a -2 vote on
|
||||
and changes your vote to 0, with the message "This project is now open for new
|
||||
features."
|
||||
|
||||
|
||||
bugs-fixed-since.py
|
||||
-------------------
|
||||
|
||||
List Launchpad bugs mentioned in master commit messages starting from a specified commit.
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py -r ../neutron --start=8.0.0
|
||||
|
||||
Use ``--stop`` option to list bugs mentioned in stable branch messages stopping
|
||||
from a specified commit.
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py -B -r ../neutron --start=8.0.0 --stop=origin/stable/mitaka
|
||||
|
||||
Use ``-B`` option to ignore patches that were already backported into all
|
||||
stable branches.
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py -B -r ../neutron --start=8.0.0
|
||||
|
||||
Use ``-e`` option to ignore patches that don't apply cleanly to one of stable
|
||||
branches.
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py -e -r ../neutron --start=8.0.0
|
||||
|
||||
Use ``-sb`` option to also include StoryBoard bugs
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py -sb -r ../octavia --start=1.0.0
|
||||
|
||||
|
||||
lp-filter-bugs-by-importance.py
|
||||
-------------------------------
|
||||
|
||||
Reads the list of Launchpad bug numbers on stdin and filters out those of
|
||||
importance specified. Filtering out Wishlist bugs if importance not specified.
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py [...] --start=8.0.0 | \
|
||||
./lp-filter-bugs-by-importance.py neutron
|
||||
|
||||
List bugs that are fixed in master since 8.0.0 that are not of Wishlist
|
||||
importance.
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py --start=8.0.0 | \
|
||||
./lp-filter-bugs-by-importance.py neutron | \
|
||||
./lp-filter-bugs-by-importance.py neutron --importance Low
|
||||
|
||||
List bugs that are fixed in master since 8.0.0 that are not of Wishlist or Low
|
||||
importance.
|
||||
|
||||
|
||||
lp-filter-bugs-by-tag.py
|
||||
------------------------
|
||||
|
||||
Reads the list of Launchpad bug numbers on stdin and filters out those with
|
||||
a tag specified.
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py [...] --start=8.0.0 | \
|
||||
./lp-filter-bugs-by-tag.py neutron --tag in-stable-mitaka
|
||||
|
||||
List bugs that are fixed in master since 8.0.0 that don't have relevant fixes
|
||||
merged in stable/mitaka.
|
||||
|
||||
|
||||
annotate-lp-bugs.py
|
||||
-------------------
|
||||
|
||||
Reads the list of Launchpad bug numbers on stdin and writes out a nice and
|
||||
detailed description for each of them.
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py [...] --start=8.0.0 | ./annotate-lp-bugs.py neutron
|
||||
|
||||
Pull in detailed description for bugs that are fixed in master since 8.0.0.
|
||||
|
||||
|
||||
lp-reset-backport-potential.py
|
||||
------------------------------
|
||||
|
||||
Clean up <*>-backport-potential tags for bugs with in-stable-<*> tag set.
|
||||
|
||||
Example::
|
||||
|
||||
./lp-reset-backport-potential.py neutron python-neutronclient
|
||||
|
||||
|
||||
lp-tag.py
|
||||
---------
|
||||
|
||||
Append a tag to bugs specified on stdin.
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py [...] --start=8.0.0 | ./lp-tag.py foo-tag
|
||||
|
||||
This command will add the 'foo-tag' tag to all bugs fixed since 8.0.0.
|
||||
|
||||
|
||||
sb-filter-stories-by-tag.py
|
||||
---------------------------
|
||||
|
||||
Reads the list of StoryBoard story numbers on stdin, filters out stories
|
||||
matching a tag.
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py [...] -sb --start=1.0.0 | \
|
||||
./sb-filter-stories-by-tag.py in-stable-pike
|
||||
|
||||
List stories fixed in master since 1.0.0 that do not have relevant fixes merged
|
||||
in stable/pike.
|
||||
|
||||
|
||||
sb-tag.py
|
||||
---------
|
||||
|
||||
Appends a tag to stories specified on stdin.
|
||||
|
||||
Example::
|
||||
|
||||
./bugs-fixed-since.py [...] -sb --start=1.0.0 | \
|
||||
./sb-tag.py foo-tag
|
||||
|
||||
This command will add the 'foo-tag' tag to all stories fixed since 1.0.0.
|
||||
|
||||
End of Life
|
||||
===========
|
||||
|
||||
The ``eol_branch.sh`` script is provided to end-of-life branches. It
|
||||
will abandon any changes on the to-be-removed branch, create a
|
||||
``branch-eol`` tag at the current branch ``HEAD`` and then remove the
|
||||
branch.
|
||||
|
||||
To run the script, ensure you are either in the "Release Managers"
|
||||
group or a gerrit admin. add yourself to "Project Bootstrappers"
|
||||
temporarily in ``review.openstack.org`` (note: this is a gerrit
|
||||
limitation with branch deletion permissions. This may not be required
|
||||
in the future). Be careful and remember to remove yourself at the end
|
||||
to avoid accidental changes.
|
||||
|
||||
Usually the release team will have provided the branches to remove
|
||||
grouped by project in an easy to use format. The command goes
|
||||
something like::
|
||||
|
||||
eol_branch.sh -- stable/oldbranch oldbranch-eol openstack/project1 openstack/python-project1
|
||||
|
||||
It's usually best to run under ``screen`` and save the log file in
|
||||
case of unintended consequences.
|
||||
|
||||
gpg tips
|
||||
--------
|
||||
|
||||
Tags will be signed, so ensure ``gpg`` is setup correctly for password
|
||||
caching or you will have to type your password a lot. ``gpg2`` has
|
||||
better support for ``gpg-agent``, so ``git config --global gpg.program
|
||||
gpg2`` will probably just "do the right thing" (note if you're
|
||||
migrating from ``gpg``, you may need to import your keys with
|
||||
``gpg2 --import < ~/.gnupg/secreing.gpg``).
|
||||
For any further questions, please email
|
||||
openstack-dev@lists.openstack.org or join #openstack-release on
|
||||
Freenode.
|
||||
|
@ -1,101 +0,0 @@
|
||||
# Copyright 2015 Thierry Carrez <thierry@openstack.org>
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
import datetime
|
||||
import sys
|
||||
|
||||
import launchpadlib.launchpad
|
||||
import pytz
|
||||
|
||||
# Parameters
|
||||
parser = argparse.ArgumentParser(description="Update BPs on milestone closure")
|
||||
parser.add_argument('project', help='The project to act on')
|
||||
parser.add_argument('milestone', help='The milestone to set')
|
||||
parser.add_argument("--target", action='store_true',
|
||||
help='Set target and/or series goal for implemented BPs')
|
||||
parser.add_argument("--clear", action='store_true',
|
||||
help='Clear milestone from incomplete blueprints')
|
||||
parser.add_argument("--test", action='store_const', const='staging',
|
||||
default='production', help='Use LP staging server to test')
|
||||
args = parser.parse_args()
|
||||
|
||||
# Connect to Launchpad
|
||||
print("Connecting to Launchpad...")
|
||||
launchpad = launchpadlib.launchpad.Launchpad.login_with('openstack-releasing',
|
||||
args.test, version='devel')
|
||||
|
||||
project = launchpad.projects[args.project]
|
||||
milestone = project.getMilestone(name=args.milestone)
|
||||
if not milestone:
|
||||
parser.error('Target milestone %s does not exist' % args.milestone)
|
||||
series = milestone.series_target
|
||||
|
||||
# Get the blueprints
|
||||
print("Retrieving blueprints...")
|
||||
now = datetime.datetime.now(tz=pytz.utc)
|
||||
to_clear = []
|
||||
to_series = []
|
||||
to_target = []
|
||||
count = 0
|
||||
bps = project.all_specifications
|
||||
numbps = len(bps)
|
||||
# Also get the series-targeted approved blueprints
|
||||
seriesbps = series.valid_specifications
|
||||
print("retrieved %d blueprints" % numbps)
|
||||
|
||||
# Parse the blueprints
|
||||
print("Parsing blueprints...")
|
||||
for bp in bps:
|
||||
count = count + 1
|
||||
sys.stdout.write("\r%d%%" % int(count * 100 / numbps))
|
||||
sys.stdout.flush()
|
||||
if ((bp.implementation_status == 'Implemented') and
|
||||
((now - bp.date_completed) < datetime.timedelta(days=92)) and
|
||||
(not bp.milestone or not bp.milestone.date_targeted or
|
||||
bp.milestone.date_targeted >= milestone.date_targeted)):
|
||||
if bp not in seriesbps:
|
||||
to_series.append(bp)
|
||||
if bp.milestone != milestone:
|
||||
to_target.append(bp)
|
||||
elif not bp.is_complete and bp.milestone == milestone:
|
||||
to_clear.append(bp)
|
||||
print()
|
||||
if (to_target):
|
||||
print()
|
||||
print("Those are implemented: need milestone target added")
|
||||
for bp in to_target:
|
||||
print(bp.web_link)
|
||||
if args.target:
|
||||
bp.milestone = milestone
|
||||
bp.lp_save()
|
||||
|
||||
if (to_series):
|
||||
print()
|
||||
print("Those are implemented: need series goal added/approved")
|
||||
for bp in to_series:
|
||||
print(bp.web_link)
|
||||
if args.target:
|
||||
bp.proposeGoal(goal=series)
|
||||
|
||||
if (to_clear):
|
||||
print()
|
||||
print("Those are incomplete: need their milestone target cleared")
|
||||
for bp in to_clear:
|
||||
print(bp.web_link)
|
||||
if args.clear:
|
||||
bp.milestone = None
|
||||
bp.lp_save()
|
@ -1,63 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
"""
|
||||
This tool will transform bug numbers into proper Launchpad links.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
from launchpadlib.launchpad import Launchpad
|
||||
|
||||
|
||||
def _parse_args():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Dump useful bug info.')
|
||||
parser.add_argument(
|
||||
'project', help='Launchpad project name')
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def _annotate_bug(lp, project, bugnum):
|
||||
bug = lp.bugs[bugnum]
|
||||
for task in bug.bug_tasks:
|
||||
if task.bug_target_name == project:
|
||||
break
|
||||
else:
|
||||
return
|
||||
|
||||
assignee = task.assignee.name if task.assignee else 'Unassigned'
|
||||
print(
|
||||
'%(url)s "%(title)s" (%(importance)s,%(status)s) [%(tags)s] [%(assignee)s]' %
|
||||
{'url': 'https://bugs.launchpad.net/bugs/%s' % bugnum,
|
||||
'title': bug.title,
|
||||
'importance': task.importance,
|
||||
'status': task.status,
|
||||
'tags': ','.join(bug.tags),
|
||||
'assignee': assignee})
|
||||
|
||||
|
||||
def main():
|
||||
args = _parse_args()
|
||||
|
||||
lp = Launchpad.login_with('openstack-releasing', 'production')
|
||||
|
||||
for line in sys.stdin.readlines():
|
||||
bugnum = line.strip()
|
||||
_annotate_bug(lp, args.project, bugnum)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
109
autokick.py
109
autokick.py
@ -1,109 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
#
|
||||
# Script to automatically adjust series goal based on target milestone
|
||||
# in Launchpad blueprints, and possibly remove unprioritized blueprints
|
||||
#
|
||||
# Copyright 2013 Thierry Carrez <thierry@openstack.org>
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
import launchpadlib.launchpad
|
||||
|
||||
# Parse arguments
|
||||
parser = argparse.ArgumentParser(description="Adjust blueprint series goal/milestones")
|
||||
parser.add_argument('projectname', help='Project or projectgroup to act on')
|
||||
parser.add_argument('seriesname', help='Series to act on')
|
||||
parser.add_argument('--nokick', action='store_true',
|
||||
help='Do not kick unprioritized BPs out of milestones')
|
||||
parser.add_argument('--dryrun', action='store_true',
|
||||
help='Just show what would be done')
|
||||
args = parser.parse_args()
|
||||
|
||||
kickmessage = ("You should not set a milestone target unless the blueprint"
|
||||
" has been properly prioritized by the project drivers.")
|
||||
|
||||
# Log into LP
|
||||
lp = launchpadlib.launchpad.Launchpad.login_with('adjust-series-goal', 'production', version='devel')
|
||||
|
||||
try:
|
||||
projectgroup = lp.project_groups[args.projectname]
|
||||
projects = projectgroup.projects
|
||||
except (KeyError, AttributeError):
|
||||
try:
|
||||
projects = [lp.projects[args.projectname], ]
|
||||
except KeyError:
|
||||
print("%s: no such project or projectgroup" % args.projectname)
|
||||
sys.exit(1)
|
||||
|
||||
for project in projects:
|
||||
print("== %s ==" % project.name)
|
||||
series = project.getSeries(name=args.seriesname)
|
||||
|
||||
# Get the milestones for the series
|
||||
milestones = []
|
||||
try:
|
||||
active_milestones = series.active_milestones_collection
|
||||
except AttributeError:
|
||||
print("No milestone in series %s for %s, skipping" %
|
||||
(args.seriesname, project.name))
|
||||
continue
|
||||
for ms in series.active_milestones_collection:
|
||||
milestones.append(ms)
|
||||
|
||||
# Get the blueprints with seriesgoal set
|
||||
accepted = series.valid_specifications
|
||||
|
||||
# Find targeted blueprints that are not in the series
|
||||
for bp in project.valid_specifications:
|
||||
if bp.milestone in milestones:
|
||||
if bp.priority in ["Undefined", "Not"]:
|
||||
# Blueprint is in milestone but has no priority
|
||||
if not args.nokick:
|
||||
print("KICK %s (from %s)" % (bp.name, bp.milestone.name))
|
||||
if not args.dryrun:
|
||||
bp.proposeGoal(goal=None)
|
||||
bp.milestone = None
|
||||
if bp.whiteboard is None:
|
||||
bp.whiteboard = ""
|
||||
if kickmessage not in bp.whiteboard:
|
||||
bp.whiteboard += ("\n\n" + kickmessage + "\n")
|
||||
bp.whiteboard += "(This is an automated message)\n"
|
||||
bp.lp_save()
|
||||
else:
|
||||
if bp not in accepted:
|
||||
# BP has milestone & prio, but not accepted for series yet
|
||||
print("SETGOAL %s" % bp.name)
|
||||
if not args.dryrun:
|
||||
bp.proposeGoal(goal=series)
|
||||
|
||||
# Get the blueprints in the series
|
||||
proposed = []
|
||||
for bp in series.all_specifications:
|
||||
if not bp.is_complete:
|
||||
if bp.milestone not in milestones:
|
||||
# Blueprint is in series, no milestone
|
||||
print("CLEARGOAL %s" % bp.name)
|
||||
if not args.dryrun:
|
||||
bp.proposeGoal(goal=None)
|
||||
else:
|
||||
if not bp.has_accepted_goal:
|
||||
if bp.priority not in ["Undefined", "Not"]:
|
||||
# BP is proposed/declined in series, has mstone + prio
|
||||
print("APPROVEGOAL %s" % bp.name)
|
||||
if not args.dryrun:
|
||||
bp.acceptGoal()
|
21
bindep.txt
21
bindep.txt
@ -1,21 +0,0 @@
|
||||
# This is a cross-platform list tracking distribution packages needed by tests;
|
||||
# see http://docs.openstack.org/infra/bindep/ for additional information.
|
||||
|
||||
dbus-devel [platform:rpm]
|
||||
dbus-glib-devel [platform:rpm]
|
||||
language-pack-en [platform:ubuntu]
|
||||
libffi-dev [platform:dpkg]
|
||||
libffi-devel [platform:rpm]
|
||||
libssl-dev [platform:dpkg]
|
||||
openssl-devel [platform:rpm]
|
||||
virtual/libffi [platform:gentoo]
|
||||
locales [platform:debian]
|
||||
python-dev [platform:dpkg]
|
||||
python-devel [platform:rpm]
|
||||
python-libvirt [platform:dpkg]
|
||||
python3-all-dev [platform:ubuntu !platform:ubuntu-precise]
|
||||
python3-dev [platform:dpkg]
|
||||
python3-devel [platform:fedora]
|
||||
python3.4 [platform:ubuntu-trusty]
|
||||
python34-devel [platform:centos]
|
||||
python3.5 [platform:ubuntu-xenial]
|
152
bug_cleanup.py
152
bug_cleanup.py
@ -1,152 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2015 Markus Zoeller <mzoeller@de.ibm.com>
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
|
||||
# +-----+ 1 1..* +----------+
|
||||
# | bug +----------------> bug_task |
|
||||
# +--+--+ +-----+----+
|
||||
# | |
|
||||
# | |
|
||||
# | +---------+ |
|
||||
# +-------> project <-------+
|
||||
# 1..* +---------+ 1
|
||||
#
|
||||
# One bug has at least 1 bug_task.
|
||||
# One bug_task belongs to exactly one bug.
|
||||
# One bug can affect multiple projects
|
||||
# One bug_task is specific to one project
|
||||
|
||||
|
||||
import argparse
|
||||
import logging
|
||||
import os
|
||||
|
||||
import launchpadlib.launchpad
|
||||
|
||||
# Parameters
|
||||
parser = argparse.ArgumentParser(description="Cleanup Launchpad (LP) Bugs")
|
||||
parser.add_argument('projectname', help='The project to act on')
|
||||
parser.add_argument("--test", action='store_const', const='staging',
|
||||
default='production', help='Use LP staging server to test')
|
||||
parser.add_argument("--newbugs", action="store_true",
|
||||
help="Cleanup inconsistencies in new bugs")
|
||||
parser.add_argument('exceptions', type=int, nargs='*', help='Bugs to ignore')
|
||||
parser.add_argument('--dryrun', action='store_true',
|
||||
help='Do not actually do anything')
|
||||
parser.add_argument("-v", "--verbose", action="store_true",
|
||||
help="increase output verbosity")
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
class LaunchpadCleanup(object):
|
||||
"""Triggers specific cleanups in Launchpad."""
|
||||
|
||||
def __init__(self, project_name, server="staging", dryrun=True,
|
||||
ignoreable_bug_ids=[]):
|
||||
self.project_name = project_name
|
||||
self.client = self._create_launchpad_client(server)
|
||||
self.dryrun = dryrun
|
||||
self.ignoreable_bug_ids = ignoreable_bug_ids
|
||||
logger.info("Created launchpad client for server '%s'", server)
|
||||
if self.dryrun:
|
||||
logger.info("That's a dry run, nothing will happen")
|
||||
|
||||
def _create_launchpad_client(self, server):
|
||||
cachedir = os.path.expanduser("~/.launchpadlib/cache/")
|
||||
if not os.path.exists(cachedir):
|
||||
os.makedirs(cachedir, 0o0700)
|
||||
return launchpadlib.launchpad.Launchpad.login_with('openstack-cleanup', server, cachedir)
|
||||
|
||||
def cleanup_new_bugs_with_assignee(self):
|
||||
"""A new bug with an assignee is in progress."""
|
||||
logger.info("Cleanup new bugs with an assignee")
|
||||
|
||||
message = ("@%s:\n\nSince you are set as assignee, I switch the "
|
||||
"status to 'In Progress'.")
|
||||
subject = "Cleanup"
|
||||
|
||||
project = self.client.projects[self.project_name]
|
||||
bug_tasks = project.searchTasks(status=['New'],
|
||||
omit_duplicates=True)
|
||||
switched_bugs = []
|
||||
|
||||
for t in bug_tasks:
|
||||
bug_id = t.bug.id
|
||||
if bug_id in self.ignoreable_bug_ids:
|
||||
logger.debug("Ignore bug '%s'. ", bug_id)
|
||||
continue
|
||||
logger.debug("Checking bug '%s'", bug_id)
|
||||
assignee = t.assignee
|
||||
if assignee is None:
|
||||
continue
|
||||
t.status = 'In Progress'
|
||||
switched_bugs.append(bug_id)
|
||||
content = message % assignee.display_name
|
||||
if self.dryrun:
|
||||
logger.debug("DRYRUN: I would switch bug '%s'", bug_id)
|
||||
continue
|
||||
logger.debug("Switching status of bug '%s'", bug_id)
|
||||
t.lp_save()
|
||||
t.bug.newMessage(content=content, subject=subject)
|
||||
|
||||
logger.info("Switched bugs: '%s'", switched_bugs)
|
||||
|
||||
def cleanup_incomplete_bugs_without_response(self):
|
||||
"""There should be a response of the reporter to incomplete bugs
|
||||
|
||||
change status to invalid and make a comment
|
||||
"""
|
||||
raise NotImplementedError("not yet done")
|
||||
|
||||
def cleanup_in_progress_bugs_without_patches(self):
|
||||
"""Not yet implemented
|
||||
|
||||
If a bug is in progress but does not provide a patch set
|
||||
it is not in progress
|
||||
|
||||
* Remove assignee
|
||||
* move back to last state (probably confirmed)
|
||||
"""
|
||||
raise NotImplementedError("not yet done")
|
||||
|
||||
|
||||
def create_logger():
|
||||
logger = logging.getLogger("os.bug.cleanup")
|
||||
logger.setLevel(logging.DEBUG)
|
||||
formatter = logging.Formatter('%(asctime)s - %(name)s - '
|
||||
'%(levelname)s - %(message)s')
|
||||
file_handler = logging.FileHandler("os.bug.cleanup.log")
|
||||
file_handler.setFormatter(formatter)
|
||||
logger.addHandler(file_handler)
|
||||
stream_handler = logging.StreamHandler()
|
||||
stream_handler.setFormatter(formatter)
|
||||
stream_level = logging.DEBUG if args.verbose else logging.INFO
|
||||
stream_handler.setLevel(stream_level)
|
||||
logger.addHandler(stream_handler)
|
||||
return logger
|
||||
|
||||
if __name__ == '__main__':
|
||||
logger = create_logger()
|
||||
logger.info("Started for project '%s'", args.projectname)
|
||||
|
||||
cleanup = LaunchpadCleanup(args.projectname, args.test, args.dryrun)
|
||||
logger.info("Found project '%s'", args.projectname)
|
||||
|
||||
if args.newbugs:
|
||||
cleanup.cleanup_new_bugs_with_assignee()
|
||||
|
||||
logger.info("Finished for project '%s'", args.projectname)
|
@ -1,147 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
"""
|
||||
This tool will list bugs that were fixed in project master.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import re
|
||||
|
||||
from git import cmd
|
||||
from git import Repo
|
||||
|
||||
|
||||
BUG_PATTERN = r'Bug:\s+#?(?P<bugnum>\d+)'
|
||||
STORYBOARD_PATTERN = r'Story:\s+#?(?P<storynum>\d+)'
|
||||
CHANGEID_PATTERN = r'Change-Id:\s+(?P<id>[0-9a-zA-Z]+)'
|
||||
|
||||
|
||||
def _parse_args():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='List bugs with recent fixes.')
|
||||
parser.add_argument(
|
||||
'--repo', '-r',
|
||||
default='.',
|
||||
help='path to the openstack project repository',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--start', '-s', required=True,
|
||||
help='git hash to start search from')
|
||||
parser.add_argument(
|
||||
'--stop', '-st',
|
||||
help='git hash to stop search to',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--skip-backported', '-B',
|
||||
action='store_true',
|
||||
help='whether to skip patches backported to all stable branches',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--easy-backport', '-e',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='whether to include easy (no git conflicts) backports only',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--include-storyboard', '-sb',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='whether to also include storyboard entries (stories)',
|
||||
)
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def _backported_to_all_stable_branches(repo, id_):
|
||||
for ref in repo.refs:
|
||||
if ref.name.startswith('origin/stable/'):
|
||||
for commit in repo.iter_commits('..%s' % ref.name):
|
||||
if id_ == _extract_changeid(commit):
|
||||
break
|
||||
else:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def _extract_changeid(commit):
|
||||
for match in re.finditer(CHANGEID_PATTERN, commit.message):
|
||||
id_ = match.group('id')
|
||||
return id_
|
||||
|
||||
|
||||
def _is_easy_backport(repo, commit):
|
||||
g_cmd = cmd.Git(working_dir=repo.working_tree_dir)
|
||||
for ref in repo.refs:
|
||||
# consider a patch easy to backport if only it cleanly applies to all
|
||||
# stable branches; otherwise it will potentially require more work to
|
||||
# resolve git conflicts
|
||||
if ref.name.startswith('origin/stable/'):
|
||||
# before applying any patches, make sure the tree is clean and
|
||||
# fully reflects remote head
|
||||
g_cmd.clean(force=True, d=True, x=True)
|
||||
g_cmd.reset(hard=True)
|
||||
g_cmd.checkout(ref.name)
|
||||
try:
|
||||
g_cmd.cherry_pick(commit.hexsha)
|
||||
except cmd.GitCommandError:
|
||||
# cherry-pick does not have a 'dry run' mode, so we need to
|
||||
# actually clean up after a failure
|
||||
g_cmd.cherry_pick(abort=True)
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
args = _parse_args()
|
||||
|
||||
repo = Repo(args.repo)
|
||||
|
||||
# make sure that we work with the latest code
|
||||
repo.remotes.origin.fetch()
|
||||
|
||||
latest = repo.refs[args.stop if args.stop else 'origin/master'].commit
|
||||
rev = '%s..%s' % (args.start, latest.hexsha)
|
||||
|
||||
# avoid duplicates
|
||||
bugs = set()
|
||||
|
||||
for commit in repo.iter_commits(rev):
|
||||
id_ = _extract_changeid(commit)
|
||||
if id_ is None:
|
||||
# probably a merge commit, skip
|
||||
continue
|
||||
|
||||
# skip patches backported into all branches
|
||||
if (args.skip_backported and
|
||||
_backported_to_all_stable_branches(repo, id_)):
|
||||
continue
|
||||
|
||||
# skip patches that result in git conflicts in any of stable branches
|
||||
if (args.easy_backport and
|
||||
not _is_easy_backport(repo, commit)):
|
||||
continue
|
||||
|
||||
# collect every bug number mentioned in the message
|
||||
for match in re.finditer(BUG_PATTERN, commit.message):
|
||||
bugs.add(match.group('bugnum'))
|
||||
if args.include_storyboard:
|
||||
for match in re.finditer(STORYBOARD_PATTERN, commit.message):
|
||||
bugs.add('storyboard:' + match.group('storynum'))
|
||||
|
||||
for bug in bugs:
|
||||
print(bug)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -1,64 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Check the constraints settings for OpenStack libraries against their
|
||||
# most current version.
|
||||
|
||||
TOOLSDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
source $TOOLSDIR/functions
|
||||
|
||||
if [[ -z "$VIRTUAL_ENV" ]]; then
|
||||
tox -e venv --notest
|
||||
source ./.tox/venv/bin/activate
|
||||
fi
|
||||
|
||||
if [[ $# -ne 2 ]]; then
|
||||
echo "Usage: $0 requirements-repo-dir branch"
|
||||
echo "For example: $0 ~/repos/openstack/requirements stable/mitaka"
|
||||
echo "For example: $0 ~/repos/openstack/requirements master"
|
||||
exit 1
|
||||
fi
|
||||
REQ_REPO="$1"
|
||||
BRANCH="$2"
|
||||
|
||||
setup_temp_space update-constraints-$PROJECT
|
||||
|
||||
title "Making a list of library repositories"
|
||||
repos="$(list-repos --code-only --tag type:library)"
|
||||
|
||||
constraints_file=$REQ_REPO/upper-constraints.txt
|
||||
blacklist_file=$REQ_REPO/blacklist.txt
|
||||
|
||||
title "Comparing constraints"
|
||||
for repo in $repos; do
|
||||
cd $MYTMPDIR
|
||||
clone_repo $repo $BRANCH
|
||||
cd $MYTMPDIR/$repo
|
||||
|
||||
# NOTE(dhellmann): Convert _ to - in the way safe_name() does to
|
||||
# find the matching constraint entry.
|
||||
name=$(python setup.py --name | sed 's/_/-/g')
|
||||
if [[ -z "$name" ]]; then
|
||||
echo "$repo: could not get name, skipping"
|
||||
continue
|
||||
fi
|
||||
if grep -q "^${name}=" "$blacklist_file"; then
|
||||
echo "$repo: blacklisted, skipping"
|
||||
continue
|
||||
fi
|
||||
|
||||
version=$(git describe --abbrev=0 origin/$BRANCH)
|
||||
if [[ -z "$version" ]]; then
|
||||
echo "ERROR: Could not determine update"
|
||||
continue
|
||||
fi
|
||||
expected="${name}===${version}"
|
||||
existing=$(grep "^${name}=" $constraints_file)
|
||||
if [[ -z "$existing" ]]; then
|
||||
echo "Not currently constrained"
|
||||
continue
|
||||
fi
|
||||
if [[ "$expected" != "$existing" ]]; then
|
||||
sed -i -e "s/$existing/$expected/" $constraints_file
|
||||
echo "$existing updated to ${version}"
|
||||
fi
|
||||
done
|
@ -1,61 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Script to check the difference between produced and uploaded tarballs
|
||||
#
|
||||
# Copyright 2011-2013 Thierry Carrez <thierry@openstack.org>
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
TOOLSDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
source $TOOLSDIR/functions
|
||||
|
||||
function error {
|
||||
echo ERROR: $1
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ $# -lt 2 ]; then
|
||||
echo "Usage: $0 repo version"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
REPO=$1
|
||||
VERSION=$2
|
||||
PROJECT=$(basename $REPO)
|
||||
|
||||
setup_temp_space compare-tarball-diff
|
||||
|
||||
title "$REPO $VERSION"
|
||||
|
||||
cd $MYTMPDIR
|
||||
|
||||
clone_repo $REPO >/dev/null 2>&1 || error "clone failed"
|
||||
cd $REPO
|
||||
git checkout $VERSION >/dev/null 2>&1 || error "could not checkout $VERSION"
|
||||
|
||||
python setup.py sdist > /dev/null 2>&1 || error "sdist failed"
|
||||
|
||||
cd dist/
|
||||
DIST_FILE=$(ls -1 *.tar.gz | head -1)
|
||||
|
||||
mkdir local/
|
||||
tar -C local/ -xzf $DIST_FILE
|
||||
|
||||
URL="http://tarballs.openstack.org/$PROJECT/$DIST_FILE"
|
||||
wget -q -O remote.tar.gz $URL || error "could not download $URL"
|
||||
|
||||
mkdir remote/
|
||||
tar -C remote/ -xzf remote.tar.gz
|
||||
|
||||
diff -Bbwurd local/ remote/
|
@ -1,151 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Script to move bugs and blueprints to final release milestone page
|
||||
#
|
||||
# Copyright 2011-2013 Thierry Carrez <thierry@openstack.org>
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
import launchpadlib.launchpad
|
||||
import lazr.restfulclient.errors
|
||||
|
||||
# Parameters
|
||||
parser = argparse.ArgumentParser(description="Consolidate milestone pages"
|
||||
" at release time")
|
||||
parser.add_argument('project', help='project to act on')
|
||||
parser.add_argument('series', help='series to handle')
|
||||
parser.add_argument('release', help='release milestone')
|
||||
parser.add_argument('--copytask', action='store_true',
|
||||
help='Enable CopyTask mode')
|
||||
parser.add_argument("--test", action='store_const', const='staging',
|
||||
default='production', help='Use LP staging server to test')
|
||||
parser.add_argument('--dryrun', action='store_true',
|
||||
help='Do not actually do anything')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.dryrun:
|
||||
print("Dry run, nothing will actually change.")
|
||||
|
||||
statuses = ['New', 'Incomplete', 'Confirmed', 'Triaged', 'In Progress',
|
||||
'Fix Committed', 'Fix Released']
|
||||
|
||||
# Connect to Launchpad
|
||||
print("Connecting to Launchpad...")
|
||||
launchpad = launchpadlib.launchpad.Launchpad.login_with('openstack-releasing',
|
||||
args.test, version='devel')
|
||||
|
||||
# Retrieve FixCommitted bugs
|
||||
print("Retrieving %s project..." % args.project)
|
||||
proj = launchpad.projects[args.project]
|
||||
if not proj:
|
||||
print("Project %s not found" % args.project)
|
||||
sys.exit(1)
|
||||
|
||||
print("Retrieving %s series..." % args.series)
|
||||
series = proj.getSeries(name=args.series)
|
||||
if not series:
|
||||
print("Series %s not found in project %s" % (args.series, args.project))
|
||||
sys.exit(1)
|
||||
|
||||
print("Checking %s release milestone..." % args.release)
|
||||
release = proj.getMilestone(name=args.release)
|
||||
if not release:
|
||||
print("%s is not a %s milestone!" % (args.release, args.project))
|
||||
sys.exit(1)
|
||||
|
||||
print("Retrieving milestones for %s..." % args.series)
|
||||
seriesmilestones = series.all_milestones
|
||||
milestones = []
|
||||
release_is_in_series = False
|
||||
for milestone in seriesmilestones:
|
||||
if milestone == release:
|
||||
release_is_in_series = True
|
||||
else:
|
||||
if (args.project == "swift" and
|
||||
not milestone.name.startswith(
|
||||
release.name + "-rc")):
|
||||
continue
|
||||
milestones.insert(0, milestone)
|
||||
print("Found")
|
||||
for milestone in milestones:
|
||||
print(milestone.name)
|
||||
print()
|
||||
|
||||
if not release_is_in_series:
|
||||
print("%s is not a %s milestone!" % (args.release, args.series))
|
||||
sys.exit(1)
|
||||
|
||||
# Process blueprints
|
||||
print("Moving all %s blueprints to %s..." % (series.name, release.name))
|
||||
for bp in series.valid_specifications:
|
||||
if bp.milestone in milestones:
|
||||
print(bp.name)
|
||||
if not args.dryrun:
|
||||
bp.milestone = release
|
||||
bp.lp_save()
|
||||
print(" - released",)
|
||||
if not bp.is_complete:
|
||||
print(" (not completed!)",)
|
||||
print()
|
||||
|
||||
# Process bugs
|
||||
for milestone in milestones:
|
||||
if args.copytask:
|
||||
print("CopyTasking %s bugs to %s..." % (milestone.name, release.name))
|
||||
else:
|
||||
print("Moving %s bugs to %s..." % (milestone.name, release.name))
|
||||
bugsleft = True
|
||||
while bugsleft:
|
||||
failed = set()
|
||||
bugsleft = False
|
||||
for bt in proj.searchTasks(status=statuses, milestone=milestone):
|
||||
bug = bt.bug
|
||||
print(bug.id)
|
||||
if not args.dryrun:
|
||||
if args.copytask:
|
||||
try:
|
||||
newbt = bug.addTask(target=series)
|
||||
newbt.assignee = bt.assignee
|
||||
newbt.status = bt.status
|
||||
newbt.importance = bt.importance
|
||||
newbt.milestone = release
|
||||
newbt.lp_save()
|
||||
print(" - copytasked")
|
||||
bugsleft = True
|
||||
except lazr.restfulclient.errors.BadRequest:
|
||||
print(" - task already exists, skipping")
|
||||
else:
|
||||
bt.milestone = release
|
||||
try:
|
||||
bt.lp_save()
|
||||
print(" - released")
|
||||
except lazr.restfulclient.errors.ServerError as e:
|
||||
print(" - TIMEOUT during save !",)
|
||||
failed.add(bug.id)
|
||||
bugsleft = True
|
||||
if bt.status != 'Fix Released':
|
||||
print(" (not in FixReleased status!)",)
|
||||
print()
|
||||
if failed:
|
||||
print()
|
||||
print("Some bugs could not be automatically updated "
|
||||
"due to LP timeouts:")
|
||||
for bugid in failed:
|
||||
print("http://bugs.launchpad.net/bugs/%d" % bugid)
|
||||
print()
|
@ -1,23 +0,0 @@
|
||||
# Name of the series
|
||||
series: kilo
|
||||
|
||||
# Milestone codes (series- will be prefixed)
|
||||
# Value is the release date (or empty string if not set yet)
|
||||
milestones:
|
||||
'1': '2014-12-05'
|
||||
'2': '2015-01-23'
|
||||
'3': '2015-03-06'
|
||||
|
||||
# Set of projects to create milestones for
|
||||
projects:
|
||||
- nova
|
||||
- glance
|
||||
- keystone
|
||||
- horizon
|
||||
- neutron
|
||||
- cinder
|
||||
- oslo-incubator
|
||||
- heat
|
||||
- ceilometer
|
||||
- trove
|
||||
- sahara
|
198
eol_branch.sh
198
eol_branch.sh
@ -1,198 +0,0 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
function print_help {
|
||||
echo ""
|
||||
echo "USAGE:"
|
||||
echo " ./eol_branch.sh [options] branch eol_tag project [project [project [...]]]"
|
||||
echo ""
|
||||
echo "A tool for retiring old branches. Performs the following:"
|
||||
echo "1) Abandon stale reviews,"
|
||||
echo "2) tag current position of branch"
|
||||
echo "3) delete the branch from the remote"
|
||||
echo ""
|
||||
echo "Must be ran from a directory containing a recent checkout of the project[s]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " -d, --dry-run Do not run any harmful commands"
|
||||
echo " --eol-message <message> Set the message on the end-of-life tag"
|
||||
echo " -h, --help This help message"
|
||||
echo " -q, --quiet Turn off unimportant messages"
|
||||
echo " --remote <remote> Set the remote to delete branches from (default: gerrit)"
|
||||
echo " -w, --warn-exit Exit on any warnings"
|
||||
echo ""
|
||||
}
|
||||
|
||||
OPTS=`getopt -o dhqw --long eol-message:,dry-run,help,quiet,remote:,warn-exit -n $0 -- "$@"`
|
||||
if [ $? != 0 ] ; then
|
||||
echo "Failed parsing options." >&2
|
||||
print_help
|
||||
exit 1
|
||||
fi
|
||||
eval set -- "$OPTS"
|
||||
set -e
|
||||
# Defaults:
|
||||
EOL_MESSAGE=""
|
||||
DEBUG=
|
||||
REMOTE=gerrit
|
||||
VERBOSE=true
|
||||
WARN_EXIT=false
|
||||
|
||||
while true; do
|
||||
case "$1" in
|
||||
-d|--dry-run)
|
||||
DEBUG=echo
|
||||
shift
|
||||
;;
|
||||
--eol-message)
|
||||
EOL_MESSAGE=$2
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
print_help
|
||||
exit 0
|
||||
;;
|
||||
-q|--quiet)
|
||||
VERBOSE=false
|
||||
shift
|
||||
;;
|
||||
--remote)
|
||||
REMOTE=$2
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
-w|--warn-exit)
|
||||
WARN_EXIT=true
|
||||
shift
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# First argument is the branch to delete
|
||||
BRANCH=$1
|
||||
shift
|
||||
|
||||
# Second argument is the tag to use before deletion
|
||||
TAG=$1
|
||||
shift
|
||||
|
||||
if [$EOL_MESSAGE = ""]; then
|
||||
EOL_MESSAGE="This branch ($BRANCH) is at End Of Life"
|
||||
fi
|
||||
|
||||
|
||||
function abandon_reviews {
|
||||
project=$1
|
||||
if [ $VERBOSE = true ]; then
|
||||
echo "Running query: status:open project:$project branch:$BRANCH"
|
||||
fi
|
||||
|
||||
gerrit_query="--current-patch-set status:open project:$project branch:$BRANCH"
|
||||
revisions=($(ssh -p 29418 review.openstack.org gerrit query $gerrit_query |
|
||||
grep '^ revision: [a-f0-9]\{40\}$' | cut -b 15-))
|
||||
for rev in "${revisions[@]}"; do
|
||||
if [ $VERBOSE = true ]; then
|
||||
echo "Found commit $rev to abandon"
|
||||
fi
|
||||
$DEBUG ssh -p 29418 review.openstack.org gerrit review --project $project --abandon --message \"$EOL_MESSAGE\" $rev
|
||||
done
|
||||
}
|
||||
|
||||
function tag_eol {
|
||||
project=$1
|
||||
rev=`git rev-parse remotes/$REMOTE/$BRANCH`
|
||||
|
||||
if git rev-parse $TAG >/dev/null 2>&1; then
|
||||
echo "WARN: The tag ($TAG) already exists on $project"
|
||||
tag_rev=`git rev-list -n 1 $TAG`
|
||||
if [ $rev != $tag_rev ]; then
|
||||
echo "ERROR: The tag ($tag_rev) doesn't match the branch ($rev)"
|
||||
exit 1
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ $VERBOSE = true ]; then
|
||||
echo "About to add tag $TAG to $project at branch $BRANCH (rev $rev)"
|
||||
fi
|
||||
$DEBUG git tag -s $TAG -m "$EOL_MESSAGE" remotes/$REMOTE/$BRANCH
|
||||
$DEBUG git push gerrit $TAG
|
||||
}
|
||||
|
||||
function delete_branch {
|
||||
rev=`git rev-parse remotes/$REMOTE/$BRANCH`
|
||||
if [ $VERBOSE = true ]; then
|
||||
echo "About to delete the branch $BRANCH from $project (rev $rev)"
|
||||
fi
|
||||
$DEBUG git push $REMOTE --delete refs/heads/$BRANCH
|
||||
}
|
||||
|
||||
function warning_message {
|
||||
echo "WARNING: $1"
|
||||
if [ $WARN_EXIT = true ]; then
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
while (( "$#" )); do
|
||||
project=$1
|
||||
shift
|
||||
|
||||
if ! [ -d $project/.git ]; then
|
||||
if ! [ -d $project ]; then
|
||||
echo "$project not found on filesystem. Will attempt to clone"
|
||||
$DEBUG git clone git://git.openstack.org/$project $project
|
||||
else
|
||||
warning_message "$project is not a git repo"
|
||||
echo "skipping..."
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
pushd $project
|
||||
|
||||
if ! git config remote.$REMOTE.url >/dev/null 2>&1; then
|
||||
if ! [ -f .gitreview ]; then
|
||||
# Work around projects with missing .gitreview files. This usually
|
||||
# happens when a probject is no longer maintained.
|
||||
user=`git config --global gitreview.username`
|
||||
warning_message "Guessing remote manually"
|
||||
git remote add $REMOTE ssh://$user@review.openstack.org:29418/$project.git
|
||||
else
|
||||
git review -s
|
||||
fi
|
||||
fi
|
||||
|
||||
# Add some hardening around incorrect looking remote url's
|
||||
remote_url=`git config --get remote.$REMOTE.url`
|
||||
if [[ $remote_url != *"$project.git" && $remote_url != *"$project" ]]; then
|
||||
warning_message "The url for remote $REMOTE does not end with $project or
|
||||
$project.git. This may be deliberate, but it's more likely that the
|
||||
project has a mis-configured .gitreview file pointing to the wrong
|
||||
repository. This is the case in many of the (now retired) deb-* packages
|
||||
where their remotes were set to the upstream project instead of their own
|
||||
deb repository."
|
||||
echo "skipping..."
|
||||
popd
|
||||
continue
|
||||
fi
|
||||
|
||||
git remote update --prune
|
||||
|
||||
if ! git rev-parse remotes/$REMOTE/$BRANCH >/dev/null 2>&1; then
|
||||
warning_message "$project does not have a branch $BRANCH"
|
||||
echo "skipping..."
|
||||
popd
|
||||
continue
|
||||
fi
|
||||
|
||||
abandon_reviews $project
|
||||
tag_eol $project
|
||||
delete_branch $project
|
||||
|
||||
popd
|
||||
done
|
@ -1,225 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Closes Launchpad bug reports which are older than the oldest stable release
|
||||
# (usually 18 months, see DAYS_SINCE_CREATED). It ignores bug reports which:
|
||||
# * have a special comment (see STILL_VALID_FLAG).
|
||||
# * have the status "In Progress"
|
||||
# * have the importance "Wishlist"
|
||||
#
|
||||
# example execution:
|
||||
# $ python expire_old_bug_reports.py nova --no-dry-run
|
||||
#
|
||||
#
|
||||
# Copyright 2016 Markus Zoeller (mzoeller@linux.vnet.ibm.com)
|
||||
# Copyright 2016 Steven Hardy (shardy@redhat.com)
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
|
||||
import argparse
|
||||
import datetime
|
||||
import logging
|
||||
import os
|
||||
from prettytable import PrettyTable
|
||||
import sys
|
||||
import time
|
||||
|
||||
from launchpadlib.launchpad import Launchpad
|
||||
import lazr.restfulclient.errors
|
||||
|
||||
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(funcName)s - %(message)s"
|
||||
logging.basicConfig(format=LOG_FORMAT)
|
||||
LOG = logging.getLogger(__name__)
|
||||
LOG.setLevel(logging.INFO)
|
||||
|
||||
parser = argparse.ArgumentParser(description="Expire old bug reports.")
|
||||
parser.add_argument('project_name',
|
||||
help='The Launchpad project name (nova, cinder, ...).')
|
||||
parser.add_argument('--verbose', '-v',
|
||||
help='Enable debug logging.',
|
||||
action="store_true")
|
||||
parser.add_argument('--no-dry-run',
|
||||
dest='no_dry_run',
|
||||
help='Execute the expiration for real.',
|
||||
action='store_true')
|
||||
parser.add_argument('--credentials-file', '-c',
|
||||
dest='lp_creds_file',
|
||||
default=os.environ.get('LP_CREDS_FILE'),
|
||||
help=('plain-text credentials file, '
|
||||
'defaults to value of $LP_CREDS_FILE'))
|
||||
args = parser.parse_args()
|
||||
LOG.info(args)
|
||||
|
||||
|
||||
PROJECT_NAME = args.project_name
|
||||
if args.verbose:
|
||||
LOG.setLevel(logging.DEBUG)
|
||||
|
||||
|
||||
DAYS_SINCE_CREATED = 30 * 18 # 18 months
|
||||
STILL_VALID_FLAG = "CONFIRMED FOR: %(release_name)s" # UPPER CASE
|
||||
SUPPORTED_RELEASE_NAMES = [] # UPPER CASE
|
||||
|
||||
BUG_TASK_STATUS_AFTER_RUN = "Expired"
|
||||
BUG_TASK_ASSIGNEE_AFTER_RUN = None
|
||||
BUG_TASK_IMPORTANCE_AFTER_RUN = "Undecided"
|
||||
|
||||
|
||||
class BugReport(object):
|
||||
|
||||
def __init__(self, link, title, age, bug_task):
|
||||
self.link = link
|
||||
self.title = title.encode('ascii', 'replace')
|
||||
self.age = age
|
||||
self.bug_task = bug_task
|
||||
|
||||
def __str__(self):
|
||||
data = {'link': self.link, 'title': self.title, 'age': self.age}
|
||||
return "{link} ({title}) - ({age} days)".format(**data)
|
||||
|
||||
def __cmp__(self, other):
|
||||
return cmp(self.age, other.age)
|
||||
|
||||
|
||||
def get_project_client():
|
||||
cache_dir = os.path.expanduser("~/.launchpadlib/cache/")
|
||||
if not os.path.exists(cache_dir):
|
||||
os.makedirs(cache_dir, 0o700)
|
||||
|
||||
def no_credential():
|
||||
LOG.error("Can't proceed without Launchpad credential.")
|
||||
sys.exit()
|
||||
|
||||
launchpad = Launchpad.login_with(
|
||||
application_name=PROJECT_NAME + '-bugs',
|
||||
service_root='production',
|
||||
launchpadlib_dir=cache_dir,
|
||||
credential_save_failed=no_credential,
|
||||
credentials_file=args.lp_creds_file)
|
||||
project = launchpad.projects[PROJECT_NAME]
|
||||
return project
|
||||
|
||||
|
||||
def fill_supported_release_names(lp_project):
|
||||
LOG.info("filling supported release names...")
|
||||
for s in lp_project.series:
|
||||
if s.active:
|
||||
# stable branch names
|
||||
SUPPORTED_RELEASE_NAMES.append(s.name.upper())
|
||||
# master name
|
||||
SUPPORTED_RELEASE_NAMES.append(lp_project.development_focus.name.upper())
|
||||
LOG.info("filled supported release names: %s", SUPPORTED_RELEASE_NAMES)
|
||||
|
||||
|
||||
def bug_is_still_valid(bug):
|
||||
for message in bug.messages:
|
||||
for release_name in SUPPORTED_RELEASE_NAMES:
|
||||
flag = STILL_VALID_FLAG % {'release_name': release_name}
|
||||
if flag in message.content:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def get_expired_reports(lp_project):
|
||||
LOG.info("getting potentially expired reports...")
|
||||
bug_tasks = lp_project.searchTasks(
|
||||
status=["New", "Confirmed", "Triaged"],
|
||||
importance=["Unknown", "Undecided", "Critical", "High", "Medium",
|
||||
"Low"], # ignore 'wishlist'; they get special treatment
|
||||
omit_duplicates=True,
|
||||
order_by="datecreated")
|
||||
today = datetime.datetime.today()
|
||||
expired = []
|
||||
|
||||
for bug_task in bug_tasks:
|
||||
# remove the timezone info as it disturbs the calculation of the diff
|
||||
diff = today - bug_task.date_created.replace(tzinfo=None)
|
||||
if diff.days < DAYS_SINCE_CREATED:
|
||||
break
|
||||
if bug_is_still_valid(bug_task.bug):
|
||||
continue
|
||||
expired.append(BugReport(link=bug_task.web_link,
|
||||
title=bug_task.bug.title,
|
||||
age=diff.days,
|
||||
bug_task=bug_task))
|
||||
LOG.info("got %d potentially expired reports." % len(expired))
|
||||
return expired
|
||||
|
||||
|
||||
def expire_bug_report(bug_report):
|
||||
subject = "Cleanup EOL bug report"
|
||||
comment = """
|
||||
This is an automated cleanup. This bug report has been closed because it
|
||||
is older than %(mm)d months and there is no open code change to fix this.
|
||||
After this time it is unlikely that the circumstances which lead to
|
||||
the observed issue can be reproduced.
|
||||
|
||||
If you can reproduce the bug, please:
|
||||
* reopen the bug report (set to status "New")
|
||||
* AND add the detailed steps to reproduce the issue (if applicable)
|
||||
* AND leave a comment "CONFIRMED FOR: <RELEASE_NAME>"
|
||||
Only still supported release names are valid (%(supported_releases)s).
|
||||
Valid example: CONFIRMED FOR: %(valid_release_name)s
|
||||
""" % {'mm': DAYS_SINCE_CREATED / 30,
|
||||
'supported_releases': ', '.join(SUPPORTED_RELEASE_NAMES),
|
||||
'valid_release_name': SUPPORTED_RELEASE_NAMES[0]}
|
||||
|
||||
bug_task = bug_report.bug_task
|
||||
bug_task.status = BUG_TASK_STATUS_AFTER_RUN
|
||||
bug_task.assignee = BUG_TASK_ASSIGNEE_AFTER_RUN
|
||||
bug_task.importance = BUG_TASK_IMPORTANCE_AFTER_RUN
|
||||
try:
|
||||
if args.no_dry_run:
|
||||
bug_task.lp_save()
|
||||
bug_task.bug.newMessage(subject=subject, content=comment)
|
||||
LOG.debug("expired bug report %s" % bug_report)
|
||||
except lazr.restfulclient.errors.ServerError as e:
|
||||
LOG.error(" - TIMEOUT during save ! (%s)" % e, end='')
|
||||
except Exception as e:
|
||||
LOG.error(" - ERROR during save ! (%s)" % e, end='')
|
||||
|
||||
|
||||
def print_expired_table(expired_reports):
|
||||
x = PrettyTable()
|
||||
x.field_names = ["Bug #", "Title", "Age (d)"]
|
||||
x.align["Bug #"] = "r"
|
||||
x.align["Title"] = "l"
|
||||
x.align["Age (d)"] = "r"
|
||||
for r in expired_reports:
|
||||
x.add_row([r.bug_task.bug.id, r.title, r.age])
|
||||
print(x)
|
||||
|
||||
|
||||
def main():
|
||||
if args.no_dry_run:
|
||||
LOG.info("This is not a drill! Bug reports will be closed for real!")
|
||||
time.sleep(4) # in case you wanna ctrl-c this
|
||||
else:
|
||||
LOG.info("This is just a dry-run, nothing will happen.")
|
||||
lp_project = get_project_client()
|
||||
fill_supported_release_names(lp_project)
|
||||
expired_reports = get_expired_reports(lp_project)
|
||||
LOG.info("starting expiration...")
|
||||
for e in expired_reports:
|
||||
expire_bug_report(e)
|
||||
LOG.info("expired %d bug reports.", len(expired_reports))
|
||||
LOG.info("printing an ASCII table for notification purposes...")
|
||||
print_expired_table(expired_reports)
|
||||
LOG.info("printed ASCII table.")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
LOG.info("starting script...")
|
||||
main()
|
||||
LOG.info("end script")
|
119
functions
119
functions
@ -1,119 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Shared functions for shell scripts
|
||||
#
|
||||
|
||||
# Make sure custom grep options don't get in the way
|
||||
unset GREP_OPTIONS
|
||||
|
||||
|
||||
function lp_project_to_repo {
|
||||
typeset proj="$1"
|
||||
|
||||
if [[ $proj == python-*client* ]]; then
|
||||
echo $proj
|
||||
elif [[ $proj == glance-store ]]; then
|
||||
echo glance_store
|
||||
elif [[ $proj == django-openstack-auth ]]; then
|
||||
echo django_openstack_auth
|
||||
else
|
||||
# Some of the repository names don't match the launchpad names, e.g.
|
||||
# python-stevedore and python-cliff.
|
||||
echo $proj | sed -e 's|^python-||'
|
||||
fi
|
||||
}
|
||||
|
||||
function title {
|
||||
echo
|
||||
if [ -t 1 ]; then
|
||||
echo "$(tput bold)$(tput setaf 1)[ $1 ]$(tput sgr0)"
|
||||
else
|
||||
echo "[ $1 ]"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
function _cleanup_tmp {
|
||||
rm -rf $MYTMPDIR
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
function setup_temp_space {
|
||||
MYTMPDIR=`mktemp -d _tmp-${1}-XXX`
|
||||
mkdir -p "$MYTMPDIR"
|
||||
trap _cleanup_tmp EXIT
|
||||
cd "$MYTMPDIR"
|
||||
# NOTE(dhellmann): On some platforms mktemp returns a short name
|
||||
# instead of a full path, so expand the full path by looking at
|
||||
# where we ended up after the cd operation.
|
||||
MYTMPDIR="$(pwd)"
|
||||
}
|
||||
|
||||
|
||||
|
||||
function get_last_tag {
|
||||
# Print the most recent tag for a ref. If no ref is specified, the
|
||||
# currently checked out branch is examined.
|
||||
local ref="$1"
|
||||
if ! git describe --abbrev=0 --first-parent ${ref} >/dev/null 2>&1; then
|
||||
echo ""
|
||||
else
|
||||
git describe --abbrev=0 --first-parent ${ref}
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
function update_gitreview {
|
||||
typeset branch="$1"
|
||||
|
||||
title "Updating .gitreview"
|
||||
git checkout $branch
|
||||
# Remove a trailing newline, if present, to ensure consistent
|
||||
# formatting when we add the defaultbranch line next.
|
||||
typeset grcontents="$(echo -n "$(cat .gitreview | grep -v defaultbranch)")
|
||||
defaultbranch=$branch"
|
||||
echo "$grcontents" > .gitreview
|
||||
git add .gitreview
|
||||
git commit -m "Update .gitreview for $branch"
|
||||
git show
|
||||
local shortbranch=$(basename $branch)
|
||||
git review -t "create-${shortbranch}"
|
||||
}
|
||||
|
||||
|
||||
function update_upper_constraints {
|
||||
typeset branch="$1"
|
||||
typeset uc_server='git.openstack.org'
|
||||
typeset uc_path='cgit/openstack/requirements/plain/upper-constraints.txt'
|
||||
typeset uc_url="https://${uc_server}/${uc_path}?h=${branch}"
|
||||
|
||||
title "Updating tox.ini for upper-constraints"
|
||||
git checkout $branch
|
||||
sed -i~ -e "s,-c.*{\(env:UPPER_CONSTRAINTS_FILE\)[^ ]*},-c{\1:$uc_url}," tox.ini
|
||||
if ! git diff --exit-code >/dev/null 2>&1 ; then
|
||||
git add tox.ini
|
||||
git commit -m "Update UPPER_CONSTRAINTS_FILE for $branch"
|
||||
git show
|
||||
local shortbranch=$(basename $branch)
|
||||
git review -t "create-${shortbranch}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
function clone_repo {
|
||||
typeset repo="$1"
|
||||
typeset branch="$2"
|
||||
if [ -z "$branch" ]; then
|
||||
branch="master"
|
||||
fi
|
||||
output=$({ zuul-cloner --branch "$branch" git://git.openstack.org $repo \
|
||||
&& (cd $repo && git review -s && git remote -v update \
|
||||
&& git fetch -v --tags); } 2>&1)
|
||||
_retval=$?
|
||||
if [ $_retval -ne 0 ] ; then
|
||||
echo "$output"
|
||||
fi
|
||||
|
||||
return $_retval
|
||||
}
|
@ -1,145 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
"""Lists the most recent versions in the deliverable files.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import argparse
|
||||
import os.path
|
||||
import re
|
||||
import subprocess
|
||||
|
||||
import yaml
|
||||
|
||||
|
||||
PRE_RELEASE_RE = re.compile('''
|
||||
\.(\d+(?:[ab]|rc)+\d*)$
|
||||
''', flags=re.VERBOSE | re.UNICODE)
|
||||
|
||||
|
||||
def find_modified_deliverable_files(reporoot):
|
||||
"Return a list of files modified by the most recent commit."
|
||||
results = subprocess.check_output(
|
||||
['git', 'diff', '--name-only', '--pretty=format:', 'HEAD^'],
|
||||
cwd=reporoot,
|
||||
)
|
||||
filenames = [
|
||||
l.strip()
|
||||
for l in results.splitlines()
|
||||
if l.startswith('deliverables/')
|
||||
]
|
||||
return filenames
|
||||
|
||||
|
||||
def get_modified_deliverable_file_content(reporoot, filenames):
|
||||
"""Return a sequence of tuples containing the new versions.
|
||||
|
||||
Return tuples containing (deliverable name, series name, version
|
||||
number, repository name, hash SHA, include pypi link, first full
|
||||
version)
|
||||
|
||||
"""
|
||||
# Determine which deliverable files to process by taking our
|
||||
# command line arguments or by scanning the git repository
|
||||
# for the most recent change.
|
||||
deliverable_files = filenames
|
||||
if not deliverable_files:
|
||||
deliverable_files = find_modified_deliverable_files(
|
||||
reporoot
|
||||
)
|
||||
|
||||
for basename in deliverable_files:
|
||||
filename = os.path.join(reporoot, basename)
|
||||
if not os.path.exists(filename):
|
||||
# The file must have been deleted, skip it.
|
||||
continue
|
||||
with open(filename, 'r') as f:
|
||||
deliverable_data = yaml.load(f.read())
|
||||
|
||||
# Determine where to send email announcements of
|
||||
# releases. Default to the development list, to cut down on
|
||||
# excessive emails to the announcement list.
|
||||
send_announcements_to = deliverable_data.get(
|
||||
'send-announcements-to',
|
||||
'openstack-dev@lists.openstack.org',
|
||||
)
|
||||
|
||||
# Determine whether announcements should include a PyPI
|
||||
# link. Default to no, for service projects, because it is
|
||||
# less irksome to fail to include a link to a thing that
|
||||
# exists than to link to something that does not.
|
||||
include_pypi_link = deliverable_data.get(
|
||||
'include-pypi-link',
|
||||
False,
|
||||
)
|
||||
include_pypi_link = 'yes' if include_pypi_link else 'no'
|
||||
|
||||
# The series name is part of the filename, rather than the file
|
||||
# body. That causes release.sh to be called with series="_independent"
|
||||
# for release:independent projects, and release.sh to use master branch
|
||||
# to evaluate fixed bugs.
|
||||
series_name = os.path.basename(
|
||||
os.path.dirname(os.path.abspath(filename))
|
||||
).lstrip('_')
|
||||
deliverable_name = os.path.splitext(os.path.basename(filename))[0]
|
||||
|
||||
all_versions = {
|
||||
rel['version']: rel for rel in deliverable_data['releases']
|
||||
}
|
||||
version = deliverable_data['releases'][-1]['version']
|
||||
this_version = all_versions[version]
|
||||
final_versions = [
|
||||
r['version']
|
||||
for r in deliverable_data['releases']
|
||||
if not PRE_RELEASE_RE.search(r['version'])
|
||||
]
|
||||
first_full_release = 'yes' if (
|
||||
final_versions and
|
||||
this_version['version'] == final_versions[0]
|
||||
) else 'no'
|
||||
for project in this_version['projects']:
|
||||
yield (deliverable_name, series_name, version,
|
||||
project['repo'], project['hash'],
|
||||
send_announcements_to,
|
||||
include_pypi_link,
|
||||
first_full_release)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
'deliverable_file',
|
||||
nargs='*',
|
||||
help='paths to YAML files specifying releases',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--releases-repo', '-r',
|
||||
default='.',
|
||||
help='path to the releases repository for automatic scanning',
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
results = get_modified_deliverable_file_content(
|
||||
args.releases_repo,
|
||||
args.deliverable_file,
|
||||
)
|
||||
for r in results:
|
||||
print(' '.join(r))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -1,60 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
"""
|
||||
This Launchpad tool is used to filter out bugs of specified importance.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
from launchpadlib.launchpad import Launchpad
|
||||
|
||||
|
||||
VALID_IMPORTANCES = ('Undecided', 'Wishlist', 'Low', 'Medium', 'High', 'Critical')
|
||||
|
||||
|
||||
def _parse_args():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Filter out bugs of specified importance.')
|
||||
parser.add_argument(
|
||||
'project', help='Launchpad project name')
|
||||
parser.add_argument(
|
||||
'--importance',
|
||||
nargs='?', choices=VALID_IMPORTANCES, default='Wishlist',
|
||||
help='Bug importance to filter')
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def _filter_bugs(lp, project, importance, bugs):
|
||||
return [
|
||||
bug
|
||||
for bug in bugs
|
||||
for task in lp.bugs[bug].bug_tasks
|
||||
if task.bug_target_name == project and task.importance != importance
|
||||
]
|
||||
|
||||
|
||||
def main():
|
||||
args = _parse_args()
|
||||
|
||||
lp = Launchpad.login_with('openstack-releasing', 'production')
|
||||
|
||||
bugs = [line.strip() for line in sys.stdin.readlines()]
|
||||
for bug in _filter_bugs(lp, args.project, args.importance, bugs):
|
||||
print(bug)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -1,56 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
"""
|
||||
This Launchpad tool is used to filter out bugs by tag.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
from launchpadlib.launchpad import Launchpad
|
||||
|
||||
|
||||
def _parse_args():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Filter out bugs with specified tag.')
|
||||
parser.add_argument(
|
||||
'project', help='Launchpad project name')
|
||||
parser.add_argument(
|
||||
'tag', nargs='?',
|
||||
help='Tag to filter')
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def _filter_bugs(lp, project, tag, bugs):
|
||||
return [
|
||||
bug
|
||||
for bug in bugs
|
||||
for task in lp.bugs[bug].bug_tasks
|
||||
if task.bug_target_name == project and tag not in lp.bugs[bug].tags
|
||||
]
|
||||
|
||||
|
||||
def main():
|
||||
args = _parse_args()
|
||||
|
||||
lp = Launchpad.login_with('openstack-releasing', 'production')
|
||||
|
||||
bugs = [line.strip() for line in sys.stdin.readlines()]
|
||||
for bug in _filter_bugs(lp, args.project, args.tag, bugs):
|
||||
print(bug)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -1,64 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
"""
|
||||
This Launchpad tool is used to reset <release>-backport-potential tags once
|
||||
backports are merged.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
|
||||
from launchpadlib.launchpad import Launchpad
|
||||
|
||||
|
||||
RELEASES = ('liberty', 'mitaka')
|
||||
|
||||
|
||||
def _parse_args():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Reset -backport-potential tags for closed bugs.')
|
||||
parser.add_argument(
|
||||
'projects', metavar='N', type=str, nargs='+',
|
||||
help='Launchpad project names')
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def _cleanup_project(lp, project):
|
||||
print('Processing project %s...' % project)
|
||||
for release in RELEASES:
|
||||
in_tag = 'in-stable-%s' % release
|
||||
potential_tag = '%s-backport-potential' % release
|
||||
|
||||
for task in lp.projects[project].searchTasks(tags=[potential_tag]):
|
||||
bug = task.bug
|
||||
tags = bug.tags
|
||||
|
||||
if in_tag in tags:
|
||||
print("Removing %s tag for %s" % (potential_tag, bug))
|
||||
tags.remove(potential_tag)
|
||||
bug.tags = tags
|
||||
bug.lp_save()
|
||||
|
||||
|
||||
def main():
|
||||
args = _parse_args()
|
||||
|
||||
lp = Launchpad.login_with('openstack-releasing', 'production')
|
||||
|
||||
for project in args.projects:
|
||||
_cleanup_project(lp, project)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
49
lp-tag.py
49
lp-tag.py
@ -1,49 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
"""
|
||||
This Launchpad tool is used to tag bugs with a tag.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
from launchpadlib.launchpad import Launchpad
|
||||
|
||||
|
||||
def _parse_args():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Tag tags with a tag.')
|
||||
parser.add_argument(
|
||||
'tag', help='Tag to use')
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main():
|
||||
args = _parse_args()
|
||||
lp = Launchpad.login_with('openstack-releasing', 'production')
|
||||
bugnums = [line.strip() for line in sys.stdin.readlines()]
|
||||
for bugnum in bugnums:
|
||||
if bugnum:
|
||||
bug = lp.bugs[bugnum]
|
||||
tag = args.tag
|
||||
tags = bug.tags
|
||||
if tag not in tags:
|
||||
tags.append(tag)
|
||||
bug.tags = tags
|
||||
bug.lp_save()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -1,76 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Script to determine version number from milestone codename
|
||||
#
|
||||
# Copyright 2014 Thierry Carrez <thierry@openstack.org>
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
import string
|
||||
import sys
|
||||
|
||||
import launchpadlib.launchpad
|
||||
|
||||
|
||||
def abort(code, errmsg):
|
||||
print(errmsg, file=sys.stderr)
|
||||
sys.exit(code)
|
||||
|
||||
|
||||
# Argument parsing
|
||||
parser = argparse.ArgumentParser(description='Convert milestone code names '
|
||||
'(kilo-1) to version numbers '
|
||||
'(2015.1.0b1)')
|
||||
parser.add_argument('project', help='Project the milestone is defined in')
|
||||
parser.add_argument('milestone', help='Milestone code name')
|
||||
parser.add_argument('--onlycheck', action='store_true',
|
||||
help='Only check milestone exists')
|
||||
args = parser.parse_args()
|
||||
|
||||
# Connect to LP
|
||||
try:
|
||||
launchpad = launchpadlib.launchpad.Launchpad.login_anonymously('openstack-releasing',
|
||||
'production')
|
||||
except Exception as error:
|
||||
abort(2, 'Could not connect to Launchpad: ' + str(error))
|
||||
|
||||
# Retrieve milestone
|
||||
try:
|
||||
lp_proj = launchpad.projects[args.project]
|
||||
except KeyError:
|
||||
abort(2, 'Could not find project: %s' % args.project)
|
||||
|
||||
for target_milestone in lp_proj.all_milestones:
|
||||
if target_milestone.name == args.milestone:
|
||||
break
|
||||
else:
|
||||
abort(2, 'Could not find milestone: %s' % args.milestone)
|
||||
|
||||
if args.onlycheck:
|
||||
sys.exit(0)
|
||||
|
||||
ind = string.lowercase.index(target_milestone.name[0:1])
|
||||
|
||||
if ind < 4:
|
||||
abort(2, 'This script does not support pre-essex numbers')
|
||||
|
||||
year = 2011 + (ind - 2) / 2
|
||||
sequence = (ind % 2) + 1
|
||||
qualifier = 'b'
|
||||
if target_milestone.name[-3:-1].lower() == 'rc':
|
||||
qualifier = 'rc'
|
||||
|
||||
print("%d.%d.0%s%s" % (year, sequence, qualifier, args.milestone[-1:]))
|
@ -1,111 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Script to prepare bugs with no activity for expiration
|
||||
#
|
||||
# Copyright (c) 2015 Thales Services SAS
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from __future__ import print_function
|
||||
from argparse import ArgumentParser
|
||||
import datetime
|
||||
|
||||
from launchpadlib.launchpad import Launchpad
|
||||
from lazr.restfulclient.errors import ServerError
|
||||
import pytz
|
||||
|
||||
|
||||
# Parameters
|
||||
parser = ArgumentParser(
|
||||
description="Unset assignee/milestone for bugs with no activity in bulk")
|
||||
parser.add_argument('projectname', help='The project to act on')
|
||||
parser.add_argument("--test", action='store_const', const='staging',
|
||||
default='production', help='Use LP staging server to test')
|
||||
parser.add_argument("--dry-run", action='store_true',
|
||||
help="Don't actually perform any action")
|
||||
parser.add_argument("--days", type=int, default=365,
|
||||
help='days without activity (default: %(default)s days)')
|
||||
parser.add_argument('exceptions', type=int, nargs='*', help='Bugs to ignore')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Connect to Launchpad
|
||||
print("Connecting to Launchpad...")
|
||||
launchpad = Launchpad.login_with('openstack-prepare-expire', args.test)
|
||||
|
||||
# Retrieve bugs
|
||||
print("Retrieving project...")
|
||||
proj = launchpad.projects[args.projectname]
|
||||
failed = set()
|
||||
|
||||
modified_before = (
|
||||
datetime.datetime.now(pytz.UTC) - datetime.timedelta(days=args.days))
|
||||
|
||||
# Get bugtasks, older first
|
||||
open_statuses = ['New', 'Incomplete', 'Confirmed', 'Triaged', 'In Progress']
|
||||
bugtasks = proj.searchTasks(
|
||||
order_by='date_last_updated', status=open_statuses)
|
||||
|
||||
# Process bugs
|
||||
content = (
|
||||
"This bug is > %s days without activity. We are unsetting assignee "
|
||||
"and milestone and setting status to Incomplete in order to allow "
|
||||
"its expiry in 60 days.\n\n"
|
||||
"If the bug is still valid, then update the bug status.") % args.days
|
||||
|
||||
for bugtask in bugtasks:
|
||||
bug = bugtask.bug
|
||||
|
||||
# Process bugs with no activity after modified_before
|
||||
if bug.date_last_updated > modified_before:
|
||||
break
|
||||
|
||||
# Skip bugs which triggered timeouts in previous runs
|
||||
if bug.id in failed:
|
||||
continue
|
||||
|
||||
print(bug.id, end='')
|
||||
if bug.id in args.exceptions:
|
||||
print(" - excepted")
|
||||
continue
|
||||
|
||||
if bugtask.assignee:
|
||||
bugtask.assignee = None
|
||||
print(" - unset assignee", end='')
|
||||
if bugtask.milestone:
|
||||
bugtask.milestone = None
|
||||
print(" - unset milestone", end='')
|
||||
if bugtask.status != 'Incomplete':
|
||||
bugtask.status = 'Incomplete'
|
||||
print(" - set status Incomplete", end='')
|
||||
|
||||
if not args.dry_run:
|
||||
try:
|
||||
bugtask.lp_save()
|
||||
bug.lp_save()
|
||||
bug.newMessage(content=content)
|
||||
print(" - DONE!", end='')
|
||||
except ServerError:
|
||||
print(" - TIMEOUT!", end='')
|
||||
failed.add(bug.id)
|
||||
except Exception as e:
|
||||
print(" - ERROR! (%s)" % e, end='')
|
||||
failed.add(bug.id)
|
||||
print()
|
||||
|
||||
if failed:
|
||||
print()
|
||||
print("Some bugs could not be automatically updated due to LP timeouts:")
|
||||
for bugid in failed:
|
||||
print("http://bugs.launchpad.net/bugs/%d" % bugid)
|
@ -1,2 +0,0 @@
|
||||
node_modules/
|
||||
/npm-debug.log
|
@ -1,215 +0,0 @@
|
||||
/* global module:false */
|
||||
module.exports = function(grunt) {
|
||||
var port = grunt.option('port') || 8000;
|
||||
var root = grunt.option('root') || '.';
|
||||
|
||||
if (!Array.isArray(root)) root = [root];
|
||||
|
||||
// Project configuration
|
||||
grunt.initConfig({
|
||||
pkg: grunt.file.readJSON('package.json'),
|
||||
meta: {
|
||||
banner:
|
||||
'/*!\n' +
|
||||
' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' +
|
||||
' * http://lab.hakim.se/reveal-js\n' +
|
||||
' * MIT licensed\n' +
|
||||
' *\n' +
|
||||
' * Copyright (C) 2016 Hakim El Hattab, http://hakim.se\n' +
|
||||
' */'
|
||||
},
|
||||
|
||||
uglify: {
|
||||
options: {
|
||||
banner: '<%= meta.banner %>\n'
|
||||
},
|
||||
build: {
|
||||
src: 'js/reveal.js',
|
||||
dest: 'js/reveal.min.js'
|
||||
}
|
||||
},
|
||||
|
||||
sass: {
|
||||
core: {
|
||||
files: {
|
||||
'css/reveal.css': 'css/reveal.scss',
|
||||
}
|
||||
},
|
||||
themes: {
|
||||
files: [
|
||||
{
|
||||
expand: true,
|
||||
cwd: 'css/theme/source',
|
||||
src: ['*.scss'],
|
||||
dest: 'css/theme',
|
||||
ext: '.css'
|
||||
}
|
||||
]
|
||||
},
|
||||
other: {
|
||||
files: [
|
||||
{
|
||||
expand: true,
|
||||
cwd: 'css',
|
||||
src: ['*.scss'],
|
||||
dest: 'css',
|
||||
ext: '.css'
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
autoprefixer: {
|
||||
dist: {
|
||||
src: 'css/reveal.css'
|
||||
}
|
||||
},
|
||||
|
||||
cssmin: {
|
||||
compress: {
|
||||
files: {
|
||||
'css/reveal.min.css': [ 'css/reveal.css' ]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
jshint: {
|
||||
options: {
|
||||
curly: false,
|
||||
eqeqeq: true,
|
||||
immed: true,
|
||||
esnext: true,
|
||||
latedef: true,
|
||||
newcap: true,
|
||||
noarg: true,
|
||||
sub: true,
|
||||
undef: true,
|
||||
eqnull: true,
|
||||
browser: true,
|
||||
expr: true,
|
||||
globals: {
|
||||
head: false,
|
||||
module: false,
|
||||
console: false,
|
||||
unescape: false,
|
||||
define: false,
|
||||
exports: false
|
||||
}
|
||||
},
|
||||
files: [ 'Gruntfile.js', 'js/reveal.js' ]
|
||||
},
|
||||
|
||||
connect: {
|
||||
server: {
|
||||
options: {
|
||||
port: port,
|
||||
base: root,
|
||||
livereload: true,
|
||||
open: true
|
||||
}
|
||||
},
|
||||
|
||||
},
|
||||
|
||||
zip: {
|
||||
'{{cookiecutter.repo_name}}.zip': [
|
||||
'index.html',
|
||||
'css/**',
|
||||
'js/**',
|
||||
'lib/**',
|
||||
'images/**',
|
||||
'img/**',
|
||||
'plugin/**',
|
||||
'**.graphviz',
|
||||
'**.svg',
|
||||
'**.md'
|
||||
]
|
||||
},
|
||||
|
||||
watch: {
|
||||
js: {
|
||||
files: [ 'Gruntfile.js', 'js/reveal.js' ],
|
||||
tasks: 'js'
|
||||
},
|
||||
theme: {
|
||||
files: [ 'css/theme/source/*.scss', 'css/theme/template/*.scss' ],
|
||||
tasks: 'css-themes'
|
||||
},
|
||||
css: {
|
||||
files: [ 'css/reveal.scss' ],
|
||||
tasks: 'css-core'
|
||||
},
|
||||
css_other: {
|
||||
files: [ 'css/selectable.scss' ],
|
||||
tasks: 'css_other'
|
||||
},
|
||||
html: {
|
||||
files: root.map(path => path + '/*.html')
|
||||
},
|
||||
markdown: {
|
||||
files: root.map(path => path + '/*.md')
|
||||
},
|
||||
graphviz: {
|
||||
files: [ '*.graphviz' ],
|
||||
tasks: 'exec:graphviz',
|
||||
},
|
||||
options: {
|
||||
livereload: true
|
||||
}
|
||||
},
|
||||
|
||||
retire: {
|
||||
js: ['js/reveal.js', 'lib/js/*.js', 'plugin/**/*.js'],
|
||||
node: ['.'],
|
||||
options: {}
|
||||
},
|
||||
|
||||
exec: {
|
||||
rsync: './bin/rsync.sh',
|
||||
cog: 'cog.py -r index.html',
|
||||
graphviz: 'dot -O -Tsvg *.graphviz'
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// Dependencies
|
||||
grunt.loadNpmTasks( 'grunt-contrib-qunit' );
|
||||
grunt.loadNpmTasks( 'grunt-contrib-jshint' );
|
||||
grunt.loadNpmTasks( 'grunt-contrib-cssmin' );
|
||||
grunt.loadNpmTasks( 'grunt-contrib-uglify' );
|
||||
grunt.loadNpmTasks( 'grunt-contrib-watch' );
|
||||
grunt.loadNpmTasks( 'grunt-sass' );
|
||||
grunt.loadNpmTasks( 'grunt-contrib-connect' );
|
||||
grunt.loadNpmTasks( 'grunt-autoprefixer' );
|
||||
grunt.loadNpmTasks( 'grunt-zip' );
|
||||
grunt.loadNpmTasks( 'grunt-retire' );
|
||||
|
||||
// Default task
|
||||
grunt.registerTask( 'default', [ 'css', 'js' ] );
|
||||
|
||||
// JS task
|
||||
grunt.registerTask( 'js', [ 'jshint', 'uglify' ] );
|
||||
|
||||
// Theme CSS
|
||||
grunt.registerTask( 'css-themes', [ 'sass:themes' ] );
|
||||
|
||||
// Core framework CSS
|
||||
grunt.registerTask( 'css-core', [ 'sass:core', 'autoprefixer', 'cssmin' ] );
|
||||
|
||||
// All CSS
|
||||
grunt.registerTask( 'css', [ 'sass', 'autoprefixer', 'cssmin' ] );
|
||||
|
||||
// Package presentation to archive
|
||||
grunt.registerTask( 'package', [ 'default', 'zip' ] );
|
||||
|
||||
// Serve presentation locally
|
||||
grunt.registerTask( 'serve', [ 'connect', 'watch' ] );
|
||||
|
||||
// Set up grunt-exec
|
||||
grunt.loadNpmTasks('grunt-exec');
|
||||
|
||||
// Aliases for the grunt exec commands
|
||||
grunt.registerTask('rsync', ['exec:rsync']);
|
||||
grunt.registerTask('cog', ['exec:cog']);
|
||||
|
||||
};
|
@ -1,45 +0,0 @@
|
||||
.. -*- mode: rst -*-
|
||||
|
||||
=====================================
|
||||
6 Months in the Life of OpenStack
|
||||
=====================================
|
||||
|
||||
Requirements
|
||||
============
|
||||
|
||||
This presentation was created using cookiecutter and
|
||||
https://github.com/dhellmann/cookiecutter-reveal.js
|
||||
|
||||
You will need a few tools to build and serve the presentation:
|
||||
|
||||
- `npm <https://www.npmjs.com/>`_
|
||||
- `Python 3 <https://www.python.org/>`_
|
||||
|
||||
Setup
|
||||
=====
|
||||
|
||||
To update the presentation::
|
||||
|
||||
$ pip install -r requirements.txt
|
||||
$ cog.py -r index.html
|
||||
|
||||
To run the presentation::
|
||||
|
||||
$ npm install
|
||||
$ npm start
|
||||
|
||||
Controlling the presentation
|
||||
============================
|
||||
|
||||
- Use the *SPACE BAR* to move to the next slide.
|
||||
- Use the *arrow keys* to move around.
|
||||
- Use the *F* key to enter full screen mode. Press the *ESC* key to leave it again.
|
||||
- Use the *S* key to open the moderator monitor containing the notes.
|
||||
- Use the *B* key to make the screen dark. Push the same key to brighten the screen again.
|
||||
- Use the *ESC* key to enter the bird's-eye view showing all slides. Then use the *arrow keys* to move around.
|
||||
|
||||
License
|
||||
=======
|
||||
|
||||
This work is licensed under a
|
||||
`Creative Commons Attribution 4.0 International License <http://creativecommons.org/licenses/by/4.0/>`_.
|
@ -1,27 +0,0 @@
|
||||
{
|
||||
"name": "reveal.js",
|
||||
"version": "3.4.0",
|
||||
"main": [
|
||||
"js/reveal.js",
|
||||
"css/reveal.css"
|
||||
],
|
||||
"homepage": "http://lab.hakim.se/reveal-js/",
|
||||
"license": "MIT",
|
||||
"description": "The HTML Presentation Framework",
|
||||
"authors": [
|
||||
"Hakim El Hattab <hakim.elhattab@gmail.com>"
|
||||
],
|
||||
"dependencies": {
|
||||
"headjs": "~1.0.3"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/hakimel/reveal.js.git"
|
||||
},
|
||||
"ignore": [
|
||||
"**/.*",
|
||||
"node_modules",
|
||||
"bower_components",
|
||||
"test"
|
||||
]
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
/* Custom CSS rules */
|
||||
i {
|
||||
margin-right: 0.25em;
|
||||
}
|
||||
|
||||
.reveal .creativecommons {
|
||||
margin-top: 2em;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.reveal .creativecommons a img {
|
||||
border-width: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.reveal .creativecommons span {
|
||||
font-size: 0.4em;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -1,203 +0,0 @@
|
||||
/* Default Print Stylesheet Template
|
||||
by Rob Glazebrook of CSSnewbie.com
|
||||
Last Updated: June 4, 2008
|
||||
|
||||
Feel free (nay, compelled) to edit, append, and
|
||||
manipulate this file as you see fit. */
|
||||
|
||||
|
||||
@media print {
|
||||
|
||||
/* SECTION 1: Set default width, margin, float, and
|
||||
background. This prevents elements from extending
|
||||
beyond the edge of the printed page, and prevents
|
||||
unnecessary background images from printing */
|
||||
html {
|
||||
background: #fff;
|
||||
width: auto;
|
||||
height: auto;
|
||||
overflow: visible;
|
||||
}
|
||||
body {
|
||||
background: #fff;
|
||||
font-size: 20pt;
|
||||
width: auto;
|
||||
height: auto;
|
||||
border: 0;
|
||||
margin: 0 5%;
|
||||
padding: 0;
|
||||
overflow: visible;
|
||||
float: none !important;
|
||||
}
|
||||
|
||||
/* SECTION 2: Remove any elements not needed in print.
|
||||
This would include navigation, ads, sidebars, etc. */
|
||||
.nestedarrow,
|
||||
.controls,
|
||||
.fork-reveal,
|
||||
.share-reveal,
|
||||
.state-background,
|
||||
.reveal .progress,
|
||||
.reveal .backgrounds,
|
||||
.reveal .slide-number {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* SECTION 3: Set body font face, size, and color.
|
||||
Consider using a serif font for readability. */
|
||||
body, p, td, li, div {
|
||||
font-size: 20pt!important;
|
||||
font-family: Georgia, "Times New Roman", Times, serif !important;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/* SECTION 4: Set heading font face, sizes, and color.
|
||||
Differentiate your headings from your body text.
|
||||
Perhaps use a large sans-serif for distinction. */
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: #000!important;
|
||||
height: auto;
|
||||
line-height: normal;
|
||||
font-family: Georgia, "Times New Roman", Times, serif !important;
|
||||
text-shadow: 0 0 0 #000 !important;
|
||||
text-align: left;
|
||||
letter-spacing: normal;
|
||||
}
|
||||
/* Need to reduce the size of the fonts for printing */
|
||||
h1 { font-size: 28pt !important; }
|
||||
h2 { font-size: 24pt !important; }
|
||||
h3 { font-size: 22pt !important; }
|
||||
h4 { font-size: 22pt !important; font-variant: small-caps; }
|
||||
h5 { font-size: 21pt !important; }
|
||||
h6 { font-size: 20pt !important; font-style: italic; }
|
||||
|
||||
/* SECTION 5: Make hyperlinks more usable.
|
||||
Ensure links are underlined, and consider appending
|
||||
the URL to the end of the link for usability. */
|
||||
a:link,
|
||||
a:visited {
|
||||
color: #000 !important;
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
}
|
||||
/*
|
||||
.reveal a:link:after,
|
||||
.reveal a:visited:after {
|
||||
content: " (" attr(href) ") ";
|
||||
color: #222 !important;
|
||||
font-size: 90%;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/* SECTION 6: more reveal.js specific additions by @skypanther */
|
||||
ul, ol, div, p {
|
||||
visibility: visible;
|
||||
position: static;
|
||||
width: auto;
|
||||
height: auto;
|
||||
display: block;
|
||||
overflow: visible;
|
||||
margin: 0;
|
||||
text-align: left !important;
|
||||
}
|
||||
.reveal pre,
|
||||
.reveal table {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
.reveal pre code {
|
||||
padding: 20px;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
.reveal blockquote {
|
||||
margin: 20px 0;
|
||||
}
|
||||
.reveal .slides {
|
||||
position: static !important;
|
||||
width: auto !important;
|
||||
height: auto !important;
|
||||
|
||||
left: 0 !important;
|
||||
top: 0 !important;
|
||||
margin-left: 0 !important;
|
||||
margin-top: 0 !important;
|
||||
padding: 0 !important;
|
||||
zoom: 1 !important;
|
||||
|
||||
overflow: visible !important;
|
||||
display: block !important;
|
||||
|
||||
text-align: left !important;
|
||||
-webkit-perspective: none;
|
||||
-moz-perspective: none;
|
||||
-ms-perspective: none;
|
||||
perspective: none;
|
||||
|
||||
-webkit-perspective-origin: 50% 50%;
|
||||
-moz-perspective-origin: 50% 50%;
|
||||
-ms-perspective-origin: 50% 50%;
|
||||
perspective-origin: 50% 50%;
|
||||
}
|
||||
.reveal .slides section {
|
||||
visibility: visible !important;
|
||||
position: static !important;
|
||||
width: auto !important;
|
||||
height: auto !important;
|
||||
display: block !important;
|
||||
overflow: visible !important;
|
||||
|
||||
left: 0 !important;
|
||||
top: 0 !important;
|
||||
margin-left: 0 !important;
|
||||
margin-top: 0 !important;
|
||||
padding: 60px 20px !important;
|
||||
z-index: auto !important;
|
||||
|
||||
opacity: 1 !important;
|
||||
|
||||
page-break-after: always !important;
|
||||
|
||||
-webkit-transform-style: flat !important;
|
||||
-moz-transform-style: flat !important;
|
||||
-ms-transform-style: flat !important;
|
||||
transform-style: flat !important;
|
||||
|
||||
-webkit-transform: none !important;
|
||||
-moz-transform: none !important;
|
||||
-ms-transform: none !important;
|
||||
transform: none !important;
|
||||
|
||||
-webkit-transition: none !important;
|
||||
-moz-transition: none !important;
|
||||
-ms-transition: none !important;
|
||||
transition: none !important;
|
||||
}
|
||||
.reveal .slides section.stack {
|
||||
padding: 0 !important;
|
||||
}
|
||||
.reveal section:last-of-type {
|
||||
page-break-after: avoid !important;
|
||||
}
|
||||
.reveal section .fragment {
|
||||
opacity: 1 !important;
|
||||
visibility: visible !important;
|
||||
|
||||
-webkit-transform: none !important;
|
||||
-moz-transform: none !important;
|
||||
-ms-transform: none !important;
|
||||
transform: none !important;
|
||||
}
|
||||
.reveal section img {
|
||||
display: block;
|
||||
margin: 15px 0px;
|
||||
background: rgba(255,255,255,1);
|
||||
border: 1px solid #666;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.reveal section small {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
}
|
@ -1,170 +0,0 @@
|
||||
/**
|
||||
* This stylesheet is used to print reveal.js
|
||||
* presentations to PDF.
|
||||
*
|
||||
* https://github.com/hakimel/reveal.js#pdf-export
|
||||
*/
|
||||
|
||||
* {
|
||||
-webkit-print-color-adjust: exact;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0 auto !important;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
float: none !important;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
html {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/* Remove any elements not needed in print. */
|
||||
.nestedarrow,
|
||||
.reveal .controls,
|
||||
.reveal .progress,
|
||||
.reveal .playback,
|
||||
.reveal.overview,
|
||||
.fork-reveal,
|
||||
.share-reveal,
|
||||
.state-background {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
text-shadow: 0 0 0 #000 !important;
|
||||
}
|
||||
|
||||
.reveal pre code {
|
||||
overflow: hidden !important;
|
||||
font-family: Courier, 'Courier New', monospace !important;
|
||||
}
|
||||
|
||||
ul, ol, div, p {
|
||||
visibility: visible;
|
||||
position: static;
|
||||
width: auto;
|
||||
height: auto;
|
||||
display: block;
|
||||
overflow: visible;
|
||||
margin: auto;
|
||||
}
|
||||
.reveal {
|
||||
width: auto !important;
|
||||
height: auto !important;
|
||||
overflow: hidden !important;
|
||||
}
|
||||
.reveal .slides {
|
||||
position: static;
|
||||
width: 100% !important;
|
||||
height: auto !important;
|
||||
zoom: 1 !important;
|
||||
|
||||
left: auto;
|
||||
top: auto;
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
|
||||
overflow: visible;
|
||||
display: block;
|
||||
|
||||
-webkit-perspective: none;
|
||||
-moz-perspective: none;
|
||||
-ms-perspective: none;
|
||||
perspective: none;
|
||||
|
||||
-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
|
||||
-moz-perspective-origin: 50% 50%;
|
||||
-ms-perspective-origin: 50% 50%;
|
||||
perspective-origin: 50% 50%;
|
||||
}
|
||||
|
||||
.reveal .slides .pdf-page {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.reveal .slides section {
|
||||
page-break-after: always !important;
|
||||
|
||||
visibility: visible !important;
|
||||
display: block !important;
|
||||
position: relative !important;
|
||||
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
box-sizing: border-box !important;
|
||||
min-height: 1px;
|
||||
|
||||
opacity: 1 !important;
|
||||
|
||||
-webkit-transform-style: flat !important;
|
||||
-moz-transform-style: flat !important;
|
||||
-ms-transform-style: flat !important;
|
||||
transform-style: flat !important;
|
||||
|
||||
-webkit-transform: none !important;
|
||||
-moz-transform: none !important;
|
||||
-ms-transform: none !important;
|
||||
transform: none !important;
|
||||
}
|
||||
|
||||
.reveal section.stack {
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
page-break-after: avoid !important;
|
||||
height: auto !important;
|
||||
min-height: auto !important;
|
||||
}
|
||||
|
||||
.reveal img {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.reveal .roll {
|
||||
overflow: visible;
|
||||
line-height: 1em;
|
||||
}
|
||||
|
||||
/* Slide backgrounds are placed inside of their slide when exporting to PDF */
|
||||
.reveal section .slide-background {
|
||||
display: block !important;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/* Display slide speaker notes when 'showNotes' is enabled */
|
||||
.reveal .speaker-notes-pdf {
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-height: none;
|
||||
top: auto;
|
||||
right: auto;
|
||||
bottom: auto;
|
||||
left: auto;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
/* Layout option which makes notes appear on a separate page */
|
||||
.reveal .speaker-notes-pdf[data-layout="separate-page"] {
|
||||
position: relative;
|
||||
color: inherit;
|
||||
background-color: transparent;
|
||||
padding: 20px;
|
||||
page-break-after: always;
|
||||
}
|
||||
|
||||
/* Display slide numbers when 'slideNumber' is enabled */
|
||||
.reveal .slide-number-pdf {
|
||||
display: block;
|
||||
position: absolute;
|
||||
font-size: 14px;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -1,28 +0,0 @@
|
||||
/* lineselect.js */
|
||||
.reveal .slides section .fragment.highlight-yellow, .reveal .slides section .fragment.highlight-current-yellow {
|
||||
opacity: 1;
|
||||
visibility: inherit; }
|
||||
|
||||
.reveal .slides section .fragment.highlight-yellow.visible {
|
||||
background-color: yellow;
|
||||
border: 3px solid black; }
|
||||
|
||||
.reveal .slides section .fragment.highlight-current-yellow.current-fragment {
|
||||
background-color: yellow;
|
||||
border: 3px solid black; }
|
||||
|
||||
.reveal .slides section pre span.selected {
|
||||
border: .15em solid #f66;
|
||||
padding: .15em .15em .05em .15em;
|
||||
margin: -.30em -.30em -.20em -.30em;
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal .slides section code span.selected {
|
||||
border: .15em solid yellow;
|
||||
background-color: yellow;
|
||||
padding: .15em .15em .05em .15em;
|
||||
margin: -.30em -.30em -.20em -.30em;
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal aside.controls-off {
|
||||
visibility: hidden; }
|
@ -1,41 +0,0 @@
|
||||
/* lineselect.js */
|
||||
.reveal {
|
||||
|
||||
.slides section {
|
||||
|
||||
.fragment.highlight-yellow, .fragment.highlight-current-yellow {
|
||||
opacity: 1;
|
||||
visibility: inherit;
|
||||
}
|
||||
|
||||
.fragment.highlight-yellow.visible {
|
||||
background-color: yellow;
|
||||
border: 3px solid black;
|
||||
}
|
||||
|
||||
.fragment.highlight-current-yellow.current-fragment {
|
||||
background-color: yellow;
|
||||
border: 3px solid black;
|
||||
}
|
||||
|
||||
pre span.selected {
|
||||
border: .15em solid #f66;
|
||||
padding: .15em .15em .05em .15em;
|
||||
margin: -.30em -.30em -.20em -.30em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
code span.selected {
|
||||
border: .15em solid yellow;
|
||||
background-color: yellow;
|
||||
padding: .15em .15em .05em .15em;
|
||||
margin: -.30em -.30em -.20em -.30em;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
aside.controls-off {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
## Dependencies
|
||||
|
||||
Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup
|
||||
|
||||
## Creating a Theme
|
||||
|
||||
To create your own theme, start by duplicating a ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source). It will be automatically compiled by Grunt from Sass to CSS (see the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js)) when you run `grunt css-themes`.
|
||||
|
||||
Each theme file does four things in the following order:
|
||||
|
||||
1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)**
|
||||
Shared utility functions.
|
||||
|
||||
2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)**
|
||||
Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3.
|
||||
|
||||
3. **Override**
|
||||
This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding any selectors and styles you please.
|
||||
|
||||
4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)**
|
||||
The template theme file which will generate final CSS output based on the currently defined variables.
|
@ -1,296 +0,0 @@
|
||||
/**
|
||||
* Beige theme for reveal.js.
|
||||
*
|
||||
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
@import url(../../lib/font/league-gothic/league-gothic.css);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #f7f2d3;
|
||||
background: -moz-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
|
||||
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, white), color-stop(100%, #f7f2d3));
|
||||
background: -webkit-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
|
||||
background: -o-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
|
||||
background: -ms-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
|
||||
background: radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
|
||||
background-color: #f7f3de; }
|
||||
|
||||
.reveal {
|
||||
font-family: "Lato", sans-serif;
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
color: #333; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: rgba(79, 64, 28, 0.99);
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: rgba(79, 64, 28, 0.99);
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #333;
|
||||
font-family: "League Gothic", Impact, sans-serif;
|
||||
font-weight: normal;
|
||||
line-height: 1.2;
|
||||
letter-spacing: normal;
|
||||
text-transform: uppercase;
|
||||
text-shadow: none;
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 3.77em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 2.11em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.55em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #8b743d;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #c0a86e;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #564826; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #333;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #8b743d;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #8b743d; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #8b743d; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #8b743d; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #8b743d; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #c0a86e; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #c0a86e; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #c0a86e; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #c0a86e; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #8b743d;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
@ -1,292 +0,0 @@
|
||||
/**
|
||||
* Black theme for reveal.js. This is the opposite of the 'white' theme.
|
||||
*
|
||||
* By Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
|
||||
section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 {
|
||||
color: #222; }
|
||||
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #222;
|
||||
background-color: #222; }
|
||||
|
||||
.reveal {
|
||||
font-family: "Source Sans Pro", Helvetica, sans-serif;
|
||||
font-size: 42px;
|
||||
font-weight: normal;
|
||||
color: #fff; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: #bee4fd;
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: #bee4fd;
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #fff;
|
||||
font-family: "Source Sans Pro", Helvetica, sans-serif;
|
||||
font-weight: 600;
|
||||
line-height: 1.2;
|
||||
letter-spacing: normal;
|
||||
text-transform: uppercase;
|
||||
text-shadow: none;
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 2.5em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 1.6em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.3em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: none; }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #42affa;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #8dcffc;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #068de9; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #fff;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #42affa;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #42affa; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #42affa; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #42affa; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #42affa; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #8dcffc; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #8dcffc; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #8dcffc; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #8dcffc; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #42affa;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
@ -1,315 +0,0 @@
|
||||
/**
|
||||
* Blood theme for reveal.js
|
||||
* Author: Walther http://github.com/Walther
|
||||
*
|
||||
* Designed to be used with highlight.js theme
|
||||
* "monokai_sublime.css" available from
|
||||
* https://github.com/isagalaev/highlight.js/
|
||||
*
|
||||
* For other themes, change $codeBackground accordingly.
|
||||
*
|
||||
*/
|
||||
@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #222;
|
||||
background-color: #222; }
|
||||
|
||||
.reveal {
|
||||
font-family: Ubuntu, "sans-serif";
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
color: #eee; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: #a23;
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: #a23;
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #eee;
|
||||
font-family: Ubuntu, "sans-serif";
|
||||
font-weight: normal;
|
||||
line-height: 1.2;
|
||||
letter-spacing: normal;
|
||||
text-transform: uppercase;
|
||||
text-shadow: 2px 2px 2px #222;
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 3.77em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 2.11em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.55em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #a23;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #dd5566;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #6a1520; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #eee;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #a23;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #a23; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #a23; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #a23; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #a23; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #dd5566; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #dd5566; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #dd5566; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #dd5566; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #a23;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
||||
|
||||
.reveal p {
|
||||
font-weight: 300;
|
||||
text-shadow: 1px 1px #222; }
|
||||
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
font-weight: 700; }
|
||||
|
||||
.reveal p code {
|
||||
background-color: #23241f;
|
||||
display: inline-block;
|
||||
border-radius: 7px; }
|
||||
|
||||
.reveal small code {
|
||||
vertical-align: baseline; }
|
@ -1,320 +0,0 @@
|
||||
/**
|
||||
* Personal theme based on simple.css.
|
||||
*
|
||||
* This theme is Copyright (C) 2017 Doug Hellmann. It is MIT licensed.
|
||||
* This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
|
||||
* reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 {
|
||||
color: #fff; }
|
||||
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #fff;
|
||||
background-color: #fff; }
|
||||
|
||||
.reveal {
|
||||
font-family: "Lato", sans-serif;
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
color: #000; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: rgba(0, 0, 0, 0.99);
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: rgba(0, 0, 0, 0.99);
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #000;
|
||||
font-family: "News Cycle", Impact, sans-serif;
|
||||
font-weight: normal;
|
||||
line-height: 1.2;
|
||||
letter-spacing: normal;
|
||||
text-transform: none;
|
||||
text-shadow: none;
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 3.77em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 2.11em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.55em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: none; }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #00008B;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #0000f1;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #00003f; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #000;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #00008B;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #00008B; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #00008B; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #00008B; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #00008B; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #0000f1; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #0000f1; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #0000f1; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #0000f1; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #00008B;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
||||
|
||||
/*
|
||||
** dhellmann
|
||||
*/
|
||||
.reveal h1.left, .reveal h2.left, .reveal h3.left, .reveal h4.left, .reveal h5.left, .reveal h6.left {
|
||||
text-align: left;
|
||||
margin-left: 1em; }
|
||||
|
||||
.reveal h1.code, .reveal h1 tt, .reveal h2.code, .reveal h2 tt, .reveal h3.code, .reveal h3 tt, .reveal h4.code, .reveal h4 tt, .reveal h5.code, .reveal h5 tt, .reveal h6.code, .reveal h6 tt {
|
||||
font-family: Monaco, monospace; }
|
||||
|
||||
.reveal pre {
|
||||
width: 98%; }
|
||||
|
||||
.reveal tt {
|
||||
font-family: Monaco, monospace; }
|
||||
|
||||
.reveal small {
|
||||
font-size: 0.5em; }
|
||||
|
||||
.reveal .creativecommons {
|
||||
font-size: 0.4em; }
|
||||
|
||||
.reveal .creativecommons img {
|
||||
vertical-align: middle; }
|
@ -1,298 +0,0 @@
|
||||
/**
|
||||
* League theme for reveal.js.
|
||||
*
|
||||
* This was the default theme pre-3.0.0.
|
||||
*
|
||||
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
@import url(../../lib/font/league-gothic/league-gothic.css);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #1c1e20;
|
||||
background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
|
||||
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20));
|
||||
background: -webkit-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
|
||||
background: -o-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
|
||||
background: -ms-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
|
||||
background: radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
|
||||
background-color: #2b2b2b; }
|
||||
|
||||
.reveal {
|
||||
font-family: "Lato", sans-serif;
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
color: #eee; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: #FF5E99;
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: #FF5E99;
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #eee;
|
||||
font-family: "League Gothic", Impact, sans-serif;
|
||||
font-weight: normal;
|
||||
line-height: 1.2;
|
||||
letter-spacing: normal;
|
||||
text-transform: uppercase;
|
||||
text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2);
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 3.77em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 2.11em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.55em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #13DAEC;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #71e9f4;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #0d99a5; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #eee;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #13DAEC;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #13DAEC; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #13DAEC; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #13DAEC; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #13DAEC; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #71e9f4; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #71e9f4; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #71e9f4; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #71e9f4; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #13DAEC;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
@ -1,296 +0,0 @@
|
||||
/**
|
||||
* Solarized Dark theme for reveal.js.
|
||||
* Author: Achim Staebler
|
||||
*/
|
||||
@import url(../../lib/font/league-gothic/league-gothic.css);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
/**
|
||||
* Solarized colors by Ethan Schoonover
|
||||
*/
|
||||
html * {
|
||||
color-profile: sRGB;
|
||||
rendering-intent: auto; }
|
||||
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #002b36;
|
||||
background-color: #002b36; }
|
||||
|
||||
.reveal {
|
||||
font-family: "Lato", sans-serif;
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
color: #93a1a1; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: #d33682;
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: #d33682;
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #eee8d5;
|
||||
font-family: "League Gothic", Impact, sans-serif;
|
||||
font-weight: normal;
|
||||
line-height: 1.2;
|
||||
letter-spacing: normal;
|
||||
text-transform: uppercase;
|
||||
text-shadow: none;
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 3.77em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 2.11em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.55em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: none; }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #268bd2;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #78b9e6;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #1a6091; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #93a1a1;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #268bd2;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #268bd2; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #268bd2; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #268bd2; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #268bd2; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #78b9e6; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #78b9e6; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #78b9e6; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #78b9e6; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #268bd2;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
@ -1,290 +0,0 @@
|
||||
/**
|
||||
* Black theme for reveal.js.
|
||||
*
|
||||
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
@import url(https://fonts.googleapis.com/css?family=Montserrat:700);
|
||||
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #111;
|
||||
background-color: #111; }
|
||||
|
||||
.reveal {
|
||||
font-family: "Open Sans", sans-serif;
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
color: #eee; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: #e7ad52;
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: #e7ad52;
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #eee;
|
||||
font-family: "Montserrat", Impact, sans-serif;
|
||||
font-weight: normal;
|
||||
line-height: 1.2;
|
||||
letter-spacing: -0.03em;
|
||||
text-transform: none;
|
||||
text-shadow: none;
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 3.77em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 2.11em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.55em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: none; }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #e7ad52;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #f3d7ac;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #d08a1d; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #eee;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #e7ad52;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #e7ad52; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #e7ad52; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #e7ad52; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #e7ad52; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #f3d7ac; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #f3d7ac; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #f3d7ac; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #f3d7ac; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #e7ad52;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
@ -1,292 +0,0 @@
|
||||
/**
|
||||
* A simple theme for reveal.js presentations, similar
|
||||
* to the default theme. The accent color is brown.
|
||||
*
|
||||
* This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
|
||||
*/
|
||||
.reveal a {
|
||||
line-height: 1.3em; }
|
||||
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #F0F1EB;
|
||||
background-color: #F0F1EB; }
|
||||
|
||||
.reveal {
|
||||
font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
color: #000; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: #26351C;
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: #26351C;
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #383D3D;
|
||||
font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
|
||||
font-weight: normal;
|
||||
line-height: 1.2;
|
||||
letter-spacing: normal;
|
||||
text-transform: none;
|
||||
text-shadow: none;
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 3.77em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 2.11em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.55em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: none; }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #51483D;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #8b7c69;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #25211c; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #000;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #51483D;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #51483D; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #51483D; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #51483D; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #51483D; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #8b7c69; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #8b7c69; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #8b7c69; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #8b7c69; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #51483D;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
@ -1,295 +0,0 @@
|
||||
/**
|
||||
* A simple theme for reveal.js presentations, similar
|
||||
* to the default theme. The accent color is darkblue.
|
||||
*
|
||||
* This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
|
||||
* reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 {
|
||||
color: #fff; }
|
||||
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #fff;
|
||||
background-color: #fff; }
|
||||
|
||||
.reveal {
|
||||
font-family: "Lato", sans-serif;
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
color: #000; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: rgba(0, 0, 0, 0.99);
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: rgba(0, 0, 0, 0.99);
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #000;
|
||||
font-family: "News Cycle", Impact, sans-serif;
|
||||
font-weight: normal;
|
||||
line-height: 1.2;
|
||||
letter-spacing: normal;
|
||||
text-transform: none;
|
||||
text-shadow: none;
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 3.77em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 2.11em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.55em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: none; }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #00008B;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #0000f1;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #00003f; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #000;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #00008B;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #00008B; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #00008B; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #00008B; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #00008B; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #0000f1; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #0000f1; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #0000f1; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #0000f1; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #00008B;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
@ -1,299 +0,0 @@
|
||||
/**
|
||||
* Sky theme for reveal.js.
|
||||
*
|
||||
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
|
||||
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
|
||||
.reveal a {
|
||||
line-height: 1.3em; }
|
||||
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #add9e4;
|
||||
background: -moz-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
|
||||
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #f7fbfc), color-stop(100%, #add9e4));
|
||||
background: -webkit-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
|
||||
background: -o-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
|
||||
background: -ms-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
|
||||
background: radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
|
||||
background-color: #f7fbfc; }
|
||||
|
||||
.reveal {
|
||||
font-family: "Open Sans", sans-serif;
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
color: #333; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: #134674;
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: #134674;
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #333;
|
||||
font-family: "Quicksand", sans-serif;
|
||||
font-weight: normal;
|
||||
line-height: 1.2;
|
||||
letter-spacing: -0.08em;
|
||||
text-transform: uppercase;
|
||||
text-shadow: none;
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 3.77em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 2.11em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.55em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: none; }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #3b759e;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #74a7cb;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #264c66; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #333;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #3b759e;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #3b759e; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #3b759e; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #3b759e; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #3b759e; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #74a7cb; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #74a7cb; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #74a7cb; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #74a7cb; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #3b759e;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
@ -1,296 +0,0 @@
|
||||
/**
|
||||
* Solarized Light theme for reveal.js.
|
||||
* Author: Achim Staebler
|
||||
*/
|
||||
@import url(../../lib/font/league-gothic/league-gothic.css);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
/**
|
||||
* Solarized colors by Ethan Schoonover
|
||||
*/
|
||||
html * {
|
||||
color-profile: sRGB;
|
||||
rendering-intent: auto; }
|
||||
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #fdf6e3;
|
||||
background-color: #fdf6e3; }
|
||||
|
||||
.reveal {
|
||||
font-family: "Lato", sans-serif;
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
color: #657b83; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: #d33682;
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: #d33682;
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #586e75;
|
||||
font-family: "League Gothic", Impact, sans-serif;
|
||||
font-weight: normal;
|
||||
line-height: 1.2;
|
||||
letter-spacing: normal;
|
||||
text-transform: uppercase;
|
||||
text-shadow: none;
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 3.77em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 2.11em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.55em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: none; }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #268bd2;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #78b9e6;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #1a6091; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #657b83;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #268bd2;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #268bd2; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #268bd2; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #268bd2; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #268bd2; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #78b9e6; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #78b9e6; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #78b9e6; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #78b9e6; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #268bd2;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
@ -1,39 +0,0 @@
|
||||
/**
|
||||
* Beige theme for reveal.js.
|
||||
*
|
||||
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Include theme-specific fonts
|
||||
@import url(../../lib/font/league-gothic/league-gothic.css);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
|
||||
|
||||
// Override theme settings (see ../template/settings.scss)
|
||||
$mainColor: #333;
|
||||
$headingColor: #333;
|
||||
$headingTextShadow: none;
|
||||
$backgroundColor: #f7f3de;
|
||||
$linkColor: #8b743d;
|
||||
$linkColorHover: lighten( $linkColor, 20% );
|
||||
$selectionBackgroundColor: rgba(79, 64, 28, 0.99);
|
||||
$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
|
||||
|
||||
// Background generator
|
||||
@mixin bodyBackground() {
|
||||
@include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
@ -1,49 +0,0 @@
|
||||
/**
|
||||
* Black theme for reveal.js. This is the opposite of the 'white' theme.
|
||||
*
|
||||
* By Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
|
||||
// Include theme-specific fonts
|
||||
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
|
||||
|
||||
|
||||
// Override theme settings (see ../template/settings.scss)
|
||||
$backgroundColor: #222;
|
||||
|
||||
$mainColor: #fff;
|
||||
$headingColor: #fff;
|
||||
|
||||
$mainFontSize: 42px;
|
||||
$mainFont: 'Source Sans Pro', Helvetica, sans-serif;
|
||||
$headingFont: 'Source Sans Pro', Helvetica, sans-serif;
|
||||
$headingTextShadow: none;
|
||||
$headingLetterSpacing: normal;
|
||||
$headingTextTransform: uppercase;
|
||||
$headingFontWeight: 600;
|
||||
$linkColor: #42affa;
|
||||
$linkColorHover: lighten( $linkColor, 15% );
|
||||
$selectionBackgroundColor: lighten( $linkColor, 25% );
|
||||
|
||||
$heading1Size: 2.5em;
|
||||
$heading2Size: 1.6em;
|
||||
$heading3Size: 1.3em;
|
||||
$heading4Size: 1.0em;
|
||||
|
||||
section.has-light-background {
|
||||
&, h1, h2, h3, h4, h5, h6 {
|
||||
color: #222;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
@ -1,78 +0,0 @@
|
||||
/**
|
||||
* Blood theme for reveal.js
|
||||
* Author: Walther http://github.com/Walther
|
||||
*
|
||||
* Designed to be used with highlight.js theme
|
||||
* "monokai_sublime.css" available from
|
||||
* https://github.com/isagalaev/highlight.js/
|
||||
*
|
||||
* For other themes, change $codeBackground accordingly.
|
||||
*
|
||||
*/
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
// Include theme-specific fonts
|
||||
|
||||
@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
|
||||
|
||||
// Colors used in the theme
|
||||
$blood: #a23;
|
||||
$coal: #222;
|
||||
$codeBackground: #23241f;
|
||||
|
||||
$backgroundColor: $coal;
|
||||
|
||||
// Main text
|
||||
$mainFont: Ubuntu, 'sans-serif';
|
||||
$mainColor: #eee;
|
||||
|
||||
// Headings
|
||||
$headingFont: Ubuntu, 'sans-serif';
|
||||
$headingTextShadow: 2px 2px 2px $coal;
|
||||
|
||||
// h1 shadow, borrowed humbly from
|
||||
// (c) Default theme by Hakim El Hattab
|
||||
$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
|
||||
|
||||
// Links
|
||||
$linkColor: $blood;
|
||||
$linkColorHover: lighten( $linkColor, 20% );
|
||||
|
||||
// Text selection
|
||||
$selectionBackgroundColor: $blood;
|
||||
$selectionColor: #fff;
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
||||
|
||||
// some overrides after theme template import
|
||||
|
||||
.reveal p {
|
||||
font-weight: 300;
|
||||
text-shadow: 1px 1px $coal;
|
||||
}
|
||||
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.reveal p code {
|
||||
background-color: $codeBackground;
|
||||
display: inline-block;
|
||||
border-radius: 7px;
|
||||
}
|
||||
|
||||
.reveal small code {
|
||||
vertical-align: baseline;
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
/**
|
||||
* Personal theme based on simple.css.
|
||||
*
|
||||
* This theme is Copyright (C) 2017 Doug Hellmann. It is MIT licensed.
|
||||
* This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
|
||||
* reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Include theme-specific fonts
|
||||
@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
|
||||
|
||||
// Override theme settings (see ../template/settings.scss)
|
||||
$mainFont: 'Lato', sans-serif;
|
||||
$mainColor: #000;
|
||||
$headingFont: 'News Cycle', Impact, sans-serif;
|
||||
$headingColor: #000;
|
||||
$headingTextShadow: none;
|
||||
$headingTextTransform: none;
|
||||
$backgroundColor: #fff;
|
||||
$linkColor: #00008B;
|
||||
$linkColorHover: lighten( $linkColor, 20% );
|
||||
$selectionBackgroundColor: rgba(0, 0, 0, 0.99);
|
||||
|
||||
section.has-dark-background {
|
||||
&, h1, h2, h3, h4, h5, h6 {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
||||
|
||||
/*
|
||||
** dhellmann
|
||||
*/
|
||||
|
||||
.reveal {
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
&.left {
|
||||
text-align: left;
|
||||
margin-left: 1em;
|
||||
}
|
||||
&.code, & tt {
|
||||
font-family: Monaco, monospace;
|
||||
}
|
||||
}
|
||||
|
||||
pre {
|
||||
width: 98%;
|
||||
}
|
||||
|
||||
tt {
|
||||
font-family: Monaco, monospace;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 0.5em;
|
||||
}
|
||||
|
||||
.creativecommons {
|
||||
font-size: 0.4em;
|
||||
}
|
||||
|
||||
.creativecommons img {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/**
|
||||
* League theme for reveal.js.
|
||||
*
|
||||
* This was the default theme pre-3.0.0.
|
||||
*
|
||||
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Include theme-specific fonts
|
||||
@import url(../../lib/font/league-gothic/league-gothic.css);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
|
||||
// Override theme settings (see ../template/settings.scss)
|
||||
$headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2);
|
||||
$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
|
||||
|
||||
// Background generator
|
||||
@mixin bodyBackground() {
|
||||
@include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
@ -1,57 +0,0 @@
|
||||
/**
|
||||
* Solarized Dark theme for reveal.js.
|
||||
* Author: Achim Staebler
|
||||
*/
|
||||
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Include theme-specific fonts
|
||||
@import url(../../lib/font/league-gothic/league-gothic.css);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
|
||||
/**
|
||||
* Solarized colors by Ethan Schoonover
|
||||
*/
|
||||
html * {
|
||||
color-profile: sRGB;
|
||||
rendering-intent: auto;
|
||||
}
|
||||
|
||||
// Solarized colors
|
||||
$base03: #002b36;
|
||||
$base02: #073642;
|
||||
$base01: #586e75;
|
||||
$base00: #657b83;
|
||||
$base0: #839496;
|
||||
$base1: #93a1a1;
|
||||
$base2: #eee8d5;
|
||||
$base3: #fdf6e3;
|
||||
$yellow: #b58900;
|
||||
$orange: #cb4b16;
|
||||
$red: #dc322f;
|
||||
$magenta: #d33682;
|
||||
$violet: #6c71c4;
|
||||
$blue: #268bd2;
|
||||
$cyan: #2aa198;
|
||||
$green: #859900;
|
||||
|
||||
// Override theme settings (see ../template/settings.scss)
|
||||
$mainColor: $base1;
|
||||
$headingColor: $base2;
|
||||
$headingTextShadow: none;
|
||||
$backgroundColor: $base03;
|
||||
$linkColor: $blue;
|
||||
$linkColorHover: lighten( $linkColor, 20% );
|
||||
$selectionBackgroundColor: $magenta;
|
||||
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
@ -1,34 +0,0 @@
|
||||
/**
|
||||
* Black theme for reveal.js.
|
||||
*
|
||||
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
|
||||
// Include theme-specific fonts
|
||||
@import url(https://fonts.googleapis.com/css?family=Montserrat:700);
|
||||
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
|
||||
|
||||
|
||||
// Override theme settings (see ../template/settings.scss)
|
||||
$backgroundColor: #111;
|
||||
|
||||
$mainFont: 'Open Sans', sans-serif;
|
||||
$linkColor: #e7ad52;
|
||||
$linkColorHover: lighten( $linkColor, 20% );
|
||||
$headingFont: 'Montserrat', Impact, sans-serif;
|
||||
$headingTextShadow: none;
|
||||
$headingLetterSpacing: -0.03em;
|
||||
$headingTextTransform: none;
|
||||
$selectionBackgroundColor: #e7ad52;
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
@ -1,35 +0,0 @@
|
||||
/**
|
||||
* A simple theme for reveal.js presentations, similar
|
||||
* to the default theme. The accent color is brown.
|
||||
*
|
||||
* This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
|
||||
*/
|
||||
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Override theme settings (see ../template/settings.scss)
|
||||
$mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
|
||||
$mainColor: #000;
|
||||
$headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
|
||||
$headingColor: #383D3D;
|
||||
$headingTextShadow: none;
|
||||
$headingTextTransform: none;
|
||||
$backgroundColor: #F0F1EB;
|
||||
$linkColor: #51483D;
|
||||
$linkColorHover: lighten( $linkColor, 20% );
|
||||
$selectionBackgroundColor: #26351C;
|
||||
|
||||
.reveal a {
|
||||
line-height: 1.3em;
|
||||
}
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
@ -1,43 +0,0 @@
|
||||
/**
|
||||
* A simple theme for reveal.js presentations, similar
|
||||
* to the default theme. The accent color is darkblue.
|
||||
*
|
||||
* This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
|
||||
* reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Include theme-specific fonts
|
||||
@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
|
||||
|
||||
// Override theme settings (see ../template/settings.scss)
|
||||
$mainFont: 'Lato', sans-serif;
|
||||
$mainColor: #000;
|
||||
$headingFont: 'News Cycle', Impact, sans-serif;
|
||||
$headingColor: #000;
|
||||
$headingTextShadow: none;
|
||||
$headingTextTransform: none;
|
||||
$backgroundColor: #fff;
|
||||
$linkColor: #00008B;
|
||||
$linkColorHover: lighten( $linkColor, 20% );
|
||||
$selectionBackgroundColor: rgba(0, 0, 0, 0.99);
|
||||
|
||||
section.has-dark-background {
|
||||
&, h1, h2, h3, h4, h5, h6 {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
@ -1,46 +0,0 @@
|
||||
/**
|
||||
* Sky theme for reveal.js.
|
||||
*
|
||||
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Include theme-specific fonts
|
||||
@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
|
||||
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
|
||||
|
||||
|
||||
// Override theme settings (see ../template/settings.scss)
|
||||
$mainFont: 'Open Sans', sans-serif;
|
||||
$mainColor: #333;
|
||||
$headingFont: 'Quicksand', sans-serif;
|
||||
$headingColor: #333;
|
||||
$headingLetterSpacing: -0.08em;
|
||||
$headingTextShadow: none;
|
||||
$backgroundColor: #f7fbfc;
|
||||
$linkColor: #3b759e;
|
||||
$linkColorHover: lighten( $linkColor, 20% );
|
||||
$selectionBackgroundColor: #134674;
|
||||
|
||||
// Fix links so they are not cut off
|
||||
.reveal a {
|
||||
line-height: 1.3em;
|
||||
}
|
||||
|
||||
// Background generator
|
||||
@mixin bodyBackground() {
|
||||
@include radial-gradient( #add9e4, #f7fbfc );
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
@ -1,63 +0,0 @@
|
||||
/**
|
||||
* Solarized Light theme for reveal.js.
|
||||
* Author: Achim Staebler
|
||||
*/
|
||||
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Include theme-specific fonts
|
||||
@import url(../../lib/font/league-gothic/league-gothic.css);
|
||||
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
|
||||
|
||||
|
||||
/**
|
||||
* Solarized colors by Ethan Schoonover
|
||||
*/
|
||||
html * {
|
||||
color-profile: sRGB;
|
||||
rendering-intent: auto;
|
||||
}
|
||||
|
||||
// Solarized colors
|
||||
$base03: #002b36;
|
||||
$base02: #073642;
|
||||
$base01: #586e75;
|
||||
$base00: #657b83;
|
||||
$base0: #839496;
|
||||
$base1: #93a1a1;
|
||||
$base2: #eee8d5;
|
||||
$base3: #fdf6e3;
|
||||
$yellow: #b58900;
|
||||
$orange: #cb4b16;
|
||||
$red: #dc322f;
|
||||
$magenta: #d33682;
|
||||
$violet: #6c71c4;
|
||||
$blue: #268bd2;
|
||||
$cyan: #2aa198;
|
||||
$green: #859900;
|
||||
|
||||
// Override theme settings (see ../template/settings.scss)
|
||||
$mainColor: $base00;
|
||||
$headingColor: $base01;
|
||||
$headingTextShadow: none;
|
||||
$backgroundColor: $base3;
|
||||
$linkColor: $blue;
|
||||
$linkColorHover: lighten( $linkColor, 20% );
|
||||
$selectionBackgroundColor: $magenta;
|
||||
|
||||
// Background generator
|
||||
// @mixin bodyBackground() {
|
||||
// @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) );
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
@ -1,49 +0,0 @@
|
||||
/**
|
||||
* White theme for reveal.js. This is the opposite of the 'black' theme.
|
||||
*
|
||||
* By Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
|
||||
|
||||
// Default mixins and settings -----------------
|
||||
@import "../template/mixins";
|
||||
@import "../template/settings";
|
||||
// ---------------------------------------------
|
||||
|
||||
|
||||
// Include theme-specific fonts
|
||||
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
|
||||
|
||||
|
||||
// Override theme settings (see ../template/settings.scss)
|
||||
$backgroundColor: #fff;
|
||||
|
||||
$mainColor: #222;
|
||||
$headingColor: #222;
|
||||
|
||||
$mainFontSize: 42px;
|
||||
$mainFont: 'Source Sans Pro', Helvetica, sans-serif;
|
||||
$headingFont: 'Source Sans Pro', Helvetica, sans-serif;
|
||||
$headingTextShadow: none;
|
||||
$headingLetterSpacing: normal;
|
||||
$headingTextTransform: uppercase;
|
||||
$headingFontWeight: 600;
|
||||
$linkColor: #2a76dd;
|
||||
$linkColorHover: lighten( $linkColor, 15% );
|
||||
$selectionBackgroundColor: lighten( $linkColor, 25% );
|
||||
|
||||
$heading1Size: 2.5em;
|
||||
$heading2Size: 1.6em;
|
||||
$heading3Size: 1.3em;
|
||||
$heading4Size: 1.0em;
|
||||
|
||||
section.has-dark-background {
|
||||
&, h1, h2, h3, h4, h5, h6 {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Theme template ------------------------------
|
||||
@import "../template/theme";
|
||||
// ---------------------------------------------
|
@ -1,29 +0,0 @@
|
||||
@mixin vertical-gradient( $top, $bottom ) {
|
||||
background: $top;
|
||||
background: -moz-linear-gradient( top, $top 0%, $bottom 100% );
|
||||
background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) );
|
||||
background: -webkit-linear-gradient( top, $top 0%, $bottom 100% );
|
||||
background: -o-linear-gradient( top, $top 0%, $bottom 100% );
|
||||
background: -ms-linear-gradient( top, $top 0%, $bottom 100% );
|
||||
background: linear-gradient( top, $top 0%, $bottom 100% );
|
||||
}
|
||||
|
||||
@mixin horizontal-gradient( $top, $bottom ) {
|
||||
background: $top;
|
||||
background: -moz-linear-gradient( left, $top 0%, $bottom 100% );
|
||||
background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) );
|
||||
background: -webkit-linear-gradient( left, $top 0%, $bottom 100% );
|
||||
background: -o-linear-gradient( left, $top 0%, $bottom 100% );
|
||||
background: -ms-linear-gradient( left, $top 0%, $bottom 100% );
|
||||
background: linear-gradient( left, $top 0%, $bottom 100% );
|
||||
}
|
||||
|
||||
@mixin radial-gradient( $outer, $inner, $type: circle ) {
|
||||
background: $outer;
|
||||
background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
|
||||
background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) );
|
||||
background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
|
||||
background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
|
||||
background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
|
||||
background: radial-gradient( center, $type cover, $inner 0%, $outer 100% );
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
// Base settings for all themes that can optionally be
|
||||
// overridden by the super-theme
|
||||
|
||||
// Background of the presentation
|
||||
$backgroundColor: #2b2b2b;
|
||||
|
||||
// Primary/body text
|
||||
$mainFont: 'Lato', sans-serif;
|
||||
$mainFontSize: 40px;
|
||||
$mainColor: #eee;
|
||||
|
||||
// Vertical spacing between blocks of text
|
||||
$blockMargin: 20px;
|
||||
|
||||
// Headings
|
||||
$headingMargin: 0 0 $blockMargin 0;
|
||||
$headingFont: 'League Gothic', Impact, sans-serif;
|
||||
$headingColor: #eee;
|
||||
$headingLineHeight: 1.2;
|
||||
$headingLetterSpacing: normal;
|
||||
$headingTextTransform: uppercase;
|
||||
$headingTextShadow: none;
|
||||
$headingFontWeight: normal;
|
||||
$heading1TextShadow: $headingTextShadow;
|
||||
|
||||
$heading1Size: 3.77em;
|
||||
$heading2Size: 2.11em;
|
||||
$heading3Size: 1.55em;
|
||||
$heading4Size: 1.00em;
|
||||
|
||||
// Links and actions
|
||||
$linkColor: #13DAEC;
|
||||
$linkColorHover: lighten( $linkColor, 20% );
|
||||
|
||||
// Text selection
|
||||
$selectionBackgroundColor: #FF5E99;
|
||||
$selectionColor: #fff;
|
||||
|
||||
// Generates the presentation background, can be overridden
|
||||
// to return a background image or gradient
|
||||
@mixin bodyBackground() {
|
||||
background: $backgroundColor;
|
||||
}
|
@ -1,352 +0,0 @@
|
||||
// Base theme template for reveal.js
|
||||
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
|
||||
body {
|
||||
@include bodyBackground();
|
||||
background-color: $backgroundColor;
|
||||
}
|
||||
|
||||
.reveal {
|
||||
font-family: $mainFont;
|
||||
font-size: $mainFontSize;
|
||||
font-weight: normal;
|
||||
color: $mainColor;
|
||||
}
|
||||
|
||||
::selection {
|
||||
color: $selectionColor;
|
||||
background: $selectionBackgroundColor;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
::-moz-selection {
|
||||
color: $selectionColor;
|
||||
background: $selectionBackgroundColor;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
.reveal .slides>section,
|
||||
.reveal .slides>section>section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit;
|
||||
}
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: $headingMargin;
|
||||
color: $headingColor;
|
||||
|
||||
font-family: $headingFont;
|
||||
font-weight: $headingFontWeight;
|
||||
line-height: $headingLineHeight;
|
||||
letter-spacing: $headingLetterSpacing;
|
||||
|
||||
text-transform: $headingTextTransform;
|
||||
text-shadow: $headingTextShadow;
|
||||
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
.reveal h1 {font-size: $heading1Size; }
|
||||
.reveal h2 {font-size: $heading2Size; }
|
||||
.reveal h3 {font-size: $heading3Size; }
|
||||
.reveal h4 {font-size: $heading4Size; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: $heading1TextShadow;
|
||||
}
|
||||
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
|
||||
.reveal p {
|
||||
margin: $blockMargin 0;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%;
|
||||
}
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.reveal em {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em;
|
||||
}
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc;
|
||||
}
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square;
|
||||
}
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle;
|
||||
}
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px;
|
||||
}
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px;
|
||||
}
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none;
|
||||
}
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: $blockMargin auto;
|
||||
padding: 5px;
|
||||
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0,0,0,0.2);
|
||||
}
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.reveal q {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: $blockMargin auto;
|
||||
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
|
||||
word-wrap: break-word;
|
||||
|
||||
box-shadow: 0px 0px 6px rgba(0,0,0,0.3);
|
||||
}
|
||||
.reveal code {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal;
|
||||
}
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid;
|
||||
}
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super;
|
||||
}
|
||||
.reveal sub {
|
||||
vertical-align: sub;
|
||||
}
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
|
||||
.reveal a {
|
||||
color: $linkColor;
|
||||
text-decoration: none;
|
||||
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease;
|
||||
}
|
||||
.reveal a:hover {
|
||||
color: $linkColorHover;
|
||||
|
||||
text-shadow: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: darken( $linkColor, 15% );
|
||||
}
|
||||
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255,255,255,0.12);
|
||||
border: 4px solid $mainColor;
|
||||
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear;
|
||||
}
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255,255,255,0.2);
|
||||
border-color: $linkColor;
|
||||
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
|
||||
}
|
||||
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: $linkColor;
|
||||
}
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: $linkColor;
|
||||
}
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: $linkColor;
|
||||
}
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: $linkColor;
|
||||
}
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: $linkColorHover;
|
||||
}
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: $linkColorHover;
|
||||
}
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: $linkColorHover;
|
||||
}
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: $linkColorHover;
|
||||
}
|
||||
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
|
||||
.reveal .progress {
|
||||
background: rgba(0,0,0,0.2);
|
||||
}
|
||||
.reveal .progress span {
|
||||
background: $linkColor;
|
||||
|
||||
-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
|
||||
}
|
||||
|
||||
|
@ -1,292 +0,0 @@
|
||||
/**
|
||||
* White theme for reveal.js. This is the opposite of the 'black' theme.
|
||||
*
|
||||
* By Hakim El Hattab, http://hakim.se
|
||||
*/
|
||||
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
|
||||
section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 {
|
||||
color: #fff; }
|
||||
|
||||
/*********************************************
|
||||
* GLOBAL STYLES
|
||||
*********************************************/
|
||||
body {
|
||||
background: #fff;
|
||||
background-color: #fff; }
|
||||
|
||||
.reveal {
|
||||
font-family: "Source Sans Pro", Helvetica, sans-serif;
|
||||
font-size: 42px;
|
||||
font-weight: normal;
|
||||
color: #222; }
|
||||
|
||||
::selection {
|
||||
color: #fff;
|
||||
background: #98bdef;
|
||||
text-shadow: none; }
|
||||
|
||||
::-moz-selection {
|
||||
color: #fff;
|
||||
background: #98bdef;
|
||||
text-shadow: none; }
|
||||
|
||||
.reveal .slides > section,
|
||||
.reveal .slides > section > section {
|
||||
line-height: 1.3;
|
||||
font-weight: inherit; }
|
||||
|
||||
/*********************************************
|
||||
* HEADERS
|
||||
*********************************************/
|
||||
.reveal h1,
|
||||
.reveal h2,
|
||||
.reveal h3,
|
||||
.reveal h4,
|
||||
.reveal h5,
|
||||
.reveal h6 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #222;
|
||||
font-family: "Source Sans Pro", Helvetica, sans-serif;
|
||||
font-weight: 600;
|
||||
line-height: 1.2;
|
||||
letter-spacing: normal;
|
||||
text-transform: uppercase;
|
||||
text-shadow: none;
|
||||
word-wrap: break-word; }
|
||||
|
||||
.reveal h1 {
|
||||
font-size: 2.5em; }
|
||||
|
||||
.reveal h2 {
|
||||
font-size: 1.6em; }
|
||||
|
||||
.reveal h3 {
|
||||
font-size: 1.3em; }
|
||||
|
||||
.reveal h4 {
|
||||
font-size: 1em; }
|
||||
|
||||
.reveal h1 {
|
||||
text-shadow: none; }
|
||||
|
||||
/*********************************************
|
||||
* OTHER
|
||||
*********************************************/
|
||||
.reveal p {
|
||||
margin: 20px 0;
|
||||
line-height: 1.3; }
|
||||
|
||||
/* Ensure certain elements are never larger than the slide itself */
|
||||
.reveal img,
|
||||
.reveal video,
|
||||
.reveal iframe {
|
||||
max-width: 95%;
|
||||
max-height: 95%; }
|
||||
|
||||
.reveal strong,
|
||||
.reveal b {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal em {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal ol,
|
||||
.reveal dl,
|
||||
.reveal ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
margin: 0 0 0 1em; }
|
||||
|
||||
.reveal ol {
|
||||
list-style-type: decimal; }
|
||||
|
||||
.reveal ul {
|
||||
list-style-type: disc; }
|
||||
|
||||
.reveal ul ul {
|
||||
list-style-type: square; }
|
||||
|
||||
.reveal ul ul ul {
|
||||
list-style-type: circle; }
|
||||
|
||||
.reveal ul ul,
|
||||
.reveal ul ol,
|
||||
.reveal ol ol,
|
||||
.reveal ol ul {
|
||||
display: block;
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal dt {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal dd {
|
||||
margin-left: 40px; }
|
||||
|
||||
.reveal q,
|
||||
.reveal blockquote {
|
||||
quotes: none; }
|
||||
|
||||
.reveal blockquote {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
padding: 5px;
|
||||
font-style: italic;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal blockquote p:first-child,
|
||||
.reveal blockquote p:last-child {
|
||||
display: inline-block; }
|
||||
|
||||
.reveal q {
|
||||
font-style: italic; }
|
||||
|
||||
.reveal pre {
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 90%;
|
||||
margin: 20px auto;
|
||||
text-align: left;
|
||||
font-size: 0.55em;
|
||||
font-family: monospace;
|
||||
line-height: 1.2em;
|
||||
word-wrap: break-word;
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
|
||||
|
||||
.reveal code {
|
||||
font-family: monospace; }
|
||||
|
||||
.reveal pre code {
|
||||
display: block;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
word-wrap: normal; }
|
||||
|
||||
.reveal table {
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.reveal table th {
|
||||
font-weight: bold; }
|
||||
|
||||
.reveal table th,
|
||||
.reveal table td {
|
||||
text-align: left;
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
border-bottom: 1px solid; }
|
||||
|
||||
.reveal table th[align="center"],
|
||||
.reveal table td[align="center"] {
|
||||
text-align: center; }
|
||||
|
||||
.reveal table th[align="right"],
|
||||
.reveal table td[align="right"] {
|
||||
text-align: right; }
|
||||
|
||||
.reveal table tbody tr:last-child th,
|
||||
.reveal table tbody tr:last-child td {
|
||||
border-bottom: none; }
|
||||
|
||||
.reveal sup {
|
||||
vertical-align: super; }
|
||||
|
||||
.reveal sub {
|
||||
vertical-align: sub; }
|
||||
|
||||
.reveal small {
|
||||
display: inline-block;
|
||||
font-size: 0.6em;
|
||||
line-height: 1.2em;
|
||||
vertical-align: top; }
|
||||
|
||||
.reveal small * {
|
||||
vertical-align: top; }
|
||||
|
||||
/*********************************************
|
||||
* LINKS
|
||||
*********************************************/
|
||||
.reveal a {
|
||||
color: #2a76dd;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .15s ease;
|
||||
-moz-transition: color .15s ease;
|
||||
transition: color .15s ease; }
|
||||
|
||||
.reveal a:hover {
|
||||
color: #6ca0e8;
|
||||
text-shadow: none;
|
||||
border: none; }
|
||||
|
||||
.reveal .roll span:after {
|
||||
color: #fff;
|
||||
background: #1a53a1; }
|
||||
|
||||
/*********************************************
|
||||
* IMAGES
|
||||
*********************************************/
|
||||
.reveal section img {
|
||||
margin: 15px 0px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 4px solid #222;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
|
||||
|
||||
.reveal section img.plain {
|
||||
border: 0;
|
||||
box-shadow: none; }
|
||||
|
||||
.reveal a img {
|
||||
-webkit-transition: all .15s linear;
|
||||
-moz-transition: all .15s linear;
|
||||
transition: all .15s linear; }
|
||||
|
||||
.reveal a:hover img {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-color: #2a76dd;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
|
||||
|
||||
/*********************************************
|
||||
* NAVIGATION CONTROLS
|
||||
*********************************************/
|
||||
.reveal .controls .navigate-left,
|
||||
.reveal .controls .navigate-left.enabled {
|
||||
border-right-color: #2a76dd; }
|
||||
|
||||
.reveal .controls .navigate-right,
|
||||
.reveal .controls .navigate-right.enabled {
|
||||
border-left-color: #2a76dd; }
|
||||
|
||||
.reveal .controls .navigate-up,
|
||||
.reveal .controls .navigate-up.enabled {
|
||||
border-bottom-color: #2a76dd; }
|
||||
|
||||
.reveal .controls .navigate-down,
|
||||
.reveal .controls .navigate-down.enabled {
|
||||
border-top-color: #2a76dd; }
|
||||
|
||||
.reveal .controls .navigate-left.enabled:hover {
|
||||
border-right-color: #6ca0e8; }
|
||||
|
||||
.reveal .controls .navigate-right.enabled:hover {
|
||||
border-left-color: #6ca0e8; }
|
||||
|
||||
.reveal .controls .navigate-up.enabled:hover {
|
||||
border-bottom-color: #6ca0e8; }
|
||||
|
||||
.reveal .controls .navigate-down.enabled:hover {
|
||||
border-top-color: #6ca0e8; }
|
||||
|
||||
/*********************************************
|
||||
* PROGRESS BAR
|
||||
*********************************************/
|
||||
.reveal .progress {
|
||||
background: rgba(0, 0, 0, 0.2); }
|
||||
|
||||
.reveal .progress span {
|
||||
background: #2a76dd;
|
||||
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
|
@ -1,410 +0,0 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<title>reveal.js – The HTML Presentation Framework</title>
|
||||
|
||||
<meta name="description" content="A framework for easily creating beautiful presentations using HTML">
|
||||
<meta name="author" content="Hakim El Hattab">
|
||||
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||
|
||||
<link rel="stylesheet" href="css/reveal.css">
|
||||
<link rel="stylesheet" href="css/theme/black.css" id="theme">
|
||||
|
||||
<!-- Theme used for syntax highlighting of code -->
|
||||
<link rel="stylesheet" href="lib/css/zenburn.css">
|
||||
|
||||
<!-- Printing and PDF exports -->
|
||||
<script>
|
||||
var link = document.createElement( 'link' );
|
||||
link.rel = 'stylesheet';
|
||||
link.type = 'text/css';
|
||||
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
|
||||
document.getElementsByTagName( 'head' )[0].appendChild( link );
|
||||
</script>
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="lib/js/html5shiv.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="reveal">
|
||||
|
||||
<!-- Any section element inside of this container is displayed as a slide -->
|
||||
<div class="slides">
|
||||
<section>
|
||||
<h1>Reveal.js</h1>
|
||||
<h3>The HTML Presentation Framework</h3>
|
||||
<p>
|
||||
<small>Created by <a href="http://hakim.se">Hakim El Hattab</a> / <a href="http://twitter.com/hakimel">@hakimel</a></small>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Hello There</h2>
|
||||
<p>
|
||||
reveal.js enables you to create beautiful interactive slide decks using HTML. This presentation will show you examples of what it can do.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<!-- Example of nested vertical slides -->
|
||||
<section>
|
||||
<section>
|
||||
<h2>Vertical Slides</h2>
|
||||
<p>Slides can be nested inside of each other.</p>
|
||||
<p>Use the <em>Space</em> key to navigate through all slides.</p>
|
||||
<br>
|
||||
<a href="#" class="navigate-down">
|
||||
<img width="178" height="238" data-src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
|
||||
</a>
|
||||
</section>
|
||||
<section>
|
||||
<h2>Basement Level 1</h2>
|
||||
<p>Nested slides are useful for adding additional detail underneath a high level horizontal slide.</p>
|
||||
</section>
|
||||
<section>
|
||||
<h2>Basement Level 2</h2>
|
||||
<p>That's it, time to go back up.</p>
|
||||
<br>
|
||||
<a href="#/2">
|
||||
<img width="178" height="238" data-src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Up arrow" style="transform: rotate(180deg); -webkit-transform: rotate(180deg);">
|
||||
</a>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Slides</h2>
|
||||
<p>
|
||||
Not a coder? Not a problem. There's a fully-featured visual editor for authoring these, try it out at <a href="http://slides.com" target="_blank">http://slides.com</a>.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Point of View</h2>
|
||||
<p>
|
||||
Press <strong>ESC</strong> to enter the slide overview.
|
||||
</p>
|
||||
<p>
|
||||
Hold down alt and click on any element to zoom in on it using <a href="http://lab.hakim.se/zoom-js">zoom.js</a>. Alt + click anywhere to zoom back out.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Touch Optimized</h2>
|
||||
<p>
|
||||
Presentations look great on touch devices, like mobile phones and tablets. Simply swipe through your slides.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section data-markdown>
|
||||
<script type="text/template">
|
||||
## Markdown support
|
||||
|
||||
Write content using inline or external Markdown.
|
||||
Instructions and more info available in the [readme](https://github.com/hakimel/reveal.js#markdown).
|
||||
|
||||
```
|
||||
<section data-markdown>
|
||||
## Markdown support
|
||||
|
||||
Write content using inline or external Markdown.
|
||||
Instructions and more info available in the [readme](https://github.com/hakimel/reveal.js#markdown).
|
||||
</section>
|
||||
```
|
||||
</script>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<section id="fragments">
|
||||
<h2>Fragments</h2>
|
||||
<p>Hit the next arrow...</p>
|
||||
<p class="fragment">... to step through ...</p>
|
||||
<p><span class="fragment">... a</span> <span class="fragment">fragmented</span> <span class="fragment">slide.</span></p>
|
||||
|
||||
<aside class="notes">
|
||||
This slide has fragments which are also stepped through in the notes window.
|
||||
</aside>
|
||||
</section>
|
||||
<section>
|
||||
<h2>Fragment Styles</h2>
|
||||
<p>There's different types of fragments, like:</p>
|
||||
<p class="fragment grow">grow</p>
|
||||
<p class="fragment shrink">shrink</p>
|
||||
<p class="fragment fade-out">fade-out</p>
|
||||
<p class="fragment fade-up">fade-up (also down, left and right!)</p>
|
||||
<p class="fragment current-visible">current-visible</p>
|
||||
<p>Highlight <span class="fragment highlight-red">red</span> <span class="fragment highlight-blue">blue</span> <span class="fragment highlight-green">green</span></p>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id="transitions">
|
||||
<h2>Transition Styles</h2>
|
||||
<p>
|
||||
You can select from different transitions, like: <br>
|
||||
<a href="?transition=none#/transitions">None</a> -
|
||||
<a href="?transition=fade#/transitions">Fade</a> -
|
||||
<a href="?transition=slide#/transitions">Slide</a> -
|
||||
<a href="?transition=convex#/transitions">Convex</a> -
|
||||
<a href="?transition=concave#/transitions">Concave</a> -
|
||||
<a href="?transition=zoom#/transitions">Zoom</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section id="themes">
|
||||
<h2>Themes</h2>
|
||||
<p>
|
||||
reveal.js comes with a few themes built in: <br>
|
||||
<!-- Hacks to swap themes after the page has loaded. Not flexible and only intended for the reveal.js demo deck. -->
|
||||
<a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/black.css'); return false;">Black (default)</a> -
|
||||
<a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/white.css'); return false;">White</a> -
|
||||
<a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/league.css'); return false;">League</a> -
|
||||
<a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/sky.css'); return false;">Sky</a> -
|
||||
<a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/beige.css'); return false;">Beige</a> -
|
||||
<a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/simple.css'); return false;">Simple</a> <br>
|
||||
<a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/serif.css'); return false;">Serif</a> -
|
||||
<a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/blood.css'); return false;">Blood</a> -
|
||||
<a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/night.css'); return false;">Night</a> -
|
||||
<a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/moon.css'); return false;">Moon</a> -
|
||||
<a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/solarized.css'); return false;">Solarized</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<section data-background="#dddddd">
|
||||
<h2>Slide Backgrounds</h2>
|
||||
<p>
|
||||
Set <code>data-background="#dddddd"</code> on a slide to change the background color. All CSS color formats are supported.
|
||||
</p>
|
||||
<a href="#" class="navigate-down">
|
||||
<img width="178" height="238" data-src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
|
||||
</a>
|
||||
</section>
|
||||
<section data-background="https://s3.amazonaws.com/hakim-static/reveal-js/image-placeholder.png">
|
||||
<h2>Image Backgrounds</h2>
|
||||
<pre><code class="hljs"><section data-background="image.png"></code></pre>
|
||||
</section>
|
||||
<section data-background="https://s3.amazonaws.com/hakim-static/reveal-js/image-placeholder.png" data-background-repeat="repeat" data-background-size="100px">
|
||||
<h2>Tiled Backgrounds</h2>
|
||||
<pre><code class="hljs" style="word-wrap: break-word;"><section data-background="image.png" data-background-repeat="repeat" data-background-size="100px"></code></pre>
|
||||
</section>
|
||||
<section data-background-video="https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.mp4,https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.webm" data-background-color="#000000">
|
||||
<div style="background-color: rgba(0, 0, 0, 0.9); color: #fff; padding: 20px;">
|
||||
<h2>Video Backgrounds</h2>
|
||||
<pre><code class="hljs" style="word-wrap: break-word;"><section data-background-video="video.mp4,video.webm"></code></pre>
|
||||
</div>
|
||||
</section>
|
||||
<section data-background="http://i.giphy.com/90F8aUepslB84.gif">
|
||||
<h2>... and GIFs!</h2>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section data-transition="slide" data-background="#4d7e65" data-background-transition="zoom">
|
||||
<h2>Background Transitions</h2>
|
||||
<p>
|
||||
Different background transitions are available via the backgroundTransition option. This one's called "zoom".
|
||||
</p>
|
||||
<pre><code class="hljs">Reveal.configure({ backgroundTransition: 'zoom' })</code></pre>
|
||||
</section>
|
||||
|
||||
<section data-transition="slide" data-background="#b5533c" data-background-transition="zoom">
|
||||
<h2>Background Transitions</h2>
|
||||
<p>
|
||||
You can override background transitions per-slide.
|
||||
</p>
|
||||
<pre><code class="hljs" style="word-wrap: break-word;"><section data-background-transition="zoom"></code></pre>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Pretty Code</h2>
|
||||
<pre><code class="hljs" data-trim contenteditable>
|
||||
function linkify( selector ) {
|
||||
if( supports3DTransforms ) {
|
||||
|
||||
var nodes = document.querySelectorAll( selector );
|
||||
|
||||
for( var i = 0, len = nodes.length; i < len; i++ ) {
|
||||
var node = nodes[i];
|
||||
|
||||
if( !node.className ) {
|
||||
node.className += ' roll';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</code></pre>
|
||||
<p>Code syntax highlighting courtesy of <a href="http://softwaremaniacs.org/soft/highlight/en/description/">highlight.js</a>.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Marvelous List</h2>
|
||||
<ul>
|
||||
<li>No order here</li>
|
||||
<li>Or here</li>
|
||||
<li>Or here</li>
|
||||
<li>Or here</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Fantastic Ordered List</h2>
|
||||
<ol>
|
||||
<li>One is smaller than...</li>
|
||||
<li>Two is smaller than...</li>
|
||||
<li>Three!</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Tabular Tables</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Item</th>
|
||||
<th>Value</th>
|
||||
<th>Quantity</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Apples</td>
|
||||
<td>$1</td>
|
||||
<td>7</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lemonade</td>
|
||||
<td>$2</td>
|
||||
<td>18</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Bread</td>
|
||||
<td>$3</td>
|
||||
<td>2</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Clever Quotes</h2>
|
||||
<p>
|
||||
These guys come in two forms, inline: <q cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">
|
||||
“The nice thing about standards is that there are so many to choose from”</q> and block:
|
||||
</p>
|
||||
<blockquote cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">
|
||||
“For years there has been a theory that millions of monkeys typing at random on millions of typewriters would
|
||||
reproduce the entire works of Shakespeare. The Internet has proven this theory to be untrue.”
|
||||
</blockquote>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Intergalactic Interconnections</h2>
|
||||
<p>
|
||||
You can link between slides internally,
|
||||
<a href="#/2/3">like this</a>.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Speaker View</h2>
|
||||
<p>There's a <a href="https://github.com/hakimel/reveal.js#speaker-notes">speaker view</a>. It includes a timer, preview of the upcoming slide as well as your speaker notes.</p>
|
||||
<p>Press the <em>S</em> key to try it out.</p>
|
||||
|
||||
<aside class="notes">
|
||||
Oh hey, these are some notes. They'll be hidden in your presentation, but you can see them if you open the speaker notes window (hit 's' on your keyboard).
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Export to PDF</h2>
|
||||
<p>Presentations can be <a href="https://github.com/hakimel/reveal.js#pdf-export">exported to PDF</a>, here's an example:</p>
|
||||
<iframe data-src="https://www.slideshare.net/slideshow/embed_code/42840540" width="445" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:3px solid #666; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Global State</h2>
|
||||
<p>
|
||||
Set <code>data-state="something"</code> on a slide and <code>"something"</code>
|
||||
will be added as a class to the document element when the slide is open. This lets you
|
||||
apply broader style changes, like switching the page background.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section data-state="customevent">
|
||||
<h2>State Events</h2>
|
||||
<p>
|
||||
Additionally custom events can be triggered on a per slide basis by binding to the <code>data-state</code> name.
|
||||
</p>
|
||||
<pre><code class="javascript" data-trim contenteditable style="font-size: 18px;">
|
||||
Reveal.addEventListener( 'customevent', function() {
|
||||
console.log( '"customevent" has fired' );
|
||||
} );
|
||||
</code></pre>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Take a Moment</h2>
|
||||
<p>
|
||||
Press B or . on your keyboard to pause the presentation. This is helpful when you're on stage and want to take distracting slides off the screen.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Much more</h2>
|
||||
<ul>
|
||||
<li>Right-to-left support</li>
|
||||
<li><a href="https://github.com/hakimel/reveal.js#api">Extensive JavaScript API</a></li>
|
||||
<li><a href="https://github.com/hakimel/reveal.js#auto-sliding">Auto-progression</a></li>
|
||||
<li><a href="https://github.com/hakimel/reveal.js#parallax-background">Parallax backgrounds</a></li>
|
||||
<li><a href="https://github.com/hakimel/reveal.js#keyboard-bindings">Custom keyboard bindings</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section style="text-align: left;">
|
||||
<h1>THE END</h1>
|
||||
<p>
|
||||
- <a href="http://slides.com">Try the online editor</a> <br>
|
||||
- <a href="https://github.com/hakimel/reveal.js">Source code & documentation</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<script src="lib/js/head.min.js"></script>
|
||||
<script src="js/reveal.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
// More info https://github.com/hakimel/reveal.js#configuration
|
||||
Reveal.initialize({
|
||||
controls: true,
|
||||
progress: true,
|
||||
history: true,
|
||||
center: true,
|
||||
|
||||
transition: 'slide', // none/fade/slide/convex/concave/zoom
|
||||
|
||||
// More info https://github.com/hakimel/reveal.js#dependencies
|
||||
dependencies: [
|
||||
{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
|
||||
{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
||||
{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
||||
{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
|
||||
{ src: 'plugin/zoom-js/zoom.js', async: true },
|
||||
{ src: 'plugin/notes/notes.js', async: true }
|
||||
]
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Before Width: | Height: | Size: 434 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 410 B |
Binary file not shown.
Before Width: | Height: | Size: 1.4 KiB |
@ -1,395 +0,0 @@
|
||||
<!--[[[cog
|
||||
from tools.showcode import showcode, runscript
|
||||
import re
|
||||
]]]-->
|
||||
<!--[[[end]]]-->
|
||||
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<title>6 Months in the Life of OpenStack</title>
|
||||
|
||||
<meta name="author" content="OpenStack Release Team">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
|
||||
|
||||
<link rel="stylesheet" href="css/reveal.css">
|
||||
<link rel="stylesheet" href="css/theme/dhellmann.css" id="theme">
|
||||
<link rel="stylesheet" href="css/selectable.css" id="theme">
|
||||
<link rel="stylesheet" href="css/font-awesome.min.css">
|
||||
|
||||
<!-- Code syntax highlighting -->
|
||||
<link rel="stylesheet" href="lib/css/github.css">
|
||||
|
||||
<!-- Printing and PDF exports -->
|
||||
<script>
|
||||
var link = document.createElement( 'link' );
|
||||
link.rel = 'stylesheet';
|
||||
link.type = 'text/css';
|
||||
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
|
||||
document.getElementsByTagName( 'head' )[0].appendChild( link );
|
||||
</script>
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="lib/js/html5shiv.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="reveal">
|
||||
<div class="slides">
|
||||
|
||||
<section>
|
||||
<h2>6 Months in the Life of OpenStack</h2>
|
||||
<h3>OpenStack Rocky PTG</h3>
|
||||
<h4>Release Team</h4>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Mission</h2>
|
||||
|
||||
<p>Coordinating the release of OpenStack deliverables, by
|
||||
defining the overall development cycle, release models,
|
||||
publication processes, versioning rules and tools, then
|
||||
enabling project teams to produce their own releases.</p>
|
||||
|
||||
<aside class="notes">
|
||||
Release schedule planning and coordination</br>
|
||||
</br>
|
||||
Assist teams producing deliverables: signed tarballs; announcements</br>
|
||||
</br>
|
||||
Communicate to users of deliverables: SemVer</br>
|
||||
</br>
|
||||
Maintaining release automation
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Not Responsible for</h2>
|
||||
|
||||
<ul>
|
||||
<li>Feature scheduling</li>
|
||||
<li>Feature tracking</li>
|
||||
<li>Prioritization of work</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>cycle-with-milestones</h2>
|
||||
|
||||
<ul>
|
||||
<li>commit to publish development milestones following a
|
||||
predetermined schedule</li>
|
||||
<li>commit to produce a release to match the end of the
|
||||
6-month development cycle</li>
|
||||
<li>used by service projects</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>cycle-with-intermediary</h2>
|
||||
|
||||
<ul>
|
||||
<li>produce multiple full releases during the cycle</li>
|
||||
<li>commit to produce a release near the end of the
|
||||
6-month development cycle</li>
|
||||
<li>used by libraries and service projects</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>cycle-trailing</h2>
|
||||
|
||||
<ul>
|
||||
<li>commit to produce a release no later than 2 weeks
|
||||
after the end of the 6-month development cycle</li>
|
||||
<li>within the cycle can follow milestones or produce
|
||||
intermediate releases</li>
|
||||
<li>used by deployment tools</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Staying in touch</h2>
|
||||
<ul>
|
||||
<li><tt>#openstack-release</tt> on freenode</li>
|
||||
<li><tt>[release]</tt> on openstack-dev@</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Before PTG</h2>
|
||||
<ul>
|
||||
<li>Establish and publish release schedule</li>
|
||||
</ul>
|
||||
|
||||
<aside class="notes">
|
||||
look for obviously bad times like major holidays, school starting, etc.</br>
|
||||
</br>
|
||||
coordinate with the foundation staff about when the PTG
|
||||
and summit will be held</br>
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Before Milestone 1</h2>
|
||||
<ul>
|
||||
<li>Make initial contact with PTLs</li>
|
||||
<li>Sign up release liaisons</li>
|
||||
</ul>
|
||||
|
||||
<aside class="notes">
|
||||
This is the only time we will reach out directly because
|
||||
there are 60+ of you and 3 of us.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Before Milestone 2</h2>
|
||||
<ul>
|
||||
<li>First "warning" for projects that missed the
|
||||
milestone</li>
|
||||
<li>Why do milestones apply to everyone?</li>
|
||||
</ul>
|
||||
|
||||
<aside class="notes">
|
||||
|
||||
milestones give us a cadence for checking in with all
|
||||
teams</br>
|
||||
</br>
|
||||
|
||||
gives us a way to break up the work over the course of the
|
||||
cycle in a consistent way, since all teams use the same
|
||||
milestones</br>
|
||||
</br>
|
||||
|
||||
missing is an early indicator for problems because the
|
||||
project team isn't paying attention to the schedule
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Before Milestone 3</h2>
|
||||
<ul>
|
||||
<li>Coordinate the library release freeze</li>
|
||||
<li>Update gerrit and the CI system to handle the new
|
||||
stable branches</li>
|
||||
<li>Coordinate requirements freeze</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Why do we want to release before the final cut-off?</h2>
|
||||
<ul>
|
||||
<li>Services are only tested with released libraries</li>
|
||||
<li>We need a place to create the stable branch</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Why do we freeze library releases?</h2>
|
||||
<ul>
|
||||
<li>Stability for consumers</li>
|
||||
<li>Downstream packagers</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Why are client and regular library freezes different?</h2>
|
||||
<ul>
|
||||
<li>Clients have late-landing features to support the
|
||||
service</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Why do we freeze the requirements list?</h2>
|
||||
<ul>
|
||||
<li>Stability for our CI</li>
|
||||
<li>Downstream packagers</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Before RC1</h2>
|
||||
<ul>
|
||||
<li>Make sure cycle-with-intermediary projects are
|
||||
thinking about the end of cycle coming up</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>At RC1</h2>
|
||||
<ul>
|
||||
<li>Ensure all projects are branched</li>
|
||||
<li>Coordinate updates and branching for devstack and
|
||||
grenade</li>
|
||||
<li>Coordinate branching of requirements list</li>
|
||||
</ul>
|
||||
|
||||
<aside class="notes">
|
||||
we need to branch together, at roughly the same time and
|
||||
in the right order, because otherwise the configuration
|
||||
for the CI system becomes too complicated (ensuring that
|
||||
the right versions of master and stable branches are
|
||||
combined for testing, using the right sets of requirements
|
||||
and constraints, etc.)
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Before Final</h2>
|
||||
<ul>
|
||||
<li>Publish a planned set of final releases for PTL and
|
||||
liaison review</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>At Final</h2>
|
||||
<ul>
|
||||
<li>Tag the final releases</li>
|
||||
<li>Coordinate with the docs team to publish the
|
||||
documentation</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Planned Changes for Rocky</h2>
|
||||
|
||||
<ul>
|
||||
<li>nudging library maintainers more often for
|
||||
releases</li>
|
||||
<li>nudging cycle-with-intermediary maintainers earlier
|
||||
for releases</li>
|
||||
<li>publishing all services to PyPI (under
|
||||
discussion)</li>
|
||||
</ul>
|
||||
|
||||
<aside class="notes">
|
||||
Trying to avoid a repeat of Rocky where we had late
|
||||
branches, late releases, etc.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Resources</h2>
|
||||
<p><small>
|
||||
<a href="http://git.openstack.org/cgit/openstack-infra/release-tools/tree/presentation-6-months-in-the-life-of-openstack">openstack-infra/release-tools/presentation-6-months-in-the-life-of-openstack
|
||||
</a>
|
||||
</small></p>
|
||||
<p><small>
|
||||
<a href="http://git.openstack.org/cgit/openstack/releases/tree/PROCESS.rst">openstack/releases/PROCESS.rst
|
||||
</a>
|
||||
</small></p>
|
||||
<p class="creativecommons">
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/">
|
||||
<img alt="Creative Commons License" src="img/cc-by-80x15.png" />
|
||||
</a>
|
||||
<span> This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>.</span>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="lib/js/head.min.js"></script>
|
||||
<script src="js/jquery-3.1.1.js"></script>
|
||||
<script src="js/reveal.js"></script>
|
||||
<script src="js/lineselect.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
function _prev_slide() {
|
||||
if (!_reveal_navigation_active()) {
|
||||
return;
|
||||
}
|
||||
console.log('reveal: prev');
|
||||
Reveal.navigatePrev();
|
||||
};
|
||||
|
||||
function _next_slide() {
|
||||
if (!_reveal_navigation_active()) {
|
||||
return;
|
||||
}
|
||||
console.log('reveal: next');
|
||||
Reveal.navigateNext();
|
||||
};
|
||||
|
||||
function _reveal_navigation_active () {
|
||||
return !document.querySelector( '.reveal' ).classList.contains('reveal-nav-off');
|
||||
};
|
||||
|
||||
function _toggle_reveal_navigation () {
|
||||
if (_reveal_navigation_active()) {
|
||||
console.log('reveal: turning off nav');
|
||||
document.querySelector( '.reveal' ).classList.add('reveal-nav-off');
|
||||
document.querySelector('aside.controls').classList.add('controls-off');
|
||||
} else {
|
||||
console.log('reveal: turning on nav');
|
||||
document.querySelector( '.reveal' ).classList.remove('reveal-nav-off');
|
||||
document.querySelector('aside.controls').classList.remove('controls-off');
|
||||
};
|
||||
};
|
||||
|
||||
// Full list of configuration options available at:
|
||||
// https://github.com/hakimel/reveal.js#configuration
|
||||
Reveal.initialize({
|
||||
controls: true,
|
||||
keyboard: {
|
||||
// Use Logitech presenter remote black screen button
|
||||
// to control when we are changing slides vs. selected lines.
|
||||
190: _toggle_reveal_navigation,
|
||||
// p, page up
|
||||
80: _prev_slide,
|
||||
33: _prev_slide,
|
||||
// n, page down
|
||||
78: _next_slide,
|
||||
34: _next_slide,
|
||||
// h, left
|
||||
72: _prev_slide,
|
||||
37: _prev_slide,
|
||||
// l, right
|
||||
76: _next_slide,
|
||||
39: _next_slide,
|
||||
},
|
||||
progress: true,
|
||||
history: true,
|
||||
center: true,
|
||||
transition: 'slide', // none/fade/slide/convex/concave/zoom
|
||||
// Optional reveal.js plugins
|
||||
dependencies: [
|
||||
{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
|
||||
{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
||||
{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
||||
{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
|
||||
{ src: 'plugin/zoom-js/zoom.js', async: true },
|
||||
{ src: 'plugin/notes/notes.js', async: true }
|
||||
]
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
/* find all of the lineselect nodes and add spans for their lines */
|
||||
$(function() {
|
||||
$('.lineselect_selectable').each(function (i, e) {
|
||||
var $e = $(e);
|
||||
var h = $e.html();
|
||||
h = h.replace(/\n\n/g, "\n \n");
|
||||
h = h.replace(/\n/g, "</span>\n<span class='line'>");
|
||||
h = "<span class='line'>" + h + "</span>";
|
||||
$e.html(h);
|
||||
});
|
||||
/* enable lineselect for the line nodes */
|
||||
$(".lineselect_selectable").each(function () {
|
||||
$(this).lineselect({ lines: "span.line" });
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
File diff suppressed because it is too large
Load Diff
@ -1,201 +0,0 @@
|
||||
/**
|
||||
* Lineselect jQuery plugin
|
||||
*
|
||||
* Make containers of lines show selection line-by-line.
|
||||
* Good for highlighting lines of code.
|
||||
*
|
||||
* Based on https://github.com/nedbat/prznames/blob/master/lineselect.js
|
||||
* by Ned Batchelder
|
||||
* Copyright 2011
|
||||
* @license MIT License
|
||||
*/
|
||||
(function ($) {
|
||||
// Internal constants
|
||||
var container_class = "lineselect_selectable";
|
||||
var sub_class = "span.line";
|
||||
|
||||
// Global options
|
||||
var options = {
|
||||
focus: ".focus",
|
||||
active_sel: "section.present"
|
||||
};
|
||||
|
||||
var select_line = function (container, line, single) {
|
||||
if (single) {
|
||||
deselect_all(container);
|
||||
}
|
||||
line.addClass("selected");
|
||||
line.trigger("lineselected");
|
||||
};
|
||||
|
||||
var select_line_by_number = function (container, lineno, single) {
|
||||
//console.log('select_line_by_number ' + lineno + ' ' + single);
|
||||
var the_line = $(container.find(sub_class)[lineno-1]);
|
||||
select_line(container, the_line, single);
|
||||
};
|
||||
|
||||
var deselect_all = function (container) {
|
||||
container.find(sub_class).removeClass("selected");
|
||||
};
|
||||
|
||||
var dom = {};
|
||||
|
||||
function lineSelectionActive() {
|
||||
return dom.wrapper.classList.contains('selecting-lines');
|
||||
};
|
||||
|
||||
function enableLineSelection() {
|
||||
//console.log('lineselect: enabling');
|
||||
dom.wrapper.classList.add('selecting-lines');
|
||||
};
|
||||
|
||||
function disableLineSelection() {
|
||||
//console.log('lineselect: disabling');
|
||||
dom.wrapper.classList.remove('selecting-lines');
|
||||
};
|
||||
|
||||
function toggleLineSelection( override ) {
|
||||
if( typeof override === 'boolean' ) {
|
||||
override ? enableLineSelection() : disableLineSelection();
|
||||
}
|
||||
else {
|
||||
lineSelectionActive() ? disableLineSelection() : enableLineSelection();
|
||||
}
|
||||
};
|
||||
|
||||
var keydown_fn = function (e) {
|
||||
//console.log('lineselect.keydown_fn' + e.keyCode);
|
||||
// Find the one container to manipulate.
|
||||
var container = $(options.active_sel + " ." + container_class + options.focus_class + ":visible");
|
||||
if (container.length === 0) {
|
||||
container = $(options.active_sel + " ." + container_class + ":visible");
|
||||
}
|
||||
if (container.length === 0) {
|
||||
//console.log("looking for", options.active_sel + "." + container_class);
|
||||
container = $(options.active_sel + "." + container_class);
|
||||
}
|
||||
if (container.length !== 1) {
|
||||
//console.log("Done, not 1", container_class, container.length);
|
||||
return;
|
||||
}
|
||||
|
||||
var the_selected = container.find(sub_class + ".selected"),
|
||||
selected = 0;
|
||||
if (the_selected.length) {
|
||||
var all_lines = container.find(sub_class);
|
||||
selected = all_lines.index(the_selected) + 1;
|
||||
}
|
||||
|
||||
switch (e.keyCode) {
|
||||
|
||||
case 190: // toggle using blank screen button on logitech remote
|
||||
//console.log('lineselect:toggle');
|
||||
toggleLineSelection();
|
||||
if (lineSelectionActive()) {
|
||||
selected = 1;
|
||||
} else {
|
||||
deselect_all(container);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case 71: // G: top
|
||||
selected = 1;
|
||||
break;
|
||||
|
||||
case 78: case 34: // logitech remote
|
||||
case 74: // J: down
|
||||
if (lineSelectionActive()) {
|
||||
//console.log('lineselect: down');
|
||||
selected += 1;
|
||||
} else {
|
||||
//console.log('lineselect: inactive');
|
||||
}
|
||||
break;
|
||||
|
||||
case 80: case 33: // logitech remote
|
||||
case 75: // K: up
|
||||
if (lineSelectionActive()) {
|
||||
//console.log('lineselect: up');
|
||||
selected -= 1;
|
||||
} else {
|
||||
//console.log('lineselect: inactive');
|
||||
}
|
||||
break;
|
||||
|
||||
// case 190: // .: deselect
|
||||
case 88: // X: deselect
|
||||
deselect_all(container);
|
||||
return;
|
||||
|
||||
default:
|
||||
//console.log('down: ' + e.keyCode);
|
||||
return;
|
||||
}
|
||||
|
||||
//console.log('lineselect: ' + container.html());
|
||||
//console.log('lineselect: ' + sub_class + ' ' + selected + ' ' + container.find(sub_class).length);
|
||||
if (selected < 1 || selected > container.find(sub_class).length) {
|
||||
return;
|
||||
}
|
||||
var single = !e.shiftKey;
|
||||
select_line_by_number(container, selected, single);
|
||||
};
|
||||
|
||||
var make_line_selectable = function (elements, opts) {
|
||||
// Register a document keydown function once.
|
||||
if (keydown_fn) {
|
||||
$(document).keydown(keydown_fn);
|
||||
keydown_fn = null;
|
||||
}
|
||||
// Apply the options, some are global.
|
||||
$.extend(options, opts);
|
||||
|
||||
dom.wrapper = document.querySelector( '.reveal' );
|
||||
dom.slides = document.querySelector( '.reveal .slides' );
|
||||
|
||||
//console.log('making lines selectable');
|
||||
|
||||
// In every container, find all the "lines", mark them, and give them
|
||||
// click handlers.
|
||||
return elements.each(function () {
|
||||
var container = $(this);
|
||||
//console.log('BEFORE: ', container.html());
|
||||
container.addClass(container_class);
|
||||
container.find(opts.lines)
|
||||
.addClass(sub_class)
|
||||
.on('click',
|
||||
function (e) {
|
||||
select_line(container, $(this), !e.ctrlKey);
|
||||
}
|
||||
);
|
||||
//console.log('AFTER: ', container.html());
|
||||
});
|
||||
};
|
||||
|
||||
$.fn.lineselect = function (arg) {
|
||||
if (typeof arg === "object" || typeof arg === "undefined") {
|
||||
// Make elements line-selectable
|
||||
make_line_selectable(this, arg);
|
||||
return this;
|
||||
}
|
||||
else if (typeof arg === "string") {
|
||||
arg = arg.split(",");
|
||||
}
|
||||
else {
|
||||
arg = [arg];
|
||||
}
|
||||
|
||||
this.each(function () {
|
||||
var that = $(this);
|
||||
deselect_all($(this));
|
||||
$.each(arg, function (i, a) {
|
||||
a = +a;
|
||||
select_line_by_number(that, a, false);
|
||||
});
|
||||
});
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
}(jQuery));
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -1,99 +0,0 @@
|
||||
/*
|
||||
|
||||
github.com style (c) Vasily Polovnyov <vast@whiteants.net>
|
||||
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
color: #333;
|
||||
background: #f8f8f8;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-quote {
|
||||
color: #998;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-subst {
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-number,
|
||||
.hljs-literal,
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-tag .hljs-attr {
|
||||
color: #008080;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-doctag {
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
.hljs-title,
|
||||
.hljs-section,
|
||||
.hljs-selector-id {
|
||||
color: #900;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-subst {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.hljs-type,
|
||||
.hljs-class .hljs-title {
|
||||
color: #458;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-tag,
|
||||
.hljs-name,
|
||||
.hljs-attribute {
|
||||
color: #000080;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.hljs-regexp,
|
||||
.hljs-link {
|
||||
color: #009926;
|
||||
}
|
||||
|
||||
.hljs-symbol,
|
||||
.hljs-bullet {
|
||||
color: #990073;
|
||||
}
|
||||
|
||||
.hljs-built_in,
|
||||
.hljs-builtin-name {
|
||||
color: #0086b3;
|
||||
}
|
||||
|
||||
.hljs-meta {
|
||||
color: #999;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-deletion {
|
||||
background: #fdd;
|
||||
}
|
||||
|
||||
.hljs-addition {
|
||||
background: #dfd;
|
||||
}
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
@ -1,68 +0,0 @@
|
||||
/*
|
||||
|
||||
Visual Studio-like style based on original C# coloring by Jason Diamond <jason@diamond.name>
|
||||
|
||||
*/
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
background: white;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-quote,
|
||||
.hljs-variable {
|
||||
color: #008000;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-built_in,
|
||||
.hljs-name,
|
||||
.hljs-tag {
|
||||
color: #00f;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-title,
|
||||
.hljs-section,
|
||||
.hljs-attribute,
|
||||
.hljs-literal,
|
||||
.hljs-template-tag,
|
||||
.hljs-template-variable,
|
||||
.hljs-type,
|
||||
.hljs-addition {
|
||||
color: #a31515;
|
||||
}
|
||||
|
||||
.hljs-deletion,
|
||||
.hljs-selector-attr,
|
||||
.hljs-selector-pseudo,
|
||||
.hljs-meta {
|
||||
color: #2b91af;
|
||||
}
|
||||
|
||||
.hljs-doctag {
|
||||
color: #808080;
|
||||
}
|
||||
|
||||
.hljs-attr {
|
||||
color: #f00;
|
||||
}
|
||||
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-link {
|
||||
color: #00b0e8;
|
||||
}
|
||||
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
/*
|
||||
|
||||
Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
|
||||
based on dark.css by Ivan Sagalaev
|
||||
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
background: #3f3f3f;
|
||||
color: #dcdcdc;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-tag {
|
||||
color: #e3ceab;
|
||||
}
|
||||
|
||||
.hljs-template-tag {
|
||||
color: #dcdcdc;
|
||||
}
|
||||
|
||||
.hljs-number {
|
||||
color: #8cd0d3;
|
||||
}
|
||||
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-attribute {
|
||||
color: #efdcbc;
|
||||
}
|
||||
|
||||
.hljs-literal {
|
||||
color: #efefaf;
|
||||
}
|
||||
|
||||
.hljs-subst {
|
||||
color: #8f8f8f;
|
||||
}
|
||||
|
||||
.hljs-title,
|
||||
.hljs-name,
|
||||
.hljs-selector-id,
|
||||
.hljs-selector-class,
|
||||
.hljs-section,
|
||||
.hljs-type {
|
||||
color: #efef8f;
|
||||
}
|
||||
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-link {
|
||||
color: #dca3a3;
|
||||
}
|
||||
|
||||
.hljs-deletion,
|
||||
.hljs-string,
|
||||
.hljs-built_in,
|
||||
.hljs-builtin-name {
|
||||
color: #cc9393;
|
||||
}
|
||||
|
||||
.hljs-addition,
|
||||
.hljs-comment,
|
||||
.hljs-quote,
|
||||
.hljs-meta {
|
||||
color: #7f9f7f;
|
||||
}
|
||||
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: bold;
|
||||
}
|
@ -1,2 +0,0 @@
|
||||
SIL Open Font License (OFL)
|
||||
http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
|
@ -1,10 +0,0 @@
|
||||
@font-face {
|
||||
font-family: 'League Gothic';
|
||||
src: url('league-gothic.eot');
|
||||
src: url('league-gothic.eot?#iefix') format('embedded-opentype'),
|
||||
url('league-gothic.woff') format('woff'),
|
||||
url('league-gothic.ttf') format('truetype');
|
||||
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,45 +0,0 @@
|
||||
SIL Open Font License
|
||||
|
||||
Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
|
||||
|
||||
—————————————————————————————-
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
—————————————————————————————-
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
“Font Software” refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
|
||||
|
||||
“Reserved Font Name” refers to any names specified as such after the copyright statement(s).
|
||||
|
||||
“Original Version” refers to the collection of Font Software components as distributed by the Copyright Holder(s).
|
||||
|
||||
“Modified Version” refers to any derivative made by adding to, deleting, or substituting—in part or in whole—any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
|
||||
|
||||
“Author” refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user