Skip to content

Commit e808aa2

Browse files
authoredFeb 19, 2019
fix: copy only modified files when you use patterns with difference to (#341)
1 parent fbe43cb commit e808aa2

File tree

3 files changed

+137
-18
lines changed

3 files changed

+137
-18
lines changed
 

‎src/postProcessPattern.js

+23-16
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import loaderUtils from 'loader-utils';
66
import cacache from 'cacache';
77
import serialize from 'serialize-javascript';
88
import findCacheDir from 'find-cache-dir';
9+
import normalizePath from 'normalize-path';
910

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

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

99-
file.webpackTo = loaderUtils.interpolateName(
100-
{ resourcePath: file.absoluteFrom },
101-
file.webpackTo,
102-
{
103-
content,
104-
regExp: file.webpackToRegExp,
105-
context: pattern.context,
106-
}
100+
// Developers can use invalid slashes in regex we should fix it
101+
file.webpackTo = normalizePath(
102+
loaderUtils.interpolateName(
103+
{ resourcePath: file.absoluteFrom },
104+
file.webpackTo,
105+
{
106+
content,
107+
regExp: file.webpackToRegExp,
108+
context: pattern.context,
109+
}
110+
)
107111
);
108112
}
109113

@@ -115,7 +119,8 @@ export default function postProcessPattern(globalRef, pattern, file) {
115119
pattern.transformPath(file.webpackTo, file.absoluteFrom)
116120
)
117121
.then((newPath) => {
118-
file.webpackTo = newPath;
122+
// Developers can use invalid slashes we should fix it
123+
file.webpackTo = normalizePath(newPath);
119124
})
120125
.then(() => content);
121126
}
@@ -127,20 +132,22 @@ export default function postProcessPattern(globalRef, pattern, file) {
127132

128133
if (
129134
!copyUnmodified &&
130-
written[file.absoluteFrom] &&
131-
written[file.absoluteFrom].hash === hash &&
132-
written[file.absoluteFrom].webpackTo === file.webpackTo
135+
written[file.webpackTo] &&
136+
written[file.webpackTo][file.absoluteFrom] &&
137+
written[file.webpackTo][file.absoluteFrom] === hash
133138
) {
134139
info(`skipping '${file.webpackTo}', because it hasn't changed`);
135140

136141
return;
137142
}
138143

139144
debug(`added ${hash} to written tracking for '${file.absoluteFrom}'`);
140-
written[file.absoluteFrom] = {
141-
hash,
142-
webpackTo: file.webpackTo,
143-
};
145+
146+
if (!written[file.webpackTo]) {
147+
written[file.webpackTo] = {};
148+
}
149+
150+
written[file.webpackTo][file.absoluteFrom] = hash;
144151

145152
if (compilation.assets[file.webpackTo] && !file.force) {
146153
info(`skipping '${file.webpackTo}', because it already exists`);

‎src/preProcessPattern.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,17 @@ export default function preProcessPattern(globalRef, pattern) {
138138
pattern.fromType = 'dir';
139139
pattern.context = pattern.absoluteFrom;
140140
pattern.glob = normalize(pattern.absoluteFrom, '**/*');
141-
pattern.absoluteFrom = path.join(pattern.absoluteFrom, '**/*');
141+
pattern.absoluteFrom = normalizePath(
142+
path.join(pattern.absoluteFrom, '**/*')
143+
);
142144
pattern.globOptions = {
143145
dot: true,
144146
};
145147
} else if (stats.isFile()) {
146148
fileDependencies.add(pattern.absoluteFrom);
147149

148150
pattern.fromType = 'file';
149-
pattern.context = path.dirname(pattern.absoluteFrom);
151+
pattern.context = normalizePath(path.dirname(pattern.absoluteFrom));
150152
pattern.glob = normalize(pattern.absoluteFrom);
151153
pattern.globOptions = {
152154
dot: true,

‎test/CopyPlugin.test.js

+110
Original file line numberDiff line numberDiff line change
@@ -1953,6 +1953,116 @@ describe('apply function', () => {
19531953
});
19541954
});
19551955

1956+
describe('modified files', () => {
1957+
it('copy only changed files', (done) => {
1958+
runChange({
1959+
expectedAssetKeys: ['dest1/tempfile1.txt'],
1960+
newFileLoc1: path.join(HELPER_DIR, 'directory', 'tempfile1.txt'),
1961+
newFileLoc2: path.join(HELPER_DIR, 'directory', 'tempfile2.txt'),
1962+
patterns: [
1963+
{
1964+
context: 'directory',
1965+
from: '**/*.txt',
1966+
to: 'dest1',
1967+
},
1968+
],
1969+
})
1970+
.then(done)
1971+
.catch(done);
1972+
});
1973+
1974+
it('copy only changed files (multiple patterns)', (done) => {
1975+
runChange({
1976+
expectedAssetKeys: ['dest1/tempfile1.txt', 'dest2/tempfile1.txt'],
1977+
newFileLoc1: path.join(HELPER_DIR, 'directory', 'tempfile1.txt'),
1978+
newFileLoc2: path.join(HELPER_DIR, 'directory', 'tempfile2.txt'),
1979+
patterns: [
1980+
{
1981+
context: 'directory',
1982+
from: '**/*.txt',
1983+
to: 'dest1',
1984+
},
1985+
{
1986+
context: 'directory',
1987+
from: '**/*.txt',
1988+
to: 'dest2',
1989+
},
1990+
],
1991+
})
1992+
.then(done)
1993+
.catch(done);
1994+
});
1995+
1996+
it('copy only changed files (multiple patterns with difference context)', (done) => {
1997+
runChange({
1998+
expectedAssetKeys: [
1999+
'dest1/tempfile1.txt',
2000+
'dest2/directory/tempfile1.txt',
2001+
],
2002+
newFileLoc1: path.join(HELPER_DIR, 'directory', 'tempfile1.txt'),
2003+
newFileLoc2: path.join(HELPER_DIR, 'tempfile2.txt'),
2004+
patterns: [
2005+
{
2006+
context: 'directory',
2007+
from: '**/*.txt',
2008+
to: 'dest1',
2009+
},
2010+
{
2011+
from: '**/*.txt',
2012+
to: 'dest2',
2013+
},
2014+
],
2015+
})
2016+
.then(done)
2017+
.catch(done);
2018+
});
2019+
2020+
it('copy only changed files (multiple patterns with difference context 1)', (done) => {
2021+
runChange({
2022+
expectedAssetKeys: [
2023+
'dest1/directory/tempfile1.txt',
2024+
'dest2/tempfile1.txt',
2025+
],
2026+
newFileLoc1: path.join(HELPER_DIR, 'directory', 'tempfile1.txt'),
2027+
newFileLoc2: path.join(HELPER_DIR, 'tempfile2.txt'),
2028+
patterns: [
2029+
{
2030+
from: '**/*.txt',
2031+
to: 'dest1',
2032+
},
2033+
{
2034+
context: 'directory',
2035+
from: '**/*.txt',
2036+
to: 'dest2',
2037+
},
2038+
],
2039+
})
2040+
.then(done)
2041+
.catch(done);
2042+
});
2043+
2044+
it('copy only changed files (multiple patterns with difference context 2)', (done) => {
2045+
runChange({
2046+
expectedAssetKeys: ['dest1/tempfile1.txt'],
2047+
newFileLoc1: path.join(HELPER_DIR, 'tempfile1.txt'),
2048+
newFileLoc2: path.join(HELPER_DIR, 'directory', 'tempfile2.txt'),
2049+
patterns: [
2050+
{
2051+
from: '**/*.txt',
2052+
to: 'dest1',
2053+
},
2054+
{
2055+
context: 'directory',
2056+
from: '**/*.txt',
2057+
to: 'dest2',
2058+
},
2059+
],
2060+
})
2061+
.then(done)
2062+
.catch(done);
2063+
});
2064+
});
2065+
19562066
describe('options', () => {
19572067
describe('ignore', () => {
19582068
it('ignores files when from is a file', (done) => {

0 commit comments

Comments
 (0)
Please sign in to comment.