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

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

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

    https://github.com/apache/cordova-lib/pull/429#discussion_r61665459
  
    --- Diff: cordova-common/src/FileUpdater.js ---
    @@ -0,0 +1,499 @@
    +/**
    +    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.
    +*/
    +
    +"use strict";
    +
    +var fs = require("fs");
    +var path = require("path");
    +var shell = require("shelljs");
    +var minimatch = require("minimatch");
    +
    +var isWindows = (process.platform === "win32");
    +var child_process = (isWindows ? require("child_process") : null);
    +
    +/**
    + * Logging callback used in the FileUpdater methods.
    + * @callback loggingCallback
    + * @param {string} message A message describing a single file update 
operation.
    + */
    +
    +/**
    + * Updates a target file or directory with a source file or directory. 
(Directory updates are
    + * not recursive.) Stats for target and source items must be passed in. 
This is an internal
    + * helper function used by other methods in this module.
    + *
    + * @param {?string} sourcePath Source file or directory to be used to 
update the
    + *     destination. If the source is null, then the destination is deleted 
if it exists.
    + * @param {?fs.Stats} sourceStats An instance of fs.Stats for the source 
path, or null if
    + *     the source does not exist.
    + * @param {string} targetPath Required destination file or directory to be 
updated. If it does
    + *     not exist, it will be created.
    + * @param {?fs.Stats} targetStats An instance of fs.Stats for the target 
path, or null if
    + *     the target does not exist.
    + * @param {Object} [options] Optional additional parameters for the update.
    + * @param {string} [options.rootDir] Optional root directory (such as a 
project) to which target
    + *     and source path parameters are relative; may be omitted if the 
paths are absolute. The
    + *     rootDir is always omitted from any logged paths, to make the logs 
easier to read.
    + * @param {boolean} [options.all] If true, all files are copied regardless 
of last-modified times.
    + * @param {boolean} [options.newer] If true (and all is not specified), 
only files with newer
    + *     last-modified times are copied. By default, only files with 
different times are copied.
    + * @param {loggingCallback} [log] Optional logging callback that takes a 
string message
    + *     describing any file operations that are performed.
    + * @param {Object} context Context object for tracking file operations.
    + * @return {boolean} true if any changes were made, or false if the force 
flag is not set
    + *     and everything was up to date
    + */
    +function updatePathWithStats(
    +        sourcePath, sourceStats, targetPath, targetStats, options, log, 
context) {
    +    var updated = false;
    +
    +    var rootDir = (options && options.rootDir) || "";
    +    var copyAll = (options && options.all) || false;
    +    var copyNewer = (options && options.newer) || false;
    +
    +    var targetFullPath = path.join(rootDir || "", targetPath);
    +
    +    if (sourceStats) {
    +        var sourceFullPath = path.join(rootDir || "", sourcePath);
    +
    +        if (targetStats) {
    +            // The target exists. But if the directory status doesn't 
match the source, delete it.
    +            if (targetStats.isDirectory() && !sourceStats.isDirectory()) {
    +                log("rmdir  " + targetPath + " (source is a file)");
    --- End diff --
    
    Yes. Basically I wanted to enable callers to choose whether they want any 
logging and what level and format. I expect these functions could be useful in 
more than one scenario, so logging requirements may be different.
    
    Initially I am passing in events.emit.bind('verbose') as the logging 
callback to these functions in the updates I'm making to each platform's 
prepare code. But I know we may want to adjust logging levels and styles soon 
in the platform code, and it will be easier to do that if we don't have to 
update cordova-common also.


> Preparing platforms should skip copying files which haven't changed
> -------------------------------------------------------------------
>
>                 Key: CB-11117
>                 URL: https://issues.apache.org/jira/browse/CB-11117
>             Project: Apache Cordova
>          Issue Type: Improvement
>          Components: Android, iOS, Windows
>            Reporter: Jason Ginchereau
>            Assignee: Jason Ginchereau
>
> Many cordova CLI commands include a "prepare" operation, including 'cordova 
> build', 'cordova run', 'cordova plugin add', and more. Every time each of 
> those commands runs, the target platform is "prepared", which involves 
> copying all files from the [<project>/www, 
> <project>/platforms/<platform>/platform_www, <project>/merges/<platform>] to 
> the platform's target www folder, as well as copying a bunch of icons and 
> splash screens to platform-specific locations.
> For the very first prepare of a platform, all that file copying is necessary. 
> But most of the time after that most of the files being copied have not 
> changed and therefore don't really need to be copied again. So the typical 
> developer inner loop (edit a few source files, build and run the app, repeat) 
> is a lot slower than it could be for a Cordova project, especially one that 
> includes a significant number of source files or resources.
> Instead, Cordova should be smart enough to skip copying of files that haven't 
> changed, based on their last-modified timestamp. (But also there should still 
> be a way to force a clean/full/non-incremental build if desired.)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to