[Pkg-javascript-commits] [node-grunt-contrib-copy] 01/05: Import Upstream version 1.0.0
Paolo Greppi
paolog-guest at moszumanska.debian.org
Wed Dec 21 07:05:28 UTC 2016
This is an automated email from the git hooks/post-receive script.
paolog-guest pushed a commit to branch master
in repository node-grunt-contrib-copy.
commit 505a041a8baf2355acf1e85f1ea7e302d43c5476
Author: Paolo Greppi <paolo.greppi at libpf.com>
Date: Tue Dec 20 17:25:51 2016 +0000
Import Upstream version 1.0.0
---
.gitattributes | 1 +
.gitignore | 3 +
.jshintrc | 14 ++
.travis.yml | 14 ++
AUTHORS | 5 +
CHANGELOG | 85 +++++++
CONTRIBUTING.md | 1 +
Gruntfile.js | 144 +++++++++++
LICENSE-MIT | 22 ++
README.md | 279 +++++++++++++++++++++
appveyor.yml | 32 +++
docs/copy-examples.md | 187 ++++++++++++++
docs/copy-options.md | 35 +++
docs/copy-overview.md | 1 +
docs/overview.md | 1 +
package.json | 37 +++
tasks/copy.js | 128 ++++++++++
test/copy_test.js | 103 ++++++++
test/expected/copy_test_files/test.js | 1 +
test/expected/copy_test_files/test2.js | 1 +
test/expected/copy_test_flatten/one.js | 1 +
test/expected/copy_test_flatten/test.js | 1 +
test/expected/copy_test_flatten/test2.js | 1 +
test/expected/copy_test_flatten/test_process.js | 1 +
test/expected/copy_test_flatten/two.js | 1 +
test/expected/copy_test_mix/folder_one/one.js | 1 +
test/expected/copy_test_mix/folder_two/two.js | 1 +
test/expected/copy_test_mix/test.js | 1 +
test/expected/copy_test_mix/test2.js | 1 +
.../time_folder/sub_folder/sub_sub_folder/test.js | 1 +
test/expected/copy_test_mix/time_folder/test.js | 1 +
.../copy_test_mix/time_folder/test_process.js | 1 +
.../copy_test_noexpandWild/test/fixtures/test.js | 1 +
.../copy_test_noexpandWild/test/fixtures/test2.js | 1 +
test/expected/copy_test_v0.1.0/folder_one/one.js | 1 +
test/expected/single.js | 1 +
test/fixtures/.hidden | 1 +
test/fixtures/beep.wav | Bin 0 -> 20196 bytes
test/fixtures/folder_one/one.js | 1 +
test/fixtures/folder_two/two.js | 1 +
test/fixtures/test.js | 1 +
test/fixtures/test2.js | 1 +
.../time_folder/sub_folder/sub_sub_folder/test.js | 1 +
test/fixtures/time_folder/test.js | 1 +
test/fixtures/time_folder/test_process.js | 1 +
45 files changed, 1118 insertions(+)
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..2125666
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5cb6bfd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+npm-debug.log
+tmp
\ No newline at end of file
diff --git a/.jshintrc b/.jshintrc
new file mode 100644
index 0000000..507f912
--- /dev/null
+++ b/.jshintrc
@@ -0,0 +1,14 @@
+{
+ "boss": true,
+ "curly": true,
+ "eqeqeq": true,
+ "eqnull": true,
+ "immed": true,
+ "latedef": true,
+ "newcap": true,
+ "noarg": true,
+ "node": true,
+ "sub": true,
+ "undef": true,
+ "unused": true
+}
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..578bc95
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,14 @@
+sudo: false
+language: node_js
+node_js:
+ - "0.10"
+ - "0.12"
+ - "4"
+ - "5"
+ - "iojs"
+before_install:
+ - npm install -g npm
+before_script:
+ - npm install -g grunt-cli
+matrix:
+ fast_finish: true
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..241f7e9
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,5 @@
+Chris Talkington (http://christalkington.com/)
+Tyler Kellen (http://goingslowly.com/)
+Kyle Robinson Young (http://twitter.com/shamakry)
+Nathan Bleigh (http://www.nathanbleigh.com)
+Eric Clemmons (http://ericclemmons.github.com)
\ No newline at end of file
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..5961d01
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,85 @@
+v1.0.0:
+ date: 2016-03-04
+ changes:
+ - Bump devDependencies.
+ - Add example of using relative path.
+ - Point main to task and remove peerDeps.
+v0.8.2:
+ date: 2015-10-19
+ changes:
+ - Fix expand-less copies with multiple files.
+v0.8.1:
+ date: 2015-08-20
+ changes:
+ - Update `chalk` dependency.
+v0.8.0:
+ date: 2015-02-20
+ changes:
+ - Performance improvements.
+ - The `mode` option now also applies to directories.
+ - Fix path issue on Windows.
+v0.7.0:
+ date: 2014-10-15
+ changes:
+ - Add timestamp option to disable preserving timestamp when copying.
+v0.6.0:
+ date: 2014-09-17
+ changes:
+ - Update chalk dependency and other devDependencies.
+ - Preserve file timestamp when copying.
+v0.5.0:
+ date: 2013-12-23
+ changes:
+ - If an encoding is specified, overwrite grunt.file.defaultEncoding.
+ - Rename processContent/processContentExclude to process/noProcess to match Grunt API.
+ - mode option to copy existing or set file permissions.
+v0.4.1:
+ date: 2013-03-26
+ changes:
+ - Output summary by default ("Copied N files, created M folders"). Individual transaction output available via `--verbose`.
+v0.4.0:
+ date: 2013-02-15
+ changes:
+ - First official release for Grunt 0.4.0.
+v0.4.0rc7:
+ date: 2013-01-23
+ changes:
+ - Updating grunt/gruntplugin dependencies to rc7.
+ - Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions.
+v0.4.0rc5:
+ date: 2013-01-14
+ changes:
+ - Updating to work with grunt v0.4.0rc5.
+ - Conversion to grunt v0.4 conventions.
+ - Replace basePath with cwd.
+ - Empty directory support.
+v0.3.2:
+ date: 2012-10-18
+ changes:
+ - Pass copyOptions on single file copy.
+v0.3.1:
+ date: 2012-10-12
+ changes:
+ - Rename grunt-contrib-lib dep to grunt-lib-contrib.
+v0.3.0:
+ date: 2012-09-24
+ changes:
+ - General cleanup and consolidation.
+ - Global options depreciated.
+v0.2.4:
+ date: 2012-09-18
+ changes:
+ - No valid source check.
+v0.2.3:
+ date: 2012-09-17
+ changes:
+ - Path.sep fallback for node <= 0.7.9.
+v0.2.2:
+ date: 2012-09-17
+ changes:
+ - Single file copy support.
+ - Test refactoring.
+v0.2.0:
+ date: 2012-09-07
+ changes:
+ - Refactored from grunt-contrib into individual repo.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..5d08cc3
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1 @@
+Please see the [Contributing to grunt](http://gruntjs.com/contributing) guide for information on contributing to this project.
diff --git a/Gruntfile.js b/Gruntfile.js
new file mode 100644
index 0000000..b2bba77
--- /dev/null
+++ b/Gruntfile.js
@@ -0,0 +1,144 @@
+/*
+ * grunt-contrib-copy
+ * http://gruntjs.com/
+ *
+ * Copyright (c) 2016 Chris Talkington, contributors
+ * Licensed under the MIT license.
+ */
+
+module.exports = function(grunt) {
+ 'use strict';
+
+ // Make an empty dir for testing as git doesn't track empty folders.
+ grunt.file.mkdir('test/fixtures/empty_folder');
+ grunt.file.mkdir('test/expected/copy_test_mix/empty_folder');
+
+ // Project configuration.
+ grunt.initConfig({
+ jshint: {
+ all: [
+ 'Gruntfile.js',
+ 'tasks/*.js',
+ '<%= nodeunit.tests %>'
+ ],
+ options: {
+ jshintrc: '.jshintrc'
+ }
+ },
+
+ // Before generating any new files, remove any previously-created files.
+ clean: {
+ test: ['tmp']
+ },
+
+ test_vars: {
+ name: 'grunt-contrib-copy',
+ version: '0.1.0',
+ match: 'folder_one/*'
+ },
+
+ // Configuration to be run (and then tested).
+ copy: {
+ main: {
+ files: [
+ {expand: true, cwd: 'test/fixtures', src: ['*.js'], dest: 'tmp/copy_test_files/'},
+ {expand: true, cwd: 'test/fixtures', src: ['**', '!*.wav'], dest: 'tmp/copy_test_mix/'},
+ {expand: true, cwd: 'test/fixtures', src: ['<%= test_vars.match %>'], dest: 'tmp/copy_test_v<%= test_vars.version %>/'}
+ ]
+ },
+
+ noexpandWild: {
+ files: [
+ {src: 'test/fixtures/*.js', dest: 'tmp/copy_test_noexpandWild/'}
+ ]
+ },
+
+ flatten: {
+ files: [
+ {expand: true, flatten: true, filter: 'isFile', src: ['test/fixtures/**', '!**/*.wav'], dest: 'tmp/copy_test_flatten/'}
+ ]
+ },
+
+ single: {
+ files: [
+ {src: ['test/fixtures/test.js'], dest: 'tmp/single.js'}
+ ]
+ },
+
+ verbose: {
+ files: [
+ {expand: true, src: ['test/fixtures/**'], dest: 'tmp/copy_test_verbose/'}
+ ]
+ },
+
+ mode: {
+ options: {
+ mode: '0444'
+ },
+ src: ['test/fixtures/test2.js'],
+ dest: 'tmp/mode.js'
+ },
+
+ modeDir: {
+ options: {
+ mode: '0777'
+ },
+ files: [
+ {
+ expand: true,
+ cwd: 'test/fixtures/',
+ src: ['time_folder/**'],
+ dest: 'tmp/copy_test_modeDir/'}
+ ]
+ },
+
+ process: {
+ options: {
+ noProcess: ['test/fixtures/beep.wav'],
+ process: function (content) {
+ return content + '/* comment */';
+ }
+ },
+ files: [{ expand: true, cwd: 'test/fixtures', src: ['test2.js', 'beep.wav'], dest: 'tmp/process/' }]
+ },
+
+ timestamp: {
+ options: {
+ process: function (content, srcpath) {
+ if (srcpath === 'test/fixtures/time_folder/test_process.js') {
+ return 'with process and file contents were changed';
+ } else {
+ return content;
+ }
+ },
+ timestamp: true
+ },
+ files: [
+ {expand: true, cwd: 'test/fixtures/time_folder/', src: ['**'], dest: 'tmp/copy_test_timestamp/'},
+ {src: 'test/fixtures/time_folder/test.js', dest:'tmp/copy_test_timestamp/test1.js'}
+ ]
+ }
+ },
+
+ // Unit tests.
+ nodeunit: {
+ tests: ['test/*_test.js']
+ }
+ });
+
+ // Actually load this plugin's task(s).
+ grunt.loadTasks('tasks');
+
+ // These plugins provide necessary tasks.
+ grunt.loadNpmTasks('grunt-contrib-jshint');
+ grunt.loadNpmTasks('grunt-contrib-clean');
+ grunt.loadNpmTasks('grunt-contrib-nodeunit');
+ grunt.loadNpmTasks('grunt-contrib-internal');
+
+ // Whenever the "test" task is run, first clean the "tmp" dir, then run this
+ // plugin's task(s), then test the result.
+ grunt.registerTask('test', ['jshint', 'clean', 'copy', 'nodeunit']);
+
+ // By default, lint and run all tests.
+ grunt.registerTask('default', ['test', 'build-contrib']);
+};
diff --git a/LICENSE-MIT b/LICENSE-MIT
new file mode 100644
index 0000000..67ecb0e
--- /dev/null
+++ b/LICENSE-MIT
@@ -0,0 +1,22 @@
+Copyright (c) 2016 Chris Talkington, contributors
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ac7972f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,279 @@
+# grunt-contrib-copy v1.0.0 [![Build Status: Linux](https://travis-ci.org/gruntjs/grunt-contrib-copy.svg?branch=master)](https://travis-ci.org/gruntjs/grunt-contrib-copy) [![Build Status: Windows](https://ci.appveyor.com/api/projects/status/fe6l517l01ys2y86/branch/master?svg=true)](https://ci.appveyor.com/project/gruntjs/grunt-contrib-copy/branch/master)
+
+> Copy files and folders
+
+
+
+## Getting Started
+
+If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
+
+```shell
+npm install grunt-contrib-copy --save-dev
+```
+
+Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
+
+```js
+grunt.loadNpmTasks('grunt-contrib-copy');
+```
+
+*This plugin was designed to work with Grunt 0.4.x. If you're still using grunt v0.3.x it's strongly recommended that [you upgrade](http://gruntjs.com/upgrading-from-0.3-to-0.4), but in case you can't please use [v0.3.2](https://github.com/gruntjs/grunt-contrib-copy/tree/grunt-0.3-stable).*
+
+
+
+## Copy task
+_Run this task with the `grunt copy` command._
+
+Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.
+### Options
+
+#### process
+Type: `Function(content, srcpath)`
+
+This option is passed to `grunt.file.copy` as an advanced way to control the file contents that are copied.
+
+*`processContent` has been renamed to `process` and the option name will be removed in the future.*
+
+#### noProcess
+Type: `String`
+
+This option is passed to `grunt.file.copy` as an advanced way to control which file contents are processed.
+
+*`processContentExclude` has been renamed to `noProcess` and the option name will be removed in the future.*
+
+#### encoding
+Type: `String`
+Default: `grunt.file.defaultEncoding`
+
+The file encoding to copy files with.
+
+#### mode
+Type: `Boolean` or `String`
+Default: `false`
+
+Whether to copy or set the destination file and directory permissions.
+Set to `true` to copy the existing file and directories permissions.
+Or set to the mode, i.e.: `0644`, that copied files will be set to.
+
+#### timestamp
+Type: `Boolean`
+Default: `false`
+
+Whether to preserve the timestamp attributes(`atime` and `mtime`) when copying files. Set to `true` to preserve files timestamp. But timestamp will *not* be preserved when the file contents or name are changed during copying.
+
+### Usage Examples
+
+```js
+copy: {
+ main: {
+ files: [
+ // includes files within path
+ {expand: true, src: ['path/*'], dest: 'dest/', filter: 'isFile'},
+
+ // includes files within path and its sub-directories
+ {expand: true, src: ['path/**'], dest: 'dest/'},
+
+ // makes all src relative to cwd
+ {expand: true, cwd: 'path/', src: ['**'], dest: 'dest/'},
+
+ // flattens results to a single level
+ {expand: true, flatten: true, src: ['path/**'], dest: 'dest/', filter: 'isFile'},
+ ],
+ },
+},
+```
+
+This task supports all the file mapping format Grunt supports. Please read [Globbing patterns](http://gruntjs.com/configuring-tasks#globbing-patterns) and [Building the files object dynamically](http://gruntjs.com/configuring-tasks#building-the-files-object-dynamically) for additional details.
+
+Here are some additional examples, given the following file tree:
+```shell
+$ tree -I node_modules
+.
+├── Gruntfile.js
+└── src
+ ├── a
+ └── subdir
+ └── b
+
+2 directories, 3 files
+```
+
+**Copy a single file tree:**
+```js
+copy: {
+ main: {
+ expand: true,
+ src: 'src/*',
+ dest: 'dest/',
+ },
+},
+```
+
+```shell
+$ grunt copy
+Running "copy:main" (copy) task
+Created 1 directories, copied 1 files
+
+Done, without errors.
+$ tree -I node_modules
+.
+├── Gruntfile.js
+├── dest
+│ └── src
+│ ├── a
+│ └── subdir
+└── src
+ ├── a
+ └── subdir
+ └── b
+
+5 directories, 4 files
+```
+
+**Copying without full path:**
+```js
+copy: {
+ main: {
+ expand: true,
+ cwd: 'src',
+ src: '**',
+ dest: 'dest/',
+ },
+},
+```
+
+```shell
+$ grunt copy
+Running "copy:main" (copy) task
+Created 2 directories, copied 2 files
+
+Done, without errors.
+$ tree -I node_modules
+.
+├── Gruntfile.js
+├── dest
+│ ├── a
+│ └── subdir
+│ └── b
+└── src
+ ├── a
+ └── subdir
+ └── b
+
+5 directories, 5 files
+```
+
+**Flattening the filepath output:**
+
+```js
+copy: {
+ main: {
+ expand: true,
+ cwd: 'src/',
+ src: '**',
+ dest: 'dest/',
+ flatten: true,
+ filter: 'isFile',
+ },
+},
+```
+
+```shell
+$ grunt copy
+Running "copy:main" (copy) task
+Copied 2 files
+
+Done, without errors.
+$ tree -I node_modules
+.
+├── Gruntfile.js
+├── dest
+│ ├── a
+│ └── b
+└── src
+ ├── a
+ └── subdir
+ └── b
+
+3 directories, 5 files
+```
+
+
+**Copy and modify a file:**
+
+To change the contents of a file as it is copied, set an `options.process` function as follows:
+
+```js
+copy: {
+ main: {
+ src: 'src/a',
+ dest: 'src/a.bak',
+ options: {
+ process: function (content, srcpath) {
+ return content.replace(/[sad ]/g,"_");
+ },
+ },
+ },
+},
+```
+
+Here all occurrences of the letters "s", "a" and "d", as well as all spaces, will be changed to underlines in "a.bak". Of course, you are not limited to just using regex replacements.
+
+To process all files in a directory, the `process` function is used in exactly the same way.
+
+NOTE: If `process` is not working, be aware it was called `processContent` in v0.4.1 and earlier.
+
+
+##### Troubleshooting
+
+By default, if a file or directory is not found it is quietly ignored. If the file should exist, and non-existence generate an error, then add `nonull:true`. For instance, this Gruntfile.js entry:
+
+```js
+copy: {
+ main: {
+ nonull: true,
+ src: 'not-there',
+ dest: 'create-me',
+ },
+},
+```
+
+gives this output:
+
+```shell
+$ grunt copy
+Running "copy:main" (copy) task
+Warning: Unable to read "not-there" file (Error code: ENOENT). Use --force to continue.
+
+Aborted due to warnings.
+```
+
+
+
+## Release History
+
+ * 2016-03-04 v1.0.0 Bump devDependencies. Add example of using relative path. Point main to task and remove peerDeps.
+ * 2015-10-19 v0.8.2 Fix expand-less copies with multiple files.
+ * 2015-08-20 v0.8.1 Update `chalk` dependency.
+ * 2015-02-20 v0.8.0 Performance improvements. The `mode` option now also applies to directories. Fix path issue on Windows.
+ * 2014-10-15 v0.7.0 Add timestamp option to disable preserving timestamp when copying.
+ * 2014-09-17 v0.6.0 Update chalk dependency and other devDependencies. Preserve file timestamp when copying.
+ * 2013-12-23 v0.5.0 If an encoding is specified, overwrite grunt.file.defaultEncoding. Rename processContent/processContentExclude to process/noProcess to match Grunt API. mode option to copy existing or set file permissions.
+ * 2013-03-26 v0.4.1 Output summary by default ("Copied N files, created M folders"). Individual transaction output available via `--verbose`.
+ * 2013-02-15 v0.4.0 First official release for Grunt 0.4.0.
+ * 2013-01-23 v0.4.0rc7 Updating grunt/gruntplugin dependencies to rc7. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions.
+ * 2013-01-14 v0.4.0rc5 Updating to work with grunt v0.4.0rc5. Conversion to grunt v0.4 conventions. Replace basePath with cwd. Empty directory support.
+ * 2012-10-18 v0.3.2 Pass copyOptions on single file copy.
+ * 2012-10-12 v0.3.1 Rename grunt-contrib-lib dep to grunt-lib-contrib.
+ * 2012-09-24 v0.3.0 General cleanup and consolidation. Global options depreciated.
+ * 2012-09-18 v0.2.4 No valid source check.
+ * 2012-09-17 v0.2.3 Path.sep fallback for node <= 0.7.9.
+ * 2012-09-17 v0.2.2 Single file copy support. Test refactoring.
+ * 2012-09-07 v0.2.0 Refactored from grunt-contrib into individual repo.
+
+---
+
+Task submitted by [Chris Talkington](http://christalkington.com/)
+
+*This file was generated on Fri Mar 04 2016 15:50:24.*
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..92ffcda
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,32 @@
+# Fix line endings on Windows
+init:
+ - git config --global core.autocrlf true
+# What combinations to test
+environment:
+ matrix:
+ - nodejs_version: "0.10"
+ - nodejs_version: "0.12"
+ - nodejs_version: "4"
+ - nodejs_version: "5"
+platform:
+ - x86
+ - x64
+install:
+ - ps: Install-Product node $env:nodejs_version
+ - npm install -g npm
+ - npm install -g grunt-cli
+ - npm install
+test_script:
+ # Output useful info for debugging.
+ - node --version && npm --version
+ # We test multiple Windows shells because of prior stdout buffering issues
+ # filed against Grunt. https://github.com/joyent/node/issues/3584
+ - ps: "npm test # PowerShell" # Pass comment to PS for easier debugging
+ - cmd: npm test
+build: off
+matrix:
+ fast_finish: true
+cache:
+ - C:\Users\appveyor\AppData\Roaming\npm\node_modules -> package.json # global npm modules
+ - C:\Users\appveyor\AppData\Roaming\npm-cache -> package.json # npm cache
+ - node_modules -> package.json # local npm modules
diff --git a/docs/copy-examples.md b/docs/copy-examples.md
new file mode 100644
index 0000000..1961cf0
--- /dev/null
+++ b/docs/copy-examples.md
@@ -0,0 +1,187 @@
+# Usage Examples
+
+```js
+copy: {
+ main: {
+ files: [
+ // includes files within path
+ {expand: true, src: ['path/*'], dest: 'dest/', filter: 'isFile'},
+
+ // includes files within path and its sub-directories
+ {expand: true, src: ['path/**'], dest: 'dest/'},
+
+ // makes all src relative to cwd
+ {expand: true, cwd: 'path/', src: ['**'], dest: 'dest/'},
+
+ // flattens results to a single level
+ {expand: true, flatten: true, src: ['path/**'], dest: 'dest/', filter: 'isFile'},
+ ],
+ },
+},
+```
+
+This task supports all the file mapping format Grunt supports. Please read [Globbing patterns](http://gruntjs.com/configuring-tasks#globbing-patterns) and [Building the files object dynamically](http://gruntjs.com/configuring-tasks#building-the-files-object-dynamically) for additional details.
+
+Here are some additional examples, given the following file tree:
+```shell
+$ tree -I node_modules
+.
+├── Gruntfile.js
+└── src
+ ├── a
+ └── subdir
+ └── b
+
+2 directories, 3 files
+```
+
+**Copy a single file tree:**
+```js
+copy: {
+ main: {
+ expand: true,
+ src: 'src/*',
+ dest: 'dest/',
+ },
+},
+```
+
+```shell
+$ grunt copy
+Running "copy:main" (copy) task
+Created 1 directories, copied 1 files
+
+Done, without errors.
+$ tree -I node_modules
+.
+├── Gruntfile.js
+├── dest
+│ └── src
+│ ├── a
+│ └── subdir
+└── src
+ ├── a
+ └── subdir
+ └── b
+
+5 directories, 4 files
+```
+
+**Copying without full path:**
+```js
+copy: {
+ main: {
+ expand: true,
+ cwd: 'src',
+ src: '**',
+ dest: 'dest/',
+ },
+},
+```
+
+```shell
+$ grunt copy
+Running "copy:main" (copy) task
+Created 2 directories, copied 2 files
+
+Done, without errors.
+$ tree -I node_modules
+.
+├── Gruntfile.js
+├── dest
+│ ├── a
+│ └── subdir
+│ └── b
+└── src
+ ├── a
+ └── subdir
+ └── b
+
+5 directories, 5 files
+```
+
+**Flattening the filepath output:**
+
+```js
+copy: {
+ main: {
+ expand: true,
+ cwd: 'src/',
+ src: '**',
+ dest: 'dest/',
+ flatten: true,
+ filter: 'isFile',
+ },
+},
+```
+
+```shell
+$ grunt copy
+Running "copy:main" (copy) task
+Copied 2 files
+
+Done, without errors.
+$ tree -I node_modules
+.
+├── Gruntfile.js
+├── dest
+│ ├── a
+│ └── b
+└── src
+ ├── a
+ └── subdir
+ └── b
+
+3 directories, 5 files
+```
+
+
+**Copy and modify a file:**
+
+To change the contents of a file as it is copied, set an `options.process` function as follows:
+
+```js
+copy: {
+ main: {
+ src: 'src/a',
+ dest: 'src/a.bak',
+ options: {
+ process: function (content, srcpath) {
+ return content.replace(/[sad ]/g,"_");
+ },
+ },
+ },
+},
+```
+
+Here all occurrences of the letters "s", "a" and "d", as well as all spaces, will be changed to underlines in "a.bak". Of course, you are not limited to just using regex replacements.
+
+To process all files in a directory, the `process` function is used in exactly the same way.
+
+NOTE: If `process` is not working, be aware it was called `processContent` in v0.4.1 and earlier.
+
+
+### Troubleshooting
+
+By default, if a file or directory is not found it is quietly ignored. If the file should exist, and non-existence generate an error, then add `nonull:true`. For instance, this Gruntfile.js entry:
+
+```js
+copy: {
+ main: {
+ nonull: true,
+ src: 'not-there',
+ dest: 'create-me',
+ },
+},
+```
+
+gives this output:
+
+```shell
+$ grunt copy
+Running "copy:main" (copy) task
+Warning: Unable to read "not-there" file (Error code: ENOENT). Use --force to continue.
+
+Aborted due to warnings.
+```
+
diff --git a/docs/copy-options.md b/docs/copy-options.md
new file mode 100644
index 0000000..c0d0bdc
--- /dev/null
+++ b/docs/copy-options.md
@@ -0,0 +1,35 @@
+# Options
+
+## process
+Type: `Function(content, srcpath)`
+
+This option is passed to `grunt.file.copy` as an advanced way to control the file contents that are copied.
+
+*`processContent` has been renamed to `process` and the option name will be removed in the future.*
+
+## noProcess
+Type: `String`
+
+This option is passed to `grunt.file.copy` as an advanced way to control which file contents are processed.
+
+*`processContentExclude` has been renamed to `noProcess` and the option name will be removed in the future.*
+
+## encoding
+Type: `String`
+Default: `grunt.file.defaultEncoding`
+
+The file encoding to copy files with.
+
+## mode
+Type: `Boolean` or `String`
+Default: `false`
+
+Whether to copy or set the destination file and directory permissions.
+Set to `true` to copy the existing file and directories permissions.
+Or set to the mode, i.e.: `0644`, that copied files will be set to.
+
+## timestamp
+Type: `Boolean`
+Default: `false`
+
+Whether to preserve the timestamp attributes(`atime` and `mtime`) when copying files. Set to `true` to preserve files timestamp. But timestamp will *not* be preserved when the file contents or name are changed during copying.
diff --git a/docs/copy-overview.md b/docs/copy-overview.md
new file mode 100644
index 0000000..f0c452b
--- /dev/null
+++ b/docs/copy-overview.md
@@ -0,0 +1 @@
+Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.
\ No newline at end of file
diff --git a/docs/overview.md b/docs/overview.md
new file mode 100644
index 0000000..707b19e
--- /dev/null
+++ b/docs/overview.md
@@ -0,0 +1 @@
+*This plugin was designed to work with Grunt 0.4.x. If you're still using grunt v0.3.x it's strongly recommended that [you upgrade](http://gruntjs.com/upgrading-from-0.3-to-0.4), but in case you can't please use [v0.3.2](https://github.com/gruntjs/grunt-contrib-copy/tree/grunt-0.3-stable).*
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..c6d58d5
--- /dev/null
+++ b/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "grunt-contrib-copy",
+ "description": "Copy files and folders",
+ "version": "1.0.0",
+ "author": {
+ "name": "Grunt Team",
+ "url": "http://gruntjs.com/"
+ },
+ "repository": "gruntjs/grunt-contrib-copy",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "main": "tasks/copy.js",
+ "scripts": {
+ "test": "grunt test"
+ },
+ "dependencies": {
+ "chalk": "^1.1.1",
+ "file-sync-cmp": "^0.1.0"
+ },
+ "devDependencies": {
+ "grunt": "^0.4.5",
+ "grunt-cli": "^0.1.13",
+ "grunt-contrib-clean": "^1.0.0",
+ "grunt-contrib-internal": "^0.4.5",
+ "grunt-contrib-jshint": "^1.0.0",
+ "grunt-contrib-nodeunit": "^0.4.1"
+ },
+ "keywords": [
+ "gruntplugin"
+ ],
+ "files": [
+ "tasks"
+ ],
+ "appveyor_id": "fe6l517l01ys2y86"
+}
diff --git a/tasks/copy.js b/tasks/copy.js
new file mode 100644
index 0000000..bdb476c
--- /dev/null
+++ b/tasks/copy.js
@@ -0,0 +1,128 @@
+/*
+ * grunt-contrib-copy
+ * http://gruntjs.com/
+ *
+ * Copyright (c) 2016 Chris Talkington, contributors
+ * Licensed under the MIT license.
+ * https://github.com/gruntjs/grunt-contrib-copy/blob/master/LICENSE-MIT
+ */
+
+'use strict';
+
+module.exports = function(grunt) {
+ var path = require('path');
+ var fs = require('fs');
+ var chalk = require('chalk');
+ var fileSyncCmp = require('file-sync-cmp');
+ var isWindows = process.platform === 'win32';
+
+ grunt.registerMultiTask('copy', 'Copy files.', function() {
+
+ var options = this.options({
+ encoding: grunt.file.defaultEncoding,
+ // processContent/processContentExclude deprecated renamed to process/noProcess
+ processContent: false,
+ processContentExclude: [],
+ timestamp: false,
+ mode: false
+ });
+
+ var copyOptions = {
+ encoding: options.encoding,
+ process: options.process || options.processContent,
+ noProcess: options.noProcess || options.processContentExclude
+ };
+
+ var detectDestType = function(dest) {
+ if (grunt.util._.endsWith(dest, '/')) {
+ return 'directory';
+ } else {
+ return 'file';
+ }
+ };
+
+ var unixifyPath = function(filepath) {
+ if (isWindows) {
+ return filepath.replace(/\\/g, '/');
+ } else {
+ return filepath;
+ }
+ };
+
+ var syncTimestamp = function (src, dest) {
+ var stat = fs.lstatSync(src);
+ if (path.basename(src) !== path.basename(dest)) {
+ return;
+ }
+
+ if (stat.isFile() && !fileSyncCmp.equalFiles(src, dest)) {
+ return;
+ }
+
+ var fd = fs.openSync(dest, isWindows ? 'r+' : 'r');
+ fs.futimesSync(fd, stat.atime, stat.mtime);
+ fs.closeSync(fd);
+ };
+
+ var isExpandedPair;
+ var dirs = {};
+ var tally = {
+ dirs: 0,
+ files: 0
+ };
+
+ this.files.forEach(function(filePair) {
+ isExpandedPair = filePair.orig.expand || false;
+
+ filePair.src.forEach(function(src) {
+ src = unixifyPath(src);
+ var dest = unixifyPath(filePair.dest);
+
+ if (detectDestType(dest) === 'directory') {
+ dest = isExpandedPair ? dest : path.join(dest, src);
+ }
+
+ if (grunt.file.isDir(src)) {
+ grunt.verbose.writeln('Creating ' + chalk.cyan(dest));
+ grunt.file.mkdir(dest);
+ if (options.mode !== false) {
+ fs.chmodSync(dest, (options.mode === true) ? fs.lstatSync(src).mode : options.mode);
+ }
+
+ if (options.timestamp) {
+ dirs[dest] = src;
+ }
+
+ tally.dirs++;
+ } else {
+ grunt.verbose.writeln('Copying ' + chalk.cyan(src) + ' -> ' + chalk.cyan(dest));
+ grunt.file.copy(src, dest, copyOptions);
+ syncTimestamp(src, dest);
+ if (options.mode !== false) {
+ fs.chmodSync(dest, (options.mode === true) ? fs.lstatSync(src).mode : options.mode);
+ }
+ tally.files++;
+ }
+ });
+ });
+
+ if (options.timestamp) {
+ Object.keys(dirs).sort(function (a, b) {
+ return b.length - a.length;
+ }).forEach(function (dest) {
+ syncTimestamp(dirs[dest], dest);
+ });
+ }
+
+ if (tally.dirs) {
+ grunt.log.write('Created ' + chalk.cyan(tally.dirs.toString()) + (tally.dirs === 1 ? ' directory' : ' directories'));
+ }
+
+ if (tally.files) {
+ grunt.log.write((tally.dirs ? ', copied ' : 'Copied ') + chalk.cyan(tally.files.toString()) + (tally.files === 1 ? ' file' : ' files'));
+ }
+
+ grunt.log.writeln();
+ });
+
+};
diff --git a/test/copy_test.js b/test/copy_test.js
new file mode 100644
index 0000000..98751cc
--- /dev/null
+++ b/test/copy_test.js
@@ -0,0 +1,103 @@
+'use strict';
+
+var grunt = require('grunt');
+var fs = require('fs');
+var isWindows = process.platform === 'win32';
+
+exports.copy = {
+ main: function(test) {
+ test.expect(3);
+
+ var actual = fs.readdirSync('tmp/copy_test_files').sort();
+ var expected = fs.readdirSync('test/expected/copy_test_files').sort();
+ test.deepEqual(expected, actual, 'should copy several files');
+
+ actual = fs.readdirSync('tmp/copy_test_mix').sort();
+ expected = fs.readdirSync('test/expected/copy_test_mix').sort();
+ test.deepEqual(expected, actual, 'should copy a mix of folders and files');
+
+ actual = fs.readdirSync('tmp/copy_test_v0.1.0').sort();
+ expected = fs.readdirSync('test/expected/copy_test_v0.1.0').sort();
+ test.deepEqual(expected, actual, 'should parse both dest and src templates');
+
+ test.done();
+ },
+
+ noexpandWild: function(test) {
+ test.expect(3);
+
+ ['/', '/test/', '/test/fixtures/'].forEach(function(subpath, i) {
+ var actual = fs.readdirSync('tmp/copy_test_noexpandWild' + subpath).sort();
+ var expected = fs.readdirSync('test/expected/copy_test_noexpandWild' + subpath).sort();
+ test.deepEqual(expected, actual, 'should copy file structure at level ' + i);
+ });
+
+ test.done();
+ },
+
+ flatten: function(test) {
+ test.expect(1);
+
+ var actual = fs.readdirSync('tmp/copy_test_flatten').sort();
+ var expected = fs.readdirSync('test/expected/copy_test_flatten').sort();
+ test.deepEqual(expected, actual, 'should create a flat structure');
+
+ test.done();
+ },
+
+ single: function(test) {
+ test.expect(1);
+
+ var actual = grunt.file.read('tmp/single.js');
+ var expected = grunt.file.read('test/expected/single.js');
+ test.equal(expected, actual, 'should allow for single file copy');
+
+ test.done();
+ },
+
+ mode: function(test) {
+ test.expect(1);
+
+ test.equal(fs.lstatSync('tmp/mode.js').mode.toString(8).slice(-3), '444');
+
+ test.done();
+ },
+
+ modeDir: function(test) {
+ test.expect(2);
+ // on Windows DIRs do not have 'executable' flag, see
+ // https://github.com/nodejs/node/blob/master/deps/uv/src/win/fs.c#L1064
+ var expectedMode = isWindows ? '666' : '777';
+ test.equal(fs.lstatSync('tmp/copy_test_modeDir/time_folder').mode.toString(8).slice(-3), expectedMode);
+ test.equal(fs.lstatSync('tmp/copy_test_modeDir/time_folder/sub_folder').mode.toString(8).slice(-3), expectedMode);
+ test.done();
+ },
+
+ process: function(test) {
+ test.expect(2);
+ test.equal(fs.lstatSync('tmp/process/beep.wav').size, fs.lstatSync('test/fixtures/beep.wav').size);
+ test.notEqual(fs.lstatSync('tmp/process/test2.js').size, fs.lstatSync('test/fixtures/test2.js').size);
+
+ test.done();
+ },
+
+ timestamp_equal: function(test) {
+ if (isWindows) {
+ // Known Issue: this test will not pass on Windows due to a bug in node.js
+ // https://github.com/nodejs/node/issues/2069
+ test.done();
+ return;
+ }
+ test.expect(2);
+ test.equal(fs.lstatSync('tmp/copy_test_timestamp/sub_folder').mtime.getTime(), fs.lstatSync('test/fixtures/time_folder/sub_folder').mtime.getTime());
+ test.equal(fs.lstatSync('tmp/copy_test_timestamp/test.js').mtime.getTime(), fs.lstatSync('test/fixtures/time_folder/test.js').mtime.getTime());
+ test.done();
+ },
+
+ timestamp_changed: function(test) {
+ test.expect(2);
+ test.notEqual(fs.lstatSync('tmp/copy_test_timestamp/test1.js').mtime.getTime(), fs.lstatSync('test/fixtures/time_folder/test.js').mtime.getTime());
+ test.notEqual(fs.lstatSync('tmp/copy_test_timestamp/test_process.js').mtime.getTime(), fs.lstatSync('test/fixtures/time_folder/test_process.js').mtime.getTime());
+ test.done();
+ }
+};
diff --git a/test/expected/copy_test_files/test.js b/test/expected/copy_test_files/test.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/expected/copy_test_files/test.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/expected/copy_test_files/test2.js b/test/expected/copy_test_files/test2.js
new file mode 100644
index 0000000..ea17b22
--- /dev/null
+++ b/test/expected/copy_test_files/test2.js
@@ -0,0 +1 @@
+console.log('hello');
\ No newline at end of file
diff --git a/test/expected/copy_test_flatten/one.js b/test/expected/copy_test_flatten/one.js
new file mode 100644
index 0000000..de4091e
--- /dev/null
+++ b/test/expected/copy_test_flatten/one.js
@@ -0,0 +1 @@
+$(document).ready(function(){$.noConflict();});
\ No newline at end of file
diff --git a/test/expected/copy_test_flatten/test.js b/test/expected/copy_test_flatten/test.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/expected/copy_test_flatten/test.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/expected/copy_test_flatten/test2.js b/test/expected/copy_test_flatten/test2.js
new file mode 100644
index 0000000..ea17b22
--- /dev/null
+++ b/test/expected/copy_test_flatten/test2.js
@@ -0,0 +1 @@
+console.log('hello');
\ No newline at end of file
diff --git a/test/expected/copy_test_flatten/test_process.js b/test/expected/copy_test_flatten/test_process.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/expected/copy_test_flatten/test_process.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/expected/copy_test_flatten/two.js b/test/expected/copy_test_flatten/two.js
new file mode 100644
index 0000000..57ec08e
--- /dev/null
+++ b/test/expected/copy_test_flatten/two.js
@@ -0,0 +1 @@
+$(document).ready(function(){jQuery});
\ No newline at end of file
diff --git a/test/expected/copy_test_mix/folder_one/one.js b/test/expected/copy_test_mix/folder_one/one.js
new file mode 100644
index 0000000..de4091e
--- /dev/null
+++ b/test/expected/copy_test_mix/folder_one/one.js
@@ -0,0 +1 @@
+$(document).ready(function(){$.noConflict();});
\ No newline at end of file
diff --git a/test/expected/copy_test_mix/folder_two/two.js b/test/expected/copy_test_mix/folder_two/two.js
new file mode 100644
index 0000000..57ec08e
--- /dev/null
+++ b/test/expected/copy_test_mix/folder_two/two.js
@@ -0,0 +1 @@
+$(document).ready(function(){jQuery});
\ No newline at end of file
diff --git a/test/expected/copy_test_mix/test.js b/test/expected/copy_test_mix/test.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/expected/copy_test_mix/test.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/expected/copy_test_mix/test2.js b/test/expected/copy_test_mix/test2.js
new file mode 100644
index 0000000..ea17b22
--- /dev/null
+++ b/test/expected/copy_test_mix/test2.js
@@ -0,0 +1 @@
+console.log('hello');
\ No newline at end of file
diff --git a/test/expected/copy_test_mix/time_folder/sub_folder/sub_sub_folder/test.js b/test/expected/copy_test_mix/time_folder/sub_folder/sub_sub_folder/test.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/expected/copy_test_mix/time_folder/sub_folder/sub_sub_folder/test.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/expected/copy_test_mix/time_folder/test.js b/test/expected/copy_test_mix/time_folder/test.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/expected/copy_test_mix/time_folder/test.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/expected/copy_test_mix/time_folder/test_process.js b/test/expected/copy_test_mix/time_folder/test_process.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/expected/copy_test_mix/time_folder/test_process.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/expected/copy_test_noexpandWild/test/fixtures/test.js b/test/expected/copy_test_noexpandWild/test/fixtures/test.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/expected/copy_test_noexpandWild/test/fixtures/test.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/expected/copy_test_noexpandWild/test/fixtures/test2.js b/test/expected/copy_test_noexpandWild/test/fixtures/test2.js
new file mode 100644
index 0000000..ea17b22
--- /dev/null
+++ b/test/expected/copy_test_noexpandWild/test/fixtures/test2.js
@@ -0,0 +1 @@
+console.log('hello');
\ No newline at end of file
diff --git a/test/expected/copy_test_v0.1.0/folder_one/one.js b/test/expected/copy_test_v0.1.0/folder_one/one.js
new file mode 100644
index 0000000..de4091e
--- /dev/null
+++ b/test/expected/copy_test_v0.1.0/folder_one/one.js
@@ -0,0 +1 @@
+$(document).ready(function(){$.noConflict();});
\ No newline at end of file
diff --git a/test/expected/single.js b/test/expected/single.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/expected/single.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/fixtures/.hidden b/test/fixtures/.hidden
new file mode 100644
index 0000000..a112b59
--- /dev/null
+++ b/test/fixtures/.hidden
@@ -0,0 +1 @@
+#This is a hidden file!!!
\ No newline at end of file
diff --git a/test/fixtures/beep.wav b/test/fixtures/beep.wav
new file mode 100644
index 0000000..9227a3f
Binary files /dev/null and b/test/fixtures/beep.wav differ
diff --git a/test/fixtures/folder_one/one.js b/test/fixtures/folder_one/one.js
new file mode 100644
index 0000000..de4091e
--- /dev/null
+++ b/test/fixtures/folder_one/one.js
@@ -0,0 +1 @@
+$(document).ready(function(){$.noConflict();});
\ No newline at end of file
diff --git a/test/fixtures/folder_two/two.js b/test/fixtures/folder_two/two.js
new file mode 100644
index 0000000..57ec08e
--- /dev/null
+++ b/test/fixtures/folder_two/two.js
@@ -0,0 +1 @@
+$(document).ready(function(){jQuery});
\ No newline at end of file
diff --git a/test/fixtures/test.js b/test/fixtures/test.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/fixtures/test.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/fixtures/test2.js b/test/fixtures/test2.js
new file mode 100644
index 0000000..ea17b22
--- /dev/null
+++ b/test/fixtures/test2.js
@@ -0,0 +1 @@
+console.log('hello');
\ No newline at end of file
diff --git a/test/fixtures/time_folder/sub_folder/sub_sub_folder/test.js b/test/fixtures/time_folder/sub_folder/sub_sub_folder/test.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/fixtures/time_folder/sub_folder/sub_sub_folder/test.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/fixtures/time_folder/test.js b/test/fixtures/time_folder/test.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/fixtures/time_folder/test.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
diff --git a/test/fixtures/time_folder/test_process.js b/test/fixtures/time_folder/test_process.js
new file mode 100644
index 0000000..68bec77
--- /dev/null
+++ b/test/fixtures/time_folder/test_process.js
@@ -0,0 +1 @@
+$(document).ready(function(){});
\ No newline at end of file
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-grunt-contrib-copy.git
More information about the Pkg-javascript-commits
mailing list