Skip to content

Commit

Permalink
fix: copy only modified files when you use patterns with difference to (
Browse files Browse the repository at this point in the history
  • Loading branch information
evilebottnawi committed Feb 19, 2019
1 parent fbe43cb commit e808aa2
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 18 deletions.
39 changes: 23 additions & 16 deletions src/postProcessPattern.js
Expand Up @@ -6,6 +6,7 @@ import loaderUtils from 'loader-utils';
import cacache from 'cacache';
import serialize from 'serialize-javascript';
import findCacheDir from 'find-cache-dir';
import normalizePath from 'normalize-path';

import { name, version } from '../package.json';

Expand Down Expand Up @@ -96,14 +97,17 @@ export default function postProcessPattern(globalRef, pattern, file) {
file.webpackTo = file.webpackTo.replace(/\.?\[ext\]/g, '');
}

file.webpackTo = loaderUtils.interpolateName(
{ resourcePath: file.absoluteFrom },
file.webpackTo,
{
content,
regExp: file.webpackToRegExp,
context: pattern.context,
}
// Developers can use invalid slashes in regex we should fix it
file.webpackTo = normalizePath(
loaderUtils.interpolateName(
{ resourcePath: file.absoluteFrom },
file.webpackTo,
{
content,
regExp: file.webpackToRegExp,
context: pattern.context,
}
)
);
}

Expand All @@ -115,7 +119,8 @@ export default function postProcessPattern(globalRef, pattern, file) {
pattern.transformPath(file.webpackTo, file.absoluteFrom)
)
.then((newPath) => {
file.webpackTo = newPath;
// Developers can use invalid slashes we should fix it
file.webpackTo = normalizePath(newPath);
})
.then(() => content);
}
Expand All @@ -127,20 +132,22 @@ export default function postProcessPattern(globalRef, pattern, file) {

if (
!copyUnmodified &&
written[file.absoluteFrom] &&
written[file.absoluteFrom].hash === hash &&
written[file.absoluteFrom].webpackTo === file.webpackTo
written[file.webpackTo] &&
written[file.webpackTo][file.absoluteFrom] &&
written[file.webpackTo][file.absoluteFrom] === hash
) {
info(`skipping '${file.webpackTo}', because it hasn't changed`);

return;
}

debug(`added ${hash} to written tracking for '${file.absoluteFrom}'`);
written[file.absoluteFrom] = {
hash,
webpackTo: file.webpackTo,
};

if (!written[file.webpackTo]) {
written[file.webpackTo] = {};
}

written[file.webpackTo][file.absoluteFrom] = hash;

if (compilation.assets[file.webpackTo] && !file.force) {
info(`skipping '${file.webpackTo}', because it already exists`);
Expand Down
6 changes: 4 additions & 2 deletions src/preProcessPattern.js
Expand Up @@ -138,15 +138,17 @@ export default function preProcessPattern(globalRef, pattern) {
pattern.fromType = 'dir';
pattern.context = pattern.absoluteFrom;
pattern.glob = normalize(pattern.absoluteFrom, '**/*');
pattern.absoluteFrom = path.join(pattern.absoluteFrom, '**/*');
pattern.absoluteFrom = normalizePath(
path.join(pattern.absoluteFrom, '**/*')
);
pattern.globOptions = {
dot: true,
};
} else if (stats.isFile()) {
fileDependencies.add(pattern.absoluteFrom);

pattern.fromType = 'file';
pattern.context = path.dirname(pattern.absoluteFrom);
pattern.context = normalizePath(path.dirname(pattern.absoluteFrom));
pattern.glob = normalize(pattern.absoluteFrom);
pattern.globOptions = {
dot: true,
Expand Down
110 changes: 110 additions & 0 deletions test/CopyPlugin.test.js
Expand Up @@ -1953,6 +1953,116 @@ describe('apply function', () => {
});
});

describe('modified files', () => {
it('copy only changed files', (done) => {
runChange({
expectedAssetKeys: ['dest1/tempfile1.txt'],
newFileLoc1: path.join(HELPER_DIR, 'directory', 'tempfile1.txt'),
newFileLoc2: path.join(HELPER_DIR, 'directory', 'tempfile2.txt'),
patterns: [
{
context: 'directory',
from: '**/*.txt',
to: 'dest1',
},
],
})
.then(done)
.catch(done);
});

it('copy only changed files (multiple patterns)', (done) => {
runChange({
expectedAssetKeys: ['dest1/tempfile1.txt', 'dest2/tempfile1.txt'],
newFileLoc1: path.join(HELPER_DIR, 'directory', 'tempfile1.txt'),
newFileLoc2: path.join(HELPER_DIR, 'directory', 'tempfile2.txt'),
patterns: [
{
context: 'directory',
from: '**/*.txt',
to: 'dest1',
},
{
context: 'directory',
from: '**/*.txt',
to: 'dest2',
},
],
})
.then(done)
.catch(done);
});

it('copy only changed files (multiple patterns with difference context)', (done) => {
runChange({
expectedAssetKeys: [
'dest1/tempfile1.txt',
'dest2/directory/tempfile1.txt',
],
newFileLoc1: path.join(HELPER_DIR, 'directory', 'tempfile1.txt'),
newFileLoc2: path.join(HELPER_DIR, 'tempfile2.txt'),
patterns: [
{
context: 'directory',
from: '**/*.txt',
to: 'dest1',
},
{
from: '**/*.txt',
to: 'dest2',
},
],
})
.then(done)
.catch(done);
});

it('copy only changed files (multiple patterns with difference context 1)', (done) => {
runChange({
expectedAssetKeys: [
'dest1/directory/tempfile1.txt',
'dest2/tempfile1.txt',
],
newFileLoc1: path.join(HELPER_DIR, 'directory', 'tempfile1.txt'),
newFileLoc2: path.join(HELPER_DIR, 'tempfile2.txt'),
patterns: [
{
from: '**/*.txt',
to: 'dest1',
},
{
context: 'directory',
from: '**/*.txt',
to: 'dest2',
},
],
})
.then(done)
.catch(done);
});

it('copy only changed files (multiple patterns with difference context 2)', (done) => {
runChange({
expectedAssetKeys: ['dest1/tempfile1.txt'],
newFileLoc1: path.join(HELPER_DIR, 'tempfile1.txt'),
newFileLoc2: path.join(HELPER_DIR, 'directory', 'tempfile2.txt'),
patterns: [
{
from: '**/*.txt',
to: 'dest1',
},
{
context: 'directory',
from: '**/*.txt',
to: 'dest2',
},
],
})
.then(done)
.catch(done);
});
});

describe('options', () => {
describe('ignore', () => {
it('ignores files when from is a file', (done) => {
Expand Down

0 comments on commit e808aa2

Please sign in to comment.