[
https://issues.apache.org/jira/browse/CB-6481?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14081141#comment-14081141
]
ASF GitHub Bot commented on CB-6481:
------------------------------------
Github user kamrik commented on a diff in the pull request:
https://github.com/apache/cordova-lib/pull/55#discussion_r15655705
--- Diff: cordova-lib/src/hooks/scriptsFinder.js ---
@@ -0,0 +1,164 @@
+/**
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+var path = require('path'),
+ fs = require('fs'),
+ cordovaUtil = require('../cordova/util'),
+ events = require('../events'),
+ Q = require('q'),
+ plugin = require('../cordova/plugin'),
+ PluginInfo = require('../PluginInfo'),
+ ConfigParser = require('../configparser/ConfigParser');
+
+/**
+ * Implements logic to retrieve hook script files defined in special
folders and configuration
+ * files: config.xml, hooks/hook_type, plugins/../plugin.xml, etc
+ */
+module.exports = {
+ /**
+ * Returns all script files for the hook type specified.
+ */
+ getHookScripts: function(hook, opts) {
+ // args check
+ if (!hook) {
+ throw new Error('hook type is not specified');
+ }
+ return getApplicationHookScripts(hook, opts)
+ .concat(getPluginsHookScripts(hook, opts));
+ }
+};
+
+/**
+ * Returns script files defined on application level.
+ * They are stored in .cordova/hooks folders and in config.xml.
+ */
+function getApplicationHookScripts(hook, opts) {
+ // args check
+ if (!hook) {
+ throw new Error('hook type is not specified');
+ }
+ return getApplicationHookScriptsFromDir(path.join(opts.projectRoot,
'.cordova', 'hooks', hook))
+
.concat(getApplicationHookScriptsFromDir(path.join(opts.projectRoot, 'hooks',
hook)))
+ .concat(getScriptsFromConfigXml(hook, opts));
+}
+
+/**
+ * Returns script files defined by plugin developers as part of plugin.xml.
+ */
+function getPluginsHookScripts(hook, opts) {
+ // args check
+ if (!hook) {
+ throw new Error('hook type is not specified');
+ }
+
+ // In case before_plugin_install, after_plugin_install,
before_plugin_uninstall hooks we receive opts.plugin and
+ // retrieve scripts exclusive for this plugin.
+ if(opts.plugin) {
+ events.emit('debug', 'Executing "' + hook + '" hook for "' +
opts.plugin.id + '" on ' + opts.plugin.platform + '.');
+
+ return getPluginScriptFiles(opts.plugin, hook, [
opts.plugin.platform ]);
+ }
+
+ events.emit('debug', 'Executing "' + hook + '" hook for all
plugins.');
+ return getAllPluginsHookScriptFiles(hook, opts);
+}
+
+/**
+ * Gets application level hooks from the directrory specified.
+ */
+function getApplicationHookScriptsFromDir(dir) {
+ if (!(fs.existsSync(dir))) {
+ return [];
+ }
+
+ var compareNumbers = function(a, b) {
+ // TODO SG looks very complex, do we really need this?
+ return isNaN (parseInt(a, 10)) ?
a.toLowerCase().localeCompare(b.toLowerCase ? b.toLowerCase(): b)
+ : parseInt(a, 10) > parseInt(b, 10) ? 1 : parseInt(a, 10) <
parseInt(b, 10) ? -1 : 0;
+ };
+
+ var scripts =
fs.readdirSync(dir).sort(compareNumbers).filter(function(s) {
+ return s[0] != '.';
+ });
+ return scripts.map(function (scriptPath) {
+ // for old style hook files we don't use module loader for
backward compatibility
+ return { path: scriptPath, fullPath: path.join(dir, scriptPath),
useModuleLoader: false };
+ });
+}
+
+/**
+ * Gets all scripts defined in config.xml with the specified type and
platforms.
+ */
+function getScriptsFromConfigXml(hook, opts) {
+ var configPath = cordovaUtil.projectConfig(opts.projectRoot);
+ var configXml;
+
+ try {
+ configXml = new ConfigParser(configPath);
+ } catch(ex) {
+ events.emit('err', 'scriptsFinder could not load config.xml: ' +
ex.message);
+ console.log('scriptsFinder could not load config.xml: ' +
ex.message);
+ return [];
--- End diff --
Why do we want a missing or bad config.xml go by silently? Are there any
legit cases where this would run in a project with no config.xml file?
By the way, what's the state of this PR? The code looks pretty good (just
skimmed through it, didn't read thoroughly).
> Add unified hooks support for cordova app and plugins
> -----------------------------------------------------
>
> Key: CB-6481
> URL: https://issues.apache.org/jira/browse/CB-6481
> Project: Apache Cordova
> Issue Type: New Feature
> Components: CLI, Plugman
> Reporter: Sergey Grebnov
> Assignee: Sergey Grebnov
>
> As per "Proposal: hooks support for plugins" dev mail thread discussion
> Hi, I have an idea how we can add more flexibility to plugin developers.
> Note, right now we have Application Developers – someone who use Cordova for
> developing applications and Plugin Developers – someone who creates plugins
> so that Application Developers can use them. For Application Developers we
> expose hooks so that they can customize their build/package/etc process. I
> want us to provide similar sort of flexibility to Plugin Developers so that
> they can go beyond of <source/>, <framework/> tags and get mechanism to add
> custom installation, build logic required by a plugin. Example usage will
> include: downloading/compiling additional binaries, marking source file to be
> copied to output dir, changing target build platform, etc. At present time
> the steps described could be only achieved by hooks manually added by
> Application Developer, but the right way is to allow Plugin Developer to
> expose this as part of plugin definition.
> Example configuration could look like
> ```
> <script type="postinstall" src="scripts/postinstall.js" />
> <script type="preinstall" src="scripts/preinstall.js" />
> <script type="install" src="scripts/install.js" />
> ```
> beforeinstall/preinstall – run before plugin is installed
> install/postinstall/afterinstall – run after plugin is installed
> uninstall – run after plugin is uninstalled
--
This message was sent by Atlassian JIRA
(v6.2#6252)