# HG changeset patch # User Marcin Kuzminski # Date 2018-11-03 09:39:05 # Node ID 689a0c9347c16bec66e4fb33b94dd3af7a0e710b # Parent 59b28fe5e1537b44b6be2a8c706f64a8f7af0e6f # Parent 23b5897fe213884d37b9a16afa735600f586dcff release: Merge default into stable for release preparation diff --git a/.babelrc b/.babelrc new file mode 100644 --- /dev/null +++ b/.babelrc @@ -0,0 +1,10 @@ +{ + "presets": [ + ["env", { + "targets": { + "browsers": ["last 2 versions"] + } + }] + ], + "plugins": ["transform-object-rest-spread"] +} diff --git a/.bumpversion.cfg b/.bumpversion.cfg --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 4.13.3 +current_version = 4.14.0 message = release: Bump version {current_version} to {new_version} [bumpversion:file:rhodecode/VERSION] diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -24,7 +24,6 @@ syntax: regexp ^.dev ^._dev ^build/ -^bower_components/ ^coverage\.xml$ ^data$ ^\.eggs/ @@ -36,14 +35,15 @@ syntax: regexp ^htmlcov ^junit\.xml$ ^node_modules/ +^node_binaries/ ^pylint.log$ ^rcextensions/ ^result$ ^rhodecode/public/css/style.css$ ^rhodecode/public/css/style-polymer.css$ ^rhodecode/public/js/rhodecode-components.html$ +^rhodecode/public/js/rhodecode-components.js$ ^rhodecode/public/js/scripts.js$ -^rhodecode/public/js/rhodecode-components.js$ ^rhodecode/public/js/src/components/root-styles.gen.html$ ^rhodecode/public/js/vendors/webcomponentsjs/ ^rhodecode\.db$ diff --git a/.release.cfg b/.release.cfg --- a/.release.cfg +++ b/.release.cfg @@ -5,25 +5,20 @@ done = false done = true [task:rc_tools_pinned] -done = true [task:fixes_on_stable] -done = true [task:pip2nix_generated] -done = true [task:changelog_updated] -done = true [task:generate_api_docs] -done = true + +[task:updated_translation] [release] -state = prepared -version = 4.13.3 - -[task:updated_translation] +state = in_progress +version = 4.14.0 [task:generate_js_routes] diff --git a/Gruntfile.js b/Gruntfile.js --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,4 +1,12 @@ var gruntConfig = require('./grunt_config.json'); +var webpackConfig = require('./webpack.config'); +gruntConfig["webpack"] = { + options: { + stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development' + }, + prod: webpackConfig, + dev: Object.assign({ watch: false }, webpackConfig) +}; module.exports = function(grunt) { grunt.initConfig(gruntConfig); @@ -7,9 +15,7 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-vulcanize'); - grunt.loadNpmTasks('grunt-crisper'); grunt.loadNpmTasks('grunt-contrib-copy'); - - grunt.registerTask('default', ['less:production', 'less:components', 'concat:polymercss', 'copy', 'concat:dist', 'vulcanize', 'crisper']); + grunt.loadNpmTasks('grunt-webpack'); + grunt.registerTask('default', ['less:production', 'less:components', 'copy', 'webpack', 'concat:dist']); }; diff --git a/MANIFEST.in b/MANIFEST.in --- a/MANIFEST.in +++ b/MANIFEST.in @@ -39,7 +39,6 @@ include rhodecode/public/sounds/*.mp3 include rhodecode/public/sounds/*.wav # fonts -recursive-include rhodecode/public/fonts/ProximaNova * recursive-include rhodecode/public/fonts/RCIcons * # js diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ .PHONY: clean docs docs-clean docs-cleanup test test-clean test-only test-only-postgres test-only-mysql web-build -WEBPACK=./node_modules/webpack/bin/webpack.js -GRUNT=grunt NODE_PATH=./node_modules +WEBPACK=./node_binaries/webpack +GRUNT=./node_binaries/grunt clean: diff --git a/bower.json b/bower.json deleted file mode 100644 --- a/bower.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "rhodecode-elements", - "description": "User interface for elements for rhodecode", - "main": "index.html", - "dependencies": { - "webcomponentsjs": "^1.2.3", - "polymer": "Polymer/polymer#^2.6.0", - "paper-button": "PolymerElements/paper-button#^2.1.2", - "paper-spinner": "PolymerElements/paper-spinner#^2.1.0", - "paper-tooltip": "PolymerElements/paper-tooltip#^2.1.1", - "paper-toast": "PolymerElements/paper-toast#^2.1.2", - "paper-toggle-button": "PolymerElements/paper-toggle-button#^2.1.1", - "iron-ajax": "PolymerElements/iron-ajax#^2.1.3", - "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#^2.2.0", - "iron-a11y-keys": "PolymerElements/iron-a11y-keys#^2.1.2" - } -} diff --git a/configs/development.ini b/configs/development.ini --- a/configs/development.ini +++ b/configs/development.ini @@ -26,8 +26,6 @@ debug = true #smtp_port = #smtp_use_tls = false #smtp_use_ssl = true -## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.) -#smtp_auth = [server:main] ## COMMON ## @@ -281,8 +279,10 @@ supervisor.group_id = dev ## Display extended labs settings labs_settings_active = true -## custom exception store path, defaults to TMPDIR -exception_tracker.store_path = +## Custom exception store path, defaults to TMPDIR +## This is used to store exception from RhodeCode in shared directory +#exception_tracker.store_path = + #################################### ### CELERY CONFIG #### @@ -506,7 +506,7 @@ debug_style = true ########################################### #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode -#sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode +#sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8 # pymysql is an alternative driver for MySQL, use in case of problems with default one #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode diff --git a/configs/production.ini b/configs/production.ini --- a/configs/production.ini +++ b/configs/production.ini @@ -26,8 +26,6 @@ debug = true #smtp_port = #smtp_use_tls = false #smtp_use_ssl = true -## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.) -#smtp_auth = [server:main] ## COMMON ## @@ -256,8 +254,9 @@ supervisor.group_id = prod ## Display extended labs settings labs_settings_active = true -## custom exception store path, defaults to TMPDIR -exception_tracker.store_path = +## Custom exception store path, defaults to TMPDIR +## This is used to store exception from RhodeCode in shared directory +#exception_tracker.store_path = #################################### @@ -480,7 +479,7 @@ set debug = false ########################################### #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode -#sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode +#sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8 # pymysql is an alternative driver for MySQL, use in case of problems with default one #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode diff --git a/default.nix b/default.nix --- a/default.nix +++ b/default.nix @@ -9,7 +9,7 @@ # { # # Thoughts on how to configure the dev environment # rc = { -# codeInternalUrl = "https://usr:token@internal-code.rhodecode.com"; +# codeInternalUrl = "https://usr:token@code.rhodecode.com/internal"; # sources = { # rhodecode-vcsserver = "/home/user/work/rhodecode-vcsserver"; # rhodecode-enterprise-ce = "/home/user/work/rhodecode-enterprise-ce"; @@ -26,10 +26,18 @@ args@ }: let - # Use nixpkgs from args or import them. We use this indirect approach - # through args to be able to use the name `pkgs` for our customized packages. - # Otherwise we will end up with an infinite recursion. - pkgs = args.pkgs or (import { }); + pkgs_ = (import {}); +in + +let + pkgs = import { + overlays = [ + (import ./pkgs/overlays.nix) + ]; + inherit + (pkgs_) + system; + }; # Works with the new python-packages, still can fallback to the old # variant. @@ -46,7 +54,7 @@ let in !builtins.elem (basename path) [ ".git" ".hg" "__pycache__" ".eggs" ".idea" ".dev" - "bower_components" "node_modules" + "node_modules" "node_binaries" "build" "data" "result" "tmp"] && !builtins.elem ext ["egg-info" "pyc"] && # TODO: johbo: This check is wrong, since "path" contains an absolute path, @@ -55,7 +63,11 @@ let sources = let - inherit (pkgs.lib) all isString attrValues; + inherit + (pkgs.lib) + all + isString + attrValues; sourcesConfig = pkgs.config.rc.sources or {}; in # Ensure that sources are configured as strings. Using a path @@ -66,18 +78,12 @@ let version = builtins.readFile "${rhodecode-enterprise-ce-src}/rhodecode/VERSION"; rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.; - buildBowerComponents = pkgs.buildBowerComponents; nodeEnv = import ./pkgs/node-default.nix { - inherit pkgs; + inherit + pkgs; }; nodeDependencies = nodeEnv.shell.nodeDependencies; - bowerComponents = buildBowerComponents { - name = "enterprise-ce-${version}"; - generated = ./pkgs/bower-packages.nix; - src = rhodecode-enterprise-ce-src; - }; - rhodecode-testdata-src = sources.rhodecode-testdata or ( pkgs.fetchhg { url = "https://code.rhodecode.com/upstream/rc_testdata"; @@ -95,23 +101,22 @@ let pythonLocalOverrides = self: super: { rhodecode-enterprise-ce = let - linkNodeAndBowerPackages = '' + linkNodePackages = '' export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src} - echo "[BEGIN]: Link node packages" - rm -fr node_modules - mkdir node_modules + echo "[BEGIN]: Link node packages and binaries" # johbo: Linking individual packages allows us to run "npm install" # inside of a shell to try things out. Re-entering the shell will # restore a clean environment. + rm -fr node_modules + mkdir node_modules ln -s ${nodeDependencies}/lib/node_modules/* node_modules/ - echo "[DONE]: Link node packages" + export NODE_PATH=./node_modules - echo "[BEGIN]: Link bower packages" - rm -fr bower_components - mkdir bower_components - ln -s ${bowerComponents}/bower_components/* bower_components/ - echo "[DONE]: Link bower packages" + rm -fr node_binaries + mkdir node_binaries + ln -s ${nodeDependencies}/bin/* node_binaries/ + echo "[DONE ]: Link node packages and binaries" ''; releaseName = "RhodeCodeEnterpriseCE-${version}"; @@ -129,8 +134,7 @@ let passthru = { inherit rhodecode-testdata - bowerComponents - linkNodeAndBowerPackages + linkNodePackages myPythonPackagesUnfix pythonLocalOverrides pythonCommunityOverrides; @@ -141,8 +145,6 @@ let buildInputs = attrs.buildInputs or [] ++ [ rhodecode-testdata - pkgs.nodePackages.bower - pkgs.nodePackages.grunt-cli ]; #NOTE: option to inject additional propagatedBuildInputs @@ -175,39 +177,66 @@ let ''; preBuild = '' - - echo "Building frontend assets" - ${linkNodeAndBowerPackages} - grunt + echo "[BEGIN]: Building frontend assets" + ${linkNodePackages} + make web-build rm -fr node_modules + rm -fr node_binaries + echo "[DONE ]: Building frontend assets" ''; postInstall = '' + # check required files + STATIC_CHECK="/robots.txt /502.html + /js/scripts.js /js/rhodecode-components.js + /css/style.css /css/style-polymer.css" + + for file in $STATIC_CHECK; + do + if [ ! -f rhodecode/public/$file ]; then + echo "Missing $file" + exit 1 + fi + done + echo "Writing enterprise-ce meta information for rccontrol to nix-support/rccontrol" mkdir -p $out/nix-support/rccontrol cp -v rhodecode/VERSION $out/nix-support/rccontrol/version - echo "[DONE]: enterprise-ce meta information for rccontrol written" + echo "[DONE ]: enterprise-ce meta information for rccontrol written" mkdir -p $out/etc cp configs/production.ini $out/etc - echo "[DONE]: saved enterprise-ce production.ini into $out/etc" + echo "[DONE ]: saved enterprise-ce production.ini into $out/etc" + + cp -Rf rhodecode/config/rcextensions $out/etc/rcextensions.tmpl + echo "[DONE ]: saved enterprise-ce rcextensions into $out/etc/rcextensions.tmpl" # python based programs need to be wrapped mkdir -p $out/bin - # rhodecode-tools - ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/ # required binaries from dependencies - #ln -s ${self.python}/bin/python $out/bin - ln -s ${self.pyramid}/bin/* $out/bin/ - ln -s ${self.gunicorn}/bin/gunicorn $out/bin/ - ln -s ${self.supervisor}/bin/supervisor* $out/bin/ + ln -s ${self.supervisor}/bin/supervisorctl $out/bin/ + ln -s ${self.supervisor}/bin/supervisord $out/bin/ ln -s ${self.pastescript}/bin/paster $out/bin/ ln -s ${self.channelstream}/bin/channelstream $out/bin/ ln -s ${self.celery}/bin/celery $out/bin/ - echo "[DONE]: created symlinks into $out/bin" + ln -s ${self.gunicorn}/bin/gunicorn $out/bin/ + ln -s ${self.pyramid}/bin/prequest $out/bin/ + ln -s ${self.pyramid}/bin/pserve $out/bin/ - for file in $out/bin/*; + echo "[DONE ]: created symlinks into $out/bin" + DEPS="$out/bin/supervisorctl \ + $out/bin/supervisord \ + $out/bin/paster \ + $out/bin/channelstream \ + $out/bin/celery \ + $out/bin/gunicorn \ + $out/bin/prequest \ + $out/bin/pserve" + + # wrap only dependency scripts, they require to have full PYTHONPATH set + # to be able to import all packages + for file in $DEPS; do wrapProgram $file \ --prefix PATH : $PATH \ @@ -215,16 +244,18 @@ let --set PYTHONHASHSEED random done - echo "[DONE]: enterprise-ce binary wrapping" + echo "[DONE ]: enterprise-ce binary wrapping" + + # rhodecode-tools don't need wrapping + ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/ - if [ ! -f rhodecode/public/js/scripts.js ]; then - echo "Missing scripts.js" - exit 1 - fi - if [ ! -f rhodecode/public/css/style.css ]; then - echo "Missing style.css" - exit 1 - fi + # expose sources of CE + ln -s $out $out/etc/rhodecode_enterprise_ce_source + + # expose static files folder + cp -Rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/public/ $out/etc/static + chmod 755 -R $out/etc/static + ''; }); @@ -237,8 +268,13 @@ let getAttr pythonPackages pkgs; pythonGeneratedPackages = import ./pkgs/python-packages.nix { - inherit pkgs; - inherit (pkgs) fetchurl fetchgit fetchhg; + inherit + pkgs; + inherit + (pkgs) + fetchurl + fetchgit + fetchhg; }; pythonCommunityOverrides = import ./pkgs/python-packages-overrides.nix { diff --git a/docs/admin/admin-tricks.rst b/docs/admin/admin-tricks.rst --- a/docs/admin/admin-tricks.rst +++ b/docs/admin/admin-tricks.rst @@ -162,7 +162,8 @@ To add custom hooks to your instance, us 1. Open :menuselection:`Admin --> Settings --> Hooks` 2. Add your custom hook details, you can use a file path to specify custom - hook scripts, for example: ``python:/path/to/custom_hook.py`` + hook scripts, for example: + ``pretxnchangegroup.example`` with value ``python:/path/to/custom_hook.py:my_func_name`` 3. Select :guilabel:`Save` Also, see the |RC| Extensions section of the :ref:`rc-tools` guide. |RC| diff --git a/docs/admin/svn-http.rst b/docs/admin/svn-http.rst --- a/docs/admin/svn-http.rst +++ b/docs/admin/svn-http.rst @@ -18,8 +18,8 @@ Prerequisites .. tip:: We recommend using Wandisco repositories which provide latest SVN versions - for most platforms. Below is example how to add the wandisco repositories - for Ubuntu. + for most platforms. + Here is an example how to add the Wandisco repositories for Ubuntu. .. code-block:: bash @@ -27,15 +27,28 @@ Prerequisites $ sudo wget -q http://opensource.wandisco.com/wandisco-debian.gpg -O- | sudo apt-key add - $ sudo apt-get update + Here is an example how to add the Wandisco repositories for Centos/Redhat. Using + a yum config -Using Ubuntu 14.04/16.04 Distribution as an example execute the following to -install required components: + .. code-block:: bash + + [wandisco-Git] + name=CentOS-6 - Wandisco Git + baseurl=http://opensource.wandisco.com/centos/6/git/$basearch/ + enabled=1 + gpgcheck=1 + gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco + + + +Example installation of required components for Ubuntu platform: .. code-block:: bash - $ sudo apt-get install apache2 libapache2-mod-svn + $ sudo apt-get install apache2 + $ sudo apt-get install libapache2-mod-svn -Once installed you need to enable ``dav_svn``: +Once installed you need to enable ``dav_svn`` on Ubuntu: .. code-block:: bash @@ -44,6 +57,26 @@ Once installed you need to enable ``dav_ $ sudo a2enmod authn_anon +Example installation of required components for RedHat/CentOS platform: + +.. code-block:: bash + + $ sudo yum install httpd + $ sudo yum install subversion mod_dav_svn + + +Once installed you need to enable ``dav_svn`` on RedHat/CentOS: + +.. code-block:: bash + + sudo vi /etc/httpd/conf.modules.d/10-subversion.conf + ## The file should read: + + LoadModule dav_svn_module modules/mod_dav_svn.so + LoadModule headers_module modules/mod_headers.so + LoadModule authn_anon_module modules/mod_authn_anon.so + + Configuring Apache Setup ======================== diff --git a/docs/contributing/dependencies.rst b/docs/contributing/dependencies.rst --- a/docs/contributing/dependencies.rst +++ b/docs/contributing/dependencies.rst @@ -13,48 +13,4 @@ dependencies for Python and JavaScript w this section to generate the needed Nix derivations. -Python dependencies -=================== - -We use the tool `pip2nix` to generate the Nix derivations for our Python -dependencies. - -Generating the dependencies should be done with the following command: - -.. code:: shell - - pip2nix generate --license - - -.. note:: - - License extraction support is still experimental, use the version from the - following pull request: https://github.com/ktosiek/pip2nix/pull/30 - - - -Node dependencies -================= - -After adding new dependencies via ``npm install --save``, use `node2nix` to -update the corresponding Nix derivations: - -.. code:: shell - - cd pkgs - node2nix --input ../package.json \ - -o node-packages.nix \ - -e node-env.nix \ - -c node-default.nix \ - -d --flatten - - -Bower dependencies -================== - -Frontend dependencies are managed based on `bower`, with `bower2nix` a tool -exists which can generate the needed Nix derivations: - -.. code:: shell - - bower2nix bower.json pkgs/bower-packages.nix +Please check pkgs/README.rst file for mor information on how to build the packages. diff --git a/docs/extensions/config-ext.rst b/docs/extensions/config-ext.rst deleted file mode 100644 --- a/docs/extensions/config-ext.rst +++ /dev/null @@ -1,150 +0,0 @@ -.. _config-ext: - -Configure |RCX| ---------------- - -To get the the built in plugins and extensions working the way you want them -to, you have to configure them to work with your services. An overview of -what needs to be done is: - -* :ref:`config-rcx-plugin` to carry out your desired actions once its hook is - triggered. There are default actions built in, but you may wish to alter - those. -* :ref:`config-rcx-hook` to execute actions for the plugin, when certain - actions are carried out with |RCE|. - -.. _config-rcx-plugin: - -Tweak a Default Plugin -^^^^^^^^^^^^^^^^^^^^^^ - -Each of the default plugins comes with a standard configuration, but you may -wish to change those settings. In this example, the Redmine plugin watches -for the words defined in the ``HASH_REGEX`` variable and takes actions if one -of those words is used in conjunction with a ``#{number}``, which matches a -ticket number in Redmine. You can configure this to work differently based on -the `Redmine documentation`_. - -.. code-block:: python - :emphasize-lines: 3-5, 37 - - import re - - HASH_REGEX = re.compile( - r"(?:fix|fixes|fixing|close|closes|closing)\s*#([0-9]+)\b", - re.IGNORECASE) - - - def link_to_commit(repo_url, commit_id): - rev_url = '%s/changeset/%s' % (repo_url, commit_id) - return '"%s":%s' % (commit_id[:6], rev_url) - - - def run(*args, **kwargs): - issues = kwargs['RM_ISSUES'] - if not issues: - return 0 - - # repo extra fields can control this, they should be propagated with - # extract repo fields - tracker_url = kwargs.get('redmine_tracker_url') or kwargs['RM_URL'] - project_id = kwargs.get('redmine_project_id') or kwargs['RM_PROJECT'] - api_key = kwargs.get('redmine_api_key') or kwargs['RM_APIKEY'] - - if project_id: - from redmine import Redmine - remote_redmine = Redmine(tracker_url, key=api_key) - project = remote_redmine.project.get(project_id) - repo_url = '%(server_url)s/%(repository)s' % kwargs - # for each fetched issue id make a redmine api call - for _id, details in issues.items(): - commits = ', '.join([link_to_commit(repo_url, - x['raw_id'],) - for x in details]) - issue = project.issues.get(int(_id)) - if issue: - issue.notes = 'Issue resolved by %s' % (commits,) - issue.status_id = 3 # Resolved - issue.save() - - -.. _config-rcx-hook: - -Configure a Hook -^^^^^^^^^^^^^^^^ - -To configure the default hooks in the -:file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init.py__` file, -use the following steps. - -1. Configure the connection details, either in the file or import from a - dictionary. For these connection scenarios the following details need to - be configured. - -* **REDMINE_URL** = '' -* **REDMINE_API_KEY** = '' -* **SLACK_API_URL** = '?token=' -* **SLACK_API_KEY** = '' - -2. You will also need to configure other variables, such as the - **SLACK_ROOM** or **RM_PROJECT** (Redmine Project). These set where the - commit message is posted. Various hooks can take different variables and - they are documented in the file. - -3. Inside each hook you can then configure it to carry out actions - per service. In this example, the push hook is pushing to the Redmine and - Slack plugins on each push if the hook criteria are matched. - -.. code-block:: python - :emphasize-lines: 21-29, 37-44 - - def _push_hook(*args, **kwargs): - kwargs['commit_ids'] = kwargs['pushed_revs'] - - call = load_extension('extra_fields.py') - if call: - repo_extra_fields = call(**kwargs) - # now update if we have extra fields, they have precedence - # this way users can store any configuration inside - # the database per repo - for key, data in repo_extra_fields.items(): - kwargs[key] = data['field_value'] - - # fetch pushed commits - call = load_extension('extract_commits.py') - extracted_commits = {} - if call: - extracted_commits = call(**kwargs) - # store the commits for the next call chain - kwargs['COMMITS'] = extracted_commits - - # slack ! - call = load_extension('slack.py') - if call: - kwargs['INCOMING_WEBHOOK_URL'] = SLACK_API_URL - kwargs['SLACK_TOKEN'] = SLACK_API_KEY - kwargs['SLACK_ROOM'] = '#slack-channel' - kwargs['SLACK_FROM'] = 'Slack-Message-Poster' - kwargs['SLACK_FROM_ICON_EMOJI'] = ':slack-emoji:' - call(**kwargs) - - # fetch issues from given commits - call = load_extension('extract_issues.py') - issues = {} - if call: - issues = call(**kwargs) - - # redmine smart commits - call = load_extension('redmine_smart_commits.py') - if call: - kwargs['RM_URL'] = REDMINE_URL - kwargs['RM_APIKEY'] = REDMINE_API_KEY - kwargs['RM_PROJECT'] = None # uses extra_fields from repo - kwargs['RM_ISSUES'] = issues - call(**kwargs) - - return 0 - PUSH_HOOK = _push_hook - - -.. _Redmine documentation: http://www.redmine.org/projects/redmine/wiki/Rest_api diff --git a/docs/extensions/example-ext.py b/docs/extensions/example-ext.py deleted file mode 100644 --- a/docs/extensions/example-ext.py +++ /dev/null @@ -1,823 +0,0 @@ -""" -rcextensions module. - -""" - - -import os -import imp -import string -import functools - -here = os.path.dirname(os.path.abspath(__file__)) -registered_extensions = dict() - -class DotDict(dict): - - def __contains__(self, k): - try: - return dict.__contains__(self, k) or hasattr(self, k) - except: - return False - - # only called if k not found in normal places - def __getattr__(self, k): - try: - return object.__getattribute__(self, k) - except AttributeError: - try: - return self[k] - except KeyError: - raise AttributeError(k) - - def __setattr__(self, k, v): - try: - object.__getattribute__(self, k) - except AttributeError: - try: - self[k] = v - except: - raise AttributeError(k) - else: - object.__setattr__(self, k, v) - - def __delattr__(self, k): - try: - object.__getattribute__(self, k) - except AttributeError: - try: - del self[k] - except KeyError: - raise AttributeError(k) - else: - object.__delattr__(self, k) - - def toDict(self): - return unserialize(self) - - def __repr__(self): - keys = list(self.iterkeys()) - keys.sort() - args = ', '.join(['%s=%r' % (key, self[key]) for key in keys]) - return '%s(%s)' % (self.__class__.__name__, args) - - @staticmethod - def fromDict(d): - return serialize(d) - - -def serialize(x): - if isinstance(x, dict): - return DotDict((k, serialize(v)) for k, v in x.iteritems()) - elif isinstance(x, (list, tuple)): - return type(x)(serialize(v) for v in x) - else: - return x - - -def unserialize(x): - if isinstance(x, dict): - return dict((k, unserialize(v)) for k, v in x.iteritems()) - elif isinstance(x, (list, tuple)): - return type(x)(unserialize(v) for v in x) - else: - return x - - -def load_extension(filename, async=False): - """ - use to load extensions inside rcextension folder. - for example:: - - callback = load_extension('email.py', async=False) - if callback: - callback('foobar') - - put file named email.py inside rcextensions folder to load it. Changing - async=True will make the call of the plugin async, it's useful for - blocking calls like sending an email or notification with APIs. - """ - mod = ''.join(filename.split('.')[:-1]) - loaded = imp.load_source(mod, os.path.join(here, filename)) - - callback = getattr(loaded, 'run', None) - if not callback: - raise Exception('Plugin missing `run` method') - if async: - # modify callback so it's actually an async call - def _async_callback(*args, **kwargs): - import threading - thr = threading.Thread(target=callback, args=args, kwargs=kwargs) - thr.start() - if kwargs.get('_async_block'): - del kwargs['_async_block'] - thr.join() - - return _async_callback - return callback - - -def _verify_kwargs(expected_parameters, kwargs): - """ - Verify that exactly `expected_parameters` are passed in as `kwargs`. - """ - expected_parameters = set(expected_parameters) - kwargs_keys = set(kwargs.keys()) - if kwargs_keys != expected_parameters: - missing_kwargs = expected_parameters - kwargs_keys - unexpected_kwargs = kwargs_keys - expected_parameters - raise AssertionError( - "Missing parameters: %r, unexpected parameters: %s" % - (missing_kwargs, unexpected_kwargs)) - - -def verify_kwargs(required_args): - """ - decorator to verify extension calls arguments. - - :param required_args: - """ - def wrap(func): - def wrapper(*args, **kwargs): - _verify_kwargs(required_args, kwargs) - return func(*args, **kwargs) - return wrapper - return wrap - - -def register(name=None): - def wrap(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - # register load_extensions in kwargs, so we can chain plugins - kwargs['_load_extension'] = load_extension - # append this path for us to use added plugins or modules - import sys - _cur_path = os.path.dirname(os.path.abspath(__file__)) - if _cur_path not in sys.path: - sys.path.append(_cur_path) - - registered_extensions[func.__name__] = func - return func(*args, **kwargs) - return wrapper - return wrap - -# ============================================================================= -# END OF UTILITY FUNCTIONS HERE -# ============================================================================= - -# Additional mappings that are not present in the pygments lexers -# used for building stats -# format is {'ext':['Names']} eg. {'py':['Python']} note: there can be -# more than one name for extension -# NOTE: that this will override any mappings in LANGUAGES_EXTENSIONS_MAP -# build by pygments -EXTRA_MAPPINGS = {} - -# additional lexer definitions for custom files it's overrides pygments lexers, -# and uses defined name of lexer to colorize the files. Format is {'ext': -# 'lexer_name'} List of lexers can be printed running: -# >> python -c "import pprint;from pygments import lexers; -# pprint.pprint([(x[0], x[1]) for x in lexers.get_all_lexers()]);" - -EXTRA_LEXERS = {} - - -CONFIG = DotDict( - slack=DotDict( - api_key='api-key', - api_url='slack-incoming-hook-url', - default_room='#slack-channel', - default_plugin_config={}, - ), - redmine=DotDict( - api_key='api-key', - default_tracker_url='https://redmine.tracker.url', - default_project_id=None, - default_status_resolved_id=3 - ), -) - -# slack conf -CONFIG.slack.default_plugin_config = { - 'INCOMING_WEBHOOK_URL': CONFIG.slack.api_url, - 'SLACK_TOKEN': CONFIG.slack.api_key, - 'SLACK_ROOM': CONFIG.slack.default_room, - 'SLACK_FROM': 'RhodeCode', - 'SLACK_FROM_ICON_EMOJI': ':rhodecode:', -} - -# redmine smart_pr configuration -def configure_redmine_smart_pr(issues, kwargs): - kwargs['REDMINE_ISSUES'] = issues - kwargs['redmine_tracker_url'] = kwargs.pop( - 'redmine_tracker_url', '') or CONFIG.redmine.default_tracker_url - kwargs['redmine_api_key'] = kwargs.pop( - 'redmine_api_key', '') or CONFIG.redmine.api_key - kwargs['redmine_project_id'] = kwargs.pop( - 'redmine_project_id', '') or CONFIG.redmine.default_project_id - - -@register('CREATE_REPO_HOOK') -@verify_kwargs( - ['_load_extension', 'repo_name', 'repo_type', 'description', 'private', - 'created_on', 'enable_downloads', 'repo_id', 'user_id', 'enable_statistics', - 'clone_uri', 'fork_id', 'group_id', 'created_by']) -def _create_repo_hook(*args, **kwargs): - """ - POST CREATE REPOSITORY HOOK. This function will be executed after - each repository is created. kwargs available: - - :param repo_name: - :param repo_type: - :param description: - :param private: - :param created_on: - :param enable_downloads: - :param repo_id: - :param user_id: - :param enable_statistics: - :param clone_uri: - :param fork_id: - :param group_id: - :param created_by: - """ - return 0 -CREATE_REPO_HOOK = _create_repo_hook - - -@register('CREATE_REPO_GROUP_HOOK') -@verify_kwargs( - ['_load_extension', 'group_name', 'group_parent_id', 'group_description', - 'group_id', 'user_id', 'created_by', 'created_on', 'enable_locking']) -def _create_repo_group_hook(*args, **kwargs): - """ - POST CREATE REPOSITORY GROUP HOOK, this function will be - executed after each repository group is created. kwargs available: - - :param group_name: - :param group_parent_id: - :param group_description: - :param group_id: - :param user_id: - :param created_by: - :param created_on: - :param enable_locking: - """ - return 0 -CREATE_REPO_GROUP_HOOK = _create_repo_group_hook - - -@register('PRE_CREATE_USER_HOOK') -@verify_kwargs( - ['_load_extension', 'username', 'password', 'email', 'firstname', - 'lastname', 'active', 'admin', 'created_by']) -def _pre_create_user_hook(*args, **kwargs): - """ - PRE CREATE USER HOOK, this function will be executed before each - user is created, it returns a tuple of bool, reason. - If bool is False the user creation will be stopped and reason - will be displayed to the user. kwargs available: - - :param username: - :param password: - :param email: - :param firstname: - :param lastname: - :param active: - :param admin: - :param created_by: - """ - - reason = 'allowed' - return True, reason -PRE_CREATE_USER_HOOK = _pre_create_user_hook - - -@register('CREATE_USER_HOOK') -@verify_kwargs( - ['_load_extension', 'username', 'full_name_or_username', 'full_contact', - 'user_id', 'name', 'firstname', 'short_contact', 'admin', 'lastname', - 'ip_addresses', 'extern_type', 'extern_name', 'email', 'api_key', - 'api_keys', 'last_login', 'full_name', 'active', 'password', 'emails', - 'inherit_default_permissions', 'created_by', 'created_on']) -def _create_user_hook(*args, **kwargs): - """ - POST CREATE USER HOOK, this function will be executed after each user is created - kwargs available: - - :param username: - :param full_name_or_username: - :param full_contact: - :param user_id: - :param name: - :param firstname: - :param short_contact: - :param admin: - :param lastname: - :param ip_addresses: - :param extern_type: - :param extern_name: - :param email: - :param api_key: - :param api_keys: - :param last_login: - :param full_name: - :param active: - :param password: - :param emails: - :param inherit_default_permissions: - :param created_by: - :param created_on: - """ - return 0 -CREATE_USER_HOOK = _create_user_hook - - -@register('DELETE_REPO_HOOK') -@verify_kwargs( - ['_load_extension', 'repo_name', 'repo_type', 'description', 'private', - 'created_on', 'enable_downloads', 'repo_id', 'user_id', 'enable_statistics', - 'clone_uri', 'fork_id', 'group_id', 'deleted_by', 'deleted_on']) -def _delete_repo_hook(*args, **kwargs): - """ - POST DELETE REPOSITORY HOOK, this function will be executed after - each repository deletion kwargs available: - - :param repo_name: - :param repo_type: - :param description: - :param private: - :param created_on: - :param enable_downloads: - :param repo_id: - :param user_id: - :param enable_statistics: - :param clone_uri: - :param fork_id: - :param group_id: - :param deleted_by: - :param deleted_on: - """ - return 0 -DELETE_REPO_HOOK = _delete_repo_hook - - -@register('DELETE_USER_HOOK') -@verify_kwargs( - ['_load_extension', 'username', 'full_name_or_username', 'full_contact', - 'user_id', 'name', 'firstname', 'short_contact', 'admin', 'lastname', - 'ip_addresses', 'email', 'api_key', 'last_login', 'full_name', 'active', - 'password', 'emails', 'inherit_default_permissions', 'deleted_by' - ]) -def _delete_user_hook(*args, **kwargs): - """ - POST DELETE USER HOOK, this function will be executed after each - user is deleted kwargs available: - - :param username: - :param full_name_or_username: - :param full_contact: - :param user_id: - :param name: - :param firstname: - :param short_contact: - :param admin: - :param lastname: - :param ip_addresses: - :param ldap_dn: - :param email: - :param api_key: - :param last_login: - :param full_name: - :param active: - :param password: - :param emails: - :param inherit_default_permissions: - :param deleted_by: - """ - return 0 -DELETE_USER_HOOK = _delete_user_hook - - -@register('PRE_PUSH_HOOK') -@verify_kwargs( - ['_load_extension', 'server_url', 'config', 'scm', 'username', - 'ip', 'action', 'repository', 'repo_store_path']) -def _pre_push_hook(*args, **kwargs): - """ - Post push hook - kwargs available: - - :param server_url: url of instance that triggered this hook - :param config: path to .ini config used - :param scm: type of VS 'git' or 'hg' - :param username: name of user who pushed - :param ip: ip of who pushed - :param action: push - :param repository: repository name - :param repo_store_path: full path to where repositories are stored - """ - return 0 -PRE_PUSH_HOOK = _pre_push_hook - - -@register('PUSH_HOOK') -@verify_kwargs( - ['_load_extension', 'server_url', 'config', 'scm', 'username', - 'ip', 'action', 'repository', 'repo_store_path', 'pushed_revs']) -def _push_hook(*args, **kwargs): - """ - POST PUSH HOOK, this function will be executed after each push it's - executed after the build-in hook that RhodeCode uses for logging pushes - kwargs available: - - :param server_url: url of instance that triggered this hook - :param config: path to .ini config used - :param scm: type of VS 'git' or 'hg' - :param username: name of user who pushed - :param ip: ip of who pushed - :param action: push - :param repository: repository name - :param repo_store_path: full path to where repositories are stored - :param pushed_revs: list of pushed commit ids - """ - # backward compat - kwargs['commit_ids'] = kwargs['pushed_revs'] - - # fetch extra fields from repository - call = load_extension('extra_fields.py') - _extra_fields = {} - if call: - repo_extra_fields = call(**kwargs) - # now update if we have extra fields, they have precedence - # this way users can store any configuration inside the database per - # repo - for key, data in repo_extra_fields.items(): - kwargs[key] = data['field_value'] - _extra_fields[key] = data['field_value'] - - # fetch pushed commits, from commit_ids list - call = load_extension('extract_commits.py') - extracted_commits = {} - if call: - extracted_commits = call(**kwargs) - # store the commits for the next call chain - kwargs['COMMITS'] = extracted_commits - - # slack ! - call = load_extension('slack_push_notify.py') - if call: - kwargs.update(CONFIG.slack.default_plugin_config) - call(**kwargs) - - # fetch redmine issues from given commits - call = load_extension('extract_redmine_issues.py') - issues = {} - if call: - issues = call(**kwargs) - - # redmine smart commits - call = load_extension('redmine_smart_commits.py') - if call: - kwargs['REDMINE_ISSUES'] = issues - - kwargs['redmine_tracker_url'] = kwargs.pop( - 'redmine_tracker_url', '') or CONFIG.redmine.default_tracker_url - kwargs['redmine_api_key'] = kwargs.pop( - 'redmine_api_key', '') or CONFIG.redmine.api_key - kwargs['redmine_status_resolved_id'] = kwargs.pop( - 'redmine_status_resolved_id', '') or CONFIG.redmine.default_status_resolved_id - kwargs['redmine_project_id'] = kwargs.pop( - 'redmine_project_id', '') or CONFIG.redmine.default_project_id - call(**kwargs) - - return 0 -PUSH_HOOK = _push_hook - - -@register('PRE_PULL_HOOK') -@verify_kwargs( - ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip', - 'action', 'repository']) -def _pre_pull_hook(*args, **kwargs): - """ - Post pull hook - kwargs available:: - - :param server_url: url of instance that triggered this hook - :param config: path to .ini config used - :param scm: type of VS 'git' or 'hg' - :param username: name of user who pulled - :param ip: ip of who pulled - :param action: pull - :param repository: repository name - """ - return 0 -PRE_PULL_HOOK = _pre_pull_hook - - -@register('PULL_HOOK') -@verify_kwargs( - ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip', - 'action', 'repository']) -def _pull_hook(*args, **kwargs): - """ - POST PULL HOOK, this function will be executed after each push it's - executed after the build-in hook that RhodeCode uses for logging pulls - - kwargs available: - - :param server_url: url of instance that triggered this hook - :param config: path to .ini config used - :param scm: type of VS 'git' or 'hg' - :param username: name of user who pulled - :param ip: ip of who pulled - :param action: pull - :param repository: repository name - """ - return 0 -PULL_HOOK = _pull_hook - - -# ============================================================================= -# PULL REQUEST RELATED HOOKS -# ============================================================================= -@register('CREATE_PULL_REQUEST') -@verify_kwargs( - ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip', - 'action', 'repository', 'pull_request_id', 'url', 'title', 'description', - 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status', - 'mergeable', 'source', 'target', 'author', 'reviewers']) -def _create_pull_request_hook(*args, **kwargs): - """ - - """ - # extract extra fields and default reviewers from target - kwargs['REPOSITORY'] = kwargs['target']['repository'] - - call = load_extension('extra_fields.py') - if call: - repo_extra_fields = call(**kwargs) - # now update if we have extra fields, they have precedence - # this way users can store any configuration inside the database per - # repo - for key, data in repo_extra_fields.items(): - kwargs[key] = data['field_value'] - - call = load_extension('default_reviewers.py') - if call: - # read default_reviewers key propagated from extra fields - kwargs['default_reviewers'] = map(string.strip, kwargs.pop( - 'default_reviewers', '').split(',')) - call(**kwargs) - - # extract below from source repo as commits are there - kwargs['REPOSITORY'] = kwargs['source']['repository'] - - # # fetch pushed commits, from commit_ids list - # call = load_extension('extract_commits.py') - # extracted_commits = {} - # if call: - # extracted_commits = call(**kwargs) - # # store the commits for the next call chain - # kwargs['COMMITS'] = extracted_commits - # - # # fetch issues from given commits - # call = load_extension('extract_redmine_issues.py') - # issues = {} - # if call: - # issues = call(**kwargs) - # - # # redmine smart pr update - # call = load_extension('redmine_pr_flow.py') - # if call: - # # updates kwargs on the fly - # configure_redmine_smart_pr(issues=issues, kwargs=kwargs) - # call(**kwargs) - # - # # slack notification on merging PR - # call = load_extension('slack_message.py') - # if call: - # kwargs.update(CONFIG.slack.default_plugin_config) - # kwargs['SLACK_ROOM'] = '#develop' - # kwargs['SLACK_MESSAGE'] = 'Pull request <%s|#%s> (%s) was created.' % ( - # kwargs.get('url'), kwargs.get('pull_request_id'), kwargs.get('title')) - # - # call(**kwargs) - - return 0 -CREATE_PULL_REQUEST = _create_pull_request_hook - - -@register('REVIEW_PULL_REQUEST') -@verify_kwargs( - ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip', - 'action', 'repository', 'pull_request_id', 'url', 'title', 'description', - 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status', - 'mergeable', 'source', 'target', 'author', 'reviewers']) -def _review_pull_request_hook(*args, **kwargs): - """ - - """ - # extract extra fields and default reviewers from target - kwargs['REPOSITORY'] = kwargs['target']['repository'] - - # fetch extra fields - call = load_extension('extra_fields.py') - if call: - repo_extra_fields = call(**kwargs) - # now update if we have extra fields, they have precedence - # this way users can store any configuration inside the database per - # repo - for key, data in repo_extra_fields.items(): - kwargs[key] = data['field_value'] - - # extract below from source repo as commits are there - kwargs['REPOSITORY'] = kwargs['source']['repository'] - - # fetch pushed commits, from commit_ids list - call = load_extension('extract_commits.py') - extracted_commits = {} - if call: - extracted_commits = call(**kwargs) - # store the commits for the next call chain - kwargs['COMMITS'] = extracted_commits - - # fetch issues from given commits - call = load_extension('extract_redmine_issues.py') - issues = {} - if call: - issues = call(**kwargs) - - # redmine smart pr update - call = load_extension('redmine_pr_flow.py') - if call: - # updates kwargs on the fly - configure_redmine_smart_pr(issues=issues, kwargs=kwargs) - call(**kwargs) - - return 0 -REVIEW_PULL_REQUEST = _review_pull_request_hook - - -@register('UPDATE_PULL_REQUEST') -@verify_kwargs( - ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip', - 'action', 'repository', 'pull_request_id', 'url', 'title', 'description', - 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status', - 'mergeable', 'source', 'target', 'author', 'reviewers']) -def _update_pull_request_hook(*args, **kwargs): - """ - - """ - # extract extra fields and default reviewers from target - kwargs['REPOSITORY'] = kwargs['target']['repository'] - - # fetch extra fields - call = load_extension('extra_fields.py') - if call: - repo_extra_fields = call(**kwargs) - # now update if we have extra fields, they have precedence - # this way users can store any configuration inside the database per - # repo - for key, data in repo_extra_fields.items(): - kwargs[key] = data['field_value'] - - # extract below from source repo as commits are there - kwargs['REPOSITORY'] = kwargs['source']['repository'] - - # fetch pushed commits, from commit_ids list - call = load_extension('extract_commits.py') - extracted_commits = {} - if call: - extracted_commits = call(**kwargs) - # store the commits for the next call chain - kwargs['COMMITS'] = extracted_commits - - # fetch issues from given commits - call = load_extension('extract_redmine_issues.py') - issues = {} - if call: - issues = call(**kwargs) - - # redmine smart pr updated - call = load_extension('redmine_pr_flow.py') - if call: - # updates kwargs on the fly - configure_redmine_smart_pr(issues=issues, kwargs=kwargs) - call(**kwargs) - - return 0 -UPDATE_PULL_REQUEST = _update_pull_request_hook - - -@register('MERGE_PULL_REQUEST') -@verify_kwargs( - ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip', - 'action', 'repository', 'pull_request_id', 'url', 'title', 'description', - 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status', - 'mergeable', 'source', 'target', 'author', 'reviewers']) -def _merge_pull_request_hook(*args, **kwargs): - """ - - """ - # extract extra fields and default reviewers from target - kwargs['REPOSITORY'] = kwargs['target']['repository'] - - # fetch extra fields - call = load_extension('extra_fields.py') - if call: - repo_extra_fields = call(**kwargs) - # now update if we have extra fields, they have precedence - # this way users can store any configuration inside the database per - # repo - for key, data in repo_extra_fields.items(): - kwargs[key] = data['field_value'] - - # extract below from source repo as commits are there - kwargs['REPOSITORY'] = kwargs['source']['repository'] - - # fetch pushed commits, from commit_ids list - call = load_extension('extract_commits.py') - extracted_commits = {} - if call: - extracted_commits = call(**kwargs) - # store the commits for the next call chain - kwargs['COMMITS'] = extracted_commits - - # fetch issues from given commits - call = load_extension('extract_redmine_issues.py') - issues = {} - if call: - issues = call(**kwargs) - - # redmine smart pr update - call = load_extension('redmine_pr_flow.py') - if call: - # updates kwargs on the fly - configure_redmine_smart_pr(issues=issues, kwargs=kwargs) - call(**kwargs) - - # slack notification on merging PR - call = load_extension('slack_message.py') - if call: - kwargs.update(CONFIG.slack.default_plugin_config) - kwargs['SLACK_ROOM'] = '#develop' - kwargs['SLACK_MESSAGE'] = 'Pull request <%s|#%s> (%s) was merged.' % ( - kwargs.get('url'), kwargs.get('pull_request_id'), kwargs.get('title')) - call(**kwargs) - - return 0 -MERGE_PULL_REQUEST = _merge_pull_request_hook - - -@register('CLOSE_PULL_REQUEST') -@verify_kwargs( - ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip', - 'action', 'repository', 'pull_request_id', 'url', 'title', 'description', - 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status', - 'mergeable', 'source', 'target', 'author', 'reviewers']) -def _close_pull_request_hook(*args, **kwargs): - """ - - """ - # extract extra fields and default reviewers from target - kwargs['REPOSITORY'] = kwargs['target']['repository'] - - # fetch extra fields - call = load_extension('extra_fields.py') - if call: - repo_extra_fields = call(**kwargs) - # now update if we have extra fields, they have precedence - # this way users can store any configuration inside the database per - # repo - for key, data in repo_extra_fields.items(): - kwargs[key] = data['field_value'] - - # extract below from source repo as commits are there - kwargs['REPOSITORY'] = kwargs['source']['repository'] - - # fetch pushed commits, from commit_ids list - call = load_extension('extract_commits.py') - extracted_commits = {} - if call: - extracted_commits = call(**kwargs) - # store the commits for the next call chain - kwargs['COMMITS'] = extracted_commits - - # fetch issues from given commits - call = load_extension('extract_redmine_issues.py') - issues = {} - if call: - issues = call(**kwargs) - - # redmine smart pr update - call = load_extension('redmine_pr_flow.py') - if call: - # updates kwargs on the fly - configure_redmine_smart_pr(issues=issues, kwargs=kwargs) - call(**kwargs) - - return 0 -CLOSE_PULL_REQUEST = _close_pull_request_hook diff --git a/docs/extensions/extensions-hooks.rst b/docs/extensions/extensions-hooks.rst --- a/docs/extensions/extensions-hooks.rst +++ b/docs/extensions/extensions-hooks.rst @@ -14,12 +14,23 @@ so to clarify what is meant each time, r between software components and can be used to trigger plugins, or their extensions. -.. toctree:: + +Hooks +----- + +Within |RCM| there are two types of supported hooks. - rcx - install-ext - config-ext - extensions - hooks - full-blown-example - int-slack +* **Internal built-in hooks**: The internal |hg|, |git| or |svn| hooks are + triggered by different VCS operations, like push, pull, + or clone and are non-configurable, but you can add your own VCS hooks, + see :ref:`custom-hooks`. +* **Custom rcextensions hooks**: User defined hooks centre around the lifecycle of + certain actions such are |repo| creation, user creation etc. The actions + these hooks trigger can be rejected based on the API permissions of the + user calling them. + +On instructions how to use the custom `rcextensions` +see :ref:`integrations-rcextensions` section. + + + diff --git a/docs/extensions/extensions.rst b/docs/extensions/extensions.rst deleted file mode 100644 --- a/docs/extensions/extensions.rst +++ /dev/null @@ -1,59 +0,0 @@ -.. _dev-plug: - -Developing Plugins/Extensions ------------------------------ - -An Extension or a Plugin is simply a |PY| module with a ``run`` method that -expects a number of parameters, depending on which event it is listening -for. To get an extension working, use the following steps: - -1. Create an extension or plugin using the below example. -2. Save the plugin inside the - :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions` folder. -3. Add a hook to the - :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init__.py` file. - For more information, see :ref:`event-listener`. -4. Restart your |RCM| instance. - -Extension example -^^^^^^^^^^^^^^^^^ - -In the following example, the ``run`` method listens for a push to a |repo| -and parses the commit. - -.. code-block:: python - - def run(*args, **kwargs): - - revs = kwargs.get('pushed_revs') - if not revs: - return 0 - - from rhodecode.lib.utils2 import extract_mentioned_users - from rhodecode.model.db import Repository - - repo = Repository.get_by_repo_name(kwargs['repository']) - changesets = [] - reviewers = [] - - # reviewer fields from extra_fields, users can store their custom - # reviewers inside the extra fields to pre-define a set of people who - # will get notifications about changesets - field_key = kwargs.get('reviewers_extra_field') - if field_key: - for xfield in repo.extra_fields: - if xfield.field_key == field_key: - reviewers.extend(xfield.field_value.split()) - - vcs_repo = repo.scm_instance_no_cache() - for rev in kwargs['pushed_revs']: - cs = vcs_repo.get_changeset(rev) # or get_commit. See API doc - cs_data = cs.__json__() - cs_data['mentions'] = extract_mentioned_users(cs_data['message']) - cs_data['reviewers'] = reviewers - # optionally add more logic to parse the commits, like reading extra - # fields of repository to read managers of reviewers - changesets.append(cs_data) - - return changesets - \ No newline at end of file diff --git a/docs/extensions/full-blown-example.rst b/docs/extensions/full-blown-example.rst deleted file mode 100644 --- a/docs/extensions/full-blown-example.rst +++ /dev/null @@ -1,19 +0,0 @@ -.. _int-full-blown: - -Extensions Extended Example ---------------------------- - -This example -:file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init.py__` file -has been highlighted to show a Redmine integration in full. To extend your -|RCE| instances, use the below example to integrate with other -applications. - -This example file also contains a Slack integration, but it is not -highlighted. - - -.. literalinclude:: example-ext.py - :language: python - :emphasize-lines: 186,193-198,210-218,474-496,648-660,749-760,810-822 - :linenos: diff --git a/docs/extensions/hooks.rst b/docs/extensions/hooks.rst deleted file mode 100644 --- a/docs/extensions/hooks.rst +++ /dev/null @@ -1,86 +0,0 @@ -.. _hooks: - -Hooks ------ - -Within |RCM| there are two types of supported hooks. - -* **Internal built-in hooks**: The internal |hg| or |git| hooks are - triggered by different VCS operations, like push, pull, - or clone and are non-configurable, but you can add your own VCS hooks, - see :ref:`custom-hooks`. -* **User defined hooks**: User defined hooks centre around the lifecycle of - certain actions such are |repo| creation, user creation etc. The actions - these hooks trigger can be rejected based on the API permissions of the - user calling them. - -Those custom hooks can be called using |RCT|, see :ref:`rc-tools`. To create -a custom hook, see the :ref:`event-listener` section. - -.. _event-listener: - -Making your Extension listen for Events -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -To create a hook to work with a plugin or extension, -you need configure a listener in the -:file:`/home/{user}/{instance-id}/rcextensions/__init__.py` file, -and use the ``load_extension`` method. - -Use the following example to create your extensions. -In this example: - -* The hook is calling the ``('my_post_push_extension.py')`` extension. -* The hook is listening to |RCM| for pushes to |repos|. -* This highlighted code is the hook, and configured in the ``__init__.py`` file. -* It is inserted into the ``def _pushhook(*args, **kwargs)`` section, - if it is not in the default ``__ini__.py`` file, use the below - non-highlighted section to create it. - -.. code-block:: python - :emphasize-lines: 23-38 - - # ========================================================================== - # POST PUSH HOOK - # ========================================================================== - - # this function will be executed after each push is executed after the - # build-in hook that RhodeCode uses for logging pushes - def _pushhook(*args, **kwargs): - """ - Post push hook - kwargs available: - - :param server_url: url of instance that triggered this hook - :param config: path to .ini config used - :param scm: type of VS 'git' or 'hg' - :param username: name of user who pushed - :param ip: ip of who pushed - :param action: push - :param repository: repository name - :param repo_store_path: full path to where repositories are stored - :param pushed_revs: list of pushed revisions - """ - - # Your hook code goes in here - call = load_extension('my_post_push_extension.py') - if call: - # extra arguments in kwargs - call_kwargs = dict() - call_kwargs.update(kwargs) - my_kw = { - 'reviewers_extra_field': 'reviewers', - # defines if we have a comma - # separated list of reviewers - # in this repo stored in extra_fields - } - call_kwargs.update(my_kw) # pass in hook args - parsed_revs = call(**call_kwargs) - # returns list of dicts with changesets data - - # Default code - return 0 - PUSH_HOOK = _pushhook - -Once your plugin and hook are configured, restart your instance of |RCM| and -your event listener will triggered as soon as a user pushes to a |repo|. diff --git a/docs/extensions/install-ext.rst b/docs/extensions/install-ext.rst deleted file mode 100644 --- a/docs/extensions/install-ext.rst +++ /dev/null @@ -1,55 +0,0 @@ -.. _install-rcx: - -Install |RCX| -------------- - -To install |RCX|, you need to have |RCT| installed. See the :ref:`install-tools` -and :ref:`tools-cli` sections. Use the ``--plugins`` option with -the ``rhodecode-extensions`` argument. - -Upgrading |RCX| -^^^^^^^^^^^^^^^ - -.. important:: - - You should back up any plugins or extensions that you have created before - continuing. - -To upgrade your |RCX|, use the following example: - -1. From inside the |RCT| virtualenv, upgrade to the latest version: - -.. code-block:: bash - - (venv)$ pip install -U https://my.rhodecode.com/dl/rhodecode-tools/latest - Downloading/unpacking https://my.rhodecode.com/dl/rhodecode-tools/latest - Downloading latest (143kB): 143kB downloaded - Running setup.py (path:/tmp/pip-9qYsxf-build/setup.py) egg_info - for package from https://my.rhodecode.com/dl/rhodecode-tools/latest - -2. Once |RCT| are upgraded to the latest version, you can install the latest - extensions using the following example: - -.. code-block:: bash - - (venv)$ rhodecode-extensions --instance-name=enterprise-1 \ - --ini-file=rhodecode.ini --plugins - - Extension file already exists, do you want to overwrite it? [y/N]: y - Writen new extensions file to rcextensions - Copied hipchat_push_notify.py plugin to rcextensions - Copied jira_pr_flow.py plugin to rcextensions - Copied default_reviewers.py plugin to rcextensions - Copied extract_commits.py plugin to rcextensions - Copied extract_issues.py plugin to rcextensions - Copied redmine_pr_flow.py plugin to rcextensions - Copied extra_fields.py plugin to rcextensions - Copied jira_smart_commits.py plugin to rcextensions - Copied http_notify.py plugin to rcextensions - Copied slack_push_notify.py plugin to rcextensions - Copied slack_message.py plugin to rcextensions - Copied extract_jira_issues.py plugin to rcextensions - Copied extract_redmine_issues.py plugin to rcextensions - Copied redmine_smart_commits.py plugin to rcextensions - Copied send_mail.py plugin to rcextensions - diff --git a/docs/extensions/int-slack.rst b/docs/extensions/int-slack.rst deleted file mode 100644 --- a/docs/extensions/int-slack.rst +++ /dev/null @@ -1,151 +0,0 @@ -.. _slack-int: - -Integrate Slack -=============== - -To integrate |RCE| and Slack, you need to configure some things on the Slack -side of the integration, and some things on the |RCE| side. - -On the Slack side you need to allow incoming webhooks, see their -documentation on this, `Slack Webhooks`_. You will also need to get an -Authorization Token from Slack that will allow |RCE| to post to your account. - -On the |RCE| side, this is an overview of what you need to do: - -1. Configure the built-in Slack extensions to post to the correct Slack URL. -2. Set your Slack authentication details in the |RCX| :file:`__init.py__` file. -3. Configure the different hooks in the :file:`__init.py__` file to extract - whatever information you want from |RCE|, and then using the Slack extensions - post that information to your Slack channel. - -.. hint:: - - The below examples should help you to get started. Once you have your - integration up and running, there is a more detailed Slack integration in - the :ref:`int-full-blown` section. - -Configure Built-in Extensions ------------------------------ - -|RCE| comes with 3 Slack extensions: ``slack_message.py``, -``slack_push_notify.py``, and ``slack.py``. The default -location is :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions`. - -To enable these to post to your Slack account, configure each of -these files with the following Slack details. - -.. code-block:: python - - BASE_URL = 'https://your.slack.com/api/link' - INCOMING_WEBHOOK_URL = 'https://hooks.slack.com/services/your/hook/link' - API_VERSION = 1 - -Configure |RCE| to Post to Slack --------------------------------- - -In the |RCX| :file:`__init.py__` file, configure your Slack authentication -details. The default location is -:file:`/home/{user}/.rccontrol/{instance-id}/rcextensions` - -.. code-block:: python - - CONFIG = DotDict( - slack=DotDict( - api_key='api-key', - api_url='slack-incoming-hook-url', - default_room='#slack-channel', - default_plugin_config={}, - ), - ) - - # slack conf - CONFIG.slack.default_plugin_config = { - 'INCOMING_WEBHOOK_URL': CONFIG.slack.api_url, - 'SLACK_TOKEN': CONFIG.slack.api_key, - 'SLACK_ROOM': CONFIG.slack.default_room, - 'SLACK_FROM': 'RhodeCode', - 'SLACK_FROM_ICON_EMOJI': ':rhodecode:', - } - -Add Push Notifications to Slack -------------------------------- - -To add notification to Slack when someone pushes to |RCE|, configure the push -hook to extract the commits pushed, and then call the built-in -``slack_push_notify.py`` extension to post them into your chosen Slack -channel. To do this, add the following code to the push hook section of the -:file:`__init.py__` file - -.. code-block:: python - :emphasize-lines: 10-16,18-22 - - def _push_hook(*args, **kwargs): - """ - POST PUSH HOOK, this function will be executed after each push, it's - executed after the build-in hook that RhodeCode uses for logging pushes - kwargs available: - """ - # backward compat - kwargs['commit_ids'] = kwargs['pushed_revs'] - - # fetch pushed commits, from commit_ids list - call = load_extension('extract_commits.py') - extracted_commits = {} - if call: - extracted_commits = call(**kwargs) - # store the commits for the next call chain - kwargs['COMMITS'] = extracted_commits - - # slack ! - call = load_extension('slack_push_notify.py') - if call: - kwargs.update(CONFIG.slack.default_plugin_config) - call(**kwargs) - return 0 - PUSH_HOOK = _push_hook - - -Add Pull Request Notifications to Slack ---------------------------------------- - -To add |pr| notifications to Slack, use the following example. This example -shows a merged |pr| notification. You can add similar notifications to the -following hooks in the :file:`__init.py__` file, and for those examples see -the :ref:`int-full-blown` section: - -* ``_create_pull_request_hook`` -* ``_review_pull_request_hook`` -* ``_update_pull_request_hook`` -* ``_close_pull_request_hook`` - -.. code-block:: python - :emphasize-lines: 5-23 - - def _merge_pull_request_hook(*args, **kwargs): - """ - - """ - # extract below from source repo as commits are there - kwargs['REPOSITORY'] = kwargs['source']['repository'] - - # fetch pushed commits, from commit_ids list - call = load_extension('extract_commits.py') - extracted_commits = {} - if call: - extracted_commits = call(**kwargs) - # store the commits for the next call chain - kwargs['COMMITS'] = extracted_commits - - # slack notification on merging PR - call = load_extension('slack_message.py') - if call: - kwargs.update(CONFIG.slack.default_plugin_config) - kwargs['SLACK_ROOM'] = '#develop' - kwargs['SLACK_MESSAGE'] = 'Pull request <%s|#%s> (%s) was merged.' % ( - kwargs.get('url'), kwargs.get('pull_request_id'), kwargs.get('title')) - call(**kwargs) - - return 0 - MERGE_PULL_REQUEST = _merge_pull_request_hook - -.. _Slack Webhooks: https://api.slack.com/incoming-webhooks diff --git a/docs/extensions/rcx.rst b/docs/extensions/rcx.rst deleted file mode 100644 --- a/docs/extensions/rcx.rst +++ /dev/null @@ -1,53 +0,0 @@ -.. _rc-ext: - -|RCX| ------ - -|RCX| add additional functionality for push/pull/create/delete |repo| hooks. -These hooks can be used to send signals to build-bots such as `Jenkins`_. It -also adds built in plugin and extension support. Once installed, you will see -a :file:`rcextensions` folder in the instance directory, for example: -:file:`home/{user}/.rccontrol/{instance-id}/rcextensions` - -Built-in Plugins -^^^^^^^^^^^^^^^^ - -* A number of `Jira`_ plugins, enabling you to integrate with that issue - tracker: ``extract_jira_issues.py``, ``jira_pr_flow.py``, - ``jira_smart_commits.py`` -* A number of `Redmine`_ plugins, enabling you to integrate with that issue - tracker: ``extract_redmine_issues.py``, ``redmine_pr_flow.py``, - ``redmine_smart_commits.py``. -* ``hipchat.py`` and ``hipchat_push.py`` enable you to integrate with - `HipChat`_ and set channel or user notifications. -* ``slack.py``, ``slack_message.py``, and ``slack_push_notify.py`` enable - you to integrate with `Slack`_ and set channel or user notifications. - -Built-in Extensions -^^^^^^^^^^^^^^^^^^^ - -* ``commit_parser.py``: Enables you to parse commit messages, - and set a list of users to get notifications about change sets. -* ``default_reviewers.py``: Enables you to add default reviewers to a |pr|. -* ``extra_fields.py``: Returns a list of extra fields added to a |repo|. -* ``http_notify``: Enables you to send data over a web hook. -* ``mail.py`` : This extension uses the |RCE| mail configuration from the - instance :file:`rhodecode.ini` file to send email. -* ``push_post.py``: Enables you to set up push based actions such as - automated Jenkins builds. - -Event Listeners -^^^^^^^^^^^^^^^ - -To enable the extensions to listen to the different events that they are -configured for, you need to also set up an event listener (hook). Event -listeners are configured in the -:file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init.__.py` file. - -For more details, see the example hook in :ref:`event-listener`. - -.. _Jenkins: http://jenkins-ci.org/ -.. _HipChat: https://www.hipchat.com/ -.. _Slack: https://slack.com/ -.. _Redmine: http://www.redmine.org/ -.. _Jira: https://www.atlassian.com/software/jira diff --git a/docs/install/setup-email.rst b/docs/install/setup-email.rst --- a/docs/install/setup-email.rst +++ b/docs/install/setup-email.rst @@ -19,9 +19,7 @@ Once configured you can check the settin ## Additionally these settings will be used by the RhodeCode mailing system ## ################################################################################ #email_to = admin@localhost - #error_email_from = paste_error@localhost #app_email_from = rhodecode-noreply@localhost - #error_message = #email_prefix = [RhodeCode] #smtp_server = mail.server.com @@ -30,5 +28,3 @@ Once configured you can check the settin #smtp_port = #smtp_use_tls = false #smtp_use_ssl = true - ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.) - #smtp_auth = diff --git a/docs/integrations/integrations-rcextensions.rst b/docs/integrations/integrations-rcextensions.rst new file mode 100644 --- /dev/null +++ b/docs/integrations/integrations-rcextensions.rst @@ -0,0 +1,44 @@ +.. _integrations-rcextensions: + + +rcextensions integrations +========================= + + +Since RhodeCode 4.14 release rcextensions aren't part of rhodecode-tools, and instead +they are shipped with the new or upgraded installations. + +The rcextensions template `rcextensions.tmpl` is created in the `etc/` directory +of enterprise or community installation. It's always re-created and updated on upgrades. + + +Activating rcextensions ++++++++++++++++++++++++ + +To activate rcextensions simply copy or rename the created template rcextensions +into the path where the rhodecode.ini file is located:: + + pushd ~/rccontrol/enterprise-1/ + or + pushd ~/rccontrol/community-1/ + + mv etc/rcextensions.tmpl rcextensions + + +rcextensions are loaded when |RCE| starts. So a restart is required after activation or +change of code in rcextensions. + +Simply restart only the enterprise/community instance:: + + rccontrol restart enterprise-1 + or + rccontrol restart community-1 + + +Example usage ++++++++++++++ + + +To see examples of usage please check the examples directory under: + +https://code.rhodecode.com/rhodecode-enterprise-ce/files/stable/rhodecode/config/rcextensions/examples diff --git a/docs/integrations/integrations.rst b/docs/integrations/integrations.rst --- a/docs/integrations/integrations.rst +++ b/docs/integrations/integrations.rst @@ -3,7 +3,7 @@ Integrations ------------ -Rhodecode supports integrations with external services for various events, +|RCE| supports integrations with external services for various events, such as commit pushes and pull requests. Multiple integrations of the same type can be added at the same time; this is useful for posting different events to different Slack channels, for example. @@ -11,18 +11,20 @@ different Slack channels, for example. Supported integrations ^^^^^^^^^^^^^^^^^^^^^^ -============================ ============ ===================================== -Type/Name |RC| Edition Description -============================ ============ ===================================== -:ref:`integrations-slack` |RCCEshort| https://slack.com/ -:ref:`integrations-hipchat` |RCCEshort| https://www.hipchat.com/ -:ref:`integrations-webhook` |RCCEshort| POST events as `json` to a custom url -:ref:`integrations-ci` |RCCEshort| Trigger Builds for Common CI Systems -:ref:`integrations-email` |RCCEshort| Send repo push commits by email -:ref:`integrations-jenkins` |RCEEshort| Trigger Builds for Jenkins CI System -:ref:`integrations-redmine` |RCEEshort| Close/Resolve/Reference Redmine issues -:ref:`integrations-jira` |RCEEshort| Close/Resolve/Reference JIRA issues -============================ ============ ===================================== +================================ ============ ======================================== +Type/Name |RC| Edition Description +================================ ============ ======================================== +:ref:`integrations-webhook` |RCCEshort| Trigger events as `json` to a custom url +:ref:`integrations-slack` |RCCEshort| Integrate with https://slack.com/ +:ref:`integrations-hipchat` |RCCEshort| Integrate with https://www.hipchat.com/ +:ref:`integrations-email` |RCCEshort| Send repo push commits by email +:ref:`integrations-ci` |RCCEshort| Trigger Builds for Common CI Systems +:ref:`integrations-rcextensions` |RCCEshort| Advanced low-level integration framework + +:ref:`integrations-jenkins` |RCEEshort| Trigger Builds for Jenkins CI System +:ref:`integrations-redmine` |RCEEshort| Close/Resolve/Reference Redmine issues +:ref:`integrations-jira` |RCEEshort| Close/Resolve/Reference JIRA issues +================================ ============ ======================================== .. _creating-integrations: @@ -55,3 +57,4 @@ See pages specific to each type of integ email ci jenkins + integrations-rcextensions diff --git a/docs/release-notes/release-notes-4.14.0.rst b/docs/release-notes/release-notes-4.14.0.rst new file mode 100644 --- /dev/null +++ b/docs/release-notes/release-notes-4.14.0.rst @@ -0,0 +1,114 @@ +|RCE| 4.14.0 |RNS| +------------------ + +Release Date +^^^^^^^^^^^^ + +- 2018-11-02 + + +New Features +^^^^^^^^^^^^ + +- Diffs: expose range diff inside the PR view. It's now possible to show + commit-per-commit view of changes in pull request. +- Diffs: new sticky context bar. + When browsing diffs we show file path of the current diff so users are aware all the time + what file they are reviewing. +- Diffs: added quick file selector in diffs views. Now it's possible to select a file + in large diffs from the sticky header for quicker access to certain interesting files + in diffs. +- Diffs: introducing diff menu for whitespace toggle and context changes. + It's now possible to show/hide whitespace changes and toggle the file context in + all diff places including pull requests. +- Comments: allow commenting on empty files without content. +- Repositories: added option to archive repositories instead of deleting them. + Archived repositories are useful for future auditing, but they are read-only. +- rcextensions: new rcextensions. We're introducing new `rcextensions` that will be base + for future low-level integrations. It's now possible to expose nice messages back + to the users when using `rcextensions`. +- Summary page: slightly re-organize summary page for better user experience. + + +General +^^^^^^^ + +- Mailing: switched from custom library to pyramid_mailer with python3 compatibility. +- Frontend: Switched to Polymer 3.0. +- Frontend: fixed problems with IE11 and brought back support for that browser. +- Git: use a fetch_sync based creation of remote repositories. + This fixes problems with importing from Bitbucket. +- Comments: update comments email templates. +- Packaging: only wrap external dependency scripts. This makes execution of scripts + roughly 5x faster due to much smaller PATH tree. +- HTTP: use application wide detection of invalid bytes sent via URL/GET/POST data. +- Fonts/UI: use consistent fonts across the whole application. + Few places had non-standard custom fonts. +- Google: updated google auth plugin with latest API changes. +- Core: handle edge case requesting matched routes but with hg/svn/git or api context. +- Dependencies: bumped rhodecode-tools to 1.0.0 release using Apache2 license. +- Dependencies: atomicwrites==1.2.1 +- Dependencies: attrs==18.2.0 +- Dependencies: dogpile.cache==0.6.7 +- Dependencies: psutil==5.4.7 +- Dependencies: pathlib2==2.3.2 +- Dependencies: subprocess32==3.5.2 +- Dependencies: gevent==1.3.6 +- Dependencies: greenlet==0.4.15 +- Dependencies: pytest==3.8.2 +- Dependencies: py==1.6.0 +- Dependencies: pytest-cov==2.6.0 +- Dependencies: pytest-timeout==1.3.2 +- Dependencies: coverage==4.5.1 +- Dependencies: psycopg2==2.7.5 + + +Security +^^^^^^^^ + +- RST: improve Javascript RST sandbox. +- Jupyter: sanitize markdown cells similar as we do for our own markdown cleanup. + + +Performance +^^^^^^^^^^^ + +- SSH: improved SSH wrapper execution speed by using optimized binary script wrapping. +- Core: reduced font and JavaScript load times. + + +Fixes +^^^^^ + +- Comments: ensure we always display unmatched comments. +- Branch Permissions: fixed changing rule order for branch permissions. +- Users: ensure get_first_superadmin actually gets the 1st created super-admin. +- Users: when deleting users ensure we also clear personal flag. + This fixes some problems with multiple personal groups. +- Diffs: disable the error border on highlight errors. +- Integrations: implement retry to HTTP[S] calls for integrations. + Web parts will do a 3x retry call in case service is not reachable or + responds with 5XX codes. +- Git: fixed pull-request updates in case branch names are the same as the file names. +- Supervisor: add patch for older kernel support. +- Compare: fixed file after/before links in compare view for cross repo compare. +- Emails: improve fonts and rendering of email HTML. +- Permissions: flush members of user groups permissions to clear caches. +- Repository: add check preventing of removal of repo with attached pull requests. Users + should use the new archive repo function instead. + + +Upgrade notes +^^^^^^^^^^^^^ + +- In this release, we're shipping a new `rcextensions`. The changes made are + backward incompatible. An update of `rcextensions` is required + prior to using them again. Please check the new `rcextensions.tmpl` directory + located in `etc/rcextensions.tmpl` in your instance installation path. + Old code should be 100% portable by just copy&paste to the right function. + +- Mailing: We introduced a new mailing library. The older options should be compatible and + generally, old configuration doesn't need any changes in order to send emails. + We, however, encourage users to re-check mailing setup in case of some more + sophisticated email setups. + There's a possibility to send a test email from admin > settings > email section. diff --git a/docs/release-notes/release-notes.rst b/docs/release-notes/release-notes.rst --- a/docs/release-notes/release-notes.rst +++ b/docs/release-notes/release-notes.rst @@ -9,6 +9,7 @@ Release Notes .. toctree:: :maxdepth: 1 + release-notes-4.14.0.rst release-notes-4.13.3.rst release-notes-4.13.2.rst release-notes-4.13.1.rst diff --git a/docs/static/css/add.css b/docs/static/css/add.css --- a/docs/static/css/add.css +++ b/docs/static/css/add.css @@ -1,13 +1,13 @@ .menuselection, .guilabel { font-size: .90em; - font-family: "proximanovaregular", "Proxima Nova Regular", "Proxima Nova", sans-serif; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-style: oblique; } -.version{ +.version { display: none; - } +} -.pre{ - color:#000 - } +.pre { + color: #000 +} diff --git a/docs/tools/tools-cli.rst b/docs/tools/tools-cli.rst --- a/docs/tools/tools-cli.rst +++ b/docs/tools/tools-cli.rst @@ -273,107 +273,8 @@ Use this to create or update a |RCE| con rhodecode-extensions -------------------- -|RCT| adds additional mapping for :ref:`indexing-ref`, statistics, and adds -additional code for push/pull/create/delete |repo| hooks. These hooks can be -used to send signals to build-bots such as jenkins. Options: - -.. rst-class:: dl-horizontal - - \-c, - -config - Create a configuration file. The default file is created - in ``~/.rhoderc`` - - \-h, - -help - Show help messages. - - \-F, - -format {json,pretty} - Set the formatted representation. - - \-I, - -install-dir - Set the location of the |RCE| installation. The default location is - :file:`/home/{user}/.rccontrol/`. - - \ - -ini-file - Path to the :file:`rhodecode.ini` file for that instance. - - \ - -instance-name - Set the instance name. - - \ - -plugins - Add plugins to your |RCE| installation. See the - :ref:`extensions-hooks-ref` section for more details. - - \ - -version - Display your |RCT| version. - - -Once installed, you will see a :file:`rcextensions` folder in the instance -directory, for example :file:`home/{user}/.rccontrol/{instance-id}/rcextensions` - -To install ``rcextensions``, use the following example: - -.. code-block:: bash - - # install extensions on the given instance - # If using virtualenv prior to RCE 350 - (venv)$ rhodecode-extensions --instance-name=enterprise-1 \ - --ini-file=rhodecode.ini - Writen new extensions file to rcextensions - - # install extensions with additional plugins on the given instance - (venv)$ rhodecode-extensions --instance-name=enterprise-1 \ - --ini-file=rhodecode.ini --plugins - Writen new extensions file to rcextensions - - # installing extensions from 350 onwards - # as they are packaged with RCE - $ .rccontrol/enterprise-4/profile/bin/rhodecode-extensions --plugins \ - --instance-name=enterprise-4 --ini-file=rhodecode.ini - - Writen new extensions file to rcextensions - -See the new extensions inside this directory for more details about the -additional hooks available, for example see the ``push_post.py`` file. - -.. code-block:: python - - import urllib - import urllib2 - - def run(*args, **kwargs): - """ - Extra params - - :param URL: url to send the data to - """ - - url = kwargs.pop('URL', None) - if url: - from rhodecode.lib.compat import json - from rhodecode.model.db import Repository - - repo = Repository.get_by_repo_name(kwargs['repository']) - changesets = [] - vcs_repo = repo.scm_instance_no_cache() - for r in kwargs['pushed_revs']: - cs = vcs_repo.get_changeset(r) - changesets.append(json.dumps(cs)) - - kwargs['pushed_revs'] = changesets - headers = { - 'User-Agent': 'RhodeCode-SCM web hook', - 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8', - 'Accept': 'text/javascript, text/html, application/xml, ' - 'text/xml, */*', - 'Accept-Encoding': 'gzip,deflate,sdch', - } - - data = kwargs - data = urllib.urlencode(data) - req = urllib2.Request(url, data, headers) - response = urllib2.urlopen(req) - response.read() - return 0 +The `rcextensions` since version 4.14 are now shipped together with |RCE| please check +the using :ref:`integrations-rcextensions` section. rhodecode-gist diff --git a/docs/tools/tools-overview.rst b/docs/tools/tools-overview.rst --- a/docs/tools/tools-overview.rst +++ b/docs/tools/tools-overview.rst @@ -54,23 +54,13 @@ packaged with |RCE| by default. .. code-block:: bash - $ .rccontrol/enterprise-4/profile/bin/rhodecode-extensions --plugins \ - --instance-name=enterprise-4 --ini-file=rhodecode.ini + $ .rccontrol/enterprise-4/profile/bin/rhodecode-api --instance-name=enterprise-4 get_ip [11:56:57 on 05/10/2018] - Writen new extensions file to rcextensions - Copied hipchat_push_notify.py plugin to rcextensions - Copied jira_pr_flow.py plugin to rcextensions - Copied default_reviewers.py plugin to rcextensions - Copied extract_commits.py plugin to rcextensions - Copied extract_issues.py plugin to rcextensions - Copied redmine_pr_flow.py plugin to rcextensions - Copied extra_fields.py plugin to rcextensions - Copied jira_smart_commits.py plugin to rcextensions - Copied http_notify.py plugin to rcextensions - Copied slack_push_notify.py plugin to rcextensions - Copied slack_message.py plugin to rcextensions - Copied extract_jira_issues.py plugin to rcextensions - Copied extract_redmine_issues.py plugin to rcextensions - Copied redmine_smart_commits.py plugin to rcextensions - Copied send_mail.py plugin to rcextensions - + { + "error": null, + "id": 1000, + "result": { + "server_ip_addr": "1.2.3.4", + "user_ips": [] + } + } diff --git a/grunt_config.json b/grunt_config.json --- a/grunt_config.json +++ b/grunt_config.json @@ -1,35 +1,33 @@ { "dirs": { "css": { - "src":"rhodecode/public/css", - "dest":"rhodecode/public/css" + "src": "rhodecode/public/css", + "dest": "rhodecode/public/css" }, "js": { "src": "rhodecode/public/js/src", "src_rc": "rhodecode/public/js/rhodecode", "dest": "rhodecode/public/js", - "bower": "bower_components", "node_modules": "node_modules" } }, "copy": { "main": { - "expand": true, - "cwd": "bower_components", - "src": "webcomponentsjs/webcomponents-lite.js", - "dest": "<%= dirs.js.dest %>/vendors" + "files": [ + { + "expand": true, + "cwd": "node_modules/@webcomponents", + "src": "webcomponentsjs/*.*", + "dest": "<%= dirs.js.dest %>/vendors" + }, + { + "src": "<%= dirs.css.src %>/style-polymer.css", + "dest": "<%= dirs.js.dest %>/src/components/style-polymer.css" + } + ] } }, "concat": { - "polymercss": { - "src": [ - "<%= dirs.js.src %>/components/root-styles-prefix.html", - "<%= dirs.css.src %>/style-polymer.css", - "<%= dirs.js.src %>/components/root-styles-suffix.html" - ], - "dest": "<%= dirs.js.dest %>/src/components/root-styles.gen.html", - "nonull": true - }, "dist": { "src": [ "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js", @@ -37,6 +35,10 @@ "<%= dirs.js.node_modules %>/moment/min/moment.min.js", "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js", "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js", + "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js", + "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js", + "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js", + "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js", "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js", "<%= dirs.js.src %>/logging.js", "<%= dirs.js.src %>/bootstrap.js", @@ -89,22 +91,13 @@ "<%= dirs.js.src %>/rhodecode/tooltips.js", "<%= dirs.js.src %>/rhodecode/users.js", "<%= dirs.js.src %>/rhodecode/appenlight.js", - "<%= dirs.js.src %>/rhodecode.js" + "<%= dirs.js.src %>/rhodecode.js", + "<%= dirs.js.dest %>/rhodecode-components.js" ], "dest": "<%= dirs.js.dest %>/scripts.js", "nonull": true } }, - "crisper": { - "dist": { - "options": { - "cleanup": false, - "onlySplit": true - }, - "src": "<%= dirs.js.dest %>/rhodecode-components.html", - "dest": "<%= dirs.js.dest %>/rhodecode-components.js" - } - }, "less": { "development": { "options": { @@ -152,8 +145,7 @@ "less:development", "less:components", "concat:polymercss", - "vulcanize", - "crisper", + "webpack", "concat:dist" ] }, @@ -166,8 +158,7 @@ "tasks": [ "less:components", "concat:polymercss", - "vulcanize", - "crisper", + "webpack", "concat:dist" ] } @@ -179,18 +170,5 @@ "jshintrc": ".jshintrc" } } - }, - "vulcanize": { - "default": { - "options": { - "abspath": "", - "inlineScripts": true, - "inlineCss": true, - "stripComments": true - }, - "files": { - "<%= dirs.js.dest %>/rhodecode-components.html": "<%= dirs.js.src %>/components/shared-components.html" - } - } } } diff --git a/package.json b/package.json --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rhodecode-enterprise", - "version": "1.0.0", + "version": "2.0.0", "private": true, "description" : "RhodeCode JS packaged", "license": "SEE LICENSE IN LICENSE.txt", @@ -9,25 +9,50 @@ "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce" }, "devDependencies": { + "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1", + "clipboard": "^2.0.1", + "exports-loader": "^0.6.4", + "favico.js": "^0.3.10", "grunt": "^0.4.5", + "grunt-cli": "^1.3.1", + "grunt-contrib-concat": "^0.5.1", "grunt-contrib-copy": "^1.0.0", - "grunt-contrib-concat": "^0.5.1", "grunt-contrib-jshint": "^0.12.0", "grunt-contrib-less": "^1.1.0", "grunt-contrib-watch": "^0.6.1", - "crisper": "^2.1.1", - "vulcanize": "^1.16.0", - "grunt-crisper": "^1.0.1", - "grunt-vulcanize": "^1.0.0", - "node2nix": "^1.0.0", + "grunt-webpack": "^3.1.3", + "jquery": "1.11.3", "jshint": "^2.9.1-rc3", - "bower": "^1.8.4", - "jquery": "1.11.3", - "favico.js": "^0.3.10", - "clipboard": "^2.0.1", - "qrious": "^4.0.2", "moment": "^2.18.1", "mousetrap": "^1.6.1", - "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1" + "qrious": "^4.0.2", + "sticky-sidebar": "3.3.1", + "waypoints": "4.0.1", + "webpack": "4.23.1", + "webpack-cli": "3.1.2", + "babel-core": "^6.26.3", + "babel-loader": "^7.1.2", + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "babel-preset-env": "^1.6.0", + "copy-webpack-plugin": "^4.4.2", + "css-loader": "^0.28.11", + "html-loader": "^0.4.4", + "html-webpack-plugin": "^3.2.0", + "imports-loader": "^0.7.1", + "polymer-webpack-loader": "^2.0.1", + "style-loader": "^0.21.0", + "webpack-uglify-js-plugin": "^1.1.9", + "raw-loader": "1.0.0-beta.0", + "ts-loader": "^1.3.3", + "@webcomponents/webcomponentsjs": "^2.0.0", + "@polymer/polymer": "^3.0.0", + "@polymer/paper-button": "^3.0.0", + "@polymer/paper-spinner": "^3.0.0", + "@polymer/paper-tooltip": "^3.0.0", + "@polymer/paper-toast": "^3.0.0", + "@polymer/paper-toggle-button": "^3.0.0", + "@polymer/iron-ajax": "^3.0.0", + "@polymer/iron-autogrow-textarea": "^3.0.0", + "@polymer/iron-a11y-keys": "^3.0.0" } } diff --git a/pkgs/README.rst b/pkgs/README.rst --- a/pkgs/README.rst +++ b/pkgs/README.rst @@ -27,24 +27,29 @@ Python dependencies NodeJS dependencies =================== +Generate node-packages.nix file with all dependencies from NPM and package.json file +This should be run before entering nix-shell. + +The sed at the end fixes a bug with http rewrite of re-generated packages + .. code:: shell - rm -rf node_modules + rm -rf node_modules && nix-shell pkgs/shell-generate.nix --command " node2nix --input package.json \ -o pkgs/node-packages.nix \ -e pkgs/node-env.nix \ -c pkgs/node-default.nix \ - -d --flatten --nodejs-6 " + -d --flatten --nodejs-8 " && + sed -i -e 's/http:\/\//https:\/\//g' pkgs/node-packages.nix - -Bower dependencies -================== +Generate license data +===================== .. code:: shell - nix-shell pkgs/shell-generate.nix --command "bower2nix bower.json pkgs/bower-packages.nix" + nix-build pkgs/license-generate.nix -o result-license && cat result-license/licenses.json | python -m json.tool > rhodecode/config/licenses.json .. Links diff --git a/pkgs/bower-packages.nix b/pkgs/bower-packages.nix deleted file mode 100644 --- a/pkgs/bower-packages.nix +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix) -{ fetchbower, buildEnv }: -buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [ - (fetchbower "webcomponentsjs" "1.2.3" "^1.2.3" "0db2fjk779rhl9d4ifpk1j9a83vngx6j3hk7si1752dqxj857267") - (fetchbower "polymer" "Polymer/polymer#2.6.0" "Polymer/polymer#^2.6.0" "1jw5syjn0naa7dlxzxvsgwb20zbkbpx0pcg0wzjq4wr49c20nw0k") - (fetchbower "paper-button" "PolymerElements/paper-button#2.1.2" "PolymerElements/paper-button#^2.1.2" "1lwmjwhvimh02gss39yjp5h7yg9mxl1ig59yrk085v86y5f5ilz1") - (fetchbower "paper-spinner" "PolymerElements/paper-spinner#2.1.0" "PolymerElements/paper-spinner#^2.1.0" "07jamgxzvy4r9pgf5ikj1fm8nkrw6sywgcxvmm7ax58hjvmd4i45") - (fetchbower "paper-tooltip" "PolymerElements/paper-tooltip#2.1.1" "PolymerElements/paper-tooltip#^2.1.1" "0ja9vz4xps7dxfx6kmrwq0gifbjsyc3pk9l3hd5233ss72ghlvgb") - (fetchbower "paper-toast" "PolymerElements/paper-toast#2.1.2" "PolymerElements/paper-toast#^2.1.2" "0mkj9ayjx2l9hvrz4kw3yjbgrs9w873k05ywv94nh92mzpjkxn04") - (fetchbower "paper-toggle-button" "PolymerElements/paper-toggle-button#2.1.1" "PolymerElements/paper-toggle-button#^2.1.1" "1rl5ar3ny6r3v9hr8s68v8b3zh5yl52pikhi4b9iv9grv29g5999") - (fetchbower "iron-ajax" "PolymerElements/iron-ajax#2.1.3" "PolymerElements/iron-ajax#^2.1.3" "187zb6lkv18yapl292qhn611mbl4i2bqs2dimlwmdjaln285nc1l") - (fetchbower "iron-autogrow-textarea" "PolymerElements/iron-autogrow-textarea#2.2.0" "PolymerElements/iron-autogrow-textarea#^2.2.0" "1cx7g49m20z08x25z24g2pvv6m6dwfbkga3nsw0rpi3jk7xhznqw") - (fetchbower "iron-a11y-keys" "PolymerElements/iron-a11y-keys#2.1.2" "PolymerElements/iron-a11y-keys#^2.1.2" "0zdn3bzfrk88iwahmmzvcjn3m90zga1l8dx42b365n8if0n0zapj") - (fetchbower "shadycss" "webcomponents/shadycss#1.3.5" "webcomponents/shadycss#^v1.1.0" "1xp07d6jlmc3ywg4cdp2nijwi0vrbzw468242xz0s6zx5z2n2wzf") - (fetchbower "iron-flex-layout" "PolymerElements/iron-flex-layout#2.0.3" "PolymerElements/iron-flex-layout#1 - 2" "1ir9ili3rkcgbfj6is5s70vyb7m6avz0av0lpjjlhhsplrrl90bk") - (fetchbower "paper-behaviors" "PolymerElements/paper-behaviors#2.1.1" "PolymerElements/paper-behaviors#1 - 2" "0wzyznmy1q64jsm6lck0xma92lg2hz9h9m05r68iy20iyrvbjld7") - (fetchbower "paper-styles" "PolymerElements/paper-styles#2.1.0" "PolymerElements/paper-styles#1 - 2" "0xzsd7pvjsk7lgcmvx4q0dvps40q3mymkx26zgs8ns91s1ssfqbx") - (fetchbower "iron-a11y-announcer" "PolymerElements/iron-a11y-announcer#2.1.0" "PolymerElements/iron-a11y-announcer#1 - 2" "1hvmw76im8y3pxmg1yfnlkzap429q9i4v1z42y7m8lz0996jmxrz") - (fetchbower "iron-overlay-behavior" "PolymerElements/iron-overlay-behavior#2.3.4" "PolymerElements/iron-overlay-behavior#1 - 2" "0hk2fxhfz7kg27349qz1c87vq6nfdcnjr9az3q95ak3rigsb71wg") - (fetchbower "iron-fit-behavior" "PolymerElements/iron-fit-behavior#2.2.1" "PolymerElements/iron-fit-behavior#1 - 2" "0v89am4r2fncr7m9k0f2xqh5bvgn2dqjjc7p515ix4grk89whbs3") - (fetchbower "iron-checked-element-behavior" "PolymerElements/iron-checked-element-behavior#2.1.1" "PolymerElements/iron-checked-element-behavior#1 - 2" "00gpvnb7anspadw59av7lca6p03qlx59dgnhw3lqf5v223dsh0l3") - (fetchbower "iron-behaviors" "PolymerElements/iron-behaviors#2.1.1" "PolymerElements/iron-behaviors#1 - 2" "0c71l1il76jg8gvyh8bwlqraif53gfnz5700vpg35qyr1biwbr1w") - (fetchbower "iron-validatable-behavior" "PolymerElements/iron-validatable-behavior#2.1.0" "PolymerElements/iron-validatable-behavior#1 - 2" "1j65zv7hcxdcyyanzhp2wap3bnx7cz8ghd44m12fad2206jj6ysi") - (fetchbower "iron-a11y-keys-behavior" "PolymerElements/iron-a11y-keys-behavior#2.1.1" "PolymerElements/iron-a11y-keys-behavior#1 - 2" "0jsw7wvh4wzcjqdbvxyha99h1ph61lykyyyvdb6hm8m8w40bhs9b") - (fetchbower "paper-ripple" "PolymerElements/paper-ripple#2.1.1" "PolymerElements/paper-ripple#1 - 2" "0sam6w83nxf9mss79j6hjfsx0288pf4hwr1bw5xclzgpddcjmrm5") - (fetchbower "font-roboto" "PolymerElements/font-roboto#1.1.0" "PolymerElements/font-roboto#^1.0.1" "0z4msvaa5pnr84j2r957g313fmdbdbrknhdw1axy5g48845yv04s") - (fetchbower "iron-resizable-behavior" "PolymerElements/iron-resizable-behavior#2.1.1" "PolymerElements/iron-resizable-behavior#1 - 2" "0169rg6kby0ypfiwbkin46ywaszwj7r91yn081yqd96l1115aqnk") - (fetchbower "iron-form-element-behavior" "PolymerElements/iron-form-element-behavior#2.1.3" "PolymerElements/iron-form-element-behavior#1 - 2" "1c83kkfqvb5pdlvrhad3l7b11i244a8lykc8kzfnb9ya0xrln0cn") - (fetchbower "iron-meta" "PolymerElements/iron-meta#2.1.1" "PolymerElements/iron-meta#1 - 2" "12w1pcl3w97xpxihqddbf2d9dx8xz5i1jd9bz1xrmfsh25isni40") -]; } diff --git a/license.nix b/pkgs/license-generate.nix rename from license.nix rename to pkgs/license-generate.nix --- a/license.nix +++ b/pkgs/license-generate.nix @@ -2,9 +2,9 @@ # # Usage: # -# nix-build -I ~/dev license.nix -A result +# nix-build license.nix -o result-license # -# Afterwards ./result will contain the license information as JSON files. +# Afterwards ./result-license will contain the license information as JSON files. # # # Overview @@ -19,7 +19,7 @@ # dependencies. The results from step 1 are then limited to the ones which # are in this list. # -# The result is then available in ./result/license.json. +# The result is then available in ./result-license/license.json. # @@ -32,20 +32,20 @@ let # Enterprise as simple as possible, goal here is just to identify the runtime # dependencies. Ideally we could avoid building Enterprise at all and somehow # figure it out without calling into nix-store. - enterprise = import ./default.nix { + enterprise = import ../default.nix { doCheck = false; }; # For a given derivation, return the list of all dependencies drvToDependencies = drv: nixpkgs.lib.flatten [ - drv.nativeBuildInputs or [] - drv.propagatedNativeBuildInputs or [] + drv.buildInputs or [] + drv.propagatedBuildInputs or [] ]; # Transform the given derivation into the meta information which we need in # the resulting JSON files. drvToMeta = drv: { - name = drv.name or "UNNAMED"; + name = drv.name or drv; license = if drv ? meta.license then drv.meta.license else "UNKNOWN"; }; @@ -70,10 +70,8 @@ let rawStorePaths = nixpkgs.lib.removeSuffix "\n" ( builtins.readFile srcPath); storePaths = nixpkgs.lib.splitString "\n" rawStorePaths; - # TODO: johbo: Would be nice to use some sort of utility here to convert - # the path to a derivation name. storePathPrefix = ( - builtins.stringLength "/nix/store/zwy7aavnif9ayw30rya1k6xiacafzzl6-"); + builtins.stringLength "/nix/store/afafafafafafafafafafafafafafafaf-"); storePathToName = path: builtins.substring storePathPrefix (builtins.stringLength path) path; in (map storePathToName storePaths); @@ -147,6 +145,7 @@ in rec { cat > build/licenses.json < { inherit system; - }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-6_x"}: + }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-8_x"}: let nodeEnv = import ./node-env.nix { diff --git a/pkgs/node-packages.nix b/pkgs/node-packages.nix --- a/pkgs/node-packages.nix +++ b/pkgs/node-packages.nix @@ -4,6 +4,222 @@ let sources = { + "@polymer/font-roboto-3.0.2" = { + name = "_at_polymer_slash_font-roboto"; + packageName = "@polymer/font-roboto"; + version = "3.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/font-roboto/-/font-roboto-3.0.2.tgz"; + sha512 = "tx5TauYSmzsIvmSqepUPDYbs4/Ejz2XbZ1IkD7JEGqkdNUJlh+9KU85G56Tfdk/xjEZ8zorFfN09OSwiMrIQWA=="; + }; + }; + "@polymer/iron-a11y-announcer-3.0.1" = { + name = "_at_polymer_slash_iron-a11y-announcer"; + packageName = "@polymer/iron-a11y-announcer"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-a11y-announcer/-/iron-a11y-announcer-3.0.1.tgz"; + sha512 = "Xiqmpz0AEEbMNGYPpbrXBIrcI/xaR4tn77pmSLfxVKGGwjEUR/YrRgyIwXp4EN7lvst1dFC8kyl2hLga0uDIVQ=="; + }; + }; + "@polymer/iron-a11y-keys-3.0.1" = { + name = "_at_polymer_slash_iron-a11y-keys"; + packageName = "@polymer/iron-a11y-keys"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-a11y-keys/-/iron-a11y-keys-3.0.1.tgz"; + sha512 = "zmTi8xHeY4ZMJLAitW2hAmW5zXZ35hVy/eHQUFadAlOccuBK3oRRmoPRQRaZgpyJrCVFDAQRXXzzJtUDil/0CA=="; + }; + }; + "@polymer/iron-a11y-keys-behavior-3.0.1" = { + name = "_at_polymer_slash_iron-a11y-keys-behavior"; + packageName = "@polymer/iron-a11y-keys-behavior"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-a11y-keys-behavior/-/iron-a11y-keys-behavior-3.0.1.tgz"; + sha512 = "lnrjKq3ysbBPT/74l0Fj0U9H9C35Tpw2C/tpJ8a+5g8Y3YJs1WSZYnEl1yOkw6sEyaxOq/1DkzH0+60gGu5/PQ=="; + }; + }; + "@polymer/iron-ajax-3.0.1" = { + name = "_at_polymer_slash_iron-ajax"; + packageName = "@polymer/iron-ajax"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-ajax/-/iron-ajax-3.0.1.tgz"; + sha512 = "7+TPEAfWsRdhj1Y8UeF1759ktpVu+c3sG16rJiUC3wF9+woQ9xI1zUm2d59i7Yc3aDEJrR/Q8Y262KlOvyGVNg=="; + }; + }; + "@polymer/iron-autogrow-textarea-3.0.1" = { + name = "_at_polymer_slash_iron-autogrow-textarea"; + packageName = "@polymer/iron-autogrow-textarea"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-autogrow-textarea/-/iron-autogrow-textarea-3.0.1.tgz"; + sha512 = "FgSL7APrOSL9Vu812sBCFlQ17hvnJsBAV2C2e1UAiaHhB+dyfLq8gGdGUpqVWuGJ50q4Y/49QwCNnLf85AdVYA=="; + }; + }; + "@polymer/iron-behaviors-3.0.1" = { + name = "_at_polymer_slash_iron-behaviors"; + packageName = "@polymer/iron-behaviors"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-behaviors/-/iron-behaviors-3.0.1.tgz"; + sha512 = "IMEwcv1lhf1HSQxuyWOUIL0lOBwmeaoSTpgCJeP9IBYnuB1SPQngmfRuHKgK6/m9LQ9F9miC7p3HeQQUdKAE0w=="; + }; + }; + "@polymer/iron-checked-element-behavior-3.0.1" = { + name = "_at_polymer_slash_iron-checked-element-behavior"; + packageName = "@polymer/iron-checked-element-behavior"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-checked-element-behavior/-/iron-checked-element-behavior-3.0.1.tgz"; + sha512 = "aDr0cbCNVq49q+pOqa6CZutFh+wWpwPMLpEth9swx+GkAj+gCURhuQkaUYhIo5f2egDbEioR1aeHMnPlU9dQZA=="; + }; + }; + "@polymer/iron-fit-behavior-3.0.1" = { + name = "_at_polymer_slash_iron-fit-behavior"; + packageName = "@polymer/iron-fit-behavior"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.0.1.tgz"; + sha512 = "/M0B1L30k31vmwNBaGuZcxzUAhJSHoGccb/DF0CDKI/hT8UlkTvcyemaWdOpmHHLgY52ceKIkRwA3AeXrKyvaQ=="; + }; + }; + "@polymer/iron-flex-layout-3.0.1" = { + name = "_at_polymer_slash_iron-flex-layout"; + packageName = "@polymer/iron-flex-layout"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-flex-layout/-/iron-flex-layout-3.0.1.tgz"; + sha512 = "7gB869czArF+HZcPTVSgvA7tXYFze9EKckvM95NB7SqYF+NnsQyhoXgKnpFwGyo95lUjUW9TFDLUwDXnCYFtkw=="; + }; + }; + "@polymer/iron-form-element-behavior-3.0.1" = { + name = "_at_polymer_slash_iron-form-element-behavior"; + packageName = "@polymer/iron-form-element-behavior"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-form-element-behavior/-/iron-form-element-behavior-3.0.1.tgz"; + sha512 = "G/e2KXyL5AY7mMjmomHkGpgS0uAf4ovNpKhkuUTRnMuMJuf589bKqE85KN4ovE1Tzhv2hJoh/igyD6ekHiYU1A=="; + }; + }; + "@polymer/iron-meta-3.0.1" = { + name = "_at_polymer_slash_iron-meta"; + packageName = "@polymer/iron-meta"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-meta/-/iron-meta-3.0.1.tgz"; + sha512 = "pWguPugiLYmWFV9UWxLWzZ6gm4wBwQdDy4VULKwdHCqR7OP7u98h+XDdGZsSlDPv6qoryV/e3tGHlTIT0mbzJA=="; + }; + }; + "@polymer/iron-overlay-behavior-3.0.2" = { + name = "_at_polymer_slash_iron-overlay-behavior"; + packageName = "@polymer/iron-overlay-behavior"; + version = "3.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-overlay-behavior/-/iron-overlay-behavior-3.0.2.tgz"; + sha512 = "j1qmt6mJHCwpe1mKOvqK5kcCUPQr5LSrlqpgRDbUuLgUfNJ/vGTipjrkBlfbEUagm5FEQdc1VLPLSQP6WVuP9g=="; + }; + }; + "@polymer/iron-resizable-behavior-3.0.1" = { + name = "_at_polymer_slash_iron-resizable-behavior"; + packageName = "@polymer/iron-resizable-behavior"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-resizable-behavior/-/iron-resizable-behavior-3.0.1.tgz"; + sha512 = "FyHxRxFspVoRaeZSWpT3y0C9awomb4tXXolIJcZ7RvXhMP632V5lez+ch5G5SwK0LpnAPkg35eB0LPMFv+YMMQ=="; + }; + }; + "@polymer/iron-validatable-behavior-3.0.1" = { + name = "_at_polymer_slash_iron-validatable-behavior"; + packageName = "@polymer/iron-validatable-behavior"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/iron-validatable-behavior/-/iron-validatable-behavior-3.0.1.tgz"; + sha512 = "wwpYh6wOa4fNI+jH5EYKC7TVPYQ2OfgQqocWat7GsNWcsblKYhLYbwsvEY5nO0n2xKqNfZzDLrUom5INJN7msQ=="; + }; + }; + "@polymer/paper-behaviors-3.0.1" = { + name = "_at_polymer_slash_paper-behaviors"; + packageName = "@polymer/paper-behaviors"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/paper-behaviors/-/paper-behaviors-3.0.1.tgz"; + sha512 = "6knhj69fPJejv8qR0kCSUY+Q0XjaUf0OSnkjRjmTJPAwSrRYtgqE+l6P1FfA+py1X/cUjgne9EF5rMZAKJIg1g=="; + }; + }; + "@polymer/paper-button-3.0.1" = { + name = "_at_polymer_slash_paper-button"; + packageName = "@polymer/paper-button"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/paper-button/-/paper-button-3.0.1.tgz"; + sha512 = "JRNBc+Oj9EWnmyLr7FcCr8T1KAnEHPh6mosln9BUdkM+qYaYsudSICh3cjTIbnj6AuF5OJidoLkM1dlyj0j6Zg=="; + }; + }; + "@polymer/paper-ripple-3.0.1" = { + name = "_at_polymer_slash_paper-ripple"; + packageName = "@polymer/paper-ripple"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/paper-ripple/-/paper-ripple-3.0.1.tgz"; + sha512 = "dgOe12GyCF1VZBLUQqnzGWlf3xb255FajNCVB1VFj/AtskYtoamnafa7m3a+1vs+C8qbg4Benn5KwgxVDSW4cg=="; + }; + }; + "@polymer/paper-spinner-3.0.1" = { + name = "_at_polymer_slash_paper-spinner"; + packageName = "@polymer/paper-spinner"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/paper-spinner/-/paper-spinner-3.0.1.tgz"; + sha512 = "MYIU6qWZnhZ5yNFOBzROPgBteGfxKEnDZ6bCgjrvUtJkBuQEz0MQZzSE/zmZc0oaJ9u5QK5xAFuYdudsGv7+sQ=="; + }; + }; + "@polymer/paper-styles-3.0.1" = { + name = "_at_polymer_slash_paper-styles"; + packageName = "@polymer/paper-styles"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/paper-styles/-/paper-styles-3.0.1.tgz"; + sha512 = "y6hmObLqlCx602TQiSBKHqjwkE7xmDiFkoxdYGaNjtv4xcysOTdVJsDR/R9UHwIaxJ7gHlthMSykir1nv78++g=="; + }; + }; + "@polymer/paper-toast-3.0.1" = { + name = "_at_polymer_slash_paper-toast"; + packageName = "@polymer/paper-toast"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/paper-toast/-/paper-toast-3.0.1.tgz"; + sha512 = "pizuogzObniDdICUc6dSLrnDt2VzzoRne1gCmbD6sfOATVv5tc8UfrqhA2iHngbNBEbniBiciS3iogdp5KTVUQ=="; + }; + }; + "@polymer/paper-toggle-button-3.0.1" = { + name = "_at_polymer_slash_paper-toggle-button"; + packageName = "@polymer/paper-toggle-button"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/paper-toggle-button/-/paper-toggle-button-3.0.1.tgz"; + sha512 = "jadZB60fycT7YnSAH0H23LYo6/2HYmMZTtNr9LpdSIRFPLX6mqqxewex92cFz019bMKaRJgORn308hRlJo2u6A=="; + }; + }; + "@polymer/paper-tooltip-3.0.1" = { + name = "_at_polymer_slash_paper-tooltip"; + packageName = "@polymer/paper-tooltip"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/paper-tooltip/-/paper-tooltip-3.0.1.tgz"; + sha512 = "yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg=="; + }; + }; + "@polymer/polymer-3.1.0" = { + name = "_at_polymer_slash_polymer"; + packageName = "@polymer/polymer"; + version = "3.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.1.0.tgz"; + sha512 = "hwN8IMERsFATz/9dSMxYHL+84J9uBkPuuarxJWlTsppZ4CAYTZKnepBfNrKoyNsafBmA3yXBiiKPPf+fJtza7A=="; + }; + }; "@types/clone-0.1.30" = { name = "_at_types_slash_clone"; packageName = "@types/clone"; @@ -13,31 +229,220 @@ let sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614"; }; }; - "@types/node-4.2.23" = { - name = "_at_types_slash_node"; - packageName = "@types/node"; - version = "4.2.23"; - src = fetchurl { - url = "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz"; - sha512 = "U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w=="; - }; - }; - "@types/node-6.0.114" = { + "@types/node-6.14.0" = { name = "_at_types_slash_node"; packageName = "@types/node"; - version = "6.0.114"; - src = fetchurl { - url = "https://registry.npmjs.org/@types/node/-/node-6.0.114.tgz"; - sha512 = "5ViC9dwf1VIAtrOFTvOuN04lJgw28eKjuy0Vg2Bd/fSlxKP2feCSkIw04ZgOENL2ywdWrtbkthp1XVLEjJmouw=="; - }; - }; - "@types/parse5-0.0.31" = { + version = "6.14.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-6.14.0.tgz"; + sha512 = "6tQyh4Q4B5pECcXBOQDZ5KjyBIxRZGzrweGPM47sAYTdVG4+7R+2EGMTmp0h6ZwgqHrFRCeg2gdhsG9xXEl2Sg=="; + }; + }; + "@types/parse5-2.2.34" = { name = "_at_types_slash_parse5"; packageName = "@types/parse5"; - version = "0.0.31"; - src = fetchurl { - url = "https://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz"; - sha1 = "e827a493a443b156e1b582a2e4c3bdc0040f2ee7"; + version = "2.2.34"; + src = fetchurl { + url = "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz"; + sha1 = "e3870a10e82735a720f62d71dcd183ba78ef3a9d"; + }; + }; + "@webassemblyjs/ast-1.7.10" = { + name = "_at_webassemblyjs_slash_ast"; + packageName = "@webassemblyjs/ast"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.10.tgz"; + sha512 = "wTUeaByYN2EA6qVqhbgavtGc7fLTOx0glG2IBsFlrFG51uXIGlYBTyIZMf4SPLo3v1bgV/7lBN3l7Z0R6Hswew=="; + }; + }; + "@webassemblyjs/floating-point-hex-parser-1.7.10" = { + name = "_at_webassemblyjs_slash_floating-point-hex-parser"; + packageName = "@webassemblyjs/floating-point-hex-parser"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz"; + sha512 = "gMsGbI6I3p/P1xL2UxqhNh1ga2HCsx5VBB2i5VvJFAaqAjd2PBTRULc3BpTydabUQEGlaZCzEUQhLoLG7TvEYQ=="; + }; + }; + "@webassemblyjs/helper-api-error-1.7.10" = { + name = "_at_webassemblyjs_slash_helper-api-error"; + packageName = "@webassemblyjs/helper-api-error"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz"; + sha512 = "DoYRlPWtuw3yd5BOr9XhtrmB6X1enYF0/54yNvQWGXZEPDF5PJVNI7zQ7gkcKfTESzp8bIBWailaFXEK/jjCsw=="; + }; + }; + "@webassemblyjs/helper-buffer-1.7.10" = { + name = "_at_webassemblyjs_slash_helper-buffer"; + packageName = "@webassemblyjs/helper-buffer"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz"; + sha512 = "+RMU3dt/dPh4EpVX4u5jxsOlw22tp3zjqE0m3ftU2tsYxnPULb4cyHlgaNd2KoWuwasCQqn8Mhr+TTdbtj3LlA=="; + }; + }; + "@webassemblyjs/helper-code-frame-1.7.10" = { + name = "_at_webassemblyjs_slash_helper-code-frame"; + packageName = "@webassemblyjs/helper-code-frame"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz"; + sha512 = "UiytbpKAULOEab2hUZK2ywXen4gWJVrgxtwY3Kn+eZaaSWaRM8z/7dAXRSoamhKFiBh1uaqxzE/XD9BLlug3gw=="; + }; + }; + "@webassemblyjs/helper-fsm-1.7.10" = { + name = "_at_webassemblyjs_slash_helper-fsm"; + packageName = "@webassemblyjs/helper-fsm"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz"; + sha512 = "w2vDtUK9xeSRtt5+RnnlRCI7wHEvLjF0XdnxJpgx+LJOvklTZPqWkuy/NhwHSLP19sm9H8dWxKeReMR7sCkGZA=="; + }; + }; + "@webassemblyjs/helper-module-context-1.7.10" = { + name = "_at_webassemblyjs_slash_helper-module-context"; + packageName = "@webassemblyjs/helper-module-context"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz"; + sha512 = "yE5x/LzZ3XdPdREmJijxzfrf+BDRewvO0zl8kvORgSWmxpRrkqY39KZSq6TSgIWBxkK4SrzlS3BsMCv2s1FpsQ=="; + }; + }; + "@webassemblyjs/helper-wasm-bytecode-1.7.10" = { + name = "_at_webassemblyjs_slash_helper-wasm-bytecode"; + packageName = "@webassemblyjs/helper-wasm-bytecode"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz"; + sha512 = "u5qy4SJ/OrxKxZqJ9N3qH4ZQgHaAzsopsYwLvoWJY6Q33r8PhT3VPyNMaJ7ZFoqzBnZlCcS/0f4Sp8WBxylXfg=="; + }; + }; + "@webassemblyjs/helper-wasm-section-1.7.10" = { + name = "_at_webassemblyjs_slash_helper-wasm-section"; + packageName = "@webassemblyjs/helper-wasm-section"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz"; + sha512 = "Ecvww6sCkcjatcyctUrn22neSJHLN/TTzolMGG/N7S9rpbsTZ8c6Bl98GpSpV77EvzNijiNRHBG0+JO99qKz6g=="; + }; + }; + "@webassemblyjs/ieee754-1.7.10" = { + name = "_at_webassemblyjs_slash_ieee754"; + packageName = "@webassemblyjs/ieee754"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz"; + sha512 = "HRcWcY+YWt4+s/CvQn+vnSPfRaD4KkuzQFt5MNaELXXHSjelHlSEA8ZcqT69q0GTIuLWZ6JaoKar4yWHVpZHsQ=="; + }; + }; + "@webassemblyjs/leb128-1.7.10" = { + name = "_at_webassemblyjs_slash_leb128"; + packageName = "@webassemblyjs/leb128"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.10.tgz"; + sha512 = "og8MciYlA8hvzCLR71hCuZKPbVBfLQeHv7ImKZ4nlyxrYbG7uJHYtHiHu6OV9SqrGuD03H/HtXC4Bgdjfm9FHw=="; + }; + }; + "@webassemblyjs/utf8-1.7.10" = { + name = "_at_webassemblyjs_slash_utf8"; + packageName = "@webassemblyjs/utf8"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.10.tgz"; + sha512 = "Ng6Pxv6siyZp635xCSnH3mKmIFgqWPCcGdoo0GBYgyGdxu7cUj4agV7Uu1a8REP66UYUFXJLudeGgd4RvuJAnQ=="; + }; + }; + "@webassemblyjs/wasm-edit-1.7.10" = { + name = "_at_webassemblyjs_slash_wasm-edit"; + packageName = "@webassemblyjs/wasm-edit"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz"; + sha512 = "e9RZFQlb+ZuYcKRcW9yl+mqX/Ycj9+3/+ppDI8nEE/NCY6FoK8f3dKBcfubYV/HZn44b+ND4hjh+4BYBt+sDnA=="; + }; + }; + "@webassemblyjs/wasm-gen-1.7.10" = { + name = "_at_webassemblyjs_slash_wasm-gen"; + packageName = "@webassemblyjs/wasm-gen"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz"; + sha512 = "M0lb6cO2Y0PzDye/L39PqwV+jvO+2YxEG5ax+7dgq7EwXdAlpOMx1jxyXJTScQoeTpzOPIb+fLgX/IkLF8h2yw=="; + }; + }; + "@webassemblyjs/wasm-opt-1.7.10" = { + name = "_at_webassemblyjs_slash_wasm-opt"; + packageName = "@webassemblyjs/wasm-opt"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz"; + sha512 = "R66IHGCdicgF5ZliN10yn5HaC7vwYAqrSVJGjtJJQp5+QNPBye6heWdVH/at40uh0uoaDN/UVUfXK0gvuUqtVg=="; + }; + }; + "@webassemblyjs/wasm-parser-1.7.10" = { + name = "_at_webassemblyjs_slash_wasm-parser"; + packageName = "@webassemblyjs/wasm-parser"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz"; + sha512 = "AEv8mkXVK63n/iDR3T693EzoGPnNAwKwT3iHmKJNBrrALAhhEjuPzo/lTE4U7LquEwyvg5nneSNdTdgrBaGJcA=="; + }; + }; + "@webassemblyjs/wast-parser-1.7.10" = { + name = "_at_webassemblyjs_slash_wast-parser"; + packageName = "@webassemblyjs/wast-parser"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz"; + sha512 = "YTPEtOBljkCL0VjDp4sHe22dAYSm3ZwdJ9+2NTGdtC7ayNvuip1wAhaAS8Zt9Q6SW9E5Jf5PX7YE3XWlrzR9cw=="; + }; + }; + "@webassemblyjs/wast-printer-1.7.10" = { + name = "_at_webassemblyjs_slash_wast-printer"; + packageName = "@webassemblyjs/wast-printer"; + version = "1.7.10"; + src = fetchurl { + url = "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz"; + sha512 = "mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA=="; + }; + }; + "@webcomponents/shadycss-1.5.2" = { + name = "_at_webcomponents_slash_shadycss"; + packageName = "@webcomponents/shadycss"; + version = "1.5.2"; + src = fetchurl { + url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.5.2.tgz"; + sha512 = "0OyrmVc7S+INtzoqP2ofAo+OdVn2Nj0Qvq4wD9FEGN7nMmLRxaD2mzy6hD6EslzxUSuGH302CDU4KXiY66SEqg=="; + }; + }; + "@webcomponents/webcomponentsjs-2.1.3" = { + name = "_at_webcomponents_slash_webcomponentsjs"; + packageName = "@webcomponents/webcomponentsjs"; + version = "2.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.1.3.tgz"; + sha512 = "0UHJNY88lR3pnEYtBVT7F8cuuxOiITQGWJa0LxoELqkBSB7IabzJFOj5K99PajD3CGAsWpjB0CAeijfe376Y1w=="; + }; + }; + "@xtuc/ieee754-1.2.0" = { + name = "_at_xtuc_slash_ieee754"; + packageName = "@xtuc/ieee754"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz"; + sha512 = "DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="; + }; + }; + "@xtuc/long-4.2.1" = { + name = "_at_xtuc_slash_long"; + packageName = "@xtuc/long"; + version = "4.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz"; + sha512 = "FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g=="; }; }; "abbrev-1.1.1" = { @@ -58,13 +463,22 @@ let sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a"; }; }; - "acorn-5.7.1" = { + "acorn-5.7.3" = { name = "acorn"; packageName = "acorn"; - version = "5.7.1"; - src = fetchurl { - url = "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz"; - sha512 = "d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ=="; + version = "5.7.3"; + src = fetchurl { + url = "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz"; + sha512 = "T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw=="; + }; + }; + "acorn-dynamic-import-3.0.0" = { + name = "acorn-dynamic-import"; + packageName = "acorn-dynamic-import"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz"; + sha512 = "zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg=="; }; }; "acorn-jsx-3.0.1" = { @@ -85,6 +499,42 @@ let sha1 = "82ffb02b29e662ae53bdc20af15947706739c536"; }; }; + "ajv-6.5.4" = { + name = "ajv"; + packageName = "ajv"; + version = "6.5.4"; + src = fetchurl { + url = "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz"; + sha512 = "4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg=="; + }; + }; + "ajv-keywords-3.2.0" = { + name = "ajv-keywords"; + packageName = "ajv-keywords"; + version = "3.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz"; + sha1 = "e86b819c602cf8821ad637413698f1dec021847a"; + }; + }; + "align-text-0.1.4" = { + name = "align-text"; + packageName = "align-text"; + version = "0.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz"; + sha1 = "0cd90a561093f35d0a99256c22b7069433fad117"; + }; + }; + "alphanum-sort-1.0.2" = { + name = "alphanum-sort"; + packageName = "alphanum-sort"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz"; + sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3"; + }; + }; "amdefine-1.0.1" = { name = "amdefine"; packageName = "amdefine"; @@ -94,15 +544,6 @@ let sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5"; }; }; - "ansi-escape-sequences-3.0.0" = { - name = "ansi-escape-sequences"; - packageName = "ansi-escape-sequences"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz"; - sha1 = "1c18394b6af9b76ff9a63509fa497669fd2ce53e"; - }; - }; "ansi-regex-0.2.1" = { name = "ansi-regex"; packageName = "ansi-regex"; @@ -121,6 +562,15 @@ let sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df"; }; }; + "ansi-regex-3.0.0" = { + name = "ansi-regex"; + packageName = "ansi-regex"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz"; + sha1 = "ed0317c322064f79466c02966bddb605ab37d998"; + }; + }; "ansi-styles-1.1.0" = { name = "ansi-styles"; packageName = "ansi-styles"; @@ -139,6 +589,24 @@ let sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe"; }; }; + "ansi-styles-3.2.1" = { + name = "ansi-styles"; + packageName = "ansi-styles"; + version = "3.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"; + sha512 = "VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="; + }; + }; + "anymatch-2.0.0" = { + name = "anymatch"; + packageName = "anymatch"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz"; + sha512 = "5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw=="; + }; + }; "appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1" = { name = "appenlight-client"; packageName = "appenlight-client"; @@ -158,15 +626,6 @@ let sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="; }; }; - "are-we-there-yet-1.1.5" = { - name = "are-we-there-yet"; - packageName = "are-we-there-yet"; - version = "1.1.5"; - src = fetchurl { - url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz"; - sha512 = "5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w=="; - }; - }; "argparse-0.1.16" = { name = "argparse"; packageName = "argparse"; @@ -176,13 +635,94 @@ let sha1 = "cfd01e0fbba3d6caed049fbd758d40f65196f57c"; }; }; - "array-back-1.0.4" = { - name = "array-back"; - packageName = "array-back"; - version = "1.0.4"; - src = fetchurl { - url = "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz"; - sha1 = "644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b"; + "argparse-1.0.10" = { + name = "argparse"; + packageName = "argparse"; + version = "1.0.10"; + src = fetchurl { + url = "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz"; + sha512 = "o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="; + }; + }; + "arr-diff-4.0.0" = { + name = "arr-diff"; + packageName = "arr-diff"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz"; + sha1 = "d6461074febfec71e7e15235761a329a5dc7c520"; + }; + }; + "arr-flatten-1.1.0" = { + name = "arr-flatten"; + packageName = "arr-flatten"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz"; + sha512 = "L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="; + }; + }; + "arr-union-3.1.0" = { + name = "arr-union"; + packageName = "arr-union"; + version = "3.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz"; + sha1 = "e39b09aea9def866a8f206e288af63919bae39c4"; + }; + }; + "array-each-1.0.1" = { + name = "array-each"; + packageName = "array-each"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz"; + sha1 = "a794af0c05ab1752846ee753a1f211a05ba0c44f"; + }; + }; + "array-slice-1.1.0" = { + name = "array-slice"; + packageName = "array-slice"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz"; + sha512 = "B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w=="; + }; + }; + "array-union-1.0.2" = { + name = "array-union"; + packageName = "array-union"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz"; + sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39"; + }; + }; + "array-uniq-1.0.3" = { + name = "array-uniq"; + packageName = "array-uniq"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz"; + sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6"; + }; + }; + "array-unique-0.3.2" = { + name = "array-unique"; + packageName = "array-unique"; + version = "0.3.2"; + src = fetchurl { + url = "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz"; + sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"; + }; + }; + "arrify-1.0.1" = { + name = "arrify"; + packageName = "arrify"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz"; + sha1 = "898508da2226f380df904728456849c1501a4b0d"; }; }; "asap-2.0.6" = { @@ -194,13 +734,31 @@ let sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46"; }; }; - "asn1-0.2.3" = { + "asn1-0.2.4" = { name = "asn1"; packageName = "asn1"; - version = "0.2.3"; - src = fetchurl { - url = "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz"; - sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86"; + version = "0.2.4"; + src = fetchurl { + url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz"; + sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg=="; + }; + }; + "asn1.js-4.10.1" = { + name = "asn1.js"; + packageName = "asn1.js"; + version = "4.10.1"; + src = fetchurl { + url = "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz"; + sha512 = "p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw=="; + }; + }; + "assert-1.4.1" = { + name = "assert"; + packageName = "assert"; + version = "1.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz"; + sha1 = "99912d591836b5a6f5b345c0f07eefc08fc65d91"; }; }; "assert-plus-0.2.0" = { @@ -221,6 +779,24 @@ let sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"; }; }; + "assign-symbols-1.0.0" = { + name = "assign-symbols"; + packageName = "assign-symbols"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz"; + sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"; + }; + }; + "ast-types-0.9.6" = { + name = "ast-types"; + packageName = "ast-types"; + version = "0.9.6"; + src = fetchurl { + url = "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz"; + sha1 = "102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"; + }; + }; "async-0.1.22" = { name = "async"; packageName = "async"; @@ -257,6 +833,15 @@ let sha512 = "fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ=="; }; }; + "async-each-1.0.1" = { + name = "async-each"; + packageName = "async-each"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz"; + sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d"; + }; + }; "asynckit-0.4.0" = { name = "asynckit"; packageName = "asynckit"; @@ -266,6 +851,24 @@ let sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"; }; }; + "atob-2.1.2" = { + name = "atob"; + packageName = "atob"; + version = "2.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz"; + sha512 = "Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="; + }; + }; + "autoprefixer-6.7.7" = { + name = "autoprefixer"; + packageName = "autoprefixer"; + version = "6.7.7"; + src = fetchurl { + url = "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz"; + sha1 = "1dbd1c835658e35ce3f9984099db00585c782014"; + }; + }; "aws-sign2-0.6.0" = { name = "aws-sign2"; packageName = "aws-sign2"; @@ -275,22 +878,472 @@ let sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f"; }; }; - "aws4-1.7.0" = { + "aws4-1.8.0" = { name = "aws4"; packageName = "aws4"; + version = "1.8.0"; + src = fetchurl { + url = "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz"; + sha512 = "ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="; + }; + }; + "babel-code-frame-6.26.0" = { + name = "babel-code-frame"; + packageName = "babel-code-frame"; + version = "6.26.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz"; + sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"; + }; + }; + "babel-core-6.26.3" = { + name = "babel-core"; + packageName = "babel-core"; + version = "6.26.3"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz"; + sha512 = "6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA=="; + }; + }; + "babel-generator-6.26.1" = { + name = "babel-generator"; + packageName = "babel-generator"; + version = "6.26.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz"; + sha512 = "HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA=="; + }; + }; + "babel-helper-builder-binary-assignment-operator-visitor-6.24.1" = { + name = "babel-helper-builder-binary-assignment-operator-visitor"; + packageName = "babel-helper-builder-binary-assignment-operator-visitor"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz"; + sha1 = "cce4517ada356f4220bcae8a02c2b346f9a56664"; + }; + }; + "babel-helper-call-delegate-6.24.1" = { + name = "babel-helper-call-delegate"; + packageName = "babel-helper-call-delegate"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz"; + sha1 = "ece6aacddc76e41c3461f88bfc575bd0daa2df8d"; + }; + }; + "babel-helper-define-map-6.26.0" = { + name = "babel-helper-define-map"; + packageName = "babel-helper-define-map"; + version = "6.26.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz"; + sha1 = "a5f56dab41a25f97ecb498c7ebaca9819f95be5f"; + }; + }; + "babel-helper-explode-assignable-expression-6.24.1" = { + name = "babel-helper-explode-assignable-expression"; + packageName = "babel-helper-explode-assignable-expression"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz"; + sha1 = "f25b82cf7dc10433c55f70592d5746400ac22caa"; + }; + }; + "babel-helper-function-name-6.24.1" = { + name = "babel-helper-function-name"; + packageName = "babel-helper-function-name"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz"; + sha1 = "d3475b8c03ed98242a25b48351ab18399d3580a9"; + }; + }; + "babel-helper-get-function-arity-6.24.1" = { + name = "babel-helper-get-function-arity"; + packageName = "babel-helper-get-function-arity"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz"; + sha1 = "8f7782aa93407c41d3aa50908f89b031b1b6853d"; + }; + }; + "babel-helper-hoist-variables-6.24.1" = { + name = "babel-helper-hoist-variables"; + packageName = "babel-helper-hoist-variables"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz"; + sha1 = "1ecb27689c9d25513eadbc9914a73f5408be7a76"; + }; + }; + "babel-helper-optimise-call-expression-6.24.1" = { + name = "babel-helper-optimise-call-expression"; + packageName = "babel-helper-optimise-call-expression"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz"; + sha1 = "f7a13427ba9f73f8f4fa993c54a97882d1244257"; + }; + }; + "babel-helper-regex-6.26.0" = { + name = "babel-helper-regex"; + packageName = "babel-helper-regex"; + version = "6.26.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz"; + sha1 = "325c59f902f82f24b74faceed0363954f6495e72"; + }; + }; + "babel-helper-remap-async-to-generator-6.24.1" = { + name = "babel-helper-remap-async-to-generator"; + packageName = "babel-helper-remap-async-to-generator"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz"; + sha1 = "5ec581827ad723fecdd381f1c928390676e4551b"; + }; + }; + "babel-helper-replace-supers-6.24.1" = { + name = "babel-helper-replace-supers"; + packageName = "babel-helper-replace-supers"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz"; + sha1 = "bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"; + }; + }; + "babel-helpers-6.24.1" = { + name = "babel-helpers"; + packageName = "babel-helpers"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz"; + sha1 = "3471de9caec388e5c850e597e58a26ddf37602b2"; + }; + }; + "babel-loader-7.1.5" = { + name = "babel-loader"; + packageName = "babel-loader"; + version = "7.1.5"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz"; + sha512 = "iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw=="; + }; + }; + "babel-messages-6.23.0" = { + name = "babel-messages"; + packageName = "babel-messages"; + version = "6.23.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz"; + sha1 = "f3cdf4703858035b2a2951c6ec5edf6c62f2630e"; + }; + }; + "babel-plugin-check-es2015-constants-6.22.0" = { + name = "babel-plugin-check-es2015-constants"; + packageName = "babel-plugin-check-es2015-constants"; + version = "6.22.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz"; + sha1 = "35157b101426fd2ffd3da3f75c7d1e91835bbf8a"; + }; + }; + "babel-plugin-syntax-async-functions-6.13.0" = { + name = "babel-plugin-syntax-async-functions"; + packageName = "babel-plugin-syntax-async-functions"; + version = "6.13.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz"; + sha1 = "cad9cad1191b5ad634bf30ae0872391e0647be95"; + }; + }; + "babel-plugin-syntax-exponentiation-operator-6.13.0" = { + name = "babel-plugin-syntax-exponentiation-operator"; + packageName = "babel-plugin-syntax-exponentiation-operator"; + version = "6.13.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz"; + sha1 = "9ee7e8337290da95288201a6a57f4170317830de"; + }; + }; + "babel-plugin-syntax-object-rest-spread-6.13.0" = { + name = "babel-plugin-syntax-object-rest-spread"; + packageName = "babel-plugin-syntax-object-rest-spread"; + version = "6.13.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz"; + sha1 = "fd6536f2bce13836ffa3a5458c4903a597bb3bf5"; + }; + }; + "babel-plugin-syntax-trailing-function-commas-6.22.0" = { + name = "babel-plugin-syntax-trailing-function-commas"; + packageName = "babel-plugin-syntax-trailing-function-commas"; + version = "6.22.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz"; + sha1 = "ba0360937f8d06e40180a43fe0d5616fff532cf3"; + }; + }; + "babel-plugin-transform-async-to-generator-6.24.1" = { + name = "babel-plugin-transform-async-to-generator"; + packageName = "babel-plugin-transform-async-to-generator"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz"; + sha1 = "6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"; + }; + }; + "babel-plugin-transform-es2015-arrow-functions-6.22.0" = { + name = "babel-plugin-transform-es2015-arrow-functions"; + packageName = "babel-plugin-transform-es2015-arrow-functions"; + version = "6.22.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz"; + sha1 = "452692cb711d5f79dc7f85e440ce41b9f244d221"; + }; + }; + "babel-plugin-transform-es2015-block-scoped-functions-6.22.0" = { + name = "babel-plugin-transform-es2015-block-scoped-functions"; + packageName = "babel-plugin-transform-es2015-block-scoped-functions"; + version = "6.22.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz"; + sha1 = "bbc51b49f964d70cb8d8e0b94e820246ce3a6141"; + }; + }; + "babel-plugin-transform-es2015-block-scoping-6.26.0" = { + name = "babel-plugin-transform-es2015-block-scoping"; + packageName = "babel-plugin-transform-es2015-block-scoping"; + version = "6.26.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz"; + sha1 = "d70f5299c1308d05c12f463813b0a09e73b1895f"; + }; + }; + "babel-plugin-transform-es2015-classes-6.24.1" = { + name = "babel-plugin-transform-es2015-classes"; + packageName = "babel-plugin-transform-es2015-classes"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz"; + sha1 = "5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"; + }; + }; + "babel-plugin-transform-es2015-computed-properties-6.24.1" = { + name = "babel-plugin-transform-es2015-computed-properties"; + packageName = "babel-plugin-transform-es2015-computed-properties"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz"; + sha1 = "6fe2a8d16895d5634f4cd999b6d3480a308159b3"; + }; + }; + "babel-plugin-transform-es2015-destructuring-6.23.0" = { + name = "babel-plugin-transform-es2015-destructuring"; + packageName = "babel-plugin-transform-es2015-destructuring"; + version = "6.23.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz"; + sha1 = "997bb1f1ab967f682d2b0876fe358d60e765c56d"; + }; + }; + "babel-plugin-transform-es2015-duplicate-keys-6.24.1" = { + name = "babel-plugin-transform-es2015-duplicate-keys"; + packageName = "babel-plugin-transform-es2015-duplicate-keys"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz"; + sha1 = "73eb3d310ca969e3ef9ec91c53741a6f1576423e"; + }; + }; + "babel-plugin-transform-es2015-for-of-6.23.0" = { + name = "babel-plugin-transform-es2015-for-of"; + packageName = "babel-plugin-transform-es2015-for-of"; + version = "6.23.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz"; + sha1 = "f47c95b2b613df1d3ecc2fdb7573623c75248691"; + }; + }; + "babel-plugin-transform-es2015-function-name-6.24.1" = { + name = "babel-plugin-transform-es2015-function-name"; + packageName = "babel-plugin-transform-es2015-function-name"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz"; + sha1 = "834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"; + }; + }; + "babel-plugin-transform-es2015-literals-6.22.0" = { + name = "babel-plugin-transform-es2015-literals"; + packageName = "babel-plugin-transform-es2015-literals"; + version = "6.22.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz"; + sha1 = "4f54a02d6cd66cf915280019a31d31925377ca2e"; + }; + }; + "babel-plugin-transform-es2015-modules-amd-6.24.1" = { + name = "babel-plugin-transform-es2015-modules-amd"; + packageName = "babel-plugin-transform-es2015-modules-amd"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz"; + sha1 = "3b3e54017239842d6d19c3011c4bd2f00a00d154"; + }; + }; + "babel-plugin-transform-es2015-modules-commonjs-6.26.2" = { + name = "babel-plugin-transform-es2015-modules-commonjs"; + packageName = "babel-plugin-transform-es2015-modules-commonjs"; + version = "6.26.2"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz"; + sha512 = "CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q=="; + }; + }; + "babel-plugin-transform-es2015-modules-systemjs-6.24.1" = { + name = "babel-plugin-transform-es2015-modules-systemjs"; + packageName = "babel-plugin-transform-es2015-modules-systemjs"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz"; + sha1 = "ff89a142b9119a906195f5f106ecf305d9407d23"; + }; + }; + "babel-plugin-transform-es2015-modules-umd-6.24.1" = { + name = "babel-plugin-transform-es2015-modules-umd"; + packageName = "babel-plugin-transform-es2015-modules-umd"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz"; + sha1 = "ac997e6285cd18ed6176adb607d602344ad38468"; + }; + }; + "babel-plugin-transform-es2015-object-super-6.24.1" = { + name = "babel-plugin-transform-es2015-object-super"; + packageName = "babel-plugin-transform-es2015-object-super"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz"; + sha1 = "24cef69ae21cb83a7f8603dad021f572eb278f8d"; + }; + }; + "babel-plugin-transform-es2015-parameters-6.24.1" = { + name = "babel-plugin-transform-es2015-parameters"; + packageName = "babel-plugin-transform-es2015-parameters"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz"; + sha1 = "57ac351ab49caf14a97cd13b09f66fdf0a625f2b"; + }; + }; + "babel-plugin-transform-es2015-shorthand-properties-6.24.1" = { + name = "babel-plugin-transform-es2015-shorthand-properties"; + packageName = "babel-plugin-transform-es2015-shorthand-properties"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz"; + sha1 = "24f875d6721c87661bbd99a4622e51f14de38aa0"; + }; + }; + "babel-plugin-transform-es2015-spread-6.22.0" = { + name = "babel-plugin-transform-es2015-spread"; + packageName = "babel-plugin-transform-es2015-spread"; + version = "6.22.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz"; + sha1 = "d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"; + }; + }; + "babel-plugin-transform-es2015-sticky-regex-6.24.1" = { + name = "babel-plugin-transform-es2015-sticky-regex"; + packageName = "babel-plugin-transform-es2015-sticky-regex"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz"; + sha1 = "00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"; + }; + }; + "babel-plugin-transform-es2015-template-literals-6.22.0" = { + name = "babel-plugin-transform-es2015-template-literals"; + packageName = "babel-plugin-transform-es2015-template-literals"; + version = "6.22.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz"; + sha1 = "a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"; + }; + }; + "babel-plugin-transform-es2015-typeof-symbol-6.23.0" = { + name = "babel-plugin-transform-es2015-typeof-symbol"; + packageName = "babel-plugin-transform-es2015-typeof-symbol"; + version = "6.23.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz"; + sha1 = "dec09f1cddff94b52ac73d505c84df59dcceb372"; + }; + }; + "babel-plugin-transform-es2015-unicode-regex-6.24.1" = { + name = "babel-plugin-transform-es2015-unicode-regex"; + packageName = "babel-plugin-transform-es2015-unicode-regex"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz"; + sha1 = "d38b12f42ea7323f729387f18a7c5ae1faeb35e9"; + }; + }; + "babel-plugin-transform-exponentiation-operator-6.24.1" = { + name = "babel-plugin-transform-exponentiation-operator"; + packageName = "babel-plugin-transform-exponentiation-operator"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz"; + sha1 = "2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"; + }; + }; + "babel-plugin-transform-object-rest-spread-6.26.0" = { + name = "babel-plugin-transform-object-rest-spread"; + packageName = "babel-plugin-transform-object-rest-spread"; + version = "6.26.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz"; + sha1 = "0f36692d50fef6b7e2d4b3ac1478137a963b7b06"; + }; + }; + "babel-plugin-transform-regenerator-6.26.0" = { + name = "babel-plugin-transform-regenerator"; + packageName = "babel-plugin-transform-regenerator"; + version = "6.26.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz"; + sha1 = "e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"; + }; + }; + "babel-plugin-transform-strict-mode-6.24.1" = { + name = "babel-plugin-transform-strict-mode"; + packageName = "babel-plugin-transform-strict-mode"; + version = "6.24.1"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz"; + sha1 = "d5faf7aa578a65bbe591cf5edae04a0c67020758"; + }; + }; + "babel-preset-env-1.7.0" = { + name = "babel-preset-env"; + packageName = "babel-preset-env"; version = "1.7.0"; src = fetchurl { - url = "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz"; - sha512 = "32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w=="; - }; - }; - "babel-polyfill-6.26.0" = { - name = "babel-polyfill"; - packageName = "babel-polyfill"; + url = "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz"; + sha512 = "9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg=="; + }; + }; + "babel-register-6.26.0" = { + name = "babel-register"; + packageName = "babel-register"; version = "6.26.0"; src = fetchurl { - url = "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz"; - sha1 = "379937abc67d7895970adc621f284cd966cf2153"; + url = "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz"; + sha1 = "6ed021173e2fcb486d7acb45c6009a856f647071"; }; }; "babel-runtime-6.26.0" = { @@ -302,6 +1355,51 @@ let sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe"; }; }; + "babel-template-6.26.0" = { + name = "babel-template"; + packageName = "babel-template"; + version = "6.26.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz"; + sha1 = "de03e2d16396b069f46dd9fff8521fb1a0e35e02"; + }; + }; + "babel-traverse-6.26.0" = { + name = "babel-traverse"; + packageName = "babel-traverse"; + version = "6.26.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz"; + sha1 = "46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"; + }; + }; + "babel-types-6.26.0" = { + name = "babel-types"; + packageName = "babel-types"; + version = "6.26.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz"; + sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497"; + }; + }; + "babylon-6.18.0" = { + name = "babylon"; + packageName = "babylon"; + version = "6.18.0"; + src = fetchurl { + url = "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz"; + sha512 = "q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="; + }; + }; + "balanced-match-0.4.2" = { + name = "balanced-match"; + packageName = "balanced-match"; + version = "0.4.2"; + src = fetchurl { + url = "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz"; + sha1 = "cb3f3e3c732dc0f01ee70b403f302e61d7709838"; + }; + }; "balanced-match-1.0.0" = { name = "balanced-match"; packageName = "balanced-match"; @@ -311,13 +1409,22 @@ let sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767"; }; }; - "base64-js-1.2.3" = { + "base-0.11.2" = { + name = "base"; + packageName = "base"; + version = "0.11.2"; + src = fetchurl { + url = "https://registry.npmjs.org/base/-/base-0.11.2.tgz"; + sha512 = "5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg=="; + }; + }; + "base64-js-1.3.0" = { name = "base64-js"; packageName = "base64-js"; - version = "1.2.3"; - src = fetchurl { - url = "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz"; - sha512 = "MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w=="; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz"; + sha512 = "ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw=="; }; }; "bcrypt-pbkdf-1.0.2" = { @@ -329,6 +1436,51 @@ let sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"; }; }; + "big.js-3.2.0" = { + name = "big.js"; + packageName = "big.js"; + version = "3.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz"; + sha512 = "+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q=="; + }; + }; + "binary-extensions-1.12.0" = { + name = "binary-extensions"; + packageName = "binary-extensions"; + version = "1.12.0"; + src = fetchurl { + url = "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz"; + sha512 = "DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg=="; + }; + }; + "bluebird-3.5.2" = { + name = "bluebird"; + packageName = "bluebird"; + version = "3.5.2"; + src = fetchurl { + url = "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz"; + sha512 = "dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg=="; + }; + }; + "bn.js-4.11.8" = { + name = "bn.js"; + packageName = "bn.js"; + version = "4.11.8"; + src = fetchurl { + url = "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz"; + sha512 = "ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="; + }; + }; + "boolbase-1.0.0" = { + name = "boolbase"; + packageName = "boolbase"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz"; + sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"; + }; + }; "boom-2.10.1" = { name = "boom"; packageName = "boom"; @@ -338,15 +1490,6 @@ let sha1 = "39c8918ceff5799f83f9492a848f625add0c766f"; }; }; - "bower-1.8.4" = { - name = "bower"; - packageName = "bower"; - version = "1.8.4"; - src = fetchurl { - url = "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz"; - sha1 = "e7876a076deb8137f7d06525dc5e8c66db82f28a"; - }; - }; "brace-expansion-1.1.11" = { name = "brace-expansion"; packageName = "brace-expansion"; @@ -356,6 +1499,105 @@ let sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="; }; }; + "braces-2.3.2" = { + name = "braces"; + packageName = "braces"; + version = "2.3.2"; + src = fetchurl { + url = "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz"; + sha512 = "aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w=="; + }; + }; + "brorand-1.1.0" = { + name = "brorand"; + packageName = "brorand"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"; + sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f"; + }; + }; + "browserify-aes-1.2.0" = { + name = "browserify-aes"; + packageName = "browserify-aes"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz"; + sha512 = "+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA=="; + }; + }; + "browserify-cipher-1.0.1" = { + name = "browserify-cipher"; + packageName = "browserify-cipher"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz"; + sha512 = "sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w=="; + }; + }; + "browserify-des-1.0.2" = { + name = "browserify-des"; + packageName = "browserify-des"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz"; + sha512 = "BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A=="; + }; + }; + "browserify-rsa-4.0.1" = { + name = "browserify-rsa"; + packageName = "browserify-rsa"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz"; + sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524"; + }; + }; + "browserify-sign-4.0.4" = { + name = "browserify-sign"; + packageName = "browserify-sign"; + version = "4.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz"; + sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"; + }; + }; + "browserify-zlib-0.2.0" = { + name = "browserify-zlib"; + packageName = "browserify-zlib"; + version = "0.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz"; + sha512 = "Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA=="; + }; + }; + "browserslist-1.7.7" = { + name = "browserslist"; + packageName = "browserslist"; + version = "1.7.7"; + src = fetchurl { + url = "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz"; + sha1 = "0bd76704258be829b2398bb50e4b62d1a166b0b9"; + }; + }; + "browserslist-3.2.8" = { + name = "browserslist"; + packageName = "browserslist"; + version = "3.2.8"; + src = fetchurl { + url = "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz"; + sha512 = "WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ=="; + }; + }; + "buffer-4.9.1" = { + name = "buffer"; + packageName = "buffer"; + version = "4.9.1"; + src = fetchurl { + url = "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz"; + sha1 = "6d1bb601b07a4efced97094132093027c95bc298"; + }; + }; "buffer-from-1.1.1" = { name = "buffer-from"; packageName = "buffer-from"; @@ -365,22 +1607,94 @@ let sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="; }; }; - "builtin-modules-1.1.1" = { - name = "builtin-modules"; - packageName = "builtin-modules"; - version = "1.1.1"; - src = fetchurl { - url = "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz"; - sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f"; - }; - }; - "builtins-1.0.3" = { - name = "builtins"; - packageName = "builtins"; + "buffer-xor-1.0.3" = { + name = "buffer-xor"; + packageName = "buffer-xor"; version = "1.0.3"; src = fetchurl { - url = "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz"; - sha1 = "cb94faeb61c8696451db36534e1422f94f0aee88"; + url = "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz"; + sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9"; + }; + }; + "builtin-status-codes-3.0.0" = { + name = "builtin-status-codes"; + packageName = "builtin-status-codes"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz"; + sha1 = "85982878e21b98e1c66425e03d0174788f569ee8"; + }; + }; + "cacache-10.0.4" = { + name = "cacache"; + packageName = "cacache"; + version = "10.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz"; + sha512 = "Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA=="; + }; + }; + "cache-base-1.0.1" = { + name = "cache-base"; + packageName = "cache-base"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz"; + sha512 = "AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ=="; + }; + }; + "camel-case-3.0.0" = { + name = "camel-case"; + packageName = "camel-case"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz"; + sha1 = "ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"; + }; + }; + "camelcase-1.2.1" = { + name = "camelcase"; + packageName = "camelcase"; + version = "1.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz"; + sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"; + }; + }; + "camelcase-4.1.0" = { + name = "camelcase"; + packageName = "camelcase"; + version = "4.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz"; + sha1 = "d545635be1e33c542649c69173e5de6acfae34dd"; + }; + }; + "caniuse-api-1.6.1" = { + name = "caniuse-api"; + packageName = "caniuse-api"; + version = "1.6.1"; + src = fetchurl { + url = "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz"; + sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"; + }; + }; + "caniuse-db-1.0.30000900" = { + name = "caniuse-db"; + packageName = "caniuse-db"; + version = "1.0.30000900"; + src = fetchurl { + url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000900.tgz"; + sha512 = "fvicVRDlhHIQpt/bmbLl3hDHKUZb5ZP8O2OuZLz2fSEPlUBbvwwbhhqhGS617ldN6bDoo9A3+MQKQyFq0p7UXA=="; + }; + }; + "caniuse-lite-1.0.30000900" = { + name = "caniuse-lite"; + packageName = "caniuse-lite"; + version = "1.0.30000900"; + src = fetchurl { + url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000900.tgz"; + sha512 = "xDVs8pBFr6bzq9pXUkLKpGQQnzsF/l6/yX38UnCkTcUcwC0rDl1NGZGildcJVTU+uGBxfsyniK/ZWagPNn1Oqw=="; }; }; "caseless-0.12.0" = { @@ -392,6 +1706,15 @@ let sha1 = "1b681c21ff84033c826543090689420d187151dc"; }; }; + "center-align-0.1.3" = { + name = "center-align"; + packageName = "center-align"; + version = "0.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz"; + sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad"; + }; + }; "chalk-0.5.1" = { name = "chalk"; packageName = "chalk"; @@ -410,6 +1733,78 @@ let sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98"; }; }; + "chalk-2.4.1" = { + name = "chalk"; + packageName = "chalk"; + version = "2.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz"; + sha512 = "ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ=="; + }; + }; + "chokidar-2.0.4" = { + name = "chokidar"; + packageName = "chokidar"; + version = "2.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz"; + sha512 = "z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ=="; + }; + }; + "chownr-1.1.1" = { + name = "chownr"; + packageName = "chownr"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz"; + sha512 = "j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g=="; + }; + }; + "chrome-trace-event-1.0.0" = { + name = "chrome-trace-event"; + packageName = "chrome-trace-event"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz"; + sha512 = "xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A=="; + }; + }; + "cipher-base-1.0.4" = { + name = "cipher-base"; + packageName = "cipher-base"; + version = "1.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz"; + sha512 = "Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q=="; + }; + }; + "clap-1.2.3" = { + name = "clap"; + packageName = "clap"; + version = "1.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz"; + sha512 = "4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA=="; + }; + }; + "class-utils-0.3.6" = { + name = "class-utils"; + packageName = "class-utils"; + version = "0.3.6"; + src = fetchurl { + url = "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz"; + sha512 = "qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg=="; + }; + }; + "clean-css-4.2.1" = { + name = "clean-css"; + packageName = "clean-css"; + version = "4.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz"; + sha512 = "4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g=="; + }; + }; "cli-1.0.1" = { name = "cli"; packageName = "cli"; @@ -428,6 +1823,24 @@ let sha512 = "7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ=="; }; }; + "cliui-2.1.0" = { + name = "cliui"; + packageName = "cliui"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz"; + sha1 = "4b475760ff80264c762c3a1719032e91c7fea0d1"; + }; + }; + "cliui-4.1.0" = { + name = "cliui"; + packageName = "cliui"; + version = "4.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz"; + sha512 = "4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ=="; + }; + }; "clone-1.0.4" = { name = "clone"; packageName = "clone"; @@ -437,6 +1850,15 @@ let sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e"; }; }; + "clone-2.1.2" = { + name = "clone"; + packageName = "clone"; + version = "2.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz"; + sha1 = "1b7f4b9f591f1e8f83670401600345a02887435f"; + }; + }; "co-4.6.0" = { name = "co"; packageName = "co"; @@ -446,6 +1868,15 @@ let sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"; }; }; + "coa-1.0.4" = { + name = "coa"; + packageName = "coa"; + version = "1.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz"; + sha1 = "a9ef153660d6a86a8bdec0289a5c684d217432fd"; + }; + }; "code-point-at-1.1.0" = { name = "code-point-at"; packageName = "code-point-at"; @@ -464,6 +1895,60 @@ let sha1 = "150d6b4cb522894369efed6a2101c20bc7f4a4f4"; }; }; + "collection-visit-1.0.0" = { + name = "collection-visit"; + packageName = "collection-visit"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz"; + sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0"; + }; + }; + "color-0.11.4" = { + name = "color"; + packageName = "color"; + version = "0.11.4"; + src = fetchurl { + url = "https://registry.npmjs.org/color/-/color-0.11.4.tgz"; + sha1 = "6d7b5c74fb65e841cd48792ad1ed5e07b904d764"; + }; + }; + "color-convert-1.9.3" = { + name = "color-convert"; + packageName = "color-convert"; + version = "1.9.3"; + src = fetchurl { + url = "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"; + sha512 = "QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="; + }; + }; + "color-name-1.1.3" = { + name = "color-name"; + packageName = "color-name"; + version = "1.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"; + sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25"; + }; + }; + "color-string-0.3.0" = { + name = "color-string"; + packageName = "color-string"; + version = "0.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz"; + sha1 = "27d46fb67025c5c2fa25993bfbf579e47841b991"; + }; + }; + "colormin-1.1.2" = { + name = "colormin"; + packageName = "colormin"; + version = "1.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz"; + sha1 = "ea2f7420a72b96881a38aae59ec124a6f7298133"; + }; + }; "colors-0.6.2" = { name = "colors"; packageName = "colors"; @@ -482,31 +1967,67 @@ let sha1 = "0433f44d809680fdeb60ed260f1b0c262e82a40b"; }; }; - "combined-stream-1.0.6" = { + "colors-1.1.2" = { + name = "colors"; + packageName = "colors"; + version = "1.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz"; + sha1 = "168a4701756b6a7f51a12ce0c97bfa28c084ed63"; + }; + }; + "colors-1.3.2" = { + name = "colors"; + packageName = "colors"; + version = "1.3.2"; + src = fetchurl { + url = "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz"; + sha512 = "rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ=="; + }; + }; + "combined-stream-1.0.7" = { name = "combined-stream"; packageName = "combined-stream"; - version = "1.0.6"; - src = fetchurl { - url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz"; - sha1 = "723e7df6e801ac5613113a7e445a9b69cb632818"; - }; - }; - "command-line-args-3.0.5" = { - name = "command-line-args"; - packageName = "command-line-args"; - version = "3.0.5"; - src = fetchurl { - url = "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz"; - sha1 = "5bd4ad45e7983e5c1344918e40280ee2693c5ac0"; - }; - }; - "command-line-usage-3.0.8" = { - name = "command-line-usage"; - packageName = "command-line-usage"; - version = "3.0.8"; - src = fetchurl { - url = "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz"; - sha1 = "b6a20978c1b383477f5c11a529428b880bfe0f4d"; + version = "1.0.7"; + src = fetchurl { + url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz"; + sha512 = "brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w=="; + }; + }; + "commander-2.14.1" = { + name = "commander"; + packageName = "commander"; + version = "2.14.1"; + src = fetchurl { + url = "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz"; + sha512 = "+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="; + }; + }; + "commander-2.17.1" = { + name = "commander"; + packageName = "commander"; + version = "2.17.1"; + src = fetchurl { + url = "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz"; + sha512 = "wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="; + }; + }; + "commondir-1.0.1" = { + name = "commondir"; + packageName = "commondir"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz"; + sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b"; + }; + }; + "component-emitter-1.2.1" = { + name = "component-emitter"; + packageName = "component-emitter"; + version = "1.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz"; + sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6"; }; }; "concat-map-0.0.1" = { @@ -527,15 +2048,6 @@ let sha512 = "27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="; }; }; - "config-chain-1.1.11" = { - name = "config-chain"; - packageName = "config-chain"; - version = "1.1.11"; - src = fetchurl { - url = "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz"; - sha1 = "aba09747dfbe4c3e70e766a6e41586e1859fc6f2"; - }; - }; "console-browserify-1.1.0" = { name = "console-browserify"; packageName = "console-browserify"; @@ -545,13 +2057,49 @@ let sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10"; }; }; - "console-control-strings-1.1.0" = { - name = "console-control-strings"; - packageName = "console-control-strings"; - version = "1.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz"; - sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e"; + "constants-browserify-1.0.0" = { + name = "constants-browserify"; + packageName = "constants-browserify"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz"; + sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75"; + }; + }; + "convert-source-map-1.6.0" = { + name = "convert-source-map"; + packageName = "convert-source-map"; + version = "1.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz"; + sha512 = "eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A=="; + }; + }; + "copy-concurrently-1.0.5" = { + name = "copy-concurrently"; + packageName = "copy-concurrently"; + version = "1.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz"; + sha512 = "f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A=="; + }; + }; + "copy-descriptor-0.1.1" = { + name = "copy-descriptor"; + packageName = "copy-descriptor"; + version = "0.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz"; + sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d"; + }; + }; + "copy-webpack-plugin-4.5.4" = { + name = "copy-webpack-plugin"; + packageName = "copy-webpack-plugin"; + version = "4.5.4"; + src = fetchurl { + url = "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz"; + sha512 = "0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ=="; }; }; "core-js-2.5.7" = { @@ -572,22 +2120,40 @@ let sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7"; }; }; - "crisper-1.2.0" = { - name = "crisper"; - packageName = "crisper"; + "create-ecdh-4.0.3" = { + name = "create-ecdh"; + packageName = "create-ecdh"; + version = "4.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz"; + sha512 = "GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw=="; + }; + }; + "create-hash-1.2.0" = { + name = "create-hash"; + packageName = "create-hash"; version = "1.2.0"; src = fetchurl { - url = "https://registry.npmjs.org/crisper/-/crisper-1.2.0.tgz"; - sha1 = "9a91f597d71f6110294e076ad44dbb3408568e46"; - }; - }; - "crisper-2.1.1" = { - name = "crisper"; - packageName = "crisper"; - version = "2.1.1"; - src = fetchurl { - url = "https://registry.npmjs.org/crisper/-/crisper-2.1.1.tgz"; - sha512 = "yxfj9nTbFunDASztAxVF8hCPwaZBvTjayNzG3YL/VVQfQaKBXX2+TM3p1xB1Pxd8RYeDQJkJIQRwM3FQSIa+pw=="; + url = "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz"; + sha512 = "z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg=="; + }; + }; + "create-hmac-1.1.7" = { + name = "create-hmac"; + packageName = "create-hmac"; + version = "1.1.7"; + src = fetchurl { + url = "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz"; + sha512 = "MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg=="; + }; + }; + "cross-spawn-6.0.5" = { + name = "cross-spawn"; + packageName = "cross-spawn"; + version = "6.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz"; + sha512 = "eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ=="; }; }; "cryptiles-2.0.5" = { @@ -599,6 +2165,87 @@ let sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8"; }; }; + "crypto-browserify-3.12.0" = { + name = "crypto-browserify"; + packageName = "crypto-browserify"; + version = "3.12.0"; + src = fetchurl { + url = "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz"; + sha512 = "fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg=="; + }; + }; + "css-color-names-0.0.4" = { + name = "css-color-names"; + packageName = "css-color-names"; + version = "0.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz"; + sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0"; + }; + }; + "css-loader-0.28.11" = { + name = "css-loader"; + packageName = "css-loader"; + version = "0.28.11"; + src = fetchurl { + url = "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz"; + sha512 = "wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg=="; + }; + }; + "css-select-1.2.0" = { + name = "css-select"; + packageName = "css-select"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz"; + sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858"; + }; + }; + "css-selector-tokenizer-0.7.0" = { + name = "css-selector-tokenizer"; + packageName = "css-selector-tokenizer"; + version = "0.7.0"; + src = fetchurl { + url = "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz"; + sha1 = "e6988474ae8c953477bf5e7efecfceccd9cf4c86"; + }; + }; + "css-what-2.1.2" = { + name = "css-what"; + packageName = "css-what"; + version = "2.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz"; + sha512 = "wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ=="; + }; + }; + "cssesc-0.1.0" = { + name = "cssesc"; + packageName = "cssesc"; + version = "0.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz"; + sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4"; + }; + }; + "cssnano-3.10.0" = { + name = "cssnano"; + packageName = "cssnano"; + version = "3.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz"; + sha1 = "4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"; + }; + }; + "csso-2.3.2" = { + name = "csso"; + packageName = "csso"; + version = "2.3.2"; + src = fetchurl { + url = "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz"; + sha1 = "ddd52c587033f49e94b71fc55569f252e8ff5f85"; + }; + }; "cycle-1.0.3" = { name = "cycle"; packageName = "cycle"; @@ -608,6 +2255,15 @@ let sha1 = "21e80b2be8580f98b468f379430662b046c34ad2"; }; }; + "cyclist-0.2.2" = { + name = "cyclist"; + packageName = "cyclist"; + version = "0.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz"; + sha1 = "1b33792e11e914a2fd6d6ed6447464444e5fa640"; + }; + }; "dashdash-1.14.1" = { name = "dashdash"; packageName = "dashdash"; @@ -653,22 +2309,85 @@ let sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="; }; }; - "deep-extend-0.4.2" = { - name = "deep-extend"; - packageName = "deep-extend"; - version = "0.4.2"; - src = fetchurl { - url = "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz"; - sha1 = "48b699c27e334bf89f10892be432f6e4c7d34a7f"; - }; - }; - "deep-is-0.1.3" = { - name = "deep-is"; - packageName = "deep-is"; - version = "0.1.3"; - src = fetchurl { - url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz"; - sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34"; + "decamelize-1.2.0" = { + name = "decamelize"; + packageName = "decamelize"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"; + sha1 = "f6534d15148269b20352e7bee26f501f9a191290"; + }; + }; + "decamelize-2.0.0" = { + name = "decamelize"; + packageName = "decamelize"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz"; + sha512 = "Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg=="; + }; + }; + "decode-uri-component-0.2.0" = { + name = "decode-uri-component"; + packageName = "decode-uri-component"; + version = "0.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz"; + sha1 = "eb3913333458775cb84cd1a1fae062106bb87545"; + }; + }; + "deep-for-each-2.0.3" = { + name = "deep-for-each"; + packageName = "deep-for-each"; + version = "2.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/deep-for-each/-/deep-for-each-2.0.3.tgz"; + sha512 = "Y9mu+rplGcNZ7veer+5rqcdI9w3aPb7/WyE/nYnsuPevaE2z5YuC2u7/Gz/hIKsa0zo8sE8gKoBimSNsO/sr+A=="; + }; + }; + "define-properties-1.1.3" = { + name = "define-properties"; + packageName = "define-properties"; + version = "1.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz"; + sha512 = "3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ=="; + }; + }; + "define-property-0.2.5" = { + name = "define-property"; + packageName = "define-property"; + version = "0.2.5"; + src = fetchurl { + url = "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz"; + sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116"; + }; + }; + "define-property-1.0.0" = { + name = "define-property"; + packageName = "define-property"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz"; + sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"; + }; + }; + "define-property-2.0.2" = { + name = "define-property"; + packageName = "define-property"; + version = "2.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz"; + sha512 = "jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ=="; + }; + }; + "defined-1.0.0" = { + name = "defined"; + packageName = "defined"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz"; + sha1 = "c98d9bcef75674188e110969151199e39b1fa693"; }; }; "delayed-stream-1.0.0" = { @@ -689,22 +2408,58 @@ let sha512 = "IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="; }; }; - "delegates-1.0.0" = { - name = "delegates"; - packageName = "delegates"; + "des.js-1.0.0" = { + name = "des.js"; + packageName = "des.js"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz"; + sha1 = "c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"; + }; + }; + "detect-file-1.0.0" = { + name = "detect-file"; + packageName = "detect-file"; version = "1.0.0"; src = fetchurl { - url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz"; - sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a"; - }; - }; - "doctrine-0.7.2" = { - name = "doctrine"; - packageName = "doctrine"; - version = "0.7.2"; - src = fetchurl { - url = "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz"; - sha1 = "7cb860359ba3be90e040b26b729ce4bfa654c523"; + url = "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz"; + sha1 = "f0d66d03672a825cb1b73bdb3fe62310c8e552b7"; + }; + }; + "detect-indent-4.0.0" = { + name = "detect-indent"; + packageName = "detect-indent"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz"; + sha1 = "f76d064352cdf43a1cb6ce619c4ee3a9475de208"; + }; + }; + "diffie-hellman-5.0.3" = { + name = "diffie-hellman"; + packageName = "diffie-hellman"; + version = "5.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz"; + sha512 = "kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg=="; + }; + }; + "dir-glob-2.0.0" = { + name = "dir-glob"; + packageName = "dir-glob"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz"; + sha512 = "37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag=="; + }; + }; + "dom-converter-0.2.0" = { + name = "dom-converter"; + packageName = "dom-converter"; + version = "0.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz"; + sha512 = "gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA=="; }; }; "dom-serializer-0.1.0" = { @@ -716,22 +2471,22 @@ let sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82"; }; }; - "dom5-1.1.0" = { + "dom5-2.3.0" = { name = "dom5"; packageName = "dom5"; - version = "1.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/dom5/-/dom5-1.1.0.tgz"; - sha1 = "3a0c7700c083ab4c4d26938a78b0f0c6dcc37794"; - }; - }; - "dom5-1.3.6" = { - name = "dom5"; - packageName = "dom5"; - version = "1.3.6"; - src = fetchurl { - url = "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz"; - sha1 = "a7088a9fc5f3b08dc9f6eda4c7abaeb241945e0d"; + version = "2.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz"; + sha1 = "f8204975bd0dacbbe5b58a8a93ffc1fed0ffcd2a"; + }; + }; + "domain-browser-1.2.0" = { + name = "domain-browser"; + packageName = "domain-browser"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz"; + sha512 = "jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="; }; }; "domelementtype-1.1.3" = { @@ -752,6 +2507,15 @@ let sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2"; }; }; + "domhandler-2.1.0" = { + name = "domhandler"; + packageName = "domhandler"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz"; + sha1 = "d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"; + }; + }; "domhandler-2.3.0" = { name = "domhandler"; packageName = "domhandler"; @@ -761,6 +2525,15 @@ let sha1 = "2de59a0822d5027fabff6f032c2b25a2a8abe738"; }; }; + "domutils-1.1.6" = { + name = "domutils"; + packageName = "domutils"; + version = "1.1.6"; + src = fetchurl { + url = "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz"; + sha1 = "bddc3de099b9a2efacc51c623f28f416ecc57485"; + }; + }; "domutils-1.5.1" = { name = "domutils"; packageName = "domutils"; @@ -770,6 +2543,15 @@ let sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf"; }; }; + "duplexify-3.6.1" = { + name = "duplexify"; + packageName = "duplexify"; + version = "3.6.1"; + src = fetchurl { + url = "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz"; + sha512 = "vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA=="; + }; + }; "ecc-jsbn-0.1.2" = { name = "ecc-jsbn"; packageName = "ecc-jsbn"; @@ -779,6 +2561,60 @@ let sha1 = "3a83a904e54353287874c564b7549386849a98c9"; }; }; + "electron-to-chromium-1.3.82" = { + name = "electron-to-chromium"; + packageName = "electron-to-chromium"; + version = "1.3.82"; + src = fetchurl { + url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.82.tgz"; + sha512 = "NI4nB2IWGcU4JVT1AE8kBb/dFor4zjLHMLsOROPahppeHrR0FG5uslxMmkp/thO1MvPjM2xhlKoY29/I60s0ew=="; + }; + }; + "elliptic-6.4.1" = { + name = "elliptic"; + packageName = "elliptic"; + version = "6.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz"; + sha512 = "BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ=="; + }; + }; + "emojis-list-2.1.0" = { + name = "emojis-list"; + packageName = "emojis-list"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz"; + sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389"; + }; + }; + "end-of-stream-1.4.1" = { + name = "end-of-stream"; + packageName = "end-of-stream"; + version = "1.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz"; + sha512 = "1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q=="; + }; + }; + "enhanced-resolve-3.4.1" = { + name = "enhanced-resolve"; + packageName = "enhanced-resolve"; + version = "3.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz"; + sha1 = "0421e339fd71419b3da13d129b3979040230476e"; + }; + }; + "enhanced-resolve-4.1.0" = { + name = "enhanced-resolve"; + packageName = "enhanced-resolve"; + version = "4.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz"; + sha512 = "F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng=="; + }; + }; "entities-1.0.0" = { name = "entities"; packageName = "entities"; @@ -788,13 +2624,13 @@ let sha1 = "b2987aa3821347fcde642b24fdfc9e4fb712bf26"; }; }; - "entities-1.1.1" = { + "entities-1.1.2" = { name = "entities"; packageName = "entities"; - version = "1.1.1"; - src = fetchurl { - url = "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz"; - sha1 = "6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"; + version = "1.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz"; + sha512 = "f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="; }; }; "errno-0.1.7" = { @@ -806,22 +2642,40 @@ let sha512 = "MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg=="; }; }; - "es6-promise-2.3.0" = { + "es-abstract-1.12.0" = { + name = "es-abstract"; + packageName = "es-abstract"; + version = "1.12.0"; + src = fetchurl { + url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz"; + sha512 = "C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA=="; + }; + }; + "es-to-primitive-1.2.0" = { + name = "es-to-primitive"; + packageName = "es-to-primitive"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz"; + sha512 = "qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg=="; + }; + }; + "es6-promise-4.2.5" = { name = "es6-promise"; packageName = "es6-promise"; - version = "2.3.0"; - src = fetchurl { - url = "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz"; - sha1 = "96edb9f2fdb01995822b263dd8aadab6748181bc"; - }; - }; - "es6-promise-4.2.4" = { - name = "es6-promise"; - packageName = "es6-promise"; - version = "4.2.4"; - src = fetchurl { - url = "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz"; - sha512 = "/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ=="; + version = "4.2.5"; + src = fetchurl { + url = "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz"; + sha512 = "n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg=="; + }; + }; + "es6-templates-0.2.3" = { + name = "es6-templates"; + packageName = "es6-templates"; + version = "0.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz"; + sha1 = "5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4"; }; }; "escape-string-regexp-1.0.5" = { @@ -833,13 +2687,13 @@ let sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"; }; }; - "escodegen-1.11.0" = { - name = "escodegen"; - packageName = "escodegen"; - version = "1.11.0"; - src = fetchurl { - url = "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz"; - sha512 = "IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw=="; + "eslint-scope-4.0.0" = { + name = "eslint-scope"; + packageName = "eslint-scope"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz"; + sha512 = "1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA=="; }; }; "espree-3.5.4" = { @@ -860,6 +2714,15 @@ let sha1 = "9f557e08fc3b4d26ece9dd34f8fbf476b62585ad"; }; }; + "esprima-2.7.3" = { + name = "esprima"; + packageName = "esprima"; + version = "2.7.3"; + src = fetchurl { + url = "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz"; + sha1 = "96e3b70d5779f6ad49cd032673d1c312767ba581"; + }; + }; "esprima-3.1.3" = { name = "esprima"; packageName = "esprima"; @@ -869,13 +2732,13 @@ let sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633"; }; }; - "estraverse-3.1.0" = { - name = "estraverse"; - packageName = "estraverse"; - version = "3.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz"; - sha1 = "15e28a446b8b82bc700ccc8b96c78af4da0d6cba"; + "esrecurse-4.2.1" = { + name = "esrecurse"; + packageName = "esrecurse"; + version = "4.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz"; + sha512 = "64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ=="; }; }; "estraverse-4.2.0" = { @@ -887,15 +2750,6 @@ let sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13"; }; }; - "esutils-1.1.6" = { - name = "esutils"; - packageName = "esutils"; - version = "1.1.6"; - src = fetchurl { - url = "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz"; - sha1 = "c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375"; - }; - }; "esutils-2.0.2" = { name = "esutils"; packageName = "esutils"; @@ -914,6 +2768,33 @@ let sha1 = "8f61b75cde012b2e9eb284d4545583b5643b61ab"; }; }; + "events-1.1.1" = { + name = "events"; + packageName = "events"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/events/-/events-1.1.1.tgz"; + sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"; + }; + }; + "evp_bytestokey-1.0.3" = { + name = "evp_bytestokey"; + packageName = "evp_bytestokey"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz"; + sha512 = "/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="; + }; + }; + "execa-0.10.0" = { + name = "execa"; + packageName = "execa"; + version = "0.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz"; + sha512 = "7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw=="; + }; + }; "exit-0.1.2" = { name = "exit"; packageName = "exit"; @@ -923,6 +2804,33 @@ let sha1 = "0632638f8d877cc82107d30a0fff1a17cba1cd0c"; }; }; + "expand-brackets-2.1.4" = { + name = "expand-brackets"; + packageName = "expand-brackets"; + version = "2.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz"; + sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622"; + }; + }; + "expand-tilde-2.0.2" = { + name = "expand-tilde"; + packageName = "expand-tilde"; + version = "2.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz"; + sha1 = "97e801aa052df02454de46b02bf621642cdc8502"; + }; + }; + "exports-loader-0.6.4" = { + name = "exports-loader"; + packageName = "exports-loader"; + version = "0.6.4"; + src = fetchurl { + url = "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.4.tgz"; + sha1 = "d70fc6121975b35fc12830cf52754be2740fc886"; + }; + }; "extend-3.0.2" = { name = "extend"; packageName = "extend"; @@ -932,6 +2840,33 @@ let sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="; }; }; + "extend-shallow-2.0.1" = { + name = "extend-shallow"; + packageName = "extend-shallow"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz"; + sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f"; + }; + }; + "extend-shallow-3.0.2" = { + name = "extend-shallow"; + packageName = "extend-shallow"; + version = "3.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz"; + sha1 = "26a71aaf073b39fb2127172746131c2704028db8"; + }; + }; + "extglob-2.0.4" = { + name = "extglob"; + packageName = "extglob"; + version = "2.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz"; + sha512 = "Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw=="; + }; + }; "extract-zip-1.6.7" = { name = "extract-zip"; packageName = "extract-zip"; @@ -959,13 +2894,31 @@ let sha1 = "62cf120234c683785d902348a800ef3e0cc20bc0"; }; }; - "fast-levenshtein-2.0.6" = { - name = "fast-levenshtein"; - packageName = "fast-levenshtein"; - version = "2.0.6"; - src = fetchurl { - url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"; - sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917"; + "fast-deep-equal-2.0.1" = { + name = "fast-deep-equal"; + packageName = "fast-deep-equal"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz"; + sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"; + }; + }; + "fast-json-stable-stringify-2.0.0" = { + name = "fast-json-stable-stringify"; + packageName = "fast-json-stable-stringify"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz"; + sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2"; + }; + }; + "fastparse-1.1.1" = { + name = "fastparse"; + packageName = "fastparse"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz"; + sha1 = "d1e2643b38a94d7583b479060e6c4affc94071f8"; }; }; "favico.js-0.3.10" = { @@ -995,15 +2948,6 @@ let sha1 = "8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"; }; }; - "feature-detect-es6-1.5.0" = { - name = "feature-detect-es6"; - packageName = "feature-detect-es6"; - version = "1.5.0"; - src = fetchurl { - url = "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.5.0.tgz"; - sha512 = "DzWPIGzTnfp3/KK1d/YPfmgLqeDju9F2DQYBL35VusgSApcA7XGqVtXfR4ETOOFEzdFJ3J7zh0Gkk011TiA4uQ=="; - }; - }; "file-sync-cmp-0.1.1" = { name = "file-sync-cmp"; packageName = "file-sync-cmp"; @@ -1013,22 +2957,40 @@ let sha1 = "a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b"; }; }; - "find-replace-1.0.3" = { - name = "find-replace"; - packageName = "find-replace"; - version = "1.0.3"; - src = fetchurl { - url = "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz"; - sha1 = "b88e7364d2d9c959559f388c66670d6130441fa0"; - }; - }; - "findit-2.0.0" = { - name = "findit"; - packageName = "findit"; - version = "2.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz"; - sha1 = "6509f0126af4c178551cfa99394e032e13a4d56e"; + "fill-range-4.0.0" = { + name = "fill-range"; + packageName = "fill-range"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz"; + sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7"; + }; + }; + "find-cache-dir-1.0.0" = { + name = "find-cache-dir"; + packageName = "find-cache-dir"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz"; + sha1 = "9288e3e9e3cc3748717d39eade17cf71fc30ee6f"; + }; + }; + "find-up-2.1.0" = { + name = "find-up"; + packageName = "find-up"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz"; + sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7"; + }; + }; + "find-up-3.0.0" = { + name = "find-up"; + packageName = "find-up"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"; + sha512 = "1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="; }; }; "findup-sync-0.1.3" = { @@ -1040,13 +3002,67 @@ let sha1 = "7f3e7a97b82392c653bf06589bd85190e93c3683"; }; }; - "foreachasync-3.0.0" = { - name = "foreachasync"; - packageName = "foreachasync"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz"; - sha1 = "5502987dc8714be3392097f32e0071c9dee07cf6"; + "findup-sync-2.0.0" = { + name = "findup-sync"; + packageName = "findup-sync"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz"; + sha1 = "9326b1488c22d1a6088650a86901b2d9a90a2cbc"; + }; + }; + "fined-1.1.0" = { + name = "fined"; + packageName = "fined"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz"; + sha1 = "b37dc844b76a2f5e7081e884f7c0ae344f153476"; + }; + }; + "flagged-respawn-1.0.0" = { + name = "flagged-respawn"; + packageName = "flagged-respawn"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz"; + sha1 = "4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7"; + }; + }; + "flatten-1.0.2" = { + name = "flatten"; + packageName = "flatten"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz"; + sha1 = "dae46a9d78fbe25292258cc1e780a41d95c03782"; + }; + }; + "flush-write-stream-1.0.3" = { + name = "flush-write-stream"; + packageName = "flush-write-stream"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz"; + sha512 = "calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw=="; + }; + }; + "for-in-1.0.2" = { + name = "for-in"; + packageName = "for-in"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz"; + sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80"; + }; + }; + "for-own-1.0.0" = { + name = "for-own"; + packageName = "for-own"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz"; + sha1 = "c63332f415cedc4b04dbfe70cf836494c53cb44b"; }; }; "forever-agent-0.6.1" = { @@ -1067,13 +3083,22 @@ let sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1"; }; }; - "fs-extra-0.6.4" = { - name = "fs-extra"; - packageName = "fs-extra"; - version = "0.6.4"; - src = fetchurl { - url = "https://registry.npmjs.org/fs-extra/-/fs-extra-0.6.4.tgz"; - sha1 = "f46f0c75b7841f8d200b3348cd4d691d5a099d15"; + "fragment-cache-0.2.1" = { + name = "fragment-cache"; + packageName = "fragment-cache"; + version = "0.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz"; + sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19"; + }; + }; + "from2-2.3.0" = { + name = "from2"; + packageName = "from2"; + version = "2.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz"; + sha1 = "8bfb5502bde4a4d36cfdeea007fcca21d7e382af"; }; }; "fs-extra-1.0.0" = { @@ -1085,13 +3110,13 @@ let sha1 = "cd3ce5f7e7cb6145883fcae3191e9877f8587950"; }; }; - "fs.extra-1.3.2" = { - name = "fs.extra"; - packageName = "fs.extra"; - version = "1.3.2"; - src = fetchurl { - url = "https://registry.npmjs.org/fs.extra/-/fs.extra-1.3.2.tgz"; - sha1 = "dd023f93013bee24531f1b33514c37b20fd93349"; + "fs-write-stream-atomic-1.0.10" = { + name = "fs-write-stream-atomic"; + packageName = "fs-write-stream-atomic"; + version = "1.0.10"; + src = fetchurl { + url = "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz"; + sha1 = "b47df53493ef911df75731e70a9ded0189db40c9"; }; }; "fs.realpath-1.0.0" = { @@ -1103,13 +3128,22 @@ let sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f"; }; }; - "gauge-2.7.4" = { - name = "gauge"; - packageName = "gauge"; - version = "2.7.4"; - src = fetchurl { - url = "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz"; - sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7"; + "fsevents-1.2.4" = { + name = "fsevents"; + packageName = "fsevents"; + version = "1.2.4"; + src = fetchurl { + url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz"; + sha512 = "z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg=="; + }; + }; + "function-bind-1.1.1" = { + name = "function-bind"; + packageName = "function-bind"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"; + sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="; }; }; "gaze-0.5.2" = { @@ -1121,6 +3155,33 @@ let sha1 = "40b709537d24d1d45767db5a908689dfe69ac44f"; }; }; + "get-caller-file-1.0.3" = { + name = "get-caller-file"; + packageName = "get-caller-file"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz"; + sha512 = "3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="; + }; + }; + "get-stream-3.0.0" = { + name = "get-stream"; + packageName = "get-stream"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz"; + sha1 = "8e943d1358dc37555054ecbe2edb05aa174ede14"; + }; + }; + "get-value-2.0.6" = { + name = "get-value"; + packageName = "get-value"; + version = "2.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz"; + sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28"; + }; + }; "getobject-0.1.0" = { name = "getobject"; packageName = "getobject"; @@ -1157,13 +3218,67 @@ let sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d"; }; }; - "glob-7.1.2" = { + "glob-7.1.3" = { name = "glob"; packageName = "glob"; - version = "7.1.2"; - src = fetchurl { - url = "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz"; - sha512 = "MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ=="; + version = "7.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz"; + sha512 = "vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ=="; + }; + }; + "glob-parent-3.1.0" = { + name = "glob-parent"; + packageName = "glob-parent"; + version = "3.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz"; + sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae"; + }; + }; + "global-modules-1.0.0" = { + name = "global-modules"; + packageName = "global-modules"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz"; + sha512 = "sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg=="; + }; + }; + "global-modules-path-2.3.0" = { + name = "global-modules-path"; + packageName = "global-modules-path"; + version = "2.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz"; + sha512 = "HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag=="; + }; + }; + "global-prefix-1.0.2" = { + name = "global-prefix"; + packageName = "global-prefix"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz"; + sha1 = "dbf743c6c14992593c655568cb66ed32c0122ebe"; + }; + }; + "globals-9.18.0" = { + name = "globals"; + packageName = "globals"; + version = "9.18.0"; + src = fetchurl { + url = "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz"; + sha512 = "S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="; + }; + }; + "globby-7.1.1" = { + name = "globby"; + packageName = "globby"; + version = "7.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz"; + sha1 = "fb2ccff9401f8600945dfada97440cca972b8680"; }; }; "globule-0.1.0" = { @@ -1211,6 +3326,15 @@ let sha1 = "56937cd5194324adff6d207631832a9d6ba4e7f0"; }; }; + "grunt-cli-1.3.1" = { + name = "grunt-cli"; + packageName = "grunt-cli"; + version = "1.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.1.tgz"; + sha512 = "UwBRu/QpAjDc53DRLEkyilFdL0zenpxu+fddTIlsF/KJqdNcHaQmvyu1W3cDesZ9rqqZdKK5A8+QDIyLUEWoZQ=="; + }; + }; "grunt-contrib-concat-0.5.1" = { name = "grunt-contrib-concat"; packageName = "grunt-contrib-concat"; @@ -1256,13 +3380,13 @@ let sha1 = "64fdcba25a635f5b4da1b6ce6f90da0aeb6e3f15"; }; }; - "grunt-crisper-1.0.1" = { - name = "grunt-crisper"; - packageName = "grunt-crisper"; - version = "1.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/grunt-crisper/-/grunt-crisper-1.0.1.tgz"; - sha1 = "e7c091dcaff10deb0091e3035ca7e54008991fe7"; + "grunt-known-options-1.1.1" = { + name = "grunt-known-options"; + packageName = "grunt-known-options"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz"; + sha512 = "cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ=="; }; }; "grunt-legacy-log-0.1.3" = { @@ -1292,13 +3416,13 @@ let sha1 = "93324884dbf7e37a9ff7c026dff451d94a9e554b"; }; }; - "grunt-vulcanize-1.0.0" = { - name = "grunt-vulcanize"; - packageName = "grunt-vulcanize"; - version = "1.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/grunt-vulcanize/-/grunt-vulcanize-1.0.0.tgz"; - sha1 = "f4d6cfef274f8216c06f6c290e7dbb3b9e9e3b0f"; + "grunt-webpack-3.1.3" = { + name = "grunt-webpack"; + packageName = "grunt-webpack"; + version = "3.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/grunt-webpack/-/grunt-webpack-3.1.3.tgz"; + sha512 = "SaZ8K8lG4iTxs7ClZxOWCf3kxqS2y+Eel8SbaEGgBKwhAp6e45beIu+vhBZRLX3vonKML2kjemKsQ21REaqNFQ=="; }; }; "har-schema-1.0.5" = { @@ -1319,6 +3443,15 @@ let sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a"; }; }; + "has-1.0.3" = { + name = "has"; + packageName = "has"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz"; + sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="; + }; + }; "has-ansi-0.1.0" = { name = "has-ansi"; packageName = "has-ansi"; @@ -1337,13 +3470,85 @@ let sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91"; }; }; - "has-unicode-2.0.1" = { - name = "has-unicode"; - packageName = "has-unicode"; - version = "2.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz"; - sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9"; + "has-flag-1.0.0" = { + name = "has-flag"; + packageName = "has-flag"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz"; + sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa"; + }; + }; + "has-flag-3.0.0" = { + name = "has-flag"; + packageName = "has-flag"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"; + sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd"; + }; + }; + "has-symbols-1.0.0" = { + name = "has-symbols"; + packageName = "has-symbols"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz"; + sha1 = "ba1a8f1af2a0fc39650f5c850367704122063b44"; + }; + }; + "has-value-0.3.1" = { + name = "has-value"; + packageName = "has-value"; + version = "0.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz"; + sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f"; + }; + }; + "has-value-1.0.0" = { + name = "has-value"; + packageName = "has-value"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz"; + sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177"; + }; + }; + "has-values-0.1.4" = { + name = "has-values"; + packageName = "has-values"; + version = "0.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz"; + sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771"; + }; + }; + "has-values-1.0.0" = { + name = "has-values"; + packageName = "has-values"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz"; + sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f"; + }; + }; + "hash-base-3.0.4" = { + name = "hash-base"; + packageName = "hash-base"; + version = "3.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz"; + sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918"; + }; + }; + "hash.js-1.1.5" = { + name = "hash.js"; + packageName = "hash.js"; + version = "1.1.5"; + src = fetchurl { + url = "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz"; + sha512 = "eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA=="; }; }; "hasha-2.2.0" = { @@ -1364,6 +3569,24 @@ let sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4"; }; }; + "he-1.2.0" = { + name = "he"; + packageName = "he"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/he/-/he-1.2.0.tgz"; + sha512 = "F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="; + }; + }; + "hmac-drbg-1.0.1" = { + name = "hmac-drbg"; + packageName = "hmac-drbg"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz"; + sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1"; + }; + }; "hoek-2.16.3" = { name = "hoek"; packageName = "hoek"; @@ -1373,6 +3596,24 @@ let sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed"; }; }; + "home-or-tmp-2.0.0" = { + name = "home-or-tmp"; + packageName = "home-or-tmp"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz"; + sha1 = "e36c3f2d2cae7d746a857e38d18d5f32a7882db8"; + }; + }; + "homedir-polyfill-1.0.1" = { + name = "homedir-polyfill"; + packageName = "homedir-polyfill"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz"; + sha1 = "4c2bbc8a758998feebf5ed68580f76d46768b4bc"; + }; + }; "hooker-0.2.3" = { name = "hooker"; packageName = "hooker"; @@ -1382,13 +3623,58 @@ let sha1 = "b834f723cc4a242aa65963459df6d984c5d3d959"; }; }; - "hosted-git-info-2.7.1" = { - name = "hosted-git-info"; - packageName = "hosted-git-info"; - version = "2.7.1"; - src = fetchurl { - url = "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz"; - sha512 = "7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w=="; + "html-comment-regex-1.1.2" = { + name = "html-comment-regex"; + packageName = "html-comment-regex"; + version = "1.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz"; + sha512 = "P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ=="; + }; + }; + "html-loader-0.4.5" = { + name = "html-loader"; + packageName = "html-loader"; + version = "0.4.5"; + src = fetchurl { + url = "https://registry.npmjs.org/html-loader/-/html-loader-0.4.5.tgz"; + sha1 = "5fbcd87cd63a5c49a7fce2fe56f425e05729c68c"; + }; + }; + "html-loader-0.5.5" = { + name = "html-loader"; + packageName = "html-loader"; + version = "0.5.5"; + src = fetchurl { + url = "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz"; + sha512 = "7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog=="; + }; + }; + "html-minifier-3.5.21" = { + name = "html-minifier"; + packageName = "html-minifier"; + version = "3.5.21"; + src = fetchurl { + url = "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz"; + sha512 = "LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA=="; + }; + }; + "html-webpack-plugin-3.2.0" = { + name = "html-webpack-plugin"; + packageName = "html-webpack-plugin"; + version = "3.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz"; + sha1 = "b01abbd723acaaa7b37b6af4492ebda03d9dd37b"; + }; + }; + "htmlparser2-3.3.0" = { + name = "htmlparser2"; + packageName = "htmlparser2"; + version = "3.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz"; + sha1 = "cc70d05a59f6542e43f0e685c982e14c924a9efe"; }; }; "htmlparser2-3.8.3" = { @@ -1409,13 +3695,13 @@ let sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf"; }; }; - "hydrolysis-1.25.0" = { - name = "hydrolysis"; - packageName = "hydrolysis"; - version = "1.25.0"; - src = fetchurl { - url = "https://registry.npmjs.org/hydrolysis/-/hydrolysis-1.25.0.tgz"; - sha1 = "a4fb14a37a1e03b0db52d8aaa57c682272a14d84"; + "https-browserify-1.0.0" = { + name = "https-browserify"; + packageName = "https-browserify"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz"; + sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"; }; }; "iconv-lite-0.2.11" = { @@ -1427,6 +3713,51 @@ let sha1 = "1ce60a3a57864a292d1321ff4609ca4bb965adc8"; }; }; + "icss-replace-symbols-1.1.0" = { + name = "icss-replace-symbols"; + packageName = "icss-replace-symbols"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz"; + sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded"; + }; + }; + "icss-utils-2.1.0" = { + name = "icss-utils"; + packageName = "icss-utils"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz"; + sha1 = "83f0a0ec378bf3246178b6c2ad9136f135b1c962"; + }; + }; + "ieee754-1.1.12" = { + name = "ieee754"; + packageName = "ieee754"; + version = "1.1.12"; + src = fetchurl { + url = "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz"; + sha512 = "GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA=="; + }; + }; + "iferr-0.1.5" = { + name = "iferr"; + packageName = "iferr"; + version = "0.1.5"; + src = fetchurl { + url = "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz"; + sha1 = "c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"; + }; + }; + "ignore-3.3.10" = { + name = "ignore"; + packageName = "ignore"; + version = "3.3.10"; + src = fetchurl { + url = "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz"; + sha512 = "Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="; + }; + }; "image-size-0.5.5" = { name = "image-size"; packageName = "image-size"; @@ -1436,6 +3767,51 @@ let sha1 = "09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"; }; }; + "import-local-2.0.0" = { + name = "import-local"; + packageName = "import-local"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz"; + sha512 = "b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ=="; + }; + }; + "imports-loader-0.7.1" = { + name = "imports-loader"; + packageName = "imports-loader"; + version = "0.7.1"; + src = fetchurl { + url = "https://registry.npmjs.org/imports-loader/-/imports-loader-0.7.1.tgz"; + sha1 = "f204b5f34702a32c1db7d48d89d5e867a0441253"; + }; + }; + "imurmurhash-0.1.4" = { + name = "imurmurhash"; + packageName = "imurmurhash"; + version = "0.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"; + sha1 = "9218b9b2b928a238b13dc4fb6b6d576f231453ea"; + }; + }; + "indexes-of-1.0.1" = { + name = "indexes-of"; + packageName = "indexes-of"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz"; + sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607"; + }; + }; + "indexof-0.0.1" = { + name = "indexof"; + packageName = "indexof"; + version = "0.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz"; + sha1 = "82dc336d232b9062179d05ab3293a66059fd435d"; + }; + }; "inflight-1.0.6" = { name = "inflight"; packageName = "inflight"; @@ -1454,6 +3830,15 @@ let sha1 = "ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"; }; }; + "inherits-2.0.1" = { + name = "inherits"; + packageName = "inherits"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"; + sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1"; + }; + }; "inherits-2.0.3" = { name = "inherits"; packageName = "inherits"; @@ -1472,13 +3857,175 @@ let sha512 = "RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="; }; }; - "is-builtin-module-1.0.0" = { - name = "is-builtin-module"; - packageName = "is-builtin-module"; + "interpret-1.1.0" = { + name = "interpret"; + packageName = "interpret"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz"; + sha1 = "7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"; + }; + }; + "invariant-2.2.4" = { + name = "invariant"; + packageName = "invariant"; + version = "2.2.4"; + src = fetchurl { + url = "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz"; + sha512 = "phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="; + }; + }; + "invert-kv-2.0.0" = { + name = "invert-kv"; + packageName = "invert-kv"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz"; + sha512 = "wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="; + }; + }; + "is-absolute-1.0.0" = { + name = "is-absolute"; + packageName = "is-absolute"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz"; + sha512 = "dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA=="; + }; + }; + "is-absolute-url-2.1.0" = { + name = "is-absolute-url"; + packageName = "is-absolute-url"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz"; + sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"; + }; + }; + "is-accessor-descriptor-0.1.6" = { + name = "is-accessor-descriptor"; + packageName = "is-accessor-descriptor"; + version = "0.1.6"; + src = fetchurl { + url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz"; + sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"; + }; + }; + "is-accessor-descriptor-1.0.0" = { + name = "is-accessor-descriptor"; + packageName = "is-accessor-descriptor"; version = "1.0.0"; src = fetchurl { - url = "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz"; - sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe"; + url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz"; + sha512 = "m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ=="; + }; + }; + "is-binary-path-1.0.1" = { + name = "is-binary-path"; + packageName = "is-binary-path"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz"; + sha1 = "75f16642b480f187a711c814161fd3a4a7655898"; + }; + }; + "is-buffer-1.1.6" = { + name = "is-buffer"; + packageName = "is-buffer"; + version = "1.1.6"; + src = fetchurl { + url = "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz"; + sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="; + }; + }; + "is-callable-1.1.4" = { + name = "is-callable"; + packageName = "is-callable"; + version = "1.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz"; + sha512 = "r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA=="; + }; + }; + "is-data-descriptor-0.1.4" = { + name = "is-data-descriptor"; + packageName = "is-data-descriptor"; + version = "0.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz"; + sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56"; + }; + }; + "is-data-descriptor-1.0.0" = { + name = "is-data-descriptor"; + packageName = "is-data-descriptor"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz"; + sha512 = "jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ=="; + }; + }; + "is-date-object-1.0.1" = { + name = "is-date-object"; + packageName = "is-date-object"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz"; + sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"; + }; + }; + "is-descriptor-0.1.6" = { + name = "is-descriptor"; + packageName = "is-descriptor"; + version = "0.1.6"; + src = fetchurl { + url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz"; + sha512 = "avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="; + }; + }; + "is-descriptor-1.0.2" = { + name = "is-descriptor"; + packageName = "is-descriptor"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz"; + sha512 = "2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg=="; + }; + }; + "is-extendable-0.1.1" = { + name = "is-extendable"; + packageName = "is-extendable"; + version = "0.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"; + sha1 = "62b110e289a471418e3ec36a617d472e301dfc89"; + }; + }; + "is-extendable-1.0.1" = { + name = "is-extendable"; + packageName = "is-extendable"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz"; + sha512 = "arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="; + }; + }; + "is-extglob-2.1.1" = { + name = "is-extglob"; + packageName = "is-extglob"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"; + sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2"; + }; + }; + "is-finite-1.0.2" = { + name = "is-finite"; + packageName = "is-finite"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz"; + sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa"; }; }; "is-fullwidth-code-point-1.0.0" = { @@ -1490,6 +4037,78 @@ let sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb"; }; }; + "is-fullwidth-code-point-2.0.0" = { + name = "is-fullwidth-code-point"; + packageName = "is-fullwidth-code-point"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz"; + sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f"; + }; + }; + "is-glob-3.1.0" = { + name = "is-glob"; + packageName = "is-glob"; + version = "3.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz"; + sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a"; + }; + }; + "is-glob-4.0.0" = { + name = "is-glob"; + packageName = "is-glob"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz"; + sha1 = "9521c76845cc2610a85203ddf080a958c2ffabc0"; + }; + }; + "is-number-3.0.0" = { + name = "is-number"; + packageName = "is-number"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz"; + sha1 = "24fd6201a4782cf50561c810276afc7d12d71195"; + }; + }; + "is-plain-obj-1.1.0" = { + name = "is-plain-obj"; + packageName = "is-plain-obj"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz"; + sha1 = "71a50c8429dfca773c92a390a4a03b39fcd51d3e"; + }; + }; + "is-plain-object-2.0.4" = { + name = "is-plain-object"; + packageName = "is-plain-object"; + version = "2.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz"; + sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="; + }; + }; + "is-regex-1.0.4" = { + name = "is-regex"; + packageName = "is-regex"; + version = "1.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz"; + sha1 = "5517489b547091b0930e095654ced25ee97e9491"; + }; + }; + "is-relative-1.0.0" = { + name = "is-relative"; + packageName = "is-relative"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz"; + sha512 = "Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA=="; + }; + }; "is-stream-1.1.0" = { name = "is-stream"; packageName = "is-stream"; @@ -1499,6 +4118,24 @@ let sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"; }; }; + "is-svg-2.1.0" = { + name = "is-svg"; + packageName = "is-svg"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz"; + sha1 = "cf61090da0d9efbcab8722deba6f032208dbb0e9"; + }; + }; + "is-symbol-1.0.2" = { + name = "is-symbol"; + packageName = "is-symbol"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz"; + sha512 = "HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw=="; + }; + }; "is-typedarray-1.0.0" = { name = "is-typedarray"; packageName = "is-typedarray"; @@ -1508,6 +4145,24 @@ let sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a"; }; }; + "is-unc-path-1.0.0" = { + name = "is-unc-path"; + packageName = "is-unc-path"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz"; + sha512 = "mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ=="; + }; + }; + "is-windows-1.0.2" = { + name = "is-windows"; + packageName = "is-windows"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz"; + sha512 = "eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="; + }; + }; "isarray-0.0.1" = { name = "isarray"; packageName = "isarray"; @@ -1535,6 +4190,24 @@ let sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10"; }; }; + "isobject-2.1.0" = { + name = "isobject"; + packageName = "isobject"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz"; + sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89"; + }; + }; + "isobject-3.0.1" = { + name = "isobject"; + packageName = "isobject"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz"; + sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"; + }; + }; "isstream-0.1.2" = { name = "isstream"; packageName = "isstream"; @@ -1553,6 +4226,24 @@ let sha1 = "dd8b74278b27102d29df63eae28308a8cfa1b583"; }; }; + "js-base64-2.4.9" = { + name = "js-base64"; + packageName = "js-base64"; + version = "2.4.9"; + src = fetchurl { + url = "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz"; + sha512 = "xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ=="; + }; + }; + "js-tokens-3.0.2" = { + name = "js-tokens"; + packageName = "js-tokens"; + version = "3.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz"; + sha1 = "9866df395102130e38f7f996bceb65443209c25b"; + }; + }; "js-yaml-2.0.5" = { name = "js-yaml"; packageName = "js-yaml"; @@ -1562,6 +4253,15 @@ let sha1 = "a25ae6509999e97df278c6719da11bd0687743a8"; }; }; + "js-yaml-3.7.0" = { + name = "js-yaml"; + packageName = "js-yaml"; + version = "3.7.0"; + src = fetchurl { + url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz"; + sha1 = "5c967ddd837a9bfdca5f2de84253abe8a1c03b80"; + }; + }; "jsbn-0.1.1" = { name = "jsbn"; packageName = "jsbn"; @@ -1571,6 +4271,24 @@ let sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"; }; }; + "jsesc-0.5.0" = { + name = "jsesc"; + packageName = "jsesc"; + version = "0.5.0"; + src = fetchurl { + url = "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"; + sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d"; + }; + }; + "jsesc-1.3.0" = { + name = "jsesc"; + packageName = "jsesc"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz"; + sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b"; + }; + }; "jshint-2.9.6" = { name = "jshint"; packageName = "jshint"; @@ -1580,6 +4298,15 @@ let sha512 = "KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA=="; }; }; + "json-parse-better-errors-1.0.2" = { + name = "json-parse-better-errors"; + packageName = "json-parse-better-errors"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz"; + sha512 = "mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="; + }; + }; "json-schema-0.2.3" = { name = "json-schema"; packageName = "json-schema"; @@ -1589,6 +4316,15 @@ let sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13"; }; }; + "json-schema-traverse-0.4.1" = { + name = "json-schema-traverse"; + packageName = "json-schema-traverse"; + version = "0.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"; + sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="; + }; + }; "json-stable-stringify-1.0.1" = { name = "json-stable-stringify"; packageName = "json-stable-stringify"; @@ -1607,13 +4343,13 @@ let sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"; }; }; - "jsonfile-1.0.1" = { - name = "jsonfile"; - packageName = "jsonfile"; - version = "1.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/jsonfile/-/jsonfile-1.0.1.tgz"; - sha1 = "ea5efe40b83690b98667614a7392fc60e842c0dd"; + "json5-0.5.1" = { + name = "json5"; + packageName = "json5"; + version = "0.5.1"; + src = fetchurl { + url = "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz"; + sha1 = "1eade7acc012034ad84e2396767ead9fa5495821"; }; }; "jsonfile-2.4.0" = { @@ -1652,6 +4388,42 @@ let sha1 = "79d93d2d33363d6fdd2970b335d9141ad591d79b"; }; }; + "kind-of-3.2.2" = { + name = "kind-of"; + packageName = "kind-of"; + version = "3.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"; + sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64"; + }; + }; + "kind-of-4.0.0" = { + name = "kind-of"; + packageName = "kind-of"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz"; + sha1 = "20813df3d712928b207378691a45066fae72dd57"; + }; + }; + "kind-of-5.1.0" = { + name = "kind-of"; + packageName = "kind-of"; + version = "5.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz"; + sha512 = "NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="; + }; + }; + "kind-of-6.0.2" = { + name = "kind-of"; + packageName = "kind-of"; + version = "6.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz"; + sha512 = "s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="; + }; + }; "klaw-1.3.1" = { name = "klaw"; packageName = "klaw"; @@ -1661,6 +4433,24 @@ let sha1 = "4088433b46b3b1ba259d78785d8e96f73ba02439"; }; }; + "lazy-cache-1.0.4" = { + name = "lazy-cache"; + packageName = "lazy-cache"; + version = "1.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz"; + sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"; + }; + }; + "lcid-2.0.0" = { + name = "lcid"; + packageName = "lcid"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz"; + sha512 = "avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA=="; + }; + }; "less-2.7.3" = { name = "less"; packageName = "less"; @@ -1670,13 +4460,58 @@ let sha512 = "KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ=="; }; }; - "levn-0.3.0" = { - name = "levn"; - packageName = "levn"; - version = "0.3.0"; - src = fetchurl { - url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz"; - sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee"; + "liftoff-2.5.0" = { + name = "liftoff"; + packageName = "liftoff"; + version = "2.5.0"; + src = fetchurl { + url = "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz"; + sha1 = "2009291bb31cea861bbf10a7c15a28caf75c31ec"; + }; + }; + "loader-runner-2.3.1" = { + name = "loader-runner"; + packageName = "loader-runner"; + version = "2.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz"; + sha512 = "By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw=="; + }; + }; + "loader-utils-0.2.17" = { + name = "loader-utils"; + packageName = "loader-utils"; + version = "0.2.17"; + src = fetchurl { + url = "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz"; + sha1 = "f86e6374d43205a6e6c60e9196f17c0299bfb348"; + }; + }; + "loader-utils-1.1.0" = { + name = "loader-utils"; + packageName = "loader-utils"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz"; + sha1 = "c98aef488bcceda2ffb5e2de646d6a754429f5cd"; + }; + }; + "locate-path-2.0.0" = { + name = "locate-path"; + packageName = "locate-path"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz"; + sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"; + }; + }; + "locate-path-3.0.0" = { + name = "locate-path"; + packageName = "locate-path"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz"; + sha512 = "7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="; }; }; "lodash-0.9.2" = { @@ -1706,13 +4541,85 @@ let sha1 = "fadd834b9683073da179b3eae6d9c0d15053f73e"; }; }; - "lodash-4.17.10" = { + "lodash-4.17.11" = { name = "lodash"; packageName = "lodash"; - version = "4.17.10"; - src = fetchurl { - url = "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz"; - sha512 = "UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="; + version = "4.17.11"; + src = fetchurl { + url = "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz"; + sha512 = "cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="; + }; + }; + "lodash.camelcase-4.3.0" = { + name = "lodash.camelcase"; + packageName = "lodash.camelcase"; + version = "4.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz"; + sha1 = "b28aa6288a2b9fc651035c7711f65ab6190331a6"; + }; + }; + "lodash.debounce-4.0.8" = { + name = "lodash.debounce"; + packageName = "lodash.debounce"; + version = "4.0.8"; + src = fetchurl { + url = "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz"; + sha1 = "82d79bff30a67c4005ffd5e2515300ad9ca4d7af"; + }; + }; + "lodash.isplainobject-4.0.6" = { + name = "lodash.isplainobject"; + packageName = "lodash.isplainobject"; + version = "4.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz"; + sha1 = "7c526a52d89b45c45cc690b88163be0497f550cb"; + }; + }; + "lodash.memoize-4.1.2" = { + name = "lodash.memoize"; + packageName = "lodash.memoize"; + version = "4.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz"; + sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe"; + }; + }; + "lodash.uniq-4.5.0" = { + name = "lodash.uniq"; + packageName = "lodash.uniq"; + version = "4.5.0"; + src = fetchurl { + url = "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz"; + sha1 = "d0225373aeb652adc1bc82e4945339a842754773"; + }; + }; + "longest-1.0.1" = { + name = "longest"; + packageName = "longest"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz"; + sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097"; + }; + }; + "loose-envify-1.4.0" = { + name = "loose-envify"; + packageName = "loose-envify"; + version = "1.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"; + sha512 = "lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="; + }; + }; + "lower-case-1.1.4" = { + name = "lower-case"; + packageName = "lower-case"; + version = "1.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz"; + sha1 = "9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"; }; }; "lru-cache-2.7.3" = { @@ -1724,6 +4631,114 @@ let sha1 = "6d4524e8b955f95d4f5b58851ce21dd72fb4e952"; }; }; + "lru-cache-4.1.3" = { + name = "lru-cache"; + packageName = "lru-cache"; + version = "4.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz"; + sha512 = "fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA=="; + }; + }; + "make-dir-1.3.0" = { + name = "make-dir"; + packageName = "make-dir"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz"; + sha512 = "2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ=="; + }; + }; + "make-iterator-1.0.1" = { + name = "make-iterator"; + packageName = "make-iterator"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz"; + sha512 = "pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw=="; + }; + }; + "map-age-cleaner-0.1.2" = { + name = "map-age-cleaner"; + packageName = "map-age-cleaner"; + version = "0.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz"; + sha512 = "UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ=="; + }; + }; + "map-cache-0.2.2" = { + name = "map-cache"; + packageName = "map-cache"; + version = "0.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz"; + sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"; + }; + }; + "map-visit-1.0.0" = { + name = "map-visit"; + packageName = "map-visit"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz"; + sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"; + }; + }; + "math-expression-evaluator-1.2.17" = { + name = "math-expression-evaluator"; + packageName = "math-expression-evaluator"; + version = "1.2.17"; + src = fetchurl { + url = "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz"; + sha1 = "de819fdbcd84dccd8fae59c6aeb79615b9d266ac"; + }; + }; + "md5.js-1.3.5" = { + name = "md5.js"; + packageName = "md5.js"; + version = "1.3.5"; + src = fetchurl { + url = "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz"; + sha512 = "xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="; + }; + }; + "mem-4.0.0" = { + name = "mem"; + packageName = "mem"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz"; + sha512 = "WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA=="; + }; + }; + "memory-fs-0.4.1" = { + name = "memory-fs"; + packageName = "memory-fs"; + version = "0.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz"; + sha1 = "3a9a20b8462523e447cfbc7e8bb80ed667bfc552"; + }; + }; + "micromatch-3.1.10" = { + name = "micromatch"; + packageName = "micromatch"; + version = "3.1.10"; + src = fetchurl { + url = "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz"; + sha512 = "MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg=="; + }; + }; + "miller-rabin-4.0.1" = { + name = "miller-rabin"; + packageName = "miller-rabin"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz"; + sha512 = "115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA=="; + }; + }; "mime-1.6.0" = { name = "mime"; packageName = "mime"; @@ -1733,22 +4748,49 @@ let sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="; }; }; - "mime-db-1.35.0" = { + "mime-db-1.37.0" = { name = "mime-db"; packageName = "mime-db"; - version = "1.35.0"; - src = fetchurl { - url = "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz"; - sha512 = "JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg=="; - }; - }; - "mime-types-2.1.19" = { + version = "1.37.0"; + src = fetchurl { + url = "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz"; + sha512 = "R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="; + }; + }; + "mime-types-2.1.21" = { name = "mime-types"; packageName = "mime-types"; - version = "2.1.19"; - src = fetchurl { - url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz"; - sha512 = "P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw=="; + version = "2.1.21"; + src = fetchurl { + url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz"; + sha512 = "3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg=="; + }; + }; + "mimic-fn-1.2.0" = { + name = "mimic-fn"; + packageName = "mimic-fn"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz"; + sha512 = "jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="; + }; + }; + "minimalistic-assert-1.0.1" = { + name = "minimalistic-assert"; + packageName = "minimalistic-assert"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"; + sha512 = "UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="; + }; + }; + "minimalistic-crypto-utils-1.0.1" = { + name = "minimalistic-crypto-utils"; + packageName = "minimalistic-crypto-utils"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"; + sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"; }; }; "minimatch-0.2.14" = { @@ -1787,31 +4829,22 @@ let sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d"; }; }; - "minipass-2.3.3" = { - name = "minipass"; - packageName = "minipass"; - version = "2.3.3"; - src = fetchurl { - url = "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz"; - sha512 = "/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw=="; - }; - }; - "minizlib-1.1.0" = { - name = "minizlib"; - packageName = "minizlib"; - version = "1.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz"; - sha512 = "4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA=="; - }; - }; - "mkdirp-0.3.5" = { - name = "mkdirp"; - packageName = "mkdirp"; - version = "0.3.5"; - src = fetchurl { - url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz"; - sha1 = "de3e5f8961c88c787ee1368df849ac4413eca8d7"; + "mississippi-2.0.0" = { + name = "mississippi"; + packageName = "mississippi"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz"; + sha512 = "zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw=="; + }; + }; + "mixin-deep-1.3.1" = { + name = "mixin-deep"; + packageName = "mixin-deep"; + version = "1.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz"; + sha512 = "8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ=="; }; }; "mkdirp-0.5.1" = { @@ -1841,6 +4874,15 @@ let sha512 = "jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA=="; }; }; + "move-concurrently-1.0.1" = { + name = "move-concurrently"; + packageName = "move-concurrently"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz"; + sha1 = "be2c005fda32e0b29af1f05d7c4b33214c701f92"; + }; + }; "ms-2.0.0" = { name = "ms"; packageName = "ms"; @@ -1850,31 +4892,58 @@ let sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8"; }; }; - "ncp-0.4.2" = { - name = "ncp"; - packageName = "ncp"; - version = "0.4.2"; - src = fetchurl { - url = "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz"; - sha1 = "abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574"; - }; - }; - "nijs-0.0.25" = { - name = "nijs"; - packageName = "nijs"; - version = "0.0.25"; - src = fetchurl { - url = "https://registry.npmjs.org/nijs/-/nijs-0.0.25.tgz"; - sha1 = "04b035cb530d46859d1018839a518c029133f676"; - }; - }; - "node2nix-1.6.0" = { - name = "node2nix"; - packageName = "node2nix"; - version = "1.6.0"; - src = fetchurl { - url = "https://registry.npmjs.org/node2nix/-/node2nix-1.6.0.tgz"; - sha512 = "MJY6SsQH3pN59R9N3nMz/L8BsbQ0DlvSF38mgg1fwfwgnaJ+y600s3Nd0vZ+cnETUH+4OPETc4QohflccjPUYw=="; + "nan-2.11.1" = { + name = "nan"; + packageName = "nan"; + version = "2.11.1"; + src = fetchurl { + url = "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz"; + sha512 = "iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA=="; + }; + }; + "nanomatch-1.2.13" = { + name = "nanomatch"; + packageName = "nanomatch"; + version = "1.2.13"; + src = fetchurl { + url = "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz"; + sha512 = "fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA=="; + }; + }; + "neo-async-2.6.0" = { + name = "neo-async"; + packageName = "neo-async"; + version = "2.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz"; + sha512 = "MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA=="; + }; + }; + "nice-try-1.0.5" = { + name = "nice-try"; + packageName = "nice-try"; + version = "1.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz"; + sha512 = "1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="; + }; + }; + "no-case-2.3.2" = { + name = "no-case"; + packageName = "no-case"; + version = "2.3.2"; + src = fetchurl { + url = "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz"; + sha512 = "rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ=="; + }; + }; + "node-libs-browser-2.1.0" = { + name = "node-libs-browser"; + packageName = "node-libs-browser"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz"; + sha512 = "5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg=="; }; }; "nopt-1.0.10" = { @@ -1895,13 +4964,13 @@ let sha1 = "ca7416f20a5e3f9c3b86180f96295fa3d0b52e0d"; }; }; - "nopt-3.0.6" = { + "nopt-4.0.1" = { name = "nopt"; packageName = "nopt"; - version = "3.0.6"; - src = fetchurl { - url = "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz"; - sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz"; + sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d"; }; }; "noptify-0.0.3" = { @@ -1913,49 +4982,58 @@ let sha1 = "58f654a73d9753df0c51d9686dc92104a67f4bbb"; }; }; - "normalize-package-data-2.4.0" = { - name = "normalize-package-data"; - packageName = "normalize-package-data"; - version = "2.4.0"; - src = fetchurl { - url = "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz"; - sha512 = "9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw=="; - }; - }; - "npm-package-arg-6.1.0" = { - name = "npm-package-arg"; - packageName = "npm-package-arg"; - version = "6.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz"; - sha512 = "zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA=="; - }; - }; - "npm-registry-client-8.5.1" = { - name = "npm-registry-client"; - packageName = "npm-registry-client"; - version = "8.5.1"; - src = fetchurl { - url = "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.5.1.tgz"; - sha512 = "7rjGF2eA7hKDidGyEWmHTiKfXkbrcQAsGL/Rh4Rt3x3YNRNHhwaTzVJfW3aNvvlhg4G62VCluif0sLCb/i51Hg=="; - }; - }; - "npmconf-2.1.3" = { - name = "npmconf"; - packageName = "npmconf"; - version = "2.1.3"; - src = fetchurl { - url = "https://registry.npmjs.org/npmconf/-/npmconf-2.1.3.tgz"; - sha512 = "iTK+HI68GceCoGOHAQiJ/ik1iDfI7S+cgyG8A+PP18IU3X83kRhQIRhAUNj4Bp2JMx6Zrt5kCiozYa9uGWTjhA=="; - }; - }; - "npmlog-4.1.2" = { - name = "npmlog"; - packageName = "npmlog"; - version = "4.1.2"; - src = fetchurl { - url = "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz"; - sha512 = "2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="; + "normalize-path-2.1.1" = { + name = "normalize-path"; + packageName = "normalize-path"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz"; + sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"; + }; + }; + "normalize-range-0.1.2" = { + name = "normalize-range"; + packageName = "normalize-range"; + version = "0.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz"; + sha1 = "2d10c06bdfd312ea9777695a4d28439456b75942"; + }; + }; + "normalize-url-1.9.1" = { + name = "normalize-url"; + packageName = "normalize-url"; + version = "1.9.1"; + src = fetchurl { + url = "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz"; + sha1 = "2cc0d66b31ea23036458436e3620d85954c66c3c"; + }; + }; + "npm-run-path-2.0.2" = { + name = "npm-run-path"; + packageName = "npm-run-path"; + version = "2.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz"; + sha1 = "35a9232dfa35d7067b4cb2ddf2357b1871536c5f"; + }; + }; + "nth-check-1.0.2" = { + name = "nth-check"; + packageName = "nth-check"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz"; + sha512 = "WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg=="; + }; + }; + "num2fraction-1.2.2" = { + name = "num2fraction"; + packageName = "num2fraction"; + version = "1.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz"; + sha1 = "6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"; }; }; "number-is-nan-1.0.1" = { @@ -1985,13 +5063,67 @@ let sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863"; }; }; - "once-1.3.3" = { - name = "once"; - packageName = "once"; - version = "1.3.3"; - src = fetchurl { - url = "https://registry.npmjs.org/once/-/once-1.3.3.tgz"; - sha1 = "b2e261557ce4c314ec8304f3fa82663e4297ca20"; + "object-copy-0.1.0" = { + name = "object-copy"; + packageName = "object-copy"; + version = "0.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz"; + sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c"; + }; + }; + "object-keys-1.0.12" = { + name = "object-keys"; + packageName = "object-keys"; + version = "1.0.12"; + src = fetchurl { + url = "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz"; + sha512 = "FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag=="; + }; + }; + "object-visit-1.0.1" = { + name = "object-visit"; + packageName = "object-visit"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz"; + sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb"; + }; + }; + "object.defaults-1.1.0" = { + name = "object.defaults"; + packageName = "object.defaults"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz"; + sha1 = "3a7f868334b407dea06da16d88d5cd29e435fecf"; + }; + }; + "object.getownpropertydescriptors-2.0.3" = { + name = "object.getownpropertydescriptors"; + packageName = "object.getownpropertydescriptors"; + version = "2.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz"; + sha1 = "8758c846f5b407adab0f236e0986f14b051caa16"; + }; + }; + "object.map-1.0.1" = { + name = "object.map"; + packageName = "object.map"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz"; + sha1 = "cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"; + }; + }; + "object.pick-1.3.0" = { + name = "object.pick"; + packageName = "object.pick"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz"; + sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747"; }; }; "once-1.4.0" = { @@ -2003,22 +5135,13 @@ let sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1"; }; }; - "optionator-0.8.2" = { - name = "optionator"; - packageName = "optionator"; - version = "0.8.2"; - src = fetchurl { - url = "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz"; - sha1 = "364c5e409d3f4d6301d6c0b4c05bba50180aeb64"; - }; - }; - "optparse-1.0.5" = { - name = "optparse"; - packageName = "optparse"; - version = "1.0.5"; - src = fetchurl { - url = "https://registry.npmjs.org/optparse/-/optparse-1.0.5.tgz"; - sha1 = "75e75a96506611eb1c65ba89018ff08a981e2c16"; + "os-browserify-0.3.0" = { + name = "os-browserify"; + packageName = "os-browserify"; + version = "0.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz"; + sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27"; }; }; "os-homedir-1.0.2" = { @@ -2030,6 +5153,15 @@ let sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3"; }; }; + "os-locale-3.0.1" = { + name = "os-locale"; + packageName = "os-locale"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz"; + sha512 = "7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw=="; + }; + }; "os-tmpdir-1.0.2" = { name = "os-tmpdir"; packageName = "os-tmpdir"; @@ -2048,13 +5180,202 @@ let sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g=="; }; }; - "parse5-1.5.1" = { + "p-defer-1.0.0" = { + name = "p-defer"; + packageName = "p-defer"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz"; + sha1 = "9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"; + }; + }; + "p-finally-1.0.0" = { + name = "p-finally"; + packageName = "p-finally"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz"; + sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae"; + }; + }; + "p-is-promise-1.1.0" = { + name = "p-is-promise"; + packageName = "p-is-promise"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz"; + sha1 = "9c9456989e9f6588017b0434d56097675c3da05e"; + }; + }; + "p-limit-1.3.0" = { + name = "p-limit"; + packageName = "p-limit"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz"; + sha512 = "vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q=="; + }; + }; + "p-limit-2.0.0" = { + name = "p-limit"; + packageName = "p-limit"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz"; + sha512 = "fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A=="; + }; + }; + "p-locate-2.0.0" = { + name = "p-locate"; + packageName = "p-locate"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz"; + sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43"; + }; + }; + "p-locate-3.0.0" = { + name = "p-locate"; + packageName = "p-locate"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz"; + sha512 = "x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="; + }; + }; + "p-try-1.0.0" = { + name = "p-try"; + packageName = "p-try"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz"; + sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"; + }; + }; + "p-try-2.0.0" = { + name = "p-try"; + packageName = "p-try"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz"; + sha512 = "hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ=="; + }; + }; + "pako-1.0.6" = { + name = "pako"; + packageName = "pako"; + version = "1.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz"; + sha512 = "lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg=="; + }; + }; + "parallel-transform-1.1.0" = { + name = "parallel-transform"; + packageName = "parallel-transform"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz"; + sha1 = "d410f065b05da23081fcd10f28854c29bda33b06"; + }; + }; + "param-case-2.1.1" = { + name = "param-case"; + packageName = "param-case"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz"; + sha1 = "df94fd8cf6531ecf75e6bef9a0858fbc72be2247"; + }; + }; + "parse-asn1-5.1.1" = { + name = "parse-asn1"; + packageName = "parse-asn1"; + version = "5.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz"; + sha512 = "KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw=="; + }; + }; + "parse-filepath-1.0.2" = { + name = "parse-filepath"; + packageName = "parse-filepath"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz"; + sha1 = "a632127f53aaf3d15876f5872f3ffac763d6c891"; + }; + }; + "parse-passwd-1.0.0" = { + name = "parse-passwd"; + packageName = "parse-passwd"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz"; + sha1 = "6d5b934a456993b23d37f40a382d6f1666a8e5c6"; + }; + }; + "parse5-2.2.3" = { name = "parse5"; packageName = "parse5"; - version = "1.5.1"; - src = fetchurl { - url = "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz"; - sha1 = "9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"; + version = "2.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz"; + sha1 = "0c4fc41c1000c5e6b93d48b03f8083837834e9f6"; + }; + }; + "parse5-3.0.3" = { + name = "parse5"; + packageName = "parse5"; + version = "3.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz"; + sha512 = "rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA=="; + }; + }; + "parse5-utils-2.0.0" = { + name = "parse5-utils"; + packageName = "parse5-utils"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/parse5-utils/-/parse5-utils-2.0.0.tgz"; + sha1 = "c926c1764e2431a450a5941f302db9beaec9d78a"; + }; + }; + "pascalcase-0.1.1" = { + name = "pascalcase"; + packageName = "pascalcase"; + version = "0.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz"; + sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14"; + }; + }; + "path-browserify-0.0.0" = { + name = "path-browserify"; + packageName = "path-browserify"; + version = "0.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz"; + sha1 = "a0b870729aae214005b7d5032ec2cbbb0fb4451a"; + }; + }; + "path-dirname-1.0.2" = { + name = "path-dirname"; + packageName = "path-dirname"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz"; + sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0"; + }; + }; + "path-exists-3.0.0" = { + name = "path-exists"; + packageName = "path-exists"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz"; + sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"; }; }; "path-is-absolute-1.0.1" = { @@ -2066,13 +5387,58 @@ let sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"; }; }; - "path-posix-1.0.0" = { - name = "path-posix"; - packageName = "path-posix"; - version = "1.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz"; - sha1 = "06b26113f56beab042545a23bfa88003ccac260f"; + "path-key-2.0.1" = { + name = "path-key"; + packageName = "path-key"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz"; + sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40"; + }; + }; + "path-parse-1.0.6" = { + name = "path-parse"; + packageName = "path-parse"; + version = "1.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz"; + sha512 = "GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="; + }; + }; + "path-root-0.1.1" = { + name = "path-root"; + packageName = "path-root"; + version = "0.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz"; + sha1 = "9a4a6814cac1c0cd73360a95f32083c8ea4745b7"; + }; + }; + "path-root-regex-0.1.2" = { + name = "path-root-regex"; + packageName = "path-root-regex"; + version = "0.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz"; + sha1 = "bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"; + }; + }; + "path-type-3.0.0" = { + name = "path-type"; + packageName = "path-type"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz"; + sha512 = "T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg=="; + }; + }; + "pbkdf2-3.0.17" = { + name = "pbkdf2"; + packageName = "pbkdf2"; + version = "3.0.17"; + src = fetchurl { + url = "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz"; + sha512 = "U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA=="; }; }; "pend-1.2.0" = { @@ -2111,6 +5477,15 @@ let sha1 = "efd212a4a3966d3647684ea8ba788549be2aefef"; }; }; + "pify-3.0.0" = { + name = "pify"; + packageName = "pify"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz"; + sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"; + }; + }; "pinkie-2.0.4" = { name = "pinkie"; packageName = "pinkie"; @@ -2129,13 +5504,382 @@ let sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa"; }; }; - "prelude-ls-1.1.2" = { - name = "prelude-ls"; - packageName = "prelude-ls"; - version = "1.1.2"; - src = fetchurl { - url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz"; - sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54"; + "pkg-dir-2.0.0" = { + name = "pkg-dir"; + packageName = "pkg-dir"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz"; + sha1 = "f6d5d1109e19d63edf428e0bd57e12777615334b"; + }; + }; + "pkg-dir-3.0.0" = { + name = "pkg-dir"; + packageName = "pkg-dir"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz"; + sha512 = "/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw=="; + }; + }; + "polymer-webpack-loader-2.0.3" = { + name = "polymer-webpack-loader"; + packageName = "polymer-webpack-loader"; + version = "2.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/polymer-webpack-loader/-/polymer-webpack-loader-2.0.3.tgz"; + sha512 = "3SR+/qVAGeVKltvsSMA+euGdLwj8ZZJnwd5NvXRvbdQ7yO57sdcTpRw3d34pTc9YTZxncW/kozuI/9bHjr/rdg=="; + }; + }; + "posix-character-classes-0.1.1" = { + name = "posix-character-classes"; + packageName = "posix-character-classes"; + version = "0.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz"; + sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"; + }; + }; + "postcss-5.2.18" = { + name = "postcss"; + packageName = "postcss"; + version = "5.2.18"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz"; + sha512 = "zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg=="; + }; + }; + "postcss-6.0.23" = { + name = "postcss"; + packageName = "postcss"; + version = "6.0.23"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz"; + sha512 = "soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag=="; + }; + }; + "postcss-calc-5.3.1" = { + name = "postcss-calc"; + packageName = "postcss-calc"; + version = "5.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz"; + sha1 = "77bae7ca928ad85716e2fda42f261bf7c1d65b5e"; + }; + }; + "postcss-colormin-2.2.2" = { + name = "postcss-colormin"; + packageName = "postcss-colormin"; + version = "2.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz"; + sha1 = "6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"; + }; + }; + "postcss-convert-values-2.6.1" = { + name = "postcss-convert-values"; + packageName = "postcss-convert-values"; + version = "2.6.1"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz"; + sha1 = "bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"; + }; + }; + "postcss-discard-comments-2.0.4" = { + name = "postcss-discard-comments"; + packageName = "postcss-discard-comments"; + version = "2.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz"; + sha1 = "befe89fafd5b3dace5ccce51b76b81514be00e3d"; + }; + }; + "postcss-discard-duplicates-2.1.0" = { + name = "postcss-discard-duplicates"; + packageName = "postcss-discard-duplicates"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz"; + sha1 = "b9abf27b88ac188158a5eb12abcae20263b91932"; + }; + }; + "postcss-discard-empty-2.1.0" = { + name = "postcss-discard-empty"; + packageName = "postcss-discard-empty"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz"; + sha1 = "d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"; + }; + }; + "postcss-discard-overridden-0.1.1" = { + name = "postcss-discard-overridden"; + packageName = "postcss-discard-overridden"; + version = "0.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz"; + sha1 = "8b1eaf554f686fb288cd874c55667b0aa3668d58"; + }; + }; + "postcss-discard-unused-2.2.3" = { + name = "postcss-discard-unused"; + packageName = "postcss-discard-unused"; + version = "2.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz"; + sha1 = "bce30b2cc591ffc634322b5fb3464b6d934f4433"; + }; + }; + "postcss-filter-plugins-2.0.3" = { + name = "postcss-filter-plugins"; + packageName = "postcss-filter-plugins"; + version = "2.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz"; + sha512 = "T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ=="; + }; + }; + "postcss-merge-idents-2.1.7" = { + name = "postcss-merge-idents"; + packageName = "postcss-merge-idents"; + version = "2.1.7"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz"; + sha1 = "4c5530313c08e1d5b3bbf3d2bbc747e278eea270"; + }; + }; + "postcss-merge-longhand-2.0.2" = { + name = "postcss-merge-longhand"; + packageName = "postcss-merge-longhand"; + version = "2.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz"; + sha1 = "23d90cd127b0a77994915332739034a1a4f3d658"; + }; + }; + "postcss-merge-rules-2.1.2" = { + name = "postcss-merge-rules"; + packageName = "postcss-merge-rules"; + version = "2.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz"; + sha1 = "d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"; + }; + }; + "postcss-message-helpers-2.0.0" = { + name = "postcss-message-helpers"; + packageName = "postcss-message-helpers"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz"; + sha1 = "a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"; + }; + }; + "postcss-minify-font-values-1.0.5" = { + name = "postcss-minify-font-values"; + packageName = "postcss-minify-font-values"; + version = "1.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz"; + sha1 = "4b58edb56641eba7c8474ab3526cafd7bbdecb69"; + }; + }; + "postcss-minify-gradients-1.0.5" = { + name = "postcss-minify-gradients"; + packageName = "postcss-minify-gradients"; + version = "1.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz"; + sha1 = "5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"; + }; + }; + "postcss-minify-params-1.2.2" = { + name = "postcss-minify-params"; + packageName = "postcss-minify-params"; + version = "1.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz"; + sha1 = "ad2ce071373b943b3d930a3fa59a358c28d6f1f3"; + }; + }; + "postcss-minify-selectors-2.1.1" = { + name = "postcss-minify-selectors"; + packageName = "postcss-minify-selectors"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz"; + sha1 = "b2c6a98c0072cf91b932d1a496508114311735bf"; + }; + }; + "postcss-modules-extract-imports-1.2.0" = { + name = "postcss-modules-extract-imports"; + packageName = "postcss-modules-extract-imports"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz"; + sha1 = "66140ecece38ef06bf0d3e355d69bf59d141ea85"; + }; + }; + "postcss-modules-local-by-default-1.2.0" = { + name = "postcss-modules-local-by-default"; + packageName = "postcss-modules-local-by-default"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz"; + sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069"; + }; + }; + "postcss-modules-scope-1.1.0" = { + name = "postcss-modules-scope"; + packageName = "postcss-modules-scope"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz"; + sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90"; + }; + }; + "postcss-modules-values-1.3.0" = { + name = "postcss-modules-values"; + packageName = "postcss-modules-values"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz"; + sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20"; + }; + }; + "postcss-normalize-charset-1.1.1" = { + name = "postcss-normalize-charset"; + packageName = "postcss-normalize-charset"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz"; + sha1 = "ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"; + }; + }; + "postcss-normalize-url-3.0.8" = { + name = "postcss-normalize-url"; + packageName = "postcss-normalize-url"; + version = "3.0.8"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz"; + sha1 = "108f74b3f2fcdaf891a2ffa3ea4592279fc78222"; + }; + }; + "postcss-ordered-values-2.2.3" = { + name = "postcss-ordered-values"; + packageName = "postcss-ordered-values"; + version = "2.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz"; + sha1 = "eec6c2a67b6c412a8db2042e77fe8da43f95c11d"; + }; + }; + "postcss-reduce-idents-2.4.0" = { + name = "postcss-reduce-idents"; + packageName = "postcss-reduce-idents"; + version = "2.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz"; + sha1 = "c2c6d20cc958284f6abfbe63f7609bf409059ad3"; + }; + }; + "postcss-reduce-initial-1.0.1" = { + name = "postcss-reduce-initial"; + packageName = "postcss-reduce-initial"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz"; + sha1 = "68f80695f045d08263a879ad240df8dd64f644ea"; + }; + }; + "postcss-reduce-transforms-1.0.4" = { + name = "postcss-reduce-transforms"; + packageName = "postcss-reduce-transforms"; + version = "1.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz"; + sha1 = "ff76f4d8212437b31c298a42d2e1444025771ae1"; + }; + }; + "postcss-selector-parser-2.2.3" = { + name = "postcss-selector-parser"; + packageName = "postcss-selector-parser"; + version = "2.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz"; + sha1 = "f9437788606c3c9acee16ffe8d8b16297f27bb90"; + }; + }; + "postcss-svgo-2.1.6" = { + name = "postcss-svgo"; + packageName = "postcss-svgo"; + version = "2.1.6"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz"; + sha1 = "b6df18aa613b666e133f08adb5219c2684ac108d"; + }; + }; + "postcss-unique-selectors-2.0.2" = { + name = "postcss-unique-selectors"; + packageName = "postcss-unique-selectors"; + version = "2.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz"; + sha1 = "981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"; + }; + }; + "postcss-value-parser-3.3.1" = { + name = "postcss-value-parser"; + packageName = "postcss-value-parser"; + version = "3.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz"; + sha512 = "pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="; + }; + }; + "postcss-zindex-2.2.0" = { + name = "postcss-zindex"; + packageName = "postcss-zindex"; + version = "2.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz"; + sha1 = "d2109ddc055b91af67fc4cb3b025946639d2af22"; + }; + }; + "prepend-http-1.0.4" = { + name = "prepend-http"; + packageName = "prepend-http"; + version = "1.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz"; + sha1 = "d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"; + }; + }; + "pretty-error-2.1.1" = { + name = "pretty-error"; + packageName = "pretty-error"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz"; + sha1 = "5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"; + }; + }; + "private-0.1.8" = { + name = "private"; + packageName = "private"; + version = "0.1.8"; + src = fetchurl { + url = "https://registry.npmjs.org/private/-/private-0.1.8.tgz"; + sha512 = "VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="; + }; + }; + "process-0.11.10" = { + name = "process"; + packageName = "process"; + version = "0.11.10"; + src = fetchurl { + url = "https://registry.npmjs.org/process/-/process-0.11.10.tgz"; + sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182"; }; }; "process-nextick-args-2.0.0" = { @@ -2165,13 +5909,13 @@ let sha512 = "nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="; }; }; - "proto-list-1.2.4" = { - name = "proto-list"; - packageName = "proto-list"; - version = "1.2.4"; - src = fetchurl { - url = "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz"; - sha1 = "212d5bfe1318306a420f6402b8e26ff39647a849"; + "promise-inflight-1.0.1" = { + name = "promise-inflight"; + packageName = "promise-inflight"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz"; + sha1 = "98472870bf228132fcbdd868129bad12c3c029e3"; }; }; "prr-1.0.1" = { @@ -2183,6 +5927,51 @@ let sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476"; }; }; + "pseudomap-1.0.2" = { + name = "pseudomap"; + packageName = "pseudomap"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz"; + sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3"; + }; + }; + "public-encrypt-4.0.3" = { + name = "public-encrypt"; + packageName = "public-encrypt"; + version = "4.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz"; + sha512 = "zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q=="; + }; + }; + "pump-2.0.1" = { + name = "pump"; + packageName = "pump"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz"; + sha512 = "ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA=="; + }; + }; + "pumpify-1.5.1" = { + name = "pumpify"; + packageName = "pumpify"; + version = "1.5.1"; + src = fetchurl { + url = "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz"; + sha512 = "oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ=="; + }; + }; + "punycode-1.3.2" = { + name = "punycode"; + packageName = "punycode"; + version = "1.3.2"; + src = fetchurl { + url = "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"; + sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d"; + }; + }; "punycode-1.4.1" = { name = "punycode"; packageName = "punycode"; @@ -2192,6 +5981,24 @@ let sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"; }; }; + "punycode-2.1.1" = { + name = "punycode"; + packageName = "punycode"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"; + sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="; + }; + }; + "q-1.5.1" = { + name = "q"; + packageName = "q"; + version = "1.5.1"; + src = fetchurl { + url = "https://registry.npmjs.org/q/-/q-1.5.1.tgz"; + sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7"; + }; + }; "qrious-4.0.2" = { name = "qrious"; packageName = "qrious"; @@ -2219,6 +6026,69 @@ let sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233"; }; }; + "query-string-4.3.4" = { + name = "query-string"; + packageName = "query-string"; + version = "4.3.4"; + src = fetchurl { + url = "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz"; + sha1 = "bbb693b9ca915c232515b228b1a02b609043dbeb"; + }; + }; + "querystring-0.2.0" = { + name = "querystring"; + packageName = "querystring"; + version = "0.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz"; + sha1 = "b209849203bb25df820da756e747005878521620"; + }; + }; + "querystring-es3-0.2.1" = { + name = "querystring-es3"; + packageName = "querystring-es3"; + version = "0.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz"; + sha1 = "9ec61f79049875707d69414596fd907a4d711e73"; + }; + }; + "randombytes-2.0.6" = { + name = "randombytes"; + packageName = "randombytes"; + version = "2.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz"; + sha512 = "CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A=="; + }; + }; + "randomfill-1.0.4" = { + name = "randomfill"; + packageName = "randomfill"; + version = "1.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz"; + sha512 = "87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw=="; + }; + }; + "raw-loader-1.0.0-beta.0" = { + name = "raw-loader"; + packageName = "raw-loader"; + version = "1.0.0-beta.0"; + src = fetchurl { + url = "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0-beta.0.tgz"; + sha512 = "guh4ZNAf96f+CDwfnPbFeFiO5YcfPllUmZrgcoOmx6iqZPq+DcKbnyjPuBxEAtQ3tqqd++qChsQfQB+VBzFT0Q=="; + }; + }; + "readable-stream-1.0.34" = { + name = "readable-stream"; + packageName = "readable-stream"; + version = "1.0.34"; + src = fetchurl { + url = "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz"; + sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c"; + }; + }; "readable-stream-1.1.14" = { name = "readable-stream"; packageName = "readable-stream"; @@ -2237,22 +6107,58 @@ let sha512 = "tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw=="; }; }; - "reduce-flatten-1.0.1" = { - name = "reduce-flatten"; - packageName = "reduce-flatten"; - version = "1.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz"; - sha1 = "258c78efd153ddf93cb561237f61184f3696e327"; - }; - }; - "regenerator-runtime-0.10.5" = { - name = "regenerator-runtime"; - packageName = "regenerator-runtime"; - version = "0.10.5"; - src = fetchurl { - url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz"; - sha1 = "336c3efc1220adcedda2c9fab67b5a7955a33658"; + "readdirp-2.2.1" = { + name = "readdirp"; + packageName = "readdirp"; + version = "2.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz"; + sha512 = "1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ=="; + }; + }; + "recast-0.11.23" = { + name = "recast"; + packageName = "recast"; + version = "0.11.23"; + src = fetchurl { + url = "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz"; + sha1 = "451fd3004ab1e4df9b4e4b66376b2a21912462d3"; + }; + }; + "rechoir-0.6.2" = { + name = "rechoir"; + packageName = "rechoir"; + version = "0.6.2"; + src = fetchurl { + url = "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz"; + sha1 = "85204b54dba82d5742e28c96756ef43af50e3384"; + }; + }; + "reduce-css-calc-1.3.0" = { + name = "reduce-css-calc"; + packageName = "reduce-css-calc"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz"; + sha1 = "747c914e049614a4c9cfbba629871ad1d2927716"; + }; + }; + "reduce-function-call-1.0.2" = { + name = "reduce-function-call"; + packageName = "reduce-function-call"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz"; + sha1 = "5a200bf92e0e37751752fe45b0ab330fd4b6be99"; + }; + }; + "regenerate-1.4.0" = { + name = "regenerate"; + packageName = "regenerate"; + version = "1.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz"; + sha512 = "1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="; }; }; "regenerator-runtime-0.11.1" = { @@ -2264,6 +6170,114 @@ let sha512 = "MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="; }; }; + "regenerator-transform-0.10.1" = { + name = "regenerator-transform"; + packageName = "regenerator-transform"; + version = "0.10.1"; + src = fetchurl { + url = "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz"; + sha512 = "PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q=="; + }; + }; + "regex-not-1.0.2" = { + name = "regex-not"; + packageName = "regex-not"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz"; + sha512 = "J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A=="; + }; + }; + "regexpu-core-1.0.0" = { + name = "regexpu-core"; + packageName = "regexpu-core"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz"; + sha1 = "86a763f58ee4d7c2f6b102e4764050de7ed90c6b"; + }; + }; + "regexpu-core-2.0.0" = { + name = "regexpu-core"; + packageName = "regexpu-core"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz"; + sha1 = "49d038837b8dcf8bfa5b9a42139938e6ea2ae240"; + }; + }; + "regjsgen-0.2.0" = { + name = "regjsgen"; + packageName = "regjsgen"; + version = "0.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz"; + sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7"; + }; + }; + "regjsparser-0.1.5" = { + name = "regjsparser"; + packageName = "regjsparser"; + version = "0.1.5"; + src = fetchurl { + url = "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz"; + sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"; + }; + }; + "relateurl-0.2.7" = { + name = "relateurl"; + packageName = "relateurl"; + version = "0.2.7"; + src = fetchurl { + url = "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz"; + sha1 = "54dbf377e51440aca90a4cd274600d3ff2d888a9"; + }; + }; + "remove-trailing-separator-1.1.0" = { + name = "remove-trailing-separator"; + packageName = "remove-trailing-separator"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz"; + sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef"; + }; + }; + "renderkid-2.0.2" = { + name = "renderkid"; + packageName = "renderkid"; + version = "2.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz"; + sha512 = "FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg=="; + }; + }; + "repeat-element-1.1.3" = { + name = "repeat-element"; + packageName = "repeat-element"; + version = "1.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz"; + sha512 = "ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="; + }; + }; + "repeat-string-1.6.1" = { + name = "repeat-string"; + packageName = "repeat-string"; + version = "1.6.1"; + src = fetchurl { + url = "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"; + sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637"; + }; + }; + "repeating-2.0.1" = { + name = "repeating"; + packageName = "repeating"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz"; + sha1 = "5214c53a926d3552707527fbab415dbc08d06dda"; + }; + }; "request-2.81.0" = { name = "request"; packageName = "request"; @@ -2282,13 +6296,85 @@ let sha1 = "5d36bb57961c673aa5b788dbc8141fdf23b44e08"; }; }; - "retry-0.10.1" = { - name = "retry"; - packageName = "retry"; - version = "0.10.1"; - src = fetchurl { - url = "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz"; - sha1 = "e76388d217992c252750241d3d3956fed98d8ff4"; + "require-directory-2.1.1" = { + name = "require-directory"; + packageName = "require-directory"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"; + sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"; + }; + }; + "require-main-filename-1.0.1" = { + name = "require-main-filename"; + packageName = "require-main-filename"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz"; + sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1"; + }; + }; + "resolve-1.8.1" = { + name = "resolve"; + packageName = "resolve"; + version = "1.8.1"; + src = fetchurl { + url = "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz"; + sha512 = "AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA=="; + }; + }; + "resolve-cwd-2.0.0" = { + name = "resolve-cwd"; + packageName = "resolve-cwd"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz"; + sha1 = "00a9f7387556e27038eae232caa372a6a59b665a"; + }; + }; + "resolve-dir-1.0.1" = { + name = "resolve-dir"; + packageName = "resolve-dir"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz"; + sha1 = "79a40644c362be82f26effe739c9bb5382046f43"; + }; + }; + "resolve-from-3.0.0" = { + name = "resolve-from"; + packageName = "resolve-from"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz"; + sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748"; + }; + }; + "resolve-url-0.2.1" = { + name = "resolve-url"; + packageName = "resolve-url"; + version = "0.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz"; + sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a"; + }; + }; + "ret-0.1.15" = { + name = "ret"; + packageName = "ret"; + version = "0.1.15"; + src = fetchurl { + url = "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz"; + sha512 = "TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="; + }; + }; + "right-align-0.1.3" = { + name = "right-align"; + packageName = "right-align"; + version = "0.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz"; + sha1 = "61339b722fe6a3515689210d24e14c96148613ef"; }; }; "rimraf-2.2.8" = { @@ -2300,6 +6386,33 @@ let sha1 = "e439be2aaee327321952730f99a8929e4fc50582"; }; }; + "rimraf-2.6.2" = { + name = "rimraf"; + packageName = "rimraf"; + version = "2.6.2"; + src = fetchurl { + url = "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz"; + sha512 = "lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w=="; + }; + }; + "ripemd160-2.0.2" = { + name = "ripemd160"; + packageName = "ripemd160"; + version = "2.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz"; + sha512 = "ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA=="; + }; + }; + "run-queue-1.0.3" = { + name = "run-queue"; + packageName = "run-queue"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz"; + sha1 = "e848396f057d223f24386924618e25694161ec47"; + }; + }; "safe-buffer-5.1.2" = { name = "safe-buffer"; packageName = "safe-buffer"; @@ -2309,6 +6422,15 @@ let sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="; }; }; + "safe-regex-1.1.0" = { + name = "safe-regex"; + packageName = "safe-regex"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz"; + sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e"; + }; + }; "safer-buffer-2.1.2" = { name = "safer-buffer"; packageName = "safer-buffer"; @@ -2318,6 +6440,24 @@ let sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="; }; }; + "sax-1.2.4" = { + name = "sax"; + packageName = "sax"; + version = "1.2.4"; + src = fetchurl { + url = "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz"; + sha512 = "NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="; + }; + }; + "schema-utils-0.4.7" = { + name = "schema-utils"; + packageName = "schema-utils"; + version = "0.4.7"; + src = fetchurl { + url = "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz"; + sha512 = "v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ=="; + }; + }; "select-1.1.2" = { name = "select"; packageName = "select"; @@ -2327,22 +6467,22 @@ let sha1 = "0e7350acdec80b1108528786ec1d4418d11b396d"; }; }; - "semver-4.3.6" = { + "semver-5.6.0" = { name = "semver"; packageName = "semver"; - version = "4.3.6"; - src = fetchurl { - url = "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz"; - sha1 = "300bc6e0e86374f7ba61068b5b1ecd57fc6532da"; - }; - }; - "semver-5.5.0" = { - name = "semver"; - packageName = "semver"; - version = "5.5.0"; - src = fetchurl { - url = "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz"; - sha512 = "4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="; + version = "5.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz"; + sha512 = "RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="; + }; + }; + "serialize-javascript-1.5.0" = { + name = "serialize-javascript"; + packageName = "serialize-javascript"; + version = "1.5.0"; + src = fetchurl { + url = "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz"; + sha512 = "Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ=="; }; }; "set-blocking-2.0.0" = { @@ -2354,6 +6494,60 @@ let sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7"; }; }; + "set-value-0.4.3" = { + name = "set-value"; + packageName = "set-value"; + version = "0.4.3"; + src = fetchurl { + url = "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz"; + sha1 = "7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"; + }; + }; + "set-value-2.0.0" = { + name = "set-value"; + packageName = "set-value"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz"; + sha512 = "hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg=="; + }; + }; + "setimmediate-1.0.5" = { + name = "setimmediate"; + packageName = "setimmediate"; + version = "1.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz"; + sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285"; + }; + }; + "sha.js-2.4.11" = { + name = "sha.js"; + packageName = "sha.js"; + version = "2.4.11"; + src = fetchurl { + url = "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz"; + sha512 = "QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ=="; + }; + }; + "shebang-command-1.2.0" = { + name = "shebang-command"; + packageName = "shebang-command"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz"; + sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea"; + }; + }; + "shebang-regex-1.0.0" = { + name = "shebang-regex"; + packageName = "shebang-regex"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz"; + sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3"; + }; + }; "shelljs-0.3.0" = { name = "shelljs"; packageName = "shelljs"; @@ -2381,22 +6575,40 @@ let sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d"; }; }; - "slasp-0.0.4" = { - name = "slasp"; - packageName = "slasp"; - version = "0.0.4"; - src = fetchurl { - url = "https://registry.npmjs.org/slasp/-/slasp-0.0.4.tgz"; - sha1 = "9adc26ee729a0f95095851a5489f87a5258d57a9"; - }; - }; - "slide-1.1.6" = { - name = "slide"; - packageName = "slide"; - version = "1.1.6"; - src = fetchurl { - url = "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz"; - sha1 = "56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"; + "slash-1.0.0" = { + name = "slash"; + packageName = "slash"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz"; + sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"; + }; + }; + "snapdragon-0.8.2" = { + name = "snapdragon"; + packageName = "snapdragon"; + version = "0.8.2"; + src = fetchurl { + url = "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz"; + sha512 = "FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg=="; + }; + }; + "snapdragon-node-2.1.1" = { + name = "snapdragon-node"; + packageName = "snapdragon-node"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz"; + sha512 = "O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw=="; + }; + }; + "snapdragon-util-3.0.1" = { + name = "snapdragon-util"; + packageName = "snapdragon-util"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz"; + sha512 = "mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ=="; }; }; "sntp-1.0.9" = { @@ -2408,6 +6620,33 @@ let sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198"; }; }; + "sort-keys-1.1.2" = { + name = "sort-keys"; + packageName = "sort-keys"; + version = "1.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz"; + sha1 = "441b6d4d346798f1b4e49e8920adfba0e543f9ad"; + }; + }; + "source-list-map-0.1.8" = { + name = "source-list-map"; + packageName = "source-list-map"; + version = "0.1.8"; + src = fetchurl { + url = "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz"; + sha1 = "c550b2ab5427f6b3f21f5afead88c4f5587b2106"; + }; + }; + "source-list-map-2.0.1" = { + name = "source-list-map"; + packageName = "source-list-map"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz"; + sha512 = "qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="; + }; + }; "source-map-0.3.0" = { name = "source-map"; packageName = "source-map"; @@ -2417,6 +6656,15 @@ let sha1 = "8586fb9a5a005e5b501e21cd18b6f21b457ad1f9"; }; }; + "source-map-0.4.4" = { + name = "source-map"; + packageName = "source-map"; + version = "0.4.4"; + src = fetchurl { + url = "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz"; + sha1 = "eba4f5da9c0dc999de68032d8b4f76173652036b"; + }; + }; "source-map-0.5.7" = { name = "source-map"; packageName = "source-map"; @@ -2435,40 +6683,31 @@ let sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="; }; }; - "spdx-correct-3.0.0" = { - name = "spdx-correct"; - packageName = "spdx-correct"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz"; - sha512 = "N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g=="; - }; - }; - "spdx-exceptions-2.1.0" = { - name = "spdx-exceptions"; - packageName = "spdx-exceptions"; - version = "2.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz"; - sha512 = "4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg=="; - }; - }; - "spdx-expression-parse-3.0.0" = { - name = "spdx-expression-parse"; - packageName = "spdx-expression-parse"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz"; - sha512 = "Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg=="; - }; - }; - "spdx-license-ids-3.0.0" = { - name = "spdx-license-ids"; - packageName = "spdx-license-ids"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz"; - sha512 = "2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="; + "source-map-resolve-0.5.2" = { + name = "source-map-resolve"; + packageName = "source-map-resolve"; + version = "0.5.2"; + src = fetchurl { + url = "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz"; + sha512 = "MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA=="; + }; + }; + "source-map-support-0.4.18" = { + name = "source-map-support"; + packageName = "source-map-support"; + version = "0.4.18"; + src = fetchurl { + url = "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz"; + sha512 = "try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA=="; + }; + }; + "source-map-url-0.4.0" = { + name = "source-map-url"; + packageName = "source-map-url"; + version = "0.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz"; + sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3"; }; }; "split-1.0.1" = { @@ -2480,13 +6719,31 @@ let sha512 = "mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg=="; }; }; - "sshpk-1.14.2" = { + "split-string-3.1.0" = { + name = "split-string"; + packageName = "split-string"; + version = "3.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz"; + sha512 = "NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw=="; + }; + }; + "sprintf-js-1.0.3" = { + name = "sprintf-js"; + packageName = "sprintf-js"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"; + sha1 = "04e6926f662895354f3dd015203633b857297e2c"; + }; + }; + "sshpk-1.15.1" = { name = "sshpk"; packageName = "sshpk"; - version = "1.14.2"; - src = fetchurl { - url = "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz"; - sha1 = "c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"; + version = "1.15.1"; + src = fetchurl { + url = "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz"; + sha512 = "mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA=="; }; }; "ssri-5.3.0" = { @@ -2507,6 +6764,69 @@ let sha1 = "547c70b347e8d32b4e108ea1a2a159e5fdde19c0"; }; }; + "static-extend-0.1.2" = { + name = "static-extend"; + packageName = "static-extend"; + version = "0.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz"; + sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6"; + }; + }; + "sticky-sidebar-3.3.1" = { + name = "sticky-sidebar"; + packageName = "sticky-sidebar"; + version = "3.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/sticky-sidebar/-/sticky-sidebar-3.3.1.tgz"; + sha1 = "142bf6b64c2b416e4b707ebf8f09b8b5a5043877"; + }; + }; + "stream-browserify-2.0.1" = { + name = "stream-browserify"; + packageName = "stream-browserify"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz"; + sha1 = "66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"; + }; + }; + "stream-each-1.2.3" = { + name = "stream-each"; + packageName = "stream-each"; + version = "1.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz"; + sha512 = "vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw=="; + }; + }; + "stream-http-2.8.3" = { + name = "stream-http"; + packageName = "stream-http"; + version = "2.8.3"; + src = fetchurl { + url = "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz"; + sha512 = "+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw=="; + }; + }; + "stream-shift-1.0.0" = { + name = "stream-shift"; + packageName = "stream-shift"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz"; + sha1 = "d5c752825e5367e786f78e18e445ea223a155952"; + }; + }; + "strict-uri-encode-1.1.0" = { + name = "strict-uri-encode"; + packageName = "strict-uri-encode"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz"; + sha1 = "279b225df1d582b1f54e65addd4352e18faa0713"; + }; + }; "string-width-1.0.2" = { name = "string-width"; packageName = "string-width"; @@ -2516,6 +6836,15 @@ let sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"; }; }; + "string-width-2.1.1" = { + name = "string-width"; + packageName = "string-width"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz"; + sha512 = "nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="; + }; + }; "string_decoder-0.10.31" = { name = "string_decoder"; packageName = "string_decoder"; @@ -2561,6 +6890,24 @@ let sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"; }; }; + "strip-ansi-4.0.0" = { + name = "strip-ansi"; + packageName = "strip-ansi"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz"; + sha1 = "a8479022eb1ac368a871389b635262c505ee368f"; + }; + }; + "strip-eof-1.0.0" = { + name = "strip-eof"; + packageName = "strip-eof"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz"; + sha1 = "bb43ff5598a6eb05d89b59fcd129c983313606bf"; + }; + }; "strip-json-comments-1.0.4" = { name = "strip-json-comments"; packageName = "strip-json-comments"; @@ -2570,6 +6917,15 @@ let sha1 = "1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"; }; }; + "style-loader-0.21.0" = { + name = "style-loader"; + packageName = "style-loader"; + version = "0.21.0"; + src = fetchurl { + url = "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz"; + sha512 = "T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg=="; + }; + }; "supports-color-0.2.0" = { name = "supports-color"; packageName = "supports-color"; @@ -2588,40 +6944,49 @@ let sha1 = "535d045ce6b6363fa40117084629995e9df324c7"; }; }; - "table-layout-0.3.0" = { - name = "table-layout"; - packageName = "table-layout"; - version = "0.3.0"; - src = fetchurl { - url = "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz"; - sha1 = "6ee20dc483db371b3e5c87f704ed2f7c799d2c9a"; - }; - }; - "tar-3.1.15" = { - name = "tar"; - packageName = "tar"; - version = "3.1.15"; - src = fetchurl { - url = "https://registry.npmjs.org/tar/-/tar-3.1.15.tgz"; - sha512 = "pQNFsg+Wb6VXsrIPUnuQwrHR4wD5ASBR0jRyiT4/AALFA2Nl+CjhkDX5fTmIwCuULRtyQR3Dae2BBnP2EFHscw=="; - }; - }; - "temp-0.8.3" = { - name = "temp"; - packageName = "temp"; - version = "0.8.3"; - src = fetchurl { - url = "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz"; - sha1 = "e0c6bc4d26b903124410e4fed81103014dfc1f59"; - }; - }; - "test-value-2.1.0" = { - name = "test-value"; - packageName = "test-value"; - version = "2.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz"; - sha1 = "11da6ff670f3471a73b625ca4f3fdcf7bb748291"; + "supports-color-3.2.3" = { + name = "supports-color"; + packageName = "supports-color"; + version = "3.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz"; + sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"; + }; + }; + "supports-color-5.5.0" = { + name = "supports-color"; + packageName = "supports-color"; + version = "5.5.0"; + src = fetchurl { + url = "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"; + sha512 = "QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="; + }; + }; + "svgo-0.7.2" = { + name = "svgo"; + packageName = "svgo"; + version = "0.7.2"; + src = fetchurl { + url = "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz"; + sha1 = "9f5772413952135c6fefbf40afe6a4faa88b4bb5"; + }; + }; + "tapable-0.2.8" = { + name = "tapable"; + packageName = "tapable"; + version = "0.2.8"; + src = fetchurl { + url = "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz"; + sha1 = "99372a5c999bf2df160afc0d74bed4f47948cd22"; + }; + }; + "tapable-1.1.0" = { + name = "tapable"; + packageName = "tapable"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz"; + sha512 = "IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA=="; }; }; "throttleit-1.0.0" = { @@ -2642,6 +7007,24 @@ let sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"; }; }; + "through2-2.0.3" = { + name = "through2"; + packageName = "through2"; + version = "2.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz"; + sha1 = "0004569b37c7c74ba39c43f3ced78d1ad94140be"; + }; + }; + "timers-browserify-2.0.10" = { + name = "timers-browserify"; + packageName = "timers-browserify"; + version = "2.0.10"; + src = fetchurl { + url = "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz"; + sha512 = "YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg=="; + }; + }; "tiny-emitter-2.0.2" = { name = "tiny-emitter"; packageName = "tiny-emitter"; @@ -2660,6 +7043,60 @@ let sha1 = "1e99e1e2a8469b736ab97d97eefa98c71f76ed0a"; }; }; + "to-arraybuffer-1.0.1" = { + name = "to-arraybuffer"; + packageName = "to-arraybuffer"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz"; + sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43"; + }; + }; + "to-fast-properties-1.0.3" = { + name = "to-fast-properties"; + packageName = "to-fast-properties"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz"; + sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47"; + }; + }; + "to-object-path-0.3.0" = { + name = "to-object-path"; + packageName = "to-object-path"; + version = "0.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz"; + sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af"; + }; + }; + "to-regex-3.0.2" = { + name = "to-regex"; + packageName = "to-regex"; + version = "3.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz"; + sha512 = "FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw=="; + }; + }; + "to-regex-range-2.1.1" = { + name = "to-regex-range"; + packageName = "to-regex-range"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz"; + sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38"; + }; + }; + "toposort-1.0.7" = { + name = "toposort"; + packageName = "toposort"; + version = "1.0.7"; + src = fetchurl { + url = "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz"; + sha1 = "2e68442d9f64ec720b8cc89e6443ac6caa950029"; + }; + }; "tough-cookie-2.3.4" = { name = "tough-cookie"; packageName = "tough-cookie"; @@ -2669,6 +7106,42 @@ let sha512 = "TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA=="; }; }; + "trim-right-1.0.1" = { + name = "trim-right"; + packageName = "trim-right"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz"; + sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003"; + }; + }; + "ts-loader-1.3.3" = { + name = "ts-loader"; + packageName = "ts-loader"; + version = "1.3.3"; + src = fetchurl { + url = "https://registry.npmjs.org/ts-loader/-/ts-loader-1.3.3.tgz"; + sha1 = "30c6203e1e66b841a88701ed8858f1725d94b026"; + }; + }; + "tslib-1.9.3" = { + name = "tslib"; + packageName = "tslib"; + version = "1.9.3"; + src = fetchurl { + url = "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz"; + sha512 = "4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="; + }; + }; + "tty-browserify-0.0.0" = { + name = "tty-browserify"; + packageName = "tty-browserify"; + version = "0.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz"; + sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6"; + }; + }; "tunnel-agent-0.6.0" = { name = "tunnel-agent"; packageName = "tunnel-agent"; @@ -2687,15 +7160,6 @@ let sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64"; }; }; - "type-check-0.3.2" = { - name = "type-check"; - packageName = "type-check"; - version = "0.3.2"; - src = fetchurl { - url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz"; - sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72"; - }; - }; "typedarray-0.0.6" = { name = "typedarray"; packageName = "typedarray"; @@ -2705,22 +7169,58 @@ let sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777"; }; }; - "typical-2.6.1" = { - name = "typical"; - packageName = "typical"; - version = "2.6.1"; - src = fetchurl { - url = "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz"; - sha1 = "5c080e5d661cbbe38259d2e70a3c7253e873881d"; - }; - }; - "uid-number-0.0.5" = { - name = "uid-number"; - packageName = "uid-number"; - version = "0.0.5"; - src = fetchurl { - url = "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz"; - sha1 = "5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e"; + "uglify-es-3.3.10" = { + name = "uglify-es"; + packageName = "uglify-es"; + version = "3.3.10"; + src = fetchurl { + url = "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.10.tgz"; + sha512 = "rPzPisCzW68Okj1zNrfa2dR9uEm43SevDmpR6FChoZABFk9dANGnzzBMgHYUXI3609//63fnVkyQ1SQmAMyjww=="; + }; + }; + "uglify-js-2.8.29" = { + name = "uglify-js"; + packageName = "uglify-js"; + version = "2.8.29"; + src = fetchurl { + url = "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz"; + sha1 = "29c5733148057bb4e1f75df35b7a9cb72e6a59dd"; + }; + }; + "uglify-js-3.4.9" = { + name = "uglify-js"; + packageName = "uglify-js"; + version = "3.4.9"; + src = fetchurl { + url = "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz"; + sha512 = "8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q=="; + }; + }; + "uglify-to-browserify-1.0.2" = { + name = "uglify-to-browserify"; + packageName = "uglify-to-browserify"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz"; + sha1 = "6e0924d6bda6b5afe349e39a6d632850a0f882b7"; + }; + }; + "uglifyjs-webpack-plugin-1.3.0" = { + name = "uglifyjs-webpack-plugin"; + packageName = "uglifyjs-webpack-plugin"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz"; + sha512 = "ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw=="; + }; + }; + "unc-path-regex-0.1.2" = { + name = "unc-path-regex"; + packageName = "unc-path-regex"; + version = "0.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz"; + sha1 = "e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"; }; }; "underscore-1.7.0" = { @@ -2768,6 +7268,132 @@ let sha512 = "KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA=="; }; }; + "union-value-1.0.0" = { + name = "union-value"; + packageName = "union-value"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz"; + sha1 = "5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"; + }; + }; + "uniq-1.0.1" = { + name = "uniq"; + packageName = "uniq"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz"; + sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff"; + }; + }; + "uniqs-2.0.0" = { + name = "uniqs"; + packageName = "uniqs"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz"; + sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02"; + }; + }; + "unique-filename-1.1.1" = { + name = "unique-filename"; + packageName = "unique-filename"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz"; + sha512 = "Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ=="; + }; + }; + "unique-slug-2.0.1" = { + name = "unique-slug"; + packageName = "unique-slug"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz"; + sha512 = "n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg=="; + }; + }; + "unset-value-1.0.0" = { + name = "unset-value"; + packageName = "unset-value"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz"; + sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"; + }; + }; + "upath-1.1.0" = { + name = "upath"; + packageName = "upath"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz"; + sha512 = "bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw=="; + }; + }; + "upper-case-1.1.3" = { + name = "upper-case"; + packageName = "upper-case"; + version = "1.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz"; + sha1 = "f6b4501c2ec4cdd26ba78be7222961de77621598"; + }; + }; + "uri-js-4.2.2" = { + name = "uri-js"; + packageName = "uri-js"; + version = "4.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz"; + sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ=="; + }; + }; + "urix-0.1.0" = { + name = "urix"; + packageName = "urix"; + version = "0.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz"; + sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72"; + }; + }; + "url-0.11.0" = { + name = "url"; + packageName = "url"; + version = "0.11.0"; + src = fetchurl { + url = "https://registry.npmjs.org/url/-/url-0.11.0.tgz"; + sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"; + }; + }; + "use-3.1.1" = { + name = "use"; + packageName = "use"; + version = "3.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/use/-/use-3.1.1.tgz"; + sha512 = "cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="; + }; + }; + "util-0.10.3" = { + name = "util"; + packageName = "util"; + version = "0.10.3"; + src = fetchurl { + url = "https://registry.npmjs.org/util/-/util-0.10.3.tgz"; + sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9"; + }; + }; + "util-0.10.4" = { + name = "util"; + packageName = "util"; + version = "0.10.4"; + src = fetchurl { + url = "https://registry.npmjs.org/util/-/util-0.10.4.tgz"; + sha512 = "0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A=="; + }; + }; "util-deprecate-1.0.2" = { name = "util-deprecate"; packageName = "util-deprecate"; @@ -2777,6 +7403,24 @@ let sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf"; }; }; + "util.promisify-1.0.0" = { + name = "util.promisify"; + packageName = "util.promisify"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz"; + sha512 = "i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA=="; + }; + }; + "utila-0.4.0" = { + name = "utila"; + packageName = "utila"; + version = "0.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz"; + sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c"; + }; + }; "uuid-3.3.2" = { name = "uuid"; packageName = "uuid"; @@ -2786,22 +7430,31 @@ let sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="; }; }; - "validate-npm-package-license-3.0.3" = { - name = "validate-npm-package-license"; - packageName = "validate-npm-package-license"; - version = "3.0.3"; - src = fetchurl { - url = "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz"; - sha512 = "63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g=="; - }; - }; - "validate-npm-package-name-3.0.0" = { - name = "validate-npm-package-name"; - packageName = "validate-npm-package-name"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz"; - sha1 = "5fa912d81eb7d0c74afc140de7317f0ca7df437e"; + "v8-compile-cache-2.0.2" = { + name = "v8-compile-cache"; + packageName = "v8-compile-cache"; + version = "2.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz"; + sha512 = "1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw=="; + }; + }; + "v8flags-3.0.2" = { + name = "v8flags"; + packageName = "v8flags"; + version = "3.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz"; + sha512 = "6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA=="; + }; + }; + "vendors-1.0.2" = { + name = "vendors"; + packageName = "vendors"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz"; + sha512 = "w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ=="; }; }; "verror-1.10.0" = { @@ -2813,22 +7466,85 @@ let sha1 = "3a105ca17053af55d6e270c1f8288682e18da400"; }; }; - "vulcanize-1.16.0" = { - name = "vulcanize"; - packageName = "vulcanize"; - version = "1.16.0"; - src = fetchurl { - url = "https://registry.npmjs.org/vulcanize/-/vulcanize-1.16.0.tgz"; - sha512 = "TYlFljSc896b5+0FmMiw0JAMrHNBiHx0IAFC/dQR3Dxdb9Nx43ohm6wMWTlPXQn4sk/0WkqfgoAA6SLxyvPCLQ=="; - }; - }; - "walk-2.3.14" = { - name = "walk"; - packageName = "walk"; - version = "2.3.14"; - src = fetchurl { - url = "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz"; - sha512 = "5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg=="; + "vm-browserify-0.0.4" = { + name = "vm-browserify"; + packageName = "vm-browserify"; + version = "0.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz"; + sha1 = "5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"; + }; + }; + "watchpack-1.6.0" = { + name = "watchpack"; + packageName = "watchpack"; + version = "1.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz"; + sha512 = "i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA=="; + }; + }; + "waypoints-4.0.1" = { + name = "waypoints"; + packageName = "waypoints"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/waypoints/-/waypoints-4.0.1.tgz"; + sha1 = "09979a0573810b29627cba4366a284a062ec69c8"; + }; + }; + "webpack-4.23.1" = { + name = "webpack"; + packageName = "webpack"; + version = "4.23.1"; + src = fetchurl { + url = "https://registry.npmjs.org/webpack/-/webpack-4.23.1.tgz"; + sha512 = "iE5Cu4rGEDk7ONRjisTOjVHv3dDtcFfwitSxT7evtYj/rANJpt1OuC/Kozh1pBa99AUBr1L/LsaNB+D9Xz3CEg=="; + }; + }; + "webpack-cli-3.1.2" = { + name = "webpack-cli"; + packageName = "webpack-cli"; + version = "3.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz"; + sha512 = "Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ=="; + }; + }; + "webpack-core-0.6.9" = { + name = "webpack-core"; + packageName = "webpack-core"; + version = "0.6.9"; + src = fetchurl { + url = "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz"; + sha1 = "fc571588c8558da77be9efb6debdc5a3b172bdc2"; + }; + }; + "webpack-sources-1.3.0" = { + name = "webpack-sources"; + packageName = "webpack-sources"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz"; + sha512 = "OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA=="; + }; + }; + "webpack-uglify-js-plugin-1.1.9" = { + name = "webpack-uglify-js-plugin"; + packageName = "webpack-uglify-js-plugin"; + version = "1.1.9"; + src = fetchurl { + url = "https://registry.npmjs.org/webpack-uglify-js-plugin/-/webpack-uglify-js-plugin-1.1.9.tgz"; + sha1 = "ecd4c27843a4ac17ee318f45229cdf1d2fb5e103"; + }; + }; + "whet.extend-0.9.9" = { + name = "whet.extend"; + packageName = "whet.extend"; + version = "0.9.9"; + src = fetchurl { + url = "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz"; + sha1 = "f877d5bf648c97e5aa542fadc16d6a259b9c11a1"; }; }; "which-1.0.9" = { @@ -2849,40 +7565,58 @@ let sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="; }; }; - "wide-align-1.1.3" = { - name = "wide-align"; - packageName = "wide-align"; - version = "1.1.3"; - src = fetchurl { - url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz"; - sha512 = "QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA=="; - }; - }; - "winston-2.4.3" = { + "which-module-2.0.0" = { + name = "which-module"; + packageName = "which-module"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz"; + sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"; + }; + }; + "window-size-0.1.0" = { + name = "window-size"; + packageName = "window-size"; + version = "0.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz"; + sha1 = "5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"; + }; + }; + "winston-2.4.4" = { name = "winston"; packageName = "winston"; - version = "2.4.3"; - src = fetchurl { - url = "https://registry.npmjs.org/winston/-/winston-2.4.3.tgz"; - sha512 = "GYKuysPz2pxYAVJD2NPsDLP5Z79SDEzPm9/j4tCjkF/n89iBNGBMJcR+dMUqxgPNgoSs6fVygPi+Vl2oxIpBuw=="; - }; - }; - "wordwrap-1.0.0" = { + version = "2.4.4"; + src = fetchurl { + url = "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz"; + sha512 = "NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q=="; + }; + }; + "wordwrap-0.0.2" = { name = "wordwrap"; packageName = "wordwrap"; - version = "1.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz"; - sha1 = "27584810891456a4171c8d0226441ade90cbcaeb"; - }; - }; - "wordwrapjs-2.0.0" = { - name = "wordwrapjs"; - packageName = "wordwrapjs"; - version = "2.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz"; - sha1 = "ab55f695e6118da93858fdd70c053d1c5e01ac20"; + version = "0.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"; + sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f"; + }; + }; + "worker-farm-1.6.0" = { + name = "worker-farm"; + packageName = "worker-farm"; + version = "1.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz"; + sha512 = "6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ=="; + }; + }; + "wrap-ansi-2.1.0" = { + name = "wrap-ansi"; + packageName = "wrap-ansi"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz"; + sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85"; }; }; "wrappy-1.0.2" = { @@ -2894,13 +7628,67 @@ let sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"; }; }; - "yallist-3.0.2" = { + "xregexp-4.0.0" = { + name = "xregexp"; + packageName = "xregexp"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz"; + sha512 = "PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg=="; + }; + }; + "xtend-4.0.1" = { + name = "xtend"; + packageName = "xtend"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"; + sha1 = "a5c6d532be656e23db820efb943a1f04998d63af"; + }; + }; + "y18n-4.0.0" = { + name = "y18n"; + packageName = "y18n"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz"; + sha512 = "r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="; + }; + }; + "yallist-2.1.2" = { name = "yallist"; packageName = "yallist"; - version = "3.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz"; - sha1 = "8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"; + version = "2.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz"; + sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52"; + }; + }; + "yargs-12.0.2" = { + name = "yargs"; + packageName = "yargs"; + version = "12.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz"; + sha512 = "e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ=="; + }; + }; + "yargs-3.10.0" = { + name = "yargs"; + packageName = "yargs"; + version = "3.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz"; + sha1 = "f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"; + }; + }; + "yargs-parser-10.1.0" = { + name = "yargs-parser"; + packageName = "yargs-parser"; + version = "10.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz"; + sha512 = "VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ=="; }; }; "yauzl-2.4.1" = { @@ -2916,82 +7704,396 @@ let args = { name = "rhodecode-enterprise"; packageName = "rhodecode-enterprise"; - version = "1.0.0"; + version = "2.0.0"; src = ./..; dependencies = [ + sources."@polymer/font-roboto-3.0.2" + sources."@polymer/iron-a11y-announcer-3.0.1" + sources."@polymer/iron-a11y-keys-3.0.1" + sources."@polymer/iron-a11y-keys-behavior-3.0.1" + sources."@polymer/iron-ajax-3.0.1" + sources."@polymer/iron-autogrow-textarea-3.0.1" + sources."@polymer/iron-behaviors-3.0.1" + sources."@polymer/iron-checked-element-behavior-3.0.1" + sources."@polymer/iron-fit-behavior-3.0.1" + sources."@polymer/iron-flex-layout-3.0.1" + sources."@polymer/iron-form-element-behavior-3.0.1" + sources."@polymer/iron-meta-3.0.1" + sources."@polymer/iron-overlay-behavior-3.0.2" + sources."@polymer/iron-resizable-behavior-3.0.1" + sources."@polymer/iron-validatable-behavior-3.0.1" + sources."@polymer/paper-behaviors-3.0.1" + sources."@polymer/paper-button-3.0.1" + sources."@polymer/paper-ripple-3.0.1" + sources."@polymer/paper-spinner-3.0.1" + sources."@polymer/paper-styles-3.0.1" + sources."@polymer/paper-toast-3.0.1" + sources."@polymer/paper-toggle-button-3.0.1" + sources."@polymer/paper-tooltip-3.0.1" + sources."@polymer/polymer-3.1.0" sources."@types/clone-0.1.30" - sources."@types/node-4.2.23" - (sources."@types/parse5-0.0.31" // { - dependencies = [ - sources."@types/node-6.0.114" - ]; - }) + sources."@types/node-6.14.0" + sources."@types/parse5-2.2.34" + sources."@webassemblyjs/ast-1.7.10" + sources."@webassemblyjs/floating-point-hex-parser-1.7.10" + sources."@webassemblyjs/helper-api-error-1.7.10" + sources."@webassemblyjs/helper-buffer-1.7.10" + sources."@webassemblyjs/helper-code-frame-1.7.10" + sources."@webassemblyjs/helper-fsm-1.7.10" + sources."@webassemblyjs/helper-module-context-1.7.10" + sources."@webassemblyjs/helper-wasm-bytecode-1.7.10" + sources."@webassemblyjs/helper-wasm-section-1.7.10" + sources."@webassemblyjs/ieee754-1.7.10" + sources."@webassemblyjs/leb128-1.7.10" + sources."@webassemblyjs/utf8-1.7.10" + sources."@webassemblyjs/wasm-edit-1.7.10" + sources."@webassemblyjs/wasm-gen-1.7.10" + sources."@webassemblyjs/wasm-opt-1.7.10" + sources."@webassemblyjs/wasm-parser-1.7.10" + sources."@webassemblyjs/wast-parser-1.7.10" + sources."@webassemblyjs/wast-printer-1.7.10" + sources."@webcomponents/shadycss-1.5.2" + sources."@webcomponents/webcomponentsjs-2.1.3" + sources."@xtuc/ieee754-1.2.0" + sources."@xtuc/long-4.2.1" sources."abbrev-1.1.1" - sources."acorn-3.3.0" - sources."acorn-jsx-3.0.1" + sources."acorn-5.7.3" + sources."acorn-dynamic-import-3.0.0" + (sources."acorn-jsx-3.0.1" // { + dependencies = [ + sources."acorn-3.3.0" + ]; + }) sources."ajv-4.11.8" + sources."ajv-keywords-3.2.0" + (sources."align-text-0.1.4" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) + sources."alphanum-sort-1.0.2" sources."amdefine-1.0.1" - sources."ansi-escape-sequences-3.0.0" - sources."ansi-regex-2.1.1" - sources."ansi-styles-2.2.1" + sources."ansi-regex-0.2.1" + sources."ansi-styles-1.1.0" + sources."anymatch-2.0.0" sources."appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1" sources."aproba-1.2.0" - sources."are-we-there-yet-1.1.5" (sources."argparse-0.1.16" // { dependencies = [ sources."underscore.string-2.4.0" ]; }) - sources."array-back-1.0.4" + sources."arr-diff-4.0.0" + sources."arr-flatten-1.1.0" + sources."arr-union-3.1.0" + sources."array-each-1.0.1" + sources."array-slice-1.1.0" + sources."array-union-1.0.2" + sources."array-uniq-1.0.3" + sources."array-unique-0.3.2" + sources."arrify-1.0.1" sources."asap-2.0.6" - sources."asn1-0.2.3" + sources."asn1-0.2.4" + sources."asn1.js-4.10.1" + (sources."assert-1.4.1" // { + dependencies = [ + sources."inherits-2.0.1" + sources."util-0.10.3" + ]; + }) sources."assert-plus-0.2.0" + sources."assign-symbols-1.0.0" + sources."ast-types-0.9.6" sources."async-0.1.22" + sources."async-each-1.0.1" sources."asynckit-0.4.0" + sources."atob-2.1.2" + (sources."autoprefixer-6.7.7" // { + dependencies = [ + sources."browserslist-1.7.7" + ]; + }) sources."aws-sign2-0.6.0" - sources."aws4-1.7.0" - sources."babel-polyfill-6.26.0" - (sources."babel-runtime-6.26.0" // { - dependencies = [ - sources."regenerator-runtime-0.11.1" - ]; - }) + sources."aws4-1.8.0" + (sources."babel-code-frame-6.26.0" // { + dependencies = [ + sources."ansi-regex-2.1.1" + sources."ansi-styles-2.2.1" + sources."chalk-1.1.3" + sources."has-ansi-2.0.0" + sources."strip-ansi-3.0.1" + sources."supports-color-2.0.0" + ]; + }) + (sources."babel-core-6.26.3" // { + dependencies = [ + sources."lodash-4.17.11" + sources."minimatch-3.0.4" + ]; + }) + (sources."babel-generator-6.26.1" // { + dependencies = [ + sources."lodash-4.17.11" + ]; + }) + sources."babel-helper-builder-binary-assignment-operator-visitor-6.24.1" + sources."babel-helper-call-delegate-6.24.1" + (sources."babel-helper-define-map-6.26.0" // { + dependencies = [ + sources."lodash-4.17.11" + ]; + }) + sources."babel-helper-explode-assignable-expression-6.24.1" + sources."babel-helper-function-name-6.24.1" + sources."babel-helper-get-function-arity-6.24.1" + sources."babel-helper-hoist-variables-6.24.1" + sources."babel-helper-optimise-call-expression-6.24.1" + (sources."babel-helper-regex-6.26.0" // { + dependencies = [ + sources."lodash-4.17.11" + ]; + }) + sources."babel-helper-remap-async-to-generator-6.24.1" + sources."babel-helper-replace-supers-6.24.1" + sources."babel-helpers-6.24.1" + sources."babel-loader-7.1.5" + sources."babel-messages-6.23.0" + sources."babel-plugin-check-es2015-constants-6.22.0" + sources."babel-plugin-syntax-async-functions-6.13.0" + sources."babel-plugin-syntax-exponentiation-operator-6.13.0" + sources."babel-plugin-syntax-object-rest-spread-6.13.0" + sources."babel-plugin-syntax-trailing-function-commas-6.22.0" + sources."babel-plugin-transform-async-to-generator-6.24.1" + sources."babel-plugin-transform-es2015-arrow-functions-6.22.0" + sources."babel-plugin-transform-es2015-block-scoped-functions-6.22.0" + (sources."babel-plugin-transform-es2015-block-scoping-6.26.0" // { + dependencies = [ + sources."lodash-4.17.11" + ]; + }) + sources."babel-plugin-transform-es2015-classes-6.24.1" + sources."babel-plugin-transform-es2015-computed-properties-6.24.1" + sources."babel-plugin-transform-es2015-destructuring-6.23.0" + sources."babel-plugin-transform-es2015-duplicate-keys-6.24.1" + sources."babel-plugin-transform-es2015-for-of-6.23.0" + sources."babel-plugin-transform-es2015-function-name-6.24.1" + sources."babel-plugin-transform-es2015-literals-6.22.0" + sources."babel-plugin-transform-es2015-modules-amd-6.24.1" + sources."babel-plugin-transform-es2015-modules-commonjs-6.26.2" + sources."babel-plugin-transform-es2015-modules-systemjs-6.24.1" + sources."babel-plugin-transform-es2015-modules-umd-6.24.1" + sources."babel-plugin-transform-es2015-object-super-6.24.1" + sources."babel-plugin-transform-es2015-parameters-6.24.1" + sources."babel-plugin-transform-es2015-shorthand-properties-6.24.1" + sources."babel-plugin-transform-es2015-spread-6.22.0" + sources."babel-plugin-transform-es2015-sticky-regex-6.24.1" + sources."babel-plugin-transform-es2015-template-literals-6.22.0" + sources."babel-plugin-transform-es2015-typeof-symbol-6.23.0" + sources."babel-plugin-transform-es2015-unicode-regex-6.24.1" + sources."babel-plugin-transform-exponentiation-operator-6.24.1" + sources."babel-plugin-transform-object-rest-spread-6.26.0" + sources."babel-plugin-transform-regenerator-6.26.0" + sources."babel-plugin-transform-strict-mode-6.24.1" + sources."babel-preset-env-1.7.0" + (sources."babel-register-6.26.0" // { + dependencies = [ + sources."lodash-4.17.11" + ]; + }) + sources."babel-runtime-6.26.0" + (sources."babel-template-6.26.0" // { + dependencies = [ + sources."lodash-4.17.11" + ]; + }) + (sources."babel-traverse-6.26.0" // { + dependencies = [ + sources."lodash-4.17.11" + ]; + }) + (sources."babel-types-6.26.0" // { + dependencies = [ + sources."lodash-4.17.11" + ]; + }) + sources."babylon-6.18.0" sources."balanced-match-1.0.0" - sources."base64-js-1.2.3" + (sources."base-0.11.2" // { + dependencies = [ + sources."define-property-1.0.0" + ]; + }) + sources."base64-js-1.3.0" sources."bcrypt-pbkdf-1.0.2" + sources."big.js-3.2.0" + sources."binary-extensions-1.12.0" + sources."bluebird-3.5.2" + sources."bn.js-4.11.8" + sources."boolbase-1.0.0" sources."boom-2.10.1" - sources."bower-1.8.4" sources."brace-expansion-1.1.11" + (sources."braces-2.3.2" // { + dependencies = [ + sources."extend-shallow-2.0.1" + ]; + }) + sources."brorand-1.1.0" + sources."browserify-aes-1.2.0" + sources."browserify-cipher-1.0.1" + sources."browserify-des-1.0.2" + sources."browserify-rsa-4.0.1" + sources."browserify-sign-4.0.4" + sources."browserify-zlib-0.2.0" + sources."browserslist-3.2.8" + sources."buffer-4.9.1" sources."buffer-from-1.1.1" - sources."builtin-modules-1.1.1" - sources."builtins-1.0.3" + sources."buffer-xor-1.0.3" + sources."builtin-status-codes-3.0.0" + (sources."cacache-10.0.4" // { + dependencies = [ + sources."glob-7.1.3" + sources."graceful-fs-4.1.11" + sources."lru-cache-4.1.3" + sources."minimatch-3.0.4" + sources."rimraf-2.6.2" + ]; + }) + sources."cache-base-1.0.1" + sources."camel-case-3.0.0" + sources."camelcase-4.1.0" + (sources."caniuse-api-1.6.1" // { + dependencies = [ + sources."browserslist-1.7.7" + ]; + }) + sources."caniuse-db-1.0.30000900" + sources."caniuse-lite-1.0.30000900" sources."caseless-0.12.0" - sources."chalk-1.1.3" + sources."center-align-0.1.3" + sources."chalk-0.5.1" + (sources."chokidar-2.0.4" // { + dependencies = [ + sources."is-glob-4.0.0" + ]; + }) + sources."chownr-1.1.1" + sources."chrome-trace-event-1.0.0" + sources."cipher-base-1.0.4" + (sources."clap-1.2.3" // { + dependencies = [ + sources."ansi-regex-2.1.1" + sources."ansi-styles-2.2.1" + sources."chalk-1.1.3" + sources."has-ansi-2.0.0" + sources."strip-ansi-3.0.1" + sources."supports-color-2.0.0" + ]; + }) + (sources."class-utils-0.3.6" // { + dependencies = [ + sources."define-property-0.2.5" + (sources."is-accessor-descriptor-0.1.6" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) + (sources."is-data-descriptor-0.1.4" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) + sources."is-descriptor-0.1.6" + sources."kind-of-5.1.0" + ]; + }) + (sources."clean-css-4.2.1" // { + dependencies = [ + sources."source-map-0.6.1" + ]; + }) (sources."cli-1.0.1" // { dependencies = [ - sources."glob-7.1.2" + sources."glob-7.1.3" sources."minimatch-3.0.4" ]; }) sources."clipboard-2.0.1" + (sources."cliui-4.1.0" // { + dependencies = [ + sources."ansi-regex-3.0.0" + sources."strip-ansi-4.0.0" + ]; + }) sources."clone-1.0.4" sources."co-4.6.0" + sources."coa-1.0.4" sources."code-point-at-1.1.0" sources."coffee-script-1.3.3" + sources."collection-visit-1.0.0" + sources."color-0.11.4" + sources."color-convert-1.9.3" + sources."color-name-1.1.3" + sources."color-string-0.3.0" + sources."colormin-1.1.2" sources."colors-0.6.2" - sources."combined-stream-1.0.6" - sources."command-line-args-3.0.5" - sources."command-line-usage-3.0.8" + sources."combined-stream-1.0.7" + sources."commander-2.14.1" + sources."commondir-1.0.1" + sources."component-emitter-1.2.1" sources."concat-map-0.0.1" - sources."concat-stream-1.6.2" - sources."config-chain-1.1.11" + (sources."concat-stream-1.6.2" // { + dependencies = [ + sources."readable-stream-2.3.6" + sources."string_decoder-1.1.1" + ]; + }) sources."console-browserify-1.1.0" - sources."console-control-strings-1.1.0" + sources."constants-browserify-1.0.0" + sources."convert-source-map-1.6.0" + (sources."copy-concurrently-1.0.5" // { + dependencies = [ + sources."glob-7.1.3" + sources."minimatch-3.0.4" + sources."rimraf-2.6.2" + ]; + }) + sources."copy-descriptor-0.1.1" + (sources."copy-webpack-plugin-4.5.4" // { + dependencies = [ + sources."is-glob-4.0.0" + sources."minimatch-3.0.4" + ]; + }) sources."core-js-2.5.7" sources."core-util-is-1.0.2" - sources."crisper-2.1.1" + sources."create-ecdh-4.0.3" + sources."create-hash-1.2.0" + sources."create-hmac-1.1.7" + (sources."cross-spawn-6.0.5" // { + dependencies = [ + sources."which-1.3.1" + ]; + }) sources."cryptiles-2.0.5" + sources."crypto-browserify-3.12.0" + sources."css-color-names-0.0.4" + sources."css-loader-0.28.11" + sources."css-select-1.2.0" + (sources."css-selector-tokenizer-0.7.0" // { + dependencies = [ + sources."regexpu-core-1.0.0" + ]; + }) + sources."css-what-2.1.2" + sources."cssesc-0.1.0" + (sources."cssnano-3.10.0" // { + dependencies = [ + sources."decamelize-1.2.0" + ]; + }) + sources."csso-2.3.2" sources."cycle-1.0.3" + sources."cyclist-0.2.2" (sources."dashdash-1.14.1" // { dependencies = [ sources."assert-plus-1.0.0" @@ -2999,62 +8101,120 @@ let }) sources."date-now-0.1.4" sources."dateformat-1.0.2-1.2.3" - sources."debug-0.7.4" - sources."deep-extend-0.4.2" - sources."deep-is-0.1.3" + sources."debug-2.6.9" + sources."decamelize-2.0.0" + sources."decode-uri-component-0.2.0" + sources."deep-for-each-2.0.3" + sources."define-properties-1.1.3" + sources."define-property-2.0.2" + sources."defined-1.0.0" sources."delayed-stream-1.0.0" sources."delegate-3.2.0" - sources."delegates-1.0.0" - sources."doctrine-0.7.2" + sources."des.js-1.0.0" + sources."detect-file-1.0.0" + sources."detect-indent-4.0.0" + sources."diffie-hellman-5.0.3" + sources."dir-glob-2.0.0" + sources."dom-converter-0.2.0" (sources."dom-serializer-0.1.0" // { dependencies = [ sources."domelementtype-1.1.3" - sources."entities-1.1.1" - ]; - }) - sources."dom5-1.3.6" + sources."entities-1.1.2" + ]; + }) + (sources."dom5-2.3.0" // { + dependencies = [ + sources."clone-2.1.2" + sources."parse5-2.2.3" + ]; + }) + sources."domain-browser-1.2.0" sources."domelementtype-1.3.0" sources."domhandler-2.3.0" sources."domutils-1.5.1" + (sources."duplexify-3.6.1" // { + dependencies = [ + sources."readable-stream-2.3.6" + sources."string_decoder-1.1.1" + ]; + }) sources."ecc-jsbn-0.1.2" + sources."electron-to-chromium-1.3.82" + sources."elliptic-6.4.1" + sources."emojis-list-2.1.0" + sources."end-of-stream-1.4.1" + (sources."enhanced-resolve-4.1.0" // { + dependencies = [ + sources."graceful-fs-4.1.11" + ]; + }) sources."entities-1.0.0" sources."errno-0.1.7" - sources."es6-promise-2.3.0" + sources."es-abstract-1.12.0" + sources."es-to-primitive-1.2.0" + sources."es6-promise-4.2.5" + sources."es6-templates-0.2.3" sources."escape-string-regexp-1.0.5" - (sources."escodegen-1.11.0" // { - dependencies = [ - sources."esprima-3.1.3" - sources."estraverse-4.2.0" - sources."esutils-2.0.2" - sources."source-map-0.6.1" - ]; - }) - (sources."espree-3.5.4" // { - dependencies = [ - sources."acorn-5.7.1" - ]; - }) + sources."eslint-scope-4.0.0" + sources."espree-3.5.4" sources."esprima-1.0.4" - sources."estraverse-3.1.0" - sources."esutils-1.1.6" + sources."esrecurse-4.2.1" + sources."estraverse-4.2.0" + sources."esutils-2.0.2" sources."eventemitter2-0.4.14" + sources."events-1.1.1" + sources."evp_bytestokey-1.0.3" + sources."execa-0.10.0" sources."exit-0.1.2" + (sources."expand-brackets-2.1.4" // { + dependencies = [ + sources."define-property-0.2.5" + sources."extend-shallow-2.0.1" + (sources."is-accessor-descriptor-0.1.6" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) + (sources."is-data-descriptor-0.1.4" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) + sources."is-descriptor-0.1.6" + sources."kind-of-5.1.0" + ]; + }) + sources."expand-tilde-2.0.2" + sources."exports-loader-0.6.4" sources."extend-3.0.2" - (sources."extract-zip-1.6.7" // { - dependencies = [ - sources."debug-2.6.9" - ]; - }) + (sources."extend-shallow-3.0.2" // { + dependencies = [ + sources."is-extendable-1.0.1" + ]; + }) + (sources."extglob-2.0.4" // { + dependencies = [ + sources."define-property-1.0.0" + sources."extend-shallow-2.0.1" + ]; + }) + sources."extract-zip-1.6.7" sources."extsprintf-1.3.0" sources."eyes-0.1.8" - sources."fast-levenshtein-2.0.6" + sources."fast-deep-equal-2.0.1" + sources."fast-json-stable-stringify-2.0.0" + sources."fastparse-1.1.1" sources."favico.js-0.3.10" sources."faye-websocket-0.4.4" sources."fd-slicer-1.0.1" - sources."feature-detect-es6-1.5.0" sources."file-sync-cmp-0.1.1" - sources."find-replace-1.0.3" - sources."findit-2.0.0" + (sources."fill-range-4.0.0" // { + dependencies = [ + sources."extend-shallow-2.0.1" + ]; + }) + sources."find-cache-dir-1.0.0" + sources."find-up-2.1.0" (sources."findup-sync-0.1.3" // { dependencies = [ sources."glob-3.2.11" @@ -3062,22 +8222,43 @@ let sources."minimatch-0.3.0" ]; }) - sources."foreachasync-3.0.0" + sources."fined-1.1.0" + sources."flagged-respawn-1.0.0" + sources."flatten-1.0.2" + (sources."flush-write-stream-1.0.3" // { + dependencies = [ + sources."readable-stream-2.3.6" + sources."string_decoder-1.1.1" + ]; + }) + sources."for-in-1.0.2" + sources."for-own-1.0.0" sources."forever-agent-0.6.1" sources."form-data-2.1.4" - (sources."fs-extra-0.6.4" // { - dependencies = [ - sources."mkdirp-0.3.5" - ]; - }) - (sources."fs.extra-1.3.2" // { - dependencies = [ - sources."mkdirp-0.3.5" + sources."fragment-cache-0.2.1" + (sources."from2-2.3.0" // { + dependencies = [ + sources."readable-stream-2.3.6" + sources."string_decoder-1.1.1" + ]; + }) + (sources."fs-extra-1.0.0" // { + dependencies = [ + sources."graceful-fs-4.1.11" + ]; + }) + (sources."fs-write-stream-atomic-1.0.10" // { + dependencies = [ + sources."graceful-fs-4.1.11" ]; }) sources."fs.realpath-1.0.0" - sources."gauge-2.7.4" + sources."fsevents-1.2.4" + sources."function-bind-1.1.1" sources."gaze-0.5.2" + sources."get-caller-file-1.0.3" + sources."get-stream-3.0.0" + sources."get-value-2.0.6" sources."getobject-0.1.0" (sources."getpass-0.1.7" // { dependencies = [ @@ -3089,6 +8270,21 @@ let sources."inherits-1.0.2" ]; }) + sources."glob-parent-3.1.0" + sources."global-modules-1.0.0" + sources."global-modules-path-2.3.0" + (sources."global-prefix-1.0.2" // { + dependencies = [ + sources."which-1.3.1" + ]; + }) + sources."globals-9.18.0" + (sources."globby-7.1.1" // { + dependencies = [ + sources."glob-7.1.3" + sources."minimatch-3.0.4" + ]; + }) (sources."globule-0.1.0" // { dependencies = [ sources."lodash-1.0.2" @@ -3097,22 +8293,37 @@ let sources."good-listener-1.2.2" sources."graceful-fs-1.2.3" sources."grunt-0.4.5" + (sources."grunt-cli-1.3.1" // { + dependencies = [ + sources."nopt-4.0.1" + ]; + }) (sources."grunt-contrib-concat-0.5.1" // { dependencies = [ - sources."ansi-regex-0.2.1" - sources."ansi-styles-1.1.0" - sources."chalk-0.5.1" - sources."has-ansi-0.1.0" - sources."strip-ansi-0.3.0" - sources."supports-color-0.2.0" - ]; - }) - sources."grunt-contrib-copy-1.0.0" + sources."source-map-0.3.0" + ]; + }) + (sources."grunt-contrib-copy-1.0.0" // { + dependencies = [ + sources."ansi-regex-2.1.1" + sources."ansi-styles-2.2.1" + sources."chalk-1.1.3" + sources."has-ansi-2.0.0" + sources."strip-ansi-3.0.1" + sources."supports-color-2.0.0" + ]; + }) sources."grunt-contrib-jshint-0.12.0" (sources."grunt-contrib-less-1.4.1" // { dependencies = [ + sources."ansi-regex-2.1.1" + sources."ansi-styles-2.2.1" sources."async-2.6.1" - sources."lodash-4.17.10" + sources."chalk-1.1.3" + sources."has-ansi-2.0.0" + sources."lodash-4.17.11" + sources."strip-ansi-3.0.1" + sources."supports-color-2.0.0" ]; }) (sources."grunt-contrib-watch-0.6.1" // { @@ -3121,7 +8332,7 @@ let sources."lodash-2.4.2" ]; }) - sources."grunt-crisper-1.0.1" + sources."grunt-known-options-1.1.1" (sources."grunt-legacy-log-0.1.3" // { dependencies = [ sources."lodash-2.4.2" @@ -3135,58 +8346,140 @@ let ]; }) sources."grunt-legacy-util-0.2.0" - (sources."grunt-vulcanize-1.0.0" // { - dependencies = [ - sources."crisper-1.2.0" - sources."nopt-3.0.6" + (sources."grunt-webpack-3.1.3" // { + dependencies = [ + sources."lodash-4.17.11" ]; }) sources."har-schema-1.0.5" sources."har-validator-4.2.1" - sources."has-ansi-2.0.0" - sources."has-unicode-2.0.1" + sources."has-1.0.3" + sources."has-ansi-0.1.0" + sources."has-flag-3.0.0" + sources."has-symbols-1.0.0" + sources."has-value-1.0.0" + (sources."has-values-1.0.0" // { + dependencies = [ + sources."kind-of-4.0.0" + ]; + }) + sources."hash-base-3.0.4" + sources."hash.js-1.1.5" sources."hasha-2.2.0" sources."hawk-3.1.3" + sources."he-1.2.0" + sources."hmac-drbg-1.0.1" sources."hoek-2.16.3" + sources."home-or-tmp-2.0.0" + sources."homedir-polyfill-1.0.1" sources."hooker-0.2.3" - sources."hosted-git-info-2.7.1" - (sources."htmlparser2-3.8.3" // { - dependencies = [ - sources."readable-stream-1.1.14" - sources."string_decoder-0.10.31" - ]; - }) + sources."html-comment-regex-1.1.2" + sources."html-loader-0.4.5" + (sources."html-minifier-3.5.21" // { + dependencies = [ + sources."commander-2.17.1" + ]; + }) + (sources."html-webpack-plugin-3.2.0" // { + dependencies = [ + sources."loader-utils-0.2.17" + sources."lodash-4.17.11" + ]; + }) + sources."htmlparser2-3.8.3" sources."http-signature-1.1.1" - (sources."hydrolysis-1.25.0" // { - dependencies = [ - sources."dom5-1.1.0" - ]; - }) + sources."https-browserify-1.0.0" sources."iconv-lite-0.2.11" + sources."icss-replace-symbols-1.1.0" + (sources."icss-utils-2.1.0" // { + dependencies = [ + sources."ansi-styles-3.2.1" + sources."chalk-2.4.1" + sources."postcss-6.0.23" + sources."source-map-0.6.1" + sources."supports-color-5.5.0" + ]; + }) + sources."ieee754-1.1.12" + sources."iferr-0.1.5" + sources."ignore-3.3.10" sources."image-size-0.5.5" + (sources."import-local-2.0.0" // { + dependencies = [ + sources."find-up-3.0.0" + sources."locate-path-3.0.0" + sources."p-limit-2.0.0" + sources."p-locate-3.0.0" + sources."p-try-2.0.0" + sources."pkg-dir-3.0.0" + ]; + }) + sources."imports-loader-0.7.1" + sources."imurmurhash-0.1.4" + sources."indexes-of-1.0.1" + sources."indexof-0.0.1" sources."inflight-1.0.6" sources."inherits-2.0.3" sources."ini-1.3.5" - sources."is-builtin-module-1.0.0" + sources."interpret-1.1.0" + sources."invariant-2.2.4" + sources."invert-kv-2.0.0" + sources."is-absolute-1.0.0" + sources."is-absolute-url-2.1.0" + sources."is-accessor-descriptor-1.0.0" + sources."is-binary-path-1.0.1" + sources."is-buffer-1.1.6" + sources."is-callable-1.1.4" + sources."is-data-descriptor-1.0.0" + sources."is-date-object-1.0.1" + sources."is-descriptor-1.0.2" + sources."is-extendable-0.1.1" + sources."is-extglob-2.1.1" + sources."is-finite-1.0.2" sources."is-fullwidth-code-point-1.0.0" + sources."is-glob-3.1.0" + (sources."is-number-3.0.0" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) + sources."is-plain-obj-1.1.0" + sources."is-plain-object-2.0.4" + sources."is-regex-1.0.4" + sources."is-relative-1.0.0" sources."is-stream-1.1.0" + sources."is-svg-2.1.0" + sources."is-symbol-1.0.2" sources."is-typedarray-1.0.0" - sources."isarray-0.0.1" + sources."is-unc-path-1.0.0" + sources."is-windows-1.0.2" + sources."isarray-1.0.0" sources."isexe-2.0.0" + sources."isobject-3.0.1" sources."isstream-0.1.2" sources."jquery-1.11.3" + sources."js-base64-2.4.9" + sources."js-tokens-3.0.2" sources."js-yaml-2.0.5" sources."jsbn-0.1.1" + sources."jsesc-1.3.0" (sources."jshint-2.9.6" // { dependencies = [ - sources."lodash-4.17.10" + sources."lodash-4.17.11" sources."minimatch-3.0.4" ]; }) + sources."json-parse-better-errors-1.0.2" sources."json-schema-0.2.3" + sources."json-schema-traverse-0.4.1" sources."json-stable-stringify-1.0.1" sources."json-stringify-safe-5.0.1" - sources."jsonfile-1.0.1" + sources."json5-0.5.1" + (sources."jsonfile-2.4.0" // { + dependencies = [ + sources."graceful-fs-4.1.11" + ]; + }) sources."jsonify-0.0.0" (sources."jsprim-1.4.1" // { dependencies = [ @@ -3194,180 +8487,680 @@ let ]; }) sources."kew-0.7.0" + sources."kind-of-6.0.2" (sources."klaw-1.3.1" // { dependencies = [ sources."graceful-fs-4.1.11" ]; }) + sources."lazy-cache-1.0.4" + sources."lcid-2.0.0" (sources."less-2.7.3" // { dependencies = [ sources."graceful-fs-4.1.11" - sources."source-map-0.5.7" - ]; - }) - sources."levn-0.3.0" + ]; + }) + (sources."liftoff-2.5.0" // { + dependencies = [ + sources."findup-sync-2.0.0" + ]; + }) + sources."loader-runner-2.3.1" + sources."loader-utils-1.1.0" + sources."locate-path-2.0.0" sources."lodash-0.9.2" + sources."lodash.camelcase-4.3.0" + sources."lodash.debounce-4.0.8" + sources."lodash.isplainobject-4.0.6" + sources."lodash.memoize-4.1.2" + sources."lodash.uniq-4.5.0" + sources."longest-1.0.1" + sources."loose-envify-1.4.0" + sources."lower-case-1.1.4" sources."lru-cache-2.7.3" + sources."make-dir-1.3.0" + sources."make-iterator-1.0.1" + sources."map-age-cleaner-0.1.2" + sources."map-cache-0.2.2" + sources."map-visit-1.0.0" + sources."math-expression-evaluator-1.2.17" + sources."md5.js-1.3.5" + sources."mem-4.0.0" + (sources."memory-fs-0.4.1" // { + dependencies = [ + sources."readable-stream-2.3.6" + sources."string_decoder-1.1.1" + ]; + }) + sources."micromatch-3.1.10" + sources."miller-rabin-4.0.1" sources."mime-1.6.0" - sources."mime-db-1.35.0" - sources."mime-types-2.1.19" + sources."mime-db-1.37.0" + sources."mime-types-2.1.21" + sources."mimic-fn-1.2.0" + sources."minimalistic-assert-1.0.1" + sources."minimalistic-crypto-utils-1.0.1" sources."minimatch-0.2.14" sources."minimist-0.0.8" - sources."minipass-2.3.3" - sources."minizlib-1.1.0" + sources."mississippi-2.0.0" + (sources."mixin-deep-1.3.1" // { + dependencies = [ + sources."is-extendable-1.0.1" + ]; + }) sources."mkdirp-0.5.1" sources."moment-2.22.2" sources."mousetrap-1.6.2" + (sources."move-concurrently-1.0.1" // { + dependencies = [ + sources."glob-7.1.3" + sources."minimatch-3.0.4" + sources."rimraf-2.6.2" + ]; + }) sources."ms-2.0.0" - sources."ncp-0.4.2" - sources."nijs-0.0.25" - sources."node2nix-1.6.0" + sources."nan-2.11.1" + sources."nanomatch-1.2.13" + sources."neo-async-2.6.0" + sources."nice-try-1.0.5" + sources."no-case-2.3.2" + (sources."node-libs-browser-2.1.0" // { + dependencies = [ + sources."readable-stream-2.3.6" + sources."string_decoder-1.1.1" + ]; + }) sources."nopt-1.0.10" (sources."noptify-0.0.3" // { dependencies = [ sources."nopt-2.0.0" ]; }) - sources."normalize-package-data-2.4.0" - sources."npm-package-arg-6.1.0" - (sources."npm-registry-client-8.5.1" // { - dependencies = [ - sources."graceful-fs-4.1.11" - ]; - }) - (sources."npmconf-2.1.3" // { - dependencies = [ - sources."nopt-3.0.6" - sources."once-1.3.3" - sources."semver-4.3.6" - ]; - }) - sources."npmlog-4.1.2" + sources."normalize-path-2.1.1" + sources."normalize-range-0.1.2" + sources."normalize-url-1.9.1" + sources."npm-run-path-2.0.2" + sources."nth-check-1.0.2" + sources."num2fraction-1.2.2" sources."number-is-nan-1.0.1" sources."oauth-sign-0.8.2" sources."object-assign-4.1.1" + (sources."object-copy-0.1.0" // { + dependencies = [ + sources."define-property-0.2.5" + sources."is-accessor-descriptor-0.1.6" + sources."is-data-descriptor-0.1.4" + (sources."is-descriptor-0.1.6" // { + dependencies = [ + sources."kind-of-5.1.0" + ]; + }) + sources."kind-of-3.2.2" + ]; + }) + sources."object-keys-1.0.12" + sources."object-visit-1.0.1" + sources."object.defaults-1.1.0" + sources."object.getownpropertydescriptors-2.0.3" + sources."object.map-1.0.1" + sources."object.pick-1.3.0" sources."once-1.4.0" - sources."optionator-0.8.2" - sources."optparse-1.0.5" + sources."os-browserify-0.3.0" sources."os-homedir-1.0.2" + sources."os-locale-3.0.1" sources."os-tmpdir-1.0.2" sources."osenv-0.1.5" - sources."parse5-1.5.1" + sources."p-defer-1.0.0" + sources."p-finally-1.0.0" + sources."p-is-promise-1.1.0" + sources."p-limit-1.3.0" + sources."p-locate-2.0.0" + sources."p-try-1.0.0" + sources."pako-1.0.6" + (sources."parallel-transform-1.1.0" // { + dependencies = [ + sources."readable-stream-2.3.6" + sources."string_decoder-1.1.1" + ]; + }) + sources."param-case-2.1.1" + sources."parse-asn1-5.1.1" + sources."parse-filepath-1.0.2" + sources."parse-passwd-1.0.0" + sources."parse5-3.0.3" + (sources."parse5-utils-2.0.0" // { + dependencies = [ + sources."parse5-2.2.3" + ]; + }) + sources."pascalcase-0.1.1" + sources."path-browserify-0.0.0" + sources."path-dirname-1.0.2" + sources."path-exists-3.0.0" sources."path-is-absolute-1.0.1" - sources."path-posix-1.0.0" + sources."path-key-2.0.1" + sources."path-parse-1.0.6" + sources."path-root-0.1.1" + sources."path-root-regex-0.1.2" + sources."path-type-3.0.0" + sources."pbkdf2-3.0.17" sources."pend-1.2.0" sources."performance-now-0.2.0" sources."phantom-4.0.12" (sources."phantomjs-prebuilt-2.1.16" // { dependencies = [ - sources."es6-promise-4.2.4" - sources."fs-extra-1.0.0" - sources."graceful-fs-4.1.11" - sources."jsonfile-2.4.0" sources."which-1.3.1" ]; }) + sources."pify-3.0.0" sources."pinkie-2.0.4" sources."pinkie-promise-2.0.1" - sources."prelude-ls-1.1.2" + sources."pkg-dir-2.0.0" + (sources."polymer-webpack-loader-2.0.3" // { + dependencies = [ + sources."ansi-styles-3.2.1" + sources."chalk-2.4.1" + sources."html-loader-0.5.5" + (sources."postcss-6.0.23" // { + dependencies = [ + sources."source-map-0.6.1" + ]; + }) + sources."supports-color-5.5.0" + ]; + }) + sources."posix-character-classes-0.1.1" + (sources."postcss-5.2.18" // { + dependencies = [ + sources."ansi-regex-2.1.1" + sources."ansi-styles-2.2.1" + (sources."chalk-1.1.3" // { + dependencies = [ + sources."supports-color-2.0.0" + ]; + }) + sources."has-ansi-2.0.0" + sources."has-flag-1.0.0" + sources."strip-ansi-3.0.1" + sources."supports-color-3.2.3" + ]; + }) + sources."postcss-calc-5.3.1" + sources."postcss-colormin-2.2.2" + sources."postcss-convert-values-2.6.1" + sources."postcss-discard-comments-2.0.4" + sources."postcss-discard-duplicates-2.1.0" + sources."postcss-discard-empty-2.1.0" + sources."postcss-discard-overridden-0.1.1" + sources."postcss-discard-unused-2.2.3" + sources."postcss-filter-plugins-2.0.3" + sources."postcss-merge-idents-2.1.7" + sources."postcss-merge-longhand-2.0.2" + (sources."postcss-merge-rules-2.1.2" // { + dependencies = [ + sources."browserslist-1.7.7" + ]; + }) + sources."postcss-message-helpers-2.0.0" + sources."postcss-minify-font-values-1.0.5" + sources."postcss-minify-gradients-1.0.5" + sources."postcss-minify-params-1.2.2" + sources."postcss-minify-selectors-2.1.1" + (sources."postcss-modules-extract-imports-1.2.0" // { + dependencies = [ + sources."ansi-styles-3.2.1" + sources."chalk-2.4.1" + sources."postcss-6.0.23" + sources."source-map-0.6.1" + sources."supports-color-5.5.0" + ]; + }) + (sources."postcss-modules-local-by-default-1.2.0" // { + dependencies = [ + sources."ansi-styles-3.2.1" + sources."chalk-2.4.1" + sources."postcss-6.0.23" + sources."source-map-0.6.1" + sources."supports-color-5.5.0" + ]; + }) + (sources."postcss-modules-scope-1.1.0" // { + dependencies = [ + sources."ansi-styles-3.2.1" + sources."chalk-2.4.1" + sources."postcss-6.0.23" + sources."source-map-0.6.1" + sources."supports-color-5.5.0" + ]; + }) + (sources."postcss-modules-values-1.3.0" // { + dependencies = [ + sources."ansi-styles-3.2.1" + sources."chalk-2.4.1" + sources."postcss-6.0.23" + sources."source-map-0.6.1" + sources."supports-color-5.5.0" + ]; + }) + sources."postcss-normalize-charset-1.1.1" + sources."postcss-normalize-url-3.0.8" + sources."postcss-ordered-values-2.2.3" + sources."postcss-reduce-idents-2.4.0" + sources."postcss-reduce-initial-1.0.1" + sources."postcss-reduce-transforms-1.0.4" + sources."postcss-selector-parser-2.2.3" + sources."postcss-svgo-2.1.6" + sources."postcss-unique-selectors-2.0.2" + sources."postcss-value-parser-3.3.1" + sources."postcss-zindex-2.2.0" + sources."prepend-http-1.0.4" + sources."pretty-error-2.1.1" + sources."private-0.1.8" + sources."process-0.11.10" sources."process-nextick-args-2.0.0" sources."progress-1.1.8" sources."promise-7.3.1" - sources."proto-list-1.2.4" + sources."promise-inflight-1.0.1" sources."prr-1.0.1" + sources."pseudomap-1.0.2" + sources."public-encrypt-4.0.3" + sources."pump-2.0.1" + sources."pumpify-1.5.1" sources."punycode-1.4.1" + sources."q-1.5.1" sources."qrious-4.0.2" sources."qs-6.4.0" - (sources."readable-stream-2.3.6" // { - dependencies = [ - sources."isarray-1.0.0" - ]; - }) - sources."reduce-flatten-1.0.1" - sources."regenerator-runtime-0.10.5" + sources."query-string-4.3.4" + sources."querystring-0.2.0" + sources."querystring-es3-0.2.1" + sources."randombytes-2.0.6" + sources."randomfill-1.0.4" + sources."raw-loader-1.0.0-beta.0" + (sources."readable-stream-1.1.14" // { + dependencies = [ + sources."isarray-0.0.1" + ]; + }) + (sources."readdirp-2.2.1" // { + dependencies = [ + sources."graceful-fs-4.1.11" + sources."readable-stream-2.3.6" + sources."string_decoder-1.1.1" + ]; + }) + (sources."recast-0.11.23" // { + dependencies = [ + sources."esprima-3.1.3" + ]; + }) + sources."rechoir-0.6.2" + (sources."reduce-css-calc-1.3.0" // { + dependencies = [ + sources."balanced-match-0.4.2" + ]; + }) + (sources."reduce-function-call-1.0.2" // { + dependencies = [ + sources."balanced-match-0.4.2" + ]; + }) + sources."regenerate-1.4.0" + sources."regenerator-runtime-0.11.1" + sources."regenerator-transform-0.10.1" + sources."regex-not-1.0.2" + sources."regexpu-core-2.0.0" + sources."regjsgen-0.2.0" + (sources."regjsparser-0.1.5" // { + dependencies = [ + sources."jsesc-0.5.0" + ]; + }) + sources."relateurl-0.2.7" + sources."remove-trailing-separator-1.1.0" + (sources."renderkid-2.0.2" // { + dependencies = [ + sources."ansi-regex-2.1.1" + sources."domhandler-2.1.0" + sources."domutils-1.1.6" + sources."htmlparser2-3.3.0" + sources."isarray-0.0.1" + sources."readable-stream-1.0.34" + sources."strip-ansi-3.0.1" + ]; + }) + sources."repeat-element-1.1.3" + sources."repeat-string-1.6.1" + sources."repeating-2.0.1" sources."request-2.81.0" sources."request-progress-2.0.1" - sources."retry-0.10.1" + sources."require-directory-2.1.1" + sources."require-main-filename-1.0.1" + sources."resolve-1.8.1" + sources."resolve-cwd-2.0.0" + sources."resolve-dir-1.0.1" + sources."resolve-from-3.0.0" + sources."resolve-url-0.2.1" + sources."ret-0.1.15" + sources."right-align-0.1.3" sources."rimraf-2.2.8" + sources."ripemd160-2.0.2" + sources."run-queue-1.0.3" sources."safe-buffer-5.1.2" + sources."safe-regex-1.1.0" sources."safer-buffer-2.1.2" + sources."sax-1.2.4" + (sources."schema-utils-0.4.7" // { + dependencies = [ + sources."ajv-6.5.4" + ]; + }) sources."select-1.1.2" - sources."semver-5.5.0" + sources."semver-5.6.0" + sources."serialize-javascript-1.5.0" sources."set-blocking-2.0.0" + (sources."set-value-2.0.0" // { + dependencies = [ + sources."extend-shallow-2.0.1" + ]; + }) + sources."setimmediate-1.0.5" + sources."sha.js-2.4.11" + sources."shebang-command-1.2.0" + sources."shebang-regex-1.0.0" sources."shelljs-0.3.0" sources."sigmund-1.0.1" sources."signal-exit-3.0.2" - sources."slasp-0.0.4" - sources."slide-1.1.6" + sources."slash-1.0.0" + (sources."snapdragon-0.8.2" // { + dependencies = [ + sources."define-property-0.2.5" + sources."extend-shallow-2.0.1" + (sources."is-accessor-descriptor-0.1.6" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) + (sources."is-data-descriptor-0.1.4" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) + sources."is-descriptor-0.1.6" + sources."kind-of-5.1.0" + ]; + }) + (sources."snapdragon-node-2.1.1" // { + dependencies = [ + sources."define-property-1.0.0" + ]; + }) + (sources."snapdragon-util-3.0.1" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) sources."sntp-1.0.9" - sources."source-map-0.3.0" - sources."spdx-correct-3.0.0" - sources."spdx-exceptions-2.1.0" - sources."spdx-expression-parse-3.0.0" - sources."spdx-license-ids-3.0.0" + sources."sort-keys-1.1.2" + sources."source-list-map-2.0.1" + sources."source-map-0.5.7" + sources."source-map-resolve-0.5.2" + sources."source-map-support-0.4.18" + sources."source-map-url-0.4.0" sources."split-1.0.1" - (sources."sshpk-1.14.2" // { + sources."split-string-3.1.0" + sources."sprintf-js-1.0.3" + (sources."sshpk-1.15.1" // { dependencies = [ sources."assert-plus-1.0.0" ]; }) sources."ssri-5.3.0" sources."stack-trace-0.0.10" - sources."string-width-1.0.2" - sources."string_decoder-1.1.1" + (sources."static-extend-0.1.2" // { + dependencies = [ + sources."define-property-0.2.5" + (sources."is-accessor-descriptor-0.1.6" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) + (sources."is-data-descriptor-0.1.4" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) + sources."is-descriptor-0.1.6" + sources."kind-of-5.1.0" + ]; + }) + sources."sticky-sidebar-3.3.1" + (sources."stream-browserify-2.0.1" // { + dependencies = [ + sources."readable-stream-2.3.6" + sources."string_decoder-1.1.1" + ]; + }) + sources."stream-each-1.2.3" + (sources."stream-http-2.8.3" // { + dependencies = [ + sources."readable-stream-2.3.6" + sources."string_decoder-1.1.1" + ]; + }) + sources."stream-shift-1.0.0" + sources."strict-uri-encode-1.1.0" + (sources."string-width-2.1.1" // { + dependencies = [ + sources."ansi-regex-3.0.0" + sources."is-fullwidth-code-point-2.0.0" + sources."strip-ansi-4.0.0" + ]; + }) + sources."string_decoder-0.10.31" sources."stringstream-0.0.6" - sources."strip-ansi-3.0.1" + sources."strip-ansi-0.3.0" + sources."strip-eof-1.0.0" sources."strip-json-comments-1.0.4" - sources."supports-color-2.0.0" - sources."table-layout-0.3.0" - sources."tar-3.1.15" - sources."temp-0.8.3" - sources."test-value-2.1.0" + sources."style-loader-0.21.0" + sources."supports-color-0.2.0" + (sources."svgo-0.7.2" // { + dependencies = [ + sources."argparse-1.0.10" + sources."colors-1.1.2" + sources."esprima-2.7.3" + sources."js-yaml-3.7.0" + ]; + }) + sources."tapable-1.1.0" sources."throttleit-1.0.0" sources."through-2.3.8" + (sources."through2-2.0.3" // { + dependencies = [ + sources."readable-stream-2.3.6" + sources."string_decoder-1.1.1" + ]; + }) + sources."timers-browserify-2.0.10" sources."tiny-emitter-2.0.2" (sources."tiny-lr-fork-0.0.5" // { dependencies = [ + sources."debug-0.7.4" sources."qs-0.5.6" ]; }) + sources."to-arraybuffer-1.0.1" + sources."to-fast-properties-1.0.3" + (sources."to-object-path-0.3.0" // { + dependencies = [ + sources."kind-of-3.2.2" + ]; + }) + sources."to-regex-3.0.2" + sources."to-regex-range-2.1.1" + sources."toposort-1.0.7" sources."tough-cookie-2.3.4" + sources."trim-right-1.0.1" + (sources."ts-loader-1.3.3" // { + dependencies = [ + sources."colors-1.3.2" + sources."enhanced-resolve-3.4.1" + sources."graceful-fs-4.1.11" + sources."loader-utils-0.2.17" + sources."tapable-0.2.8" + ]; + }) + sources."tslib-1.9.3" + sources."tty-browserify-0.0.0" sources."tunnel-agent-0.6.0" sources."tweetnacl-0.14.5" - sources."type-check-0.3.2" sources."typedarray-0.0.6" - sources."typical-2.6.1" - sources."uid-number-0.0.5" + (sources."uglify-es-3.3.10" // { + dependencies = [ + sources."source-map-0.6.1" + ]; + }) + (sources."uglify-js-3.4.9" // { + dependencies = [ + sources."commander-2.17.1" + sources."source-map-0.6.1" + ]; + }) + sources."uglify-to-browserify-1.0.2" + (sources."uglifyjs-webpack-plugin-1.3.0" // { + dependencies = [ + sources."source-map-0.6.1" + ]; + }) + sources."unc-path-regex-0.1.2" sources."underscore-1.7.0" sources."underscore.string-2.2.1" sources."unicode-5.2.0-0.7.5" + (sources."union-value-1.0.0" // { + dependencies = [ + sources."extend-shallow-2.0.1" + sources."set-value-0.4.3" + ]; + }) + sources."uniq-1.0.1" + sources."uniqs-2.0.0" + sources."unique-filename-1.1.1" + sources."unique-slug-2.0.1" + (sources."unset-value-1.0.0" // { + dependencies = [ + (sources."has-value-0.3.1" // { + dependencies = [ + sources."isobject-2.1.0" + ]; + }) + sources."has-values-0.1.4" + ]; + }) + sources."upath-1.1.0" + sources."upper-case-1.1.3" + (sources."uri-js-4.2.2" // { + dependencies = [ + sources."punycode-2.1.1" + ]; + }) + sources."urix-0.1.0" + (sources."url-0.11.0" // { + dependencies = [ + sources."punycode-1.3.2" + ]; + }) + sources."use-3.1.1" + sources."util-0.10.4" sources."util-deprecate-1.0.2" + sources."util.promisify-1.0.0" + sources."utila-0.4.0" sources."uuid-3.3.2" - sources."validate-npm-package-license-3.0.3" - sources."validate-npm-package-name-3.0.0" + sources."v8-compile-cache-2.0.2" + sources."v8flags-3.0.2" + sources."vendors-1.0.2" (sources."verror-1.10.0" // { dependencies = [ sources."assert-plus-1.0.0" ]; }) - (sources."vulcanize-1.16.0" // { - dependencies = [ - sources."nopt-3.0.6" - ]; - }) - sources."walk-2.3.14" + sources."vm-browserify-0.0.4" + (sources."watchpack-1.6.0" // { + dependencies = [ + sources."graceful-fs-4.1.11" + ]; + }) + sources."waypoints-4.0.1" + (sources."webpack-4.23.1" // { + dependencies = [ + sources."ajv-6.5.4" + ]; + }) + (sources."webpack-cli-3.1.2" // { + dependencies = [ + sources."ansi-styles-3.2.1" + sources."chalk-2.4.1" + sources."supports-color-5.5.0" + ]; + }) + (sources."webpack-core-0.6.9" // { + dependencies = [ + sources."source-list-map-0.1.8" + sources."source-map-0.4.4" + ]; + }) + (sources."webpack-sources-1.3.0" // { + dependencies = [ + sources."source-map-0.6.1" + ]; + }) + (sources."webpack-uglify-js-plugin-1.1.9" // { + dependencies = [ + sources."ansi-regex-2.1.1" + sources."ansi-styles-2.2.1" + sources."camelcase-1.2.1" + sources."chalk-1.1.3" + sources."cliui-2.1.0" + sources."decamelize-1.2.0" + sources."has-ansi-2.0.0" + sources."strip-ansi-3.0.1" + sources."supports-color-2.0.0" + sources."uglify-js-2.8.29" + sources."yargs-3.10.0" + ]; + }) + sources."whet.extend-0.9.9" sources."which-1.0.9" - sources."wide-align-1.1.3" - (sources."winston-2.4.3" // { + sources."which-module-2.0.0" + sources."window-size-0.1.0" + (sources."winston-2.4.4" // { dependencies = [ sources."async-1.0.0" sources."colors-1.0.3" ]; }) - sources."wordwrap-1.0.0" - sources."wordwrapjs-2.0.0" + sources."wordwrap-0.0.2" + sources."worker-farm-1.6.0" + (sources."wrap-ansi-2.1.0" // { + dependencies = [ + sources."ansi-regex-2.1.1" + sources."string-width-1.0.2" + sources."strip-ansi-3.0.1" + ]; + }) sources."wrappy-1.0.2" - sources."yallist-3.0.2" + sources."xregexp-4.0.0" + sources."xtend-4.0.1" + sources."y18n-4.0.0" + sources."yallist-2.1.2" + (sources."yargs-12.0.2" // { + dependencies = [ + sources."find-up-3.0.0" + sources."locate-path-3.0.0" + sources."p-limit-2.0.0" + sources."p-locate-3.0.0" + sources."p-try-2.0.0" + ]; + }) + sources."yargs-parser-10.1.0" sources."yauzl-2.4.1" ]; buildInputs = globalBuildInputs; @@ -3376,7 +9169,7 @@ let license = "SEE LICENSE IN LICENSE.txt"; }; production = false; - bypassCache = false; + bypassCache = true; }; in { diff --git a/pkgs/overlays.nix b/pkgs/overlays.nix new file mode 100755 --- /dev/null +++ b/pkgs/overlays.nix @@ -0,0 +1,3 @@ +self: super: { + +} diff --git a/pkgs/patch_beaker/patch-beaker-lock-func-debug.diff b/pkgs/patches/beaker/patch-beaker-lock-func-debug.diff rename from pkgs/patch_beaker/patch-beaker-lock-func-debug.diff rename to pkgs/patches/beaker/patch-beaker-lock-func-debug.diff diff --git a/pkgs/patch_beaker/patch-beaker-metadata-reuse.diff b/pkgs/patches/beaker/patch-beaker-metadata-reuse.diff rename from pkgs/patch_beaker/patch-beaker-metadata-reuse.diff rename to pkgs/patches/beaker/patch-beaker-metadata-reuse.diff diff --git a/pkgs/patches/supervisor/patch-rlimits-old-kernel.diff b/pkgs/patches/supervisor/patch-rlimits-old-kernel.diff new file mode 100644 --- /dev/null +++ b/pkgs/patches/supervisor/patch-rlimits-old-kernel.diff @@ -0,0 +1,16 @@ +diff -rup supervisor-3.3.4-orig/supervisor/options.py supervisor-3.3.4/supervisor/options.py +--- supervisor-3.3.4-orig/supervisor/options.py 1970-01-01 01:00:01.000000000 +0100 ++++ supervisor-3.3.4/supervisor-new/options.py 2018-10-24 10:53:19.368503735 +0200 +@@ -1395,7 +1395,11 @@ class ServerOptions(Options): + name = limit['name'] + name = name # name is used below by locals() + +- soft, hard = resource.getrlimit(res) ++ try: ++ soft, hard = resource.getrlimit(res) ++ except Exception: ++ # handle old kernel problems, this is not critical to execute ++ soft, hard = -1, -1 + + if (soft < min) and (soft != -1): # -1 means unlimited + if (hard < min) and (hard != -1): diff --git a/pkgs/python-packages-overrides.nix b/pkgs/python-packages-overrides.nix --- a/pkgs/python-packages-overrides.nix +++ b/pkgs/python-packages-overrides.nix @@ -30,8 +30,8 @@ self: super: { "beaker" = super."beaker".override (attrs: { patches = [ - ./patch_beaker/patch-beaker-lock-func-debug.diff - ./patch_beaker/patch-beaker-metadata-reuse.diff + ./patches/beaker/patch-beaker-lock-func-debug.diff + ./patches/beaker/patch-beaker-metadata-reuse.diff ]; }); @@ -240,6 +240,12 @@ self: super: { }; }); + "supervisor" = super."supervisor".override (attrs: { + patches = [ + ./patches/supervisor/patch-rlimits-old-kernel.diff + ]; + }); + # Avoid that base packages screw up the build process inherit (basePythonPackages) setuptools; diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -52,22 +52,22 @@ self: super: { }; }; "atomicwrites" = super.buildPythonPackage { - name = "atomicwrites-1.1.5"; + name = "atomicwrites-1.2.1"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/a1/e1/2d9bc76838e6e6667fde5814aa25d7feb93d6fa471bf6816daac2596e8b2/atomicwrites-1.1.5.tar.gz"; - sha256 = "11bm90fwm2avvf4f3ib8g925w7jr4m11vcsinn1bi6ns4bm32214"; + url = "https://files.pythonhosted.org/packages/ac/ed/a311712ef6b4355035489f665e63e1a73f9eb371929e3c98e5efd451069e/atomicwrites-1.2.1.tar.gz"; + sha256 = "1vmkbw9j0qammwxbxycrs39gvdg4lc2d4lk98kwf8ag2manyi6pc"; }; meta = { license = [ pkgs.lib.licenses.mit ]; }; }; "attrs" = super.buildPythonPackage { - name = "attrs-18.1.0"; + name = "attrs-18.2.0"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/e4/ac/a04671e118b57bee87dabca1e0f2d3bda816b7a551036012d0ca24190e71/attrs-18.1.0.tar.gz"; - sha256 = "0yzqz8wv3w1srav5683a55v49i0szkm47dyrnkd56fqs8j8ypl70"; + url = "https://files.pythonhosted.org/packages/0f/9e/26b1d194aab960063b266170e53c39f73ea0d0d3f5ce23313e0ec8ee9bdf/attrs-18.2.0.tar.gz"; + sha256 = "0s9ydh058wmmf5v391pym877x4ahxg45dw6a0w4c7s5wgpigdjqh"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -160,17 +160,6 @@ self: super: { license = [ pkgs.lib.licenses.asl20 ]; }; }; - "bottle" = super.buildPythonPackage { - name = "bottle-0.12.13"; - doCheck = false; - src = fetchurl { - url = "https://files.pythonhosted.org/packages/bd/99/04dc59ced52a8261ee0f965a8968717a255ea84a36013e527944dbf3468c/bottle-0.12.13.tar.gz"; - sha256 = "0m9k2a7yxvggc4kw8fsvj381vgsvfcdshg5nzy6vwrxiw2p53drr"; - }; - meta = { - license = [ pkgs.lib.licenses.mit ]; - }; - }; "bumpversion" = super.buildPythonPackage { name = "bumpversion-0.5.3"; doCheck = false; @@ -295,28 +284,14 @@ self: super: { }; }; "coverage" = super.buildPythonPackage { - name = "coverage-3.7.1"; + name = "coverage-4.5.1"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/09/4f/89b06c7fdc09687bca507dc411c342556ef9c5a3b26756137a4878ff19bf/coverage-3.7.1.tar.gz"; - sha256 = "0knlbq79g2ww6xzsyknj9rirrgrgc983dpa2d9nkdf31mb2a3bni"; + url = "https://files.pythonhosted.org/packages/35/fe/e7df7289d717426093c68d156e0fd9117c8f4872b6588e8a8928a0f68424/coverage-4.5.1.tar.gz"; + sha256 = "1wbrzpxka3xd4nmmkc6q0ir343d91kymwsm8pbmwa0d2a7q4ir2n"; }; meta = { - license = [ pkgs.lib.licenses.bsdOriginal ]; - }; - }; - "cprofilev" = super.buildPythonPackage { - name = "cprofilev-1.0.7"; - doCheck = false; - propagatedBuildInputs = [ - self."bottle" - ]; - src = fetchurl { - url = "https://files.pythonhosted.org/packages/df/50/d8c1ada7d537c64b0f76453fa31dedb6af6e27b82fcf0331e5f71a4cf98b/CProfileV-1.0.7.tar.gz"; - sha256 = "0xwszfhxgndpcjkpq89dix6vi02hj1gzvhr7r716hd1x3y5p94c7"; - }; - meta = { - license = [ pkgs.lib.licenses.mit ]; + license = [ pkgs.lib.licenses.asl20 ]; }; }; "cssselect" = super.buildPythonPackage { @@ -372,11 +347,11 @@ self: super: { }; }; "dogpile.cache" = super.buildPythonPackage { - name = "dogpile.cache-0.6.6"; + name = "dogpile.cache-0.6.7"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/48/ca/604154d835c3668efb8a31bd979b0ea4bf39c2934a40ffecc0662296cb51/dogpile.cache-0.6.6.tar.gz"; - sha256 = "1h8n1lxd4l2qvahfkiinljkqz7pww7w3sgag0j8j9ixbl2h4wk84"; + url = "https://files.pythonhosted.org/packages/ee/bd/440da735a11c6087eed7cc8747fc4b995cbac2464168682f8ee1c8e43844/dogpile.cache-0.6.7.tar.gz"; + sha256 = "1aw8rx8vhb75y7zc6gi67g21sw057jdx7i8m3jq7kf3nqavxx9zw"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal ]; @@ -515,14 +490,14 @@ self: super: { }; }; "gevent" = super.buildPythonPackage { - name = "gevent-1.3.5"; + name = "gevent-1.3.6"; doCheck = false; propagatedBuildInputs = [ self."greenlet" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/e6/0a/fc345c6e6161f84484870dbcaa58e427c10bd9bdcd08a69bed3d6b398bf1/gevent-1.3.5.tar.gz"; - sha256 = "1w3gydxirgd2f60c5yv579w4903ds9s4g3587ik4jby97hgqc5bz"; + url = "https://files.pythonhosted.org/packages/49/13/aa4bb3640b5167fe58875d3d7e65390cdb14f9682a41a741a566bb560842/gevent-1.3.6.tar.gz"; + sha256 = "1ih4k73dqz2zb561hda99vbanja3m6cdch3mgxxn1mla3qwkqhbv"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -550,23 +525,12 @@ self: super: { license = [ { fullName = "GNU Lesser General Public License v3 or later (LGPLv3+)"; } { fullName = "LGPL"; } ]; }; }; - "graphviz" = super.buildPythonPackage { - name = "graphviz-0.9"; + "greenlet" = super.buildPythonPackage { + name = "greenlet-0.4.15"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/2b/e6/71521bab8fb99833133f08f6ac0460e2f6b425a7f75ac4b02323c3c3b512/graphviz-0.9.zip"; - sha256 = "14r9brj4r31b3qy1nnn34v3l4h0n39bqxg9sn2fz4p3pp5mglnl6"; - }; - meta = { - license = [ pkgs.lib.licenses.mit ]; - }; - }; - "greenlet" = super.buildPythonPackage { - name = "greenlet-0.4.13"; - doCheck = false; - src = fetchurl { - url = "https://files.pythonhosted.org/packages/13/de/ba92335e9e76040ca7274224942282a80d54f85e342a5e33c5277c7f87eb/greenlet-0.4.13.tar.gz"; - sha256 = "1r412gfx25jrdiv444prmz5a8igrfabwnwqyr6b52ypq7ga87vqg"; + url = "https://files.pythonhosted.org/packages/f8/e8/b30ae23b45f69aa3f024b46064c0ac8e5fcb4f22ace0dca8d6f9c8bbe5e7/greenlet-0.4.15.tar.gz"; + sha256 = "1g4g1wwc472ds89zmqlpyan3fbnzpa8qm48z3z1y6mlk44z485ll"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -599,11 +563,11 @@ self: super: { }; }; "hupper" = super.buildPythonPackage { - name = "hupper-1.3"; + name = "hupper-1.3.1"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/51/0c/96335b1f2f32245fb871eea5bb9773196505ddb71fad15190056a282df9e/hupper-1.3.tar.gz"; - sha256 = "1pkyrm9c2crc32ps00k1ahnc5clj3pjwiarc7j0x8aykwih7ff10"; + url = "https://files.pythonhosted.org/packages/cf/4b/467b826a84c8594b81f414b5ab6794e981951dac90ca40abaf9ea1cb36b0/hupper-1.3.1.tar.gz"; + sha256 = "03mf13n6i4dd60wlb9m99ddl4m3lmly70cjp7f82vdkibfl1v6l9"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -850,11 +814,11 @@ self: super: { }; }; "mistune" = super.buildPythonPackage { - name = "mistune-0.8.3"; + name = "mistune-0.8.4"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/9d/be/e06d4346cc608a01dec6bf770d7d0303a4fd6db588b318ced18f5f257145/mistune-0.8.3.tar.gz"; - sha256 = "06b662p6kf46wh2jsabaqhaq4bz1srh2zxkrnx4yg96azlxw645w"; + url = "https://files.pythonhosted.org/packages/2d/a4/509f6e7783ddd35482feda27bc7f72e65b5e7dc910eca4ab2164daf9c577/mistune-0.8.4.tar.gz"; + sha256 = "0vkmsh0x480rni51lhyvigfdf06b9247z868pk3bal1wnnfl58sr"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal ]; @@ -947,20 +911,6 @@ self: super: { license = [ pkgs.lib.licenses.bsdOriginal ]; }; }; - "objgraph" = super.buildPythonPackage { - name = "objgraph-3.1.1"; - doCheck = false; - propagatedBuildInputs = [ - self."graphviz" - ]; - src = fetchurl { - url = "https://files.pythonhosted.org/packages/be/58/9ca81a20cc837054e94866df1475d899caaa94f3732b8a46006858b015f7/objgraph-3.1.1.tar.gz"; - sha256 = "17aq4cwainiwvj8x61j0hx45c313bkwza5fijnmmw8v8glyy2bcc"; - }; - meta = { - license = [ pkgs.lib.licenses.mit ]; - }; - }; "packaging" = super.buildPythonPackage { name = "packaging-15.2"; doCheck = false; @@ -1025,15 +975,15 @@ self: super: { }; }; "pathlib2" = super.buildPythonPackage { - name = "pathlib2-2.3.0"; + name = "pathlib2-2.3.2"; doCheck = false; propagatedBuildInputs = [ self."six" self."scandir" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/a1/14/df0deb867c2733f7d857523c10942b3d6612a1b222502fdffa9439943dfb/pathlib2-2.3.0.tar.gz"; - sha256 = "1cx5gs2v9j2vnzmcrbq5l8fq2mwrr1h6pyf1sjdji2w1bavm09fk"; + url = "https://files.pythonhosted.org/packages/db/a8/7d6439c1aec525ed70810abee5b7d7f3aa35347f59bc28343e8f62019aa2/pathlib2-2.3.2.tar.gz"; + sha256 = "10yb0iv5x2hs631rcppkhbddx799d3h8pcwmkbh2a66ns3w71ccf"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -1065,14 +1015,14 @@ self: super: { }; }; "pickleshare" = super.buildPythonPackage { - name = "pickleshare-0.7.4"; + name = "pickleshare-0.7.5"; doCheck = false; propagatedBuildInputs = [ self."pathlib2" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/69/fe/dd137d84daa0fd13a709e448138e310d9ea93070620c9db5454e234af525/pickleshare-0.7.4.tar.gz"; - sha256 = "0yvk14dzxk7g6qpr7iw23vzqbsr0dh4ij4xynkhnzpfz4xr2bac4"; + url = "https://files.pythonhosted.org/packages/d8/b6/df3c1c9b616e9c0edbc4fbab6ddd09df9535849c64ba51fcb6531c32d4d8/pickleshare-0.7.5.tar.gz"; + sha256 = "1jmghg3c53yp1i8cm6pcrm280ayi8621rwyav9fac7awjr3kss47"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -1108,11 +1058,11 @@ self: super: { }; }; "pluggy" = super.buildPythonPackage { - name = "pluggy-0.6.0"; + name = "pluggy-0.8.0"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/11/bf/cbeb8cdfaffa9f2ea154a30ae31a9d04a1209312e2919138b4171a1f8199/pluggy-0.6.0.tar.gz"; - sha256 = "1zqckndfn85l1cd8pndw212zg1bq9fkg1nnj32kp2mppppsyg2kz"; + url = "https://files.pythonhosted.org/packages/65/25/81d0de17cd00f8ca994a4e74e3c4baf7cd25072c0b831dad5c7d9d6138f8/pluggy-0.8.0.tar.gz"; + sha256 = "1580p47l2zqzsza8jcnw1h2wh3vvmygk6ly8bvi4w0g8j14sjys4"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -1134,22 +1084,22 @@ self: super: { }; }; "psutil" = super.buildPythonPackage { - name = "psutil-5.4.6"; + name = "psutil-5.4.7"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/51/9e/0f8f5423ce28c9109807024f7bdde776ed0b1161de20b408875de7e030c3/psutil-5.4.6.tar.gz"; - sha256 = "1xmw4qi6hnrhw81xqzkvmsm9im7j2vkk4v26ycjwq2jczqsmlvk8"; + url = "https://files.pythonhosted.org/packages/7d/9a/1e93d41708f8ed2b564395edfa3389f0fd6d567597401c2e5e2775118d8b/psutil-5.4.7.tar.gz"; + sha256 = "0fsgmvzwbdbszkwfnqhib8jcxm4w6zyhvlxlcda0rfm5cyqj4qsv"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal ]; }; }; "psycopg2" = super.buildPythonPackage { - name = "psycopg2-2.7.4"; + name = "psycopg2-2.7.5"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/74/83/51580322ed0e82cba7ad8e0af590b8fb2cf11bd5aaa1ed872661bd36f462/psycopg2-2.7.4.tar.gz"; - sha256 = "02b2yaf1hlwb91xkscbzmajpfj5z3d8yikzh5r48fs8gss8i3xcb"; + url = "https://files.pythonhosted.org/packages/b2/c1/7bf6c464e903ffc4f3f5907c389e5a4199666bf57f6cd6bf46c17912a1f9/psycopg2-2.7.5.tar.gz"; + sha256 = "17klx964gw8z0znl0raz3by8vdc7cq5gxj4pdcrfcina84nrdkzc"; }; meta = { license = [ pkgs.lib.licenses.zpl21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ]; @@ -1167,11 +1117,11 @@ self: super: { }; }; "py" = super.buildPythonPackage { - name = "py-1.5.3"; + name = "py-1.6.0"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/f7/84/b4c6e84672c4ceb94f727f3da8344037b62cee960d80e999b1cd9b832d83/py-1.5.3.tar.gz"; - sha256 = "10gq2lckvgwlk9w6yzijhzkarx44hsaknd0ypa08wlnpjnsgmj99"; + url = "https://files.pythonhosted.org/packages/4f/38/5f427d1eedae73063ce4da680d2bae72014995f9fdeaa57809df61c968cd/py-1.6.0.tar.gz"; + sha256 = "1wcs3zv9wl5m5x7p16avqj2gsrviyb23yvc3pr330isqs0sh98q6"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -1393,6 +1343,22 @@ self: super: { license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ]; }; }; + "pyramid-mailer" = super.buildPythonPackage { + name = "pyramid-mailer-0.15.1"; + doCheck = false; + propagatedBuildInputs = [ + self."pyramid" + self."repoze.sendmail" + self."transaction" + ]; + src = fetchurl { + url = "https://files.pythonhosted.org/packages/a0/f2/6febf5459dff4d7e653314d575469ad2e11b9d2af2c3606360e1c67202f2/pyramid_mailer-0.15.1.tar.gz"; + sha256 = "16vg8jb203jgb7b0hd6wllfqvp542qh2ry1gjai2m6qpv5agy2pc"; + }; + meta = { + license = [ pkgs.lib.licenses.bsdOriginal ]; + }; + }; "pyramid-mako" = super.buildPythonPackage { name = "pyramid-mako-1.0.2"; doCheck = false; @@ -1420,7 +1386,7 @@ self: super: { }; }; "pytest" = super.buildPythonPackage { - name = "pytest-3.6.0"; + name = "pytest-3.8.2"; doCheck = false; propagatedBuildInputs = [ self."py" @@ -1431,25 +1397,26 @@ self: super: { self."atomicwrites" self."pluggy" self."funcsigs" + self."pathlib2" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/67/6a/5bcdc22f8dbada1d2910d6e1a3a03f6b14306c78f81122890735b28be4bf/pytest-3.6.0.tar.gz"; - sha256 = "0bdfazvjjbxssqzyvkb3m2x2in7xv56ipr899l00s87k7815sm9r"; + url = "https://files.pythonhosted.org/packages/5f/d2/7f77f406ac505abda02ab4afb50d06ebf304f6ea42fca34f8f37529106b2/pytest-3.8.2.tar.gz"; + sha256 = "18nrwzn61kph2y6gxwfz9ms68rfvr9d4vcffsxng9p7jk9z18clk"; }; meta = { license = [ pkgs.lib.licenses.mit ]; }; }; "pytest-cov" = super.buildPythonPackage { - name = "pytest-cov-2.5.1"; + name = "pytest-cov-2.6.0"; doCheck = false; propagatedBuildInputs = [ self."pytest" self."coverage" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/24/b4/7290d65b2f3633db51393bdf8ae66309b37620bc3ec116c5e357e3e37238/pytest-cov-2.5.1.tar.gz"; - sha256 = "0bbfpwdh9k3636bxc88vz9fa7vf4akchgn513ql1vd0xy4n7bah3"; + url = "https://files.pythonhosted.org/packages/d9/e2/58f90a316fbd94dd50bf5c826a23f3f5d079fb3cc448c1e9f0e3c33a3d2a/pytest-cov-2.6.0.tar.gz"; + sha256 = "0qnpp9y3ygx4jk4pf5ad71fh2skbvnr6gl54m7rg5qysnx4g0q73"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.mit ]; @@ -1498,14 +1465,14 @@ self: super: { }; }; "pytest-timeout" = super.buildPythonPackage { - name = "pytest-timeout-1.2.1"; + name = "pytest-timeout-1.3.2"; doCheck = false; propagatedBuildInputs = [ self."pytest" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/be/e9/a9106b8bc87521c6813060f50f7d1fdc15665bc1bbbe71c0ffc1c571aaa2/pytest-timeout-1.2.1.tar.gz"; - sha256 = "1kdp6qbh5v1168l99rba5yfzvy05gmzkmkhldgp36p9xcdjd5dv8"; + url = "https://files.pythonhosted.org/packages/8c/3e/1b6a319d12ae7baa3acb7c18ff2c8630a09471a0319d43535c683b4d03eb/pytest-timeout-1.3.2.tar.gz"; + sha256 = "09wnmzvnls2mnsdz7x3c3sk2zdp6jl4dryvyj5i8hqz16q2zq5qi"; }; meta = { license = [ pkgs.lib.licenses.mit { fullName = "DFSG approved"; } ]; @@ -1620,6 +1587,22 @@ self: super: { license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ]; }; }; + "repoze.sendmail" = super.buildPythonPackage { + name = "repoze.sendmail-4.4.1"; + doCheck = false; + propagatedBuildInputs = [ + self."setuptools" + self."zope.interface" + self."transaction" + ]; + src = fetchurl { + url = "https://files.pythonhosted.org/packages/12/4e/8ef1fd5c42765d712427b9c391419a77bd48877886d2cbc5e9f23c8cad9b/repoze.sendmail-4.4.1.tar.gz"; + sha256 = "096ln02jr2afk7ab9j2czxqv2ryqq7m86ah572nqplx52iws73ks"; + }; + meta = { + license = [ pkgs.lib.licenses.zpl21 ]; + }; + }; "requests" = super.buildPythonPackage { name = "requests-2.9.1"; doCheck = false; @@ -1632,7 +1615,7 @@ self: super: { }; }; "rhodecode-enterprise-ce" = super.buildPythonPackage { - name = "rhodecode-enterprise-ce-4.13.3"; + name = "rhodecode-enterprise-ce-4.14.0"; buildInputs = [ self."pytest" self."py" @@ -1640,8 +1623,8 @@ self: super: { self."pytest-sugar" self."pytest-runner" self."pytest-profiling" + self."pytest-timeout" self."gprof2dot" - self."pytest-timeout" self."mock" self."webtest" self."cov-core" @@ -1688,7 +1671,6 @@ self: super: { self."mysql-python" self."pymysql" self."pyotp" - self."objgraph" self."packaging" self."paste" self."pastedeploy" @@ -1709,6 +1691,7 @@ self: super: { self."pyramid-jinja2" self."pyramid-mako" self."pyramid" + self."pyramid-mailer" self."pysqlite" self."python-dateutil" self."python-ldap" @@ -1722,7 +1705,6 @@ self: super: { self."repoze.lru" self."requests" self."routes" - self."setproctitle" self."simplejson" self."six" self."sqlalchemy" @@ -1756,10 +1738,9 @@ self: super: { self."greenlet" self."gunicorn" self."waitress" + self."setproctitle" self."ipdb" self."ipython" - self."cprofilev" - self."bottle" self."rhodecode-tools" self."appenlight-client" self."pytest" @@ -1768,8 +1749,8 @@ self: super: { self."pytest-sugar" self."pytest-runner" self."pytest-profiling" + self."pytest-timeout" self."gprof2dot" - self."pytest-timeout" self."mock" self."webtest" self."cov-core" @@ -1781,7 +1762,7 @@ self: super: { }; }; "rhodecode-tools" = super.buildPythonPackage { - name = "rhodecode-tools-0.16.0"; + name = "rhodecode-tools-1.0.1"; doCheck = false; propagatedBuildInputs = [ self."click" @@ -1796,11 +1777,11 @@ self: super: { self."whoosh" ]; src = fetchurl { - url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.16.0.tar.gz?md5=87f81286b49156c2ac36f1a1acfa2164"; - sha256 = "00xcc2mj99lx9d0ksml0p2xrd00kf5ypwyigg58cc9j9bznx7mzr"; + url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v1.0.1.tar.gz?md5=ffb5d6bcb855305b93cfe23ad42e500b"; + sha256 = "0nr300s4sg685qs4wgbwlplwriawrwi6jq79z37frcnpyc89gpvm"; }; meta = { - license = [ { fullName = "AGPLv3 and Proprietary"; } ]; + license = [ { fullName = "Apache 2.0 and Proprietary"; } ]; }; }; "routes" = super.buildPythonPackage { @@ -1841,11 +1822,11 @@ self: super: { }; }; "setuptools" = super.buildPythonPackage { - name = "setuptools-40.1.0"; + name = "setuptools-40.4.3"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/5a/df/b2e3d9693bb0dcbeac516a73dd7a9eb82b126ae52e4a74605a9b01beddd5/setuptools-40.1.0.zip"; - sha256 = "0w1blx5ajga5y15dci0mddk49cf2xpq0mp7rp7jrqr2diqk00ib6"; + url = "https://files.pythonhosted.org/packages/6e/9c/6a003320b00ef237f94aa74e4ad66c57a7618f6c79d67527136e2544b728/setuptools-40.4.3.zip"; + sha256 = "058v6zns4634n4al2nmmvp15j8nrgwn8wjrbdks47wk3vm05gg5c"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -1922,11 +1903,11 @@ self: super: { }; }; "subprocess32" = super.buildPythonPackage { - name = "subprocess32-3.5.1"; + name = "subprocess32-3.5.2"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/de/fb/fd3e91507021e2aecdb081d1b920082628d6b8869ead845e3e87b3d2e2ca/subprocess32-3.5.1.tar.gz"; - sha256 = "0wgi3bfnssid1g6h0v803z3k1wjal6il16nr3r9c587cfzwfkv0q"; + url = "https://files.pythonhosted.org/packages/c3/5f/7117737fc7114061837a4f51670d863dd7f7f9c762a6546fa8a0dcfe61c8/subprocess32-3.5.2.tar.gz"; + sha256 = "11v62shwmdys48g7ncs3a8jwwnkcl8d4zcwy6dk73z1zy2f9hazb"; }; meta = { license = [ pkgs.lib.licenses.psfl ]; @@ -1969,11 +1950,11 @@ self: super: { }; }; "testpath" = super.buildPythonPackage { - name = "testpath-0.3.1"; + name = "testpath-0.4.2"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/f4/8b/b71e9ee10e5f751e9d959bc750ab122ba04187f5aa52aabdc4e63b0e31a7/testpath-0.3.1.tar.gz"; - sha256 = "02bnmkvm6a8a1p5kcygylcd19v2s040qw3zp1n8ab3bqkj1kflqd"; + url = "https://files.pythonhosted.org/packages/06/30/9a7e917066d851d8b4117e85794b5f14516419ea714a8a2681ec6aa8a981/testpath-0.4.2.tar.gz"; + sha256 = "1y40hywscnnyb734pnzm55nd8r8kp1072bjxbil83gcd53cv755n"; }; meta = { license = [ ]; @@ -1996,6 +1977,20 @@ self: super: { license = [ pkgs.lib.licenses.bsdOriginal ]; }; }; + "transaction" = super.buildPythonPackage { + name = "transaction-2.4.0"; + doCheck = false; + propagatedBuildInputs = [ + self."zope.interface" + ]; + src = fetchurl { + url = "https://files.pythonhosted.org/packages/9d/7d/0e8af0d059e052b9dcf2bb5a08aad20ae3e238746bdd3f8701a60969b363/transaction-2.4.0.tar.gz"; + sha256 = "17wz1y524ca07vr03yddy8dv0gbscs06dbdywmllxv5rc725jq3j"; + }; + meta = { + license = [ pkgs.lib.licenses.zpl21 ]; + }; + }; "translationstring" = super.buildPythonPackage { name = "translationstring-1.3"; doCheck = false; diff --git a/pkgs/shell-generate.nix b/pkgs/shell-generate.nix --- a/pkgs/shell-generate.nix +++ b/pkgs/shell-generate.nix @@ -23,9 +23,6 @@ pkgs.stdenv.mkDerivation { pip2nix.pip2nix pythonPackages.pip-tools - # Allows to generate bower dependencies - pkgs.nodePackages.bower2nix - # Allows to generate node dependencies pkgs.nodePackages.node2nix diff --git a/release.nix b/release.nix --- a/release.nix +++ b/release.nix @@ -1,14 +1,12 @@ # This file defines how to "build" for packaging. -{ pkgs ? import {} -, doCheck ? false +{ doCheck ? false }: let enterprise_ce = import ./default.nix { inherit - doCheck - pkgs; + doCheck; # disable checkPhase for build checkPhase = '' diff --git a/requirements.txt b/requirements.txt --- a/requirements.txt +++ b/requirements.txt @@ -4,8 +4,8 @@ setuptools-scm==2.1.0 amqp==2.3.1 # not released authomatic that has updated some oauth providers https://code.rhodecode.com/upstream/authomatic/archive/90a9ce60cc405ae8a2bf5c3713acd5d78579a04e.tar.gz?md5=3c68720a1322b25254009518d1ff6801#egg=authomatic==0.1.0.post1 -atomicwrites==1.1.5 -attrs==18.1.0 +atomicwrites==1.2.1 +attrs==18.2.0 babel==1.3 beaker==1.9.1 celery==4.1.1 @@ -19,7 +19,7 @@ cssselect==1.0.3 decorator==4.1.2 deform==2.0.5 docutils==0.14.0 -dogpile.cache==0.6.6 +dogpile.cache==0.6.7 dogpile.core==0.4.1 ecdsa==0.13 formencode==1.2.4 @@ -40,15 +40,14 @@ msgpack-python==0.5.6 mysql-python==1.2.5 pymysql==0.8.1 pyotp==2.2.6 -objgraph==3.1.1 packaging==15.2 paste==2.0.3 pastedeploy==1.5.2 pastescript==2.0.2 -pathlib2==2.3.0 +pathlib2==2.3.2 peppercorn==0.5 -psutil==5.4.6 -psycopg2==2.7.4 +psutil==5.4.7 +psycopg2==2.7.5 py-bcrypt==0.4 pycrypto==2.6.1 pycurl==7.43.0.2 @@ -61,6 +60,7 @@ pyramid-debugtoolbar==4.4.0 pyramid-jinja2==2.7 pyramid-mako==1.0.2 pyramid==1.9.2 +pyramid_mailer==0.15.1 pysqlite==2.8.3 python-dateutil python-ldap==3.1.0 @@ -74,12 +74,11 @@ redis==2.10.6 repoze.lru==0.7 requests==2.9.1 routes==2.4.1 -setproctitle==1.1.10 simplejson==3.11.1 six==1.11.0 sqlalchemy==1.1.18 sshpubkeys==2.2.0 -subprocess32==3.5.1 +subprocess32==3.5.2 supervisor==3.3.4 tempita==0.5.2 translationstring==1.3 @@ -113,22 +112,24 @@ invoke==0.13.0 bumpversion==0.5.3 ## http servers -gevent==1.3.5 -greenlet==0.4.13 +gevent==1.3.6 +greenlet==0.4.15 gunicorn==19.9.0 waitress==1.1.0 +setproctitle==1.1.10 ## debug ipdb==0.11.0 ipython==5.1.0 -cprofilev==1.0.7 -bottle==0.12.13 ## rhodecode-tools, special case -https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.16.0.tar.gz?md5=87f81286b49156c2ac36f1a1acfa2164#egg=rhodecode-tools==0.16.0 +https://code.rhodecode.com/rhodecode-tools-ce/archive/v1.0.1.tar.gz?md5=ffb5d6bcb855305b93cfe23ad42e500b#egg=rhodecode-tools==1.0.1 ## appenlight appenlight-client==0.6.25 ## test related requirements -r requirements_test.txt + +## uncomment to add the debug libraries +#-r requirements_debug.txt diff --git a/requirements_debug.txt b/requirements_debug.txt new file mode 100644 --- /dev/null +++ b/requirements_debug.txt @@ -0,0 +1,3 @@ +## special libraries we could extend the requirements.txt file with to add some +## custom libraries usefull for debug and memory tracing +objgraph==3.1.1 diff --git a/requirements_test.txt b/requirements_test.txt --- a/requirements_test.txt +++ b/requirements_test.txt @@ -1,14 +1,14 @@ # test related requirements -pytest==3.6.0 -py==1.5.3 -pytest-cov==2.5.1 +pytest==3.8.2 +py==1.6.0 +pytest-cov==2.6.0 pytest-sugar==0.9.1 pytest-runner==4.2.0 pytest-profiling==1.3.0 +pytest-timeout==1.3.2 gprof2dot==2017.9.19 -pytest-timeout==1.2.1 mock==1.0.1 webtest==2.0.29 cov-core==1.15.0 -coverage==3.7.1 +coverage==4.5.1 diff --git a/rhodecode/VERSION b/rhodecode/VERSION --- a/rhodecode/VERSION +++ b/rhodecode/VERSION @@ -1,1 +1,1 @@ -4.13.3 \ No newline at end of file +4.14.0 \ No newline at end of file diff --git a/rhodecode/__init__.py b/rhodecode/__init__.py --- a/rhodecode/__init__.py +++ b/rhodecode/__init__.py @@ -51,7 +51,7 @@ PYRAMID_SETTINGS = {} EXTENSIONS = {} __version__ = ('.'.join((str(each) for each in VERSION[:3]))) -__dbversion__ = 90 # defines current db version for migrations +__dbversion__ = 91 # defines current db version for migrations __platform__ = platform.system() __license__ = 'AGPLv3, and Commercial License' __author__ = 'RhodeCode GmbH' diff --git a/rhodecode/api/__init__.py b/rhodecode/api/__init__.py --- a/rhodecode/api/__init__.py +++ b/rhodecode/api/__init__.py @@ -204,7 +204,7 @@ def request_view(request): message='Request from IP:%s not allowed' % ( request.rpc_ip_addr,)) else: - log.info('Access for IP:%s allowed' % (request.rpc_ip_addr,)) + log.info('Access for IP:%s allowed', request.rpc_ip_addr) # register our auth-user request.rpc_user = auth_u @@ -352,8 +352,7 @@ def setup_request(request): request.rpc_params = json_body['args'] \ if isinstance(json_body['args'], dict) else {} - log.debug( - 'method: %s, params: %s' % (request.rpc_method, request.rpc_params)) + log.debug('method: %s, params: %s', request.rpc_method, request.rpc_params) except KeyError as e: raise JSONRPCError('Incorrect JSON data. Missing %s' % e) diff --git a/rhodecode/api/exc.py b/rhodecode/api/exc.py --- a/rhodecode/api/exc.py +++ b/rhodecode/api/exc.py @@ -20,7 +20,9 @@ class JSONRPCBaseError(Exception): - pass + def __init__(self, message='', *args): + self.message = message + super(JSONRPCBaseError, self).__init__(message, *args) class JSONRPCError(JSONRPCBaseError): @@ -31,7 +33,8 @@ class JSONRPCValidationError(JSONRPCBase def __init__(self, *args, **kwargs): self.colander_exception = kwargs.pop('colander_exc') - super(JSONRPCValidationError, self).__init__(*args, **kwargs) + super(JSONRPCValidationError, self).__init__( + message=self.colander_exception, *args) class JSONRPCForbidden(JSONRPCBaseError): diff --git a/rhodecode/api/tests/test_comment_commit.py b/rhodecode/api/tests/test_comment_commit.py --- a/rhodecode/api/tests/test_comment_commit.py +++ b/rhodecode/api/tests/test_comment_commit.py @@ -65,7 +65,7 @@ class TestCommentCommit(object): self, backend, status_change, message, commit_id, no_notifications): - commit_id = backend.repo.scm_instance().get_changeset(commit_id).raw_id + commit_id = backend.repo.scm_instance().get_commit(commit_id).raw_id id_, params = build_data( self.apikey, 'comment_commit', repoid=backend.repo_name, @@ -74,7 +74,7 @@ class TestCommentCommit(object): repo = backend.repo.scm_instance() expected = { 'msg': 'Commented on commit `%s` for repository `%s`' % ( - repo.get_changeset().raw_id, backend.repo_name), + repo.get_commit().raw_id, backend.repo_name), 'status_change': status_change, 'success': True } diff --git a/rhodecode/api/tests/test_create_pull_request.py b/rhodecode/api/tests/test_create_pull_request.py --- a/rhodecode/api/tests/test_create_pull_request.py +++ b/rhodecode/api/tests/test_create_pull_request.py @@ -66,6 +66,7 @@ class TestCreatePullRequestApi(object): expected_message = "Created new pull request `{title}`".format( title=data['title']) result = response.json + assert result['error'] == None assert result['result']['msg'] == expected_message pull_request_id = result['result']['pull_request_id'] pull_request = PullRequestModel().get(pull_request_id) @@ -88,6 +89,7 @@ class TestCreatePullRequestApi(object): expected_message = "Created new pull request `{title}`".format( title=data['title']) result = response.json + assert result['error'] == None assert result['result']['msg'] == expected_message pull_request_id = result['result']['pull_request_id'] pull_request = PullRequestModel().get(pull_request_id) @@ -127,6 +129,7 @@ class TestCreatePullRequestApi(object): expected_message = "Created new pull request `{title}`".format( title=data['title']) result = response.json + assert result['error'] == None assert result['result']['msg'] == expected_message pull_request_id = result['result']['pull_request_id'] pull_request = PullRequestModel().get(pull_request_id) @@ -170,6 +173,7 @@ class TestCreatePullRequestApi(object): expected_message = "Created new pull request `{title}`".format( title=data['title']) result = response.json + assert result['error'] == None assert result['result']['msg'] == expected_message pull_request_id = result['result']['pull_request_id'] pull_request = PullRequestModel().get(pull_request_id) diff --git a/rhodecode/api/tests/test_pull.py b/rhodecode/api/tests/test_pull.py --- a/rhodecode/api/tests/test_pull.py +++ b/rhodecode/api/tests/test_pull.py @@ -19,7 +19,7 @@ # and proprietary license terms, please see https://rhodecode.com/licenses/ import os - +import mock import pytest from rhodecode.tests import TESTS_TMP_PATH @@ -29,6 +29,7 @@ from rhodecode.api.tests.utils import ( @pytest.mark.usefixtures("testuser_api", "app") class TestPull(object): + @pytest.mark.backends("git", "hg") def test_api_pull(self, backend): r = backend.create_repo() @@ -37,12 +38,13 @@ class TestPull(object): r.clone_uri = clone_uri id_, params = build_data(self.apikey, 'pull', repoid=repo_name,) - response = api_call(self.app, params) - msg = 'Pulled from url `%s` on repo `%s`' % ( - clone_uri, repo_name) - expected = {'msg': msg, - 'repository': repo_name} - assert_ok(id_, expected, given=response.body) + with mock.patch('rhodecode.model.scm.url_validator'): + response = api_call(self.app, params) + msg = 'Pulled from url `%s` on repo `%s`' % ( + clone_uri, repo_name) + expected = {'msg': msg, + 'repository': repo_name} + assert_ok(id_, expected, given=response.body) def test_api_pull_error(self, backend): id_, params = build_data( diff --git a/rhodecode/api/tests/test_update_pull_request.py b/rhodecode/api/tests/test_update_pull_request.py --- a/rhodecode/api/tests/test_update_pull_request.py +++ b/rhodecode/api/tests/test_update_pull_request.py @@ -89,7 +89,6 @@ class TestUpdatePullRequest(object): pr_util.update_source_repository(head='c') repo = pull_request.source_repo.scm_instance() commits = [x for x in repo.get_commits()] - print commits added_commit_id = commits[-1].raw_id # c commit common_commit_id = commits[1].raw_id # b commit is common ancestor diff --git a/rhodecode/api/tests/test_update_repo.py b/rhodecode/api/tests/test_update_repo.py --- a/rhodecode/api/tests/test_update_repo.py +++ b/rhodecode/api/tests/test_update_repo.py @@ -26,7 +26,7 @@ from rhodecode.tests import TEST_USER_AD from rhodecode.api.tests.utils import ( build_data, api_call, assert_error, assert_ok, crash, jsonify) from rhodecode.tests.fixture import Fixture -from rhodecode.tests.plugin import http_host_stub, http_host_only_stub +from rhodecode.tests.plugin import plain_http_host_only_stub fixture = Fixture() @@ -56,9 +56,15 @@ class TestApiUpdateRepo(object): ({'clone_uri': ''}, {'clone_uri': ''}), + ({'clone_uri': 'http://example.com/repo_pull'}, + {'clone_uri': 'http://example.com/repo_pull'}), + ({'push_uri': ''}, {'push_uri': ''}), + ({'push_uri': 'http://example.com/repo_push'}, + {'push_uri': 'http://example.com/repo_push'}), + ({'landing_rev': 'rev:tip'}, {'landing_rev': ['rev', 'tip']}), @@ -74,7 +80,7 @@ class TestApiUpdateRepo(object): ({'repo_name': 'new_repo_name'}, { 'repo_name': 'new_repo_name', - 'url': 'http://{}/new_repo_name'.format(http_host_only_stub()) + 'url': 'http://{}/new_repo_name'.format(plain_http_host_only_stub()) }), ({'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME), @@ -82,7 +88,7 @@ class TestApiUpdateRepo(object): { 'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME), 'url': 'http://{}/test_group_for_update/{}'.format( - http_host_only_stub(), UPDATE_REPO_NAME) + plain_http_host_only_stub(), UPDATE_REPO_NAME) }), ]) def test_api_update_repo(self, updates, expected, backend): diff --git a/rhodecode/api/views/repo_api.py b/rhodecode/api/views/repo_api.py --- a/rhodecode/api/views/repo_api.py +++ b/rhodecode/api/views/repo_api.py @@ -33,7 +33,7 @@ from rhodecode.lib import audit_logger from rhodecode.lib import repo_maintenance from rhodecode.lib.auth import HasPermissionAnyApi, HasUserGroupPermissionAnyApi from rhodecode.lib.celerylib.utils import get_task_id -from rhodecode.lib.utils2 import str2bool, time_to_datetime +from rhodecode.lib.utils2 import str2bool, time_to_datetime, safe_str from rhodecode.lib.ext_json import json from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError from rhodecode.model.changeset_status import ChangesetStatusModel @@ -316,7 +316,7 @@ def get_repo_changeset(request, apiuser, try: cs = repo.get_commit(commit_id=revision, pre_load=pre_load) except TypeError as e: - raise JSONRPCError(e.message) + raise JSONRPCError(safe_str(e)) _cs_json = cs.__json__() _cs_json['diff'] = build_commit_data(cs, changes_details) if changes_details == 'full': @@ -382,7 +382,7 @@ def get_repo_changesets(request, apiuser commits = vcs_repo.get_commits( start_id=start_rev, pre_load=pre_load) except TypeError as e: - raise JSONRPCError(e.message) + raise JSONRPCError(safe_str(e)) except Exception: log.exception('Fetching of commits failed') raise JSONRPCError('Error occurred during commit fetching') @@ -1433,7 +1433,7 @@ def comment_commit( commit_id = repo.scm_instance().get_commit(commit_id=commit_id).raw_id except Exception as e: log.exception('Failed to fetch commit') - raise JSONRPCError(e.message) + raise JSONRPCError(safe_str(e)) if isinstance(userid, Optional): userid = apiuser.user_id diff --git a/rhodecode/apps/_base/__init__.py b/rhodecode/apps/_base/__init__.py --- a/rhodecode/apps/_base/__init__.py +++ b/rhodecode/apps/_base/__init__.py @@ -25,7 +25,8 @@ import operator from pyramid.httpexceptions import HTTPFound, HTTPForbidden, HTTPBadRequest from rhodecode.lib import helpers as h, diffs -from rhodecode.lib.utils2 import StrictAttributeDict, safe_int, datetime_to_time +from rhodecode.lib.utils2 import ( + StrictAttributeDict, safe_int, datetime_to_time, safe_unicode) from rhodecode.lib.vcs.exceptions import RepositoryRequirementError from rhodecode.model import repo from rhodecode.model import repo_group @@ -61,12 +62,13 @@ def add_route_with_slash(config,name, pa config.add_route(name + '_slash', pattern + '/', **kw) -def add_route_requirements(route_path, requirements=URL_NAME_REQUIREMENTS): +def add_route_requirements(route_path, requirements=None): """ Adds regex requirements to pyramid routes using a mapping dict e.g:: add_route_requirements('{repo_name}/settings') """ + requirements = requirements or URL_NAME_REQUIREMENTS for key, regex in requirements.items(): route_path = route_path.replace('{%s}' % key, '{%s:%s}' % (key, regex)) return route_path @@ -201,7 +203,7 @@ class RepoAppView(BaseAppView): def _handle_missing_requirements(self, error): log.error( 'Requirements are missing for repository %s: %s', - self.db_repo_name, error.message) + self.db_repo_name, safe_unicode(error)) def _get_local_tmpl_context(self, include_app_defaults=True): _ = self.request.translate @@ -301,7 +303,8 @@ class PathFilter(object): def render_patchset_filtered(self, diffset, patchset, source_ref=None, target_ref=None): filtered_patchset, has_hidden_changes = self.filter_patchset(patchset) - result = diffset.render_patchset(filtered_patchset, source_ref=source_ref, target_ref=target_ref) + result = diffset.render_patchset( + filtered_patchset, source_ref=source_ref, target_ref=target_ref) result.has_hidden_changes = has_hidden_changes return result @@ -505,6 +508,36 @@ class RepoRoutePredicate(object): return False +class RepoForbidArchivedRoutePredicate(object): + def __init__(self, val, config): + self.val = val + + def text(self): + return 'repo_forbid_archived = %s' % self.val + + phash = text + + def __call__(self, info, request): + _ = request.translate + rhodecode_db_repo = request.db_repo + + log.debug( + '%s checking if archived flag for repo for %s', + self.__class__.__name__, rhodecode_db_repo.repo_name) + + if rhodecode_db_repo.archived: + log.warning('Current view is not supported for archived repo:%s', + rhodecode_db_repo.repo_name) + + h.flash( + h.literal(_('Action not supported for archived repository.')), + category='warning') + summary_url = request.route_path( + 'repo_summary', repo_name=rhodecode_db_repo.repo_name) + raise HTTPFound(summary_url) + return True + + class RepoTypeRoutePredicate(object): def __init__(self, val, config): self.val = val or ['hg', 'git', 'svn'] @@ -530,13 +563,6 @@ class RepoTypeRoutePredicate(object): else: log.warning('Current view is not supported for repo type:%s', rhodecode_db_repo.repo_type) - - # h.flash(h.literal( - # _('Action not supported for %s.' % rhodecode_repo.alias)), - # category='warning') - # return redirect( - # route_path('repo_summary', repo_name=cls.rhodecode_db_repo.repo_name)) - return False @@ -643,10 +669,12 @@ def includeme(config): config.add_route_predicate( 'repo_accepted_types', RepoTypeRoutePredicate) config.add_route_predicate( + 'repo_forbid_when_archived', RepoForbidArchivedRoutePredicate) + config.add_route_predicate( 'repo_group_route', RepoGroupRoutePredicate) config.add_route_predicate( 'user_group_route', UserGroupRoutePredicate) config.add_route_predicate( 'user_route_with_default', UserRouteWithDefaultPredicate) config.add_route_predicate( - 'user_route', UserRoutePredicate) \ No newline at end of file + 'user_route', UserRoutePredicate) diff --git a/rhodecode/apps/admin/tests/test_admin_settings.py b/rhodecode/apps/admin/tests/test_admin_settings.py --- a/rhodecode/apps/admin/tests/test_admin_settings.py +++ b/rhodecode/apps/admin/tests/test_admin_settings.py @@ -488,14 +488,30 @@ class TestLabsSettings(object): class TestOpenSourceLicenses(object): def test_records_are_displayed(self, autologin_user): - sample_licenses = { - "python2.7-pytest-2.7.1": { - "UNKNOWN": None + sample_licenses = [ + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-coverage-3.7.1" }, - "python2.7-Markdown-2.6.2": { - "BSD-3-Clause": "http://spdx.org/licenses/BSD-3-Clause" - } - } + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-bootstrapped-pip-9.0.1" + }, + ] read_licenses_patch = mock.patch( 'rhodecode.apps.admin.views.open_source_licenses.read_opensource_licenses', return_value=sample_licenses) @@ -506,10 +522,9 @@ class TestOpenSourceLicenses(object): assert_response = AssertResponse(response) assert_response.element_contains( '.panel-heading', 'Licenses of Third Party Packages') - for name in sample_licenses: - response.mustcontain(name) - for license in sample_licenses[name]: - assert_response.element_contains('.panel-body', license) + for license_data in sample_licenses: + response.mustcontain(license_data["license"][0]["spdxId"]) + assert_response.element_contains('.panel-body', license_data["name"]) def test_records_can_be_read(self, autologin_user): response = self.app.get( diff --git a/rhodecode/apps/admin/views/open_source_licenses.py b/rhodecode/apps/admin/views/open_source_licenses.py --- a/rhodecode/apps/admin/views/open_source_licenses.py +++ b/rhodecode/apps/admin/views/open_source_licenses.py @@ -35,7 +35,6 @@ class OpenSourceLicensesAdminSettingsVie def load_default_context(self): c = self._get_local_tmpl_context() - return c @LoginRequired() @@ -47,7 +46,6 @@ class OpenSourceLicensesAdminSettingsVie c = self.load_default_context() c.active = 'open_source' c.navlist = navigation_list(self.request) - items = sorted(read_opensource_licenses().items(), key=lambda t: t[0]) - c.opensource_licenses = collections.OrderedDict(items) - + c.opensource_licenses = sorted( + read_opensource_licenses(), key=lambda d: d["name"]) return self._get_template_context(c) diff --git a/rhodecode/apps/admin/views/process_management.py b/rhodecode/apps/admin/views/process_management.py --- a/rhodecode/apps/admin/views/process_management.py +++ b/rhodecode/apps/admin/views/process_management.py @@ -26,6 +26,7 @@ from pyramid.view import view_config from rhodecode.apps._base import BaseAppView from rhodecode.apps.admin.navigation import navigation_list +from rhodecode.lib import system_info from rhodecode.lib.auth import ( LoginRequired, HasPermissionAllDecorator, CSRFRequired) from rhodecode.lib.utils2 import safe_int, StrictAttributeDict @@ -71,6 +72,16 @@ class AdminProcessManagementView(BaseApp return proc_list + def get_workers(self): + workers = None + try: + rc_config = system_info.rhodecode_config().value['config'] + workers = rc_config['server:main'].get('workers') + except Exception: + pass + + return workers or '?' + @LoginRequired() @HasPermissionAllDecorator('hg.admin') @view_config( @@ -83,6 +94,7 @@ class AdminProcessManagementView(BaseApp c.active = 'process_management' c.navlist = navigation_list(self.request) c.gunicorn_processes = self.get_processes() + c.gunicorn_workers = self.get_workers() return self._get_template_context(c) @LoginRequired() diff --git a/rhodecode/apps/channelstream/views.py b/rhodecode/apps/channelstream/views.py --- a/rhodecode/apps/channelstream/views.py +++ b/rhodecode/apps/channelstream/views.py @@ -26,7 +26,7 @@ from pyramid.httpexceptions import HTTPB from rhodecode.apps._base import BaseAppView from rhodecode.lib.channelstream import ( - channelstream_request, + channelstream_request, get_channelstream_server_url, ChannelstreamConnectionException, ChannelstreamPermissionException, check_channel_permissions, @@ -56,8 +56,9 @@ class ChannelstreamView(BaseAppView): @NotAnonymous() @view_config(route_name='channelstream_connect', renderer='json_ext') def connect(self): + """ handle authorization of users trying to connect """ + self.load_default_context() - """ handle authorization of users trying to connect """ try: json_body = self.request.json_body except Exception: @@ -107,11 +108,14 @@ class ChannelstreamView(BaseAppView): 'broadcast_presence_with_user_lists': True } # connect user to server + channelstream_url = get_channelstream_server_url( + self.channelstream_config, '/connect') try: - connect_result = channelstream_request(self.channelstream_config, - payload, '/connect') + connect_result = channelstream_request( + self.channelstream_config, payload, '/connect') except ChannelstreamConnectionException: - log.exception('Channelstream service is down') + log.exception( + 'Channelstream service at {} is down'.format(channelstream_url)) return HTTPBadGateway() connect_result['channels'] = channels @@ -153,17 +157,21 @@ class ChannelstreamView(BaseAppView): 'store_history': True, 'broadcast_presence_with_user_lists': True } + + channelstream_url = get_channelstream_server_url( + self.channelstream_config, '/subscribe') try: connect_result = channelstream_request( self.channelstream_config, payload, '/subscribe') except ChannelstreamConnectionException: - log.exception('Channelstream service is down') + log.exception( + 'Channelstream service at {} is down'.format(channelstream_url)) return HTTPBadGateway() # include_channel_info will limit history only to new channel # to not overwrite histories on other channels in client connect_result['channels_info'] = parse_channels_info( connect_result['channels_info'], include_channel_info=filtered_channels) - update_history_from_logs(self.channelstream_config, - filtered_channels, connect_result) + update_history_from_logs( + self.channelstream_config, filtered_channels, connect_result) return connect_result diff --git a/rhodecode/apps/debug_style/__init__.py b/rhodecode/apps/debug_style/__init__.py --- a/rhodecode/apps/debug_style/__init__.py +++ b/rhodecode/apps/debug_style/__init__.py @@ -21,22 +21,31 @@ from rhodecode.apps._base import ADMIN_P from rhodecode.lib.utils2 import str2bool -def debug_style_enabled(info, request): - return str2bool(request.registry.settings.get('debug_style')) +class DebugStylePredicate(object): + def __init__(self, val, config): + self.val = val + + def text(self): + return 'debug style route = %s' % self.val + + phash = text + + def __call__(self, info, request): + return str2bool(request.registry.settings.get('debug_style')) def includeme(config): + config.add_route_predicate( + 'debug_style', DebugStylePredicate) + config.add_route( name='debug_style_home', pattern=ADMIN_PREFIX + '/debug_style', - custom_predicates=(debug_style_enabled,)) + debug_style=True) config.add_route( name='debug_style_template', pattern=ADMIN_PREFIX + '/debug_style/t/{t_path}', - custom_predicates=(debug_style_enabled,)) + debug_style=True) # Scan module for configuration decorators. config.scan('.views', ignore='.tests') - - - diff --git a/rhodecode/apps/gist/views.py b/rhodecode/apps/gist/views.py --- a/rhodecode/apps/gist/views.py +++ b/rhodecode/apps/gist/views.py @@ -405,8 +405,8 @@ class GistView(BaseAppView): revision = self.request.GET.get('revision') if revision != last_rev.raw_id: - log.error('Last revision %s is different then submitted %s' - % (revision, last_rev)) + log.error('Last revision %s is different then submitted %s', + revision, last_rev) # our gist has newer version than we success = False diff --git a/rhodecode/apps/home/__init__.py b/rhodecode/apps/home/__init__.py --- a/rhodecode/apps/home/__init__.py +++ b/rhodecode/apps/home/__init__.py @@ -63,6 +63,10 @@ def includeme(config): name='markup_preview', pattern='/_markup_preview') + config.add_route( + name='store_user_session_value', + pattern='/_store_session_attr') + # register our static links via redirection mechanism routing_links.connect_redirection_links(config) diff --git a/rhodecode/apps/home/tests/test_home.py b/rhodecode/apps/home/tests/test_home.py --- a/rhodecode/apps/home/tests/test_home.py +++ b/rhodecode/apps/home/tests/test_home.py @@ -60,10 +60,9 @@ class TestHomeController(TestController) response = self.app.get(route_path('home')) rhodecode_version_hash = calculate_version_hash( - {'beaker.session.secret':'test-rc-uytcxaz'}) + {'beaker.session.secret': 'test-rc-uytcxaz'}) response.mustcontain('style.css?ver={0}'.format(rhodecode_version_hash)) - response.mustcontain('rhodecode-components.js?ver={0}'.format( - rhodecode_version_hash)) + response.mustcontain('scripts.js?ver={0}'.format(rhodecode_version_hash)) def test_index_contains_backend_specific_details(self, backend): self.log_user() diff --git a/rhodecode/apps/home/views.py b/rhodecode/apps/home/views.py --- a/rhodecode/apps/home/views.py +++ b/rhodecode/apps/home/views.py @@ -33,7 +33,7 @@ from rhodecode.lib.index import searcher from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int from rhodecode.lib.ext_json import json from rhodecode.model.db import ( - func, or_, in_filter_generator, Repository, RepoGroup, User, UserGroup) + func, true, or_, in_filter_generator, Repository, RepoGroup, User, UserGroup) from rhodecode.model.repo import RepoModel from rhodecode.model.repo_group import RepoGroupModel from rhodecode.model.scm import RepoGroupList, RepoList @@ -114,6 +114,7 @@ class HomeView(BaseAppView): query = Repository.query()\ .order_by(func.length(Repository.repo_name))\ .order_by(Repository.repo_name)\ + .filter(Repository.archived.isnot(true()))\ .filter(or_( # generate multiple IN to fix limitation problems *in_filter_generator(Repository.repo_id, allowed_ids) @@ -444,3 +445,18 @@ class HomeView(BaseAppView): if text: return h.render(text, renderer=renderer, mentions=True) return '' + + @LoginRequired() + @CSRFRequired() + @view_config( + route_name='store_user_session_value', request_method='POST', + renderer='string', xhr=True) + def store_user_session_attr(self): + key = self.request.POST.get('key') + val = self.request.POST.get('val') + + existing_value = self.request.session.get(key) + if existing_value != val: + self.request.session[key] = val + + return 'stored:{}'.format(key) diff --git a/rhodecode/apps/login/views.py b/rhodecode/apps/login/views.py --- a/rhodecode/apps/login/views.py +++ b/rhodecode/apps/login/views.py @@ -93,16 +93,16 @@ def get_came_from(request): allowed_schemes = ['http', 'https'] default_came_from = h.route_path('home') if parsed.scheme and parsed.scheme not in allowed_schemes: - log.error('Suspicious URL scheme detected %s for url %s' % - (parsed.scheme, parsed)) + log.error('Suspicious URL scheme detected %s for url %s', + parsed.scheme, parsed) came_from = default_came_from elif parsed.netloc and request.host != parsed.netloc: log.error('Suspicious NETLOC detected %s for url %s server url ' - 'is: %s' % (parsed.netloc, parsed, request.host)) + 'is: %s', parsed.netloc, parsed, request.host) came_from = default_came_from elif any(bad_str in parsed.path for bad_str in ('\r', '\n')): - log.error('Header injection detected `%s` for url %s server url ' % - (parsed.path, parsed)) + log.error('Header injection detected `%s` for url %s server url ', + parsed.path, parsed) came_from = default_came_from return came_from or default_came_from diff --git a/rhodecode/apps/repo_group/views/repo_group_permissions.py b/rhodecode/apps/repo_group/views/repo_group_permissions.py --- a/rhodecode/apps/repo_group/views/repo_group_permissions.py +++ b/rhodecode/apps/repo_group/views/repo_group_permissions.py @@ -29,6 +29,8 @@ from rhodecode.lib import helpers as h from rhodecode.lib import audit_logger from rhodecode.lib.auth import ( LoginRequired, HasRepoGroupPermissionAnyDecorator, CSRFRequired) +from rhodecode.lib.utils2 import safe_int +from rhodecode.model.db import UserGroup from rhodecode.model.repo_group import RepoGroupModel from rhodecode.model.forms import RepoGroupPermsForm from rhodecode.model.meta import Session @@ -101,6 +103,11 @@ class RepoGroupPermissionsView(RepoGroup for change in changes['added'] + changes['updated'] + changes['deleted']: if change['type'] == 'user': affected_user_ids.append(change['id']) + if change['type'] == 'user_group': + user_group = UserGroup.get(safe_int(change['id'])) + if user_group: + group_members_ids = [x.user_id for x in user_group.members] + affected_user_ids.extend(group_members_ids) events.trigger(events.UserPermissionsChange(affected_user_ids)) diff --git a/rhodecode/apps/repository/__init__.py b/rhodecode/apps/repository/__init__.py --- a/rhodecode/apps/repository/__init__.py +++ b/rhodecode/apps/repository/__init__.py @@ -231,11 +231,13 @@ def includeme(config): config.add_route( name='repo_fork_new', pattern='/{repo_name:.*?[^/]}/fork', repo_route=True, + repo_forbid_when_archived=True, repo_accepted_types=['hg', 'git']) config.add_route( name='repo_fork_create', pattern='/{repo_name:.*?[^/]}/fork/create', repo_route=True, + repo_forbid_when_archived=True, repo_accepted_types=['hg', 'git']) config.add_route( @@ -276,27 +278,29 @@ def includeme(config): config.add_route( name='pullrequest_new', pattern='/{repo_name:.*?[^/]}/pull-request/new', - repo_route=True, repo_accepted_types=['hg', 'git']) + repo_route=True, repo_accepted_types=['hg', 'git'], + repo_forbid_when_archived=True) config.add_route( name='pullrequest_create', pattern='/{repo_name:.*?[^/]}/pull-request/create', - repo_route=True, repo_accepted_types=['hg', 'git']) + repo_route=True, repo_accepted_types=['hg', 'git'], + repo_forbid_when_archived=True) config.add_route( name='pullrequest_update', pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/update', - repo_route=True) + repo_route=True, repo_forbid_when_archived=True) config.add_route( name='pullrequest_merge', pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/merge', - repo_route=True) + repo_route=True, repo_forbid_when_archived=True) config.add_route( name='pullrequest_delete', pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/delete', - repo_route=True) + repo_route=True, repo_forbid_when_archived=True) config.add_route( name='pullrequest_comment_create', @@ -319,6 +323,9 @@ def includeme(config): name='edit_repo_advanced', pattern='/{repo_name:.*?[^/]}/settings/advanced', repo_route=True) config.add_route( + name='edit_repo_advanced_archive', + pattern='/{repo_name:.*?[^/]}/settings/advanced/archive', repo_route=True) + config.add_route( name='edit_repo_advanced_delete', pattern='/{repo_name:.*?[^/]}/settings/advanced/delete', repo_route=True) config.add_route( diff --git a/rhodecode/apps/repository/tests/test_repo_commit_comments.py b/rhodecode/apps/repository/tests/test_repo_commit_comments.py --- a/rhodecode/apps/repository/tests/test_repo_commit_comments.py +++ b/rhodecode/apps/repository/tests/test_repo_commit_comments.py @@ -97,9 +97,10 @@ class TestRepoCommitCommentsView(TestCon comment_id = ChangesetComment.query().first().comment_id assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT - sbj = 'left {0} on commit `{1}` in the {2} repository'.format( - comment_type, h.show_id(commit), backend.repo_name) - assert sbj in notification.subject + author = notification.created_by_user.username_and_name + sbj = '{0} left a {1} on commit `{2}` in the {3} repository'.format( + author, comment_type, h.show_id(commit), backend.repo_name) + assert sbj == notification.subject lnk = (u'/{0}/changeset/{1}#comment-{2}'.format( backend.repo_name, commit_id, comment_id)) @@ -134,12 +135,18 @@ class TestRepoCommitCommentsView(TestCon if backend.alias == 'svn': response.mustcontain( '''data-f-path="vcs/commands/summary.py" ''' - '''id="a_c--ad05457a43f8"''' + '''data-anchor-id="c-300-ad05457a43f8"''' ) - else: + if backend.alias == 'git': response.mustcontain( '''data-f-path="vcs/backends/hg.py" ''' - '''id="a_c--9c390eb52cd6"''' + '''data-anchor-id="c-883e775e89ea-9c390eb52cd6"''' + ) + + if backend.alias == 'hg': + response.mustcontain( + '''data-f-path="vcs/backends/hg.py" ''' + '''data-anchor-id="c-e58d85a3973b-9c390eb52cd6"''' ) assert Notification.query().count() == 1 @@ -150,12 +157,12 @@ class TestRepoCommitCommentsView(TestCon assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT assert comment.revision == commit_id - sbj = 'left {comment_type} on commit `{commit}` ' \ - '(file: `{f_path}`) in the {repo} repository'.format( - commit=h.show_id(commit), - f_path=f_path, line=line, repo=backend.repo_name, - comment_type=comment_type) - assert sbj in notification.subject + + author = notification.created_by_user.username_and_name + sbj = '{0} left a {1} on file `{2}` in commit `{3}` in the {4} repository'.format( + author, comment_type, f_path, h.show_id(commit), backend.repo_name) + + assert sbj == notification.subject lnk = (u'/{0}/changeset/{1}#comment-{2}'.format( backend.repo_name, commit_id, comment.comment_id)) @@ -222,10 +229,10 @@ class TestRepoCommitCommentsView(TestCon comment_id = ChangesetComment.query().first().comment_id assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT - sbj = 'left note on commit `{0}` (status: Approved) ' \ - 'in the {1} repository'.format( - h.show_id(commit), backend.repo_name) - assert sbj in notification.subject + author = notification.created_by_user.username_and_name + sbj = '[status: Approved] {0} left a note on commit `{1}` in the {2} repository'.format( + author, h.show_id(commit), backend.repo_name) + assert sbj == notification.subject lnk = (u'/{0}/changeset/{1}#comment-{2}'.format( backend.repo_name, commit_id, comment_id)) @@ -283,7 +290,7 @@ class TestRepoCommitCommentsView(TestCon commit_id = '0' * 16 # fake this for tests response = self.app.post( route_path('repo_commit_comment_preview', - repo_name=backend.repo_name, commit_id=commit_id,), + repo_name=backend.repo_name, commit_id=commit_id,), params=params, extra_environ=xhr_header) diff --git a/rhodecode/apps/repository/tests/test_repo_commits.py b/rhodecode/apps/repository/tests/test_repo_commits.py --- a/rhodecode/apps/repository/tests/test_repo_commits.py +++ b/rhodecode/apps/repository/tests/test_repo_commits.py @@ -88,7 +88,7 @@ class TestRepoCommitView(object): response.mustcontain('21 files changed: 943 inserted, 288 deleted') # files op files - response.mustcontain('File no longer present at commit: %s' % + response.mustcontain('File not present at commit: %s' % _shorten_commit_id(commit_id)) # svn uses a different filename @@ -133,7 +133,7 @@ class TestRepoCommitView(object): response.mustcontain('21 files changed: 943 inserted, 288 deleted') # files op files - response.mustcontain('File no longer present at commit: %s' % + response.mustcontain('File not present at commit: %s' % _shorten_commit_id(commit_ids[1])) response.mustcontain('Added docstrings to vcs.cli') # commit msg response.mustcontain('Changed theme to ADC theme') # commit msg @@ -163,7 +163,7 @@ class TestRepoCommitView(object): response.mustcontain(_shorten_commit_id(commit_ids[1])) # files op files - response.mustcontain('File no longer present at commit: %s' % + response.mustcontain('File not present at commit: %s' % _shorten_commit_id(commit_ids[1])) # svn is special @@ -293,26 +293,13 @@ Added a symlink """ + diffs['svn'], } - def _check_diff_menus(self, response, right_menu=False,): - # diff menus - for elem in ['Show File', 'Unified Diff', 'Side-by-side Diff', - 'Raw Diff', 'Download Diff']: + def _check_new_diff_menus(self, response, right_menu=False,): + # individual file diff menus + for elem in ['Show file before', 'Show file after']: response.mustcontain(elem) # right pane diff menus if right_menu: - for elem in ['Ignore whitespace', 'Increase context', - 'Hide comments']: + for elem in ['Hide whitespace changes', 'Toggle Wide Mode diff', + 'Show full context diff']: response.mustcontain(elem) - - def _check_new_diff_menus(self, response, right_menu=False,): - # diff menus - for elem in ['Show file before', 'Show file after', - 'Raw diff', 'Download diff']: - response.mustcontain(elem) - - # right pane diff menus - if right_menu: - for elem in ['Ignore whitespace', 'Increase context', - 'Hide comments']: - response.mustcontain(elem) diff --git a/rhodecode/apps/repository/tests/test_repo_compare.py b/rhodecode/apps/repository/tests/test_repo_compare.py --- a/rhodecode/apps/repository/tests/test_repo_compare.py +++ b/rhodecode/apps/repository/tests/test_repo_compare.py @@ -104,13 +104,11 @@ class TestCompareView(object): # Comparing the revisions response = self.app.get( route_path('repo_compare', - repo_name=origin.repo_name, - source_ref_type="rev", - source_ref=commit3.raw_id, - target_ref_type="rev", - target_ref=commit4.raw_id, - params=dict(merge='1', target_repo=fork.repo_name) - )) + repo_name=origin.repo_name, + source_ref_type="rev", source_ref=commit3.raw_id, + target_ref_type="rev", target_ref=commit4.raw_id, + params=dict(merge='1', target_repo=fork.repo_name) + )) compare_page = ComparePage(response) compare_page.contains_commits([commit4]) @@ -142,13 +140,11 @@ class TestCompareView(object): response = self.app.get( route_path('repo_compare', - repo_name=repo1.repo_name, - source_ref_type="branch", - source_ref=commit_id2, - target_ref_type="branch", - target_ref=commit_id1, - params=dict(merge='1', target_repo=repo2.repo_name) - )) + repo_name=repo1.repo_name, + source_ref_type="branch", source_ref=commit_id2, + target_ref_type="branch", target_ref=commit_id1, + params=dict(merge='1', target_repo=repo2.repo_name) + )) response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2)) response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1)) @@ -156,9 +152,9 @@ class TestCompareView(object): compare_page = ComparePage(response) compare_page.contains_change_summary(1, 2, 0) compare_page.contains_commits([commit1, commit2]) - compare_page.contains_file_links_and_anchors([ - ('file1', 'a_c--826e8142e6ba'), - ]) + + anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id) + compare_page.contains_file_links_and_anchors([('file1', anchor), ]) # Swap is removed when comparing branches since it's a PR feature and # it is then a preview mode @@ -199,13 +195,11 @@ class TestCompareView(object): response = self.app.get( route_path('repo_compare', - repo_name=repo1.repo_name, - source_ref_type="branch", - source_ref=commit_id2, - target_ref_type="branch", - target_ref=commit_id1, - params=dict(merge='1', target_repo=repo2.repo_name), - )) + repo_name=repo1.repo_name, + source_ref_type="branch", source_ref=commit_id2, + target_ref_type="branch", target_ref=commit_id1, + params=dict(merge='1', target_repo=repo2.repo_name), + )) response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2)) response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1)) @@ -213,9 +207,8 @@ class TestCompareView(object): compare_page = ComparePage(response) compare_page.contains_change_summary(1, 2, 0) compare_page.contains_commits([commit1, commit2]) - compare_page.contains_file_links_and_anchors([ - ('file1', 'a_c--826e8142e6ba'), - ]) + anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id) + compare_page.contains_file_links_and_anchors([('file1', anchor), ]) # Swap is removed when comparing branches since it's a PR feature and # it is then a preview mode @@ -230,13 +223,11 @@ class TestCompareView(object): response = self.app.get( route_path('repo_compare', - repo_name=orig.repo_name, - source_ref_type="rev", - source_ref="tip", - target_ref_type="rev", - target_ref="tip", - params=dict(merge='1', target_repo=fork.repo_name), - ), + repo_name=orig.repo_name, + source_ref_type="rev", source_ref="tip", + target_ref_type="rev", target_ref="tip", + params=dict(merge='1', target_repo=fork.repo_name), + ), status=302) response = response.follow() response.mustcontain("Repositories unrelated.") @@ -289,14 +280,12 @@ class TestCompareView(object): response = self.app.get( route_path('repo_compare', - repo_name=repo2.repo_name, - source_ref_type="rev", - # parent of commit2, in target repo2 - source_ref=commit1.raw_id, - target_ref_type="rev", - target_ref=commit4.raw_id, - params=dict(merge='1', target_repo=repo1.repo_name), - )) + repo_name=repo2.repo_name, + # parent of commit2, in target repo2 + source_ref_type="rev", source_ref=commit1.raw_id, + target_ref_type="rev", target_ref=commit4.raw_id, + params=dict(merge='1', target_repo=repo1.repo_name), + )) response.mustcontain('%s@%s' % (repo2.repo_name, commit1.short_id)) response.mustcontain('%s@%s' % (repo1.repo_name, commit4.short_id)) @@ -304,9 +293,8 @@ class TestCompareView(object): compare_page = ComparePage(response) compare_page.contains_change_summary(1, 3, 0) compare_page.contains_commits([commit2, commit3, commit4]) - compare_page.contains_file_links_and_anchors([ - ('file1', 'a_c--826e8142e6ba'), - ]) + anchor = 'a_c-{}-826e8142e6ba'.format(commit1.short_id) + compare_page.contains_file_links_and_anchors([('file1', anchor),]) @pytest.mark.xfail_backends("svn") def test_compare_cherry_pick_commits_from_top(self, backend): @@ -355,14 +343,11 @@ class TestCompareView(object): response = self.app.get( route_path('repo_compare', - repo_name=repo1.repo_name, - source_ref_type="rev", - # parent of commit3, not in source repo2 - source_ref=commit2.raw_id, - target_ref_type="rev", - target_ref=commit5.raw_id, - params=dict(merge='1'), - )) + repo_name=repo1.repo_name, + # parent of commit3, not in source repo2 + source_ref_type="rev", source_ref=commit2.raw_id, + target_ref_type="rev", target_ref=commit5.raw_id, + params=dict(merge='1'),)) response.mustcontain('%s@%s' % (repo1.repo_name, commit2.short_id)) response.mustcontain('%s@%s' % (repo1.repo_name, commit5.short_id)) @@ -372,9 +357,8 @@ class TestCompareView(object): compare_page.contains_commits([commit3, commit4, commit5]) # files - compare_page.contains_file_links_and_anchors([ - ('file1', 'a_c--826e8142e6ba'), - ]) + anchor = 'a_c-{}-826e8142e6ba'.format(commit2.short_id) + compare_page.contains_file_links_and_anchors([('file1', anchor),]) @pytest.mark.xfail_backends("svn") def test_compare_remote_branches(self, backend): @@ -382,17 +366,17 @@ class TestCompareView(object): repo2 = backend.create_fork() commit_id1 = repo1.get_commit(commit_idx=3).raw_id + commit_id1_short = repo1.get_commit(commit_idx=3).short_id commit_id2 = repo1.get_commit(commit_idx=6).raw_id + commit_id2_short = repo1.get_commit(commit_idx=6).short_id response = self.app.get( route_path('repo_compare', - repo_name=repo1.repo_name, - source_ref_type="rev", - source_ref=commit_id1, - target_ref_type="rev", - target_ref=commit_id2, - params=dict(merge='1', target_repo=repo2.repo_name), - )) + repo_name=repo1.repo_name, + source_ref_type="rev", source_ref=commit_id1, + target_ref_type="rev", target_ref=commit_id2, + params=dict(merge='1', target_repo=repo2.repo_name), + )) response.mustcontain('%s@%s' % (repo1.repo_name, commit_id1)) response.mustcontain('%s@%s' % (repo2.repo_name, commit_id2)) @@ -405,9 +389,9 @@ class TestCompareView(object): # files compare_page.contains_file_links_and_anchors([ - ('vcs/backends/hg.py', 'a_c--9c390eb52cd6'), - ('vcs/backends/__init__.py', 'a_c--41b41c1f2796'), - ('vcs/backends/base.py', 'a_c--2f574d260608'), + ('vcs/backends/hg.py', 'a_c-{}-9c390eb52cd6'.format(commit_id2_short)), + ('vcs/backends/__init__.py', 'a_c-{}-41b41c1f2796'.format(commit_id1_short)), + ('vcs/backends/base.py', 'a_c-{}-2f574d260608'.format(commit_id1_short)), ]) @pytest.mark.xfail_backends("svn") @@ -451,13 +435,11 @@ class TestCompareView(object): response = self.app.get( route_path('repo_compare', - repo_name=r2_name, - source_ref_type="branch", - source_ref=commit_id1, - target_ref_type="branch", - target_ref=commit_id2, - params=dict(merge='1', target_repo=r1_name), - )) + repo_name=r2_name, + source_ref_type="branch", source_ref=commit_id1, + target_ref_type="branch", target_ref=commit_id2, + params=dict(merge='1', target_repo=r1_name), + )) response.mustcontain('%s@%s' % (r2_name, commit_id1)) response.mustcontain('%s@%s' % (r1_name, commit_id2)) @@ -472,13 +454,11 @@ class TestCompareView(object): # compare ! response = self.app.get( route_path('repo_compare', - repo_name=r2_name, - source_ref_type="branch", - source_ref=commit_id1, - target_ref_type="branch", - target_ref=commit_id2, - params=dict(merge='1', target_repo=r1_name), - )) + repo_name=r2_name, + source_ref_type="branch", source_ref=commit_id1, + target_ref_type="branch", target_ref=commit_id2, + params=dict(merge='1', target_repo=r1_name), + )) response.mustcontain('%s@%s' % (r2_name, commit_id1)) response.mustcontain('%s@%s' % (r1_name, commit_id2)) @@ -495,14 +475,12 @@ class TestCompareView(object): response = self.app.get( route_path('repo_compare', - repo_name=backend.repo_name, - source_ref_type="rev", - source_ref=commit0.raw_id, - target_ref_type="rev", - target_ref=commit1.raw_id, - params=dict(merge='1') - ), - extra_environ=xhr_header,) + repo_name=backend.repo_name, + source_ref_type="rev", source_ref=commit0.raw_id, + target_ref_type="rev", target_ref=commit1.raw_id, + params=dict(merge='1') + ), + extra_environ=xhr_header, ) # outgoing commits between those commits compare_page = ComparePage(response) @@ -514,13 +492,11 @@ class TestCompareView(object): response = self.app.get( route_path('repo_compare', - repo_name=badrepo, - source_ref_type="rev", - source_ref='tip', - target_ref_type="rev", - target_ref='tip', - params=dict(merge='1', target_repo=repo.repo_name) - ), + repo_name=badrepo, + source_ref_type="rev", source_ref='tip', + target_ref_type="rev", target_ref='tip', + params=dict(merge='1', target_repo=repo.repo_name) + ), status=404) def test_errors_when_comparing_unknown_target_repo(self, backend): @@ -529,13 +505,11 @@ class TestCompareView(object): response = self.app.get( route_path('repo_compare', - repo_name=repo.repo_name, - source_ref_type="rev", - source_ref='tip', - target_ref_type="rev", - target_ref='tip', - params=dict(merge='1', target_repo=badrepo), - ), + repo_name=repo.repo_name, + source_ref_type="rev", source_ref='tip', + target_ref_type="rev", target_ref='tip', + params=dict(merge='1', target_repo=badrepo), + ), status=302) redirected = response.follow() redirected.mustcontain( @@ -547,12 +521,10 @@ class TestCompareView(object): response = self.app.get( route_path('repo_compare', - repo_name=backend_stub.repo_name, - source_ref_type="rev", - source_ref=commit0.raw_id, - target_ref_type="rev", - target_ref=commit1.raw_id, - )) + repo_name=backend_stub.repo_name, + source_ref_type="rev", source_ref=commit0.raw_id, + target_ref_type="rev", target_ref=commit1.raw_id, + )) # outgoing commits between those commits compare_page = ComparePage(response) @@ -575,13 +547,11 @@ class TestCompareView(object): response = self.app.get( route_path('repo_compare', - repo_name=orig.repo_name, - source_ref_type="rev", - source_ref="tip", - target_ref_type="rev", - target_ref="tip", - params=dict(merge='1', target_repo=fork.repo_name), - ), + repo_name=orig.repo_name, + source_ref_type="rev", source_ref="tip", + target_ref_type="rev", target_ref="tip", + params=dict(merge='1', target_repo=fork.repo_name), + ), status=302) assert_session_flash( @@ -597,13 +567,13 @@ class TestCompareControllerSvn(object): commit_id = repo.get_commit(commit_idx=-1).raw_id response = app.get( route_path('repo_compare', - repo_name=repo.repo_name, - source_ref_type="tag", - source_ref="%s@%s" % ('tags/v0.1', commit_id), - target_ref_type="tag", - target_ref="%s@%s" % ('tags/v0.2', commit_id), - params=dict(merge='1'), - ), + repo_name=repo.repo_name, + source_ref_type="tag", + source_ref="%s@%s" % ('tags/v0.1', commit_id), + target_ref_type="tag", + target_ref="%s@%s" % ('tags/v0.2', commit_id), + params=dict(merge='1'), + ), status=200) # Expecting no commits, since both paths are at the same revision @@ -620,13 +590,13 @@ class TestCompareControllerSvn(object): target_id = repo.get_commit(commit_idx=-1).raw_id response = app.get( route_path('repo_compare', - repo_name=repo.repo_name, - source_ref_type="tag", - source_ref="%s@%s" % ('tags/v0.1', source_id), - target_ref_type="tag", - target_ref="%s@%s" % ('tags/v0.2', target_id), - params=dict(merge='1') - ), + repo_name=repo.repo_name, + source_ref_type="tag", + source_ref="%s@%s" % ('tags/v0.1', source_id), + target_ref_type="tag", + target_ref="%s@%s" % ('tags/v0.2', target_id), + params=dict(merge='1') + ), status=200) # It should show commits @@ -648,7 +618,7 @@ class ComparePage(AssertResponse): for filename, file_id in files: self.contains_one_anchor(file_id) diffblock = doc.cssselect('[data-f-path="%s"]' % filename) - assert len(diffblock) == 1 + assert len(diffblock) == 2 assert len(diffblock[0].cssselect('a[href="#%s"]' % file_id)) == 1 def contains_change_summary(self, files_changed, inserted, deleted): @@ -694,4 +664,3 @@ class ComparePage(AssertResponse): def target_source_are_enabled(self): response = self.response response.mustcontain("var enable_fields = true;") - diff --git a/rhodecode/apps/repository/tests/test_repo_compare_local.py b/rhodecode/apps/repository/tests/test_repo_compare_local.py --- a/rhodecode/apps/repository/tests/test_repo_compare_local.py +++ b/rhodecode/apps/repository/tests/test_repo_compare_local.py @@ -47,10 +47,8 @@ class TestCompareView(object): route_path( 'repo_compare', repo_name=backend.repo_name, - source_ref_type="tag", - source_ref=tag1, - target_ref_type="tag", - target_ref=tag2), + source_ref_type="tag", source_ref=tag1, + target_ref_type="tag", target_ref=tag2), status=200) response.mustcontain('%s@%s' % (backend.repo_name, tag1)) @@ -69,18 +67,28 @@ class TestCompareView(object): compare_page.contains_commits(commits) # files diff + short_id = short_id_new = '' + if backend.alias == 'git': + short_id = '5a3a8fb00555' + short_id_new = '0ba5f8a46600' + if backend.alias == 'hg': + short_id = '17544fbfcd33' + short_id_new = 'a7e60bff65d5' + compare_page.contains_file_links_and_anchors([ - ('docs/api/utils/index.rst', 'a_c--1c5cf9e91c12'), - ('test_and_report.sh', 'a_c--e3305437df55'), - ('.hgignore', 'a_c--c8e92ef85cd1'), - ('.hgtags', 'a_c--6e08b694d687'), - ('docs/api/index.rst', 'a_c--2c14b00f3393'), - ('vcs/__init__.py', 'a_c--430ccbc82bdf'), - ('vcs/backends/hg.py', 'a_c--9c390eb52cd6'), - ('vcs/utils/__init__.py', 'a_c--ebb592c595c0'), - ('vcs/utils/annotate.py', 'a_c--7abc741b5052'), - ('vcs/utils/diffs.py', 'a_c--2ef0ef106c56'), - ('vcs/utils/lazy.py', 'a_c--3150cb87d4b7'), + # modified + ('docs/api/utils/index.rst', 'a_c-{}-1c5cf9e91c12'.format(short_id)), + ('test_and_report.sh', 'a_c-{}-e3305437df55'.format(short_id)), + # added + ('.hgignore', 'a_c-{}-c8e92ef85cd1'.format(short_id_new)), + ('.hgtags', 'a_c-{}-6e08b694d687'.format(short_id_new)), + ('docs/api/index.rst', 'a_c-{}-2c14b00f3393'.format(short_id_new)), + ('vcs/__init__.py', 'a_c-{}-430ccbc82bdf'.format(short_id_new)), + ('vcs/backends/hg.py', 'a_c-{}-9c390eb52cd6'.format(short_id_new)), + ('vcs/utils/__init__.py', 'a_c-{}-ebb592c595c0'.format(short_id_new)), + ('vcs/utils/annotate.py', 'a_c-{}-7abc741b5052'.format(short_id_new)), + ('vcs/utils/diffs.py', 'a_c-{}-2ef0ef106c56'.format(short_id_new)), + ('vcs/utils/lazy.py', 'a_c-{}-3150cb87d4b7'.format(short_id_new)), ]) @pytest.mark.xfail_backends("svn", msg="Depends on branch and tag support") @@ -104,12 +112,10 @@ class TestCompareView(object): response = self.app.get( route_path( - 'repo_compare', - repo_name=backend.repo_name, - source_ref_type='branch', - source_ref=data['branch'], - target_ref_type="tag", - target_ref=data['tag'], + 'repo_compare', + repo_name=backend.repo_name, + source_ref_type='branch', source_ref=data['branch'], + target_ref_type="tag", target_ref=data['tag'], )) response.mustcontain('%s@%s' % (backend.repo_name, data['branch'])) @@ -121,12 +127,10 @@ class TestCompareView(object): head_id = backend.default_head_id response = self.app.get( route_path( - 'repo_compare', - repo_name=backend.repo_name, - source_ref_type="branch", - source_ref=head_id, - target_ref_type="branch", - target_ref=head_id, + 'repo_compare', + repo_name=backend.repo_name, + source_ref_type="branch", source_ref=head_id, + target_ref_type="branch", target_ref=head_id, )) response.mustcontain('%s@%s' % (backend.repo_name, head_id)) @@ -138,16 +142,16 @@ class TestCompareView(object): def test_compare_commits(self, backend): repo = backend.repo commit1 = repo.get_commit(commit_idx=0) + commit1_short_id = commit1.short_id commit2 = repo.get_commit(commit_idx=1) + commit2_short_id = commit2.short_id response = self.app.get( route_path( - 'repo_compare', - repo_name=backend.repo_name, - source_ref_type="rev", - source_ref=commit1.raw_id, - target_ref_type="rev", - target_ref=commit2.raw_id, + 'repo_compare', + repo_name=backend.repo_name, + source_ref_type="rev", source_ref=commit1.raw_id, + target_ref_type="rev", target_ref=commit2.raw_id, )) response.mustcontain('%s@%s' % (backend.repo_name, commit1.raw_id)) response.mustcontain('%s@%s' % (backend.repo_name, commit2.raw_id)) @@ -158,6 +162,6 @@ class TestCompareView(object): # outgoing commits between those commits compare_page.contains_commits([commit2]) - compare_page.contains_file_links_and_anchors([ - ('.hgignore', 'a_c--c8e92ef85cd1'), - ]) + anchor = 'a_c-{}-c8e92ef85cd1'.format(commit2_short_id) + response.mustcontain(anchor) + compare_page.contains_file_links_and_anchors([('.hgignore', anchor),]) diff --git a/rhodecode/apps/repository/tests/test_repo_forks.py b/rhodecode/apps/repository/tests/test_repo_forks.py --- a/rhodecode/apps/repository/tests/test_repo_forks.py +++ b/rhodecode/apps/repository/tests/test_repo_forks.py @@ -303,6 +303,27 @@ class TestRepoForkViewTests(TestControll assert response.json == {u'data': [], u'draw': None, u'recordsFiltered': 0, u'recordsTotal': 0} + @pytest.mark.parametrize('url_type', [ + 'repo_fork_new', + 'repo_fork_create' + ]) + def test_fork_is_forbidden_on_archived_repo(self, backend, xhr_header, user_util, url_type): + user = user_util.create_user(password='qweqwe') + self.log_user(user.username, 'qweqwe') + + # create a temporary repo + source = user_util.create_repo(repo_type=backend.alias) + repo_name = source.repo_name + repo = Repository.get_by_repo_name(repo_name) + repo.archived = True + Session().commit() + + response = self.app.get( + route_path(url_type, repo_name=repo_name), status=302) + + msg = 'Action not supported for archived repository.' + assert_session_flash(response, msg) + class TestSVNFork(TestController): @pytest.mark.parametrize('route_name', [ diff --git a/rhodecode/apps/repository/tests/test_repo_pullrequests.py b/rhodecode/apps/repository/tests/test_repo_pullrequests.py --- a/rhodecode/apps/repository/tests/test_repo_pullrequests.py +++ b/rhodecode/apps/repository/tests/test_repo_pullrequests.py @@ -26,7 +26,7 @@ from rhodecode.lib.vcs.nodes import File from rhodecode.lib import helpers as h from rhodecode.model.changeset_status import ChangesetStatusModel from rhodecode.model.db import ( - PullRequest, ChangesetStatus, UserLog, Notification, ChangesetComment) + PullRequest, ChangesetStatus, UserLog, Notification, ChangesetComment, Repository) from rhodecode.model.meta import Session from rhodecode.model.pull_request import PullRequestModel from rhodecode.model.user import UserModel @@ -81,20 +81,21 @@ class TestPullrequestsView(object): repo = backend.repo self.app.get( - route_path('pullrequest_new', - repo_name=repo.repo_name, - commit=repo.get_commit().raw_id), + route_path('pullrequest_new', repo_name=repo.repo_name, + commit=repo.get_commit().raw_id), status=200) @pytest.mark.parametrize('pr_merge_enabled', [True, False]) - def test_show(self, pr_util, pr_merge_enabled): + @pytest.mark.parametrize('range_diff', ["0", "1"]) + def test_show(self, pr_util, pr_merge_enabled, range_diff): pull_request = pr_util.create_pull_request( mergeable=pr_merge_enabled, enable_notifications=False) response = self.app.get(route_path( 'pullrequest_show', repo_name=pull_request.target_repo.scm_instance().name, - pull_request_id=pull_request.pull_request_id)) + pull_request_id=pull_request.pull_request_id, + params={'range-diff': range_diff})) for commit_id in pull_request.revisions: response.mustcontain(commit_id) @@ -105,9 +106,13 @@ class TestPullrequestsView(object): assert target_clone_url in response assert 'class="pull-request-merge"' in response - assert ( - 'Server-side pull request merging is disabled.' - in response) != pr_merge_enabled + if pr_merge_enabled: + response.mustcontain('Pull request reviewer approval is pending') + else: + response.mustcontain('Server-side pull request merging is disabled.') + + if range_diff == "1": + response.mustcontain('Turn off: Show the diff as commit range') def test_close_status_visibility(self, pr_util, user_util, csrf_token): # Logout @@ -573,11 +578,11 @@ class TestPullrequestsView(object): assert actions[-1].action_data['commit_ids'] == pr_commit_ids # Check post_push rcextension was really executed - push_calls = rhodecode.EXTENSIONS.calls['post_push'] + push_calls = rhodecode.EXTENSIONS.calls['_push_hook'] assert len(push_calls) == 1 unused_last_call_args, last_call_kwargs = push_calls[0] assert last_call_kwargs['action'] == 'push' - assert last_call_kwargs['pushed_revs'] == pr_commit_ids + assert last_call_kwargs['commit_ids'] == pr_commit_ids def test_merge_pull_request_disabled(self, pr_util, csrf_token): pull_request = pr_util.create_pull_request(mergeable=False) @@ -1191,6 +1196,28 @@ class TestPullrequestsControllerDelete(o ) assert response.body == 'true' + @pytest.mark.parametrize('url_type', [ + 'pullrequest_new', + 'pullrequest_create', + 'pullrequest_update', + 'pullrequest_merge', + ]) + def test_pull_request_is_forbidden_on_archived_repo( + self, autologin_user, backend, xhr_header, user_util, url_type): + + # create a temporary repo + source = user_util.create_repo(repo_type=backend.alias) + repo_name = source.repo_name + repo = Repository.get_by_repo_name(repo_name) + repo.archived = True + Session().commit() + + response = self.app.get( + route_path(url_type, repo_name=repo_name, pull_request_id=1), status=302) + + msg = 'Action not supported for archived repository.' + assert_session_flash(response, msg) + def assert_pull_request_status(pull_request, expected_status): status = ChangesetStatusModel().calculated_review_status( diff --git a/rhodecode/apps/repository/tests/test_repo_settings_advanced.py b/rhodecode/apps/repository/tests/test_repo_settings_advanced.py --- a/rhodecode/apps/repository/tests/test_repo_settings_advanced.py +++ b/rhodecode/apps/repository/tests/test_repo_settings_advanced.py @@ -39,6 +39,7 @@ def route_path(name, params=None, **kwar 'repo_summary': '/{repo_name}', 'edit_repo_advanced': '/{repo_name}/settings/advanced', 'edit_repo_advanced_delete': '/{repo_name}/settings/advanced/delete', + 'edit_repo_advanced_archive': '/{repo_name}/settings/advanced/archive', 'edit_repo_advanced_fork': '/{repo_name}/settings/advanced/fork', 'edit_repo_advanced_locking': '/{repo_name}/settings/advanced/locking', 'edit_repo_advanced_journal': '/{repo_name}/settings/advanced/journal', @@ -133,7 +134,7 @@ class TestAdminRepoSettingsAdvanced(obje "suffix", ['', u'ąęł' , '123'], ids=no_newline_id_generator) - def test_advanced_delete(self, autologin_user, backend, suffix, csrf_token): + def test_advanced_repo_delete(self, autologin_user, backend, suffix, csrf_token): repo = backend.create_repo(name_suffix=suffix) repo_name = repo.repo_name repo_name_str = safe_str(repo.repo_name) @@ -148,3 +149,25 @@ class TestAdminRepoSettingsAdvanced(obje # check if repo was deleted from db assert RepoModel().get_by_repo_name(repo_name) is None assert not repo_on_filesystem(repo_name_str) + + @pytest.mark.parametrize( + "suffix", + ['', u'ąęł' , '123'], + ids=no_newline_id_generator) + def test_advanced_repo_archive(self, autologin_user, backend, suffix, csrf_token): + repo = backend.create_repo(name_suffix=suffix) + repo_name = repo.repo_name + repo_name_str = safe_str(repo.repo_name) + + response = self.app.post( + route_path('edit_repo_advanced_archive', repo_name=repo_name_str), + params={'csrf_token': csrf_token}) + + assert_session_flash(response, + u'Archived repository `{}`'.format(repo_name)) + + response = self.app.get(route_path('repo_summary', repo_name=repo_name_str)) + response.mustcontain('This repository has been archived. It is now read-only.') + + # check if repo was deleted from db + assert RepoModel().get_by_repo_name(repo_name).archived is True diff --git a/rhodecode/apps/repository/views/repo_commits.py b/rhodecode/apps/repository/views/repo_commits.py --- a/rhodecode/apps/repository/views/repo_commits.py +++ b/rhodecode/apps/repository/views/repo_commits.py @@ -34,7 +34,9 @@ from rhodecode.lib.auth import ( LoginRequired, HasRepoPermissionAnyDecorator, NotAnonymous, CSRFRequired) from rhodecode.lib.compat import OrderedDict -from rhodecode.lib.diffs import cache_diff, load_cached_diff, diff_cache_exist +from rhodecode.lib.diffs import ( + cache_diff, load_cached_diff, diff_cache_exist, get_diff_context, + get_diff_whitespace_flag) from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError import rhodecode.lib.helpers as h from rhodecode.lib.utils2 import safe_unicode, str2bool @@ -55,96 +57,8 @@ def _update_with_GET(params, request): params[k] += request.GET.getall(k) -def get_ignore_ws(fid, request): - ig_ws_global = request.GET.get('ignorews') - ig_ws = filter(lambda k: k.startswith('WS'), request.GET.getall(fid)) - if ig_ws: - try: - return int(ig_ws[0].split(':')[-1]) - except Exception: - pass - return ig_ws_global -def _ignorews_url(request, fileid=None): - _ = request.translate - fileid = str(fileid) if fileid else None - params = collections.defaultdict(list) - _update_with_GET(params, request) - label = _('Show whitespace') - tooltiplbl = _('Show whitespace for all diffs') - ig_ws = get_ignore_ws(fileid, request) - ln_ctx = get_line_ctx(fileid, request) - - if ig_ws is None: - params['ignorews'] += [1] - label = _('Ignore whitespace') - tooltiplbl = _('Ignore whitespace for all diffs') - ctx_key = 'context' - ctx_val = ln_ctx - - # if we have passed in ln_ctx pass it along to our params - if ln_ctx: - params[ctx_key] += [ctx_val] - - if fileid: - params['anchor'] = 'a_' + fileid - return h.link_to(label, request.current_route_path(_query=params), - title=tooltiplbl, class_='tooltip') - - -def get_line_ctx(fid, request): - ln_ctx_global = request.GET.get('context') - if fid: - ln_ctx = filter(lambda k: k.startswith('C'), request.GET.getall(fid)) - else: - _ln_ctx = filter(lambda k: k.startswith('C'), request.GET) - ln_ctx = request.GET.get(_ln_ctx[0]) if _ln_ctx else ln_ctx_global - if ln_ctx: - ln_ctx = [ln_ctx] - - if ln_ctx: - retval = ln_ctx[0].split(':')[-1] - else: - retval = ln_ctx_global - - try: - return int(retval) - except Exception: - return 3 - - -def _context_url(request, fileid=None): - """ - Generates a url for context lines. - - :param fileid: - """ - - _ = request.translate - fileid = str(fileid) if fileid else None - ig_ws = get_ignore_ws(fileid, request) - ln_ctx = (get_line_ctx(fileid, request) or 3) * 2 - - params = collections.defaultdict(list) - _update_with_GET(params, request) - - if ln_ctx > 0: - params['context'] += [ln_ctx] - - if ig_ws: - ig_ws_key = 'ignorews' - ig_ws_val = 1 - params[ig_ws_key] += [ig_ws_val] - - lbl = _('Increase context') - tooltiplbl = _('Increase context for all diffs') - - if fileid: - params['anchor'] = 'a_' + fileid - return h.link_to(lbl, request.current_route_path(_query=params), - title=tooltiplbl, class_='tooltip') - class RepoCommitsView(RepoAppView): def load_default_context(self): @@ -162,13 +76,11 @@ class RepoCommitsView(RepoAppView): def _commit(self, commit_id_range, method): _ = self.request.translate c = self.load_default_context() - c.ignorews_url = _ignorews_url - c.context_url = _context_url c.fulldiff = self.request.GET.get('fulldiff') # fetch global flags of ignore ws or context lines - context_lcl = get_line_ctx('', self.request) - ign_whitespace_lcl = get_ignore_ws('', self.request) + diff_context = get_diff_context(self.request) + hide_whitespace_changes = get_diff_whitespace_flag(self.request) # diff_limit will cut off the whole diff if the limit is applied # otherwise it will just hide the big files from the front-end @@ -245,7 +157,7 @@ class RepoCommitsView(RepoAppView): c.changes[commit.raw_id] = [] commit2 = commit - commit1 = commit.parents[0] if commit.parents else EmptyCommit() + commit1 = commit.first_parent if method == 'show': inline_comments = CommentsModel().get_inline_comments( @@ -258,7 +170,7 @@ class RepoCommitsView(RepoAppView): self.db_repo) cache_file_path = diff_cache_exist( cache_path, 'diff', commit.raw_id, - ign_whitespace_lcl, context_lcl, c.fulldiff) + hide_whitespace_changes, diff_context, c.fulldiff) caching_enabled = self._is_diff_cache_enabled(self.db_repo) force_recache = str2bool(self.request.GET.get('force_recache')) @@ -273,8 +185,8 @@ class RepoCommitsView(RepoAppView): else: vcs_diff = self.rhodecode_vcs_repo.get_diff( commit1, commit2, - ignore_whitespace=ign_whitespace_lcl, - context=context_lcl) + ignore_whitespace=hide_whitespace_changes, + context=diff_context) diff_processor = diffs.DiffProcessor( vcs_diff, format='newdiff', diff_limit=diff_limit, @@ -300,7 +212,7 @@ class RepoCommitsView(RepoAppView): # TODO(marcink): no cache usage here... _diff = self.rhodecode_vcs_repo.get_diff( commit1, commit2, - ignore_whitespace=ign_whitespace_lcl, context=context_lcl) + ignore_whitespace=hide_whitespace_changes, context=diff_context) diff_processor = diffs.DiffProcessor( _diff, format='newdiff', diff_limit=diff_limit, file_limit=file_limit, show_full_diff=c.fulldiff) diff --git a/rhodecode/apps/repository/views/repo_compare.py b/rhodecode/apps/repository/views/repo_compare.py --- a/rhodecode/apps/repository/views/repo_compare.py +++ b/rhodecode/apps/repository/views/repo_compare.py @@ -44,10 +44,7 @@ log = logging.getLogger(__name__) class RepoCompareView(RepoAppView): def load_default_context(self): c = self._get_local_tmpl_context(include_app_defaults=True) - c.rhodecode_repo = self.rhodecode_vcs_repo - - return c def _get_commit_or_redirect( @@ -145,6 +142,10 @@ class RepoCompareView(RepoAppView): # c.fulldiff disables cut_off_limit c.fulldiff = str2bool(self.request.GET.get('fulldiff')) + # fetch global flags of ignore ws or context lines + diff_context = diffs.get_diff_context(self.request) + hide_whitespace_changes = diffs.get_diff_whitespace_flag(self.request) + c.file_path = target_path c.commit_statuses = ChangesetStatus.STATUSES @@ -256,8 +257,8 @@ class RepoCompareView(RepoAppView): # case we want a simple diff without incoming commits, # previewing what will be merged. # Make the diff on target repo (which is known to have target_ref) - log.debug('Using ancestor %s as source_ref instead of %s' - % (c.ancestor, source_ref)) + log.debug('Using ancestor %s as source_ref instead of %s', + c.ancestor, source_ref) source_repo = target_repo source_commit = target_repo.get_commit(commit_id=c.ancestor) @@ -288,7 +289,8 @@ class RepoCompareView(RepoAppView): txt_diff = source_repo.scm_instance().get_diff( commit1=source_commit, commit2=target_commit, - path=target_path, path1=source_path) + path=target_path, path1=source_path, + ignore_whitespace=hide_whitespace_changes, context=diff_context) diff_processor = diffs.DiffProcessor( txt_diff, format='newdiff', diff_limit=diff_limit, @@ -298,6 +300,7 @@ class RepoCompareView(RepoAppView): diffset = codeblocks.DiffSet( repo_name=source_repo.repo_name, source_node_getter=codeblocks.diffset_node_getter(source_commit), + target_repo_name=self.db_repo_name, target_node_getter=codeblocks.diffset_node_getter(target_commit), ) c.diffset = self.path_filter.render_patchset_filtered( diff --git a/rhodecode/apps/repository/views/repo_permissions.py b/rhodecode/apps/repository/views/repo_permissions.py --- a/rhodecode/apps/repository/views/repo_permissions.py +++ b/rhodecode/apps/repository/views/repo_permissions.py @@ -29,6 +29,8 @@ from rhodecode.lib import helpers as h from rhodecode.lib import audit_logger from rhodecode.lib.auth import ( LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired) +from rhodecode.lib.utils2 import safe_int +from rhodecode.model.db import UserGroup from rhodecode.model.forms import RepoPermsForm from rhodecode.model.meta import Session from rhodecode.model.repo import RepoModel @@ -88,6 +90,11 @@ class RepoSettingsPermissionsView(RepoAp for change in changes['added'] + changes['updated'] + changes['deleted']: if change['type'] == 'user': affected_user_ids.append(change['id']) + if change['type'] == 'user_group': + user_group = UserGroup.get(safe_int(change['id'])) + if user_group: + group_members_ids = [x.user_id for x in user_group.members] + affected_user_ids.extend(group_members_ids) events.trigger(events.UserPermissionsChange(affected_user_ids)) diff --git a/rhodecode/apps/repository/views/repo_pull_requests.py b/rhodecode/apps/repository/views/repo_pull_requests.py --- a/rhodecode/apps/repository/views/repo_pull_requests.py +++ b/rhodecode/apps/repository/views/repo_pull_requests.py @@ -138,6 +138,13 @@ class RepoPullRequestsView(RepoAppView, }) return data + def get_recache_flag(self): + for flag_name in ['force_recache', 'force-recache', 'no-cache']: + flag_val = self.request.GET.get(flag_name) + if str2bool(flag_val): + return True + return False + @LoginRequired() @HasRepoPermissionAnyDecorator( 'repository.read', 'repository.write', 'repository.admin') @@ -212,10 +219,11 @@ class RepoPullRequestsView(RepoAppView, def _get_diffset(self, source_repo_name, source_repo, source_ref_id, target_ref_id, target_commit, source_commit, diff_limit, file_limit, - fulldiff): + fulldiff, hide_whitespace_changes, diff_context): vcs_diff = PullRequestModel().get_diff( - source_repo, source_ref_id, target_ref_id) + source_repo, source_ref_id, target_ref_id, + hide_whitespace_changes, diff_context) diff_processor = diffs.DiffProcessor( vcs_diff, format='newdiff', diff_limit=diff_limit, @@ -234,6 +242,30 @@ class RepoPullRequestsView(RepoAppView, return diffset + def _get_range_diffset(self, source_scm, source_repo, + commit1, commit2, diff_limit, file_limit, + fulldiff, hide_whitespace_changes, diff_context): + vcs_diff = source_scm.get_diff( + commit1, commit2, + ignore_whitespace=hide_whitespace_changes, + context=diff_context) + + diff_processor = diffs.DiffProcessor( + vcs_diff, format='newdiff', diff_limit=diff_limit, + file_limit=file_limit, show_full_diff=fulldiff) + + _parsed = diff_processor.prepare() + + diffset = codeblocks.DiffSet( + repo_name=source_repo.repo_name, + source_node_getter=codeblocks.diffset_node_getter(commit1), + target_node_getter=codeblocks.diffset_node_getter(commit2)) + + diffset = self.path_filter.render_patchset_filtered( + diffset, _parsed, commit1.raw_id, commit2.raw_id) + + return diffset + @LoginRequired() @HasRepoPermissionAnyDecorator( 'repository.read', 'repository.write', 'repository.admin') @@ -249,6 +281,11 @@ class RepoPullRequestsView(RepoAppView, from_version = self.request.GET.get('from_version') or version merge_checks = self.request.GET.get('merge_checks') c.fulldiff = str2bool(self.request.GET.get('fulldiff')) + + # fetch global flags of ignore ws or context lines + diff_context = diffs.get_diff_context(self.request) + hide_whitespace_changes = diffs.get_diff_whitespace_flag(self.request) + force_refresh = str2bool(self.request.GET.get('force_refresh')) (pull_request_latest, @@ -265,6 +302,9 @@ class RepoPullRequestsView(RepoAppView, pull_request_id=pull_request_id)) versions = pull_request_display_obj.versions() + # used to store per-commit range diffs + c.changes = collections.OrderedDict() + c.range_diff_on = self.request.GET.get('range-diff') == "1" c.at_version = at_version c.at_version_num = (at_version @@ -453,14 +493,14 @@ class RepoPullRequestsView(RepoAppView, version_normalized = version or 'latest' from_version_normalized = from_version or 'latest' - cache_path = self.rhodecode_vcs_repo.get_create_shadow_cache_pr_path( - target_repo) + cache_path = self.rhodecode_vcs_repo.get_create_shadow_cache_pr_path(target_repo) cache_file_path = diff_cache_exist( cache_path, 'pull_request', pull_request_id, version_normalized, - from_version_normalized, source_ref_id, target_ref_id, c.fulldiff) + from_version_normalized, source_ref_id, target_ref_id, + hide_whitespace_changes, diff_context, c.fulldiff) caching_enabled = self._is_diff_cache_enabled(c.target_repo) - force_recache = str2bool(self.request.GET.get('force_recache')) + force_recache = self.get_recache_flag() cached_diff = None if caching_enabled: @@ -471,7 +511,8 @@ class RepoPullRequestsView(RepoAppView, and len(cached_diff.get('commits', [])) == 5 and cached_diff.get('commits')[0] and cached_diff.get('commits')[3]) - if not force_recache and has_proper_commit_cache: + + if not force_recache and not c.range_diff_on and has_proper_commit_cache: diff_commit_cache = \ (ancestor_commit, commit_cache, missing_requirements, source_commit, target_commit) = cached_diff['commits'] @@ -527,7 +568,8 @@ class RepoPullRequestsView(RepoAppView, c.source_repo.repo_name, commits_source_repo, source_ref_id, target_ref_id, target_commit, source_commit, - diff_limit, file_limit, c.fulldiff) + diff_limit, file_limit, c.fulldiff, + hide_whitespace_changes, diff_context) # save cached diff if caching_enabled: @@ -546,8 +588,41 @@ class RepoPullRequestsView(RepoAppView, c.deleted_files_comments[fname]['stats'] = 0 c.deleted_files_comments[fname]['comments'] = list() for lno, comments in per_line_comments.items(): - c.deleted_files_comments[fname]['comments'].extend( - comments) + c.deleted_files_comments[fname]['comments'].extend(comments) + + # maybe calculate the range diff + if c.range_diff_on: + # TODO(marcink): set whitespace/context + context_lcl = 3 + ign_whitespace_lcl = False + + for commit in c.commit_ranges: + commit2 = commit + commit1 = commit.first_parent + + range_diff_cache_file_path = diff_cache_exist( + cache_path, 'diff', commit.raw_id, + ign_whitespace_lcl, context_lcl, c.fulldiff) + + cached_diff = None + if caching_enabled: + cached_diff = load_cached_diff(range_diff_cache_file_path) + + has_proper_diff_cache = cached_diff and cached_diff.get('diff') + if not force_recache and has_proper_diff_cache: + diffset = cached_diff['diff'] + else: + diffset = self._get_range_diffset( + source_scm, source_repo, + commit1, commit2, diff_limit, file_limit, + c.fulldiff, ign_whitespace_lcl, context_lcl + ) + + # save cached diff + if caching_enabled: + cache_diff(range_diff_cache_file_path, diffset, None) + + c.changes[commit.raw_id] = diffset # this is a hack to properly display links, when creating PR, the # compare view and others uses different notation, and @@ -607,7 +682,7 @@ class RepoPullRequestsView(RepoAppView, commit_cache = collections.OrderedDict() missing_requirements = False try: - pre_load = ["author", "branch", "date", "message"] + pre_load = ["author", "branch", "date", "message", "parents"] show_revs = pull_request_at_ver.revisions for rev in show_revs: comm = commits_source_repo.get_commit( diff --git a/rhodecode/apps/repository/views/repo_settings_advanced.py b/rhodecode/apps/repository/views/repo_settings_advanced.py --- a/rhodecode/apps/repository/views/repo_settings_advanced.py +++ b/rhodecode/apps/repository/views/repo_settings_advanced.py @@ -23,13 +23,14 @@ import logging from pyramid.view import view_config from pyramid.httpexceptions import HTTPFound +from rhodecode import events from rhodecode.apps._base import RepoAppView from rhodecode.lib import helpers as h from rhodecode.lib import audit_logger from rhodecode.lib.auth import ( LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired, HasRepoPermissionAny) -from rhodecode.lib.exceptions import AttachedForksError +from rhodecode.lib.exceptions import AttachedForksError, AttachedPullRequestsError from rhodecode.lib.utils2 import safe_int from rhodecode.lib.vcs import RepositoryError from rhodecode.model.db import Session, UserFollowing, User, Repository @@ -45,6 +46,13 @@ class RepoSettingsView(RepoAppView): c = self._get_local_tmpl_context() return c + def _get_users_with_permissions(self): + user_permissions = {} + for perm in self.db_repo.permissions(): + user_permissions[perm.user_id] = perm + + return user_permissions + @LoginRequired() @HasRepoPermissionAnyDecorator('repository.admin') @view_config( @@ -71,6 +79,49 @@ class RepoSettingsView(RepoAppView): @HasRepoPermissionAnyDecorator('repository.admin') @CSRFRequired() @view_config( + route_name='edit_repo_advanced_archive', request_method='POST', + renderer='rhodecode:templates/admin/repos/repo_edit.mako') + def edit_advanced_archive(self): + """ + Archives the repository. It will become read-only, and not visible in search + or other queries. But still visible for super-admins. + """ + + _ = self.request.translate + + try: + old_data = self.db_repo.get_api_data() + RepoModel().archive(self.db_repo) + + repo = audit_logger.RepoWrap(repo_id=None, repo_name=self.db_repo.repo_name) + audit_logger.store_web( + 'repo.archive', action_data={'old_data': old_data}, + user=self._rhodecode_user, repo=repo) + + ScmModel().mark_for_invalidation(self.db_repo_name, delete=True) + h.flash( + _('Archived repository `%s`') % self.db_repo_name, + category='success') + Session().commit() + except Exception: + log.exception("Exception during archiving of repository") + h.flash(_('An error occurred during archiving of `%s`') + % self.db_repo_name, category='error') + # redirect to advanced for more deletion options + raise HTTPFound( + h.route_path('edit_repo_advanced', repo_name=self.db_repo_name, + _anchor='advanced-archive')) + + # flush permissions for all users defined in permissions + affected_user_ids = self._get_users_with_permissions().keys() + events.trigger(events.UserPermissionsChange(affected_user_ids)) + + raise HTTPFound(h.route_path('home')) + + @LoginRequired() + @HasRepoPermissionAnyDecorator('repository.admin') + @CSRFRequired() + @view_config( route_name='edit_repo_advanced_delete', request_method='POST', renderer='rhodecode:templates/admin/repos/repo_edit.mako') def edit_advanced_delete(self): @@ -80,22 +131,23 @@ class RepoSettingsView(RepoAppView): """ _ = self.request.translate handle_forks = self.request.POST.get('forks', None) + if handle_forks == 'detach_forks': + handle_forks = 'detach' + elif handle_forks == 'delete_forks': + handle_forks = 'delete' try: + old_data = self.db_repo.get_api_data() + RepoModel().delete(self.db_repo, forks=handle_forks) + _forks = self.db_repo.forks.count() if _forks and handle_forks: if handle_forks == 'detach_forks': - handle_forks = 'detach' h.flash(_('Detached %s forks') % _forks, category='success') elif handle_forks == 'delete_forks': - handle_forks = 'delete' h.flash(_('Deleted %s forks') % _forks, category='success') - old_data = self.db_repo.get_api_data() - RepoModel().delete(self.db_repo, forks=handle_forks) - - repo = audit_logger.RepoWrap(repo_id=None, - repo_name=self.db_repo.repo_name) + repo = audit_logger.RepoWrap(repo_id=None, repo_name=self.db_repo.repo_name) audit_logger.store_web( 'repo.delete', action_data={'old_data': old_data}, user=self._rhodecode_user, repo=repo) @@ -118,6 +170,20 @@ class RepoSettingsView(RepoAppView): # redirect to advanced for forks handle action ? raise HTTPFound(repo_advanced_url) + except AttachedPullRequestsError: + repo_advanced_url = h.route_path( + 'edit_repo_advanced', repo_name=self.db_repo_name, + _anchor='advanced-delete') + attached_prs = len(self.db_repo.pull_requests_source + + self.db_repo.pull_requests_target) + h.flash( + _('Cannot delete `{repo}` it still contains {num} attached pull requests. ' + 'Consider archiving the repository instead.').format( + repo=self.db_repo_name, num=attached_prs), category='warning') + + # redirect to advanced for forks handle action ? + raise HTTPFound(repo_advanced_url) + except Exception: log.exception("Exception during deletion of repository") h.flash(_('An error occurred during deletion of `%s`') diff --git a/rhodecode/apps/repository/views/repo_strip.py b/rhodecode/apps/repository/views/repo_strip.py --- a/rhodecode/apps/repository/views/repo_strip.py +++ b/rhodecode/apps/repository/views/repo_strip.py @@ -65,7 +65,7 @@ class StripView(RepoAppView): check = rp.get(chset) if check: - data[i] = self.db_repo.get_changeset(rp[chset]) + data[i] = self.db_repo.get_commit(rp[chset]) if isinstance(data[i], EmptyCommit): data[i] = {'rev': None, 'commit': h.escape(rp[chset])} else: @@ -98,8 +98,8 @@ class StripView(RepoAppView): ScmModel().strip( repo=self.db_repo, commit_id=commit['rev'], branch=commit['branch']) - log.info('Stripped commit %s from repo `%s` by %s' % ( - commit['rev'], self.db_repo_name, user)) + log.info('Stripped commit %s from repo `%s` by %s', + commit['rev'], self.db_repo_name, user) data[commit['rev']] = True audit_logger.store_web( @@ -108,6 +108,6 @@ class StripView(RepoAppView): except Exception as e: data[commit['rev']] = False - log.debug('Stripped commit %s from repo `%s` failed by %s, exeption %s' % ( - commit['rev'], self.db_repo_name, user, e.message)) + log.debug('Stripped commit %s from repo `%s` failed by %s, exeption %s', + commit['rev'], self.db_repo_name, user, e.message) return data diff --git a/rhodecode/apps/ssh_support/lib/backends/base.py b/rhodecode/apps/ssh_support/lib/backends/base.py --- a/rhodecode/apps/ssh_support/lib/backends/base.py +++ b/rhodecode/apps/ssh_support/lib/backends/base.py @@ -103,6 +103,7 @@ class VcsServer(object): 'repository': self.repo_name, 'scm': self.backend, 'config': self.ini_path, + 'repo_store': self.store, 'make_lock': None, 'locked_by': [None, None], 'server_url': None, diff --git a/rhodecode/apps/ssh_support/tests/conftest.py b/rhodecode/apps/ssh_support/tests/conftest.py --- a/rhodecode/apps/ssh_support/tests/conftest.py +++ b/rhodecode/apps/ssh_support/tests/conftest.py @@ -41,8 +41,7 @@ def dummy_conf_file(tmpdir): return os.path.join(f_path) -@pytest.fixture -def dummy_env(): +def plain_dummy_env(): return { 'request': AttributeDict(host_url='http://localhost', script_name='/') @@ -50,8 +49,17 @@ def dummy_env(): @pytest.fixture +def dummy_env(): + return plain_dummy_env() + + +def plain_dummy_user(): + return AttributeDict(username='test_user') + + +@pytest.fixture def dummy_user(): - return AttributeDict(username='test_user') + return plain_dummy_user() @pytest.fixture diff --git a/rhodecode/apps/ssh_support/tests/test_server_git.py b/rhodecode/apps/ssh_support/tests/test_server_git.py --- a/rhodecode/apps/ssh_support/tests/test_server_git.py +++ b/rhodecode/apps/ssh_support/tests/test_server_git.py @@ -23,7 +23,7 @@ import mock import pytest from rhodecode.apps.ssh_support.lib.backends.git import GitServer -from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user +from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user class GitServerCreator(object): @@ -37,7 +37,7 @@ class GitServerCreator(object): } repo_name = 'test_git' repo_mode = 'receive-pack' - user = dummy_user() + user = plain_dummy_user() def __init__(self): def config_get(part, key): @@ -56,7 +56,7 @@ class GitServerCreator(object): self.repo_name: 'repository.admin' }, 'config': self.config_mock, - 'env': dummy_env() + 'env': plain_dummy_env() } parameters.update(kwargs) server = GitServer(**parameters) @@ -121,6 +121,8 @@ class TestGitServer(object): ]) def test_update_environment(self, git_server, repo_mode, action): server = git_server.create(repo_mode=repo_mode) + store = server.store + with mock.patch('os.environ', {'SSH_CLIENT': '10.10.10.10 b'}): with mock.patch('os.putenv') as putenv_mock: server.update_environment(action) @@ -135,6 +137,7 @@ class TestGitServer(object): 'ip': '10.10.10.10', 'locked_by': [None, None], 'config': '', + 'repo_store': store, 'server_url': None, 'hooks': ['push', 'pull'], 'is_shadow_repo': False, diff --git a/rhodecode/apps/ssh_support/tests/test_server_hg.py b/rhodecode/apps/ssh_support/tests/test_server_hg.py --- a/rhodecode/apps/ssh_support/tests/test_server_hg.py +++ b/rhodecode/apps/ssh_support/tests/test_server_hg.py @@ -22,7 +22,7 @@ import mock import pytest from rhodecode.apps.ssh_support.lib.backends.hg import MercurialServer -from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user +from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user class MercurialServerCreator(object): @@ -36,7 +36,7 @@ class MercurialServerCreator(object): } } repo_name = 'test_hg' - user = dummy_user() + user = plain_dummy_user() def __init__(self): def config_get(part, key): @@ -54,7 +54,7 @@ class MercurialServerCreator(object): 'test_hg': 'repository.admin' }, 'config': self.config_mock, - 'env': dummy_env() + 'env': plain_dummy_env() } parameters.update(kwargs) server = MercurialServer(**parameters) diff --git a/rhodecode/apps/ssh_support/tests/test_server_svn.py b/rhodecode/apps/ssh_support/tests/test_server_svn.py --- a/rhodecode/apps/ssh_support/tests/test_server_svn.py +++ b/rhodecode/apps/ssh_support/tests/test_server_svn.py @@ -22,7 +22,7 @@ import mock import pytest from rhodecode.apps.ssh_support.lib.backends.svn import SubversionServer -from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user +from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user class SubversionServerCreator(object): @@ -35,7 +35,7 @@ class SubversionServerCreator(object): } } repo_name = 'test-svn' - user = dummy_user() + user = plain_dummy_user() def __init__(self): def config_get(part, key): @@ -53,7 +53,7 @@ class SubversionServerCreator(object): self.repo_name: 'repository.admin' }, 'config': self.config_mock, - 'env': dummy_env() + 'env': plain_dummy_env() } parameters.update(kwargs) diff --git a/rhodecode/apps/ssh_support/tests/test_ssh_wrapper.py b/rhodecode/apps/ssh_support/tests/test_ssh_wrapper.py --- a/rhodecode/apps/ssh_support/tests/test_ssh_wrapper.py +++ b/rhodecode/apps/ssh_support/tests/test_ssh_wrapper.py @@ -28,7 +28,7 @@ class TestSSHWrapper(object): ssh_wrapper.serve( vcs='microsoft-tfs', repo='test-repo', mode=None, user='test', permissions={}, branch_permissions={}) - assert exc_info.value.message == 'Unrecognised VCS: microsoft-tfs' + assert str(exc_info.value) == 'Unrecognised VCS: microsoft-tfs' def test_parse_config(self, ssh_wrapper): config = ssh_wrapper.parse_config(ssh_wrapper.ini_path) diff --git a/rhodecode/apps/user_group/views/__init__.py b/rhodecode/apps/user_group/views/__init__.py --- a/rhodecode/apps/user_group/views/__init__.py +++ b/rhodecode/apps/user_group/views/__init__.py @@ -40,8 +40,8 @@ from rhodecode.apps._base import UserGro from rhodecode.lib.auth import ( LoginRequired, HasUserGroupPermissionAnyDecorator, CSRFRequired) from rhodecode.lib import helpers as h, audit_logger -from rhodecode.lib.utils2 import str2bool -from rhodecode.model.db import User +from rhodecode.lib.utils2 import str2bool, safe_int +from rhodecode.model.db import User, UserGroup from rhodecode.model.meta import Session from rhodecode.model.user_group import UserGroupModel @@ -377,6 +377,11 @@ class UserGroupsView(UserGroupAppView): for change in changes['added'] + changes['updated'] + changes['deleted']: if change['type'] == 'user': affected_user_ids.append(change['id']) + if change['type'] == 'user_group': + user_group = UserGroup.get(safe_int(change['id'])) + if user_group: + group_members_ids = [x.user_id for x in user_group.members] + affected_user_ids.extend(group_members_ids) events.trigger(events.UserPermissionsChange(affected_user_ids)) diff --git a/rhodecode/authentication/plugins/auth_crowd.py b/rhodecode/authentication/plugins/auth_crowd.py --- a/rhodecode/authentication/plugins/auth_crowd.py +++ b/rhodecode/authentication/plugins/auth_crowd.py @@ -241,16 +241,16 @@ class RhodeCodeAuthPlugin(RhodeCodeExter log.debug('Empty username or password skipping...') return None - log.debug("Crowd settings: \n%s" % (formatted_json(settings))) + log.debug("Crowd settings: \n%s", formatted_json(settings)) server = CrowdServer(**settings) server.set_credentials(settings["app_name"], settings["app_password"]) crowd_user = server.user_auth(username, password) - log.debug("Crowd returned: \n%s" % (formatted_json(crowd_user))) + log.debug("Crowd returned: \n%s", formatted_json(crowd_user)) if not crowd_user["status"]: return None res = server.user_groups(crowd_user["name"]) - log.debug("Crowd groups: \n%s" % (formatted_json(res))) + log.debug("Crowd groups: \n%s", formatted_json(res)) crowd_user["groups"] = [x["name"] for x in res["groups"]] # old attrs fetched from RhodeCode database @@ -280,6 +280,6 @@ class RhodeCodeAuthPlugin(RhodeCodeExter for group in settings["admin_groups"]: if group in user_attrs["groups"]: user_attrs["admin"] = True - log.debug("Final crowd user object: \n%s" % (formatted_json(user_attrs))) - log.info('user `%s` authenticated correctly' % user_attrs['username']) + log.debug("Final crowd user object: \n%s", formatted_json(user_attrs)) + log.info('user `%s` authenticated correctly', user_attrs['username']) return user_attrs diff --git a/rhodecode/authentication/plugins/auth_headers.py b/rhodecode/authentication/plugins/auth_headers.py --- a/rhodecode/authentication/plugins/auth_headers.py +++ b/rhodecode/authentication/plugins/auth_headers.py @@ -125,24 +125,24 @@ class RhodeCodeAuthPlugin(RhodeCodeExter username = None environ = environ or {} if not environ: - log.debug('got empty environ: %s' % environ) + log.debug('got empty environ: %s', environ) settings = settings or {} if settings.get('header'): header = settings.get('header') username = environ.get(header) - log.debug('extracted %s:%s' % (header, username)) + log.debug('extracted %s:%s', header, username) # fallback mode if not username and settings.get('fallback_header'): header = settings.get('fallback_header') username = environ.get(header) - log.debug('extracted %s:%s' % (header, username)) + log.debug('extracted %s:%s', header, username) if username and str2bool(settings.get('clean_username')): - log.debug('Received username `%s` from headers' % username) + log.debug('Received username `%s` from headers', username) username = self._clean_username(username) - log.debug('New cleanup user is:%s' % username) + log.debug('New cleanup user is:%s', username) return username def get_user(self, username=None, **kwargs): @@ -221,5 +221,5 @@ class RhodeCodeAuthPlugin(RhodeCodeExter 'extern_type': extern_type, } - log.info('user `%s` authenticated correctly' % user_attrs['username']) + log.info('user `%s` authenticated correctly', user_attrs['username']) return user_attrs diff --git a/rhodecode/authentication/plugins/auth_jasig_cas.py b/rhodecode/authentication/plugins/auth_jasig_cas.py --- a/rhodecode/authentication/plugins/auth_jasig_cas.py +++ b/rhodecode/authentication/plugins/auth_jasig_cas.py @@ -134,10 +134,10 @@ class RhodeCodeAuthPlugin(RhodeCodeExter try: response = urllib2.urlopen(request) except urllib2.HTTPError as e: - log.debug("HTTPError when requesting Jasig CAS (status code: %d)" % e.code) + log.debug("HTTPError when requesting Jasig CAS (status code: %d)", e.code) return None except urllib2.URLError as e: - log.debug("URLError when requesting Jasig CAS url: %s " % url) + log.debug("URLError when requesting Jasig CAS url: %s ", url) return None # old attrs fetched from RhodeCode database @@ -163,5 +163,5 @@ class RhodeCodeAuthPlugin(RhodeCodeExter 'extern_type': extern_type, } - log.info('user `%s` authenticated correctly' % user_attrs['username']) + log.info('user `%s` authenticated correctly', user_attrs['username']) return user_attrs diff --git a/rhodecode/authentication/plugins/auth_pam.py b/rhodecode/authentication/plugins/auth_pam.py --- a/rhodecode/authentication/plugins/auth_pam.py +++ b/rhodecode/authentication/plugins/auth_pam.py @@ -115,10 +115,10 @@ class RhodeCodeAuthPlugin(RhodeCodeExter auth_result = _pam.authenticate(username, password, settings["service"]) if not auth_result: - log.error("PAM was unable to authenticate user: %s" % (username, )) + log.error("PAM was unable to authenticate user: %s", username) return None - log.debug('Got PAM response %s' % (auth_result, )) + log.debug('Got PAM response %s', auth_result) # old attrs fetched from RhodeCode database default_email = "%s@%s" % (username, socket.gethostname()) @@ -157,5 +157,5 @@ class RhodeCodeAuthPlugin(RhodeCodeExter pass log.debug("pamuser: %s", user_attrs) - log.info('user `%s` authenticated correctly' % user_attrs['username']) + log.info('user `%s` authenticated correctly', user_attrs['username']) return user_attrs diff --git a/rhodecode/authentication/plugins/auth_rhodecode.py b/rhodecode/authentication/plugins/auth_rhodecode.py --- a/rhodecode/authentication/plugins/auth_rhodecode.py +++ b/rhodecode/authentication/plugins/auth_rhodecode.py @@ -87,12 +87,12 @@ class RhodeCodeAuthPlugin(RhodeCodeAuthP def auth(self, userobj, username, password, settings, **kwargs): if not userobj: - log.debug('userobj was:%s skipping' % (userobj, )) + log.debug('userobj was:%s skipping', userobj) return None if userobj.extern_type != self.name: log.warning( - "userobj:%s extern_type mismatch got:`%s` expected:`%s`" % - (userobj, userobj.extern_type, self.name)) + "userobj:%s extern_type mismatch got:`%s` expected:`%s`", + userobj, userobj.extern_type, self.name) return None user_attrs = { @@ -109,7 +109,7 @@ class RhodeCodeAuthPlugin(RhodeCodeAuthP "extern_type": userobj.extern_type, } - log.debug("User attributes:%s" % (user_attrs, )) + log.debug("User attributes:%s", user_attrs) if userobj.active: from rhodecode.lib import auth crypto_backend = auth.crypto_backend() diff --git a/rhodecode/authentication/plugins/auth_token.py b/rhodecode/authentication/plugins/auth_token.py --- a/rhodecode/authentication/plugins/auth_token.py +++ b/rhodecode/authentication/plugins/auth_token.py @@ -103,7 +103,7 @@ class RhodeCodeAuthPlugin(RhodeCodeAuthP def auth(self, userobj, username, password, settings, **kwargs): if not userobj: - log.debug('userobj was:%s skipping' % (userobj, )) + log.debug('userobj was:%s skipping', userobj) return None user_attrs = { diff --git a/rhodecode/config/licenses.json b/rhodecode/config/licenses.json --- a/rhodecode/config/licenses.json +++ b/rhodecode/config/licenses.json @@ -1,369 +1,1901 @@ -{ - "libnghttp2-1.7.1": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "nodejs-4.3.1": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python-2.7.12": { - "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0" - }, - "python2.7-Babel-1.3": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-Beaker-1.7.0": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-Chameleon-2.24": { - "BSD-like": "http://repoze.org/license.html" - }, - "python2.7-FormEncode-1.2.4": { - "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0" - }, - "python2.7-Jinja2-2.7.3": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-Mako-1.0.6": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-Markdown-2.6.7": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-MarkupSafe-0.23": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-Paste-2.0.3": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-PasteDeploy-1.5.2": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-PasteScript-1.7.5": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-Pygments-2.2.0": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-Routes-1.13": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-SQLAlchemy-0.9.9": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-Tempita-0.5.2": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-URLObject-2.4.0": { - "The Unlicense": "http://unlicense.org/" - }, - "python2.7-WebError-0.10.3": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-WebHelpers-1.3": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-WebHelpers2-2.0": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-WebOb-1.3.1": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-Whoosh-2.7.4": { - "BSD 2-clause \"Simplified\" License": "http://spdx.org/licenses/BSD-2-Clause", - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-alembic-0.8.4": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-appenlight-client-0.6.14": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-authomatic-0.1.0.post1": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-backports.shutil-get-terminal-size-1.0.0": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-bleach-1.5.0": { - "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0" - }, - "python2.7-celery-2.2.10": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-channelstream-0.5.2": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-click-5.1": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-colander-1.2": { - "Repoze License": "http://www.repoze.org/LICENSE.txt" - }, - "python2.7-configobj-5.0.6": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-configparser-3.5.0": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-cssselect-1.0.1": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-decorator-4.0.11": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-deform-2.0a2": { - "BSD-derived": "http://www.repoze.org/LICENSE.txt" - }, - "python2.7-docutils-0.12": { - "BSD 2-clause \"Simplified\" License": "http://spdx.org/licenses/BSD-2-Clause" - }, - "python2.7-dogpile.cache-0.6.1": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-dogpile.core-0.4.1": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-elasticsearch-2.3.0": { - "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0" - }, - "python2.7-elasticsearch-dsl-2.2.0": { - "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0" - }, - "python2.7-entrypoints-0.2.2": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-enum34-1.1.6": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-functools32-3.2.3.post2": { - "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0" - }, - "python2.7-future-0.14.3": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-futures-3.0.2": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-gevent-1.1.2": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-gnureadline-6.3.3": { - "GNU General Public License v1.0 only": "http://spdx.org/licenses/GPL-1.0" - }, - "python2.7-gprof2dot-2016.10.13": { - "GNU Lesser General Public License v3.0 or later": "http://spdx.org/licenses/LGPL-3.0+" - }, - "python2.7-greenlet-0.4.10": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-gunicorn-19.6.0": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-html5lib-0.9999999": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-infrae.cache-1.0.1": { - "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1" - }, - "python2.7-ipython-5.1.0": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-ipython-genutils-0.2.0": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-iso8601-0.1.11": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-itsdangerous-0.24": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-jsonschema-2.6.0": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-jupyter-client-5.0.0": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-jupyter-core-4.3.0": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-kombu-4.1.0": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-mistune-0.7.4": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-msgpack-python-0.4.8": { - "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0" - }, - "python2.7-nbconvert-5.1.1": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-nbformat-4.3.0": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-packaging-15.2": { - "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0" - }, - "python2.7-pandocfilters-1.4.1": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-pathlib2-2.1.0": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-peppercorn-0.5": { - "BSD-derived": "http://www.repoze.org/LICENSE.txt" - }, - "python2.7-pexpect-4.2.1": { - "ISC License": "http://spdx.org/licenses/ISC" - }, - "python2.7-pickleshare-0.7.4": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-prompt-toolkit-1.0.14": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-psutil-4.3.1": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-psycopg2-2.6.1": { - "GNU Lesser General Public License v3.0 or later": "http://spdx.org/licenses/LGPL-3.0+" - }, - "python2.7-ptyprocess-0.5.1": { - "ISC License": "http://opensource.org/licenses/ISC" - }, - "python2.7-py-1.4.31": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-py-bcrypt-0.4": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-py-gfm-0.1.3.rhodecode-upstream1": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-pycrypto-2.6.1": { - "Public Domain": null - }, - "python2.7-pycurl-7.19.5": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-pygments-markdown-lexer-0.1.0.dev39": { - "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0" - }, - "python2.7-pyparsing-1.5.7": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-pyramid-1.7.4": { - "Repoze License": "http://www.repoze.org/LICENSE.txt" - }, - "python2.7-pyramid-beaker-0.8": { - "Repoze License": "http://www.repoze.org/LICENSE.txt" - }, - "python2.7-pyramid-debugtoolbar-3.0.5": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause", - "Repoze License": "http://www.repoze.org/LICENSE.txt" - }, - "python2.7-pyramid-jinja2-2.5": { - "BSD-derived": "http://www.repoze.org/LICENSE.txt" - }, - "python2.7-pyramid-mako-1.0.2": { - "Repoze License": "http://www.repoze.org/LICENSE.txt" - }, - "python2.7-pysqlite-2.6.3": { - "libpng License": "http://spdx.org/licenses/Libpng", - "zlib License": "http://spdx.org/licenses/Zlib" - }, - "python2.7-pytest-3.0.5": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-pytest-profiling-1.2.2": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-pytest-runner-2.9": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-pytest-sugar-0.7.1": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-pytest-timeout-1.2.0": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-python-dateutil-2.1": { - "Simplified BSD": null - }, - "python2.7-python-editor-1.0.3": { - "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0" - }, - "python2.7-python-ldap-2.4.19": { - "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0" - }, - "python2.7-python-memcached-1.57": { - "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0" - }, - "python2.7-pytz-2015.4": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-pyzmq-14.6.0": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-repoze.lru-0.6": { - "Repoze License": "http://www.repoze.org/LICENSE.txt" - }, - "python2.7-requests-2.9.1": { - "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0" - }, - "python2.7-setuptools-scm-1.15.6": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-simplegeneric-0.8.1": { - "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1" - }, - "python2.7-simplejson-3.7.2": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-six-1.9.0": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-subprocess32-3.2.6": { - "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0" - }, - "python2.7-termcolor-1.1.0": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-testpath-0.1": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-traitlets-4.3.2": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-translationstring-1.3": { - "Repoze License": "http://www.repoze.org/LICENSE.txt" - }, - "python2.7-urllib3-1.16": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-venusian-1.0": { - "Repoze License": "http://www.repoze.org/LICENSE.txt" - }, - "python2.7-waitress-1.0.1": { - "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1" - }, - "python2.7-wcwidth-0.1.7": { - "MIT License": "http://spdx.org/licenses/MIT" - }, - "python2.7-ws4py-0.3.5": { - "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause" - }, - "python2.7-zope.cachedescriptors-4.0.0": { - "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1" - }, - "python2.7-zope.deprecation-4.1.2": { - "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1" - }, - "python2.7-zope.interface-4.1.3": { - "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1" - }, - "xz-5.2.2": { - "GNU General Public License v2.0 or later": "http://spdx.org/licenses/GPL-2.0+", - "GNU Library General Public License v2.1 or later": "http://spdx.org/licenses/LGPL-2.1+" - } -} \ No newline at end of file +[ + { + "license": [ + { + "fullName": "Python Software Foundation License version 2", + "shortName": "psfl", + "spdxId": "Python-2.0", + "url": "http://spdx.org/licenses/Python-2.0.html" + }, + { + "fullName": "Zope Public License 2.0", + "shortName": "zpl20", + "spdxId": "ZPL-2.0", + "url": "http://spdx.org/licenses/ZPL-2.0.html" + } + ], + "name": "python2.7-setuptools-38.4.0" + }, + { + "license": { + "fullName": "Python Software Foundation License version 2", + "shortName": "psfl", + "spdxId": "Python-2.0", + "url": "http://spdx.org/licenses/Python-2.0.html" + }, + "name": "python-2.7.15" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-coverage-3.7.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-bootstrapped-pip-9.0.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-cov-core-1.15.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-webtest-2.0.29" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-beautifulsoup4-4.6.3" + }, + { + "license": [ + { + "fullName": "Zope Public License 2.1", + "shortName": "zpl21", + "spdxId": "ZPL-2.1", + "url": "http://spdx.org/licenses/ZPL-2.1.html" + } + ], + "name": "python2.7-waitress-1.1.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-webob-1.7.4" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-six-1.11.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-mock-1.0.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + }, + { + "fullName": "DFSG approved" + } + ], + "name": "python2.7-pytest-timeout-1.2.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pytest-3.6.0" + }, + { + "license": [ + { + "fullName": "ASL" + }, + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-funcsigs-1.0.2" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pluggy-0.6.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-atomicwrites-1.1.5" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-more-itertools-4.3.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-attrs-18.1.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-py-1.5.3" + }, + { + "license": [ + { + "fullName": "GNU Lesser General Public License v3 or later (LGPLv3+)" + }, + { + "fullName": "LGPL" + } + ], + "name": "python2.7-gprof2dot-2017.9.19" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pytest-profiling-1.3.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pytest-runner-4.2" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-setuptools-scm-2.1.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-pytest-sugar-0.9.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-termcolor-1.1.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + }, + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pytest-cov-2.5.1" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-appenlight-client-0.6.25" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-requests-2.9.1" + }, + { + "license": [ + { + "fullName": "AGPLv3 and Proprietary" + } + ], + "name": "python2.7-rhodecode-tools-0.16.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + }, + { + "fullName": "BSD 2-clause \"Simplified\" License", + "shortName": "bsd2", + "spdxId": "BSD-2-Clause", + "url": "http://spdx.org/licenses/BSD-2-Clause.html" + } + ], + "name": "python2.7-whoosh-2.7.4" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-urllib3-1.21" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-elasticsearch-dsl-2.2.0" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-elasticsearch-2.3.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + }, + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + }, + { + "fullName": "Dual License" + } + ], + "name": "python2.7-python-dateutil-2.7.3" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-markupsafe-1.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-mako-1.0.7" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-future-0.14.3" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-click-6.6" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-bottle-0.12.13" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-cprofilev-1.0.7" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-ipython-5.1.0" + }, + { + "license": [ + { + "fullName": "GNU General Public License v3 (GPLv3)" + }, + { + "fullName": "GNU General Public License v1.0 only", + "shortName": "gpl1", + "spdxId": "GPL-1.0", + "url": "http://spdx.org/licenses/GPL-1.0.html" + } + ], + "name": "python2.7-gnureadline-6.3.8" + }, + { + "license": [ + { + "fullName": "ISC License", + "shortName": "isc", + "spdxId": "ISC", + "url": "http://spdx.org/licenses/ISC.html" + }, + { + "fullName": "ISC License (ISCL)" + } + ], + "name": "python2.7-pexpect-4.6.0" + }, + { + "license": [], + "name": "python2.7-ptyprocess-0.6.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pathlib2-2.3.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + }, + { + "fullName": "New BSD License" + } + ], + "name": "python2.7-scandir-1.9.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-backports.shutil-get-terminal-size-1.0.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-pygments-2.2.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-prompt-toolkit-1.0.15" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-wcwidth-0.1.7" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-traitlets-4.3.2" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-enum34-1.1.6" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + }, + { + "fullName": "new BSD License" + } + ], + "name": "python2.7-decorator-4.1.2" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-ipython-genutils-0.2.0" + }, + { + "license": [ + { + "fullName": "Zope Public License 2.1", + "shortName": "zpl21", + "spdxId": "ZPL-2.1", + "url": "http://spdx.org/licenses/ZPL-2.1.html" + } + ], + "name": "python2.7-simplegeneric-0.8.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pickleshare-0.7.4" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-ipdb-0.11" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-gunicorn-19.9.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-futures-3.0.2" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-greenlet-0.4.13" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-gevent-1.3.5" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-psutil-5.4.6" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-bumpversion-0.5.3" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-invoke-0.13.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-alembic-0.9.9" + }, + { + "license": { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + }, + "name": "python2.7-python-editor-1.0.3" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-sqlalchemy-1.1.18" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-jupyter-client-5.0.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + }, + { + "fullName": "LGPL+BSD" + }, + { + "fullName": "GNU Library or Lesser General Public License (LGPL)" + } + ], + "name": "python2.7-pyzmq-14.6.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-jupyter-core-4.4.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-nbformat-4.4.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-jsonschema-2.6.0" + }, + { + "license": [ + { + "fullName": "Python Software Foundation License version 2", + "shortName": "psfl", + "spdxId": "Python-2.0", + "url": "http://spdx.org/licenses/Python-2.0.html" + } + ], + "name": "python2.7-functools32-3.2.3.post2" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-bleach-2.1.4" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-html5lib-1.0.1" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-webencodings-0.5.1" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-nbconvert-5.3.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-testpath-0.3.1" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-pandocfilters-1.4.2" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-entrypoints-0.2.2" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-configparser-3.5.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-jinja2-2.9.6" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-mistune-0.8.3" + }, + { + "license": [ + { + "fullName": "Zope Public License 2.1", + "shortName": "zpl21", + "spdxId": "ZPL-2.1", + "url": "http://spdx.org/licenses/ZPL-2.1.html" + } + ], + "name": "python2.7-zope.interface-4.5.0" + }, + { + "license": [ + { + "fullName": "Zope Public License 2.1", + "shortName": "zpl21", + "spdxId": "ZPL-2.1", + "url": "http://spdx.org/licenses/ZPL-2.1.html" + } + ], + "name": "python2.7-zope.event-4.3.0" + }, + { + "license": [ + { + "fullName": "Zope Public License 2.1", + "shortName": "zpl21", + "spdxId": "ZPL-2.1", + "url": "http://spdx.org/licenses/ZPL-2.1.html" + } + ], + "name": "python2.7-zope.deprecation-4.3.0" + }, + { + "license": [ + { + "fullName": "Zope Public License 2.1", + "shortName": "zpl21", + "spdxId": "ZPL-2.1", + "url": "http://spdx.org/licenses/ZPL-2.1.html" + } + ], + "name": "python2.7-zope.cachedescriptors-4.3.1" + }, + { + "license": [ + { + "fullName": "PSF or ZPL" + } + ], + "name": "python2.7-wsgiref-0.1.2" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-webhelpers-1.3" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-webhelpers2-2.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-weberror-0.10.3" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-paste-2.0.3" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-tempita-0.5.2" + }, + { + "license": { + "fullName": "Repoze License", + "url": "http://www.repoze.org/LICENSE.txt" + }, + "name": "python2.7-venusian-1.1.0" + }, + { + "license": { + "fullName": "The Unlicense", + "spdxId": "Unlicense", + "url": "http://unlicense.org/" + }, + "name": "python2.7-urlobject-2.4.3" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-trollius-1.0.4" + }, + { + "license": { + "fullName": "Repoze License", + "url": "http://www.repoze.org/LICENSE.txt" + }, + "name": "python2.7-translationstring-1.3" + }, + { + "license": [ + { + "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)" + } + ], + "name": "python2.7-supervisor-3.3.4" + }, + { + "license": [ + { + "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)" + } + ], + "name": "python2.7-meld3-1.0.2" + }, + { + "license": [ + { + "fullName": "Python Software Foundation License version 2", + "shortName": "psfl", + "spdxId": "Python-2.0", + "url": "http://spdx.org/licenses/Python-2.0.html" + } + ], + "name": "python2.7-subprocess32-3.5.1" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-sshpubkeys-2.2.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-ecdsa-0.13" + }, + { + "license": [ + { + "fullName": "Public Domain", + "shortName": "publicDomain" + } + ], + "name": "python2.7-pycrypto-2.6.1" + }, + { + "license": [ + { + "fullName": "Academic Free License (AFL)" + }, + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-simplejson-3.11.1" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-setproctitle-1.1.10" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-routes-2.4.1" + }, + { + "license": { + "fullName": "Repoze License", + "url": "http://www.repoze.org/LICENSE.txt" + }, + "name": "python2.7-repoze.lru-0.7" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-redis-2.10.6" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-py-gfm-0.1.3" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-markdown-2.6.11" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-tzlocal-1.5.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pytz-2018.4" + }, + { + "license": [ + { + "fullName": "License :: OSI Approved :: MIT License" + }, + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-python-pam-1.8.4" + }, + { + "license": [ + { + "fullName": "GNU General Public License v1.0 only", + "shortName": "gpl1", + "spdxId": "GPL-1.0", + "url": "http://spdx.org/licenses/GPL-1.0.html" + } + ], + "name": "linux-pam-1.3.0" + }, + { + "license": [ + { + "fullName": "Python Software Foundation License version 2", + "shortName": "psfl", + "spdxId": "Python-2.0", + "url": "http://spdx.org/licenses/Python-2.0.html" + } + ], + "name": "python2.7-python-memcached-1.59" + }, + { + "license": [ + { + "fullName": "Python Software Foundation License version 2", + "shortName": "psfl", + "spdxId": "Python-2.0", + "url": "http://spdx.org/licenses/Python-2.0.html" + } + ], + "name": "python2.7-python-ldap-3.1.0" + }, + { + "license": { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + }, + "name": "libkrb5-1.15.2" + }, + { + "license":{ + "fullName": "BSD-derived (https://www.openldap.org/software/release/license.html)" + }, + "name": "openldap-2.4.45" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-pyasn1-modules-0.2.2" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-pyasn1-0.4.4" + }, + { + "license": [ + { + "fullName": "zlib License", + "shortName": "zlib", + "spdxId": "Zlib", + "url": "http://spdx.org/licenses/Zlib.html" + }, + { + "fullName": "libpng License", + "shortName": "libpng", + "spdxId": "Libpng", + "url": "http://spdx.org/licenses/Libpng.html" + } + ], + "name": "python2.7-pysqlite-2.8.3" + }, + { + "license": { + "fullName": "Repoze License", + "url": "http://www.repoze.org/LICENSE.txt" + }, + "name": "python2.7-pyramid-1.9.2" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-hupper-1.3" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-plaster-pastedeploy-0.6" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-plaster-1.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pastedeploy-1.5.2" + }, + { + "license": { + "fullName": "Repoze License", + "url": "http://www.repoze.org/LICENSE.txt" + }, + "name": "python2.7-pyramid-mako-1.0.2" + }, + { + "license": [ + { + "fullName": "Repoze Public License" + }, + { + "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)" + } + ], + "name": "python2.7-pyramid-jinja2-2.7" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + }, + { + "fullName": "Repoze License", + "url": "http://www.repoze.org/LICENSE.txt" + } + ], + "name": "python2.7-pyramid-debugtoolbar-4.4" + }, + { + "license": [ + { + "fullName": "Python Software Foundation License version 2", + "shortName": "psfl", + "spdxId": "Python-2.0", + "url": "http://spdx.org/licenses/Python-2.0.html" + } + ], + "name": "python2.7-ipaddress-1.0.22" + }, + { + "license": { + "fullName": "Repoze License", + "url": "http://www.repoze.org/LICENSE.txt" + }, + "name": "python2.7-pyramid-beaker-0.8" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-beaker-1.9.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pyparsing-1.5.7" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-pygments-markdown-lexer-0.1.0.dev39" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pyflakes-0.8.1" + }, + { + "license": { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + }, + "name": "python2.7-pycurl-7.43.0.2" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-py-bcrypt-0.4" + }, + { + "license": { + "fullName": "GNU Lesser General Public License v3.0 or later", + "shortName": "lgpl3Plus", + "spdxId": "LGPL-3.0+", + "url": "http://spdx.org/licenses/LGPL-3.0+.html" + }, + "name": "python2.7-psycopg2-2.7.4" + }, + { + "license": { + "fullName": "PostgreSQL License", + "shortName": "postgresql", + "spdxId": "PostgreSQL", + "url": "http://spdx.org/licenses/PostgreSQL.html" + }, + "name": "postgresql-9.6.10" + }, + { + "license": [ + { + "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)" + } + ], + "name": "python2.7-peppercorn-0.5" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pastescript-2.0.2" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-packaging-15.2" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-objgraph-3.1.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-graphviz-0.9" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-pyotp-2.2.6" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pymysql-0.8.1" + }, + { + "license": [ + { + "fullName": "GNU General Public License v1.0 only", + "shortName": "gpl1", + "spdxId": "GPL-1.0", + "url": "http://spdx.org/licenses/GPL-1.0.html" + } + ], + "name": "python2.7-mysql-python-1.2.5" + }, + { + "license": { + "fullName": "GNU Library General Public License v2.1 only", + "shortName": "lgpl21", + "spdxId": "LGPL-2.1", + "url": "http://spdx.org/licenses/LGPL-2.1.html" + }, + "name": "mariadb-connector-c-2.3.4" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-msgpack-python-0.5.6" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-lxml-3.7.3" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-wheel-0.30.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-kombu-4.2.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-amqp-2.3.1" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-vine-1.1.4" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-billiard-3.5.0.3" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-itsdangerous-0.24" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-iso8601-0.1.11" + }, + { + "license": [ + { + "fullName": "Zope Public License 2.1", + "shortName": "zpl21", + "spdxId": "ZPL-2.1", + "url": "http://spdx.org/licenses/ZPL-2.1.html" + } + ], + "name": "python2.7-infrae.cache-1.0.1" + }, + { + "license": [ + { + "fullName": "Python Software Foundation License version 2", + "shortName": "psfl", + "spdxId": "Python-2.0", + "url": "http://spdx.org/licenses/Python-2.0.html" + } + ], + "name": "python2.7-formencode-1.2.4" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-dogpile.core-0.4.1" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-dogpile.cache-0.6.6" + }, + { + "license": { + "fullName": "BSD 2-clause \"Simplified\" License", + "shortName": "bsd2", + "spdxId": "BSD-2-Clause", + "url": "http://spdx.org/licenses/BSD-2-Clause.html" + }, + "name": "python2.7-docutils-0.14" + }, + { + "license": [ + { + "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)" + } + ], + "name": "python2.7-deform-2.0.5" + }, + { + "license": { + "fullName": "Repoze License", + "url": "http://www.repoze.org/LICENSE.txt" + }, + "name": "python2.7-colander-1.4" + }, + { + "license": [ + { + "fullName": "BSD-like (http://repoze.org/license.html)" + } + ], + "name": "python2.7-chameleon-2.24" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-cssselect-1.0.3" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-configobj-5.0.6" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-channelstream-0.5.2" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-ws4py-0.5.1" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-celery-4.1.1" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-babel-1.3" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-authomatic-0.1.0.post1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "node-grunt-cli-1.2.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-rhodecode-testdata-0.10.0" + } +] diff --git a/rhodecode/config/rcextensions/README.txt b/rhodecode/config/rcextensions/README.txt new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/README.txt @@ -0,0 +1,7 @@ +This is template rcextensions. + +To edit rcextensions please edit hooks.py file. +The examples/ directory contain some basic example how to use hooks. + + +Changes to rcextensions requires restart of RhodeCode instances. diff --git a/rhodecode/config/rcextensions/__init__.py b/rhodecode/config/rcextensions/__init__.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/__init__.py @@ -0,0 +1,56 @@ +# Copyright (C) 2016-2018 RhodeCode GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License, version 3 +# (only), as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# This program is dual-licensed. If you wish to learn more about the +# RhodeCode Enterprise Edition, including its added features, Support services, +# and proprietary license terms, please see https://rhodecode.com/licenses/ + +""" +rcextensions module, please edit `hooks.py` to over write hooks logic +""" + +from .hooks import ( + _create_repo_hook, + _create_repo_group_hook, + _pre_create_user_hook, + _create_user_hook, + _delete_repo_hook, + _delete_user_hook, + _pre_push_hook, + _push_hook, + _pre_pull_hook, + _pull_hook, + _create_pull_request_hook, + _review_pull_request_hook, + _update_pull_request_hook, + _merge_pull_request_hook, + _close_pull_request_hook, +) + +# set as module attributes, we use those to call hooks. *do not change this* +CREATE_REPO_HOOK = _create_repo_hook +CREATE_REPO_GROUP_HOOK = _create_repo_group_hook +PRE_CREATE_USER_HOOK = _pre_create_user_hook +CREATE_USER_HOOK = _create_user_hook +DELETE_REPO_HOOK = _delete_repo_hook +DELETE_USER_HOOK = _delete_user_hook +PRE_PUSH_HOOK = _pre_push_hook +PUSH_HOOK = _push_hook +PRE_PULL_HOOK = _pre_pull_hook +PULL_HOOK = _pull_hook +CREATE_PULL_REQUEST = _create_pull_request_hook +REVIEW_PULL_REQUEST = _review_pull_request_hook +UPDATE_PULL_REQUEST = _update_pull_request_hook +MERGE_PULL_REQUEST = _merge_pull_request_hook +CLOSE_PULL_REQUEST = _close_pull_request_hook diff --git a/rhodecode/config/rcextensions/examples/http_call_on_push.py b/rhodecode/config/rcextensions/examples/http_call_on_push.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/examples/http_call_on_push.py @@ -0,0 +1,36 @@ +# Example to trigger a HTTP call via an HTTP helper via post_push hook + + +@has_kwargs({ + 'server_url': 'url of instance that triggered this hook', + 'config': 'path to .ini config used', + 'scm': 'type of version control "git", "hg", "svn"', + 'username': 'username of actor who triggered this event', + 'ip': 'ip address of actor who triggered this hook', + 'action': '', + 'repository': 'repository name', + 'repo_store_path': 'full path to where repositories are stored', + 'commit_ids': '', + 'hook_type': '', + 'user_agent': '', +}) +def _push_hook(*args, **kwargs): + """ + POST PUSH HOOK, this function will be executed after each push it's + executed after the build-in hook that RhodeCode uses for logging pushes + """ + + from .helpers import http_call, extra_fields + # returns list of dicts with key-val fetched from extra fields + repo_extra_fields = extra_fields.run(**kwargs) + + if repo_extra_fields.get('endpoint_url'): + endpoint = repo_extra_fields['endpoint_url'] + if endpoint: + data = { + 'some_key': 'val' + } + response = http_call.run(url=endpoint, json_data=data) + return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint, response)) + + return HookResponse(0, '') diff --git a/rhodecode/config/rcextensions/examples/trigger_ci_call.py b/rhodecode/config/rcextensions/examples/trigger_ci_call.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/examples/trigger_ci_call.py @@ -0,0 +1,36 @@ +# Example to trigger a CI call via an HTTP helper via post_push hook + + +@has_kwargs({ + 'server_url': 'url of instance that triggered this hook', + 'config': 'path to .ini config used', + 'scm': 'type of version control "git", "hg", "svn"', + 'username': 'username of actor who triggered this event', + 'ip': 'ip address of actor who triggered this hook', + 'action': '', + 'repository': 'repository name', + 'repo_store_path': 'full path to where repositories are stored', + 'commit_ids': '', + 'hook_type': '', + 'user_agent': '', +}) +def _push_hook(*args, **kwargs): + """ + POST PUSH HOOK, this function will be executed after each push it's + executed after the build-in hook that RhodeCode uses for logging pushes + """ + + from .helpers import http_call, extra_fields + # returns list of dicts with key-val fetched from extra fields + repo_extra_fields = extra_fields.run(**kwargs) + + if repo_extra_fields.get('endpoint_url'): + endpoint = repo_extra_fields['endpoint_url'] + if endpoint: + data = { + 'some_key': 'val' + } + response = http_call.run(url=endpoint, json_data=data) + return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint, response)) + + return HookResponse(0, '') diff --git a/rhodecode/config/rcextensions/examples/validate_author.py b/rhodecode/config/rcextensions/examples/validate_author.py new file mode 100644 diff --git a/rhodecode/config/rcextensions/examples/validate_commit_message.py b/rhodecode/config/rcextensions/examples/validate_commit_message.py new file mode 100644 diff --git a/rhodecode/config/rcextensions/helpers/__init__.py b/rhodecode/config/rcextensions/helpers/__init__.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/helpers/__init__.py @@ -0,0 +1,17 @@ +# Copyright (C) 2016-2018 RhodeCode GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License, version 3 +# (only), as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# This program is dual-licensed. If you wish to learn more about the +# RhodeCode Enterprise Edition, including its added features, Support services, +# and proprietary license terms, please see https://rhodecode.com/licenses/ diff --git a/rhodecode/config/rcextensions/helpers/extra_fields.py b/rhodecode/config/rcextensions/helpers/extra_fields.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/helpers/extra_fields.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2016-2018 RhodeCode GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License, version 3 +# (only), as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# This program is dual-licensed. If you wish to learn more about the +# RhodeCode Enterprise Edition, including its added features, Support services, +# and proprietary license terms, please see https://rhodecode.com/licenses/ + +""" +us in hooks:: + + from .helpers import extra_fields + # returns list of dicts with key-val fetched from extra fields + repo_extra_fields = extra_fields.run(**kwargs) + +""" + + +def run(*args, **kwargs): + from rhodecode.model.db import Repository + # use temp name then the main one propagated + repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository'] + repo = Repository.get_by_repo_name(repo_name) + + fields = {} + for field in repo.extra_fields: + fields[field.field_key] = field.get_dict() + + return fields diff --git a/rhodecode/config/rcextensions/helpers/extract_post_commits.py b/rhodecode/config/rcextensions/helpers/extract_post_commits.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/helpers/extract_post_commits.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2016-2018 RhodeCode GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License, version 3 +# (only), as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# This program is dual-licensed. If you wish to learn more about the +# RhodeCode Enterprise Edition, including its added features, Support services, +# and proprietary license terms, please see https://rhodecode.com/licenses/ + +""" +Extract and serialize commits taken from a list of commit_ids. This should +be used in post_push hook + +us in hooks:: + + from .helpers import extract_post_commits + # returns list of dicts with key-val fetched from extra fields + commit_list = extract_post_commits.run(**kwargs) +""" +import traceback + + +def run(*args, **kwargs): + from rhodecode.lib.utils2 import extract_mentioned_users + from rhodecode.model.db import Repository + + commit_ids = kwargs.get('commit_ids') + if not commit_ids: + return 0 + + # use temp name then the main one propagated + repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository'] + + repo = Repository.get_by_repo_name(repo_name) + commits = [] + + vcs_repo = repo.scm_instance(cache=False) + try: + for commit_id in commit_ids: + cs = vcs_repo.get_changeset(commit_id) + cs_data = cs.__json__() + cs_data['mentions'] = extract_mentioned_users(cs_data['message']) + # optionally add more logic to parse the commits, like reading extra + # fields of repository to read managers of reviewers ? + commits.append(cs_data) + except Exception: + print(traceback.format_exc()) + # we don't send any commits when crash happens, only full list matters + # we short circuit then. + return [] + return commits diff --git a/rhodecode/config/rcextensions/helpers/extract_pre_commits.py b/rhodecode/config/rcextensions/helpers/extract_pre_commits.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/helpers/extract_pre_commits.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2016-2018 RhodeCode GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License, version 3 +# (only), as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# This program is dual-licensed. If you wish to learn more about the +# RhodeCode Enterprise Edition, including its added features, Support services, +# and proprietary license terms, please see https://rhodecode.com/licenses/ + +""" +us in hooks:: + + from .helpers import extract_pre_commits + # returns list of dicts with key-val fetched from extra fields + commit_list = extract_pre_commits.run(**kwargs) + +""" +import re +import collections + + +def get_hg_commits(repo, refs): + commits = [] + return commits + + +def get_git_commits(repo, refs): + commits = [] + return commits + + +def run(*args, **kwargs): + from rhodecode.model.db import Repository + + vcs_type = kwargs['scm'] + # use temp name then the main one propagated + repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository'] + + repo = Repository.get_by_repo_name(repo_name) + vcs_repo = repo.scm_instance(cache=False) + + commits = [] + + for rev_data in kwargs['commit_ids']: + new_environ = dict((k, v) for k, v in rev_data['hg_env']) + + if vcs_type == 'git': + commits = get_git_commits(vcs_repo, kwargs['commit_ids']) + + if vcs_type == 'hg': + commits = get_hg_commits(vcs_repo, kwargs['commit_ids']) + + return commits diff --git a/rhodecode/config/rcextensions/helpers/http_call.py b/rhodecode/config/rcextensions/helpers/http_call.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/helpers/http_call.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2016-2018 RhodeCode GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License, version 3 +# (only), as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# This program is dual-licensed. If you wish to learn more about the +# RhodeCode Enterprise Edition, including its added features, Support services, +# and proprietary license terms, please see https://rhodecode.com/licenses/ + +""" +us in hooks:: + + from .helpers import http_call + # returns response after making a POST call + response = http_call.run(url=url, json_data=data) + +""" + +from rhodecode.integrations.types.base import requests_retry_call + + +def run(url, json_data, method='post'): + requests_session = requests_retry_call() + requests_session.verify = True # Verify SSL + resp = requests_session.post(url, json=json_data, timeout=60) + return resp.raise_for_status() # raise exception on a failed request diff --git a/rhodecode/config/rcextensions/hooks.py b/rhodecode/config/rcextensions/hooks.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/hooks.py @@ -0,0 +1,431 @@ +# Copyright (C) 2016-2018 RhodeCode GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License, version 3 +# (only), as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# This program is dual-licensed. If you wish to learn more about the +# RhodeCode Enterprise Edition, including its added features, Support services, +# and proprietary license terms, please see https://rhodecode.com/licenses/ + +from .utils import DotDict, HookResponse, has_kwargs + + +# Config shortcut to keep, all configuration in one place +# Example: api_key = CONFIG.my_config.api_key +CONFIG = DotDict( + my_config=DotDict( + api_key='', + ), + +) + + +@has_kwargs({ + 'repo_name': '', + 'repo_type': '', + 'description': '', + 'private': '', + 'created_on': '', + 'enable_downloads': '', + 'repo_id': '', + 'user_id': '', + 'enable_statistics': '', + 'clone_uri': '', + 'fork_id': '', + 'group_id': '', + 'created_by': '' +}) +def _create_repo_hook(*args, **kwargs): + """ + POST CREATE REPOSITORY HOOK. This function will be executed after + each repository is created. kwargs available: + + """ + return HookResponse(0, '') + + +@has_kwargs({ + 'group_name': '', + 'group_parent_id': '', + 'group_description': '', + 'group_id': '', + 'user_id': '', + 'created_by': '', + 'created_on': '', + 'enable_locking': '' +}) +def _create_repo_group_hook(*args, **kwargs): + """ + POST CREATE REPOSITORY GROUP HOOK, this function will be + executed after each repository group is created. kwargs available: + """ + return HookResponse(0, '') + + +@has_kwargs({ + 'username': '', + 'password': '', + 'email': '', + 'firstname': '', + 'lastname': '', + 'active': '', + 'admin': '', + 'created_by': '', +}) +def _pre_create_user_hook(*args, **kwargs): + """ + PRE CREATE USER HOOK, this function will be executed before each + user is created, it returns a tuple of bool, reason. + If bool is False the user creation will be stopped and reason + will be displayed to the user. + + Return HookResponse(1, reason) to block user creation + + """ + + reason = 'allowed' + return HookResponse(0, reason) + + +@has_kwargs({ + 'username': '', + 'full_name_or_username': '', + 'full_contact': '', + 'user_id': '', + 'name': '', + 'firstname': '', + 'short_contact': '', + 'admin': '', + 'lastname': '', + 'ip_addresses': '', + 'extern_type': '', + 'extern_name': '', + 'email': '', + 'api_key': '', + 'api_keys': '', + 'last_login': '', + 'full_name': '', + 'active': '', + 'password': '', + 'emails': '', + 'inherit_default_permissions': '', + 'created_by': '', + 'created_on': '', +}) +def _create_user_hook(*args, **kwargs): + """ + POST CREATE USER HOOK, this function will be executed after each user is created + """ + return HookResponse(0, '') + + +@has_kwargs({ + 'repo_name': '', + 'repo_type': '', + 'description': '', + 'private': '', + 'created_on': '', + 'enable_downloads': '', + 'repo_id': '', + 'user_id': '', + 'enable_statistics': '', + 'clone_uri': '', + 'fork_id': '', + 'group_id': '', + 'deleted_by': '', + 'deleted_on': '', +}) +def _delete_repo_hook(*args, **kwargs): + """ + POST DELETE REPOSITORY HOOK, this function will be executed after + each repository deletion + """ + return HookResponse(0, '') + + +@has_kwargs({ + 'username': '', + 'full_name_or_username': '', + 'full_contact': '', + 'user_id': '', + 'name': '', + 'short_contact': '', + 'admin': '', + 'firstname': '', + 'lastname': '', + 'ip_addresses': '', + 'email': '', + 'api_key': '', + 'last_login': '', + 'full_name': '', + 'active': '', + 'password': '', + 'emails': '', + 'inherit_default_permissions': '', + 'deleted_by': '', + }) +def _delete_user_hook(*args, **kwargs): + """ + POST DELETE USER HOOK, this function will be executed after each + user is deleted kwargs available: + """ + return HookResponse(0, '') + + +# ============================================================================= +# PUSH/PULL RELATED HOOKS +# ============================================================================= +@has_kwargs({ + 'server_url': 'url of instance that triggered this hook', + 'config': 'path to .ini config used', + 'scm': 'type of version control "git", "hg", "svn"', + 'username': 'username of actor who triggered this event', + 'ip': 'ip address of actor who triggered this hook', + 'action': '', + 'repository': 'repository name', + 'repo_store_path': 'full path to where repositories are stored', + 'commit_ids': 'pre transaction metadata for commit ids', + 'hook_type': '', + 'user_agent': 'Client user agent, e.g git or mercurial CLI version', +}) +def _pre_push_hook(*args, **kwargs): + """ + Post push hook + To stop version control from storing the transaction and send a message to user + use non-zero HookResponse with a message, e.g return HookResponse(1, 'Not allowed') + + This message will be shown back to client during PUSH operation + + Commit ids might look like that:: + + [{u'hg_env|git_env': ..., + u'multiple_heads': [], + u'name': u'default', + u'new_rev': u'd0befe0692e722e01d5677f27a104631cf798b69', + u'old_rev': u'd0befe0692e722e01d5677f27a104631cf798b69', + u'ref': u'', + u'total_commits': 2, + u'type': u'branch'}] + """ + return HookResponse(0, '') + + +@has_kwargs({ + 'server_url': 'url of instance that triggered this hook', + 'config': 'path to .ini config used', + 'scm': 'type of version control "git", "hg", "svn"', + 'username': 'username of actor who triggered this event', + 'ip': 'ip address of actor who triggered this hook', + 'action': '', + 'repository': 'repository name', + 'repo_store_path': 'full path to where repositories are stored', + 'commit_ids': 'list of pushed commit_ids (sha1)', + 'hook_type': '', + 'user_agent': 'Client user agent, e.g git or mercurial CLI version', +}) +def _push_hook(*args, **kwargs): + """ + POST PUSH HOOK, this function will be executed after each push it's + executed after the build-in hook that RhodeCode uses for logging pushes + """ + return HookResponse(0, '') + + +@has_kwargs({ + 'server_url': 'url of instance that triggered this hook', + 'repo_store_path': 'full path to where repositories are stored', + 'config': 'path to .ini config used', + 'scm': 'type of version control "git", "hg", "svn"', + 'username': 'username of actor who triggered this event', + 'ip': 'ip address of actor who triggered this hook', + 'action': '', + 'repository': 'repository name', + 'hook_type': '', + 'user_agent': 'Client user agent, e.g git or mercurial CLI version', +}) +def _pre_pull_hook(*args, **kwargs): + """ + Post pull hook + """ + return HookResponse(0, '') + + +@has_kwargs({ + 'server_url': 'url of instance that triggered this hook', + 'repo_store_path': 'full path to where repositories are stored', + 'config': 'path to .ini config used', + 'scm': 'type of version control "git", "hg", "svn"', + 'username': 'username of actor who triggered this event', + 'ip': 'ip address of actor who triggered this hook', + 'action': '', + 'repository': 'repository name', + 'hook_type': '', + 'user_agent': 'Client user agent, e.g git or mercurial CLI version', +}) +def _pull_hook(*args, **kwargs): + """ + This hook will be executed after each code pull. + """ + return HookResponse(0, '') + + +# ============================================================================= +# PULL REQUEST RELATED HOOKS +# ============================================================================= +@has_kwargs({ + 'server_url': 'url of instance that triggered this hook', + 'config': 'path to .ini config used', + 'scm': 'type of version control "git", "hg", "svn"', + 'username': 'username of actor who triggered this event', + 'ip': 'ip address of actor who triggered this hook', + 'action': '', + 'repository': 'repository name', + 'pull_request_id': '', + 'url': '', + 'title': '', + 'description': '', + 'status': '', + 'created_on': '', + 'updated_on': '', + 'commit_ids': '', + 'review_status': '', + 'mergeable': '', + 'source': '', + 'target': '', + 'author': '', + 'reviewers': '', +}) +def _create_pull_request_hook(*args, **kwargs): + """ + This hook will be executed after creation of a pull request. + """ + return HookResponse(0, '') + + +@has_kwargs({ + 'server_url': 'url of instance that triggered this hook', + 'config': 'path to .ini config used', + 'scm': 'type of version control "git", "hg", "svn"', + 'username': 'username of actor who triggered this event', + 'ip': 'ip address of actor who triggered this hook', + 'action': '', + 'repository': 'repository name', + 'pull_request_id': '', + 'url': '', + 'title': '', + 'description': '', + 'status': '', + 'created_on': '', + 'updated_on': '', + 'commit_ids': '', + 'review_status': '', + 'mergeable': '', + 'source': '', + 'target': '', + 'author': '', + 'reviewers': '', +}) +def _review_pull_request_hook(*args, **kwargs): + """ + This hook will be executed after review action was made on a pull request. + """ + return HookResponse(0, '') + + +@has_kwargs({ + 'server_url': 'url of instance that triggered this hook', + 'config': 'path to .ini config used', + 'scm': 'type of version control "git", "hg", "svn"', + 'username': 'username of actor who triggered this event', + 'ip': 'ip address of actor who triggered this hook', + 'action': '', + 'repository': 'repository name', + 'pull_request_id': '', + 'url': '', + 'title': '', + 'description': '', + 'status': '', + 'created_on': '', + 'updated_on': '', + 'commit_ids': '', + 'review_status': '', + 'mergeable': '', + 'source': '', + 'target': '', + 'author': '', + 'reviewers': '', +}) +def _update_pull_request_hook(*args, **kwargs): + """ + This hook will be executed after pull requests has been updated with new commits. + """ + return HookResponse(0, '') + + +@has_kwargs({ + 'server_url': 'url of instance that triggered this hook', + 'config': 'path to .ini config used', + 'scm': 'type of version control "git", "hg", "svn"', + 'username': 'username of actor who triggered this event', + 'ip': 'ip address of actor who triggered this hook', + 'action': '', + 'repository': 'repository name', + 'pull_request_id': '', + 'url': '', + 'title': '', + 'description': '', + 'status': '', + 'created_on': '', + 'updated_on': '', + 'commit_ids': '', + 'review_status': '', + 'mergeable': '', + 'source': '', + 'target': '', + 'author': '', + 'reviewers': '', +}) +def _merge_pull_request_hook(*args, **kwargs): + """ + This hook will be executed after merge of a pull request. + """ + return HookResponse(0, '') + + +@has_kwargs({ + 'server_url': 'url of instance that triggered this hook', + 'config': 'path to .ini config used', + 'scm': 'type of version control "git", "hg", "svn"', + 'username': 'username of actor who triggered this event', + 'ip': 'ip address of actor who triggered this hook', + 'action': '', + 'repository': 'repository name', + 'pull_request_id': '', + 'url': '', + 'title': '', + 'description': '', + 'status': '', + 'created_on': '', + 'updated_on': '', + 'commit_ids': '', + 'review_status': '', + 'mergeable': '', + 'source': '', + 'target': '', + 'author': '', + 'reviewers': '', +}) +def _close_pull_request_hook(*args, **kwargs): + """ + This hook will be executed after close of a pull request. + """ + return HookResponse(0, '') diff --git a/rhodecode/config/rcextensions/mapping.py b/rhodecode/config/rcextensions/mapping.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/mapping.py @@ -0,0 +1,21 @@ +# ============================================================================= +# END OF UTILITY FUNCTIONS HERE +# ============================================================================= + +# Additional mappings that are not present in the pygments lexers +# used for building stats +# format is {'ext':['Names']} eg. {'py':['Python']} note: there can be +# more than one name for extension +# NOTE: that this will override any mappings in LANGUAGES_EXTENSIONS_MAP +# build by pygments +EXTRA_MAPPINGS = {'html': ['Text']} + +# additional lexer definitions for custom files it's overrides pygments lexers, +# and uses defined name of lexer to colorize the files. Format is {'ext': +# 'lexer_name'} List of lexers can be printed running: +# >> python -c "import pprint;from pygments import lexers; +# pprint.pprint([(x[0], x[1]) for x in lexers.get_all_lexers()]);" + +EXTRA_LEXERS = { + 'tt': 'vbnet' +} diff --git a/rhodecode/config/rcextensions/utils.py b/rhodecode/config/rcextensions/utils.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/rcextensions/utils.py @@ -0,0 +1,147 @@ +# Copyright (C) 2016-2018 RhodeCode GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License, version 3 +# (only), as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# This program is dual-licensed. If you wish to learn more about the +# RhodeCode Enterprise Edition, including its added features, Support services, +# and proprietary license terms, please see https://rhodecode.com/licenses/ + +import os +import functools +import collections + + +class HookResponse(object): + def __init__(self, status, output): + self.status = status + self.output = output + + def __add__(self, other): + other_status = getattr(other, 'status', 0) + new_status = max(self.status, other_status) + other_output = getattr(other, 'output', '') + new_output = self.output + other_output + + return HookResponse(new_status, new_output) + + def __bool__(self): + return self.status == 0 + + +class DotDict(dict): + + def __contains__(self, k): + try: + return dict.__contains__(self, k) or hasattr(self, k) + except: + return False + + # only called if k not found in normal places + def __getattr__(self, k): + try: + return object.__getattribute__(self, k) + except AttributeError: + try: + return self[k] + except KeyError: + raise AttributeError(k) + + def __setattr__(self, k, v): + try: + object.__getattribute__(self, k) + except AttributeError: + try: + self[k] = v + except: + raise AttributeError(k) + else: + object.__setattr__(self, k, v) + + def __delattr__(self, k): + try: + object.__getattribute__(self, k) + except AttributeError: + try: + del self[k] + except KeyError: + raise AttributeError(k) + else: + object.__delattr__(self, k) + + def toDict(self): + return unserialize(self) + + def __repr__(self): + keys = list(self.keys()) + keys.sort() + args = ', '.join(['%s=%r' % (key, self[key]) for key in keys]) + return '%s(%s)' % (self.__class__.__name__, args) + + @staticmethod + def fromDict(d): + return serialize(d) + + +def serialize(x): + if isinstance(x, dict): + return DotDict((k, serialize(v)) for k, v in x.items()) + elif isinstance(x, (list, tuple)): + return type(x)(serialize(v) for v in x) + else: + return x + + +def unserialize(x): + if isinstance(x, dict): + return dict((k, unserialize(v)) for k, v in x.items()) + elif isinstance(x, (list, tuple)): + return type(x)(unserialize(v) for v in x) + else: + return x + + +def _verify_kwargs(func_name, expected_parameters, kwargs): + """ + Verify that exactly `expected_parameters` are passed in as `kwargs`. + """ + expected_parameters = set(expected_parameters) + kwargs_keys = set(kwargs.keys()) + if kwargs_keys != expected_parameters: + missing_kwargs = expected_parameters - kwargs_keys + unexpected_kwargs = kwargs_keys - expected_parameters + raise AssertionError( + "func:%s: missing parameters: %r, unexpected parameters: %s" % + (func_name, missing_kwargs, unexpected_kwargs)) + + +def has_kwargs(required_args): + """ + decorator to verify extension calls arguments. + + :param required_args: + """ + def wrap(func): + def wrapper(*args, **kwargs): + _verify_kwargs(func.func_name, required_args.keys(), kwargs) + # in case there's `calls` defined on module we store the data + maybe_log_call(func.func_name, args, kwargs) + return func(*args, **kwargs) + return wrapper + return wrap + + +def maybe_log_call(name, args, kwargs): + from rhodecode.config import rcextensions + if hasattr(rcextensions, 'calls'): + calls = rcextensions.calls + calls[name].append((args, kwargs)) diff --git a/rhodecode/events/repo.py b/rhodecode/events/repo.py --- a/rhodecode/events/repo.py +++ b/rhodecode/events/repo.py @@ -99,7 +99,7 @@ def _commits_as_dict(event, commit_ids, else: try: - cs = vcs_repo.get_changeset(commit_id) + cs = vcs_repo.get_commit(commit_id) except CommitDoesNotExistError: continue # maybe its in next repo @@ -133,7 +133,7 @@ def _commits_as_dict(event, commit_ids, missing_commits = set(commit_ids) - set(c['raw_id'] for c in commits) if missing_commits: log.error('Inconsistent repository state. ' - 'Missing commits: %s' % ', '.join(missing_commits)) + 'Missing commits: %s', ', '.join(missing_commits)) return commits diff --git a/rhodecode/integrations/__init__.py b/rhodecode/integrations/__init__.py --- a/rhodecode/integrations/__init__.py +++ b/rhodecode/integrations/__init__.py @@ -66,8 +66,8 @@ def integrations_event_handler(event): exc_info = sys.exc_info() store_exception(id(exc_info), exc_info) log.exception( - 'failure occurred when sending event %s to integration %s' % ( - event, integration)) + 'failure occurred when sending event %s to integration %s', + event, integration) def includeme(config): diff --git a/rhodecode/integrations/registry.py b/rhodecode/integrations/registry.py --- a/rhodecode/integrations/registry.py +++ b/rhodecode/integrations/registry.py @@ -31,8 +31,7 @@ class IntegrationTypeRegistry(collection key = IntegrationType.key if key in self: log.debug( - 'Overriding existing integration type %s (%s) with %s' % ( - self[key], key, IntegrationType)) + 'Overriding existing integration type %s (%s) with %s', + self[key], key, IntegrationType) self[key] = IntegrationType - diff --git a/rhodecode/integrations/routes.py b/rhodecode/integrations/routes.py --- a/rhodecode/integrations/routes.py +++ b/rhodecode/integrations/routes.py @@ -28,7 +28,57 @@ from rhodecode.integrations import integ log = logging.getLogger(__name__) +class ValidIntegrationPredicate(object): + def __init__(self, val, config): + self.val = val + + def text(self): + return 'valid_integration_route = %s' % self.val + + phash = text + + def __call__(self, info, request): + integration_type = info['match']['integration'] + integration_id = info['match'].get('integration_id') + + if integration_type not in integration_type_registry: + return False + + if integration_id: + if not safe_int(integration_id): + return False + + integration = Integration.get(integration_id) + if not integration: + return False + if integration.integration_type != integration_type: + return False + + # match types to repo or repo group + repo_name = info['match'].get('repo_name') + repo_group_name = info['match'].get('repo_group_name') + repo, repo_group = None, None + if repo_name: + repo = Repository.get_by_repo_name(repo_name) + if not repo: + return False + + if repo_group_name: + repo_group = RepoGroup.get_by_group_name(repo_group_name) + if not repo_group: + return False + + if repo and repo.repo_id != integration.repo_id: + return False + if repo_group and repo_group.group_id != integration.repo_group_id: + return False + + return True + + def includeme(config): + config.add_route_predicate( + 'valid_integration', ValidIntegrationPredicate) # global integrations config.add_route('global_integrations_new', @@ -52,10 +102,10 @@ def includeme(config): config.add_route('global_integrations_create', ADMIN_PREFIX + '/integrations/{integration}/new', - custom_predicates=(valid_integration,)) + valid_integration=True) config.add_route('global_integrations_edit', ADMIN_PREFIX + '/integrations/{integration}/{integration_id}', - custom_predicates=(valid_integration,)) + valid_integration=True) for route_name in ['global_integrations_create', 'global_integrations_edit']: config.add_view('rhodecode.integrations.views.GlobalIntegrationsView', @@ -92,7 +142,7 @@ def includeme(config): config.add_route('repo_group_integrations_list', add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}'), repo_group_route=True, - custom_predicates=(valid_integration,)) + valid_integration=True) config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView', attr='integration_list', renderer='rhodecode:templates/admin/integrations/list.mako', @@ -102,7 +152,7 @@ def includeme(config): config.add_route('repo_group_integrations_create', add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}/new'), repo_group_route=True, - custom_predicates=(valid_integration,)) + valid_integration=True) config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView', attr='settings_get', renderer='rhodecode:templates/admin/integrations/form.mako', @@ -117,7 +167,7 @@ def includeme(config): config.add_route('repo_group_integrations_edit', add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}/{integration_id}'), repo_group_route=True, - custom_predicates=(valid_integration,)) + valid_integration=True) config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView', attr='settings_get', @@ -152,7 +202,7 @@ def includeme(config): config.add_route('repo_integrations_list', add_route_requirements('/{repo_name}/settings/integrations/{integration}'), repo_route=True, - custom_predicates=(valid_integration,)) + valid_integration=True) config.add_view('rhodecode.integrations.views.RepoIntegrationsView', attr='integration_list', request_method='GET', @@ -162,7 +212,7 @@ def includeme(config): config.add_route('repo_integrations_create', add_route_requirements('/{repo_name}/settings/integrations/{integration}/new'), repo_route=True, - custom_predicates=(valid_integration,)) + valid_integration=True) config.add_view('rhodecode.integrations.views.RepoIntegrationsView', attr='settings_get', renderer='rhodecode:templates/admin/integrations/form.mako', @@ -177,7 +227,7 @@ def includeme(config): config.add_route('repo_integrations_edit', add_route_requirements('/{repo_name}/settings/integrations/{integration}/{integration_id}'), repo_route=True, - custom_predicates=(valid_integration,)) + valid_integration=True) config.add_view('rhodecode.integrations.views.RepoIntegrationsView', attr='settings_get', renderer='rhodecode:templates/admin/integrations/form.mako', @@ -188,43 +238,3 @@ def includeme(config): renderer='rhodecode:templates/admin/integrations/form.mako', request_method='POST', route_name='repo_integrations_edit') - - - -def valid_integration(info, request): - integration_type = info['match']['integration'] - integration_id = info['match'].get('integration_id') - - if integration_type not in integration_type_registry: - return False - - if integration_id: - if not safe_int(integration_id): - return False - - integration = Integration.get(integration_id) - if not integration: - return False - if integration.integration_type != integration_type: - return False - - # match types to repo or repo group - repo_name = info['match'].get('repo_name') - repo_group_name = info['match'].get('repo_group_name') - repo, repo_group = None, None - if repo_name: - repo = Repository.get_by_repo_name(repo_name) - if not repo: - return False - - if repo_group_name: - repo_group = RepoGroup.get_by_group_name(repo_group_name) - if not repo_group: - return False - - if repo and repo.repo_id != integration.repo_id: - return False - if repo_group and repo_group.group_id != integration.repo_group_id: - return False - - return True diff --git a/rhodecode/integrations/types/base.py b/rhodecode/integrations/types/base.py --- a/rhodecode/integrations/types/base.py +++ b/rhodecode/integrations/types/base.py @@ -22,6 +22,9 @@ import colander import string import collections import logging +import requests +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.util.retry import Retry from mako import exceptions @@ -320,3 +323,33 @@ def render_with_traceback(template, *arg except Exception: log.error(exceptions.text_error_template().render()) raise + + +STATUS_400 = (400, 401, 403) +STATUS_500 = (500, 502, 504) + + +def requests_retry_call( + retries=3, backoff_factor=0.3, status_forcelist=STATUS_400+STATUS_500, + session=None): + """ + session = requests_retry_session() + response = session.get('http://example.com') + + :param retries: + :param backoff_factor: + :param status_forcelist: + :param session: + """ + session = session or requests.Session() + retry = Retry( + total=retries, + read=retries, + connect=retries, + backoff_factor=backoff_factor, + status_forcelist=status_forcelist, + ) + adapter = HTTPAdapter(max_retries=retry) + session.mount('http://', adapter) + session.mount('https://', adapter) + return session diff --git a/rhodecode/integrations/types/email.py b/rhodecode/integrations/types/email.py --- a/rhodecode/integrations/types/email.py +++ b/rhodecode/integrations/types/email.py @@ -35,7 +35,7 @@ from rhodecode.integrations.types.base i log = logging.getLogger(__name__) -repo_push_template_plaintext = Template(''' +REPO_PUSH_TEMPLATE_PLAINTEXT = Template(''' Commits: % for commit in data['push']['commits']: @@ -46,9 +46,7 @@ Commits: % endfor ''') -## TODO (marcink): think about putting this into a file, or use base.mako email template - -repo_push_template_html = Template(''' +REPO_PUSH_TEMPLATE_HTML = Template(''' @@ -283,13 +281,13 @@ def repo_push_handler(data, settings): branch['name'] for branch in data['push']['branches'])) email_body_plaintext = render_with_traceback( - repo_push_template_plaintext, + REPO_PUSH_TEMPLATE_PLAINTEXT, data=data, subject=subject, instance_url=server_url) email_body_html = render_with_traceback( - repo_push_template_html, + REPO_PUSH_TEMPLATE_HTML, data=data, subject=subject, instance_url=server_url) diff --git a/rhodecode/integrations/types/hipchat.py b/rhodecode/integrations/types/hipchat.py --- a/rhodecode/integrations/types/hipchat.py +++ b/rhodecode/integrations/types/hipchat.py @@ -31,7 +31,8 @@ from rhodecode.lib import helpers as h from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask from rhodecode.lib.colander_utils import strip_whitespace from rhodecode.integrations.types.base import ( - IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback) + IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback, + requests_retry_call) log = logging.getLogger(__name__) @@ -119,11 +120,11 @@ class HipchatIntegrationType(Integration def send_event(self, event): if event.__class__ not in self.valid_events: - log.debug('event not valid: %r' % event) + log.debug('event not valid: %r', event) return if event.name not in self.settings['events']: - log.debug('event ignored: %r' % event) + log.debug('event ignored: %r', event) return data = event.as_dict() @@ -131,7 +132,7 @@ class HipchatIntegrationType(Integration text = '%s caused a %s event' % ( data['actor']['username'], event.name) - log.debug('handling hipchat event for %s' % event.name) + log.debug('handling hipchat event for %s', event.name) if isinstance(event, events.PullRequestCommentEvent): text = self.format_pull_request_comment_event(event, data) @@ -144,7 +145,7 @@ class HipchatIntegrationType(Integration elif isinstance(event, events.RepoCreateEvent): text = self.format_repo_create_event(data) else: - log.error('unhandled event type: %r' % event) + log.error('unhandled event type: %r', event) run_task(post_text_to_hipchat, self.settings, text) @@ -242,12 +243,12 @@ class HipchatIntegrationType(Integration @async_task(ignore_result=True, base=RequestContextTask) def post_text_to_hipchat(settings, text): - log.debug('sending %s to hipchat %s' % (text, settings['server_url'])) + log.debug('sending %s to hipchat %s', text, settings['server_url']) json_message = { "message": text, "color": settings.get('color', 'yellow'), "notify": settings.get('notify', False), } - - resp = requests.post(settings['server_url'], json=json_message, timeout=60) + req_session = requests_retry_call() + resp = req_session.post(settings['server_url'], json=json_message, timeout=60) resp.raise_for_status() # raise exception on a failed request diff --git a/rhodecode/integrations/types/slack.py b/rhodecode/integrations/types/slack.py --- a/rhodecode/integrations/types/slack.py +++ b/rhodecode/integrations/types/slack.py @@ -35,7 +35,8 @@ from rhodecode.lib import helpers as h from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask from rhodecode.lib.colander_utils import strip_whitespace from rhodecode.integrations.types.base import ( - IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback) + IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback, + requests_retry_call) log = logging.getLogger(__name__) @@ -110,11 +111,11 @@ class SlackIntegrationType(IntegrationTy def send_event(self, event): if event.__class__ not in self.valid_events: - log.debug('event not valid: %r' % event) + log.debug('event not valid: %r', event) return if event.name not in self.settings['events']: - log.debug('event ignored: %r' % event) + log.debug('event ignored: %r', event) return data = event.as_dict() @@ -127,7 +128,7 @@ class SlackIntegrationType(IntegrationTy fields = None overrides = None - log.debug('handling slack event for %s' % event.name) + log.debug('handling slack event for %s', event.name) if isinstance(event, events.PullRequestCommentEvent): (title, text, fields, overrides) \ @@ -141,7 +142,7 @@ class SlackIntegrationType(IntegrationTy elif isinstance(event, events.RepoCreateEvent): title, text = self.format_repo_create_event(data) else: - log.error('unhandled event type: %r' % event) + log.error('unhandled event type: %r', event) run_task(post_text_to_slack, self.settings, title, text, fields, overrides) @@ -314,8 +315,7 @@ def html_to_slack_links(message): @async_task(ignore_result=True, base=RequestContextTask) def post_text_to_slack(settings, title, text, fields=None, overrides=None): - log.debug('sending %s (%s) to slack %s' % ( - title, text, settings['service'])) + log.debug('sending %s (%s) to slack %s', title, text, settings['service']) fields = fields or [] overrides = overrides or {} @@ -345,6 +345,6 @@ def post_text_to_slack(settings, title, "username": settings.get('username', 'Rhodecode'), "attachments": [message_data] } - - resp = requests.post(settings['service'], json=json_message, timeout=60) + req_session = requests_retry_call() + resp = req_session.post(settings['service'], json=json_message, timeout=60) resp.raise_for_status() # raise exception on a failed request diff --git a/rhodecode/integrations/types/webhook.py b/rhodecode/integrations/types/webhook.py --- a/rhodecode/integrations/types/webhook.py +++ b/rhodecode/integrations/types/webhook.py @@ -23,17 +23,14 @@ from __future__ import unicode_literals import deform import deform.widget import logging -import requests -import requests.adapters import colander -from requests.packages.urllib3.util.retry import Retry import rhodecode from rhodecode import events from rhodecode.translation import _ from rhodecode.integrations.types.base import ( IntegrationTypeBase, get_auth, get_web_token, get_url_vars, - WebhookDataHandler, WEBHOOK_URL_VARS) + WebhookDataHandler, WEBHOOK_URL_VARS, requests_retry_call) from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask from rhodecode.model.validation_schema import widgets @@ -171,11 +168,11 @@ class WebhookIntegrationType(Integration 'handling event %s with Webhook integration %s', event.name, self) if event.__class__ not in self.valid_events: - log.debug('event not valid: %r' % event) + log.debug('event not valid: %r', event) return if event.name not in self.settings['events']: - log.debug('event ignored: %r' % event) + log.debug('event ignored: %r', event) return data = event.as_dict() @@ -233,11 +230,6 @@ def post_to_webhook(url_calls, settings) 'utc_timestamp': datetime.datetime(2017, 11, 30, 13, 0, 1, 569276) """ - max_retries = 3 - retries = Retry( - total=max_retries, - backoff_factor=0.15, - status_forcelist=[500, 502, 503, 504]) call_headers = { 'User-Agent': 'RhodeCode-webhook-caller/{}'.format( rhodecode.__version__) @@ -247,9 +239,7 @@ def post_to_webhook(url_calls, settings) token = get_web_token(settings) for url, headers, data in url_calls: - req_session = requests.Session() - req_session.mount( # retry max N times - 'http://', requests.adapters.HTTPAdapter(max_retries=retries)) + req_session = requests_retry_call() method = settings.get('method_type') or 'post' call_method = getattr(req_session, method) diff --git a/rhodecode/lib/audit_logger.py b/rhodecode/lib/audit_logger.py --- a/rhodecode/lib/audit_logger.py +++ b/rhodecode/lib/audit_logger.py @@ -65,6 +65,7 @@ ACTIONS_V1 = { 'repo.edit': {'old_data': {}}, 'repo.edit.permissions': {}, 'repo.edit.permissions.branch': {}, + 'repo.archive': {'old_data': {}}, 'repo.delete': {'old_data': {}}, 'repo.archive.download': {'user_agent': '', 'archive_name': '', diff --git a/rhodecode/lib/auth.py b/rhodecode/lib/auth.py --- a/rhodecode/lib/auth.py +++ b/rhodecode/lib/auth.py @@ -68,7 +68,6 @@ class PasswordGenerator(object): This is a simple class for generating password from different sets of characters usage:: - passwd_gen = PasswordGenerator() #print 8-letter password containing only big and small letters of alphabet @@ -322,6 +321,7 @@ def _cached_perms_data(user_id, scope, u class PermOrigin(object): SUPER_ADMIN = 'superadmin' + ARCHIVED = 'archived' REPO_USER = 'user:%s' REPO_USERGROUP = 'usergroup:%s' @@ -463,8 +463,14 @@ class PermissionCalculator(object): # repositories for perm in self.default_repo_perms: r_k = perm.UserRepoToPerm.repository.repo_name + archived = perm.UserRepoToPerm.repository.archived p = 'repository.admin' self.permissions_repositories[r_k] = p, PermOrigin.SUPER_ADMIN + # special case for archived repositories, which we block still even for + # super admins + if archived: + p = 'repository.read' + self.permissions_repositories[r_k] = p, PermOrigin.ARCHIVED # repository groups for perm in self.default_repo_groups_perms: @@ -572,6 +578,7 @@ class PermissionCalculator(object): def _calculate_default_permissions_repositories(self, user_inherit_object_permissions): for perm in self.default_repo_perms: r_k = perm.UserRepoToPerm.repository.repo_name + archived = perm.UserRepoToPerm.repository.archived p = perm.Permission.permission_name o = PermOrigin.REPO_DEFAULT self.permissions_repositories[r_k] = p, o @@ -602,6 +609,15 @@ class PermissionCalculator(object): o = PermOrigin.SUPER_ADMIN self.permissions_repositories[r_k] = p, o + # finally in case of archived repositories, we downgrade higher + # permissions to read + if archived: + current_perm = self.permissions_repositories[r_k] + if current_perm in ['repository.write', 'repository.admin']: + p = 'repository.read' + o = PermOrigin.ARCHIVED + self.permissions_repositories[r_k] = p, o + def _calculate_default_permissions_repository_branches(self, user_inherit_object_permissions): for perm in self.default_branch_repo_perms: @@ -611,8 +627,11 @@ class PermissionCalculator(object): o = PermOrigin.REPO_USER % perm.UserRepoToPerm.user.username if not self.explicit: - # TODO(marcink): fix this for multiple entries - cur_perm = self.permissions_repository_branches.get(r_k) or 'branch.none' + cur_perm = self.permissions_repository_branches.get(r_k) + if cur_perm: + cur_perm = cur_perm[pattern] + cur_perm = cur_perm or 'branch.none' + p = self._choose_permission(p, cur_perm) # NOTE(marcink): register all pattern/perm instances in this @@ -784,8 +803,7 @@ class PermissionCalculator(object): multiple_counter[r_k] += 1 if multiple_counter[r_k] > 1: - # TODO(marcink): fix this for multi branch support, and multiple entries - cur_perm = self.permissions_repository_branches[r_k] + cur_perm = self.permissions_repository_branches[r_k][pattern] p = self._choose_permission(p, cur_perm) self.permissions_repository_branches[r_k] = pattern, p, o @@ -803,8 +821,10 @@ class PermissionCalculator(object): o = PermOrigin.REPO_USER % perm.UserRepoToPerm.user.username if not self.explicit: - # TODO(marcink): fix this for multiple entries - cur_perm = self.permissions_repository_branches.get(r_k) or 'branch.none' + cur_perm = self.permissions_repository_branches.get(r_k) + if cur_perm: + cur_perm = cur_perm[pattern] + cur_perm = cur_perm or 'branch.none' p = self._choose_permission(p, cur_perm) # NOTE(marcink): register all pattern/perm instances in this @@ -858,8 +878,7 @@ class PermissionCalculator(object): p = perm.Permission.permission_name if not self.explicit: - cur_perm = self.permissions_repository_groups.get( - rg_k, 'group.none') + cur_perm = self.permissions_repository_groups.get(rg_k, 'group.none') p = self._choose_permission(p, cur_perm) self.permissions_repository_groups[rg_k] = p, o @@ -920,8 +939,7 @@ class PermissionCalculator(object): p = perm.Permission.permission_name if not self.explicit: - cur_perm = self.permissions_user_groups.get( - ug_k, 'usergroup.none') + cur_perm = self.permissions_user_groups.get(ug_k, 'usergroup.none') p = self._choose_permission(p, cur_perm) self.permissions_user_groups[ug_k] = p, o @@ -979,7 +997,7 @@ def allowed_auth_token_access(view_name, } log.debug( - 'Allowed views for AUTH TOKEN access: %s' % (whitelist,)) + 'Allowed views for AUTH TOKEN access: %s', whitelist) auth_token_access_valid = False for entry in whitelist: @@ -998,8 +1016,9 @@ def allowed_auth_token_access(view_name, break if auth_token_access_valid: - log.debug('view: `%s` matches entry in whitelist: %s' - % (view_name, whitelist)) + log.debug('view: `%s` matches entry in whitelist: %s', + view_name, whitelist) + else: msg = ('view: `%s` does *NOT* match any entry in whitelist: %s' % (view_name, whitelist)) @@ -1190,7 +1209,7 @@ class AuthUser(object): log.debug( 'Computing PERMISSION tree for user %s scope `%s` ' - 'with caching: %s[TTL: %ss]' % (user, scope, cache_on, cache_seconds or 0)) + 'with caching: %s[TTL: %ss]', user, scope, cache_on, cache_seconds or 0) cache_namespace_uid = 'cache_user_auth.{}'.format(user_id) region = rc_cache.get_or_create_region('cache_perms', cache_namespace_uid) @@ -1214,8 +1233,8 @@ class AuthUser(object): for k in result: result_repr.append((k, len(result[k]))) total = time.time() - start - log.debug('PERMISSION tree for user %s computed in %.3fs: %s' % ( - user, total, result_repr)) + log.debug('PERMISSION tree for user %s computed in %.3fs: %s', + user, total, result_repr) return result @@ -1352,12 +1371,12 @@ class AuthUser(object): allowed_ips = AuthUser.get_allowed_ips( user_id, cache=True, inherit_from_default=inherit_from_default) if check_ip_access(source_ip=ip_addr, allowed_ips=allowed_ips): - log.debug('IP:%s for user %s is in range of %s' % ( - ip_addr, user_id, allowed_ips)) + log.debug('IP:%s for user %s is in range of %s', + ip_addr, user_id, allowed_ips) return True else: log.info('Access for IP:%s forbidden for user %s, ' - 'not in %s' % (ip_addr, user_id, allowed_ips)) + 'not in %s', ip_addr, user_id, allowed_ips) return False def get_branch_permissions(self, repo_name, perms=None): @@ -1593,7 +1612,7 @@ class LoginRequired(object): _ = request.translate loc = "%s:%s" % (cls.__class__.__name__, func.__name__) - log.debug('Starting login restriction checks for user: %s' % (user,)) + log.debug('Starting login restriction checks for user: %s', user) # check if our IP is allowed ip_access_valid = True if not user.ip_allowed: @@ -1610,7 +1629,7 @@ class LoginRequired(object): # explicit controller is enabled or API is in our whitelist if self.auth_token_access or auth_token_access_valid: - log.debug('Checking AUTH TOKEN access for %s' % (cls,)) + log.debug('Checking AUTH TOKEN access for %s', cls) db_user = user.get_instance() if db_user: @@ -1626,36 +1645,33 @@ class LoginRequired(object): if _auth_token and token_match: auth_token_access_valid = True - log.debug('AUTH TOKEN ****%s is VALID' % (_auth_token[-4:],)) + log.debug('AUTH TOKEN ****%s is VALID', _auth_token[-4:]) else: auth_token_access_valid = False if not _auth_token: log.debug("AUTH TOKEN *NOT* present in request") else: - log.warning( - "AUTH TOKEN ****%s *NOT* valid" % _auth_token[-4:]) - - log.debug('Checking if %s is authenticated @ %s' % (user.username, loc)) + log.warning("AUTH TOKEN ****%s *NOT* valid", _auth_token[-4:]) + + log.debug('Checking if %s is authenticated @ %s', user.username, loc) reason = 'RHODECODE_AUTH' if user.is_authenticated \ else 'AUTH_TOKEN_AUTH' if ip_access_valid and ( user.is_authenticated or auth_token_access_valid): - log.info( - 'user %s authenticating with:%s IS authenticated on func %s' - % (user, reason, loc)) + log.info('user %s authenticating with:%s IS authenticated on func %s', + user, reason, loc) return func(*fargs, **fkwargs) else: log.warning( 'user %s authenticating with:%s NOT authenticated on ' - 'func: %s: IP_ACCESS:%s AUTH_TOKEN_ACCESS:%s' - % (user, reason, loc, ip_access_valid, - auth_token_access_valid)) + 'func: %s: IP_ACCESS:%s AUTH_TOKEN_ACCESS:%s', + user, reason, loc, ip_access_valid, auth_token_access_valid) # we preserve the get PARAM came_from = get_came_from(request) - log.debug('redirecting to login page with %s' % (came_from,)) + log.debug('redirecting to login page with %s', came_from) raise HTTPFound( h.route_path('login', _query={'came_from': came_from})) @@ -1678,7 +1694,7 @@ class NotAnonymous(object): self.user = cls._rhodecode_user request = self._get_request() _ = request.translate - log.debug('Checking if user is not anonymous @%s' % cls) + log.debug('Checking if user is not anonymous @%s', cls) anonymous = self.user.username == User.DEFAULT_USER @@ -1939,7 +1955,7 @@ class PermsFunction(object): frame = inspect.currentframe() stack_trace = traceback.format_stack(frame) log.error('Checking bool value on a class instance of perm ' - 'function is not allowed: %s' % ''.join(stack_trace)) + 'function is not allowed: %s', ''.join(stack_trace)) # rather than throwing errors, here we always return False so if by # accident someone checks truth for just an instance it will always end # up in returning False @@ -2182,9 +2198,8 @@ class _BaseApiPerm(object): if user_group_name: check_scope += ', user_group_name:%s' % (user_group_name,) - log.debug( - 'checking cls:%s %s %s @ %s' - % (cls_name, self.required_perms, check_scope, check_location)) + log.debug('checking cls:%s %s %s @ %s', + cls_name, self.required_perms, check_scope, check_location) if not user: log.debug('Empty User passed into arguments') return False @@ -2305,7 +2320,7 @@ def check_ip_access(source_ip, allowed_i :param source_ip: :param allowed_ips: list of allowed ips together with mask """ - log.debug('checking if ip:%s is subnet of %s' % (source_ip, allowed_ips)) + log.debug('checking if ip:%s is subnet of %s', source_ip, allowed_ips) source_ip_address = ipaddress.ip_address(safe_unicode(source_ip)) if isinstance(allowed_ips, (tuple, list, set)): for ip in allowed_ips: @@ -2313,8 +2328,7 @@ def check_ip_access(source_ip, allowed_i try: network_address = ipaddress.ip_network(ip, strict=False) if source_ip_address in network_address: - log.debug('IP %s is network %s' % - (source_ip_address, network_address)) + log.debug('IP %s is network %s', source_ip_address, network_address) return True # for any case we cannot determine the IP, don't crash just # skip it and log as error, we want to say forbidden still when diff --git a/rhodecode/lib/base.py b/rhodecode/lib/base.py --- a/rhodecode/lib/base.py +++ b/rhodecode/lib/base.py @@ -180,7 +180,12 @@ def vcs_operation_context( ui_settings = settings_model.get_ui_settings() # NOTE(marcink): This should be also in sync with - # rhodecode/apps/ssh_support/lib/backends/base.py:update_enviroment scm_data + # rhodecode/apps/ssh_support/lib/backends/base.py:update_environment scm_data + store = [x for x in ui_settings if x.key == '/'] + repo_store = '' + if store: + repo_store = store[0].value + scm_data = { 'ip': get_ip_addr(environ), 'username': username, @@ -189,6 +194,7 @@ def vcs_operation_context( 'repository': repo_name, 'scm': scm, 'config': rhodecode.CONFIG['__file__'], + 'repo_store': repo_store, 'make_lock': make_lock, 'locked_by': locked_by, 'server_url': utils2.get_server_url(environ), @@ -216,7 +222,7 @@ class BasicAuth(AuthBasicAuthenticator): try: return get_exception(safe_int(http_code)) except Exception: - log.exception('Failed to fetch response for code %s' % http_code) + log.exception('Failed to fetch response for code %s', http_code) return HTTPForbidden def get_rc_realm(self): @@ -357,6 +363,28 @@ def attach_context_attributes(context, r 'appenlight.api_public_key', '') context.appenlight_server_url = config.get('appenlight.server_url', '') + diffmode = { + "unified": "unified", + "sideside": "sideside" + }.get(request.GET.get('diffmode')) + + if diffmode and diffmode != request.session.get('rc_user_session_attr.diffmode'): + request.session['rc_user_session_attr.diffmode'] = diffmode + + # session settings per user + session_attrs = { + # defaults + "clone_url_format": "http", + "diffmode": "sideside" + } + for k, v in request.session.items(): + pref = 'rc_user_session_attr.' + if k and k.startswith(pref): + k = k[len(pref):] + session_attrs[k] = v + + context.user_session_attrs = session_attrs + # JS template context context.template_context = { 'repo_name': None, @@ -367,6 +395,7 @@ def attach_context_attributes(context, r 'email': None, 'notification_status': False }, + 'session_attrs': session_attrs, 'visual': { 'default_renderer': None }, @@ -385,18 +414,6 @@ def attach_context_attributes(context, r } # END CONFIG VARS - diffmode = 'sideside' - if request.GET.get('diffmode'): - if request.GET['diffmode'] == 'unified': - diffmode = 'unified' - elif request.session.get('diffmode'): - diffmode = request.session['diffmode'] - - context.diffmode = diffmode - - if request.session.get('diffmode') != diffmode: - request.session['diffmode'] = diffmode - context.csrf_token = auth.get_csrf_token(session=request.session) context.backends = rhodecode.BACKENDS.keys() context.backends.sort() diff --git a/rhodecode/lib/celerylib/tasks.py b/rhodecode/lib/celerylib/tasks.py --- a/rhodecode/lib/celerylib/tasks.py +++ b/rhodecode/lib/celerylib/tasks.py @@ -26,11 +26,13 @@ by celery daemon import os import time +from pyramid_mailer.mailer import Mailer +from pyramid_mailer.message import Message + import rhodecode from rhodecode.lib import audit_logger from rhodecode.lib.celerylib import get_logger, async_task, RequestContextTask from rhodecode.lib.hooks_base import log_create_repository -from rhodecode.lib.rcmail.smtp_mailer import SmtpMailer from rhodecode.lib.utils2 import safe_int, str2bool from rhodecode.model.db import Session, IntegrityError, Repository, User, true @@ -49,8 +51,20 @@ def send_email(recipients, subject, body log = get_logger(send_email) email_config = email_config or rhodecode.CONFIG + + mail_server = email_config.get('smtp_server') or None + if mail_server is None: + log.error("SMTP server information missing. Sending email failed. " + "Make sure that `smtp_server` variable is configured " + "inside the .ini file") + return False + subject = "%s %s" % (email_config.get('email_prefix', ''), subject) - if not recipients: + + if recipients: + if isinstance(recipients, basestring): + recipients = recipients.split(',') + else: # if recipients are not defined we send to email_config + all admins admins = [] for u in User.query().filter(User.admin == true()).all(): @@ -62,26 +76,44 @@ def send_email(recipients, subject, body recipients += [config_email] recipients += admins - mail_server = email_config.get('smtp_server') or None - if mail_server is None: - log.error("SMTP server information missing. Sending email failed. " - "Make sure that `smtp_server` variable is configured " - "inside the .ini file") - return False + # translate our LEGACY config into the one that pyramid_mailer supports + email_conf = dict( + host=mail_server, + port=email_config.get('smtp_port'), + username=email_config.get('smtp_username'), + password=email_config.get('smtp_password'), + + tls=str2bool(email_config.get('smtp_use_tls')), + ssl=str2bool(email_config.get('smtp_use_ssl')), + + # SSL key file + # keyfile='', - mail_from = email_config.get('app_email_from', 'RhodeCode') - user = email_config.get('smtp_username') - passwd = email_config.get('smtp_password') - mail_port = email_config.get('smtp_port') - tls = str2bool(email_config.get('smtp_use_tls')) - ssl = str2bool(email_config.get('smtp_use_ssl')) - debug = str2bool(email_config.get('debug')) - smtp_auth = email_config.get('smtp_auth') + # SSL certificate file + # certfile='', + + # Location of maildir + # queue_path='', + + default_sender=email_config.get('app_email_from', 'RhodeCode'), + + debug=str2bool(email_config.get('smtp_debug')), + # /usr/sbin/sendmail Sendmail executable + # sendmail_app='', + + # {sendmail_app} -t -i -f {sender} Template for sendmail execution + # sendmail_template='', + ) try: - m = SmtpMailer(mail_from, user, passwd, mail_server, smtp_auth, - mail_port, ssl, tls, debug=debug) - m.send(recipients, subject, body, html_body) + mailer = Mailer(**email_conf) + + message = Message(subject=subject, + sender=email_conf['default_sender'], + recipients=recipients, + body=body, html=html_body) + mailer.send_immediately(message) + except Exception: log.exception('Mail sending failed') return False @@ -122,7 +154,7 @@ def create_repo(form_data, cur_user): 'enable_downloads', defs.get('repo_enable_downloads')) try: - repo = RepoModel()._create_repo( + RepoModel()._create_repo( repo_name=repo_name_full, repo_type=repo_type, description=description, diff --git a/rhodecode/lib/channelstream.py b/rhodecode/lib/channelstream.py --- a/rhodecode/lib/channelstream.py +++ b/rhodecode/lib/channelstream.py @@ -53,23 +53,27 @@ class ChannelstreamPermissionException(C pass +def get_channelstream_server_url(config, endpoint): + return 'http://{}{}'.format(config['server'], endpoint) + + def channelstream_request(config, payload, endpoint, raise_exc=True): signer = itsdangerous.TimestampSigner(config['secret']) sig_for_server = signer.sign(endpoint) secret_headers = {'x-channelstream-secret': sig_for_server, 'x-channelstream-endpoint': endpoint, 'Content-Type': 'application/json'} - req_url = 'http://{}{}'.format(config['server'], endpoint) + req_url = get_channelstream_server_url(config, endpoint) response = None try: response = requests.post(req_url, data=json.dumps(payload), headers=secret_headers).json() except requests.ConnectionError: - log.exception('ConnectionError happened') + log.exception('ConnectionError occurred for endpoint %s', req_url) if raise_exc: - raise ChannelstreamConnectionException() + raise ChannelstreamConnectionException(req_url) except Exception: - log.exception('Exception related to channelstream happened') + log.exception('Exception related to Channelstream happened') if raise_exc: raise ChannelstreamConnectionException() return response diff --git a/rhodecode/lib/codeblocks.py b/rhodecode/lib/codeblocks.py --- a/rhodecode/lib/codeblocks.py +++ b/rhodecode/lib/codeblocks.py @@ -25,15 +25,16 @@ from itertools import groupby from pygments import lex from pygments.formatters.html import _get_ttype_class as pygment_token_class from pygments.lexers.special import TextLexer, Token +from pygments.lexers import get_lexer_by_name from rhodecode.lib.helpers import ( get_lexer_for_filenode, html_escape, get_custom_lexer) -from rhodecode.lib.utils2 import AttributeDict, StrictAttributeDict +from rhodecode.lib.utils2 import AttributeDict, StrictAttributeDict, safe_unicode from rhodecode.lib.vcs.nodes import FileNode from rhodecode.lib.vcs.exceptions import VCSError, NodeDoesNotExistError from rhodecode.lib.diff_match_patch import diff_match_patch -from rhodecode.lib.diffs import LimitedDiffContainer -from pygments.lexers import get_lexer_by_name +from rhodecode.lib.diffs import LimitedDiffContainer, DEL_FILENODE, BIN_FILENODE + plain_text_lexer = get_lexer_by_name( 'text', stripall=False, stripnl=False, ensurenl=False) @@ -306,7 +307,7 @@ def tokens_diff(old_tokens, new_tokens, if use_diff_match_patch: dmp = diff_match_patch() - dmp.Diff_EditCost = 11 # TODO: dan: extract this to a setting + dmp.Diff_EditCost = 11 # TODO: dan: extract this to a setting reps = dmp.diff_main(old_string, new_string) dmp.diff_cleanupEfficiency(reps) @@ -368,19 +369,19 @@ class DiffSet(object): adding highlighting, side by side/unified renderings and line diffs """ - HL_REAL = 'REAL' # highlights using original file, slow - HL_FAST = 'FAST' # highlights using just the line, fast but not correct - # in the case of multiline code - HL_NONE = 'NONE' # no highlighting, fastest + HL_REAL = 'REAL' # highlights using original file, slow + HL_FAST = 'FAST' # highlights using just the line, fast but not correct + # in the case of multiline code + HL_NONE = 'NONE' # no highlighting, fastest def __init__(self, highlight_mode=HL_REAL, repo_name=None, source_repo_name=None, source_node_getter=lambda filename: None, + target_repo_name=None, target_node_getter=lambda filename: None, source_nodes=None, target_nodes=None, - max_file_size_limit=150 * 1024, # files over this size will - # use fast highlighting - comments=None, + # files over this size will use fast highlighting + max_file_size_limit=150 * 1024, ): self.highlight_mode = highlight_mode @@ -390,9 +391,8 @@ class DiffSet(object): self.source_nodes = source_nodes or {} self.target_nodes = target_nodes or {} self.repo_name = repo_name + self.target_repo_name = target_repo_name or repo_name self.source_repo_name = source_repo_name or repo_name - self.comments = comments or {} - self.comments_store = self.comments.copy() self.max_file_size_limit = max_file_size_limit def render_patchset(self, patchset, source_ref=None, target_ref=None): @@ -404,6 +404,7 @@ class DiffSet(object): file_stats={}, limited_diff=isinstance(patchset, LimitedDiffContainer), repo_name=self.repo_name, + target_repo_name=self.target_repo_name, source_repo_name=self.source_repo_name, source_ref=source_ref, target_ref=target_ref, @@ -416,6 +417,7 @@ class DiffSet(object): target_ref=diffset.target_ref, repo_name=diffset.repo_name, source_repo_name=diffset.source_repo_name, + target_repo_name=diffset.target_repo_name, )) diffset.files.append(filediff) diffset.changed_files += 1 @@ -442,7 +444,7 @@ class DiffSet(object): return self._lexer_cache[filename] def render_patch(self, patch): - log.debug('rendering diff for %r' % patch['filename']) + log.debug('rendering diff for %r', patch['filename']) source_filename = patch['original_filename'] target_filename = patch['filename'] @@ -451,7 +453,10 @@ class DiffSet(object): target_lexer = plain_text_lexer if not patch['stats']['binary']: - if self.highlight_mode == self.HL_REAL: + node_hl_mode = self.HL_NONE if patch['chunks'] == [] else None + hl_mode = node_hl_mode or self.highlight_mode + + if hl_mode == self.HL_REAL: if (source_filename and patch['operation'] in ('D', 'M') and source_filename not in self.source_nodes): self.source_nodes[source_filename] = ( @@ -462,12 +467,19 @@ class DiffSet(object): self.target_nodes[target_filename] = ( self.target_node_getter(target_filename)) - elif self.highlight_mode == self.HL_FAST: + elif hl_mode == self.HL_FAST: source_lexer = self._get_lexer_for_filename(source_filename) target_lexer = self._get_lexer_for_filename(target_filename) source_file = self.source_nodes.get(source_filename, source_filename) target_file = self.target_nodes.get(target_filename, target_filename) + raw_id_uid = '' + if self.source_nodes.get(source_filename): + raw_id_uid = self.source_nodes[source_filename].commit.raw_id + + if not raw_id_uid and self.target_nodes.get(target_filename): + # in case this is a new file we only have it in target + raw_id_uid = self.target_nodes[target_filename].commit.raw_id source_filenode, target_filenode = None, None @@ -509,29 +521,43 @@ class DiffSet(object): 'target_mode': patch['stats']['new_mode'], 'limited_diff': isinstance(patch, LimitedDiffContainer), 'hunks': [], + 'hunk_ops': None, 'diffset': self, + 'raw_id': raw_id_uid, }) - for hunk in patch['chunks'][1:]: + file_chunks = patch['chunks'][1:] + for hunk in file_chunks: hunkbit = self.parse_hunk(hunk, source_file, target_file) hunkbit.source_file_path = source_file_path hunkbit.target_file_path = target_file_path filediff.hunks.append(hunkbit) - left_comments = {} - if source_file_path in self.comments_store: - for lineno, comments in self.comments_store[source_file_path].items(): - left_comments[lineno] = comments + # Simulate hunk on OPS type line which doesn't really contain any diff + # this allows commenting on those + if not file_chunks: + actions = [] + for op_id, op_text in filediff.patch['stats']['ops'].items(): + if op_id == DEL_FILENODE: + actions.append(u'file was removed') + elif op_id == BIN_FILENODE: + actions.append(u'binary diff hidden') + else: + actions.append(safe_unicode(op_text)) + action_line = u'NO CONTENT: ' + \ + u', '.join(actions) or u'UNDEFINED_ACTION' - if target_file_path in self.comments_store: - for lineno, comments in self.comments_store[target_file_path].items(): - left_comments[lineno] = comments + hunk_ops = {'source_length': 0, 'source_start': 0, + 'lines': [ + {'new_lineno': 0, 'old_lineno': 1, + 'action': 'unmod-no-hl', 'line': action_line} + ], + 'section_header': u'', 'target_start': 1, 'target_length': 1} - # left comments are one that we couldn't place in diff lines. - # could be outdated, or the diff changed and this line is no - # longer available - filediff.left_comments = left_comments - + hunkbit = self.parse_hunk(hunk_ops, source_file, target_file) + hunkbit.source_file_path = source_file_path + hunkbit.target_file_path = target_file_path + filediff.hunk_ops = hunkbit return filediff def parse_hunk(self, hunk, source_file, target_file): @@ -546,10 +572,10 @@ class DiffSet(object): before, after = [], [] for line in hunk['lines']: - - if line['action'] == 'unmod': + if line['action'] in ['unmod', 'unmod-no-hl']: + no_hl = line['action'] == 'unmod-no-hl' result.lines.extend( - self.parse_lines(before, after, source_file, target_file)) + self.parse_lines(before, after, source_file, target_file, no_hl=no_hl)) after.append(line) before.append(line) elif line['action'] == 'add': @@ -561,14 +587,18 @@ class DiffSet(object): elif line['action'] == 'new-no-nl': after.append(line) + all_actions = [x['action'] for x in after] + [x['action'] for x in before] + no_hl = {x for x in all_actions} == {'unmod-no-hl'} result.lines.extend( - self.parse_lines(before, after, source_file, target_file)) + self.parse_lines(before, after, source_file, target_file, no_hl=no_hl)) + # NOTE(marcink): we must keep list() call here so we can cache the result... result.unified = list(self.as_unified(result.lines)) result.sideside = result.lines return result - def parse_lines(self, before_lines, after_lines, source_file, target_file): + def parse_lines(self, before_lines, after_lines, source_file, target_file, + no_hl=False): # TODO: dan: investigate doing the diff comparison and fast highlighting # on the entire before and after buffered block lines rather than by # line, this means we can get better 'fast' highlighting if the context @@ -612,9 +642,8 @@ class DiffSet(object): before_tokens = [('nonl', before['line'])] else: before_tokens = self.get_line_tokens( - line_text=before['line'], - line_number=before['old_lineno'], - file=source_file) + line_text=before['line'], line_number=before['old_lineno'], + input_file=source_file, no_hl=no_hl) original.lineno = before['old_lineno'] original.content = before['line'] original.action = self.action_to_op(before['action']) @@ -628,13 +657,12 @@ class DiffSet(object): else: after_tokens = self.get_line_tokens( line_text=after['line'], line_number=after['new_lineno'], - file=target_file) + input_file=target_file, no_hl=no_hl) modified.lineno = after['new_lineno'] modified.content = after['line'] modified.action = self.action_to_op(after['action']) - modified.get_comment_args = ( - target_file, 'n', after['new_lineno']) + modified.get_comment_args = (target_file, 'n', after['new_lineno']) # diff the lines if before_tokens and after_tokens: @@ -663,24 +691,25 @@ class DiffSet(object): return lines - def get_line_tokens(self, line_text, line_number, file=None): + def get_line_tokens(self, line_text, line_number, input_file=None, no_hl=False): filenode = None filename = None - if isinstance(file, basestring): - filename = file - elif isinstance(file, FileNode): - filenode = file - filename = file.unicode_path + if isinstance(input_file, basestring): + filename = input_file + elif isinstance(input_file, FileNode): + filenode = input_file + filename = input_file.unicode_path - if self.highlight_mode == self.HL_REAL and filenode: + hl_mode = self.HL_NONE if no_hl else self.highlight_mode + if hl_mode == self.HL_REAL and filenode: lexer = self._get_lexer_for_filename(filename) - file_size_allowed = file.size < self.max_file_size_limit + file_size_allowed = input_file.size < self.max_file_size_limit if line_number and file_size_allowed: return self.get_tokenized_filenode_line( - file, line_number, lexer) + input_file, line_number, lexer) - if self.highlight_mode in (self.HL_REAL, self.HL_FAST) and filename: + if hl_mode in (self.HL_REAL, self.HL_FAST) and filename: lexer = self._get_lexer_for_filename(filename) return list(tokenize_string(line_text, lexer)) @@ -698,6 +727,7 @@ class DiffSet(object): 'add': '+', 'del': '-', 'unmod': ' ', + 'unmod-no-hl': ' ', 'old-no-nl': ' ', 'new-no-nl': ' ', }.get(action, action) diff --git a/rhodecode/lib/db_manage.py b/rhodecode/lib/db_manage.py --- a/rhodecode/lib/db_manage.py +++ b/rhodecode/lib/db_manage.py @@ -107,7 +107,7 @@ class DbManage(object): checkfirst = not override Base.metadata.create_all(checkfirst=checkfirst) - log.info('Created tables for %s' % self.dbname) + log.info('Created tables for %s', self.dbname) def set_db_version(self): ver = DbMigrateVersion() @@ -115,7 +115,7 @@ class DbManage(object): ver.repository_id = 'rhodecode_db_migrations' ver.repository_path = 'versions' self.sa.add(ver) - log.info('db version set to: %s' % __dbversion__) + log.info('db version set to: %s', __dbversion__) def run_pre_migration_tasks(self): """ @@ -138,7 +138,7 @@ class DbManage(object): DatabaseNotControlledError if 'sqlite' in self.dburi: - print ( + print( '********************** WARNING **********************\n' 'Make sure your version of sqlite is at least 3.7.X. \n' 'Earlier versions are known to fail on some migrations\n' @@ -402,7 +402,7 @@ class DbManage(object): ('auth_rhodecode_enabled', 'True', 'bool')]: if (skip_existing and SettingsModel().get_setting_by_name(k) is not None): - log.debug('Skipping option %s' % k) + log.debug('Skipping option %s', k) continue setting = RhodeCodeSetting(k, v, t) self.sa.add(setting) @@ -419,7 +419,7 @@ class DbManage(object): if (skip_existing and SettingsModel().get_setting_by_name(k) is not None): - log.debug('Skipping option %s' % k) + log.debug('Skipping option %s', k) continue setting = RhodeCodeSetting(k, v, t) self.sa.add(setting) @@ -436,7 +436,7 @@ class DbManage(object): .scalar() if default is None: - log.debug('missing default permission for group %s adding' % g) + log.debug('missing default permission for group %s adding', g) perm_obj = RepoGroupModel()._create_default_perms(g) self.sa.add(perm_obj) @@ -484,20 +484,20 @@ class DbManage(object): # check proper dir if not os.path.isdir(path): path_ok = False - log.error('Given path %s is not a valid directory' % (path,)) + log.error('Given path %s is not a valid directory', path) elif not os.path.isabs(path): path_ok = False - log.error('Given path %s is not an absolute path' % (path,)) + log.error('Given path %s is not an absolute path', path) # check if path is at least readable. if not os.access(path, os.R_OK): path_ok = False - log.error('Given path %s is not readable' % (path,)) + log.error('Given path %s is not readable', path) # check write access, warn user about non writeable paths elif not os.access(path, os.W_OK) and path_ok: - log.warning('No write permission to given path %s' % (path,)) + log.warning('No write permission to given path %s', path) q = ('Given path %s is not writeable, do you want to ' 'continue with read only mode ? [y/n]' % (path,)) @@ -573,7 +573,7 @@ class DbManage(object): def create_user(self, username, password, email='', admin=False, strict_creation_check=True, api_key=None): - log.info('creating user `%s`' % username) + log.info('creating user `%s`', username) user = UserModel().create_or_update( username, password, email, firstname=u'RhodeCode', lastname=u'Admin', active=True, admin=admin, extern_type="rhodecode", diff --git a/rhodecode/lib/dbmigrate/migrate/versioning/migrate_repository.py b/rhodecode/lib/dbmigrate/migrate/versioning/migrate_repository.py --- a/rhodecode/lib/dbmigrate/migrate/versioning/migrate_repository.py +++ b/rhodecode/lib/dbmigrate/migrate/versioning/migrate_repository.py @@ -13,25 +13,25 @@ log = logging.getLogger(__name__) def usage(): """Gives usage information.""" - print """Usage: %(prog)s repository-to-migrate + print("""Usage: %(prog)s repository-to-migrate Upgrade your repository to the new flat format. NOTE: You should probably make a backup before running this. - """ % {'prog': sys.argv[0]} + """ % {'prog': sys.argv[0]}) sys.exit(1) def delete_file(filepath): """Deletes a file and prints a message.""" - log.info('Deleting file: %s' % filepath) + log.info('Deleting file: %s', filepath) os.remove(filepath) def move_file(src, tgt): """Moves a file and prints a message.""" - log.info('Moving file %s to %s' % (src, tgt)) + log.info('Moving file %s to %s', src, tgt) if os.path.exists(tgt): raise Exception( 'Cannot move file %s because target %s already exists' % \ @@ -41,13 +41,13 @@ def move_file(src, tgt): def delete_directory(dirpath): """Delete a directory and print a message.""" - log.info('Deleting directory: %s' % dirpath) + log.info('Deleting directory: %s', dirpath) os.rmdir(dirpath) def migrate_repository(repos): """Does the actual migration to the new repository format.""" - log.info('Migrating repository at: %s to new format' % repos) + log.info('Migrating repository at: %s to new format', repos) versions = '%s/versions' % repos dirs = os.listdir(versions) # Only use int's in list. @@ -55,7 +55,7 @@ def migrate_repository(repos): numdirs.sort() # Sort list. for dirname in numdirs: origdir = '%s/%s' % (versions, dirname) - log.info('Working on directory: %s' % origdir) + log.info('Working on directory: %s', origdir) files = os.listdir(origdir) files.sort() for filename in files: diff --git a/rhodecode/lib/dbmigrate/migrate/versioning/pathed.py b/rhodecode/lib/dbmigrate/migrate/versioning/pathed.py --- a/rhodecode/lib/dbmigrate/migrate/versioning/pathed.py +++ b/rhodecode/lib/dbmigrate/migrate/versioning/pathed.py @@ -35,7 +35,7 @@ class Pathed(KeyedInstance): """Try to initialize this object's parent, if it has one""" parent_path = self.__class__._parent_path(path) self.parent = self.__class__.parent(parent_path) - log.debug("Getting parent %r:%r" % (self.__class__.parent, parent_path)) + log.debug("Getting parent %r:%r", self.__class__.parent, parent_path) self.parent._init_child(path, self) def _init_child(self, child, path): diff --git a/rhodecode/lib/dbmigrate/migrate/versioning/repository.py b/rhodecode/lib/dbmigrate/migrate/versioning/repository.py --- a/rhodecode/lib/dbmigrate/migrate/versioning/repository.py +++ b/rhodecode/lib/dbmigrate/migrate/versioning/repository.py @@ -73,14 +73,14 @@ class Repository(pathed.Pathed): _versions = 'versions' def __init__(self, path): - log.debug('Loading repository %s...' % path) + log.debug('Loading repository %s...', path) self.verify(path) super(Repository, self).__init__(path) self.config = cfgparse.Config(os.path.join(self.path, self._config)) self.versions = version.Collection(os.path.join(self.path, self._versions)) - log.debug('Repository %s loaded successfully' % path) - log.debug('Config: %r' % self.config.to_dict()) + log.debug('Repository %s loaded successfully', path) + log.debug('Config: %r', self.config.to_dict()) @classmethod def verify(cls, path): diff --git a/rhodecode/lib/dbmigrate/migrate/versioning/script/base.py b/rhodecode/lib/dbmigrate/migrate/versioning/script/base.py --- a/rhodecode/lib/dbmigrate/migrate/versioning/script/base.py +++ b/rhodecode/lib/dbmigrate/migrate/versioning/script/base.py @@ -24,10 +24,10 @@ class BaseScript(pathed.Pathed): """ # TODO: sphinxfy this and implement it correctly def __init__(self, path): - log.debug('Loading script %s...' % path) + log.debug('Loading script %s...', path) self.verify(path) super(BaseScript, self).__init__(path) - log.debug('Script %s loaded successfully' % path) + log.debug('Script %s loaded successfully', path) @classmethod def verify(cls, path): diff --git a/rhodecode/lib/dbmigrate/schema/db_1_2_0.py b/rhodecode/lib/dbmigrate/schema/db_1_2_0.py --- a/rhodecode/lib/dbmigrate/schema/db_1_2_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_1_2_0.py @@ -311,7 +311,7 @@ class User(Base, BaseModel): self.last_login = datetime.datetime.now() Session.add(self) Session.commit() - log.debug('updated user %s lastlogin' % self.username) + log.debug('updated user %s lastlogin', self.username) @classmethod def create(cls, form_data): @@ -656,7 +656,7 @@ class Repository(Base, BaseModel): try: alias = get_scm(repo_full_path)[0] - log.debug('Creating instance of %s repository' % alias) + log.debug('Creating instance of %s repository', alias) backend = get_backend(alias) except VCSError: log.error(traceback.format_exc()) @@ -731,7 +731,7 @@ class Group(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error('group nested more than %s' % + log.error('group nested more than %s', parents_recursion_limit) break @@ -1006,7 +1006,7 @@ class CacheInvalidation(Base, BaseModel) :param key: """ - log.debug('marking %s for invalidation' % key) + log.debug('marking %s for invalidation', key) inv_obj = Session.query(cls)\ .filter(cls.cache_key == key).scalar() if inv_obj: diff --git a/rhodecode/lib/dbmigrate/schema/db_1_3_0.py b/rhodecode/lib/dbmigrate/schema/db_1_3_0.py --- a/rhodecode/lib/dbmigrate/schema/db_1_3_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_1_3_0.py @@ -379,7 +379,7 @@ class User(Base, BaseModel): """Update user lastlogin""" self.last_login = datetime.datetime.now() Session.add(self) - log.debug('updated user %s lastlogin' % self.username) + log.debug('updated user %s lastlogin', self.username) def __json__(self): return dict( @@ -676,7 +676,7 @@ class Repository(Base, BaseModel): repo_full_path = self.repo_full_path try: alias = get_scm(repo_full_path)[0] - log.debug('Creating instance of %s repository' % alias) + log.debug('Creating instance of %s repository', alias) backend = get_backend(alias) except VCSError: log.error(traceback.format_exc()) @@ -760,8 +760,7 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error('group nested more than %s' % - parents_recursion_limit) + log.error('group nested more than %s', parents_recursion_limit) break groups.insert(0, gr) @@ -1095,8 +1094,7 @@ class CacheInvalidation(Base, BaseModel) key, _prefix, _org_key = cls._get_key(key) inv_objs = Session.query(cls).filter(cls.cache_args == _org_key).all() - log.debug('marking %s key[s] %s for invalidation' % (len(inv_objs), - _org_key)) + log.debug('marking %s key[s] %s for invalidation', len(inv_objs), _org_key) try: for inv_obj in inv_objs: if inv_obj: diff --git a/rhodecode/lib/dbmigrate/schema/db_1_6_0.py b/rhodecode/lib/dbmigrate/schema/db_1_6_0.py --- a/rhodecode/lib/dbmigrate/schema/db_1_6_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_1_6_0.py @@ -614,15 +614,13 @@ class Repository(Base, BaseModel): if (cs_cache != self.changeset_cache or not self.changeset_cache): _default = datetime.datetime.fromtimestamp(0) last_change = cs_cache.get('date') or _default - log.debug('updated repo %s with new cs cache %s' - % (self.repo_name, cs_cache)) + log.debug('updated repo %s with new cs cache %s', self.repo_name, cs_cache) self.updated_on = last_change self.changeset_cache = cs_cache Session().add(self) Session().commit() else: - log.debug('Skipping repo:%s already with latest changes' - % self.repo_name) + log.debug('Skipping repo:%s already with latest changes', self.repo_name) class RepoGroup(Base, BaseModel): __tablename__ = 'groups' diff --git a/rhodecode/lib/dbmigrate/schema/db_4_11_0_0.py b/rhodecode/lib/dbmigrate/schema/db_4_11_0_0.py --- a/rhodecode/lib/dbmigrate/schema/db_4_11_0_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_4_11_0_0.py @@ -2415,8 +2415,8 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error(('more than %s parents found for group %s, stopping ' - 'recursive parent fetching' % (parents_recursion_limit, self))) + log.error('more than %s parents found for group %s, stopping ' + 'recursive parent fetching', parents_recursion_limit, self) break groups.insert(0, gr) diff --git a/rhodecode/lib/dbmigrate/schema/db_4_13_0_0.py b/rhodecode/lib/dbmigrate/schema/db_4_13_0_0.py --- a/rhodecode/lib/dbmigrate/schema/db_4_13_0_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_4_13_0_0.py @@ -2481,8 +2481,8 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error(('more than %s parents found for group %s, stopping ' - 'recursive parent fetching' % (parents_recursion_limit, self))) + log.error('more than %s parents found for group %s, stopping ' + 'recursive parent fetching', parents_recursion_limit, self) break groups.insert(0, gr) diff --git a/rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py b/rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py --- a/rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_4_3_0_0.py @@ -2108,8 +2108,8 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error(('more than %s parents found for group %s, stopping ' - 'recursive parent fetching' % (parents_recursion_limit, self))) + log.error('more than %s parents found for group %s, stopping ' + 'recursive parent fetching', parents_recursion_limit, self) break groups.insert(0, gr) diff --git a/rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py b/rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py --- a/rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_4_4_0_0.py @@ -2100,8 +2100,8 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error(('more than %s parents found for group %s, stopping ' - 'recursive parent fetching' % (parents_recursion_limit, self))) + log.error('more than %s parents found for group %s, stopping ' + 'recursive parent fetching', parents_recursion_limit, self) break groups.insert(0, gr) diff --git a/rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py b/rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py --- a/rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py +++ b/rhodecode/lib/dbmigrate/schema/db_4_4_0_1.py @@ -2100,8 +2100,8 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error(('more than %s parents found for group %s, stopping ' - 'recursive parent fetching' % (parents_recursion_limit, self))) + log.error('more than %s parents found for group %s, stopping ' + 'recursive parent fetching', parents_recursion_limit, self) break groups.insert(0, gr) diff --git a/rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py b/rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py --- a/rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py +++ b/rhodecode/lib/dbmigrate/schema/db_4_4_0_2.py @@ -2104,8 +2104,8 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error(('more than %s parents found for group %s, stopping ' - 'recursive parent fetching' % (parents_recursion_limit, self))) + log.error('more than %s parents found for group %s, stopping ' + 'recursive parent fetching', parents_recursion_limit, self) break groups.insert(0, gr) diff --git a/rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py b/rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py --- a/rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_4_5_0_0.py @@ -2104,8 +2104,8 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error(('more than %s parents found for group %s, stopping ' - 'recursive parent fetching' % (parents_recursion_limit, self))) + log.error('more than %s parents found for group %s, stopping ' + 'recursive parent fetching', parents_recursion_limit, self) break groups.insert(0, gr) diff --git a/rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py b/rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py --- a/rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py @@ -2154,8 +2154,8 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error(('more than %s parents found for group %s, stopping ' - 'recursive parent fetching' % (parents_recursion_limit, self))) + log.error('more than %s parents found for group %s, stopping ' + 'recursive parent fetching', parents_recursion_limit, self) break groups.insert(0, gr) diff --git a/rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py b/rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py --- a/rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py +++ b/rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py @@ -2155,8 +2155,8 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error(('more than %s parents found for group %s, stopping ' - 'recursive parent fetching' % (parents_recursion_limit, self))) + log.error('more than %s parents found for group %s, stopping ' + 'recursive parent fetching', parents_recursion_limit, self) break groups.insert(0, gr) diff --git a/rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py b/rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py --- a/rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py @@ -2352,8 +2352,8 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error(('more than %s parents found for group %s, stopping ' - 'recursive parent fetching' % (parents_recursion_limit, self))) + log.error('more than %s parents found for group %s, stopping ' + 'recursive parent fetching', parents_recursion_limit, self) break groups.insert(0, gr) diff --git a/rhodecode/lib/dbmigrate/versions/001_initial_release.py b/rhodecode/lib/dbmigrate/versions/001_initial_release.py --- a/rhodecode/lib/dbmigrate/versions/001_initial_release.py +++ b/rhodecode/lib/dbmigrate/versions/001_initial_release.py @@ -74,7 +74,7 @@ class User(Base): self.last_login = datetime.datetime.now() session.add(self) session.commit() - log.debug('updated user %s lastlogin' % self.username) + log.debug('updated user %s lastlogin', self.username) except (DatabaseError,): session.rollback() diff --git a/rhodecode/lib/dbmigrate/versions/005_version_1_3_0.py b/rhodecode/lib/dbmigrate/versions/005_version_1_3_0.py --- a/rhodecode/lib/dbmigrate/versions/005_version_1_3_0.py +++ b/rhodecode/lib/dbmigrate/versions/005_version_1_3_0.py @@ -33,7 +33,7 @@ def upgrade(migrate_engine): old_cons = UniqueConstraint('user_id', 'repository_id', table=tbl) else: # sqlite doesn't support dropping constraints... - print """Please manually drop UniqueConstraint('user_id', 'repository_id')""" + print("""Please manually drop UniqueConstraint('user_id', 'repository_id')""") if old_cons: try: @@ -41,7 +41,7 @@ def upgrade(migrate_engine): except Exception as e: # we don't care if this fails really... better to pass migration than # leave this in intermidiate state - print 'Failed to remove Unique for user_id, repository_id reason %s' % e + print('Failed to remove Unique for user_id, repository_id reason %s' % e) #========================================================================== @@ -61,7 +61,7 @@ def upgrade(migrate_engine): old_cons = UniqueConstraint('group_id', 'permission_id', table=tbl, name='group_to_perm_group_id_permission_id_key') else: # sqlite doesn't support dropping constraints... - print """Please manually drop UniqueConstraint('group_id', 'permission_id')""" + print("""Please manually drop UniqueConstraint('group_id', 'permission_id')""") if old_cons: try: @@ -69,7 +69,7 @@ def upgrade(migrate_engine): except Exception as e: # we don't care if this fails really... better to pass migration than # leave this in intermidiate state - print 'Failed to remove Unique for user_id, repository_id reason %s' % e + print('Failed to remove Unique for user_id, repository_id reason %s' % e) return diff --git a/rhodecode/lib/dbmigrate/versions/008_version_1_5_0.py b/rhodecode/lib/dbmigrate/versions/008_version_1_5_0.py --- a/rhodecode/lib/dbmigrate/versions/008_version_1_5_0.py +++ b/rhodecode/lib/dbmigrate/versions/008_version_1_5_0.py @@ -80,7 +80,7 @@ def fixups(models, _SESSION): new_perm = models.Permission() new_perm.permission_name = p[0] new_perm.permission_longname = p[0] #translation err with p[1] - print 'Creating new permission %s' % p[0] + print('Creating new permission %s' % p[0]) _SESSION().add(new_perm) _SESSION().commit() @@ -102,7 +102,7 @@ def fixups(models, _SESSION): perms = models.UserToPerm.query().filter(models.UserToPerm.user == user).all() defined_perms_groups = map( _get_group, (x.permission.permission_name for x in perms)) - log.debug('GOT ALREADY DEFINED:%s' % perms) + log.debug('GOT ALREADY DEFINED:%s', perms) DEFAULT_PERMS = models.Permission.DEFAULT_USER_PERMISSIONS # for every default permission that needs to be created, we check if @@ -110,8 +110,7 @@ def fixups(models, _SESSION): for perm_name in DEFAULT_PERMS: gr = _get_group(perm_name) if gr not in defined_perms_groups: - log.debug('GR:%s not found, creating permission %s' - % (gr, perm_name)) + log.debug('GR:%s not found, creating permission %s', gr, perm_name) new_perm = _make_perm(perm_name) _SESSION().add(new_perm) _SESSION().commit() @@ -127,7 +126,7 @@ def fixups(models, _SESSION): ('default_repo_type', 'hg')]: if skip_existing and get_by_name(models.RhodeCodeSetting, k) is not None: - log.debug('Skipping option %s' % k) + log.debug('Skipping option %s', k) continue setting = models.RhodeCodeSetting(k, v) _SESSION().add(setting) diff --git a/rhodecode/lib/dbmigrate/versions/011_version_1_6_0.py b/rhodecode/lib/dbmigrate/versions/011_version_1_6_0.py --- a/rhodecode/lib/dbmigrate/versions/011_version_1_6_0.py +++ b/rhodecode/lib/dbmigrate/versions/011_version_1_6_0.py @@ -44,6 +44,6 @@ def fixups(models, _SESSION): notify('Upgrading repositories Caches') repositories = models.Repository.getAll() for repo in repositories: - print repo + print(repo) repo.update_commit_cache() _SESSION().commit() diff --git a/rhodecode/lib/dbmigrate/versions/012_version_1_7_0.py b/rhodecode/lib/dbmigrate/versions/012_version_1_7_0.py --- a/rhodecode/lib/dbmigrate/versions/012_version_1_7_0.py +++ b/rhodecode/lib/dbmigrate/versions/012_version_1_7_0.py @@ -99,7 +99,7 @@ def fixups(models, _SESSION): perms = models.UserToPerm.query().filter(models.UserToPerm.user == user).all() defined_perms_groups = map(_get_group, (x.permission.permission_name for x in perms)) - log.debug('GOT ALREADY DEFINED:%s' % perms) + log.debug('GOT ALREADY DEFINED:%s', perms) DEFAULT_PERMS = models.Permission.DEFAULT_USER_PERMISSIONS # for every default permission that needs to be created, we check if @@ -107,8 +107,7 @@ def fixups(models, _SESSION): for perm_name in DEFAULT_PERMS: gr = _get_group(perm_name) if gr not in defined_perms_groups: - log.debug('GR:%s not found, creating permission %s' - % (gr, perm_name)) + log.debug('GR:%s not found, creating permission %s', gr, perm_name) new_perm = _make_perm(perm_name) _SESSION().add(new_perm) _SESSION().commit() diff --git a/rhodecode/lib/dbmigrate/versions/021_version_2_0_2.py b/rhodecode/lib/dbmigrate/versions/021_version_2_0_2.py --- a/rhodecode/lib/dbmigrate/versions/021_version_2_0_2.py +++ b/rhodecode/lib/dbmigrate/versions/021_version_2_0_2.py @@ -73,7 +73,7 @@ def fixups(models, _SESSION): repo_store_path = get_repos_location(models.RhodeCodeUi) _store = os.path.join(repo_store_path, '.cache', 'largefiles') notify('Setting largefiles usercache') - print _store + print(_store) if not models.RhodeCodeUi.query().filter( models.RhodeCodeUi.ui_key == 'usercache').scalar(): diff --git a/rhodecode/lib/dbmigrate/versions/022_version_2_0_2.py b/rhodecode/lib/dbmigrate/versions/022_version_2_0_2.py --- a/rhodecode/lib/dbmigrate/versions/022_version_2_0_2.py +++ b/rhodecode/lib/dbmigrate/versions/022_version_2_0_2.py @@ -39,7 +39,7 @@ def fixups(models, _SESSION): notify('fixing new schema for landing_rev') for repo in models.Repository.get_all(): - print u'repo %s old landing rev is: %s' % (repo, repo.landing_rev) + print(u'repo %s old landing rev is: %s' % (repo, repo.landing_rev)) _rev = repo.landing_rev[1] _rev_type = 'rev' # default @@ -58,13 +58,13 @@ def fixups(models, _SESSION): elif _rev in known_bookmarks: _rev_type = 'book' except Exception as e: - print e - print 'continue...' + print(e) + print('continue...') #we don't want any error to break the process pass _new_landing_rev = '%s:%s' % (_rev_type, _rev) - print u'setting to %s' % _new_landing_rev + print(u'setting to %s' % _new_landing_rev) repo.landing_rev = _new_landing_rev _SESSION().add(repo) _SESSION().commit() diff --git a/rhodecode/lib/dbmigrate/versions/027_version_2_2_0.py b/rhodecode/lib/dbmigrate/versions/027_version_2_2_0.py --- a/rhodecode/lib/dbmigrate/versions/027_version_2_2_0.py +++ b/rhodecode/lib/dbmigrate/versions/027_version_2_2_0.py @@ -47,7 +47,7 @@ def fixups(models, _SESSION): new_perm = models.Permission() new_perm.permission_name = p[0] new_perm.permission_longname = p[0] #translation err with p[1] - print 'Creating new permission %s' % p[0] + print('Creating new permission %s' % p[0]) _SESSION().add(new_perm) _SESSION().commit() @@ -60,6 +60,6 @@ def fixups(models, _SESSION): new = models.UserToPerm() new.user = user new.permission = get_by_key(models.Permission, _def) - print 'Setting default to %s' % _def + print('Setting default to %s' % _def) _SESSION().add(new) _SESSION().commit() diff --git a/rhodecode/lib/dbmigrate/versions/036_version_2_3_0.py b/rhodecode/lib/dbmigrate/versions/036_version_2_3_0.py --- a/rhodecode/lib/dbmigrate/versions/036_version_2_3_0.py +++ b/rhodecode/lib/dbmigrate/versions/036_version_2_3_0.py @@ -38,7 +38,7 @@ def downgrade(migrate_engine): def fixups(models, _SESSION): notify('Setting default renderer to rst') for cs_comment in models.ChangesetComment.get_all(): - print 'comment_id %s renderer rst' % (cs_comment.comment_id) + print('comment_id %s renderer rst' % (cs_comment.comment_id)) cs_comment.renderer = 'rst' _SESSION().add(cs_comment) _SESSION().commit() diff --git a/rhodecode/lib/dbmigrate/versions/091_version_4_14_0.py b/rhodecode/lib/dbmigrate/versions/091_version_4_14_0.py new file mode 100644 --- /dev/null +++ b/rhodecode/lib/dbmigrate/versions/091_version_4_14_0.py @@ -0,0 +1,36 @@ +import logging + +from sqlalchemy import * + +from rhodecode.model import meta +from rhodecode.lib.dbmigrate.versions import _reset_base, notify + +log = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + """ + Upgrade operations go here. + Don't create your own engine; bind migrate_engine to your metadata + """ + _reset_base(migrate_engine) + from rhodecode.lib.dbmigrate.schema import db_4_13_0_0 as db + + repository_table = db.Repository.__table__ + + archived = Column('archived', Boolean(), nullable=True) + archived.create(table=repository_table) + + # issue fixups + fixups(db, meta.Session) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + +def fixups(models, _SESSION): + pass + + diff --git a/rhodecode/lib/diffs.py b/rhodecode/lib/diffs.py --- a/rhodecode/lib/diffs.py +++ b/rhodecode/lib/diffs.py @@ -41,7 +41,16 @@ log = logging.getLogger(__name__) # define max context, a file with more than this numbers of lines is unusable # in browser anyway -MAX_CONTEXT = 1024 * 1014 +MAX_CONTEXT = 20 * 1024 +DEFAULT_CONTEXT = 3 + + +def get_diff_context(request): + return MAX_CONTEXT if request.GET.get('fullcontext', '') == '1' else DEFAULT_CONTEXT + + +def get_diff_whitespace_flag(request): + return request.GET.get('ignorews', '') == '1' class OPS(object): @@ -446,7 +455,7 @@ class DiffProcessor(object): for chunk in self._diff.chunks(): head = chunk.header - log.debug('parsing diff %r' % head) + log.debug('parsing diff %r', head) raw_diff = chunk.raw limited_diff = False @@ -1134,10 +1143,23 @@ class DiffLimitExceeded(Exception): pass +# NOTE(marcink): if diffs.mako change, probably this +# needs a bump to next version +CURRENT_DIFF_VERSION = 'v4' + + +def _cleanup_cache_file(cached_diff_file): + # cleanup file to not store it "damaged" + try: + os.remove(cached_diff_file) + except Exception: + log.exception('Failed to cleanup path %s', cached_diff_file) + + def cache_diff(cached_diff_file, diff, commits): struct = { - 'version': 'v1', + 'version': CURRENT_DIFF_VERSION, 'diff': diff, 'commits': commits } @@ -1148,17 +1170,13 @@ def cache_diff(cached_diff_file, diff, c log.debug('Saved diff cache under %s', cached_diff_file) except Exception: log.warn('Failed to save cache', exc_info=True) - # cleanup file to not store it "damaged" - try: - os.remove(cached_diff_file) - except Exception: - log.exception('Failed to cleanup path %s', cached_diff_file) + _cleanup_cache_file(cached_diff_file) def load_cached_diff(cached_diff_file): default_struct = { - 'version': 'v1', + 'version': CURRENT_DIFF_VERSION, 'diff': None, 'commits': None } @@ -1182,6 +1200,12 @@ def load_cached_diff(cached_diff_file): # old version of data ? data = default_struct + # check version + if data.get('version') != CURRENT_DIFF_VERSION: + # purge cache + _cleanup_cache_file(cached_diff_file) + return default_struct + return data diff --git a/rhodecode/lib/exceptions.py b/rhodecode/lib/exceptions.py --- a/rhodecode/lib/exceptions.py +++ b/rhodecode/lib/exceptions.py @@ -70,6 +70,10 @@ class AttachedForksError(Exception): pass +class AttachedPullRequestsError(Exception): + pass + + class RepoGroupAssignmentError(Exception): pass diff --git a/rhodecode/lib/fakemod.py b/rhodecode/lib/fakemod.py deleted file mode 100644 --- a/rhodecode/lib/fakemod.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (C) 2010-2018 RhodeCode GmbH -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License, version 3 -# (only), as published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -# This program is dual-licensed. If you wish to learn more about the -# RhodeCode Enterprise Edition, including its added features, Support services, -# and proprietary license terms, please see https://rhodecode.com/licenses/ - -import imp - - -def create_module(name, path): - """ - Returns module created *on the fly*. Returned module would have name same - as given ``name`` and would contain code read from file at the given - ``path`` (it may also be a zip or package containing *__main__* module). - """ - module = imp.new_module(name) - module.__file__ = path - execfile(path, module.__dict__) - return module diff --git a/rhodecode/lib/helpers.py b/rhodecode/lib/helpers.py --- a/rhodecode/lib/helpers.py +++ b/rhodecode/lib/helpers.py @@ -1249,15 +1249,18 @@ class InitialsGravatar(object): """ generates the svg metadata for image """ - - font_family = ','.join([ - 'proximanovaregular', - 'Proxima Nova Regular', - 'Proxima Nova', - 'Arial', - 'Lucida Grande', - 'sans-serif' - ]) + fonts = [ + '-apple-system', + 'BlinkMacSystemFont', + 'Segoe UI', + 'Roboto', + 'Oxygen-Sans', + 'Ubuntu', + 'Cantarell', + 'Helvetica Neue', + 'sans-serif' + ] + font_family = ','.join(fonts) if svg_type: return self.get_img_data_by_type(font_family, svg_type) @@ -1712,14 +1715,14 @@ def process_patterns(text_string, repo_n newtext = text_string for uid, entry in active_entries.items(): - log.debug('found issue tracker entry with uid %s' % (uid,)) + log.debug('found issue tracker entry with uid %s', uid) if not (entry['pat'] and entry['url']): log.debug('skipping due to missing data') continue - log.debug('issue tracker entry: uid: `%s` PAT:%s URL:%s PREFIX:%s' - % (uid, entry['pat'], entry['url'], entry['pref'])) + log.debug('issue tracker entry: uid: `%s` PAT:%s URL:%s PREFIX:%s', + uid, entry['pat'], entry['url'], entry['pref']) try: pattern = re.compile(r'%s' % entry['pat']) @@ -1741,7 +1744,7 @@ def process_patterns(text_string, repo_n link_format=link_format) newtext = pattern.sub(url_func, newtext) - log.debug('processed prefix:uid `%s`' % (uid,)) + log.debug('processed prefix:uid `%s`', uid) return newtext, issues_data diff --git a/rhodecode/lib/hooks_base.py b/rhodecode/lib/hooks_base.py --- a/rhodecode/lib/hooks_base.py +++ b/rhodecode/lib/hooks_base.py @@ -39,7 +39,21 @@ from rhodecode.model.db import Repositor log = logging.getLogger(__name__) -HookResponse = collections.namedtuple('HookResponse', ('status', 'output')) +class HookResponse(object): + def __init__(self, status, output): + self.status = status + self.output = output + + def __add__(self, other): + other_status = getattr(other, 'status', 0) + new_status = max(self.status, other_status) + other_output = getattr(other, 'output', '') + new_output = self.output + other_output + + return HookResponse(new_status, new_output) + + def __bool__(self): + return self.status == 0 def is_shadow_repo(extras): @@ -110,6 +124,7 @@ def pre_push(extras): else: raise _http_ret + hook_response = '' if not is_shadow_repo(extras): if extras.commit_ids and extras.check_branch_perms: @@ -152,11 +167,12 @@ def pre_push(extras): # Propagate to external components. This is done after checking the # lock, for consistent behavior. - pre_push_extension(repo_store_path=Repository.base_path(), **extras) + hook_response = pre_push_extension( + repo_store_path=Repository.base_path(), **extras) events.trigger(events.RepoPrePushEvent( repo_name=extras.repository, extras=extras)) - return HookResponse(0, output) + return HookResponse(0, output) + hook_response def pre_pull(extras): @@ -182,12 +198,15 @@ def pre_pull(extras): # Propagate to external components. This is done after checking the # lock, for consistent behavior. + hook_response = '' if not is_shadow_repo(extras): - pre_pull_extension(**extras) + extras.hook_type = extras.hook_type or 'pre_pull' + hook_response = pre_pull_extension( + repo_store_path=Repository.base_path(), **extras) events.trigger(events.RepoPrePullEvent( repo_name=extras.repository, extras=extras)) - return HookResponse(0, output) + return HookResponse(0, output) + hook_response def post_pull(extras): @@ -198,16 +217,9 @@ def post_pull(extras): ip_addr=extras.ip) repo = audit_logger.RepoWrap(repo_name=extras.repository) audit_logger.store( - 'user.pull', action_data={ - 'user_agent': extras.user_agent}, + 'user.pull', action_data={'user_agent': extras.user_agent}, user=audit_user, repo=repo, commit=True) - # Propagate to external components. - if not is_shadow_repo(extras): - post_pull_extension(**extras) - events.trigger(events.RepoPullEvent( - repo_name=extras.repository, extras=extras)) - output = '' # make lock is a tri state False, True, None. We only make lock on True if extras.make_lock is True and not is_shadow_repo(extras): @@ -227,7 +239,16 @@ def post_pull(extras): # 2xx Codes don't raise exceptions output += _http_ret.title - return HookResponse(0, output) + # Propagate to external components. + hook_response = '' + if not is_shadow_repo(extras): + extras.hook_type = extras.hook_type or 'post_pull' + hook_response = post_pull_extension( + repo_store_path=Repository.base_path(), **extras) + events.trigger(events.RepoPullEvent( + repo_name=extras.repository, extras=extras)) + + return HookResponse(0, output) + hook_response def post_push(extras): @@ -245,16 +266,6 @@ def post_push(extras): user=audit_user, repo=repo, commit=True) # Propagate to external components. - if not is_shadow_repo(extras): - post_push_extension( - repo_store_path=Repository.base_path(), - pushed_revs=commit_ids, - **extras) - events.trigger(events.RepoPushEvent( - repo_name=extras.repository, - pushed_commit_ids=commit_ids, - extras=extras)) - output = '' # make lock is a tri state False, True, None. We only release lock on False if extras.make_lock is False and not is_shadow_repo(extras): @@ -285,8 +296,16 @@ def post_push(extras): output += 'RhodeCode: open pull request link: {}\n'.format( tmpl.format(ref_type='bookmark', ref_name=book_name)) + hook_response = '' + if not is_shadow_repo(extras): + hook_response = post_push_extension( + repo_store_path=Repository.base_path(), + **extras) + events.trigger(events.RepoPushEvent( + repo_name=extras.repository, pushed_commit_ids=commit_ids, extras=extras)) + output += 'RhodeCode: push completed\n' - return HookResponse(0, output) + return HookResponse(0, output) + hook_response def _locked_by_explanation(repo_name, user_name, reason): @@ -299,8 +318,10 @@ def _locked_by_explanation(repo_name, us def check_allowed_create_user(user_dict, created_by, **kwargs): # pre create hooks if pre_create_user.is_active(): - allowed, reason = pre_create_user(created_by=created_by, **user_dict) + hook_result = pre_create_user(created_by=created_by, **user_dict) + allowed = hook_result.status == 0 if not allowed: + reason = hook_result.output raise UserCreationError(reason) @@ -319,8 +340,15 @@ class ExtensionCallback(object): def __call__(self, *args, **kwargs): log.debug('Calling extension callback for %s', self._hook_name) + kwargs_to_pass = {} + for key in self._kwargs_keys: + try: + kwargs_to_pass[key] = kwargs[key] + except KeyError: + log.error('Failed to fetch %s key. Expected keys: %s', + key, self._kwargs_keys) + raise - kwargs_to_pass = dict((key, kwargs[key]) for key in self._kwargs_keys) # backward compat for removed api_key for old hooks. THis was it works # with older rcextensions that require api_key present if self._hook_name in ['CREATE_USER_HOOK', 'DELETE_USER_HOOK']: @@ -343,28 +371,28 @@ pre_pull_extension = ExtensionCallback( hook_name='PRE_PULL_HOOK', kwargs_keys=( 'server_url', 'config', 'scm', 'username', 'ip', 'action', - 'repository')) + 'repository', 'hook_type', 'user_agent', 'repo_store_path',)) post_pull_extension = ExtensionCallback( hook_name='PULL_HOOK', kwargs_keys=( 'server_url', 'config', 'scm', 'username', 'ip', 'action', - 'repository')) + 'repository', 'hook_type', 'user_agent', 'repo_store_path',)) pre_push_extension = ExtensionCallback( hook_name='PRE_PUSH_HOOK', kwargs_keys=( 'server_url', 'config', 'scm', 'username', 'ip', 'action', - 'repository', 'repo_store_path', 'commit_ids')) + 'repository', 'repo_store_path', 'commit_ids', 'hook_type', 'user_agent',)) post_push_extension = ExtensionCallback( hook_name='PUSH_HOOK', kwargs_keys=( 'server_url', 'config', 'scm', 'username', 'ip', 'action', - 'repository', 'repo_store_path', 'pushed_revs')) + 'repository', 'repo_store_path', 'commit_ids', 'hook_type', 'user_agent',)) pre_create_user = ExtensionCallback( diff --git a/rhodecode/lib/hooks_daemon.py b/rhodecode/lib/hooks_daemon.py --- a/rhodecode/lib/hooks_daemon.py +++ b/rhodecode/lib/hooks_daemon.py @@ -245,7 +245,6 @@ def prepare_callback_daemon(extras, prot # register txn_id extras['txn_id'] = txn_id - log.debug('Prepared a callback daemon: %s at url `%s`', callback_daemon.__class__.__name__, callback_daemon.hooks_uri) return callback_daemon, extras @@ -292,6 +291,9 @@ class Hooks(object): try: result = hook(extras) + if result is None: + raise Exception( + 'Failed to obtain hook result from func: {}'.format(hook)) except HTTPBranchProtected as handled_error: # Those special cases doesn't need error reporting. It's a case of # locked repo or protected branch diff --git a/rhodecode/lib/hooks_utils.py b/rhodecode/lib/hooks_utils.py --- a/rhodecode/lib/hooks_utils.py +++ b/rhodecode/lib/hooks_utils.py @@ -47,7 +47,7 @@ def _get_rc_scm_extras(username, repo_na def trigger_post_push_hook( - username, action, repo_name, repo_alias, commit_ids): + username, action, hook_type, repo_name, repo_alias, commit_ids): """ Triggers push action hooks @@ -59,6 +59,7 @@ def trigger_post_push_hook( """ extras = _get_rc_scm_extras(username, repo_name, repo_alias, action) extras.commit_ids = commit_ids + extras.hook_type = hook_type hooks_base.post_push(extras) diff --git a/rhodecode/lib/index/whoosh.py b/rhodecode/lib/index/whoosh.py --- a/rhodecode/lib/index/whoosh.py +++ b/rhodecode/lib/index/whoosh.py @@ -122,7 +122,7 @@ class Search(BaseSearch): search_user, repo_name) try: query = qp.parse(safe_unicode(query)) - log.debug('query: %s (%s)' % (query, repr(query))) + log.debug('query: %s (%s)', query, repr(query)) reverse, sortedby = False, None if search_type == 'message': @@ -217,8 +217,8 @@ class Search(BaseSearch): 'path': self.file_schema }.get(cur_type, self.file_schema) - log.debug('IDX: %s' % index_name) - log.debug('SCHEMA: %s' % schema_defn) + log.debug('IDX: %s', index_name) + log.debug('SCHEMA: %s', schema_defn) return search_type, index_name, schema_defn def _init_searcher(self, index_name): diff --git a/rhodecode/lib/markup_renderer.py b/rhodecode/lib/markup_renderer.py --- a/rhodecode/lib/markup_renderer.py +++ b/rhodecode/lib/markup_renderer.py @@ -60,7 +60,9 @@ class CustomHTMLTranslator(writers.html4 refuri = node['refuri'] if ':' in refuri: prefix, link = refuri.lstrip().split(':', 1) - if prefix == 'javascript': + prefix = prefix or '' + + if prefix.lower() == 'javascript': # we don't allow javascript type of refs... node['refuri'] = 'javascript:alert("SandBoxedJavascript")' @@ -434,12 +436,20 @@ class MarkupRenderer(object): def preprocess(self, nb, resources): sandbox_text = 'SandBoxed(IPython.core.display.Javascript object)' for cell in nb['cells']: - if safe and 'outputs' in cell: + if not safe: + continue + + if 'outputs' in cell: for cell_output in cell['outputs']: if 'data' in cell_output: if 'application/javascript' in cell_output['data']: cell_output['data']['text/plain'] = sandbox_text cell_output['data'].pop('application/javascript', None) + + if 'source' in cell and cell['cell_type'] == 'markdown': + # sanitize similar like in markdown + cell['source'] = cls.bleach_clean(cell['source']) + return nb, resources def _sanitize_resources(resources): diff --git a/rhodecode/lib/memory_lru_dict.py b/rhodecode/lib/memory_lru_dict.py --- a/rhodecode/lib/memory_lru_dict.py +++ b/rhodecode/lib/memory_lru_dict.py @@ -67,7 +67,7 @@ class LRUDictDebug(LRUDict): fmt = '\n' for cnt, elem in enumerate(self.keys()): fmt += '%s - %s\n' % (cnt+1, safe_str(elem)) - log.debug('current LRU keys (%s):%s' % (elems_cnt, fmt)) + log.debug('current LRU keys (%s):%s', elems_cnt, fmt) def __getitem__(self, key): self._report_keys() diff --git a/rhodecode/lib/middleware/request_wrapper.py b/rhodecode/lib/middleware/request_wrapper.py --- a/rhodecode/lib/middleware/request_wrapper.py +++ b/rhodecode/lib/middleware/request_wrapper.py @@ -44,10 +44,11 @@ class RequestWrapperTween(object): finally: end = time.time() total = end - start - log.info('IP: %s Request to %s time: %.3fs [%s]' % ( + log.info( + 'IP: %s Request to %s time: %.3fs [%s]', get_ip_addr(request.environ), safe_str(get_access_path(request.environ)), total, - get_user_agent(request. environ),) + get_user_agent(request. environ) ) return response diff --git a/rhodecode/lib/middleware/utils/scm_app_http.py b/rhodecode/lib/middleware/utils/scm_app_http.py --- a/rhodecode/lib/middleware/utils/scm_app_http.py +++ b/rhodecode/lib/middleware/utils/scm_app_http.py @@ -114,13 +114,17 @@ class VcsHttpProxy(object): stream=True) log.debug('http-app: got vcsserver response: %s', response) + if response.status_code >= 500: + log.error('Exception returned by vcsserver at: %s %s, %s', + url, response.status_code, response.content) + # Preserve the headers of the response, except hop_by_hop ones response_headers = [ (h, v) for h, v in response.headers.items() if not wsgiref.util.is_hop_by_hop(h) ] - # Build status argument for start_reponse callable. + # Build status argument for start_response callable. status = '{status_code} {reason_phrase}'.format( status_code=response.status_code, reason_phrase=response.reason) diff --git a/rhodecode/lib/pidlock.py b/rhodecode/lib/pidlock.py --- a/rhodecode/lib/pidlock.py +++ b/rhodecode/lib/pidlock.py @@ -59,7 +59,7 @@ class DaemonLock(object): def _on_finalize(lock, debug): if lock.held: if debug: - print 'leck held finilazing and running lock.release()' + print('leck held finilazing and running lock.release()') lock.release() def lock(self): @@ -69,7 +69,7 @@ class DaemonLock(object): """ lockname = '%s' % (os.getpid()) if self.debug: - print 'running lock' + print('running lock') self.trylock() self.makelock(lockname, self.pidfile) return True @@ -77,7 +77,7 @@ class DaemonLock(object): def trylock(self): running_pid = False if self.debug: - print 'checking for already running process' + print('checking for already running process') try: with open(self.pidfile, 'r') as f: try: @@ -86,8 +86,8 @@ class DaemonLock(object): running_pid = -1 if self.debug: - print ('lock file present running_pid: %s, ' - 'checking for execution' % (running_pid,)) + print('lock file present running_pid: %s, ' + 'checking for execution' % (running_pid,)) # Now we check the PID from lock file matches to the current # process PID if running_pid: @@ -95,15 +95,15 @@ class DaemonLock(object): kill(running_pid, 0) except OSError as exc: if exc.errno in (errno.ESRCH, errno.EPERM): - print ("Lock File is there but" - " the program is not running") - print "Removing lock file for the: %s" % running_pid + print("Lock File is there but" + " the program is not running") + print("Removing lock file for the: %s" % running_pid) self.release() else: raise else: - print "You already have an instance of the program running" - print "It is running as process %s" % running_pid + print("You already have an instance of the program running") + print("It is running as process %s" % running_pid) raise LockHeld() except IOError as e: @@ -114,21 +114,21 @@ class DaemonLock(object): """releases the pid by removing the pidfile """ if self.debug: - print 'trying to release the pidlock' + print('trying to release the pidlock') if self.callbackfn: - #execute callback function on release + # execute callback function on release if self.debug: - print 'executing callback function %s' % self.callbackfn + print('executing callback function %s' % self.callbackfn) self.callbackfn() try: if self.debug: - print 'removing pidfile %s' % self.pidfile + print('removing pidfile %s' % self.pidfile) os.remove(self.pidfile) self.held = False except OSError as e: if self.debug: - print 'removing pidfile failed %s' % e + print('removing pidfile failed %s' % e) pass def makelock(self, lockname, pidfile): @@ -139,7 +139,7 @@ class DaemonLock(object): :param pidfile: the file to write the pid in """ if self.debug: - print 'creating a file %s and pid: %s' % (pidfile, lockname) + print('creating a file %s and pid: %s' % (pidfile, lockname)) dir_, file_ = os.path.split(pidfile) if not os.path.isdir(dir_): diff --git a/rhodecode/lib/rc_cache/utils.py b/rhodecode/lib/rc_cache/utils.py --- a/rhodecode/lib/rc_cache/utils.py +++ b/rhodecode/lib/rc_cache/utils.py @@ -237,7 +237,7 @@ class InvalidationContext(object): result = heavy_compute(*args) compute_time = inv_context_manager.compute_time - log.debug('result computed in %.3fs' ,compute_time) + log.debug('result computed in %.3fs', compute_time) # To send global invalidation signal, simply run CacheKey.set_invalidate(invalidation_namespace) diff --git a/rhodecode/lib/rcmail/__init__.py b/rhodecode/lib/rcmail/__init__.py deleted file mode 100644 diff --git a/rhodecode/lib/rcmail/exceptions.py b/rhodecode/lib/rcmail/exceptions.py deleted file mode 100644 --- a/rhodecode/lib/rcmail/exceptions.py +++ /dev/null @@ -1,13 +0,0 @@ - - -class InvalidMessage(RuntimeError): - """ - Raised if message is missing vital headers, such - as recipients or sender address. - """ - - -class BadHeaders(RuntimeError): - """ - Raised if message contains newlines in headers. - """ diff --git a/rhodecode/lib/rcmail/message.py b/rhodecode/lib/rcmail/message.py deleted file mode 100644 --- a/rhodecode/lib/rcmail/message.py +++ /dev/null @@ -1,188 +0,0 @@ -from rhodecode.lib.rcmail.response import MailResponse - -from rhodecode.lib.rcmail.exceptions import BadHeaders -from rhodecode.lib.rcmail.exceptions import InvalidMessage - - -class Attachment(object): - """ - Encapsulates file attachment information. - - :param filename: filename of attachment - :param content_type: file mimetype - :param data: the raw file data, either as string or file obj - :param disposition: content-disposition (if any) - """ - - def __init__(self, - filename=None, - content_type=None, - data=None, - disposition=None): - - self.filename = filename - self.content_type = content_type - self.disposition = disposition or 'attachment' - self._data = data - - @property - def data(self): - if isinstance(self._data, basestring): - return self._data - self._data = self._data.read() - return self._data - - -class Message(object): - """ - Encapsulates an email message. - - :param subject: email subject header - :param recipients: list of email addresses - :param body: plain text message - :param html: HTML message - :param sender: email sender address - :param cc: CC list - :param bcc: BCC list - :param extra_headers: dict of extra email headers - :param attachments: list of Attachment instances - :param recipients_separator: alternative separator for any of - 'From', 'To', 'Delivered-To', 'Cc', 'Bcc' fields - """ - - def __init__(self, - subject=None, - recipients=None, - body=None, - html=None, - sender=None, - cc=None, - bcc=None, - extra_headers=None, - attachments=None, - recipients_separator="; "): - - self.subject = subject or '' - self.sender = sender - self.body = body - self.html = html - - self.recipients = recipients or [] - self.attachments = attachments or [] - self.cc = cc or [] - self.bcc = bcc or [] - self.extra_headers = extra_headers or {} - - self.recipients_separator = recipients_separator - - @property - def send_to(self): - return set(self.recipients) | set(self.bcc or ()) | set(self.cc or ()) - - def to_message(self): - """ - Returns raw email.Message instance.Validates message first. - """ - - self.validate() - - return self.get_response().to_message() - - def get_response(self): - """ - Creates a Lamson MailResponse instance - """ - - response = MailResponse(Subject=self.subject, - To=self.recipients, - From=self.sender, - Body=self.body, - Html=self.html, - separator=self.recipients_separator) - - if self.cc: - response.base['Cc'] = self.cc - - for attachment in self.attachments: - - response.attach(attachment.filename, - attachment.content_type, - attachment.data, - attachment.disposition) - - response.update(self.extra_headers) - - return response - - def _get_headers(self): - headers = [self.subject, self.sender] - headers += list(self.send_to) - headers += self.extra_headers.values() - return headers - - def is_bad_headers(self): - """ - Checks for bad headers i.e. newlines in subject, sender or recipients. - """ - - headers = self._get_headers() - - for val in headers: - for c in '\r\n': - if c in val: - return True - return False - - def validate(self): - """ - Checks if message is valid and raises appropriate exception. - """ - - if not self.recipients: - raise InvalidMessage("No recipients have been added") - - if not self.body and not self.html: - raise InvalidMessage("No body has been set") - - if not self.sender: - raise InvalidMessage("No sender address has been set") - - if self.is_bad_headers(): - headers = self._get_headers() - raise BadHeaders(headers) - - def add_recipient(self, recipient): - """ - Adds another recipient to the message. - - :param recipient: email address of recipient. - """ - - self.recipients.append(recipient) - - def add_cc(self, recipient): - """ - Adds an email address to the CC list. - - :param recipient: email address of recipient. - """ - - self.cc.append(recipient) - - def add_bcc(self, recipient): - """ - Adds an email address to the BCC list. - - :param recipient: email address of recipient. - """ - - self.bcc.append(recipient) - - def attach(self, attachment): - """ - Adds an attachment to the message. - - :param attachment: an **Attachment** instance. - """ - - self.attachments.append(attachment) diff --git a/rhodecode/lib/rcmail/response.py b/rhodecode/lib/rcmail/response.py deleted file mode 100644 --- a/rhodecode/lib/rcmail/response.py +++ /dev/null @@ -1,454 +0,0 @@ -# The code in this module is entirely lifted from the Lamson project -# (http://lamsonproject.org/). Its copyright is: - -# Copyright (c) 2008, Zed A. Shaw -# All rights reserved. - -# It is provided under this license: - -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: - -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. - -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. - -# * Neither the name of the Zed A. Shaw nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -import os -import mimetypes -import string -from email import encoders -from email.charset import Charset -from email.utils import parseaddr -from email.mime.base import MIMEBase - -ADDRESS_HEADERS_WHITELIST = ['From', 'To', 'Delivered-To', 'Cc'] -DEFAULT_ENCODING = "utf-8" -VALUE_IS_EMAIL_ADDRESS = lambda v: '@' in v - - -def normalize_header(header): - return string.capwords(header.lower(), '-') - - -class EncodingError(Exception): - """Thrown when there is an encoding error.""" - pass - - -class MailBase(object): - """MailBase is used as the basis of lamson.mail and contains the basics of - encoding an email. You actually can do all your email processing with this - class, but it's more raw. - """ - def __init__(self, items=()): - self.headers = dict(items) - self.parts = [] - self.body = None - self.content_encoding = {'Content-Type': (None, {}), - 'Content-Disposition': (None, {}), - 'Content-Transfer-Encoding': (None, {})} - - def __getitem__(self, key): - return self.headers.get(normalize_header(key), None) - - def __len__(self): - return len(self.headers) - - def __iter__(self): - return iter(self.headers) - - def __contains__(self, key): - return normalize_header(key) in self.headers - - def __setitem__(self, key, value): - self.headers[normalize_header(key)] = value - - def __delitem__(self, key): - del self.headers[normalize_header(key)] - - def __nonzero__(self): - return self.body is not None or len(self.headers) > 0 or len(self.parts) > 0 - - def keys(self): - """Returns the sorted keys.""" - return sorted(self.headers.keys()) - - def attach_file(self, filename, data, ctype, disposition): - """ - A file attachment is a raw attachment with a disposition that - indicates the file name. - """ - assert filename, "You can't attach a file without a filename." - ctype = ctype.lower() - - part = MailBase() - part.body = data - part.content_encoding['Content-Type'] = (ctype, {'name': filename}) - part.content_encoding['Content-Disposition'] = (disposition, - {'filename': filename}) - self.parts.append(part) - - def attach_text(self, data, ctype): - """ - This attaches a simpler text encoded part, which doesn't have a - filename. - """ - ctype = ctype.lower() - - part = MailBase() - part.body = data - part.content_encoding['Content-Type'] = (ctype, {}) - self.parts.append(part) - - def walk(self): - for p in self.parts: - yield p - for x in p.walk(): - yield x - - -class MailResponse(object): - """ - You are given MailResponse objects from the lamson.view methods, and - whenever you want to generate an email to send to someone. It has the - same basic functionality as MailRequest, but it is designed to be written - to, rather than read from (although you can do both). - - You can easily set a Body or Html during creation or after by passing it - as __init__ parameters, or by setting those attributes. - - You can initially set the From, To, and Subject, but they are headers so - use the dict notation to change them: msg['From'] = 'joe@test.com'. - - The message is not fully crafted until right when you convert it with - MailResponse.to_message. This lets you change it and work with it, then - send it out when it's ready. - """ - def __init__(self, To=None, From=None, Subject=None, Body=None, Html=None, - separator="; "): - self.Body = Body - self.Html = Html - self.base = MailBase([('To', To), ('From', From), ('Subject', Subject)]) - self.multipart = self.Body and self.Html - self.attachments = [] - self.separator = separator - - def __contains__(self, key): - return self.base.__contains__(key) - - def __getitem__(self, key): - return self.base.__getitem__(key) - - def __setitem__(self, key, val): - return self.base.__setitem__(key, val) - - def __delitem__(self, name): - del self.base[name] - - def attach(self, filename=None, content_type=None, data=None, - disposition=None): - """ - - Simplifies attaching files from disk or data as files. To attach - simple text simple give data and a content_type. To attach a file, - give the data/content_type/filename/disposition combination. - - For convenience, if you don't give data and only a filename, then it - will read that file's contents when you call to_message() later. If - you give data and filename then it will assume you've filled data - with what the file's contents are and filename is just the name to - use. - """ - - assert filename or data, ("You must give a filename or some data to " - "attach.") - assert data or os.path.exists(filename), ("File doesn't exist, and no " - "data given.") - - self.multipart = True - - if filename and not content_type: - content_type, encoding = mimetypes.guess_type(filename) - - assert content_type, ("No content type given, and couldn't guess " - "from the filename: %r" % filename) - - self.attachments.append({'filename': filename, - 'content_type': content_type, - 'data': data, - 'disposition': disposition,}) - - def attach_part(self, part): - """ - Attaches a raw MailBase part from a MailRequest (or anywhere) - so that you can copy it over. - """ - self.multipart = True - - self.attachments.append({'filename': None, - 'content_type': None, - 'data': None, - 'disposition': None, - 'part': part, - }) - - def attach_all_parts(self, mail_request): - """ - Used for copying the attachment parts of a mail.MailRequest - object for mailing lists that need to maintain attachments. - """ - for part in mail_request.all_parts(): - self.attach_part(part) - - self.base.content_encoding = mail_request.base.content_encoding.copy() - - def clear(self): - """ - Clears out the attachments so you can redo them. Use this to keep the - headers for a series of different messages with different attachments. - """ - del self.attachments[:] - del self.base.parts[:] - self.multipart = False - - def update(self, message): - """ - Used to easily set a bunch of heading from another dict - like object. - """ - for k in message.keys(): - self.base[k] = message[k] - - def __str__(self): - """ - Converts to a string. - """ - return self.to_message().as_string() - - def _encode_attachment(self, filename=None, content_type=None, data=None, - disposition=None, part=None): - """ - Used internally to take the attachments mentioned in self.attachments - and do the actual encoding in a lazy way when you call to_message. - """ - if part: - self.base.parts.append(part) - elif filename: - if not data: - with open(filename) as f: - data = f.read() - - self.base.attach_file(filename, data, content_type, - disposition or 'attachment') - else: - self.base.attach_text(data, content_type) - - ctype = self.base.content_encoding['Content-Type'][0] - - if ctype and not ctype.startswith('multipart'): - self.base.content_encoding['Content-Type'] = ('multipart/mixed', {}) - - def to_message(self): - """ - Figures out all the required steps to finally craft the - message you need and return it. The resulting message - is also available as a self.base attribute. - - What is returned is a Python email API message you can - use with those APIs. The self.base attribute is the raw - lamson.encoding.MailBase. - """ - del self.base.parts[:] - - if self.Body and self.Html: - self.multipart = True - self.base.content_encoding['Content-Type'] = ( - 'multipart/alternative', {}) - - if self.multipart: - self.base.body = None - if self.Body: - self.base.attach_text(self.Body, 'text/plain') - - if self.Html: - self.base.attach_text(self.Html, 'text/html') - - for args in self.attachments: - self._encode_attachment(**args) - - elif self.Body: - self.base.body = self.Body - self.base.content_encoding['Content-Type'] = ('text/plain', {}) - - elif self.Html: - self.base.body = self.Html - self.base.content_encoding['Content-Type'] = ('text/html', {}) - - return to_message(self.base, separator=self.separator) - - def all_parts(self): - """ - Returns all the encoded parts. Only useful for debugging - or inspecting after calling to_message(). - """ - return self.base.parts - - def keys(self): - return self.base.keys() - - -def to_message(mail, separator="; "): - """ - Given a MailBase message, this will construct a MIMEPart - that is canonicalized for use with the Python email API. - """ - ctype, params = mail.content_encoding['Content-Type'] - - if not ctype: - if mail.parts: - ctype = 'multipart/mixed' - else: - ctype = 'text/plain' - else: - if mail.parts: - assert ctype.startswith(("multipart", "message")), \ - "Content type should be multipart or message, not %r" % ctype - - # adjust the content type according to what it should be now - mail.content_encoding['Content-Type'] = (ctype, params) - - try: - out = MIMEPart(ctype, **params) - except TypeError as exc: # pragma: no cover - raise EncodingError("Content-Type malformed, not allowed: %r; " - "%r (Python ERROR: %s" % - (ctype, params, exc.message)) - - for k in mail.keys(): - if k in ADDRESS_HEADERS_WHITELIST: - out[k.encode('ascii')] = header_to_mime_encoding( - mail[k], - not_email=False, - separator=separator - ) - else: - out[k.encode('ascii')] = header_to_mime_encoding( - mail[k], - not_email=True - ) - - out.extract_payload(mail) - - # go through the children - for part in mail.parts: - out.attach(to_message(part)) - - return out - - -class MIMEPart(MIMEBase): - """ - A reimplementation of nearly everything in email.mime to be more useful - for actually attaching things. Rather than one class for every type of - thing you'd encode, there's just this one, and it figures out how to - encode what you ask it. - """ - def __init__(self, type, **params): - self.maintype, self.subtype = type.split('/') - MIMEBase.__init__(self, self.maintype, self.subtype, **params) - - def add_text(self, content): - # this is text, so encode it in canonical form - try: - encoded = content.encode('ascii') - charset = 'ascii' - except UnicodeError: - encoded = content.encode('utf-8') - charset = 'utf-8' - - self.set_payload(encoded, charset=charset) - - def extract_payload(self, mail): - if mail.body is None: - return # only None, '' is still ok - - ctype, ctype_params = mail.content_encoding['Content-Type'] - cdisp, cdisp_params = mail.content_encoding['Content-Disposition'] - - assert ctype, ("Extract payload requires that mail.content_encoding " - "have a valid Content-Type.") - - if ctype.startswith("text/"): - self.add_text(mail.body) - else: - if cdisp: - # replicate the content-disposition settings - self.add_header('Content-Disposition', cdisp, **cdisp_params) - - self.set_payload(mail.body) - encoders.encode_base64(self) - - def __repr__(self): - return "" % ( - self.subtype, - self.maintype, - self['Content-Type'], - self['Content-Disposition'], - self.is_multipart()) - - -def header_to_mime_encoding(value, not_email=False, separator=", "): - if not value: - return "" - - encoder = Charset(DEFAULT_ENCODING) - if type(value) == list: - return separator.join(properly_encode_header( - v, encoder, not_email) for v in value) - else: - return properly_encode_header(value, encoder, not_email) - - -def properly_encode_header(value, encoder, not_email): - """ - The only thing special (weird) about this function is that it tries - to do a fast check to see if the header value has an email address in - it. Since random headers could have an email address, and email addresses - have weird special formatting rules, we have to check for it. - - Normally this works fine, but in Librelist, we need to "obfuscate" email - addresses by changing the '@' to '-AT-'. This is where - VALUE_IS_EMAIL_ADDRESS exists. It's a simple lambda returning True/False - to check if a header value has an email address. If you need to make this - check different, then change this. - """ - try: - return value.encode("ascii") - except UnicodeEncodeError: - if not not_email and VALUE_IS_EMAIL_ADDRESS(value): - # this could have an email address, make sure we don't screw it up - name, address = parseaddr(value) - return '"%s" <%s>' % ( - encoder.header_encode(name.encode("utf-8")), address) - - return encoder.header_encode(value.encode("utf-8")) diff --git a/rhodecode/lib/rcmail/smtp_mailer.py b/rhodecode/lib/rcmail/smtp_mailer.py deleted file mode 100644 --- a/rhodecode/lib/rcmail/smtp_mailer.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (C) 2013-2018 RhodeCode GmbH -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License, version 3 -# (only), as published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -# This program is dual-licensed. If you wish to learn more about the -# RhodeCode Enterprise Edition, including its added features, Support services, -# and proprietary license terms, please see https://rhodecode.com/licenses/ - -""" -Simple smtp mailer used in RhodeCode -""" - -import time -import logging -import socket -from email.utils import formatdate - -from rhodecode.lib.rcmail.message import Message -from rhodecode.lib.rcmail.utils import DNS_NAME - -log = logging.getLogger(__name__) - - -class SmtpMailer(object): - """ - SMTP mailer class - - mailer = SmtpMailer(mail_from, user, passwd, mail_server, smtp_auth - mail_port, ssl, tls) - mailer.send(recipients, subject, body, attachment_files) - - :param recipients might be a list of string or single string - :param attachment_files is a dict of {filename:location} - it tries to guess the mimetype and attach the file - - """ - - def __init__(self, mail_from, user, passwd, mail_server, smtp_auth=None, - mail_port=None, ssl=False, tls=False, debug=False): - - self.mail_from = mail_from - self.mail_server = mail_server - self.mail_port = mail_port - self.user = user - self.passwd = passwd - self.ssl = ssl - self.tls = tls - self.debug = debug - self.auth = smtp_auth - - def _get_smptlib(self): - # patch the output - import smtplib - - class StderrLogger(object): - - def write(self, message): - log.debug(message) - - org_stderr = smtplib.stderr - smtplib.stderr = StderrLogger() - return smtplib - - def send(self, recipients=None, subject='', body='', html='', - attachment_files=None): - recipients = recipients or [] - if isinstance(recipients, basestring): - recipients = [recipients] - headers = { - 'Date': formatdate(time.time()) - } - msg = Message(subject, recipients, body, html, self.mail_from, - recipients_separator=", ", extra_headers=headers) - raw_msg = msg.to_message() - - # patched smtplib without stderr - smtplib = self._get_smptlib() - if self.ssl: - smtp_serv = smtplib.SMTP_SSL(self.mail_server, self.mail_port, - local_hostname=DNS_NAME.get_fqdn()) - else: - smtp_serv = smtplib.SMTP(self.mail_server, self.mail_port, - local_hostname=DNS_NAME.get_fqdn()) - - if self.tls: - smtp_serv.ehlo() - smtp_serv.starttls() - - if self.debug: - smtp_serv.set_debuglevel(1) - - smtp_serv.ehlo() - if self.auth: - smtp_serv.esmtp_features["auth"] = self.auth - - # if server requires authorization you must provide login and password - # but only if we have them - if self.user and self.passwd: - smtp_serv.login(self.user, self.passwd) - - smtp_serv.sendmail(msg.sender, msg.send_to, raw_msg.as_string()) - log.info('email sent to: %s' % recipients) - - try: - smtp_serv.quit() - except socket.sslerror: - # sslerror is raised in tls connections on closing sometimes - smtp_serv.close() diff --git a/rhodecode/lib/rcmail/utils.py b/rhodecode/lib/rcmail/utils.py deleted file mode 100644 --- a/rhodecode/lib/rcmail/utils.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (C) 2010-2018 RhodeCode GmbH -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License, version 3 -# (only), as published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -# This program is dual-licensed. If you wish to learn more about the -# RhodeCode Enterprise Edition, including its added features, Support services, -# and proprietary license terms, please see https://rhodecode.com/licenses/ - -""" -Email message and email sending related helper functions. -""" - -import socket - - -# Cache the hostname, but do it lazily: socket.getfqdn() can take a couple of -# seconds, which slows down the restart of the server. -class CachedDnsName(object): - def __str__(self): - return self.get_fqdn() - - def get_fqdn(self): - if not hasattr(self, '_fqdn'): - self._fqdn = socket.getfqdn() - return self._fqdn - -DNS_NAME = CachedDnsName() diff --git a/rhodecode/lib/system_info.py b/rhodecode/lib/system_info.py --- a/rhodecode/lib/system_info.py +++ b/rhodecode/lib/system_info.py @@ -74,10 +74,17 @@ def get_storage_size(storage_path): return sum(sizes) +def get_resource(resource_type): + try: + return resource.getrlimit(resource_type) + except Exception: + return 'NOT_SUPPORTED' + + class SysInfoRes(object): - def __init__(self, value, state=STATE_OK_DEFAULT, human_value=None): + def __init__(self, value, state=None, human_value=None): self.value = value - self.state = state + self.state = state or STATE_OK_DEFAULT self.human_value = human_value or value def __json__(self): @@ -159,16 +166,16 @@ def locale_info(): def ulimit_info(): data = collections.OrderedDict([ - ('cpu time (seconds)', resource.getrlimit(resource.RLIMIT_CPU)), - ('file size', resource.getrlimit(resource.RLIMIT_FSIZE)), - ('stack size', resource.getrlimit(resource.RLIMIT_STACK)), - ('core file size', resource.getrlimit(resource.RLIMIT_CORE)), - ('address space size', resource.getrlimit(resource.RLIMIT_AS)), - ('locked in mem size', resource.getrlimit(resource.RLIMIT_MEMLOCK)), - ('heap size', resource.getrlimit(resource.RLIMIT_DATA)), - ('rss size', resource.getrlimit(resource.RLIMIT_RSS)), - ('number of processes', resource.getrlimit(resource.RLIMIT_NPROC)), - ('open files', resource.getrlimit(resource.RLIMIT_NOFILE)), + ('cpu time (seconds)', get_resource(resource.RLIMIT_CPU)), + ('file size', get_resource(resource.RLIMIT_FSIZE)), + ('stack size', get_resource(resource.RLIMIT_STACK)), + ('core file size', get_resource(resource.RLIMIT_CORE)), + ('address space size', get_resource(resource.RLIMIT_AS)), + ('locked in mem size', get_resource(resource.RLIMIT_MEMLOCK)), + ('heap size', get_resource(resource.RLIMIT_DATA)), + ('rss size', get_resource(resource.RLIMIT_RSS)), + ('number of processes', get_resource(resource.RLIMIT_NPROC)), + ('open files', get_resource(resource.RLIMIT_NOFILE)), ]) text = ', '.join('{}:{}'.format(k,v) for k,v in data.items()) diff --git a/rhodecode/lib/user_log_filter.py b/rhodecode/lib/user_log_filter.py --- a/rhodecode/lib/user_log_filter.py +++ b/rhodecode/lib/user_log_filter.py @@ -49,13 +49,13 @@ def user_log_filter(user_log, search_ter :param user_log: :param search_term: """ - log.debug('Initial search term: %r' % search_term) + log.debug('Initial search term: %r', search_term) qry = None if search_term: qp = QueryParser('repository', schema=JOURNAL_SCHEMA) qp.add_plugin(DateParserPlugin()) qry = qp.parse(safe_unicode(search_term)) - log.debug('Filtering using parsed query %r' % qry) + log.debug('Filtering using parsed query %r', qry) def wildcard_handler(col, wc_term): if wc_term.startswith('*') and not wc_term.endswith('*'): @@ -80,7 +80,7 @@ def user_log_filter(user_log, search_ter field = getattr(UserLog, 'username') else: field = getattr(UserLog, field) - log.debug('filter field: %s val=>%s' % (field, val)) + log.debug('filter field: %s val=>%s', field, val) # sql filtering if isinstance(term, query.Wildcard): diff --git a/rhodecode/lib/utils.py b/rhodecode/lib/utils.py --- a/rhodecode/lib/utils.py +++ b/rhodecode/lib/utils.py @@ -28,6 +28,7 @@ import json import logging import os import re +import sys import shutil import tempfile import traceback @@ -43,7 +44,6 @@ from mako import exceptions from pyramid.threadlocal import get_current_registry from rhodecode.lib.request import Request -from rhodecode.lib.fakemod import create_module from rhodecode.lib.vcs.backends.base import Config from rhodecode.lib.vcs.exceptions import VCSError from rhodecode.lib.vcs.utils.helpers import get_scm, get_scm_backend @@ -291,8 +291,7 @@ def is_valid_repo_group(repo_group_name, # check if it's not a repo if is_valid_repo(repo_group_name, base_path): - log.debug('Repo called %s exist, it is not a valid ' - 'repo group' % repo_group_name) + log.debug('Repo called %s exist, it is not a valid repo group', repo_group_name) return False try: @@ -632,21 +631,21 @@ def load_rcextensions(root_path): import rhodecode from rhodecode.config import conf - path = os.path.join(root_path, 'rcextensions', '__init__.py') - if os.path.isfile(path): - rcext = create_module('rc', path) - EXT = rhodecode.EXTENSIONS = rcext - log.debug('Found rcextensions now loading %s...', rcext) + path = os.path.join(root_path) + sys.path.append(path) + try: + rcextensions = __import__('rcextensions') + except ImportError: + log.warn('Unable to load rcextensions from %s', path) + rcextensions = None + + if rcextensions: + log.debug('Found rcextensions module loaded %s...', rcextensions) + rhodecode.EXTENSIONS = rcextensions # Additional mappings that are not present in the pygments lexers - conf.LANGUAGES_EXTENSIONS_MAP.update(getattr(EXT, 'EXTRA_MAPPINGS', {})) - - # auto check if the module is not missing any data, set to default if is - # this will help autoupdate new feature of rcext module - #from rhodecode.config import rcextensions - #for k in dir(rcextensions): - # if not k.startswith('_') and not hasattr(EXT, k): - # setattr(EXT, k, getattr(rcextensions, k)) + conf.LANGUAGES_EXTENSIONS_MAP.update( + getattr(rhodecode.EXTENSIONS, 'EXTRA_MAPPINGS', {})) def get_custom_lexer(extension): @@ -778,5 +777,5 @@ def generate_platform_uuid(): uuid_list = [platform.platform()] return hashlib.sha256(':'.join(uuid_list)).hexdigest() except Exception as e: - log.error('Failed to generate host uuid: %s' % e) + log.error('Failed to generate host uuid: %s', e) return 'UNDEFINED' diff --git a/rhodecode/lib/vcs/backends/base.py b/rhodecode/lib/vcs/backends/base.py --- a/rhodecode/lib/vcs/backends/base.py +++ b/rhodecode/lib/vcs/backends/base.py @@ -821,6 +821,13 @@ class BaseCommit(object): """ raise NotImplementedError + @LazyProperty + def first_parent(self): + """ + Returns list of parent commits. + """ + return self.parents[0] if self.parents else EmptyCommit() + @property def merge(self): """ @@ -1099,8 +1106,7 @@ class BaseCommit(object): """ Returns a `Diff` object representing the change made by this commit. """ - parent = ( - self.parents[0] if self.parents else self.repository.EMPTY_COMMIT) + parent = self.first_parent diff = self.repository.get_diff( parent, self, ignore_whitespace=ignore_whitespace, diff --git a/rhodecode/lib/vcs/backends/git/repository.py b/rhodecode/lib/vcs/backends/git/repository.py --- a/rhodecode/lib/vcs/backends/git/repository.py +++ b/rhodecode/lib/vcs/backends/git/repository.py @@ -58,13 +58,13 @@ class GitRepository(BaseRepository): contact = BaseRepository.DEFAULT_CONTACT def __init__(self, repo_path, config=None, create=False, src_url=None, - update_after_clone=False, with_wire=None, bare=False): + do_workspace_checkout=False, with_wire=None, bare=False): self.path = safe_str(os.path.abspath(repo_path)) self.config = config if config else self.get_default_config() self.with_wire = with_wire - self._init_repo(create, src_url, update_after_clone, bare) + self._init_repo(create, src_url, do_workspace_checkout, bare) # caches self._commit_ids = {} @@ -145,24 +145,36 @@ class GitRepository(BaseRepository): pass return False - def _init_repo(self, create, src_url=None, update_after_clone=False, + def _init_repo(self, create, src_url=None, do_workspace_checkout=False, bare=False): if create and os.path.exists(self.path): raise RepositoryError( "Cannot create repository at %s, location already exist" % self.path) + if bare and do_workspace_checkout: + raise RepositoryError("Cannot update a bare repository") try: - if create and src_url: + + if src_url: + # check URL before any actions GitRepository.check_url(src_url, self.config) - self.clone(src_url, update_after_clone, bare) - elif create: + + if create: os.makedirs(self.path, mode=0755) if bare: self._remote.init_bare() else: self._remote.init() + + if src_url and bare: + # bare repository only allows a fetch and checkout is not allowed + self.fetch(src_url, commit_ids=None) + elif src_url: + self.pull(src_url, commit_ids=None, + update_after=do_workspace_checkout) + else: if not self._remote.assert_correct_path(): raise RepositoryError( @@ -630,49 +642,27 @@ class GitRepository(BaseRepository): """ return GitInMemoryCommit(self) - def clone(self, url, update_after_clone=True, bare=False): + def pull(self, url, commit_ids=None, update_after=False): """ - Tries to clone commits from external location. - - :param update_after_clone: If set to ``False``, git won't checkout - working directory - :param bare: If set to ``True``, repository would be cloned into - *bare* git repository (no working directory at all). - """ - # init_bare and init expect empty dir created to proceed - if not os.path.exists(self.path): - os.mkdir(self.path) + Pull changes from external location. Pull is different in GIT + that fetch since it's doing a checkout - if bare: - self._remote.init_bare() - else: - self._remote.init() - - deferred = '^{}' - valid_refs = ('refs/heads', 'refs/tags', 'HEAD') - - return self._remote.clone( - url, deferred, valid_refs, update_after_clone) - - def pull(self, url, commit_ids=None): + :param commit_ids: Optional. Can be set to a list of commit ids + which shall be pulled from the other repository. """ - Tries to pull changes from external location. We use fetch here since - pull in get does merges and we want to be compatible with hg backend so - pull == fetch in this case - """ - self.fetch(url, commit_ids=commit_ids) + refs = None + if commit_ids is not None: + remote_refs = self._remote.get_remote_refs(url) + refs = [ref for ref in remote_refs if remote_refs[ref] in commit_ids] + self._remote.pull(url, refs=refs, update_after=update_after) + self._remote.invalidate_vcs_cache() def fetch(self, url, commit_ids=None): """ - Tries to fetch changes from external location. + Fetch all git objects from external location. """ - refs = None - - if commit_ids is not None: - remote_refs = self._remote.get_remote_refs(url) - refs = [ - ref for ref in remote_refs if remote_refs[ref] in commit_ids] - self._remote.fetch(url, refs=refs) + self._remote.sync_fetch(url, refs=commit_ids) + self._remote.invalidate_vcs_cache() def push(self, url): refs = None @@ -778,7 +768,7 @@ class GitRepository(BaseRepository): def _local_reset(self, branch_name): branch_name = '{}'.format(branch_name) - cmd = ['reset', '--hard', branch_name] + cmd = ['reset', '--hard', branch_name, '--'] self.run_git_command(cmd, fail_on_stderr=False) def _last_fetch_heads(self): diff --git a/rhodecode/lib/vcs/backends/hg/repository.py b/rhodecode/lib/vcs/backends/hg/repository.py --- a/rhodecode/lib/vcs/backends/hg/repository.py +++ b/rhodecode/lib/vcs/backends/hg/repository.py @@ -57,7 +57,7 @@ class MercurialRepository(BaseRepository DEFAULT_BRANCH_NAME = 'default' def __init__(self, repo_path, config=None, create=False, src_url=None, - update_after_clone=False, with_wire=None): + do_workspace_checkout=False, with_wire=None, bare=False): """ Raises RepositoryError if repository could not be find at the given ``repo_path``. @@ -67,8 +67,9 @@ class MercurialRepository(BaseRepository :param create=False: if set to True, would try to create repository if it does not exist rather than raising exception :param src_url=None: would try to clone repository from given location - :param update_after_clone=False: sets update of working copy after + :param do_workspace_checkout=False: sets update of working copy after making a clone + :param bare: not used, compatible with other VCS """ self.path = safe_str(os.path.abspath(repo_path)) @@ -79,7 +80,7 @@ class MercurialRepository(BaseRepository default=[('extensions', 'largefiles', '1')]) self.with_wire = with_wire - self._init_repo(create, src_url, update_after_clone) + self._init_repo(create, src_url, do_workspace_checkout) # caches self._commit_ids = {} @@ -328,7 +329,7 @@ class MercurialRepository(BaseRepository def is_valid_repository(path): return os.path.isdir(os.path.join(path, '.hg')) - def _init_repo(self, create, src_url=None, update_after_clone=False): + def _init_repo(self, create, src_url=None, do_workspace_checkout=False): """ Function will check for mercurial repository in given path. If there is no repository in that path it will raise an exception unless @@ -337,7 +338,7 @@ class MercurialRepository(BaseRepository If `src_url` is given, would try to clone repository from the location at given clone_point. Additionally it'll make update to - working copy accordingly to `update_after_clone` flag. + working copy accordingly to `do_workspace_checkout` flag. """ if create and os.path.exists(self.path): raise RepositoryError( @@ -348,7 +349,7 @@ class MercurialRepository(BaseRepository url = str(self._get_url(src_url)) MercurialRepository.check_url(url, self.config) - self._remote.clone(url, self.path, update_after_clone) + self._remote.clone(url, self.path, do_workspace_checkout) # Don't try to create if we've already cloned repo create = False @@ -538,7 +539,7 @@ class MercurialRepository(BaseRepository def pull(self, url, commit_ids=None): """ - Tries to pull changes from external location. + Pull changes from external location. :param commit_ids: Optional. Can be set to a list of commit ids which shall be pulled from the other repository. @@ -547,6 +548,12 @@ class MercurialRepository(BaseRepository self._remote.pull(url, commit_ids=commit_ids) self._remote.invalidate_vcs_cache() + def fetch(self, url, commit_ids=None): + """ + Backward compatibility with GIT fetch==pull + """ + return self.pull(url, commit_ids=commit_ids) + def push(self, url): url = self._get_url(url) self._remote.sync_push(url) diff --git a/rhodecode/lib/vcs/backends/svn/repository.py b/rhodecode/lib/vcs/backends/svn/repository.py --- a/rhodecode/lib/vcs/backends/svn/repository.py +++ b/rhodecode/lib/vcs/backends/svn/repository.py @@ -68,7 +68,7 @@ class SubversionRepository(base.BaseRepo contact = base.BaseRepository.DEFAULT_CONTACT description = base.BaseRepository.DEFAULT_DESCRIPTION - def __init__(self, repo_path, config=None, create=False, src_url=None, + def __init__(self, repo_path, config=None, create=False, src_url=None, bare=False, **kwargs): self.path = safe_str(os.path.abspath(repo_path)) self.config = config if config else self.get_default_config() diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -739,13 +739,18 @@ class User(Base, BaseModel): plain_tokens = [] hash_tokens = [] - for token in tokens_q.all(): - # verify scope first + user_tokens = tokens_q.all() + log.debug('Found %s user tokens to check for authentication', len(user_tokens)) + for token in user_tokens: + log.debug('AUTH_TOKEN: checking if user token with id `%s` matches', + token.user_api_key_id) + # verify scope first, since it's way faster than hash calculation of + # encrypted tokens if token.repo_id: # token has a scope, we need to verify it if scope_repo_id != token.repo_id: log.debug( - 'Scope mismatch: token has a set repo scope: %s, ' + 'AUTH_TOKEN: scope mismatch, token has a set repo scope: %s, ' 'and calling scope is:%s, skipping further checks', token.repo, scope_repo_id) # token has a scope, and it doesn't match, skip token @@ -761,7 +766,7 @@ class User(Base, BaseModel): return True for hashed in hash_tokens: - # TODO(marcink): this is expensive to calculate, but most secure + # NOTE(marcink): this is expensive to calculate, but most secure match = crypto_backend.hash_check(auth_token, hashed) if match: return True @@ -938,7 +943,11 @@ class User(Base, BaseModel): @classmethod def get_first_super_admin(cls): - user = User.query().filter(User.admin == true()).first() + user = User.query()\ + .filter(User.admin == true()) \ + .order_by(User.user_id.asc()) \ + .first() + if user is None: raise Exception('FATAL: Missing administrative account!') return user @@ -1576,6 +1585,8 @@ class Repository(Base, BaseModel): unique=False, default=None) private = Column( "private", Boolean(), nullable=True, unique=None, default=None) + archived = Column( + "archived", Boolean(), nullable=True, unique=None, default=None) enable_statistics = Column( "statistics", Boolean(), nullable=True, unique=None, default=True) enable_downloads = Column( @@ -1774,9 +1785,12 @@ class Repository(Base, BaseModel): @classmethod def get_all_repos(cls, user_id=Optional(None), group_id=Optional(None), - case_insensitive=True): + case_insensitive=True, archived=False): q = Repository.query() + if not archived: + q = q.filter(Repository.archived.isnot(true())) + if not isinstance(user_id, Optional): q = q.filter(Repository.user_id == user_id) @@ -1787,6 +1801,7 @@ class Repository(Base, BaseModel): q = q.order_by(func.lower(Repository.repo_name)) else: q = q.order_by(Repository.repo_name) + return q.all() @property @@ -2536,8 +2551,8 @@ class RepoGroup(Base, BaseModel): break if cnt == parents_recursion_limit: # this will prevent accidental infinit loops - log.error(('more than %s parents found for group %s, stopping ' - 'recursive parent fetching' % (parents_recursion_limit, self))) + log.error('more than %s parents found for group %s, stopping ' + 'recursive parent fetching', parents_recursion_limit, self) break groups.insert(0, gr) diff --git a/rhodecode/model/pull_request.py b/rhodecode/model/pull_request.py --- a/rhodecode/model/pull_request.py +++ b/rhodecode/model/pull_request.py @@ -73,7 +73,7 @@ class PullRequestModel(BaseModel): cls = PullRequest - DIFF_CONTEXT = 3 + DIFF_CONTEXT = diffs.DEFAULT_CONTEXT MERGE_STATUS_MESSAGES = { MergeFailureReason.NONE: lazy_ugettext( @@ -590,6 +590,7 @@ class PullRequestModel(BaseModel): def merge_repo(self, pull_request, user, extras): log.debug("Merging pull request %s", pull_request.pull_request_id) + extras['user_agent'] = 'internal-merge' merge_state = self._merge_pull_request(pull_request, user, extras) if merge_state.executed: log.debug( @@ -876,19 +877,21 @@ class PullRequestModel(BaseModel): diff_context = ( self.DIFF_CONTEXT + CommentsModel.needed_extra_diff_context()) - + hide_whitespace_changes = False source_repo = pull_request_version.source_repo source_ref_id = pull_request_version.source_ref_parts.commit_id target_ref_id = pull_request_version.target_ref_parts.commit_id old_diff = self._get_diff_from_pr_or_version( - source_repo, source_ref_id, target_ref_id, context=diff_context) + source_repo, source_ref_id, target_ref_id, + hide_whitespace_changes=hide_whitespace_changes, diff_context=diff_context) source_repo = pull_request.source_repo source_ref_id = pull_request.source_ref_parts.commit_id target_ref_id = pull_request.target_ref_parts.commit_id new_diff = self._get_diff_from_pr_or_version( - source_repo, source_ref_id, target_ref_id, context=diff_context) + source_repo, source_ref_id, target_ref_id, + hide_whitespace_changes=hide_whitespace_changes, diff_context=diff_context) old_diff_data = diffs.DiffProcessor(old_diff) old_diff_data.prepare() @@ -1487,12 +1490,17 @@ class PullRequestModel(BaseModel): raise EmptyRepositoryError() return groups, selected - def get_diff(self, source_repo, source_ref_id, target_ref_id, context=DIFF_CONTEXT): + def get_diff(self, source_repo, source_ref_id, target_ref_id, + hide_whitespace_changes, diff_context): + return self._get_diff_from_pr_or_version( - source_repo, source_ref_id, target_ref_id, context=context) + source_repo, source_ref_id, target_ref_id, + hide_whitespace_changes=hide_whitespace_changes, diff_context=diff_context) def _get_diff_from_pr_or_version( - self, source_repo, source_ref_id, target_ref_id, context): + self, source_repo, source_ref_id, target_ref_id, + hide_whitespace_changes, diff_context): + target_commit = source_repo.get_commit( commit_id=safe_str(target_ref_id)) source_commit = source_repo.get_commit( @@ -1516,7 +1524,8 @@ class PullRequestModel(BaseModel): safe_unicode(vcs_repo.path)) vcs_diff = vcs_repo.get_diff( - commit1=target_commit, commit2=source_commit, context=context) + commit1=target_commit, commit2=source_commit, + ignore_whitespace=hide_whitespace_changes, context=diff_context) return vcs_diff def _is_merge_enabled(self, pull_request): diff --git a/rhodecode/model/repo.py b/rhodecode/model/repo.py --- a/rhodecode/model/repo.py +++ b/rhodecode/model/repo.py @@ -32,7 +32,7 @@ from zope.cachedescriptors.property impo from rhodecode import events from rhodecode.lib.auth import HasUserGroupPermissionAny from rhodecode.lib.caching_query import FromCache -from rhodecode.lib.exceptions import AttachedForksError +from rhodecode.lib.exceptions import AttachedForksError, AttachedPullRequestsError from rhodecode.lib.hooks_base import log_delete_repository from rhodecode.lib.user_log_filter import user_log_filter from rhodecode.lib.utils import make_db_config @@ -207,8 +207,8 @@ class RepoModel(BaseModel): def quick_menu(repo_name): return _render('quick_menu', repo_name) - def repo_lnk(name, rtype, rstate, private, fork_of): - return _render('repo_name', name, rtype, rstate, private, fork_of, + def repo_lnk(name, rtype, rstate, private, archived, fork_of): + return _render('repo_name', name, rtype, rstate, private, archived, fork_of, short_name=not admin, admin=False) def last_change(last_change): @@ -246,8 +246,8 @@ class RepoModel(BaseModel): row = { "menu": quick_menu(repo.repo_name), - "name": repo_lnk(repo.repo_name, repo.repo_type, - repo.repo_state, repo.private, repo.fork), + "name": repo_lnk(repo.repo_name, repo.repo_type, repo.repo_state, + repo.private, repo.archived, repo.fork), "name_raw": repo.repo_name.lower(), "last_change": last_change(repo.last_db_change), @@ -427,6 +427,7 @@ class RepoModel(BaseModel): new_repo.group = repo_group new_repo.description = description or repo_name new_repo.private = private + new_repo.archived = False new_repo.clone_uri = clone_uri new_repo.landing_rev = landing_rev @@ -608,7 +609,24 @@ class RepoModel(BaseModel): from rhodecode.lib.celerylib import tasks, run_task return run_task(tasks.create_repo_fork, form_data, cur_user) - def delete(self, repo, forks=None, fs_remove=True, cur_user=None): + def archive(self, repo): + """ + Archive given repository. Set archive flag. + + :param repo: + """ + repo = self._get_repo(repo) + if repo: + + try: + repo.archived = True + self.sa.add(repo) + self.sa.commit() + except Exception: + log.error(traceback.format_exc()) + raise + + def delete(self, repo, forks=None, pull_requests=None, fs_remove=True, cur_user=None): """ Delete given repository, forks parameter defines what do do with attached forks. Throws AttachedForksError if deleted repo has attached @@ -616,6 +634,7 @@ class RepoModel(BaseModel): :param repo: :param forks: str 'delete' or 'detach' + :param pull_requests: str 'delete' or None :param fs_remove: remove(archive) repo from filesystem """ if not cur_user: @@ -632,6 +651,12 @@ class RepoModel(BaseModel): elif [f for f in repo.forks]: raise AttachedForksError() + # check for pull requests + pr_sources = repo.pull_requests_source + pr_targets = repo.pull_requests_target + if pull_requests != 'delete' and (pr_sources or pr_targets): + raise AttachedPullRequestsError() + old_repo_dict = repo.get_dict() events.trigger(events.RepoPreDeleteEvent(repo)) try: diff --git a/rhodecode/model/scm.py b/rhodecode/model/scm.py --- a/rhodecode/model/scm.py +++ b/rhodecode/model/scm.py @@ -23,12 +23,9 @@ Scm model for RhodeCode """ import os.path -import re -import sys import traceback import logging import cStringIO -import pkg_resources from sqlalchemy import func from zope.cachedescriptors.property import Lazy as LazyProperty @@ -53,6 +50,7 @@ from rhodecode.model.db import ( Repository, CacheKey, UserFollowing, UserLog, User, RepoGroup, PullRequest) from rhodecode.model.settings import VcsSettingsModel +from rhodecode.model.validation_schema.validators import url_validator, InvalidCloneUrl log = logging.getLogger(__name__) @@ -379,29 +377,36 @@ class ScmModel(BaseModel): self.sa.add(repo) return repo - def pull_changes(self, repo, username, remote_uri=None): + def pull_changes(self, repo, username, remote_uri=None, validate_uri=True): dbrepo = self._get_repo(repo) remote_uri = remote_uri or dbrepo.clone_uri if not remote_uri: raise Exception("This repository doesn't have a clone uri") repo = dbrepo.scm_instance(cache=False) - # TODO: marcink fix this an re-enable since we need common logic - # for hg/git remove hooks so we don't trigger them on fetching - # commits from remote repo.config.clear_section('hooks') + try: + # NOTE(marcink): add extra validation so we skip invalid urls + # this is due this tasks can be executed via scheduler without + # proper validation of remote_uri + if validate_uri: + config = make_db_config(clear_session=False) + url_validator(remote_uri, dbrepo.repo_type, config) + except InvalidCloneUrl: + raise + repo_name = dbrepo.repo_name try: # TODO: we need to make sure those operations call proper hooks ! - repo.pull(remote_uri) + repo.fetch(remote_uri) self.mark_for_invalidation(repo_name) except Exception: log.error(traceback.format_exc()) raise - def push_changes(self, repo, username, remote_uri=None): + def push_changes(self, repo, username, remote_uri=None, validate_uri=True): dbrepo = self._get_repo(repo) remote_uri = remote_uri or dbrepo.push_uri if not remote_uri: @@ -411,6 +416,16 @@ class ScmModel(BaseModel): repo.config.clear_section('hooks') try: + # NOTE(marcink): add extra validation so we skip invalid urls + # this is due this tasks can be executed via scheduler without + # proper validation of remote_uri + if validate_uri: + config = make_db_config(clear_session=False) + url_validator(remote_uri, dbrepo.repo_type, config) + except InvalidCloneUrl: + raise + + try: repo.push(remote_uri) except Exception: log.error(traceback.format_exc()) @@ -450,8 +465,8 @@ class ScmModel(BaseModel): # We trigger the post-push action hooks_utils.trigger_post_push_hook( - username=user.username, action='push_local', repo_name=repo_name, - repo_alias=repo.alias, commit_ids=[tip.raw_id]) + username=user.username, action='push_local', hook_type='post_push', + repo_name=repo_name, repo_alias=repo.alias, commit_ids=[tip.raw_id]) return tip def _sanitize_path(self, f_path): @@ -629,6 +644,7 @@ class ScmModel(BaseModel): hooks_utils.trigger_post_push_hook( username=user.username, action='push_local', repo_name=repo.repo_name, repo_alias=scm_instance.alias, + hook_type='post_push', commit_ids=[tip.raw_id]) return tip @@ -693,7 +709,7 @@ class ScmModel(BaseModel): if trigger_push_hook: hooks_utils.trigger_post_push_hook( - username=user.username, action='push_local', + username=user.username, action='push_local', hook_type='post_push', repo_name=repo.repo_name, repo_alias=scm_instance.alias, commit_ids=[tip.raw_id]) @@ -753,7 +769,7 @@ class ScmModel(BaseModel): self.mark_for_invalidation(repo.repo_name) if trigger_push_hook: hooks_utils.trigger_post_push_hook( - username=user.username, action='push_local', + username=user.username, action='push_local', hook_type='post_push', repo_name=repo.repo_name, repo_alias=scm_instance.alias, commit_ids=[tip.raw_id]) return tip diff --git a/rhodecode/model/settings.py b/rhodecode/model/settings.py --- a/rhodecode/model/settings.py +++ b/rhodecode/model/settings.py @@ -241,9 +241,8 @@ class SettingsModel(BaseModel): region.invalidate() result = _get_all_settings('rhodecode_settings', key) - log.debug( - 'Fetching app settings for key: %s took: %.3fs', key, - inv_context_manager.compute_time) + log.debug('Fetching app settings for key: %s took: %.3fs', key, + inv_context_manager.compute_time) return result diff --git a/rhodecode/model/user.py b/rhodecode/model/user.py --- a/rhodecode/model/user.py +++ b/rhodecode/model/user.py @@ -300,11 +300,11 @@ class UserModel(BaseModel): if updating_user_id: log.debug('Checking for existing account in RhodeCode ' - 'database with user_id `%s` ' % (updating_user_id,)) + 'database with user_id `%s` ', updating_user_id) user = User.get(updating_user_id) else: log.debug('Checking for existing account in RhodeCode ' - 'database with username `%s` ' % (username,)) + 'database with username `%s` ', username) user = User.get_by_username(username, case_insensitive=True) if user is None: diff --git a/rhodecode/model/user_group.py b/rhodecode/model/user_group.py --- a/rhodecode/model/user_group.py +++ b/rhodecode/model/user_group.py @@ -626,7 +626,7 @@ class UserGroupModel(BaseModel): self.remove_user_from_group(gr, user) else: log.debug('Skipping removal from group %s since it is ' - 'not set to be automatically synchronized' % gr) + 'not set to be automatically synchronized', gr) # now we calculate in which groups user should be == groups params owner = User.get_first_super_admin().username @@ -647,7 +647,7 @@ class UserGroupModel(BaseModel): UserGroupModel().add_user_to_group(existing_group, user) else: log.debug('Skipping addition to group %s since it is ' - 'not set to be automatically synchronized' % gr) + 'not set to be automatically synchronized', gr) def change_groups(self, user, groups): """ diff --git a/rhodecode/public/502.html b/rhodecode/public/502.html --- a/rhodecode/public/502.html +++ b/rhodecode/public/502.html @@ -12,7 +12,7 @@ body { background:#eeeeee; color: #323232; - font-family: "proximanovaregular","Proxima Nova Regular","Proxima Nova",sans-serif; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; margin: 0 auto; max-width: 1000px; letter-spacing: .02em; diff --git a/rhodecode/public/css/bootstrap-variables.less b/rhodecode/public/css/bootstrap-variables.less --- a/rhodecode/public/css/bootstrap-variables.less +++ b/rhodecode/public/css/bootstrap-variables.less @@ -44,8 +44,6 @@ @font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif; @font-family-serif: Georgia, "Times New Roman", Times, serif; -//** Default monospace fonts for ``, ``, and `
`.
-@font-family-monospace:   Consolas, "Liberation Mono", Menlo, Monaco, Courier, monospace;
 
 @font-family-base:        @font-family-sans-serif;
 
diff --git a/rhodecode/public/css/code-block.less b/rhodecode/public/css/code-block.less
--- a/rhodecode/public/css/code-block.less
+++ b/rhodecode/public/css/code-block.less
@@ -79,6 +79,7 @@ div.diffblock {
                 min-width: 5em;
                 margin: 0;
                 padding: @button-padding @button-padding @button-padding 0;
+                font-weight: @text-semibold-weight;
                 font-family: @text-semibold;
             }
 
@@ -422,6 +423,7 @@ div.codeblock {
     .author {
         clear: both;
         vertical-align: middle;
+        font-weight: @text-bold-weight;
         font-family: @text-bold;
     }
 
@@ -543,7 +545,7 @@ div.search-code-body {
             border-right: 1px solid #ccc !important;
             padding-right: 10px;
             text-align: right;
-            font-family: "Lucida Console",Monaco,monospace;
+            font-family: @text-monospace;
             span {
                 white-space: pre-wrap;
                 color: #666666;
@@ -571,7 +573,7 @@ div.annotatediv { margin-left: 2px; marg
 .codehilite {
     .hll { background-color: #ffffcc }
     .c { color: #408080; font-style: italic } /* Comment */
-    .err, .codehilite .err { border: @border-thickness solid #FF0000 } /* Error */
+    .err, .codehilite .err { border: none } /* Error */
     .k { color: #008000; font-weight: bold } /* Keyword */
     .o { color: #666666 } /* Operator */
     .cm { color: #408080; font-style: italic } /* Comment.Multiline */
@@ -648,6 +650,7 @@ pre.literal-block, .codehilite pre{
 @cb-text-padding: 5px;
 
 @pill-padding: 2px 7px;
+@pill-padding-small: 2px 2px 1px 2px;
 
 input.filediff-collapse-state {
     display: none;
@@ -667,7 +670,7 @@ input.filediff-collapse-state {
         .filediff-menu {
             display: none;
         }
-        margin: 10px 0 0 0;
+
     }
 
     &+ .filediff { /* file diff is expanded */
@@ -689,10 +692,66 @@ input.filediff-collapse-state {
         }
     }
 }
+
+.filediffs .anchor {
+    display: block;
+    height: 40px;
+    margin-top: -40px;
+    visibility: hidden;
+}
+
+.filediffs .anchor:nth-of-type(1) {
+    display: block;
+    height: 80px;
+    margin-top: -80px;
+    visibility: hidden;
+}
+
 .cs_files {
     clear: both;
 }
 
+#diff-file-sticky{
+    will-change: min-height;
+}
+
+.sidebar__inner{
+    transform: translate(0, 0); /* For browsers don't support translate3d. */
+    transform: translate3d(0, 0, 0);
+    will-change: position, transform;
+    height: 70px;
+    z-index: 30;
+    background-color: #fff;
+    padding: 5px 0px;
+}
+
+.sidebar__bar {
+    padding: 5px 0px 0px 0px
+}
+
+.fpath-placeholder {
+    clear: both;
+    visibility: hidden
+}
+
+.is-affixed {
+    .sidebar_inner_shadow {
+        position: fixed;
+        top: 75px;
+        right: -100%;
+        left: -100%;
+        z-index: 28;
+        display: block;
+        height: 5px;
+        content: "";
+        background: linear-gradient(rgba(0, 0, 0, 0.075), rgba(0, 0, 0, 0.001)) repeat-x 0 0;
+        border-top: 1px solid rgba(0, 0, 0, 0.15);
+    }
+    .fpath-placeholder {
+        visibility: visible !important;
+    }
+}
+
 .diffset-menu {
     margin-bottom: 20px;
 }
@@ -725,14 +784,27 @@ input.filediff-collapse-state {
     }
 }
 
+.filelist {
+    .pill {
+        display: block;
+        float: left;
+        padding: @pill-padding-small;
+    }
+}
+
 .pill {
     display: block;
     float: left;
     padding: @pill-padding;
 }
+
 .pill-group {
     .pill {
         opacity: .8;
+        margin-right: 3px;
+        font-size: 12px;
+        font-weight: normal;
+
         &:first-child {
             border-radius: @border-radius 0 0 @border-radius;
         }
@@ -741,6 +813,7 @@ input.filediff-collapse-state {
         }
         &:only-child {
             border-radius: @border-radius;
+            margin-right: 0;
         }
     }
 }
@@ -815,6 +888,56 @@ input.filediff-collapse-state {
         }
     }
 
+    .filediff-collapse-button, .filediff-expand-button {
+        cursor: pointer;
+    }
+    .filediff-collapse-button {
+        display: inline;
+    }
+    .filediff-expand-button {
+        display: none;
+    }
+    .filediff-collapsed .filediff-collapse-button {
+        display: none;
+    }
+    .filediff-collapsed .filediff-expand-button {
+        display: inline;
+    }
+
+    /**** COMMENTS ****/
+
+    .filediff-menu {
+        .show-comment-button {
+            display: none;
+        }
+    }
+    &.hide-comments {
+        .inline-comments {
+            display: none;
+        }
+        .filediff-menu {
+            .show-comment-button {
+                display: inline;
+            }
+            .hide-comment-button {
+                display: none;
+            }
+        }
+    }
+
+    .hide-line-comments {
+        .inline-comments {
+            display: none;
+        }
+    }
+
+    /**** END COMMENTS ****/
+
+}
+
+
+
+.filediff, .filelist {
     .pill {
         &[op="name"] {
             background: none;
@@ -868,53 +991,8 @@ input.filediff-collapse-state {
             color: white;
         }
     }
-
-    .filediff-collapse-button, .filediff-expand-button {
-        cursor: pointer;
-    }
-    .filediff-collapse-button {
-        display: inline;
-    }
-    .filediff-expand-button {
-        display: none;
-    }
-    .filediff-collapsed .filediff-collapse-button {
-        display: none;
-    }
-    .filediff-collapsed .filediff-expand-button {
-        display: inline;
-    }
-
-    /**** COMMENTS ****/
+}
 
-    .filediff-menu {
-        .show-comment-button {
-            display: none;
-        }
-    }
-    &.hide-comments {
-        .inline-comments {
-            display: none;
-        }
-        .filediff-menu {
-            .show-comment-button {
-                display: inline;
-            }
-            .hide-comment-button {
-                display: none;
-            }
-        }
-    }
-
-    .hide-line-comments {
-        .inline-comments {
-            display: none;
-        }
-    }
-
-    /**** END COMMENTS ****/
-
-}
 
 .filediff-outdated {
     padding: 8px 0;
@@ -950,6 +1028,9 @@ table.cb {
         .cb-collapse {
             display: none;
         }
+        .cb-hunk {
+            display: none;
+        }
     }
 
     /* intentionally general selector since .cb-line-selected must override it
@@ -976,8 +1057,18 @@ table.cb {
             border-top: 1px solid #eee;
         }
 
+        &.cb-comment-info {
+            border-top: 1px solid #eee;
+            color: rgba(0, 0, 0, 0.3);
+            background: #edf2f9;
+
+            td {
+
+            }
+        }
+
         &.cb-hunk {
-            font-family: @font-family-monospace;
+            font-family: @text-monospace;
             color: rgba(0, 0, 0, 0.3);
 
             td {
@@ -1009,11 +1100,22 @@ table.cb {
                 padding-right: @cb-line-code-padding;
                 display: block;
                 white-space: pre-wrap;
-                font-family: @font-family-monospace;
+                font-family: @text-monospace;
                 word-break: break-all;
                 .nonl {
                     color: @color5;
                 }
+                .cb-action {
+                    &:before {
+                        content: "  ";
+                    }
+                    &.cb-deletion:before {
+                        content: "- ";
+                    }
+                    &.cb-addition:before {
+                        content: "+ ";
+                    }
+                }
             }
 
             &> button.cb-comment-box-opener {
@@ -1043,11 +1145,14 @@ table.cb {
         &.cb-data {
             text-align: right;
             width: 30px;
-            font-family: @font-family-monospace;
+            font-family: @text-monospace;
 
             .icon-comment {
                 cursor: pointer;
             }
+            &.cb-line-selected {
+                background: @comment-highlight-color !important;
+            }
             &.cb-line-selected > div {
                 display: block;
                 background: @comment-highlight-color !important;
@@ -1062,13 +1167,15 @@ table.cb {
             color: rgba(0, 0, 0, 0.3);
             text-align: right;
             border-right: 1px solid #eee;
-            font-family: @font-family-monospace;
+            font-family: @text-monospace;
+            -webkit-user-select: none;
+            -moz-user-select: none;
             user-select: none;
 
             a::before {
                 content: attr(data-line-no);
             }
-            &.cb-line-selected a {
+            &.cb-line-selected {
                 background: @comment-highlight-color !important;
             }
 
diff --git a/rhodecode/public/css/comments.less b/rhodecode/public/css/comments.less
--- a/rhodecode/public/css/comments.less
+++ b/rhodecode/public/css/comments.less
@@ -62,6 +62,7 @@ tr.inline-comments div {
     line-height: .8em;
 
     font-family: @text-italic;
+    font-style: italic;
     background: #fff none;
     color: @grey4;
     border: 1px solid @grey4;
@@ -72,6 +73,8 @@ tr.inline-comments div {
 
     &.todo {
         color: @color5;
+        font-style: italic;
+        font-weight: @text-bold-italic-weight;
         font-family: @text-bold-italic;
     }
 
@@ -92,6 +95,7 @@ tr.inline-comments div {
         color: @color1;
         margin: 2px 8px;
         font-family: @text-italic;
+        font-style: italic;
     }
 }
 
@@ -336,7 +340,7 @@ div.comment-form {
 .comment-form textarea {
     width: 100%;
     height: 100px;
-    font-family: 'Monaco', 'Courier', 'Courier New', monospace;
+    font-family: @text-monospace;
 }
 
 form.comment-form {
diff --git a/rhodecode/public/css/diff.less b/rhodecode/public/css/diff.less
--- a/rhodecode/public/css/diff.less
+++ b/rhodecode/public/css/diff.less
@@ -95,6 +95,7 @@ div.diffblock.margined.comm tr {
 
     .compare-label {
         clear: both;
+        font-weight: @text-semibold-weight;
         font-family: @text-semibold;
     }
 }
diff --git a/rhodecode/public/css/fonts.less b/rhodecode/public/css/fonts.less
deleted file mode 100644
--- a/rhodecode/public/css/fonts.less
+++ /dev/null
@@ -1,51 +0,0 @@
-
-@font-face {
-    font-family: 'proximanovaregular';
-    src: url('../fonts/ProximaNova/ProximaNova-Regular.eot'); /* IE9 Compat Modes */
-    src: url('../fonts/ProximaNova/ProximaNova-Regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
-         url('../fonts/ProximaNova/ProximaNova-Regular.woff') format('woff'), /* Modern Browsers */
-         url('../fonts/ProximaNova/ProximaNova-Regular.ttf') format('truetype'); 
-    font-style: normal;
-    font-weight: normal;
-    text-rendering: optimizeLegibility;
-}
-@font-face {
-    font-family: 'proximanovaitalic';
-    src: url('../fonts/ProximaNova/ProximaNova-Italic.eot'); /* IE9 Compat Modes */
-    src: url('../fonts/ProximaNova/ProximaNova-Italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
-         url('../fonts/ProximaNova/ProximaNova-Italic.woff') format('woff'), /* Modern Browsers */
-         url('../fonts/ProximaNova/ProximaNova-Italic.ttf') format('truetype'); 
-    font-style: italic;
-    font-weight: normal;
-    text-rendering: optimizeLegibility;
-}
-@font-face {
-    font-family: 'proximanovasemibold';
-    src: url('../fonts/ProximaNova/ProximaNova-Semibold.eot'); /* IE9 Compat Modes */
-    src: url('../fonts/ProximaNova/ProximaNova-Semibold.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
-         url('../fonts/ProximaNova/ProximaNova-Semibold.woff') format('woff'), /* Modern Browsers */
-         url('../fonts/ProximaNova/ProximaNova-Semibold.ttf') format('truetype');
-    font-style: normal;
-    font-weight: bold;
-    text-rendering: optimizeLegibility;
-}
-@font-face {
-    font-family: 'proximanovabold';
-    src: url('../fonts/ProximaNova/ProximaNova-Bold.eot'); /* IE9 Compat Modes */
-    src: url('../fonts/ProximaNova/ProximaNova-Bold.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
-         url('../fonts/ProximaNova/ProximaNova-Bold.woff') format('woff'), /* Modern Browsers */
-         url('../fonts/ProximaNova/ProximaNova-Bold.ttf') format('truetype'); 
-    font-style: normal;
-    font-weight: bold;
-    text-rendering: optimizeLegibility;
-}
-@font-face {
-    font-family: 'proximanovabolditalic';
-    src: url('../fonts/ProximaNova/ProximaNova-BoldItalic.eot'); /* IE9 Compat Modes */
-    src: url('../fonts/ProximaNova/ProximaNova-BoldItalic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
-         url('../fonts/ProximaNova/ProximaNova-BoldItalic.woff') format('woff'), /* Modern Browsers */
-         url('../fonts/ProximaNova/ProximaNova-BoldItalic.ttf') format('truetype'); 
-    font-style: italic;
-    font-weight: bold;
-    text-rendering: optimizeLegibility;
-}
\ No newline at end of file
diff --git a/rhodecode/public/css/legacy_code_styles.less b/rhodecode/public/css/legacy_code_styles.less
--- a/rhodecode/public/css/legacy_code_styles.less
+++ b/rhodecode/public/css/legacy_code_styles.less
@@ -180,7 +180,7 @@ div.markdown-block table {
     margin: 3px 0px 13px 0px !important;
     color: #424242 !important;
     font-size: 13px !important;
-    font-family: "Helvetica" !important;
+    font-family: @text-regular;
     font-weight: normal  !important;
     overflow: visible !important;
     line-height: 140% !important;
@@ -256,7 +256,7 @@ div.markdown-block code,
 div.markdown-block pre,
 div.markdown-block #ws,
 div.markdown-block #message {
-    font-family: Monaco;
+    font-family: @text-monospace;
     font-size: 11px;
     .border-radius(@border-radius);
     background-color: white;
diff --git a/rhodecode/public/css/main-content.less b/rhodecode/public/css/main-content.less
--- a/rhodecode/public/css/main-content.less
+++ b/rhodecode/public/css/main-content.less
@@ -91,7 +91,7 @@
 }
 
 .input-monospace {
-    font-family: @font-family-monospace;
+    font-family: @text-monospace;
 }
 
 .fields {
diff --git a/rhodecode/public/css/main.less b/rhodecode/public/css/main.less
--- a/rhodecode/public/css/main.less
+++ b/rhodecode/public/css/main.less
@@ -5,7 +5,6 @@
 @import 'helpers';
 @import 'mixins';
 @import 'rcicons';
-@import 'fonts';
 @import 'variables';
 @import 'bootstrap-variables';
 @import 'form-bootstrap';
@@ -30,16 +29,17 @@
 
 //--- BASE ------------------//
 .noscript-error {
-    top: 0;
-    left: 0;
-    width: 100%;
-    z-index: 101;
-    text-align: center;
-    font-family: @text-semibold;
-    font-size: 120%;
-    color: white;
-    background-color: @alert2;
-    padding: 5px 0 5px 0;
+  top: 0;
+  left: 0;
+  width: 100%;
+  z-index: 101;
+  text-align: center;
+  font-size: 120%;
+  color: white;
+  background-color: @alert2;
+  padding: 5px 0 5px 0;
+  font-weight: @text-semibold-weight;
+  font-family: @text-semibold;
 }
 
 html {
@@ -161,8 +161,9 @@ input.inline[type="file"] {
     }
 
     .error-branding {
-        font-family: @text-semibold;
-        color: @grey4;
+      color: @grey4;
+      font-weight: @text-semibold-weight;
+      font-family: @text-semibold;
     }
 
     .error_message {
@@ -214,8 +215,9 @@ input.inline[type="file"] {
         }
 
         h4 {
-            margin: 0 0 @padding;
-            font-family: @text-semibold;
+          margin: 0 0 @padding;
+          font-weight: @text-semibold-weight;
+          font-family: @text-semibold;
         }
     }
 }
@@ -349,10 +351,11 @@ ul.auth_plugins {
 // Pull Requests
 
 .pullrequests_section_head {
-	display: block;
-	clear: both;
-	margin: @padding 0;
-	font-family: @text-bold;
+  display: block;
+  clear: both;
+  margin: @padding 0;
+  font-weight: @text-bold-weight;
+  font-family: @text-bold;
 }
 
 .pr-origininfo, .pr-targetinfo {
@@ -391,14 +394,15 @@ ul.auth_plugins {
 
 
 #pr-title-input {
-    width: 72%;
-    font-size: 1em;
-    font-family: @text-bold;
-    margin: 0;
-    padding: 0 0 0 @padding/4;
-    line-height: 1.7em;
-    color: @text-color;
-    letter-spacing: .02em;
+  width: 72%;
+  font-size: 1em;
+  margin: 0;
+  padding: 0 0 0 @padding/4;
+  line-height: 1.7em;
+  color: @text-color;
+  letter-spacing: .02em;
+  font-weight: @text-bold-weight;
+  font-family: @text-bold;
 }
 
 #pullrequest_title {
@@ -471,19 +475,20 @@ ul.auth_plugins {
 
 // Server Announcement
 #server-announcement {
-    width: 95%;
-    margin: @padding auto;
-    padding: @padding;
-    border-width: 2px;
-    border-style: solid;
-    .border-radius(2px);
-    font-family: @text-bold;
-
-    &.info    { border-color: @alert4; background-color: @alert4-inner; }
-    &.warning { border-color: @alert3; background-color: @alert3-inner; }
-    &.error   { border-color: @alert2; background-color: @alert2-inner; }
-    &.success { border-color: @alert1; background-color: @alert1-inner; }
-    &.neutral { border-color: @grey3; background-color: @grey6; }
+  width: 95%;
+  margin: @padding auto;
+  padding: @padding;
+  border-width: 2px;
+  border-style: solid;
+  .border-radius(2px);
+  font-weight: @text-bold-weight;
+  font-family: @text-bold;
+
+  &.info    { border-color: @alert4; background-color: @alert4-inner; }
+  &.warning { border-color: @alert3; background-color: @alert3-inner; }
+  &.error   { border-color: @alert2; background-color: @alert2-inner; }
+  &.success { border-color: @alert1; background-color: @alert1-inner; }
+  &.neutral { border-color: @grey3; background-color: @grey6; }
 }
 
 // Fixed Sidebar Column
@@ -618,11 +623,6 @@ input::-moz-focus-inner { border:0; padd
 	display: block;
 }
 
-//TODO: lisa: this should be in tables
-.show_more_col {
-    width: 20px;
-}
-
 //FORMS
 
 .medium-inline,
@@ -1546,19 +1546,15 @@ table.integrations {
 
 .show_more {
     display: inline-block;
-    position: relative;
+    width: 0;
+    height: 0;
     vertical-align: middle;
-    width: 4px;
-    height: @basefontsize;
-
-    &:after {
-        content: "\00A0\25BE";
-        display: inline-block;
-        width:10px;
-        line-height: 5px;
-        font-size: 12px;
-        cursor: pointer;
-    }
+    content: "";
+    border: 4px solid;
+    border-right-color: transparent;
+    border-bottom-color: transparent;
+    border-left-color: transparent;
+    font-size: 0;
 }
 
 .journal_more .show_more {
@@ -1569,13 +1565,6 @@ table.integrations {
     }
 }
 
-.open .show_more:after,
-.select2-dropdown-open .show_more:after {
-    .rotate(180deg);
-    margin-left: 4px;
-}
-
-
 .compare_view_commits .collapse_commit:after {
     cursor: pointer;
     content: "\00A0\25B4";
@@ -2214,9 +2203,10 @@ h3.files_location{
 		margin-left: 0.5em;
 		display: inline-block;
 
-		em{
-			font-family: @text-bold;
-		}
+		em {
+          font-weight: @text-bold-weight;
+          font-family: @text-bold;
+        }
 	}
 }
 
@@ -2250,7 +2240,6 @@ h3.files_location{
 
 div.search-feedback-items {
 	display: inline-block;
-	padding:0px 0px 0px 96px;
 }
 
 div.search-code-body {
@@ -2388,6 +2377,21 @@ table.dataTable {
     }
 }
 
+table.rctable {
+  &.permissions {
+
+    th.td-owner {
+      padding: 0;
+    }
+
+    th {
+      font-weight: normal;
+      padding: 0 5px;
+    }
+
+  }
+}
+
 
 // TODO: johbo: Fix for IE10, this avoids that we see a border
 // and padding around checkboxes and radio boxes. Move to the right place,
@@ -2443,7 +2447,7 @@ div.markup-form {
 .markup-form textarea {
     width: 100%;
     height: 100px;
-    font-family: 'Monaco', 'Courier', 'Courier New', monospace;
+    font-family: @text-monospace;
 }
 
 form.markup-form {
diff --git a/rhodecode/public/css/navigation.less b/rhodecode/public/css/navigation.less
--- a/rhodecode/public/css/navigation.less
+++ b/rhodecode/public/css/navigation.less
@@ -119,11 +119,6 @@
         &.has_select2 a {
             display: block;
             padding: 10px 0 2px;
-
-            .show_more {
-                margin-top: -4px;
-                padding-right: .5em;
-            }
         }
 
         .menulabel {
@@ -170,17 +165,13 @@
 
             &:hover { color: @grey1; }
         }
-
-        .show_more {
-            padding-left: .5em;
-        }
     }
 
     #quick_login_link {
         display: inline-block;
 
         .gravatar {
-            border: 1px solid @grey2;
+            border: 1px solid @grey5;
         }
 
         .gravatar-login {
@@ -205,6 +196,10 @@
             &:hover #quick_login_link {
                 color: inherit;
             }
+
+            .menu_link_user {
+                padding: 0 2px;
+            }
         }
 
         &:before { content: none; }
@@ -649,7 +644,7 @@ ul#context-pages {
     border-bottom: 1px solid @grey4;
     display: inline-block;
     vertical-align: top;
-    margin-left: -5px;
+    margin-left: -7px;
     background: @grey3;
 }
 
@@ -673,10 +668,11 @@ ul#context-pages {
 }
 
 .main_filter_input {
-    padding: 6px;
+    padding: 5px;
     min-width: 220px;
     color: @nav-grey;
     background: @grey3;
+    min-height: 18px;
 }
 
 .main_filter_input::placeholder {
diff --git a/rhodecode/public/css/rcicons.less b/rhodecode/public/css/rcicons.less
--- a/rhodecode/public/css/rcicons.less
+++ b/rhodecode/public/css/rcicons.less
@@ -90,6 +90,12 @@
 
 .icon-more:before { content: '\e815'; } /* '' */
 
+.icon-more-linked { cursor: pointer; color: @grey3 }
+.icon-more-linked:before { content: '\e815'; } /* '' */
+
+.icon-expand-linked { cursor: pointer; color: @grey3; font-size: 8px }
+.icon-expand-linked:before { content: '\e80e'; } /* '' */
+
 .icon-git-inv:before { content: '\e80f'; } /* '' */
 .icon-hg-inv:before { content: '\e810'; } /* '' */
 .icon-svn-inv:before { content: '\e811'; } /* '' */
diff --git a/rhodecode/public/css/readme-box.less b/rhodecode/public/css/readme-box.less
--- a/rhodecode/public/css/readme-box.less
+++ b/rhodecode/public/css/readme-box.less
@@ -71,7 +71,7 @@ div.readme_box table {
     margin: 3px 0px 13px 0px !important;
     color: #424242 !important;
     font-size: 13px !important;
-    font-family: "Helvetica" !important;
+    font-family: @text-regular;
     font-weight: normal  !important;
     overflow: visible !important;
     line-height: 140% !important;
@@ -136,7 +136,7 @@ div.readme_box button {
 
 div.readme_box code,
 div.readme_box pre {
-    font-family: Monaco;
+    font-family: @text-monospace;
     font-size: 11px;
     .border-radius(@border-radius);
     background-color: white;
diff --git a/rhodecode/public/css/select2.less b/rhodecode/public/css/select2.less
--- a/rhodecode/public/css/select2.less
+++ b/rhodecode/public/css/select2.less
@@ -127,11 +127,11 @@ select.select2{height:28px;visibility:hi
         &:after {
             position: absolute;
             content: "\00A0\25BE";
-            right: .6em;
+            right: .1em;
             line-height: 1em;
-            top: 0.9em;
+            top: 0.4em;
             width: 1em;
-            font-size: 1em;
+            font-size: 20px;
         }
     }
 }
@@ -198,9 +198,10 @@ select.select2{height:28px;visibility:hi
         &.select2-result-with-children {
 
             .select2-result-label {
-                font-family: @text-semibold;
                 color: @rcdarkblue;
                 cursor: default;
+                font-weight: @text-semibold-weight;
+                font-family: @text-semibold;
             }
 
             ul.select2-result-sub li .select2-result-label {
diff --git a/rhodecode/public/css/summary.less b/rhodecode/public/css/summary.less
--- a/rhodecode/public/css/summary.less
+++ b/rhodecode/public/css/summary.less
@@ -62,6 +62,7 @@
             height: 30px;
             margin: 0;
             padding: 0;
+            font-weight: @text-semibold-weight;
             font-family: @text-semibold;
         }
 
@@ -165,8 +166,14 @@
         width: 25%;
         margin: 0;
         padding: 0;
+        font-weight: @text-semibold-weight;
         font-family: @text-semibold;
     }
+
+    .left-label-summary {
+        .left-label;
+        width: 150px;
+    }
     
     .right-content { // similar to form fields
         float: left;
@@ -247,13 +254,19 @@
     display: block;
     width: 100%;
     margin: 0;
-    padding: @space 0 @padding 0;
+    padding: @space 0 10px 0;
     border-top: @border-thickness solid @border-default-color; 
 
     .stats {
         float: left;
         width: 50%;
     }
+    .stats-filename {
+        font-size: 120%;
+    }
+    .stats-first-item {
+        padding: 0px 0px 0px 3px;
+    }
 
     .buttons {
         float: right;
diff --git a/rhodecode/public/css/tables.less b/rhodecode/public/css/tables.less
--- a/rhodecode/public/css/tables.less
+++ b/rhodecode/public/css/tables.less
@@ -65,13 +65,9 @@ table.dataTable {
         background-color: @grey7;
     }
 
-    .td-radio + .td-owner {
-        padding-left: 1em;
-    }
-
-
     th {
         text-align: left;
+        font-weight: @text-semibold-weight;
         font-family: @text-semibold;
     }
 
@@ -139,7 +135,7 @@ table.dataTable {
                 white-space: nowrap;
                 overflow: hidden;
                 text-overflow: ellipsis;
-                max-width: 450px;
+                max-width: 350px;
             }
         }
 
@@ -234,6 +230,8 @@ table.dataTable {
         &.expand_commit {
             padding-right: 0;
             padding-left: 1em;
+            cursor: pointer;
+            width: 20px;
         }
     }
 
@@ -327,6 +325,7 @@ table#repo_list_table {
 table.keyboard-mappings {
     th {
         text-align: left;
+        font-weight: @text-semibold-weight;
         font-family: @text-semibold;
     }
 }
@@ -372,6 +371,7 @@ table.keyboard-mappings {
 table.rctable.dl-settings {
     td {
         border: none;
+        vertical-align: baseline;
     }
 }
 
@@ -447,6 +447,8 @@ table.trending_language_tbl {
 
         &.expand_commit {
             padding-right: 0;
+            cursor: pointer;
+            width: 20px;
         }
     }
 }
diff --git a/rhodecode/public/css/type.less b/rhodecode/public/css/type.less
--- a/rhodecode/public/css/type.less
+++ b/rhodecode/public/css/type.less
@@ -35,16 +35,16 @@ h1, h2, h3, h4, h5, h6,
   }
 }
 
-h1, .h1 { font-size: 1.54em; font-family: @text-bold; }
-h2, .h2 { font-size: 1.23em; font-family: @text-semibold; }
-h3, .h3 { font-size: 1.23em; font-family: @text-regular; }
-h4, .h4 { font-size: 1em;    font-family: @text-bold; }
-h5, .h5 { font-size: 1em;    font-family: @text-bold-italic; }
-h6, .h6 { font-size: 1em;    font-family: @text-bold-italic; }
+h1, .h1 { font-size: 1.54em; font-weight: @text-bold-weight;     font-family: @text-bold; }
+h2, .h2 { font-size: 1.23em; font-weight: @text-semibold-weight; font-family: @text-semibold;  }
+h3, .h3 { font-size: 1.23em;                                     font-family: @text-regular; }
+h4, .h4 { font-size: 1em;    font-weight: @text-bold-weight;     font-family: @text-bold; }
+h5, .h5 { font-size: 1em;    font-weight: @text-bold-weight;     font-family: @text-bold; }
+h6, .h6 { font-size: 1em;    font-weight: @text-bold-weight;     font-family: @text-bold; }
 
 // Breadcrumbs
 .breadcrumbs {
-    &:extend(h1);
+    font-size: @repo-title-fontsize;
     margin: 0;
 }
 
@@ -95,15 +95,19 @@ img {
 }
 
 strong {
+  font-weight: @text-bold-weight;
   font-family: @text-bold;
 }
 
 em {
   font-family: @text-italic;
+  font-style: italic;
 }
 
 strong em,
 em strong {
+  font-style: italic;
+  font-weight: @text-bold-italic-weight;
   font-family: @text-bold-italic;
 }
 
@@ -230,7 +234,7 @@ mark,
     width: 100%;
     margin: @pagepadding/2 0 @pagepadding;
 
-    .breadcrumbs{
+    .breadcrumbs {
         float: left;
         clear: both;
         width: 700px;
@@ -384,6 +388,7 @@ dd {
 
 dt {
   margin: @textmargin 0 0 0;
+  font-weight: @text-bold-weight;
   font-family: @text-bold;
 }
 
diff --git a/rhodecode/public/css/variables.less b/rhodecode/public/css/variables.less
--- a/rhodecode/public/css/variables.less
+++ b/rhodecode/public/css/variables.less
@@ -53,16 +53,26 @@
 @text-color: @grey2;
 @repo-title-fontsize: 18px;
 
-@text-regular: "proximanovaregular","Proxima Nova Regular", "Proxima Nova", sans-serif;
-@text-italic: "proximanovaitalic","Proxima Nova Italic", "Proxima Nova", sans-serif;
-@text-bold: "proximanovabold","Proxima Nova Bold", "Proxima Nova", sans-serif;
-@text-semibold: "proximanovasemibold","Proxima Nova Semibold", "Proxima Nova", sans-serif;
-@text-bold-italic: "proximanovabolditalic","Proxima Nova Bold Italic", "Proxima Nova", sans-serif;
-@text-code: "Lucida Console", Menlo, Monaco, monospace;
+@text-regular: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+@text-monospace: 'Menlo', 'Liberation Mono', 'Consolas', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console', monospace;
+
+@text-italic: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+
+@text-bold: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+@text-bold-weight: 600;
+
+@text-semibold: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+@text-semibold-weight: 500;
+
+@text-bold-italic: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+@text-bold-italic-weight: 600;
+
+@text-code: @text-monospace;
 @text-light: @text-regular;
-@text-light-italic: @text-italic;
+
+
 // Used for .close buttons
-@text-bootstrap: "Helvetica Neue", Helvetica, Arial, sans-serif;
+@text-bootstrap: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 
 @panel-title: @basefontsize;
 @panel-footer: @basefontsize;
diff --git a/rhodecode/public/fonts/ProximaNova/ProximaNova-Bold.eot b/rhodecode/public/fonts/ProximaNova/ProximaNova-Bold.eot
deleted file mode 100755
index 59ced842ce4973c035fb5dd1f24e029ca63d16b9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@
-
-
-
-
-    
-    
-
diff --git a/rhodecode/public/js/src/components/channelstream-connection/channelstream-connection.js b/rhodecode/public/js/src/components/channelstream-connection/channelstream-connection.js
--- a/rhodecode/public/js/src/components/channelstream-connection/channelstream-connection.js
+++ b/rhodecode/public/js/src/components/channelstream-connection/channelstream-connection.js
@@ -1,6 +1,81 @@
+import {Polymer, html} from '@polymer/polymer/polymer-legacy';
+import '@polymer/iron-ajax/iron-ajax.js';
+
+const elemTemplate =  html`
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+`
+
 Polymer({
     is: 'channelstream-connection',
 
+    _template: elemTemplate,
+
     /**
      * Fired when `channels` array changes.
      *
diff --git a/rhodecode/public/js/src/components/index.js b/rhodecode/public/js/src/components/index.js
new file mode 100644
--- /dev/null
+++ b/rhodecode/public/js/src/components/index.js
@@ -0,0 +1,7 @@
+import '@polymer/iron-ajax/iron-ajax.js';
+import './shared-styles.js';
+import './channelstream-connection/channelstream-connection.js';
+import './rhodecode-toast/rhodecode-toast.js';
+import './rhodecode-toggle/rhodecode-toggle.js';
+import './rhodecode-unsafe-html/rhodecode-unsafe-html.js';
+import './rhodecode-app/rhodecode-app.js';
diff --git a/rhodecode/public/js/src/components/rhodecode-app/rhodecode-app.html b/rhodecode/public/js/src/components/rhodecode-app/rhodecode-app.html
deleted file mode 100644
--- a/rhodecode/public/js/src/components/rhodecode-app/rhodecode-app.html
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-    
-    
-
diff --git a/rhodecode/public/js/src/components/rhodecode-app/rhodecode-app.js b/rhodecode/public/js/src/components/rhodecode-app/rhodecode-app.js
--- a/rhodecode/public/js/src/components/rhodecode-app/rhodecode-app.js
+++ b/rhodecode/public/js/src/components/rhodecode-app/rhodecode-app.js
@@ -1,9 +1,31 @@
-ccLog = Logger.get('RhodeCodeApp');
+import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
+import '../channelstream-connection/channelstream-connection.js';
+import '../rhodecode-toast/rhodecode-toast.js';
+import '../rhodecode-favicon/rhodecode-favicon.js';
+
+var ccLog = Logger.get('RhodeCodeApp');
 ccLog.setLevel(Logger.OFF);
 
-var rhodeCodeApp = Polymer({
-    is: 'rhodecode-app',
-    attached: function () {
+export class RhodecodeApp extends PolymerElement {
+
+    static get is() {
+        return 'rhodecode-app';
+    }
+
+    static get template(){
+        return html`
+        
+        
+        
+        `
+    }
+
+    connectedCallback() {
+        super.connectedCallback();
         ccLog.debug('rhodeCodeApp created');
         $.Topic('/notifications').subscribe(this.handleNotifications.bind(this));
         $.Topic('/favicon/update').subscribe(this.faviconUpdate.bind(this));
@@ -21,46 +43,47 @@ var rhodeCodeApp = Polymer({
         $(document).ready(function () {
             this.kickoffChannelstreamPlugin();
         }.bind(this));
-    },
+    }
 
-    initPlugins: function(){
+    initPlugins() {
         for (var i = 0; i < window.APPLICATION_PLUGINS.length; i++) {
             var pluginDef = window.APPLICATION_PLUGINS[i];
-            if (pluginDef.component){
+            if (pluginDef.component) {
                 var pluginElem = document.createElement(pluginDef.component);
                 this.shadowRoot.appendChild(pluginElem);
-                if (typeof pluginElem.init !== 'undefined'){
+                if (typeof pluginElem.init !== 'undefined') {
                     pluginElem.init();
                 }
             }
         }
-    },
+    }
+
     /** proxy to channelstream connection */
-    getChannelStreamConnection: function () {
+    getChannelStreamConnection() {
         return this.$['channelstream-connection'];
-    },
+    }
 
-    handleNotifications: function (data) {
+    handleNotifications(data) {
         var elem = document.getElementById('notifications');
-        if(elem){
+        if (elem) {
             elem.handleNotification(data);
         }
 
-    },
+    }
 
-    faviconUpdate: function (data) {
+    faviconUpdate(data) {
         this.shadowRoot.querySelector('rhodecode-favicon').counter = data.count;
-    },
+    }
 
     /** opens connection to ws server */
-    kickoffChannelstreamPlugin: function (data) {
+    kickoffChannelstreamPlugin(data) {
         ccLog.debug('kickoffChannelstreamPlugin');
         var channels = ['broadcast'];
         var addChannels = this.checkViewChannels();
         for (var i = 0; i < addChannels.length; i++) {
             channels.push(addChannels[i]);
         }
-        if (window.CHANNELSTREAM_SETTINGS && CHANNELSTREAM_SETTINGS.enabled){
+        if (window.CHANNELSTREAM_SETTINGS && CHANNELSTREAM_SETTINGS.enabled) {
             var channelstreamConnection = this.getChannelStreamConnection();
             channelstreamConnection.connectUrl = CHANNELSTREAM_URLS.connect;
             channelstreamConnection.subscribeUrl = CHANNELSTREAM_URLS.subscribe;
@@ -74,9 +97,9 @@ var rhodeCodeApp = Polymer({
             $.Topic('/connection_controller/subscribe').processPrepared();
             channelstreamConnection.connect();
         }
-    },
+    }
 
-    checkViewChannels: function () {
+    checkViewChannels() {
         // subscribe to different channels data is sent.
 
         var channels = [];
@@ -94,10 +117,10 @@ var rhodeCodeApp = Polymer({
         }
 
         return channels;
-    },
+    }
 
     /** subscribes users from channels in channelstream */
-    subscribeToChannelTopic: function (channels) {
+    subscribeToChannelTopic(channels) {
         var channelstreamConnection = this.getChannelStreamConnection();
         var toSubscribe = channelstreamConnection.calculateSubscribe(channels);
         ccLog.debug('subscribeToChannelTopic', toSubscribe);
@@ -113,34 +136,35 @@ var rhodeCodeApp = Polymer({
                 }
             }
         }
-    },
+    }
 
     /** publish received messages into correct topic */
-    receivedMessage: function (event) {
+    receivedMessage(event) {
         for (var i = 0; i < event.detail.length; i++) {
             var message = event.detail[i];
             if (message.message.topic) {
                 ccLog.debug('publishing', message.message.topic);
                 $.Topic(message.message.topic).publish(message);
             }
-            else if (message.type === 'presence'){
+            else if (message.type === 'presence') {
                 $.Topic('/connection_controller/presence').publish(message);
             }
             else {
                 ccLog.warn('unhandled message', message);
             }
         }
-    },
+    }
 
-    handleConnected: function (event) {
+    handleConnected(event) {
         var channelstreamConnection = this.getChannelStreamConnection();
         channelstreamConnection.set('channelsState',
             event.detail.channels_info);
         channelstreamConnection.set('userState', event.detail.state);
         channelstreamConnection.set('channels', event.detail.channels);
         this.propagageChannelsState();
-    },
-    handleSubscribed: function (event) {
+    }
+
+    handleSubscribed(event) {
         var channelstreamConnection = this.getChannelStreamConnection();
         var channelInfo = event.detail.channels_info;
         var channelKeys = Object.keys(event.detail.channels_info);
@@ -150,9 +174,10 @@ var rhodeCodeApp = Polymer({
         }
         channelstreamConnection.set('channels', event.detail.channels);
         this.propagageChannelsState();
-    },
+    }
+
     /** propagates channel states on topics */
-    propagageChannelsState: function (event) {
+    propagageChannelsState(event) {
         var channelstreamConnection = this.getChannelStreamConnection();
         var channel_data = channelstreamConnection.channelsState;
         var channels = channelstreamConnection.channels;
@@ -163,4 +188,7 @@ var rhodeCodeApp = Polymer({
             );
         }
     }
-});
+
+}
+
+customElements.define(RhodecodeApp.is, RhodecodeApp);
diff --git a/rhodecode/public/js/src/components/rhodecode-favicon/rhodecode-favicon.html b/rhodecode/public/js/src/components/rhodecode-favicon/rhodecode-favicon.html
deleted file mode 100644
--- a/rhodecode/public/js/src/components/rhodecode-favicon/rhodecode-favicon.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-    
-    
-
diff --git a/rhodecode/public/js/src/components/rhodecode-favicon/rhodecode-favicon.js b/rhodecode/public/js/src/components/rhodecode-favicon/rhodecode-favicon.js
--- a/rhodecode/public/js/src/components/rhodecode-favicon/rhodecode-favicon.js
+++ b/rhodecode/public/js/src/components/rhodecode-favicon/rhodecode-favicon.js
@@ -1,20 +1,33 @@
-Polymer({
-    is: 'rhodecode-favicon',
-    properties: {
-        favicon: Object,
-        counter: {
-            type: Number,
-            observer: '_handleCounter'
+import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
+
+export class RhodecodeFavicon extends PolymerElement {
+
+    static get is() {
+        return 'rhodecode-favicon';
+    }
+
+    static get properties() {
+        return {
+            favicon: Object,
+            counter: {
+                type: Number,
+                observer: '_handleCounter'
+            }
         }
-    },
+    }
 
-    ready: function () {
+    connectedCallback() {
+        super.connectedCallback();
         this.favicon = new Favico({
             type: 'rectangle',
             animation: 'none'
         });
-    },
-    _handleCounter: function (newVal, oldVal) {
+    }
+
+    _handleCounter(newVal, oldVal) {
         this.favicon.badge(this.counter);
     }
-});
+
+}
+
+customElements.define(RhodecodeFavicon.is, RhodecodeFavicon);
diff --git a/rhodecode/public/js/src/components/rhodecode-legacy-js/rhodecode-legacy-js.html b/rhodecode/public/js/src/components/rhodecode-legacy-js/rhodecode-legacy-js.html
deleted file mode 100644
--- a/rhodecode/public/js/src/components/rhodecode-legacy-js/rhodecode-legacy-js.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-    
-    
-
diff --git a/rhodecode/public/js/src/components/rhodecode-legacy-js/rhodecode-legacy-js.js b/rhodecode/public/js/src/components/rhodecode-legacy-js/rhodecode-legacy-js.js
deleted file mode 100644
--- a/rhodecode/public/js/src/components/rhodecode-legacy-js/rhodecode-legacy-js.js
+++ /dev/null
@@ -1,3 +0,0 @@
-Polymer({
-    is: 'rhodecode-legacy-js',
-});
diff --git a/rhodecode/public/js/src/components/rhodecode-toast/rhodecode-toast.html b/rhodecode/public/js/src/components/rhodecode-toast/rhodecode-toast.html
deleted file mode 100644
--- a/rhodecode/public/js/src/components/rhodecode-toast/rhodecode-toast.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-    
-
-    
-
diff --git a/rhodecode/public/js/src/components/rhodecode-toast/rhodecode-toast.js b/rhodecode/public/js/src/components/rhodecode-toast/rhodecode-toast.js
--- a/rhodecode/public/js/src/components/rhodecode-toast/rhodecode-toast.js
+++ b/rhodecode/public/js/src/components/rhodecode-toast/rhodecode-toast.js
@@ -1,98 +1,231 @@
-Polymer({
-    is: 'rhodecode-toast',
-    properties: {
-        toasts: {
-            type: Array,
-            value: function(){
-                return []
+import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
+import '@polymer/paper-toggle-button/paper-toggle-button.js';
+import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js';
+import {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';
+import '../rhodecode-unsafe-html/rhodecode-unsafe-html.js';
+
+export class RhodecodeToast extends mixinBehaviors([IronA11yKeysBehavior], PolymerElement) {
+
+    static get is() {
+        return 'rhodecode-toast';
+    }
+
+    static get template(){
+        return html`
+        
+
+        
+        `
+    }
+
+    static get properties() {
+        return {
+            toasts: {
+                type: Array,
+                value() {
+                    return []
+                }
+            },
+            isFixed: {
+                type: Boolean,
+                value: false
+            },
+            hasToasts: {
+                type: Boolean,
+                computed: '_computeHasToasts(toasts.*)'
+            },
+            keyEventTarget: {
+                type: Object,
+                value() {
+                    return document.body;
+                }
             }
         }
-    },
-    behaviors: [
-        Polymer.IronA11yKeysBehavior
-    ],
-    observers: [
-        '_changedToasts(toasts.splices)'
-    ],
+    }
+
+    get keyBindings() {
+        return {
+            'esc:keyup': '_hideOnEsc'
+        }
+    }
 
-    keyBindings: {
-      'esc:keyup': '_hideOnEsc'
-    },
+    static get observers() {
+        return [
+            '_changedToasts(toasts.splices)'
+        ]
+    }
 
-    _hideOnEsc: function (event) {
+    _hideOnEsc(event) {
         return this.dismissNotifications();
-    },
+    }
 
-    _computeHasToasts: function(){
+    _computeHasToasts() {
         return this.toasts.length > 0;
-    },
+    }
 
-    _debouncedCalc: function(){
+    _debouncedCalc() {
         // calculate once in a while
         this.debounce('debouncedCalc', this.toastInWindow, 25);
-    },
+    }
 
-    conditionalClass: function(){
-      return this.isFixed ? 'fixed': '';
-    },
+    conditionalClass() {
+        return this.isFixed ? 'fixed' : '';
+    }
 
-    toastInWindow: function() {
-        if (!this._headerNode){
+    toastInWindow() {
+        if (!this._headerNode) {
             return true
         }
         var headerHeight = this._headerNode.offsetHeight;
         var scrollPosition = window.scrollY;
 
-        if (this.isFixed){
+        if (this.isFixed) {
             this.isFixed = 1 <= scrollPosition;
         }
-        else{
+        else {
             this.isFixed = headerHeight <= scrollPosition;
         }
-    },
+    }
 
-    attached: function(){
+    connectedCallback() {
+        super.connectedCallback();
         this._headerNode = document.querySelector('.header', document);
-        this.listen(window,'scroll', '_debouncedCalc');
-        this.listen(window,'resize', '_debouncedCalc');
+        this.listen(window, 'scroll', '_debouncedCalc');
+        this.listen(window, 'resize', '_debouncedCalc');
         this._debouncedCalc();
-    },
-    _changedToasts: function(newValue, oldValue){
+    }
+
+    _changedToasts(newValue, oldValue) {
         $.Topic('/favicon/update').publish({count: this.toasts.length});
-    },
-    dismissNotification: function(e) {
-        $.Topic('/favicon/update').publish({count: this.toasts.length-1});
+    }
+
+    dismissNotification(e) {
+        $.Topic('/favicon/update').publish({count: this.toasts.length - 1});
         var idx = e.target.parentNode.indexPos
         this.splice('toasts', idx, 1);
 
-    },
-    dismissNotifications: function(){
+    }
+
+    dismissNotifications() {
         $.Topic('/favicon/update').publish({count: 0});
         this.splice('toasts', 0);
-    },
-    handleNotification: function(data){
+    }
+
+    handleNotification(data) {
         if (!templateContext.rhodecode_user.notification_status && !data.message.force) {
             // do not act if notifications are disabled
             return
         }
-        this.push('toasts',{
+        this.push('toasts', {
             level: data.message.level,
             message: data.message.message
         });
-    },
-    _gettext: _gettext
-});
+    }
+
+    _gettext(x){
+        return _gettext(x)
+    }
+
+}
+
+customElements.define(RhodecodeToast.is, RhodecodeToast);
diff --git a/rhodecode/public/js/src/components/rhodecode-toggle/rhodecode-toggle.html b/rhodecode/public/js/src/components/rhodecode-toggle/rhodecode-toggle.html
deleted file mode 100644
--- a/rhodecode/public/js/src/components/rhodecode-toggle/rhodecode-toggle.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-    
-    
-
-    
-
-    
-
\ No newline at end of file
diff --git a/rhodecode/public/js/src/components/rhodecode-toggle/rhodecode-toggle.js b/rhodecode/public/js/src/components/rhodecode-toggle/rhodecode-toggle.js
--- a/rhodecode/public/js/src/components/rhodecode-toggle/rhodecode-toggle.js
+++ b/rhodecode/public/js/src/components/rhodecode-toggle/rhodecode-toggle.js
@@ -1,16 +1,57 @@
-Polymer({
-  is: 'rhodecode-toggle',
-  properties: {
-    noSpinner: { type: Boolean, value: false, reflectToAttribute:true},
-    tooltipText: { type: String, value: "Click to toggle", reflectToAttribute:true},
-    checked: { type:  Boolean, value: false, reflectToAttribute:true},
-    active: { type: Boolean, value: false, reflectToAttribute:true, notify:true}
-  },
-  shouldShow: function(){
-    return !this.noSpinner
-  },
-  labelStatus: function(isActive){
-    return this.checked? 'Enabled' : "Disabled"
-  }
-  
-});
\ No newline at end of file
+import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
+import '@polymer/paper-toggle-button/paper-toggle-button.js';
+import '@polymer/paper-spinner/paper-spinner.js';
+import '@polymer/paper-tooltip/paper-tooltip.js';
+
+export class RhodecodeToggle extends PolymerElement {
+
+    static get is() {
+        return 'rhodecode-toggle';
+    }
+
+    static get template() {
+        return html`
+        
+        
+ [[labelStatus(checked)]] + + [[tooltipText]] + +
+ `; + } + + static get properties() { + return { + noSpinner: {type: Boolean, value: false, reflectToAttribute: true}, + tooltipText: {type: String, value: "Click to toggle", reflectToAttribute: true}, + checked: {type: Boolean, value: false, reflectToAttribute: true}, + active: {type: Boolean, value: false, reflectToAttribute: true, notify: true} + } + } + + shouldShow() { + return !this.noSpinner + } + + labelStatus(isActive) { + return this.checked ? 'Enabled' : "Disabled" + } +} + +customElements.define(RhodecodeToggle.is, RhodecodeToggle); diff --git a/rhodecode/public/js/src/components/rhodecode-unsafe-html/rhodecode-unsafe-html.html b/rhodecode/public/js/src/components/rhodecode-unsafe-html/rhodecode-unsafe-html.html deleted file mode 100644 --- a/rhodecode/public/js/src/components/rhodecode-unsafe-html/rhodecode-unsafe-html.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/rhodecode/public/js/src/components/rhodecode-unsafe-html/rhodecode-unsafe-html.js b/rhodecode/public/js/src/components/rhodecode-unsafe-html/rhodecode-unsafe-html.js --- a/rhodecode/public/js/src/components/rhodecode-unsafe-html/rhodecode-unsafe-html.js +++ b/rhodecode/public/js/src/components/rhodecode-unsafe-html/rhodecode-unsafe-html.js @@ -1,12 +1,30 @@ -Polymer({ - is: 'rhodecode-unsafe-html', - properties: { - text: { - type: String, - observer: '_handleText' +import {PolymerElement, html} from '@polymer/polymer/polymer-element.js'; + +export class RhodecodeUnsafeHtml extends PolymerElement { + + static get is() { + return 'rhodecode-unsafe-html'; + } + + static get template() { + return html` + + + `; + } + + static get properties() { + return { + text: { + type: String, + observer: '_handleText' + } } - }, - _handleText: function(newVal, oldVal){ + } + + _handleText(newVal, oldVal) { this.innerHTML = this.text; } -}) +} + +customElements.define(RhodecodeUnsafeHtml.is, RhodecodeUnsafeHtml); diff --git a/rhodecode/public/js/src/components/root-styles-prefix.html b/rhodecode/public/js/src/components/root-styles-prefix.html deleted file mode 100644 --- a/rhodecode/public/js/src/components/root-styles-prefix.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/rhodecode/public/js/src/components/shared-components.html b/rhodecode/public/js/src/components/shared-components.html deleted file mode 100644 --- a/rhodecode/public/js/src/components/shared-components.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/rhodecode/public/js/src/components/shared-styles.html b/rhodecode/public/js/src/components/shared-styles.html deleted file mode 100644 --- a/rhodecode/public/js/src/components/shared-styles.html +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/rhodecode/public/js/src/components/shared-styles.js b/rhodecode/public/js/src/components/shared-styles.js new file mode 100644 --- /dev/null +++ b/rhodecode/public/js/src/components/shared-styles.js @@ -0,0 +1,12 @@ +const styleElement = document.createElement('dom-module'); +// this will use raw-loader +import sharedCSS from './style-polymer.css'; + +styleElement.innerHTML = + ``; + +styleElement.register('shared-styles'); diff --git a/rhodecode/public/js/src/rhodecode.js b/rhodecode/public/js/src/rhodecode.js --- a/rhodecode/public/js/src/rhodecode.js +++ b/rhodecode/public/js/src/rhodecode.js @@ -295,75 +295,81 @@ function scrollToElement(element, percen }); $('body').on('click', '.cb-lineno a', function(event) { + function sortNumber(a,b) { + return a - b; + } - function sortNumber(a,b) { - return a - b; + var lineNo = $(this).data('lineNo'); + var lineName = $(this).attr('name'); + + if (lineNo) { + var prevLine = $('.cb-line-selected a').data('lineNo'); + + // on shift, we do a range selection, if we got previous line + if (event.shiftKey && prevLine !== undefined) { + var prevLine = parseInt(prevLine); + var nextLine = parseInt(lineNo); + var pos = [prevLine, nextLine].sort(sortNumber); + var anchor = '#L{0}-{1}'.format(pos[0], pos[1]); + + // single click + } else { + var nextLine = parseInt(lineNo); + var pos = [nextLine, nextLine]; + var anchor = '#L{0}'.format(pos[0]); + + } + // highlight + var range = []; + for (var i = pos[0]; i <= pos[1]; i++) { + range.push(i); + } + // clear old selected lines + $('.cb-line-selected').removeClass('cb-line-selected'); + + $.each(range, function (i, lineNo) { + var line_td = $('td.cb-lineno#L' + lineNo); + + if (line_td.length) { + line_td.addClass('cb-line-selected'); // line number td + line_td.prev().addClass('cb-line-selected'); // line data + line_td.next().addClass('cb-line-selected'); // line content + } + }); + + } else if (lineName !== undefined) { // lineName only occurs in diffs + // clear old selected lines + $('td.cb-line-selected').removeClass('cb-line-selected'); + var anchor = '#{0}'.format(lineName); + var diffmode = templateContext.session_attrs.diffmode || "sideside"; + + if (diffmode === "unified") { + $(this).closest('tr').find('td').addClass('cb-line-selected'); + } else { + var activeTd = $(this).closest('td'); + activeTd.addClass('cb-line-selected'); + activeTd.next('td').addClass('cb-line-selected'); } - var lineNo = $(this).data('lineNo'); - if (lineNo) { - - // on shift, we do a range selection, if we got previous line - var prevLine = $('.cb-line-selected a').data('lineNo'); - if (event.shiftKey && prevLine !== undefined) { - var prevLine = parseInt(prevLine); - var nextLine = parseInt(lineNo); - var pos = [prevLine, nextLine].sort(sortNumber); - var anchor = '#L{0}-{1}'.format(pos[0], pos[1]); - - } else { - - var nextLine = parseInt(lineNo); - var pos = [nextLine, nextLine]; - var anchor = '#L{0}'.format(pos[0]); + } - } - // highlight - var range = []; - for (var i = pos[0]; i <= pos[1]; i++) { - range.push(i); - } - // clear selection - $('.cb-line-selected').removeClass('cb-line-selected'); - - $.each(range, function (i, lineNo) { - var line_td = $('td.cb-lineno#L' + lineNo); - if (line_td.length) { - line_td.addClass('cb-line-selected'); // line number td - line_td.prev().addClass('cb-line-selected'); // line data - line_td.next().addClass('cb-line-selected'); // line content - } - }); - - - } else { - if ($(this).attr('name') !== undefined) { - // clear selection - $('td.cb-line-selected').removeClass('cb-line-selected'); - var aEl = $(this).closest('td'); - aEl.addClass('cb-line-selected'); - aEl.next('td').addClass('cb-line-selected'); - } + // Replace URL without jumping to it if browser supports. + // Default otherwise + if (history.pushState && anchor !== undefined) { + var new_location = location.href.rstrip('#'); + if (location.hash) { + // location without hash + new_location = new_location.replace(location.hash, ""); } - // Replace URL without jumping to it if browser supports. - // Default otherwise - if (history.pushState && anchor !== undefined) { - var new_location = location.href.rstrip('#'); - if (location.hash) { - // location without hash - new_location = new_location.replace(location.hash, ""); - } + // Make new anchor url + new_location = new_location + anchor; + history.pushState(true, document.title, new_location); - // Make new anchor url - new_location = new_location + anchor; - history.pushState(true, document.title, new_location); + return false; + } - return false; - } - - }); - + }); $('.collapse_file').on('click', function(e) { e.stopPropagation(); @@ -553,3 +559,20 @@ var feedLifetimeOptions = function(query query.callback(data); }; + + +var storeUserSessionAttr = function (key, val) { + + var postData = { + 'key': key, + 'val': val, + 'csrf_token': CSRF_TOKEN + }; + + var success = function(o) { + return true + }; + + ajaxPOST(pyroutes.url('store_user_session_value'), postData, success); + return false; +}; diff --git a/rhodecode/public/js/src/rhodecode/changelog.js b/rhodecode/public/js/src/rhodecode/changelog.js --- a/rhodecode/public/js/src/rhodecode/changelog.js +++ b/rhodecode/public/js/src/rhodecode/changelog.js @@ -142,7 +142,8 @@ var CommitsController = function () { }) }; - this.expandCommit = function (node) { + this.expandCommit = function (node, reloadGraph) { + reloadGraph = reloadGraph || false; var target_expand = $(node); var cid = target_expand.data('commitId'); @@ -179,7 +180,10 @@ var CommitsController = function () { }); target_expand.addClass('open'); } - // redraw the graph - self.reloadGraph(); + + if (reloadGraph) { + // redraw the graph + self.reloadGraph(); + } } }; diff --git a/rhodecode/public/js/src/rhodecode/comments.js b/rhodecode/public/js/src/rhodecode/comments.js --- a/rhodecode/public/js/src/rhodecode/comments.js +++ b/rhodecode/public/js/src/rhodecode/comments.js @@ -774,6 +774,13 @@ var CommentsController = function() { // re trigger the linkification of next/prev navigation linkifyComments($('.inline-comment-injected')); timeagoActivate(); + + if (window.updateSticky !== undefined) { + // potentially our comments change the active window size, so we + // notify sticky elements + updateSticky() + } + commentForm.setActionButtonsDisabled(false); }; diff --git a/rhodecode/public/js/vendors/webcomponentsjs/webcomponents-lite.js b/rhodecode/public/js/vendors/webcomponentsjs/webcomponents-lite.js deleted file mode 100644 --- a/rhodecode/public/js/vendors/webcomponentsjs/webcomponents-lite.js +++ /dev/null @@ -1,230 +0,0 @@ -/** -@license @nocompile -Copyright (c) 2018 The Polymer Project Authors. All rights reserved. -This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt -The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt -The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt -Code distributed by Google as part of the polymer project is also -subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt -*/ -(function(){/* - - Copyright (c) 2016 The Polymer Project Authors. All rights reserved. - This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - Code distributed by Google as part of the polymer project is also - subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt -*/ -'use strict';var p,aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},ea="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;function ha(){ha=function(){};ea.Symbol||(ea.Symbol=ia)}var ia=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}(); -function ja(){ha();var a=ea.Symbol.iterator;a||(a=ea.Symbol.iterator=ea.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&aa(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return ka(this)}});ja=function(){}}function ka(a){var b=0;return la(function(){return b\x20\t\r\n\f]+)/i.exec(b)||["",""])[1].toLowerCase()];if(c)for(var d= -0;d"+b+"";V.body.innerHTML=b;for(a.C(V);this.content.firstChild;)k.call(this.content,this.content.firstChild);b=V.body;if(c)for(d=0;d"+this.innerHTML+""},set:function(a){if(this.parentNode){V.body.innerHTML=a;for(a=this.ownerDocument.createDocumentFragment();V.body.firstChild;)l.call(a, -V.body.firstChild);m.call(this.parentNode,a,this)}else throw Error("Failed to set the 'outerHTML' property on 'Element': This element has no parent node.");},configurable:!0})};T(a.prototype);da(a.prototype);a.C=function(c){c=b(c,"template");for(var d=0,e=c.length,f;d]/g,Lc=function(a){switch(a){case "&":return"&";case "<":return"<";case ">":return">";case '"':return""";case "\u00a0":return" "}};ca=function(a){for(var b={},c=0;c";break a;case Node.TEXT_NODE:g=g.data;g=k&&uf[k.localName]?g:g.replace(Kc,Lc); -break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),Error("not implemented");}}c+=g}return c}}if(c||rb){a.a=function(a,b){var c=f.call(a,!1);this.I&&this.I(c);b&&(l.call(c.content,f.call(a.content,!0)),tb(c.content,a.content));return c};var tb=function(c,d){if(d.querySelectorAll&&(d=b(d,"template"),0!==d.length)){c=b(c,"template");for(var e=0,f=c.length,h,g;e]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,D={Pa:function(a,b){a.href&&a.setAttribute("href",D.ba(a.getAttribute("href"),b));a.src&&a.setAttribute("src",D.ba(a.getAttribute("src"),b));if("style"===a.localName){var c=D.za(a.textContent,b,qb);a.textContent=D.za(c,b,rb)}},za:function(a,b,c){return a.replace(c, -function(a,c,d,e){a=d.replace(/["']/g,"");b&&(a=D.ba(a,b));return c+"'"+a+"'"+e})},ba:function(a,b){if(void 0===D.ha){D.ha=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";D.ha="http://a/c%20d"===c.href}catch(Kc){}}if(D.ha)return(new URL(a,b)).href;c=D.Ha;c||(c=document.implementation.createHTMLDocument("temp"),D.Ha=c,c.ra=c.createElement("base"),c.head.appendChild(c.ra),c.qa=c.createElement("a"));c.ra.href=b;c.qa.href=a;return c.qa.href||a}},ca={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a= -a.split(",");var d=a[1];d=-1e.status?b(d,a):c(d)};e.send()}else c("error: href must be specified")}},oa=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent); -k.prototype.loadImports=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){return b.o(a)})};k.prototype.o=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var d=this.a[c];d&&d.__loaded&&(a.__import=d,this.i(a))}else this.b++,this.a[c]="pending",ca.load(c,function(a,d){a=b.Wa(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.J()},function(){b.a[c]=null;b.b--;b.J()})};k.prototype.Wa=function(a,b){if(!a)return document.createDocumentFragment();oa&&(a=a.replace(V,function(a,b,c){return-1=== -a.indexOf("type=")?b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,l(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=D.ba(c.getAttribute("href"),b),c.removeAttribute("href");c=m(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"],script[type="module"]'); -var d=0;n(c,function(a){h(a);D.Pa(a,b);a.setAttribute("import-dependency","");if("script"===a.localName&&!a.src&&a.textContent){if("module"===a.type)throw Error("Inline module scripts are not supported in HTML Imports.");a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(d?"-"+d:"")+".js\n")));a.textContent="";d++}});return a};k.prototype.J=function(){var a=this;if(!this.b){this.c.disconnect();this.flatten(document);var b=!1,c=!1,d=function(){c&& -b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}),a.Ta()))};this.Ya(function(){c=!0;d()});this.Xa(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};k.prototype.Xa=function(a){function b(e){if(e]/g;function uc(a){switch(a){case "&":return"&";case "<":return"<";case ">":return">";case '"':return""";case "\u00a0":return" "}}function vc(a){for(var b={},c=0;c";break a;case Node.TEXT_NODE:g=g.data;g=k&&xc[k.localName]?g:g.replace(tc,uc);break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g), -Error("not implemented");}}c+=g}return c};var B={},E=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),F=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function zc(a){var b=[];E.currentNode=a;for(a=E.firstChild();a;)b.push(a),a=E.nextSibling();return b}B.parentNode=function(a){E.currentNode=a;return E.parentNode()};B.firstChild=function(a){E.currentNode=a;return E.firstChild()};B.lastChild=function(a){E.currentNode=a;return E.lastChild()};B.previousSibling=function(a){E.currentNode=a;return E.previousSibling()}; -B.nextSibling=function(a){E.currentNode=a;return E.nextSibling()};B.childNodes=zc;B.parentElement=function(a){F.currentNode=a;return F.parentNode()};B.firstElementChild=function(a){F.currentNode=a;return F.firstChild()};B.lastElementChild=function(a){F.currentNode=a;return F.lastChild()};B.previousElementSibling=function(a){F.currentNode=a;return F.previousSibling()};B.nextElementSibling=function(a){F.currentNode=a;return F.nextSibling()}; -B.children=function(a){var b=[];F.currentNode=a;for(a=F.firstChild();a;)b.push(a),a=F.nextSibling();return Ob(b)};B.innerHTML=function(a){return yc(a,function(a){return zc(a)})};B.textContent=function(a){switch(a.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b="",c;c=a.nextNode();)b+=c.nodeValue;return b;default:return a.nodeValue}};var G={},Ac=y.w,Bc=[Node.prototype,Element.prototype,HTMLElement.prototype];function H(a){var b;a:{for(b=0;be.assignedNodes.length&&(e.Z=!0)}e.Z&&(e.Z=!1,Yd(this,c))}b=this.g;c=[];for(e=0;ec.indexOf(d))||c.push(d);for(b=0;b "+b}))}a=a.replace(Dg,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,Oa:b,stop:f}}function Bg(a,b){a=a.split(Eg);a[0]+=b;return a.join(Eg)} -function Ag(a,b){var c=a.match(Fg);return(c=c&&c[2].trim()||"")?c[0].match(Gg)?a.replace(Fg,function(a,c,f){return b+f}):c.split(Gg)[0]===b?c:Hg:a.replace(wg,b)}function Ig(a){a.selector===Jg&&(a.selector="html")}gg.prototype.c=function(a){return a.match(zg)?this.b(a,Kg):Bg(a.trim(),Kg)};ea.Object.defineProperties(gg.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}}); -var ug=/:(nth[-\w]+)\(([^)]+)\)/,Kg=":not(.style-scope)",sg=",",xg=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,Gg=/[[.:#*]/,wg=":host",Jg=":root",zg="::slotted",vg=new RegExp("^("+zg+")"),Fg=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Cg=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Dg=/(.*):dir\((?:(ltr|rtl))\)/,qg=".",Eg=":",kg="class",Hg="should_not_match",W=new gg;function Lg(a,b,c,d){this.B=a||null;this.b=b||null;this.oa=c||[];this.L=null;this.P=d||"";this.a=this.v=this.G=null}function X(a){return a?a.__styleInfo:null}function Mg(a,b){return a.__styleInfo=b}Lg.prototype.c=function(){return this.B};Lg.prototype._getStyleRules=Lg.prototype.c;function Ng(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var Og=navigator.userAgent.match("Trident");function Pg(){}function Qg(a){var b={},c=[],d=0;Yf(a,function(a){Rg(a);a.index=d++;a=a.m.cssText;for(var c;c=Sf.exec(a);){var e=c[1];":"!==c[2]&&(b[e]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var e in b)a.push(e);return a} -function Rg(a){if(!a.m){var b={},c={};Sg(a,c)&&(b.A=c,a.rules=null);b.cssText=a.parsedCssText.replace(Vf,"").replace(Qf,"");a.m=b}}function Sg(a,b){var c=a.m;if(c){if(c.A)return Object.assign(b,c.A),!0}else{c=a.parsedCssText;for(var d;a=Qf.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}} -function Tg(a,b,c){b&&(b=0<=b.indexOf(";")?Ug(a,b,c):dg(b,function(b,e,f,h){if(!e)return b+h;(e=Tg(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=Tg(a,c[f]||f,c)||f;return b+(e||"")+h}));return b&&b.trim()||""} -function Ug(a,b,c){b=b.split(";");for(var d=0,e,f;d *"===f||"html"===f,g=0===f.indexOf(":host")&&!h;"shady"===c&&(h=f===e+" > *."+e||-1!==f.indexOf("html"),g=!h&&0===f.indexOf(e));"shadow"===c&&(h=":host > *"===f||"html"===f,g=g&&!h);if(h||g)c=e,g&&(b.s||(b.s=rg(W,b,W.b,a?qg+a:"",e)),c=b.s||e),d({ab:c,Ua:g,ub:h})}} -function Xg(a,b){var c={},d={},e=b&&b.__cssBuild;Yf(b,function(b){Wg(a,b,e,function(e){Ng.call(a.lb||a,e.ab)&&(e.Ua?Sg(b,c):Sg(b,d))})},null,!0);return{$a:d,Sa:c}} -function Yg(a,b,c,d){var e=fg(b),f=pg(e.is,e.P),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])");e=X(b).B;var g=Zg(e,d);return ng(b,e,function(b){var e="";b.m||Rg(b);b.m.cssText&&(e=Ug(a,b.m.cssText,c));b.cssText=e;if(!S&&!$f(b)&&b.cssText){var k=e=b.cssText;null==b.wa&&(b.wa=Tf.test(e));if(b.wa)if(null==b.$){b.$=[];for(var n in g)k=g[n],k=k(e),e!==k&&(e=k,b.$.push(n))}else{for(n=0;n=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));S?f.a?(f.a.textContent=e,d=f.a):e&&(d=ag(e,g,a.shadowRoot,f.b)):d?d.parentNode|| -(Og&&-132&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){g.push(e)}var d=a||"scheme start",l=0,u="",w=!1,_=!1,g=[];e:for(;(e[l-1]!=p||0==l)&&!this._isInvalid;){var b=e[l];switch(d){case"scheme start":if(!b||!m.test(b)){if(a){c("Invalid scheme.");break e}u="",d="no scheme";continue}u+=b.toLowerCase(),d="scheme";break;case"scheme":if(b&&v.test(b))u+=b.toLowerCase();else{if(":"!=b){if(a){if(p==b)break e;c("Code point not allowed in scheme: "+b);break e}u="",l=0,d="no scheme";continue}if(this._scheme=u,u="",a)break e;t(this._scheme)&&(this._isRelative=!0),d="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==b?(this._query="?",d="query"):"#"==b?(this._fragment="#",d="fragment"):p!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._schemeData+=r(b));break;case"no scheme":if(s&&t(s._scheme)){d="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=b||"/"!=e[l+1]){c("Expected /, got: "+b),d="relative";continue}d="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),p==b){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==b||"\\"==b)"\\"==b&&c("\\ is an invalid code point."),d="relative slash";else if("?"==b)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,d="query";else{if("#"!=b){var y=e[l+1],E=e[l+2];("file"!=this._scheme||!m.test(b)||":"!=y&&"|"!=y||p!=E&&"/"!=E&&"\\"!=E&&"?"!=E&&"#"!=E)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),d="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,d="fragment"}break;case"relative slash":if("/"!=b&&"\\"!=b){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),d="relative path";continue}"\\"==b&&c("\\ is an invalid code point."),d="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=b){c("Expected '/', got: "+b),d="authority ignore slashes";continue}d="authority second slash";break;case"authority second slash":if(d="authority ignore slashes","/"!=b){c("Expected '/', got: "+b);continue}break;case"authority ignore slashes":if("/"!=b&&"\\"!=b){d="authority";continue}c("Expected authority, got: "+b);break;case"authority":if("@"==b){w&&(c("@ already seen."),u+="%40"),w=!0;for(var L=0;L>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){b.push(e),g||(g=!0,m(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){g=!1;var e=b;b=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r0){var r=n[o-1],i=f(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n":return">";case" ":return" "}}function t(t){return t.replace(u,e)}var n="undefined"==typeof HTMLTemplateElement;/Trident/.test(navigator.userAgent)&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType===Node.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}();var o=function(){if(!n){var e=document.createElement("template"),t=document.createElement("template");t.content.appendChild(document.createElement("div")),e.content.appendChild(t);var o=e.cloneNode(!0);return 0===o.content.childNodes.length||0===o.content.firstChild.content.childNodes.length}}(),r="template",i=function(){};if(n){var a=document.implementation.createHTMLDocument("template"),s=!0,c=document.createElement("style");c.textContent=r+"{display:none;}";var d=document.head;d.insertBefore(c,d.firstElementChild),i.prototype=Object.create(HTMLElement.prototype),i.decorate=function(e){if(!e.content){e.content=a.createDocumentFragment();for(var n;n=e.firstChild;)e.content.appendChild(n);if(e.cloneNode=function(e){return i.cloneNode(this,e)},s)try{Object.defineProperty(e,"innerHTML",{get:function(){for(var e="",n=this.content.firstChild;n;n=n.nextSibling)e+=n.outerHTML||t(n.data);return e},set:function(e){for(a.body.innerHTML=e,i.bootstrap(a);this.content.firstChild;)this.content.removeChild(this.content.firstChild);for(;a.body.firstChild;)this.content.appendChild(a.body.firstChild)},configurable:!0})}catch(o){s=!1}i.bootstrap(e.content)}},i.bootstrap=function(e){for(var t,n=e.querySelectorAll(r),o=0,a=n.length;a>o&&(t=n[o]);o++)i.decorate(t)},document.addEventListener("DOMContentLoaded",function(){i.bootstrap(document)});var l=document.createElement;document.createElement=function(){"use strict";var e=l.apply(document,arguments);return"template"===e.localName&&i.decorate(e),e};var u=/[&\u00A0<>]/g}if(n||o){var h=Node.prototype.cloneNode;i.cloneNode=function(e,t){var n=h.call(e,!1);return this.decorate&&this.decorate(n),t&&(n.content.appendChild(h.call(e.content,!0)),this.fixClonedDom(n.content,e.content)),n},i.fixClonedDom=function(e,t){if(t.querySelectorAll)for(var n,o,i=t.querySelectorAll(r),a=e.querySelectorAll(r),s=0,c=a.length;c>s;s++)o=i[s],n=a[s],this.decorate&&this.decorate(o),n.parentNode.replaceChild(o.cloneNode(!0),n)};var f=document.importNode;Node.prototype.cloneNode=function(e){var t=h.call(this,e);return e&&i.fixClonedDom(t,this),t},document.importNode=function(e,t){if(e.localName===r)return i.cloneNode(e,t);var n=f.call(document,e,t);return t&&i.fixClonedDom(n,e),n},o&&(HTMLTemplateElement.prototype.cloneNode=function(e){return i.cloneNode(this,e)})}n&&(window.HTMLTemplateElement=i)}(),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var o=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(o.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var r=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||r&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||r&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||p,o(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===w}function o(e,t){if(n(t))e&&e();else{var r=function(){"complete"!==t.readyState&&t.readyState!==w||(t.removeEventListener(_,r),o(e,t))};t.addEventListener(_,r)}}function r(e){e.target.__loaded=!0}function i(e,t){function n(){c==d&&e&&e({allImports:s,loadedImports:l,errorImports:u})}function o(e){r(e),l.push(this),c++,n()}function i(e){u.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,d=s.length,l=[],u=[];if(d)for(var h,f=0;d>f&&(h=s[f]);f++)a(h)?(l.push(this),c++,n()):(h.addEventListener("load",o),h.addEventListener("error",i));else n()}function a(e){return u?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)c(t)&&d(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function d(e){var t=e["import"];t?r({target:e}):(e.addEventListener("load",r),e.addEventListener("error",r))}var l="import",u=Boolean(l in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),f=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=f(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return f(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(p,"_currentScript",m);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",_="readystatechange";u&&(new MutationObserver(function(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,o=t.length;o>n&&(e=t[n]);n++)d(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=l,e.useNative=u,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},o=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=o}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,o={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,o=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,o),e},resolveUrlsInCssText:function(e,o,r){var i=this.replaceUrls(e,r,o,t);return i=this.replaceUrls(i,r,o,n)},replaceUrls:function(e,t,n,o){return e.replace(o,function(e,o,r,i){var a=r.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,o+"'"+a+"'"+i})}};e.path=o}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,o,r){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}o.call(r,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,o=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};o.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,o){if(n.load&&console.log("fetch",e,o),e)if(e.match(/^data:/)){var r=e.split(","),i=r[0],a=r[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,o,null,a)}.bind(this),0)}else{var s=function(t,n,r){this.receive(e,o,t,n,r)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,o,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,o,r){this.cache[e]=o;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,o,n,r),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=o}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===l}function n(e){var t=o(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function o(e){return e.textContent+r(e)}function r(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,o=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+o+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,d=e.isIE,l=e.IMPORT_LINK_TYPE,u="link[rel="+l+"]",h={documentSelectors:u,importsSelectors:[u,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,o=function(r){e.removeEventListener("load",o),e.removeEventListener("error",o),t&&t(r),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",o),e.addEventListener("error",o),d&&"style"===e.localName){var r=!1;if(-1==e.textContent.indexOf("@import"))r=!0;else if(e.sheet){r=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(r=r&&Boolean(i.styleSheet))}r&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var o=document.createElement("script");o.__importElement=t,o.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(o,function(t){o.parentNode&&o.parentNode.removeChild(o),e.currentScript=null}),this.addElementToDocument(o)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var o,r=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=r.length;a>i&&(o=r[i]);i++)if(!this.isParsed(o))return this.hasResource(o)?t(o)?this.nextToParseInDoc(o.__doc,o):o:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=h,e.IMPORT_SELECTOR=u}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function o(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function r(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var r=n.createElement("base");r.setAttribute("href",t),n.baseURI||o(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(r),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,d=e.Loader,l=e.Observer,u=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){f.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);f.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,o,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=o,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:r(o,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}u.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),u.parseNext()},loadedAll:function(){u.parseNext()}},f=new d(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new l,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(c,"baseURI",p)}e.importer=h,e.importLoader=f}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,o={added:function(e){for(var o,r,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)o||(o=a.ownerDocument,r=t.isParsed(o)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&r&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&r.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&r.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=o.added.bind(o);var r=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(o)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var o=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],o=function(e){n.push(e)},r=function(){n.forEach(function(t){t(e)})};e.addModule=o,e.initializeModules=r,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void o(e,t)}),o(e,t)}function n(e,t,o){var r=e.firstElementChild;if(!r)for(r=e.firstChild;r&&r.nodeType!==Node.ELEMENT_NODE;)r=r.nextSibling;for(;r;)t(r,o)!==!0&&n(r,t,o),r=r.nextElementSibling;return null}function o(e,n){for(var o=e.shadowRoot;o;)t(o,n),o=o.olderShadowRoot}function r(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var o,r=e.querySelectorAll("link[rel="+a+"]"),s=0,c=r.length;c>s&&(o=r[s]);s++)o["import"]&&i(o["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||o(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function o(e,t){g(e,function(e){return n(e,t)?!0:void 0})}function r(e){L.push(e),E||(E=!0,setTimeout(i))}function i(){E=!1;for(var e,t=L,n=0,o=t.length;o>n&&(e=t[n]);n++)e();L=[]}function a(e){y?r(function(){s(e)}):s(e)}function s(e){ -e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){d(e),g(e,function(e){d(e)})}function d(e){y?r(function(){l(e)}):l(e)}function l(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function u(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function h(e){if(e.shadowRoot&&!e.shadowRoot.__watched){_.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function f(e,n){if(_.dom){var o=n[0];if(o&&"childList"===o.type&&o.addedNodes&&o.addedNodes){for(var r=o.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var i=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=u(e);n.forEach(function(e){"childList"===e.type&&(N(e.addedNodes,function(e){e.localName&&t(e,a)}),N(e.removedNodes,function(e){e.localName&&c(e)}))}),_.dom&&console.groupEnd()}function p(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(f(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(f.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),_.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),_.dom&&console.groupEnd()}function w(e){b(e,v)}var _=e.flags,g=e.forSubtree,b=e.forDocumentTree,y=window.MutationObserver._isPolyfilled&&_["throttle-attached"];e.hasPolyfillMutations=y,e.hasThrottledAttached=y;var E=!1,L=[],N=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=h,e.upgradeDocumentTree=w,e.upgradeDocument=v,e.upgradeSubtree=o,e.upgradeAll=t,e.attached=a,e.takeRecords=p}),window.CustomElements.addModule(function(e){function t(t,o){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(r);if(i&&(r&&i.tag==t.localName||!r&&!i["extends"]))return n(t,i,o)}}function n(t,n,r){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),r&&e.attached(t),e.upgradeSubtree(t,r),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),s=0;i=a[s];s++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),window.CustomElements.addModule(function(e){function t(t,o){var c=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(d(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c["extends"]&&(c["extends"]=c["extends"].toLowerCase()),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),l(c.__name,c),c.ctor=u(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&v(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t=0&&g(o,HTMLElement),o)}function p(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return w(e),e}}var m,v=(e.isIE,e.upgradeDocumentTree),w=e.upgradeAll,_=e.upgradeWithDefinition,g=e.implementPrototype,b=e.useNative,y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],E={},L="http://www.w3.org/1999/xhtml",N=document.createElement.bind(document),M=document.createElementNS.bind(document);m=Object.__proto__||b?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},p(Node.prototype,"cloneNode"),p(document,"importNode"),document.registerElement=t,document.createElement=f,document.createElementNS=h,e.registry=E,e["instanceof"]=m,e.reservedTagList=y,e.getRegisteredDefinition=d,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,o=e.initializeModules;e.isIE;if(n){var r=function(){};e.watchShadow=r,e.upgrade=r,e.upgradeAll=r,e.upgradeDocumentTree=r,e.upgradeSubtree=r,e.takeRecords=r,e["instanceof"]=function(e,t){return e instanceof t}}else o();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents); \ No newline at end of file diff --git a/rhodecode/public/js/vendors/webcomponentsjs/webcomponents.min.js b/rhodecode/public/js/vendors/webcomponentsjs/webcomponents.min.js deleted file mode 100644 --- a/rhodecode/public/js/vendors/webcomponentsjs/webcomponents.min.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @license - * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - * Code distributed by Google as part of the polymer project is also - * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -// @version 0.7.22 -!function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,r=e.split("=");r[0]&&(t=r[0].match(/wc-(.+)/))&&(n[t[1]]=r[1]||!0)}),t)for(var r,o=0;r=t.attributes[o];o++)"src"!==r.name&&(n[r.name]=r.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.shadow=n.shadow||n.shadowdom||n.polyfill,"native"===n.shadow?n.shadow=!1:n.shadow=n.shadow||!HTMLElement.prototype.createShadowRoot,n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),WebComponents.flags.shadow&&("undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=W(t),r=0;rl;l++)c[l]=new Array(s),c[l][0]=l;for(var u=0;s>u;u++)c[0][u]=u;for(var l=1;a>l;l++)for(var u=1;s>u;u++)if(this.equals(e[t+u-1],r[o+l-1]))c[l][u]=c[l-1][u-1];else{var d=c[l-1][u]+1,p=c[l][u-1]+1;c[l][u]=p>d?d:p}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var l,u=e[t-1][n-1],d=e[t-1][n],p=e[t][n-1];l=p>d?u>d?d:u:u>p?p:u,l==u?(u==s?c.push(r):(c.push(o),s=u),t--,n--):l==d?(c.push(a),t--,s=d):(c.push(i),n--,s=p)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,l,u){var d=0,p=0,h=Math.min(s-n,u-l);if(0==n&&0==l&&(d=this.sharedPrefix(e,c,h)),s==e.length&&u==c.length&&(p=this.sharedSuffix(e,c,h-d)),n+=d,l+=d,s-=p,u-=p,s-n==0&&u-l==0)return[];if(n==s){for(var f=t(n,[],0);u>l;)f.removed.push(c[l++]);return[f]}if(l==u)return[t(n,[],s-n)];for(var m=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,l,u)),f=void 0,w=[],v=n,g=l,b=0;br;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;n>i&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t0){for(var u=0;u0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function u(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=l(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var u=0;u0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function w(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=B(t),l=c.relatedTarget;if(l){if(l instanceof Object&&l.addEventListener){var d=V(l),p=u(t,e,d);if(p===a)return!0}else p=null;Z.set(t,p)}}J.set(t,n);var h=t.type,f=!1;X.set(t,a),Y.set(t,e),i.depth++;for(var m=0,w=i.length;w>m;m++){var v=i[m];if(v.removed)f=!0;else if(!(v.type!==h||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){P||(P=g)}}if(i.depth--,f&&0===i.depth){var b=i.slice();i.length=0;for(var m=0;mr;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){O(e instanceof _)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){N(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){N(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);U=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;U=!1;for(var a=0;ao;o++)r.appendChild(P(t[o]));return r}function w(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){O(t.parentNode===e);var n=t.nextSibling,r=P(t),o=r.parentNode;o&&X.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=P(e),a=i.firstChild;a;)n=a.nextSibling,X.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;ns;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===j}function s(){return!0}function c(e,t,n){return e.localName===n}function l(e,t){return e.namespaceURI===t}function u(e,t,n){return e.namespaceURI===t&&e.localName===n}function d(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=d(a,t,n,r,o,i),a=a.nextElementSibling;return t}function p(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,null);if(c instanceof N)s=S.call(c,i);else{if(!(c instanceof C))return d(this,r,o,n,i,null);s=_.call(c,i)}return t(s,r,o,a)}function h(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=M.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function f(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=L.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=O.call(c,i,a)}return t(s,r,o,!1)}var m=e.wrappers.HTMLCollection,w=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,_=document.querySelectorAll,S=document.documentElement.querySelectorAll,T=document.getElementsByTagName,M=document.documentElement.getElementsByTagName,O=document.getElementsByTagNameNS,L=document.documentElement.getElementsByTagNameNS,N=window.Element,C=window.HTMLDocument||window.Document,j="http://www.w3.org/1999/xhtml",D={ -querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof N)a=b(E.call(s,t));else{if(!(s instanceof C))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new w;return o.length=p.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new m,n="*"===e?s:a;return t.length=h.call(this,n,0,t,e,e.toLowerCase()),t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new m,r=null;return r="*"===e?"*"===t?s:c:"*"===t?l:u,n.length=f.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=D,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var l=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,l,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){u(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,l=e.MatchesInterface,u=(e.addWrapNodeListMethod,e.enqueueMutation),d=e.mixin,p=(e.oneOf,e.registerWrapper),h=e.unsafeUnwrap,f=e.wrappers,m=window.Element,w=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return m.prototype[e]}),v=w[0],g=m.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),d(r.prototype,{createShadowRoot:function(){var t=new f.ShadowRoot(this);h(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return h(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=h(this).getAttribute(e);h(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=h(this).getAttribute(e);h(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=h(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return h(this).className},set className(e){this.setAttribute("class",e)},get id(){return h(this).id},set id(e){this.setAttribute("id",e)}}),w.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),m.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),d(r.prototype,o),d(r.prototype,i),d(r.prototype,s),d(r.prototype,c),d(r.prototype,l),p(m,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=w,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&";case"<":return"<";case">":return">";case'"':return""";case" ":return" "}}function n(e){return e.replace(L,t)}function r(e){return e.replace(N,t)}function o(e){for(var t={},n=0;n"):c+">"+s(e)+"";case Node.TEXT_NODE:var d=e.data;return t&&j[t.localName]?d:r(d);case Node.COMMENT_NODE:return"";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof O.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(M(i))}function l(e){m.call(this,e)}function u(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return M(o)}function d(t){return function(){return e.renderAllPending(),S(this)[t]}}function p(e){w(l,e,d(e))}function h(t){Object.defineProperty(l.prototype,t,{get:d(t),set:function(n){e.renderAllPending(),S(this)[t]=n},configurable:!0,enumerable:!0})}function f(t){Object.defineProperty(l.prototype,t,{value:function(){return e.renderAllPending(),S(this)[t].apply(S(this),arguments)},configurable:!0,enumerable:!0})}var m=e.wrappers.Element,w=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,_=e.snapshotNodeList,S=e.unsafeUnwrap,T=e.unwrap,M=e.wrap,O=e.wrappers,L=/[&\u00A0"]/g,N=/[&\u00A0<>]/g,C=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),j=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;l.prototype=Object.create(m.prototype),g(l.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&j[this.localName])return void(this.textContent=e);var t=_(this.childNodes);this.invalidateShadowRenderer()?this instanceof O.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof O.HTMLTemplateElement?c(this.content,e):S(this).innerHTML=e;var n=_(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=u(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=u(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(p),["scrollLeft","scrollTop"].forEach(h),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(f),E(x,l,document.createElement("b")),e.wrappers.HTMLElement=l,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!p){var t=n(e);u.set(this,l(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.wrap,u=new WeakMap,d=new WeakMap,p=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return p?l(s(this).content):u.get(this)}}),p&&a(p,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,l=e.wrap,u=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return l(c(this).form)}}),a(u,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",l=window.SVGElement,u=document.createElementNS(c,"title");if(!("classList"in u)){var d=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",d),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(l,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){p.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),l=document.createElementNS(s,"use"),u=c.constructor,d=Object.getPrototypeOf(u.prototype),p=d.constructor;t.prototype=Object.create(d),"instanceRoot"in l&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,l),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(l,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.WebGLRenderingContext;if(l){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var u=Object.getPrototypeOf(l.prototype);u!==Object.prototype&&n(u,t.prototype);var d=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(l,t,d),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,l=e.registerWrapper,u=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),l(u,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var d=c(document.createComment(""));e.wrappers.Comment=d}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(u(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;f.set(this,o),this.treeScope_=new r(this,a(o||e)),h.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,l=e.setInnerHTML,u=e.unsafeUnwrap,d=e.unwrap,p=e.wrap,h=new WeakMap,f=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return f.get(this)||null},get host(){return h.get(this)||null},invalidateShadowRenderer:function(){return h.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=d(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;for(var t=p(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(e).root;return t instanceof h?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=u(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.unwrapIfNeeded,u=e.wrap,d=e.getTreeScope,p=window.Range,h=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(l(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(l(e),t)},setStartBefore:function(e){s(this).setStartBefore(l(e))},setStartAfter:function(e){s(this).setStartAfter(l(e))},setEndBefore:function(e){s(this).setEndBefore(l(e))},setEndAfter:function(e){s(this).setEndAfter(l(e))},selectNode:function(e){s(this).selectNode(l(e))},selectNodeContents:function(e){s(this).selectNodeContents(l(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return u(s(this).extractContents())},cloneContents:function(){return u(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(l(e))},surroundContents:function(e){s(this).surroundContents(l(e))},cloneRange:function(){return u(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(l(e),t)},comparePoint:function(e,t){return s(this).comparePoint(l(e),t)},intersectsNode:function(e){return s(this).intersectsNode(l(e))},toString:function(){return s(this).toString()}},p.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return u(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var l=R(a.lastChild);l&&(l.nextSibling_=l.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){P.set(e,[])}function i(e){var t=P.get(e);return t||P.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;em;m++){var w=R(i[u++]);s.get(w)||r(w)}for(var v=h.addedCount,g=i[u]&&R(i[u]),m=0;v>m;m++){var b=o[l++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}d+=v}for(var p=d;p=0;o--){var i=r[o],a=m(i);if(a){var s=i.olderShadowRoot;s&&(n=f(s));for(var c=0;c=0;u--)l=Object.create(l);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(l[e]=function(){j(this)instanceof r||O(this),t.apply(j(this),arguments)})});var d={prototype:l};i&&(d["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(l,r),e.nativePrototypeTable.set(o,l);k.call(C(this),t,d);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],_),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),S(t.prototype,l),S(t.prototype,d),S(t.prototype,f),S(t.prototype,p),S(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(C(this).implementation),H.set(this,e),e)},get defaultView(){return j(C(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=C(arguments[2]),j(A.apply(N(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,l=e.wrap,u=window.Window,d=window.getComputedStyle,p=window.getDefaultComputedStyle,h=window.getSelection;t.prototype=Object.create(n.prototype),u.prototype.getComputedStyle=function(e,t){return l(this||window).getComputedStyle(c(e),t)},p&&(u.prototype.getDefaultComputedStyle=function(e,t){return l(this||window).getDefaultComputedStyle(c(e),t)}),u.prototype.getSelection=function(){return l(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){u.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),d.call(s(this),c(e),t)},getSelection:function(){return a(),new r(h.call(s(this)))},get document(){return l(s(this).document)}}),p&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),p.call(s(this),c(e),t)}),i(u,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill),function(e){function t(e,t){var n="";return Array.prototype.forEach.call(e,function(e){n+=e.textContent+"\n\n"}),t||(n=n.replace(d,"")),n}function n(e){var t=document.createElement("style");return t.textContent=e,t}function r(e){var t=n(e);document.head.appendChild(t);var r=[];if(t.sheet)try{r=t.sheet.cssRules}catch(o){}else console.warn("sheet not found",t);return t.parentNode.removeChild(t),r}function o(){C.initialized=!0,document.body.appendChild(C);var e=C.contentDocument,t=e.createElement("base");t.href=document.baseURI,e.head.appendChild(t)}function i(e){C.initialized||o(),document.body.appendChild(C),e(C.contentDocument),document.body.removeChild(C)}function a(e,t){if(t){var o;if(e.match("@import")&&D){var a=n(e);i(function(e){e.head.appendChild(a.impl),o=Array.prototype.slice.call(a.sheet.cssRules,0),t(o)})}else o=r(e),t(o)}}function s(e){e&&l().appendChild(document.createTextNode(e))}function c(e,t){var r=n(e);r.setAttribute(t,""),r.setAttribute(x,""),document.head.appendChild(r)}function l(){return j||(j=document.createElement("style"),j.setAttribute(x,""),j[x]=!0),j}var u={strictStyling:!1,registry:{},shimStyling:function(e,n,r){var o=this.prepareRoot(e,n,r),i=this.isTypeExtension(r),a=this.makeScopeSelector(n,i),s=t(o,!0);s=this.scopeCssText(s,a),e&&(e.shimmedStyle=s),this.addCssToDocument(s,n)},shimStyle:function(e,t){return this.shimCssText(e.textContent,t)},shimCssText:function(e,t){return e=this.insertDirectives(e),this.scopeCssText(e,t)},makeScopeSelector:function(e,t){return e?t?"[is="+e+"]":e:""},isTypeExtension:function(e){return e&&e.indexOf("-")<0},prepareRoot:function(e,t,n){var r=this.registerRoot(e,t,n);return this.replaceTextInStyles(r.rootStyles,this.insertDirectives),this.removeStyles(e,r.rootStyles),this.strictStyling&&this.applyScopeToContent(e,t),r.scopeStyles},removeStyles:function(e,t){for(var n,r=0,o=t.length;o>r&&(n=t[r]);r++)n.parentNode.removeChild(n)},registerRoot:function(e,t,n){var r=this.registry[t]={root:e,name:t,extendsName:n},o=this.findStyles(e);r.rootStyles=o,r.scopeStyles=r.rootStyles;var i=this.registry[r.extendsName];return i&&(r.scopeStyles=i.scopeStyles.concat(r.scopeStyles)),r},findStyles:function(e){if(!e)return[];var t=e.querySelectorAll("style");return Array.prototype.filter.call(t,function(e){return!e.hasAttribute(R)})},applyScopeToContent:function(e,t){e&&(Array.prototype.forEach.call(e.querySelectorAll("*"),function(e){e.setAttribute(t,"")}),Array.prototype.forEach.call(e.querySelectorAll("template"),function(e){this.applyScopeToContent(e.content,t)},this))},insertDirectives:function(e){return e=this.insertPolyfillDirectivesInCssText(e),this.insertPolyfillRulesInCssText(e)},insertPolyfillDirectivesInCssText:function(e){return e=e.replace(p,function(e,t){return t.slice(0,-2)+"{"}),e.replace(h,function(e,t){return t+" {"})},insertPolyfillRulesInCssText:function(e){return e=e.replace(f,function(e,t){return t.slice(0,-1)}),e.replace(m,function(e,t,n,r){var o=e.replace(t,"").replace(n,"");return r+o})},scopeCssText:function(e,t){var n=this.extractUnscopedRulesFromCssText(e);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonHostContext(e),e=this.convertShadowDOMSelectors(e),t){var e,r=this;a(e,function(n){e=r.scopeRules(n,t)})}return e=e+"\n"+n,e.trim()},extractUnscopedRulesFromCssText:function(e){for(var t,n="";t=w.exec(e);)n+=t[1].slice(0,-1)+"\n\n";for(;t=v.exec(e);)n+=t[0].replace(t[2],"").replace(t[1],t[3])+"\n\n";return n},convertColonHost:function(e){return this.convertColonRule(e,E,this.colonHostPartReplacer)},convertColonHostContext:function(e){return this.convertColonRule(e,_,this.colonHostContextPartReplacer)},convertColonRule:function(e,t,n){return e.replace(t,function(e,t,r,o){if(t=O,r){for(var i,a=r.split(","),s=[],c=0,l=a.length;l>c&&(i=a[c]);c++)i=i.trim(),s.push(n(t,i,o));return s.join(",")}return t+o})},colonHostContextPartReplacer:function(e,t,n){return t.match(g)?this.colonHostPartReplacer(e,t,n):e+t+n+", "+t+" "+e+n},colonHostPartReplacer:function(e,t,n){return e+t.replace(g,"")+n},convertShadowDOMSelectors:function(e){for(var t=0;t","+","~"],r=e,o="["+t+"]";return n.forEach(function(e){var t=r.split(e);r=t.map(function(e){var t=e.trim().replace(L,"");return t&&n.indexOf(t)<0&&t.indexOf(o)<0&&(e=t.replace(/([^:]*)(:*)(.*)/,"$1"+o+"$2$3")),e}).join(e)}),r},insertPolyfillHostInCssText:function(e){return e.replace(M,b).replace(T,g)},propertiesFromRule:function(e){var t=e.style.cssText;e.style.content&&!e.style.content.match(/['"]+|attr/)&&(t=t.replace(/content:[^;]*;/g,"content: '"+e.style.content+"';"));var n=e.style;for(var r in n)"initial"===n[r]&&(t+=r+": initial; ");return t},replaceTextInStyles:function(e,t){e&&t&&(e instanceof Array||(e=[e]),Array.prototype.forEach.call(e,function(e){e.textContent=t.call(this,e.textContent)},this))},addCssToDocument:function(e,t){e.match("@import")?c(e,t):s(e)}},d=/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,p=/\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim,h=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,f=/\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,m=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,w=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,v=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,g="-shadowcsshost",b="-shadowcsscontext",y=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",E=new RegExp("("+g+y,"gim"),_=new RegExp("("+b+y,"gim"),S="([>\\s~+[.,{:][\\s\\S]*)?$",T=/\:host/gim,M=/\:host-context/gim,O=g+"-no-combinator",L=new RegExp(g,"gim"),N=(new RegExp(b,"gim"),[/>>>/g,/::shadow/g,/::content/g,/\/deep\//g,/\/shadow\//g,/\/shadow-deep\//g,/\^\^/g,/\^/g]),C=document.createElement("iframe");C.style.display="none";var j,D=navigator.userAgent.match("Chrome"),H="shim-shadowdom",x="shim-shadowdom-css",R="no-shim";if(window.ShadowDOMPolyfill){s("style { display: none !important; }\n");var I=ShadowDOMPolyfill.wrap(document),P=I.querySelector("head");P.insertBefore(l(),P.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){e.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var t="link[rel=stylesheet]["+H+"]",n="style["+H+"]";HTMLImports.importer.documentPreloadSelectors+=","+t,HTMLImports.importer.importsPreloadSelectors+=","+t,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,t,n].join(",");var r=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(e){if(!e[x]){var t=e.__importElement||e;if(!t.hasAttribute(H))return void r.call(this,e);e.__resource&&(t=e.ownerDocument.createElement("style"),t.textContent=e.__resource),HTMLImports.path.resolveUrlsInStyle(t,e.href),t.textContent=u.shimStyle(t),t.removeAttribute(H,""),t.setAttribute(x,""),t[x]=!0,t.parentNode!==P&&(e.parentNode===P?P.replaceChild(t,e):this.addElementToDocument(t)),t.__importParsed=!0,this.markParsingComplete(e),this.parseNext()}};var o=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(e){return"link"===e.localName&&"stylesheet"===e.rel&&e.hasAttribute(H)?e.__resource:o.call(this,e)}}})}e.ShadowCSS=u}(window.WebComponents)),function(e){window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==p[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){b.push(e)}var l=a||"scheme start",u=0,d="",v=!1,g=!1,b=[];e:for(;(e[u-1]!=f||0==u)&&!this._isInvalid;){var y=e[u];switch(l){case"scheme start":if(!y||!m.test(y)){if(a){c("Invalid scheme.");break e}d="",l="no scheme";continue}d+=y.toLowerCase(),l="scheme";break;case"scheme":if(y&&w.test(y))d+=y.toLowerCase();else{if(":"!=y){if(a){if(f==y)break e;c("Code point not allowed in scheme: "+y);break e}d="",u=0,l="no scheme";continue}if(this._scheme=d,d="",a)break e;t(this._scheme)&&(this._isRelative=!0),l="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==y?(this._query="?",l="query"):"#"==y?(this._fragment="#",l="fragment"):f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._schemeData+=o(y));break;case"no scheme":if(s&&t(s._scheme)){l="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=y||"/"!=e[u+1]){c("Expected /, got: "+y),l="relative";continue}l="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),f==y){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==y||"\\"==y)"\\"==y&&c("\\ is an invalid code point."),l="relative slash";else if("?"==y)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,l="query";else{if("#"!=y){var E=e[u+1],_=e[u+2];("file"!=this._scheme||!m.test(y)||":"!=E&&"|"!=E||f!=_&&"/"!=_&&"\\"!=_&&"?"!=_&&"#"!=_)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),l="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,l="fragment"}break;case"relative slash":if("/"!=y&&"\\"!=y){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),l="relative path";continue}"\\"==y&&c("\\ is an invalid code point."),l="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=y){c("Expected '/', got: "+y),l="authority ignore slashes";continue}l="authority second slash";break;case"authority second slash":if(l="authority ignore slashes","/"!=y){c("Expected '/', got: "+y);continue}break;case"authority ignore slashes":if("/"!=y&&"\\"!=y){l="authority";continue}c("Expected authority, got: "+y);break;case"authority":if("@"==y){v&&(c("@ already seen."),d+="%40"),v=!0;for(var S=0;S0){var o=n[r-1],i=h(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=w.get(e);t||w.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=w.get(e),n=0;nh&&(p=s[h]);h++)a(p)?(u.push(this),c++,n()):(p.addEventListener("load",r),p.addEventListener("error",i));else n()}function a(e){return d?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&l(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function l(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",d=Boolean(u in document.createElement("link")),p=Boolean(window.ShadowDOMPolyfill),h=function(e){return p?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},f=h(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return h(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(f,"_currentScript",m);var w=/Trident/.test(navigator.userAgent),v=w?"complete":"interactive",g="readystatechange";d&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)l(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=f.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),f.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=d,e.rootDocument=f,e.whenReady=t,e.isIE=w}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,l=e.isIE,u=e.IMPORT_LINK_TYPE,d="link[rel="+u+"]",p={documentSelectors:d,importsSelectors:[d,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),l&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=p,e.IMPORT_SELECTOR=d}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,l=e.Loader,u=e.Observer,d=e.parser,p={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){h.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);h.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}d.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),d.parseNext()},loadedAll:function(){d.parseNext()}},h=new l(p.loaded.bind(p),p.loadedAll.bind(p));if(p.observer=new u,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(c,"baseURI",f)}e.importer=p,e.importLoader=h}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;c>s&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function r(e,t){b(e,function(e){return n(e,t)?!0:void 0})}function o(e){S.push(e),_||(_=!0,setTimeout(i))}function i(){_=!1;for(var e,t=S,n=0,r=t.length;r>n&&(e=t[n]);n++)e();S=[]}function a(e){E?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){l(e),b(e,function(e){l(e)})}function l(e){E?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function d(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function p(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function h(e,n){if(g.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=d(e);n.forEach(function(e){"childList"===e.type&&(T(e.addedNodes,function(e){e.localName&&t(e,a)}),T(e.removedNodes,function(e){e.localName&&c(e)}))}),g.dom&&console.groupEnd()}function f(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(h(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(h.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function w(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),g.dom&&console.groupEnd()}function v(e){y(e,w)}var g=e.flags,b=e.forSubtree,y=e.forDocumentTree,E=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=E,e.hasThrottledAttached=E;var _=!1,S=[],T=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=p,e.upgradeDocumentTree=v,e.upgradeDocument=w,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=f}),window.CustomElements.addModule(function(e){function t(t,r){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(o);if(i&&(o&&i.tag==t.localName||!o&&!i["extends"]))return n(t,i,r)}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(l(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c["extends"]&&(c["extends"]=c["extends"].toLowerCase()),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=d(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&w(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t=0&&b(r,HTMLElement),r)}function f(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return v(e),e}}var m,w=(e.isIE,e.upgradeDocumentTree),v=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],_={},S="http://www.w3.org/1999/xhtml",T=document.createElement.bind(document),M=document.createElementNS.bind(document);m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,"cloneNode"),f(document,"importNode"),document.registerElement=t,document.createElement=h,document.createElementNS=p,e.registry=_,e["instanceof"]=m,e.reservedTagList=E,e.getRegisteredDefinition=l,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,r=e.initializeModules;e.isIE;if(n){var o=function(){};e.watchShadow=o,e.upgrade=o,e.upgradeAll=o,e.upgradeDocumentTree=o,e.upgradeSubtree=o,e.takeRecords=o,e["instanceof"]=function(e,t){return e instanceof t}}else r();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice.call(arguments,1);return function(){var r=n.slice();return r.push.apply(r,arguments),t.apply(e,r)}})}(window.WebComponents),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents),function(e){window.Platform=e}(window.WebComponents); \ No newline at end of file diff --git a/rhodecode/rcserver.py b/rhodecode/rcserver.py --- a/rhodecode/rcserver.py +++ b/rhodecode/rcserver.py @@ -40,10 +40,10 @@ def make_web_build_callback(filename): stdout = ''.join(stdout) stderr = ''.join(stderr) if stdout: - print stdout + print(stdout) if stderr: - print ('%s %s %s' % ('-' * 20, 'ERRORS', '-' * 20)) - print stderr + print('%s %s %s' % ('-' * 20, 'ERRORS', '-' * 20)) + print(stderr) MAXFD = 1024 diff --git a/rhodecode/subscribers.py b/rhodecode/subscribers.py --- a/rhodecode/subscribers.py +++ b/rhodecode/subscribers.py @@ -19,15 +19,14 @@ # and proprietary license terms, please see https://rhodecode.com/licenses/ import io import re +import os import datetime import logging import Queue import subprocess32 -import os from dateutil.parser import parse -from pyramid.i18n import get_localizer from pyramid.threadlocal import get_current_request from pyramid.interfaces import IRoutesMapper from pyramid.settings import asbool @@ -39,7 +38,6 @@ from rhodecode.config.jsroutes import ge from rhodecode.lib import auth from rhodecode.lib.base import get_auth_user - import rhodecode diff --git a/rhodecode/templates/admin/repos/repo_edit_advanced.mako b/rhodecode/templates/admin/repos/repo_edit_advanced.mako --- a/rhodecode/templates/admin/repos/repo_edit_advanced.mako +++ b/rhodecode/templates/admin/repos/repo_edit_advanced.mako @@ -7,6 +7,8 @@ (_('Updated on'), h.format_date(c.rhodecode_db_repo.updated_on), '', ''), (_('Cached Commit id'), lambda: h.link_to(c.rhodecode_db_repo.changeset_cache.get('short_id'), h.route_path('repo_commit',repo_name=c.repo_name,commit_id=c.rhodecode_db_repo.changeset_cache.get('raw_id'))), '', ''), (_('Attached scoped tokens'), len(c.rhodecode_db_repo.scoped_tokens), '', [x.user for x in c.rhodecode_db_repo.scoped_tokens]), + (_('Pull requests source'), len(c.rhodecode_db_repo.pull_requests_source), '', ['pr_id:{}, repo:{}'.format(x.pull_request_id,x.source_repo.repo_name) for x in c.rhodecode_db_repo.pull_requests_source]), + (_('Pull requests target'), len(c.rhodecode_db_repo.pull_requests_target), '', ['pr_id:{}, repo:{}'.format(x.pull_request_id,x.target_repo.repo_name) for x in c.rhodecode_db_repo.pull_requests_target]), ] %> @@ -96,7 +98,7 @@ %endif @@ -109,6 +111,35 @@ + +
+
+

${_('Archive repository')}

+
+
+ ${h.secure_form(h.route_path('edit_repo_advanced_archive', repo_name=c.repo_name), request=request)} + +
+ +
+ +
+
+ + ${_('Archiving the repository will make it entirely read-only. The repository cannot be committed to.' + 'It is hidden from the search results and dashboard. ')} + +
+ + ${h.end_form()} +
+
+ +

${_('Delete repository')}

@@ -131,6 +162,18 @@ %endif + <% attached_prs = len(c.rhodecode_db_repo.pull_requests_source + c.rhodecode_db_repo.pull_requests_target) %> + % if c.rhodecode_db_repo.pull_requests_source or c.rhodecode_db_repo.pull_requests_target: + + + ${_ungettext('This repository has %s attached pull request.', 'This repository has %s attached pull requests.', attached_prs) % attached_prs} +
+ ${_('Consider to archive this repository instead.')} + + + + + % endif
@@ -138,7 +181,7 @@
diff --git a/rhodecode/templates/admin/repos/repo_edit_caches.mako b/rhodecode/templates/admin/repos/repo_edit_caches.mako --- a/rhodecode/templates/admin/repos/repo_edit_caches.mako +++ b/rhodecode/templates/admin/repos/repo_edit_caches.mako @@ -67,8 +67,11 @@
 region: ${c.region.name}
 backend: ${c.region.actual_backend.__class__}
+% if c.rhodecode_user.is_admin:
 store: ${c.region.actual_backend.get_store()}
-
+% else:
+store: ${c.region.actual_backend.get_store().__class__}
+% endif
 
 % if c.repo_keys:
 ${len(c.repo_keys)} ${_('Show all')}
@@ -118,7 +121,11 @@ store: ${c.region.actual_backend.get_sto
         
-                
+                % if c.rhodecode_user.is_admin:
+                    
+                % else:
+                    
+                % endif
             
diff --git a/rhodecode/templates/admin/settings/settings_email.mako b/rhodecode/templates/admin/settings/settings_email.mako
--- a/rhodecode/templates/admin/settings/settings_email.mako
+++ b/rhodecode/templates/admin/settings/settings_email.mako
@@ -6,9 +6,7 @@
         <%
          elems = [
             (_('Email prefix'), c.rhodecode_ini.get('email_prefix'), ''),
-            (_('RhodeCode email from'), c.rhodecode_ini.get('app_email_from'), ''),
-            (_('Error email from'), c.rhodecode_ini.get('error_email_from'), ''),
-            (_('Error email recipients'), c.rhodecode_ini.get('email_to'), ''),
+            (_('Email from'), c.rhodecode_ini.get('app_email_from'), ''),
 
             (_('SMTP server'), c.rhodecode_ini.get('smtp_server'), ''),
             (_('SMTP username'), c.rhodecode_ini.get('smtp_username'), ''),
@@ -17,7 +15,7 @@
 
             (_('SMTP use TLS'), c.rhodecode_ini.get('smtp_use_tls'), ''),
             (_('SMTP use SSL'), c.rhodecode_ini.get('smtp_use_ssl'), ''),
-            (_('SMTP auth'), c.rhodecode_ini.get('smtp_auth'), ''),
+
          ]
         %>
         
@@ -54,7 +52,3 @@ ${h.end_form()} - - - - diff --git a/rhodecode/templates/admin/settings/settings_open_source.mako b/rhodecode/templates/admin/settings/settings_open_source.mako --- a/rhodecode/templates/admin/settings/settings_open_source.mako +++ b/rhodecode/templates/admin/settings/settings_open_source.mako @@ -1,3 +1,11 @@ +<%def name="show_license(license_data)"> + % if isinstance(license_data, dict): + ${license_data.get('spdxId') or license_data.get('fullName')} + % else: + ${license_data} + % endif + +

${_('Licenses of Third Party Packages')}

@@ -7,24 +15,29 @@ RhodeCode Enterprise uses various third party packages, many of them provided by the open source community.

- % if c.opensource_licenses:
${_('Cached diff name')}:${c.rhodecode_db_repo.cached_diffs_relative_dir}${c.rhodecode_db_repo.cached_diffs_dir}${c.rhodecode_db_repo.cached_diffs_relative_dir}
${_('Cached diff files')}:
- %for product, licenses in c.opensource_licenses.items(): - - - - - %endfor + % for lib in c.opensource_licenses: + + + + + % endfor
Product License
${product} - ${h.literal(', '.join([ - '%(name)s' % {'link':link, 'name':name} - if link else name - for name,link in licenses.items()]))} -
${lib["name"]} +
    + % if isinstance(lib["license"], list): + % for license_data in lib["license"]: +
  1. ${show_license(license_data)}
  2. + % endfor + % else: + <% license_data = lib["license"] %> +
  3. ${show_license(license_data)}
  4. + % endif +
+
% endif
diff --git a/rhodecode/templates/admin/settings/settings_process_management.mako b/rhodecode/templates/admin/settings/settings_process_management.mako --- a/rhodecode/templates/admin/settings/settings_process_management.mako +++ b/rhodecode/templates/admin/settings/settings_process_management.mako @@ -14,6 +14,7 @@

List of Gunicorn processes on this machine

+

RhodeCode workers set: ${c.gunicorn_workers}

<% def get_name(proc): cmd = ' '.join(proc.cmdline()) diff --git a/rhodecode/templates/base/base.mako b/rhodecode/templates/base/base.mako --- a/rhodecode/templates/base/base.mako +++ b/rhodecode/templates/base/base.mako @@ -287,6 +287,11 @@
+ % if c.rhodecode_db_repo.archived: +
+ ${_('This repository has been archived. It is now read-only.')} +
+ % endif diff --git a/rhodecode/templates/base/root.mako b/rhodecode/templates/base/root.mako --- a/rhodecode/templates/base/root.mako +++ b/rhodecode/templates/base/root.mako @@ -27,8 +27,9 @@ c.template_context['default_user'] = { %> - - + + + ${self.title()} @@ -49,9 +50,6 @@ c.template_context['default_user'] = { ## CSS definitions <%def name="css()"> - ## EXTRA FOR CSS ${self.css_extra()} @@ -101,7 +99,7 @@ c.template_context['default_user'] = { ## avoide escaping the %N - + @@ -142,16 +140,6 @@ c.template_context['default_user'] = { ${_('Please enable JavaScript to use RhodeCode Enterprise')} - ## IE hacks - - - ${next.body()} %if c.post_code: diff --git a/rhodecode/templates/changelog/changelog_elements.mako b/rhodecode/templates/changelog/changelog_elements.mako --- a/rhodecode/templates/changelog/changelog_elements.mako +++ b/rhodecode/templates/changelog/changelog_elements.mako @@ -1,7 +1,6 @@ ## small box that displays changed/added/removed details fetched by AJAX <%namespace name="base" file="/base/base.mako"/> - % if c.prev_page: @@ -80,14 +79,12 @@ % endif % endif - -
-   -
+ +  
-
${urlify_commit_message(commit.message, c.repo_name)}
+
${urlify_commit_message(commit.message, c.repo_name)}
diff --git a/rhodecode/templates/changeset/changeset.mako b/rhodecode/templates/changeset/changeset.mako --- a/rhodecode/templates/changeset/changeset.mako +++ b/rhodecode/templates/changeset/changeset.mako @@ -150,10 +150,6 @@ ${_('Download Diff')} - | - ${c.ignorews_url(request)} - | - ${c.context_url(request)} @@ -211,7 +207,7 @@
<%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/> - ${cbdiffs.render_diffset_menu()} + ${cbdiffs.render_diffset_menu(c.changes[c.commit.raw_id])} ${cbdiffs.render_diffset( c.changes[c.commit.raw_id], commit=c.commit, use_comments=True,inline_comments=c.inline_comments )}
diff --git a/rhodecode/templates/changeset/changeset_file_comment.mako b/rhodecode/templates/changeset/changeset_file_comment.mako --- a/rhodecode/templates/changeset/changeset_file_comment.mako +++ b/rhodecode/templates/changeset/changeset_file_comment.mako @@ -28,7 +28,7 @@
-
+
% if comment.comment_type == 'todo': % if comment.resolved:
diff --git a/rhodecode/templates/changeset/changeset_range.mako b/rhodecode/templates/changeset/changeset_range.mako --- a/rhodecode/templates/changeset/changeset_range.mako +++ b/rhodecode/templates/changeset/changeset_range.mako @@ -3,9 +3,9 @@ <%def name="title()"> ${_('%s Commits') % c.repo_name} - - r${c.commit_ranges[0].revision}:${h.short_id(c.commit_ranges[0].raw_id)} + r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)} ... - r${c.commit_ranges[-1].revision}:${h.short_id(c.commit_ranges[-1].raw_id)} + r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)} ${_ungettext('(%s commit)','(%s commits)', len(c.commit_ranges)) % len(c.commit_ranges)} %if c.rhodecode_name: · ${h.branding(c.rhodecode_name)} @@ -14,9 +14,9 @@ <%def name="breadcrumbs_links()"> ${_('Commits')} - - r${c.commit_ranges[0].revision}:${h.short_id(c.commit_ranges[0].raw_id)} + r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)} ... - r${c.commit_ranges[-1].revision}:${h.short_id(c.commit_ranges[-1].raw_id)} + r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)} ${_ungettext('(%s commit)','(%s commits)', len(c.commit_ranges)) % len(c.commit_ranges)} @@ -43,7 +43,7 @@

${_('Commit Range')} - r${c.commit_ranges[0].revision}:${h.short_id(c.commit_ranges[0].raw_id)}...r${c.commit_ranges[-1].revision}:${h.short_id(c.commit_ranges[-1].raw_id)} + r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)}...r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)}

@@ -54,7 +54,7 @@ ${_('Diff option')}:
diff --git a/rhodecode/templates/codeblocks/diffs.mako b/rhodecode/templates/codeblocks/diffs.mako --- a/rhodecode/templates/codeblocks/diffs.mako +++ b/rhodecode/templates/codeblocks/diffs.mako @@ -1,7 +1,7 @@ <%namespace name="commentblock" file="/changeset/changeset_file_comment.mako"/> -<%def name="diff_line_anchor(filename, line, type)"><% -return '%s_%s_%i' % (h.safeid(filename), type, line) +<%def name="diff_line_anchor(commit, filename, line, type)"><% +return '%s_%s_%i' % (h.md5_safe(commit+filename), type, line) %> <%def name="action_class(action)"> @@ -47,7 +47,7 @@ return '%s_%s_%i' % (h.safeid(filename), deleted_files_comments=None, # for cache purpose - inline_comments=None + inline_comments=None, )"> %if use_comments: @@ -83,7 +83,7 @@ return '%s_%s_%i' % (h.safeid(filename), collapse_all = len(diffset.files) > collapse_when_files_over %> -%if c.diffmode == 'sideside': +%if c.user_session_attrs["diffmode"] == 'sideside': - % endif % else: @@ -568,13 +538,28 @@
<%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/> - ${cbdiffs.render_diffset_menu()} - ${cbdiffs.render_diffset( - c.diffset, use_comments=True, - collapse_when_files_over=30, - disable_new_comments=not c.allowed_to_comment, - deleted_files_comments=c.deleted_files_comments, - inline_comments=c.inline_comments)} + + ${cbdiffs.render_diffset_menu(c.diffset, range_diff_on=c.range_diff_on)} + + % if c.range_diff_on: + % for commit in c.commit_ranges: + ${cbdiffs.render_diffset( + c.changes[commit.raw_id], + commit=commit, use_comments=True, + collapse_when_files_over=5, + disable_new_comments=True, + deleted_files_comments=c.deleted_files_comments, + inline_comments=c.inline_comments)} + % endfor + % else: + ${cbdiffs.render_diffset( + c.diffset, use_comments=True, + collapse_when_files_over=30, + disable_new_comments=not c.allowed_to_comment, + deleted_files_comments=c.deleted_files_comments, + inline_comments=c.inline_comments)} + % endif +
% else: ## skipping commits we need to clear the view for missing commits @@ -641,6 +626,7 @@ versionController.init(); reviewersController = new ReviewersController(); + commitsController = new CommitsController(); $(function(){ diff --git a/rhodecode/templates/search/search.mako b/rhodecode/templates/search/search.mako --- a/rhodecode/templates/search/search.mako +++ b/rhodecode/templates/search/search.mako @@ -57,8 +57,7 @@ %endif
- - ${h.text('q', c.cur_query)} + ${h.text('q', c.cur_query, placeholder="Enter query...")} ${h.select('type',c.search_type,[('content',_('File contents')), ('commit',_('Commit messages')), ('path',_('File names')),],id='id_search_type')} diff --git a/rhodecode/templates/search/search_commit.mako b/rhodecode/templates/search/search_commit.mako --- a/rhodecode/templates/search/search_commit.mako +++ b/rhodecode/templates/search/search_commit.mako @@ -34,8 +34,8 @@ h.route_path('repo_commit',repo_name=entry['repository'],commit_id=entry['commit_id']))} -
-   +
+  
diff --git a/rhodecode/templates/summary/components.mako b/rhodecode/templates/summary/components.mako --- a/rhodecode/templates/summary/components.mako +++ b/rhodecode/templates/summary/components.mako @@ -84,7 +84,56 @@