[ 
https://issues.apache.org/jira/browse/CB-6481?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13988788#comment-13988788
 ] 

ASF GitHub Bot commented on CB-6481:
------------------------------------

Github user sgrebnov commented on a diff in the pull request:

    https://github.com/apache/cordova-plugman/pull/74#discussion_r12257681
  
    --- Diff: src/util/hooks.js ---
    @@ -0,0 +1,148 @@
    +/**
    +    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'),
    +    child_process = require('child_process'),
    +    Q = require('q'),
    +    events = require('../events'),
    +    os = require('os'),
    +    isWindows = (os.platform().substr(0,3) === 'win');
    +
    +/**
    + * Implements functionality to run plugin level hooks. 
    + * Hooks are defined in plugin config file as <script> elements.
    + */
    +module.exports = {
    +    /**
    +     * Fires specific plugin hook: 'preinstall', 'afterinstall', 
'uninstall', etc.
    +     * Async. Returns promise.
    +     */
    +    fire : function(type, plugin_id, pluginElement, platform, project_dir, 
plugin_dir) {
    +        // args check
    +        if (!type) {
    +            throw Error('hook type is not specified');
    +        }
    +
    +        events.emit('debug', 'Executing "' + type + '"  hook for "' + 
plugin_id + '" on ' + platform + '.');
    +        
    +        var scriptTypes = getScriptTypesForHook(type);
    +        if (scriptTypes == null) {
    +            throw Error('unknown plugin hook type: "' + type + '"' );
    +        }
    +
    +        var scriptFilesToRun = getScriptFiles(pluginElement, scriptTypes, 
platform);
    +        var context = {
    +                platform: platform,
    +                projectDir: project_dir,
    +                pluginDir: plugin_dir,
    +                cmdLine: process.argv.join(' '),
    +                pluginId: plugin_id
    +            };
    +
    +        return runScripts(scriptFilesToRun, context);
    +    }
    +};
    +
    +/**
    + * Returns all script types represented corresponding hook event.
    + * Allows to use multiple script types for the same hook event (usage 
simplicity),
    + * For example: 
    + * <script type='install' .. /> or <script type='postinstall' .. /> could 
be used 
    + * to define 'afterinstall' hook.
    + */
    +function getScriptTypesForHook(hookType) {
    +    var knownTypes = {
    +        beforeinstall: ['beforeinstall', 'preinstall'],
    +        afterinstall: ['install', 'afterinstall', 'postinstall'],
    +        uninstall: ['uninstall']
    +    }
    +
    +     return knownTypes[hookType.toLowerCase()];
    +}
    +
    +/**
    + * Gets all scripts from the plugin xml with the specified types.
    + */
    +function getScriptFiles(pluginElement, scriptTypes, platform) {
    +    var scriptFiles= [];
    +    var scriptElements =  pluginElement.findall('./script').concat(
    +            pluginElement.findall('./platform[@name="' + platform + 
'"]/script'));
    +
    +    var pendingScripts = [];
    --- End diff --
    
    Agree, will remove


> adds plugin level hooks support
> -------------------------------
>
>                 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)

Reply via email to