@psync/patch-package 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE +19 -0
- package/README.md +422 -0
- package/dist/PackageDetails.js +126 -0
- package/dist/applyPatches.js +414 -0
- package/dist/assertNever.js +7 -0
- package/dist/coerceSemVer.js +11 -0
- package/dist/createIssue.js +115 -0
- package/dist/detectPackageManager.js +98 -0
- package/dist/filterFiles.js +16 -0
- package/dist/getAppRootPath.js +22 -0
- package/dist/getPackageResolution.js +121 -0
- package/dist/getPackageVersion.js +8 -0
- package/dist/hash.js +26 -0
- package/dist/index.js +208 -0
- package/dist/makePatch.js +450 -0
- package/dist/makeRegExp.js +28 -0
- package/dist/packageIsDevDependency.js +14 -0
- package/dist/parseBunLockfile.js +16 -0
- package/dist/patch/apply.js +251 -0
- package/dist/patch/parse.js +335 -0
- package/dist/patch/read.js +48 -0
- package/dist/patch/reverse.js +97 -0
- package/dist/patchFs.js +55 -0
- package/dist/path.js +17 -0
- package/dist/rebase.js +147 -0
- package/dist/resolveRelativeFileDependencies.js +20 -0
- package/dist/spawnSafe.js +28 -0
- package/dist/stateFile.js +71 -0
- package/index.js +3 -0
- package/package.json +102 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EXECUTABLE_FILE_MODE = exports.NON_EXECUTABLE_FILE_MODE = exports.parseHunkHeaderLine = void 0;
|
|
4
|
+
exports.interpretParsedPatchFile = interpretParsedPatchFile;
|
|
5
|
+
exports.parsePatchFile = parsePatchFile;
|
|
6
|
+
exports.verifyHunkIntegrity = verifyHunkIntegrity;
|
|
7
|
+
const assertNever_1 = require("../assertNever");
|
|
8
|
+
const parseHunkHeaderLine = (headerLine) => {
|
|
9
|
+
const match = headerLine
|
|
10
|
+
.trim()
|
|
11
|
+
.match(/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/);
|
|
12
|
+
if (!match) {
|
|
13
|
+
throw new Error(`Bad header line: '${headerLine}'`);
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
original: {
|
|
17
|
+
start: Math.max(Number(match[1]), 1),
|
|
18
|
+
length: Number(match[3] || 1),
|
|
19
|
+
},
|
|
20
|
+
patched: {
|
|
21
|
+
start: Math.max(Number(match[4]), 1),
|
|
22
|
+
length: Number(match[6] || 1),
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
exports.parseHunkHeaderLine = parseHunkHeaderLine;
|
|
27
|
+
exports.NON_EXECUTABLE_FILE_MODE = 0o644;
|
|
28
|
+
exports.EXECUTABLE_FILE_MODE = 0o755;
|
|
29
|
+
const emptyFilePatch = () => ({
|
|
30
|
+
diffLineFromPath: null,
|
|
31
|
+
diffLineToPath: null,
|
|
32
|
+
oldMode: null,
|
|
33
|
+
newMode: null,
|
|
34
|
+
deletedFileMode: null,
|
|
35
|
+
newFileMode: null,
|
|
36
|
+
renameFrom: null,
|
|
37
|
+
renameTo: null,
|
|
38
|
+
beforeHash: null,
|
|
39
|
+
afterHash: null,
|
|
40
|
+
fromPath: null,
|
|
41
|
+
toPath: null,
|
|
42
|
+
hunks: null,
|
|
43
|
+
});
|
|
44
|
+
const emptyHunk = (headerLine) => ({
|
|
45
|
+
header: (0, exports.parseHunkHeaderLine)(headerLine),
|
|
46
|
+
parts: [],
|
|
47
|
+
source: "",
|
|
48
|
+
});
|
|
49
|
+
const hunkLinetypes = {
|
|
50
|
+
"@": "header",
|
|
51
|
+
"-": "deletion",
|
|
52
|
+
"+": "insertion",
|
|
53
|
+
" ": "context",
|
|
54
|
+
"\\": "pragma",
|
|
55
|
+
// Treat blank lines as context
|
|
56
|
+
undefined: "context",
|
|
57
|
+
"\r": "context",
|
|
58
|
+
};
|
|
59
|
+
function parsePatchLines(lines, { supportLegacyDiffs }) {
|
|
60
|
+
const result = [];
|
|
61
|
+
let currentFilePatch = emptyFilePatch();
|
|
62
|
+
let state = "parsing header";
|
|
63
|
+
let currentHunk = null;
|
|
64
|
+
let currentHunkMutationPart = null;
|
|
65
|
+
let hunkStartLineIndex = 0;
|
|
66
|
+
function commitHunk(i) {
|
|
67
|
+
if (currentHunk) {
|
|
68
|
+
if (currentHunkMutationPart) {
|
|
69
|
+
currentHunk.parts.push(currentHunkMutationPart);
|
|
70
|
+
currentHunkMutationPart = null;
|
|
71
|
+
}
|
|
72
|
+
currentHunk.source = lines.slice(hunkStartLineIndex, i).join("\n");
|
|
73
|
+
currentFilePatch.hunks.push(currentHunk);
|
|
74
|
+
currentHunk = null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function commitFilePatch(i) {
|
|
78
|
+
commitHunk(i);
|
|
79
|
+
result.push(currentFilePatch);
|
|
80
|
+
currentFilePatch = emptyFilePatch();
|
|
81
|
+
}
|
|
82
|
+
for (let i = 0; i < lines.length; i++) {
|
|
83
|
+
const line = lines[i];
|
|
84
|
+
if (state === "parsing header") {
|
|
85
|
+
if (line.startsWith("@@")) {
|
|
86
|
+
hunkStartLineIndex = i;
|
|
87
|
+
state = "parsing hunks";
|
|
88
|
+
currentFilePatch.hunks = [];
|
|
89
|
+
i--;
|
|
90
|
+
}
|
|
91
|
+
else if (line.startsWith("diff --git ")) {
|
|
92
|
+
if (currentFilePatch && currentFilePatch.diffLineFromPath) {
|
|
93
|
+
commitFilePatch(i);
|
|
94
|
+
}
|
|
95
|
+
const match = line.match(/^diff --git a\/(.*?) b\/(.*?)\s*$/);
|
|
96
|
+
if (!match) {
|
|
97
|
+
throw new Error("Bad diff line: " + line);
|
|
98
|
+
}
|
|
99
|
+
currentFilePatch.diffLineFromPath = match[1];
|
|
100
|
+
currentFilePatch.diffLineToPath = match[2];
|
|
101
|
+
}
|
|
102
|
+
else if (line.startsWith("old mode ")) {
|
|
103
|
+
currentFilePatch.oldMode = line.slice("old mode ".length).trim();
|
|
104
|
+
}
|
|
105
|
+
else if (line.startsWith("new mode ")) {
|
|
106
|
+
currentFilePatch.newMode = line.slice("new mode ".length).trim();
|
|
107
|
+
}
|
|
108
|
+
else if (line.startsWith("deleted file mode ")) {
|
|
109
|
+
currentFilePatch.deletedFileMode = line
|
|
110
|
+
.slice("deleted file mode ".length)
|
|
111
|
+
.trim();
|
|
112
|
+
}
|
|
113
|
+
else if (line.startsWith("new file mode ")) {
|
|
114
|
+
currentFilePatch.newFileMode = line
|
|
115
|
+
.slice("new file mode ".length)
|
|
116
|
+
.trim();
|
|
117
|
+
}
|
|
118
|
+
else if (line.startsWith("rename from ")) {
|
|
119
|
+
currentFilePatch.renameFrom = line.slice("rename from ".length).trim();
|
|
120
|
+
}
|
|
121
|
+
else if (line.startsWith("rename to ")) {
|
|
122
|
+
currentFilePatch.renameTo = line.slice("rename to ".length).trim();
|
|
123
|
+
}
|
|
124
|
+
else if (line.startsWith("index ")) {
|
|
125
|
+
const match = line.match(/(\w+)\.\.(\w+)/);
|
|
126
|
+
if (!match) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
currentFilePatch.beforeHash = match[1];
|
|
130
|
+
currentFilePatch.afterHash = match[2];
|
|
131
|
+
}
|
|
132
|
+
else if (line.startsWith("--- ")) {
|
|
133
|
+
currentFilePatch.fromPath = line.slice("--- a/".length).trim();
|
|
134
|
+
}
|
|
135
|
+
else if (line.startsWith("+++ ")) {
|
|
136
|
+
currentFilePatch.toPath = line.slice("+++ b/".length).trim();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
if (supportLegacyDiffs && line.startsWith("--- a/")) {
|
|
141
|
+
state = "parsing header";
|
|
142
|
+
commitFilePatch(i);
|
|
143
|
+
i--;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
// parsing hunks
|
|
147
|
+
const lineType = hunkLinetypes[line[0]] || null;
|
|
148
|
+
switch (lineType) {
|
|
149
|
+
case "header":
|
|
150
|
+
commitHunk(i);
|
|
151
|
+
currentHunk = emptyHunk(line);
|
|
152
|
+
break;
|
|
153
|
+
case null:
|
|
154
|
+
// unrecognized, bail out
|
|
155
|
+
state = "parsing header";
|
|
156
|
+
commitFilePatch(i);
|
|
157
|
+
i--;
|
|
158
|
+
break;
|
|
159
|
+
case "pragma":
|
|
160
|
+
if (!line.startsWith("\")) {
|
|
161
|
+
throw new Error("Unrecognized pragma in patch file: " + line);
|
|
162
|
+
}
|
|
163
|
+
if (!currentHunkMutationPart) {
|
|
164
|
+
throw new Error("Bad parser state: No newline at EOF pragma encountered without context");
|
|
165
|
+
}
|
|
166
|
+
currentHunkMutationPart.noNewlineAtEndOfFile = true;
|
|
167
|
+
break;
|
|
168
|
+
case "insertion":
|
|
169
|
+
case "deletion":
|
|
170
|
+
case "context":
|
|
171
|
+
if (!currentHunk) {
|
|
172
|
+
throw new Error("Bad parser state: Hunk lines encountered before hunk header");
|
|
173
|
+
}
|
|
174
|
+
if (currentHunkMutationPart &&
|
|
175
|
+
currentHunkMutationPart.type !== lineType) {
|
|
176
|
+
currentHunk.parts.push(currentHunkMutationPart);
|
|
177
|
+
currentHunkMutationPart = null;
|
|
178
|
+
}
|
|
179
|
+
if (!currentHunkMutationPart) {
|
|
180
|
+
currentHunkMutationPart = {
|
|
181
|
+
type: lineType,
|
|
182
|
+
lines: [],
|
|
183
|
+
noNewlineAtEndOfFile: false,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
currentHunkMutationPart.lines.push(line.slice(1));
|
|
187
|
+
break;
|
|
188
|
+
default:
|
|
189
|
+
// exhausitveness check
|
|
190
|
+
(0, assertNever_1.assertNever)(lineType);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
commitFilePatch(lines.length);
|
|
195
|
+
for (const { hunks } of result) {
|
|
196
|
+
if (hunks) {
|
|
197
|
+
for (const hunk of hunks) {
|
|
198
|
+
verifyHunkIntegrity(hunk);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
function interpretParsedPatchFile(files) {
|
|
205
|
+
const result = [];
|
|
206
|
+
for (const file of files) {
|
|
207
|
+
const { diffLineFromPath, diffLineToPath, oldMode, newMode, deletedFileMode, newFileMode, renameFrom, renameTo, beforeHash, afterHash, fromPath, toPath, hunks, } = file;
|
|
208
|
+
const type = renameFrom
|
|
209
|
+
? "rename"
|
|
210
|
+
: deletedFileMode
|
|
211
|
+
? "file deletion"
|
|
212
|
+
: newFileMode
|
|
213
|
+
? "file creation"
|
|
214
|
+
: hunks && hunks.length > 0
|
|
215
|
+
? "patch"
|
|
216
|
+
: "mode change";
|
|
217
|
+
let destinationFilePath = null;
|
|
218
|
+
switch (type) {
|
|
219
|
+
case "rename":
|
|
220
|
+
if (!renameFrom || !renameTo) {
|
|
221
|
+
throw new Error("Bad parser state: rename from & to not given");
|
|
222
|
+
}
|
|
223
|
+
result.push({
|
|
224
|
+
type: "rename",
|
|
225
|
+
fromPath: renameFrom,
|
|
226
|
+
toPath: renameTo,
|
|
227
|
+
});
|
|
228
|
+
destinationFilePath = renameTo;
|
|
229
|
+
break;
|
|
230
|
+
case "file deletion": {
|
|
231
|
+
const path = diffLineFromPath || fromPath;
|
|
232
|
+
if (!path) {
|
|
233
|
+
throw new Error("Bad parse state: no path given for file deletion");
|
|
234
|
+
}
|
|
235
|
+
result.push({
|
|
236
|
+
type: "file deletion",
|
|
237
|
+
hunk: (hunks && hunks[0]) || null,
|
|
238
|
+
path,
|
|
239
|
+
mode: parseFileMode(deletedFileMode),
|
|
240
|
+
hash: beforeHash,
|
|
241
|
+
});
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
case "file creation": {
|
|
245
|
+
const path = diffLineToPath || toPath;
|
|
246
|
+
if (!path) {
|
|
247
|
+
throw new Error("Bad parse state: no path given for file creation");
|
|
248
|
+
}
|
|
249
|
+
result.push({
|
|
250
|
+
type: "file creation",
|
|
251
|
+
hunk: (hunks && hunks[0]) || null,
|
|
252
|
+
path,
|
|
253
|
+
mode: parseFileMode(newFileMode),
|
|
254
|
+
hash: afterHash,
|
|
255
|
+
});
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
case "patch":
|
|
259
|
+
case "mode change":
|
|
260
|
+
destinationFilePath = toPath || diffLineToPath;
|
|
261
|
+
break;
|
|
262
|
+
default:
|
|
263
|
+
(0, assertNever_1.assertNever)(type);
|
|
264
|
+
}
|
|
265
|
+
if (destinationFilePath && oldMode && newMode && oldMode !== newMode) {
|
|
266
|
+
result.push({
|
|
267
|
+
type: "mode change",
|
|
268
|
+
path: destinationFilePath,
|
|
269
|
+
oldMode: parseFileMode(oldMode),
|
|
270
|
+
newMode: parseFileMode(newMode),
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
if (destinationFilePath && hunks && hunks.length) {
|
|
274
|
+
result.push({
|
|
275
|
+
type: "patch",
|
|
276
|
+
path: destinationFilePath,
|
|
277
|
+
hunks,
|
|
278
|
+
beforeHash,
|
|
279
|
+
afterHash,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return result;
|
|
284
|
+
}
|
|
285
|
+
function parseFileMode(mode) {
|
|
286
|
+
// tslint:disable-next-line:no-bitwise
|
|
287
|
+
const parsedMode = parseInt(mode, 8) & 0o777;
|
|
288
|
+
if (parsedMode !== exports.NON_EXECUTABLE_FILE_MODE &&
|
|
289
|
+
parsedMode !== exports.EXECUTABLE_FILE_MODE) {
|
|
290
|
+
throw new Error("Unexpected file mode string: " + mode);
|
|
291
|
+
}
|
|
292
|
+
return parsedMode;
|
|
293
|
+
}
|
|
294
|
+
function parsePatchFile(file) {
|
|
295
|
+
const lines = file.split(/\n/g);
|
|
296
|
+
if (lines[lines.length - 1] === "") {
|
|
297
|
+
lines.pop();
|
|
298
|
+
}
|
|
299
|
+
try {
|
|
300
|
+
return interpretParsedPatchFile(parsePatchLines(lines, { supportLegacyDiffs: false }));
|
|
301
|
+
}
|
|
302
|
+
catch (e) {
|
|
303
|
+
if (e instanceof Error &&
|
|
304
|
+
e.message === "hunk header integrity check failed") {
|
|
305
|
+
return interpretParsedPatchFile(parsePatchLines(lines, { supportLegacyDiffs: true }));
|
|
306
|
+
}
|
|
307
|
+
throw e;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function verifyHunkIntegrity(hunk) {
|
|
311
|
+
// verify hunk integrity
|
|
312
|
+
let originalLength = 0;
|
|
313
|
+
let patchedLength = 0;
|
|
314
|
+
for (const { type, lines } of hunk.parts) {
|
|
315
|
+
switch (type) {
|
|
316
|
+
case "context":
|
|
317
|
+
patchedLength += lines.length;
|
|
318
|
+
originalLength += lines.length;
|
|
319
|
+
break;
|
|
320
|
+
case "deletion":
|
|
321
|
+
originalLength += lines.length;
|
|
322
|
+
break;
|
|
323
|
+
case "insertion":
|
|
324
|
+
patchedLength += lines.length;
|
|
325
|
+
break;
|
|
326
|
+
default:
|
|
327
|
+
(0, assertNever_1.assertNever)(type);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (originalLength !== hunk.header.original.length ||
|
|
331
|
+
patchedLength !== hunk.header.patched.length) {
|
|
332
|
+
throw new Error("hunk header integrity check failed");
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGF0Y2gvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBNFNBLDREQW1HQztBQWNELHdDQW9CQztBQUVELGtEQTJCQztBQTljRCxnREFBNEM7QUFhckMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLFVBQWtCLEVBQWMsRUFBRTtJQUNwRSxNQUFNLEtBQUssR0FBRyxVQUFVO1NBQ3JCLElBQUksRUFBRTtTQUNOLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFBO0lBQ3JELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLFVBQVUsR0FBRyxDQUFDLENBQUE7SUFDckQsQ0FBQztJQUVELE9BQU87UUFDTCxRQUFRLEVBQUU7WUFDUixLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtRQUNELE9BQU8sRUFBRTtZQUNQLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCO0tBQ0YsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQWxCWSxRQUFBLG1CQUFtQix1QkFrQi9CO0FBRVksUUFBQSx3QkFBd0IsR0FBRyxLQUFLLENBQUE7QUFDaEMsUUFBQSxvQkFBb0IsR0FBRyxLQUFLLENBQUE7QUFnRnpDLE1BQU0sY0FBYyxHQUFHLEdBQWMsRUFBRSxDQUFDLENBQUM7SUFDdkMsZ0JBQWdCLEVBQUUsSUFBSTtJ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dmVyIH0gZnJvbSBcIi4uL2Fzc2VydE5ldmVyXCJcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSHVua0hlYWRlciB7XHJcbiAgb3JpZ2luYWw6IHtcclxuICAgIHN0YXJ0OiBudW1iZXJcclxuICAgIGxlbmd0aDogbnVtYmVyXHJcbiAgfVxyXG4gIHBhdGNoZWQ6IHtcclxuICAgIHN0YXJ0OiBudW1iZXJcclxuICAgIGxlbmd0aDogbnVtYmVyXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgcGFyc2VIdW5rSGVhZGVyTGluZSA9IChoZWFkZXJMaW5lOiBzdHJpbmcpOiBIdW5rSGVhZGVyID0+IHtcclxuICBjb25zdCBtYXRjaCA9IGhlYWRlckxpbmVcclxuICAgIC50cmltKClcclxuICAgIC5tYXRjaCgvXkBAIC0oXFxkKykoLChcXGQrKSk/IFxcKyhcXGQrKSgsKFxcZCspKT8gQEAuKi8pXHJcbiAgaWYgKCFtYXRjaCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBCYWQgaGVhZGVyIGxpbmU6ICcke2hlYWRlckxpbmV9J2ApXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgb3JpZ2luYWw6IHtcclxuICAgICAgc3RhcnQ6IE1hdGgubWF4KE51bWJlcihtYXRjaFsxXSksIDEpLFxyXG4gICAgICBsZW5ndGg6IE51bWJlcihtYXRjaFszXSB8fCAxKSxcclxuICAgIH0sXHJcbiAgICBwYXRjaGVkOiB7XHJcbiAgICAgIHN0YXJ0OiBNYXRoLm1heChOdW1iZXIobWF0Y2hbNF0pLCAxKSxcclxuICAgICAgbGVuZ3RoOiBOdW1iZXIobWF0Y2hbNl0gfHwgMSksXHJcbiAgICB9LFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5PTl9FWEVDVVRBQkxFX0ZJTEVfTU9ERSA9IDBvNjQ0XHJcbmV4cG9ydCBjb25zdCBFWEVDVVRBQkxFX0ZJTEVfTU9ERSA9IDBvNzU1XHJcblxyXG50eXBlIEZpbGVNb2RlID0gdHlwZW9mIE5PTl9FWEVDVVRBQkxFX0ZJTEVfTU9ERSB8IHR5cGVvZiBFWEVDVVRBQkxFX0ZJTEVfTU9ERVxyXG5cclxuaW50ZXJmYWNlIFBhdGNoTXV0YXRpb25QYXJ0IHtcclxuICB0eXBlOiBcImNvbnRleHRcIiB8IFwiaW5zZXJ0aW9uXCIgfCBcImRlbGV0aW9uXCJcclxuICBsaW5lczogc3RyaW5nW11cclxuICBub05ld2xpbmVBdEVuZE9mRmlsZTogYm9vbGVhblxyXG59XHJcblxyXG5pbnRlcmZhY2UgRmlsZVJlbmFtZSB7XHJcbiAgdHlwZTogXCJyZW5hbWVcIlxyXG4gIGZyb21QYXRoOiBzdHJpbmdcclxuICB0b1BhdGg6IHN0cmluZ1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRmlsZU1vZGVDaGFuZ2Uge1xyXG4gIHR5cGU6IFwibW9kZSBjaGFuZ2VcIlxyXG4gIHBhdGg6IHN0cmluZ1xyXG4gIG9sZE1vZGU6IEZpbGVNb2RlXHJcbiAgbmV3TW9kZTogRmlsZU1vZGVcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGaWxlUGF0Y2gge1xyXG4gIHR5cGU6IFwicGF0Y2hcIlxyXG4gIHBhdGg6IHN0cmluZ1xyXG4gIGh1bmtzOiBIdW5rW11cclxuICBiZWZvcmVIYXNoOiBzdHJpbmcgfCBudWxsXHJcbiAgYWZ0ZXJIYXNoOiBzdHJpbmcgfCBudWxsXHJcbn1cclxuXHJcbmludGVyZmFjZSBGaWxlRGVsZXRpb24ge1xyXG4gIHR5cGU6IFwiZmlsZSBkZWxldGlvblwiXHJcbiAgcGF0aDogc3RyaW5nXHJcbiAgbW9kZTogRmlsZU1vZGVcclxuICBodW5rOiBIdW5rIHwgbnVsbFxyXG4gIGhhc2g6IHN0cmluZyB8IG51bGxcclxufVxyXG5cclxuaW50ZXJmYWNlIEZpbGVDcmVhdGlvbiB7XHJcbiAgdHlwZTogXCJmaWxlIGNyZWF0aW9uXCJcclxuICBtb2RlOiBGaWxlTW9kZVxyXG4gIHBhdGg6IHN0cmluZ1xyXG4gIGh1bms6IEh1bmsgfCBudWxsXHJcbiAgaGFzaDogc3RyaW5nIHwgbnVsbFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYXRjaEZpbGVQYXJ0ID1cclxuICB8IEZpbGVQYXRjaFxyXG4gIHwgRmlsZURlbGV0aW9uXHJcbiAgfCBGaWxlQ3JlYXRpb25cclxuICB8IEZpbGVSZW5hbWVcclxuICB8IEZpbGVNb2RlQ2hhbmdlXHJcblxyXG5leHBvcnQgdHlwZSBQYXJzZWRQYXRjaEZpbGUgPSBQYXRjaEZpbGVQYXJ0W11cclxuXHJcbnR5cGUgU3RhdGUgPSBcInBhcnNpbmcgaGVhZGVyXCIgfCBcInBhcnNpbmcgaHVua3NcIlxyXG5cclxuaW50ZXJmYWNlIEZpbGVEZWV0cyB7XHJcbiAgZGlmZkxpbmVGcm9tUGF0aDogc3RyaW5nIHwgbnVsbFxyXG4gIGRpZmZMaW5lVG9QYXRoOiBzdHJpbmcgfCBudWxsXHJcbiAgb2xkTW9kZTogc3RyaW5nIHwgbnVsbFxyXG4gIG5ld01vZGU6IHN0cmluZyB8IG51bGxcclxuICBkZWxldGVkRmlsZU1vZGU6IHN0cmluZyB8IG51bGxcclxuICBuZXdGaWxlTW9kZTogc3RyaW5nIHwgbnVsbFxyXG4gIHJlbmFtZUZyb206IHN0cmluZyB8IG51bGxcclxuICByZW5hbWVUbzogc3RyaW5nIHwgbnVsbFxyXG4gIGJlZm9yZUhhc2g6IHN0cmluZyB8IG51bGxcclxuICBhZnRlckhhc2g6IHN0cmluZyB8IG51bGxcclxuICBmcm9tUGF0aDogc3RyaW5nIHwgbnVsbFxyXG4gIHRvUGF0aDogc3RyaW5nIHwgbnVsbFxyXG4gIGh1bmtzOiBIdW5rW10gfCBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSHVuayB7XHJcbiAgaGVhZGVyOiBIdW5rSGVhZGVyXHJcbiAgcGFydHM6IFBhdGNoTXV0YXRpb25QYXJ0W11cclxuICBzb3VyY2U6IHN0cmluZ1xyXG59XHJcblxyXG5jb25zdCBlbXB0eUZpbGVQYXRjaCA9ICgpOiBGaWxlRGVldHMgPT4gKHtcclxuICBkaWZmTGluZUZyb21QYXRoOiBudWxsLFxyXG4gIGRpZmZMaW5lVG9QYXRoOiBudWxsLFxyXG4gIG9sZE1vZGU6IG51bGwsXHJcbiAgbmV3TW9kZTogbnVsbCxcclxuICBkZWxldGVkRmlsZU1vZGU6IG51bGwsXHJcbiAgbmV3RmlsZU1vZGU6IG51bGwsXHJcbiAgcmVuYW1lRnJvbTogbnVsbCxcclxuICByZW5hbWVUbzogbnVsbCxcclxuICBiZWZvcmVIYXNoOiBudWxsLFxyXG4gIGFmdGVySGFzaDogbnVsbCxcclxuICBmcm9tUGF0aDogbnVsbCxcclxuICB0b1BhdGg6IG51bGwsXHJcbiAgaHVua3M6IG51bGwsXHJcbn0pXHJcblxyXG5jb25zdCBlbXB0eUh1bmsgPSAoaGVhZGVyTGluZTogc3RyaW5nKTogSHVuayA9PiAoe1xyXG4gIGhlYWRlcjogcGFyc2VIdW5rSGVhZGVyTGluZShoZWFkZXJMaW5lKSxcclxuICBwYXJ0czogW10sXHJcbiAgc291cmNlOiBcIlwiLFxyXG59KVxyXG5cclxuY29uc3QgaHVua0xpbmV0eXBlczoge1xyXG4gIFtrOiBzdHJpbmddOiBQYXRjaE11dGF0aW9uUGFydFtcInR5cGVcIl0gfCBcInByYWdtYVwiIHwgXCJoZWFkZXJcIlxyXG59ID0ge1xyXG4gIFwiQFwiOiBcImhlYWRlclwiLFxyXG4gIFwiLVwiOiBcImRlbGV0aW9uXCIsXHJcbiAgXCIrXCI6IFwiaW5zZXJ0aW9uXCIsXHJcbiAgXCIgXCI6IFwiY29udGV4dFwiLFxyXG4gIFwiXFxcXFwiOiBcInByYWdtYVwiLFxyXG4gIC8vIFRyZWF0IGJsYW5rIGxpbmVzIGFzIGNvbnRleHRcclxuICB1bmRlZmluZWQ6IFwiY29udGV4dFwiLFxyXG4gIFwiXFxyXCI6IFwiY29udGV4dFwiLFxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZVBhdGNoTGluZXMoXHJcbiAgbGluZXM6IHN0cmluZ1tdLFxyXG4gIHsgc3VwcG9ydExlZ2FjeURpZmZzIH06IHsgc3VwcG9ydExlZ2FjeURpZmZzOiBib29sZWFuIH0sXHJcbik6IEZpbGVEZWV0c1tdIHtcclxuICBjb25zdCByZXN1bHQ6IEZpbGVEZWV0c1tdID0gW11cclxuICBsZXQgY3VycmVudEZpbGVQYXRjaDogRmlsZURlZXRzID0gZW1wdHlGaWxlUGF0Y2goKVxyXG4gIGxldCBzdGF0ZTogU3RhdGUgPSBcInBhcnNpbmcgaGVhZGVyXCJcclxuICBsZXQgY3VycmVudEh1bms6IEh1bmsgfCBudWxsID0gbnVsbFxyXG4gIGxldCBjdXJyZW50SHVua011dGF0aW9uUGFydDogUGF0Y2hNdXRhdGlvblBhcnQgfCBudWxsID0gbnVsbFxyXG4gIGxldCBodW5rU3RhcnRMaW5lSW5kZXggPSAwXHJcblxyXG4gIGZ1bmN0aW9uIGNvbW1pdEh1bmsoaTogbnVtYmVyKSB7XHJcbiAgICBpZiAoY3VycmVudEh1bmspIHtcclxuICAgICAgaWYgKGN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0KSB7XHJcbiAgICAgICAgY3VycmVudEh1bmsucGFydHMucHVzaChjdXJyZW50SHVua011dGF0aW9uUGFydClcclxuICAgICAgICBjdXJyZW50SHVua011dGF0aW9uUGFydCA9IG51bGxcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50SHVuay5zb3VyY2UgPSBsaW5lcy5zbGljZShodW5rU3RhcnRMaW5lSW5kZXgsIGkpLmpvaW4oXCJcXG5cIilcclxuICAgICAgY3VycmVudEZpbGVQYXRjaC5odW5rcyEucHVzaChjdXJyZW50SHVuaylcclxuICAgICAgY3VycmVudEh1bmsgPSBudWxsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBjb21taXRGaWxlUGF0Y2goaTogbnVtYmVyKSB7XHJcbiAgICBjb21taXRIdW5rKGkpXHJcbiAgICByZXN1bHQucHVzaChjdXJyZW50RmlsZVBhdGNoKVxyXG4gICAgY3VycmVudEZpbGVQYXRjaCA9IGVtcHR5RmlsZVBhdGNoKClcclxuICB9XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXVxyXG5cclxuICAgIGlmIChzdGF0ZSA9PT0gXCJwYXJzaW5nIGhlYWRlclwiKSB7XHJcbiAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCJAQFwiKSkge1xyXG4gICAgICAgIGh1bmtTdGFydExpbmVJbmRleCA9IGlcclxuICAgICAgICBzdGF0ZSA9IFwicGFyc2luZyBodW5rc1wiXHJcbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5odW5rcyA9IFtdXHJcbiAgICAgICAgaS0tXHJcbiAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFwiZGlmZiAtLWdpdCBcIikpIHtcclxuICAgICAgICBpZiAoY3VycmVudEZpbGVQYXRjaCAmJiBjdXJyZW50RmlsZVBhdGNoLmRpZmZMaW5lRnJvbVBhdGgpIHtcclxuICAgICAgICAgIGNvbW1pdEZpbGVQYXRjaChpKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2goL15kaWZmIC0tZ2l0IGFcXC8oLio/KSBiXFwvKC4qPylcXHMqJC8pXHJcbiAgICAgICAgaWYgKCFtYXRjaCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIGRpZmYgbGluZTogXCIgKyBsaW5lKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjdXJyZW50RmlsZVBhdGNoLmRpZmZMaW5lRnJvbVBhdGggPSBtYXRjaFsxXVxyXG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2guZGlmZkxpbmVUb1BhdGggPSBtYXRjaFsyXVxyXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcIm9sZCBtb2RlIFwiKSkge1xyXG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2gub2xkTW9kZSA9IGxpbmUuc2xpY2UoXCJvbGQgbW9kZSBcIi5sZW5ndGgpLnRyaW0oKVxyXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcIm5ldyBtb2RlIFwiKSkge1xyXG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2gubmV3TW9kZSA9IGxpbmUuc2xpY2UoXCJuZXcgbW9kZSBcIi5sZW5ndGgpLnRyaW0oKVxyXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcImRlbGV0ZWQgZmlsZSBtb2RlIFwiKSkge1xyXG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2guZGVsZXRlZEZpbGVNb2RlID0gbGluZVxyXG4gICAgICAgICAgLnNsaWNlKFwiZGVsZXRlZCBmaWxlIG1vZGUgXCIubGVuZ3RoKVxyXG4gICAgICAgICAgLnRyaW0oKVxyXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcIm5ldyBmaWxlIG1vZGUgXCIpKSB7XHJcbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5uZXdGaWxlTW9kZSA9IGxpbmVcclxuICAgICAgICAgIC5zbGljZShcIm5ldyBmaWxlIG1vZGUgXCIubGVuZ3RoKVxyXG4gICAgICAgICAgLnRyaW0oKVxyXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcInJlbmFtZSBmcm9tIFwiKSkge1xyXG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2gucmVuYW1lRnJvbSA9IGxpbmUuc2xpY2UoXCJyZW5hbWUgZnJvbSBcIi5sZW5ndGgpLnRyaW0oKVxyXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcInJlbmFtZSB0byBcIikpIHtcclxuICAgICAgICBjdXJyZW50RmlsZVBhdGNoLnJlbmFtZVRvID0gbGluZS5zbGljZShcInJlbmFtZSB0byBcIi5sZW5ndGgpLnRyaW0oKVxyXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcImluZGV4IFwiKSkge1xyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvKFxcdyspXFwuXFwuKFxcdyspLylcclxuICAgICAgICBpZiAoIW1hdGNoKSB7XHJcbiAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBjdXJyZW50RmlsZVBhdGNoLmJlZm9yZUhhc2ggPSBtYXRjaFsxXVxyXG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2guYWZ0ZXJIYXNoID0gbWF0Y2hbMl1cclxuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCItLS0gXCIpKSB7XHJcbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5mcm9tUGF0aCA9IGxpbmUuc2xpY2UoXCItLS0gYS9cIi5sZW5ndGgpLnRyaW0oKVxyXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcIisrKyBcIikpIHtcclxuICAgICAgICBjdXJyZW50RmlsZVBhdGNoLnRvUGF0aCA9IGxpbmUuc2xpY2UoXCIrKysgYi9cIi5sZW5ndGgpLnRyaW0oKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoc3VwcG9ydExlZ2FjeURpZmZzICYmIGxpbmUuc3RhcnRzV2l0aChcIi0tLSBhL1wiKSkge1xyXG4gICAgICAgIHN0YXRlID0gXCJwYXJzaW5nIGhlYWRlclwiXHJcbiAgICAgICAgY29tbWl0RmlsZVBhdGNoKGkpXHJcbiAgICAgICAgaS0tXHJcbiAgICAgICAgY29udGludWVcclxuICAgICAgfVxyXG4gICAgICAvLyBwYXJzaW5nIGh1bmtzXHJcbiAgICAgIGNvbnN0IGxpbmVUeXBlID0gaHVua0xpbmV0eXBlc1tsaW5lWzBdXSB8fCBudWxsXHJcbiAgICAgIHN3aXRjaCAobGluZVR5cGUpIHtcclxuICAgICAgICBjYXNlIFwiaGVhZGVyXCI6XHJcbiAgICAgICAgICBjb21taXRIdW5rKGkpXHJcbiAgICAgICAgICBjdXJyZW50SHVuayA9IGVtcHR5SHVuayhsaW5lKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlIG51bGw6XHJcbiAgICAgICAgICAvLyB1bnJlY29nbml6ZWQsIGJhaWwgb3V0XHJcbiAgICAgICAgICBzdGF0ZSA9IFwicGFyc2luZyBoZWFkZXJcIlxyXG4gICAgICAgICAgY29tbWl0RmlsZVBhdGNoKGkpXHJcbiAgICAgICAgICBpLS1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSBcInByYWdtYVwiOlxyXG4gICAgICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoXCJcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGVcIikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIHByYWdtYSBpbiBwYXRjaCBmaWxlOiBcIiArIGxpbmUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIWN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICBcIkJhZCBwYXJzZXIgc3RhdGU6IE5vIG5ld2xpbmUgYXQgRU9GIHByYWdtYSBlbmNvdW50ZXJlZCB3aXRob3V0IGNvbnRleHRcIixcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY3VycmVudEh1bmtNdXRhdGlvblBhcnQubm9OZXdsaW5lQXRFbmRPZkZpbGUgPSB0cnVlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgXCJpbnNlcnRpb25cIjpcclxuICAgICAgICBjYXNlIFwiZGVsZXRpb25cIjpcclxuICAgICAgICBjYXNlIFwiY29udGV4dFwiOlxyXG4gICAgICAgICAgaWYgKCFjdXJyZW50SHVuaykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgXCJCYWQgcGFyc2VyIHN0YXRlOiBIdW5rIGxpbmVzIGVuY291bnRlcmVkIGJlZm9yZSBodW5rIGhlYWRlclwiLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0ICYmXHJcbiAgICAgICAgICAgIGN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0LnR5cGUgIT09IGxpbmVUeXBlXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY3VycmVudEh1bmsucGFydHMucHVzaChjdXJyZW50SHVua011dGF0aW9uUGFydClcclxuICAgICAgICAgICAgY3VycmVudEh1bmtNdXRhdGlvblBhcnQgPSBudWxsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIWN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0KSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0ID0ge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGxpbmVUeXBlLFxyXG4gICAgICAgICAgICAgIGxpbmVzOiBbXSxcclxuICAgICAgICAgICAgICBub05ld2xpbmVBdEVuZE9mRmlsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0LmxpbmVzLnB1c2gobGluZS5zbGljZSgxKSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIC8vIGV4aGF1c2l0dmVuZXNzIGNoZWNrXHJcbiAgICAgICAgICBhc3NlcnROZXZlcihsaW5lVHlwZSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29tbWl0RmlsZVBhdGNoKGxpbmVzLmxlbmd0aClcclxuXHJcbiAgZm9yIChjb25zdCB7IGh1bmtzIH0gb2YgcmVzdWx0KSB7XHJcbiAgICBpZiAoaHVua3MpIHtcclxuICAgICAgZm9yIChjb25zdCBodW5rIG9mIGh1bmtzKSB7XHJcbiAgICAgICAgdmVyaWZ5SHVua0ludGVncml0eShodW5rKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnByZXRQYXJzZWRQYXRjaEZpbGUoZmlsZXM6IEZpbGVEZWV0c1tdKTogUGFyc2VkUGF0Y2hGaWxlIHtcclxuICBjb25zdCByZXN1bHQ6IFBhcnNlZFBhdGNoRmlsZSA9IFtdXHJcblxyXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBkaWZmTGluZUZyb21QYXRoLFxyXG4gICAgICBkaWZmTGluZVRvUGF0aCxcclxuICAgICAgb2xkTW9kZSxcclxuICAgICAgbmV3TW9kZSxcclxuICAgICAgZGVsZXRlZEZpbGVNb2RlLFxyXG4gICAgICBuZXdGaWxlTW9kZSxcclxuICAgICAgcmVuYW1lRnJvbSxcclxuICAgICAgcmVuYW1lVG8sXHJcbiAgICAgIGJlZm9yZUhhc2gsXHJcbiAgICAgIGFmdGVySGFzaCxcclxuICAgICAgZnJvbVBhdGgsXHJcbiAgICAgIHRvUGF0aCxcclxuICAgICAgaHVua3MsXHJcbiAgICB9ID0gZmlsZVxyXG4gICAgY29uc3QgdHlwZTogUGF0Y2hGaWxlUGFydFtcInR5cGVcIl0gPSByZW5hbWVGcm9tXHJcbiAgICAgID8gXCJyZW5hbWVcIlxyXG4gICAgICA6IGRlbGV0ZWRGaWxlTW9kZVxyXG4gICAgICA/IFwiZmlsZSBkZWxldGlvblwiXHJcbiAgICAgIDogbmV3RmlsZU1vZGVcclxuICAgICAgPyBcImZpbGUgY3JlYXRpb25cIlxyXG4gICAgICA6IGh1bmtzICYmIGh1bmtzLmxlbmd0aCA+IDBcclxuICAgICAgPyBcInBhdGNoXCJcclxuICAgICAgOiBcIm1vZGUgY2hhbmdlXCJcclxuXHJcbiAgICBsZXQgZGVzdGluYXRpb25GaWxlUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGxcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlIFwicmVuYW1lXCI6XHJcbiAgICAgICAgaWYgKCFyZW5hbWVGcm9tIHx8ICFyZW5hbWVUbykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHBhcnNlciBzdGF0ZTogcmVuYW1lIGZyb20gJiB0byBub3QgZ2l2ZW5cIilcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzdWx0LnB1c2goe1xyXG4gICAgICAgICAgdHlwZTogXCJyZW5hbWVcIixcclxuICAgICAgICAgIGZyb21QYXRoOiByZW5hbWVGcm9tLFxyXG4gICAgICAgICAgdG9QYXRoOiByZW5hbWVUbyxcclxuICAgICAgICB9KVxyXG4gICAgICAgIGRlc3RpbmF0aW9uRmlsZVBhdGggPSByZW5hbWVUb1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgXCJmaWxlIGRlbGV0aW9uXCI6IHtcclxuICAgICAgICBjb25zdCBwYXRoID0gZGlmZkxpbmVGcm9tUGF0aCB8fCBmcm9tUGF0aFxyXG4gICAgICAgIGlmICghcGF0aCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHBhcnNlIHN0YXRlOiBubyBwYXRoIGdpdmVuIGZvciBmaWxlIGRlbGV0aW9uXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5wdXNoKHtcclxuICAgICAgICAgIHR5cGU6IFwiZmlsZSBkZWxldGlvblwiLFxyXG4gICAgICAgICAgaHVuazogKGh1bmtzICYmIGh1bmtzWzBdKSB8fCBudWxsLFxyXG4gICAgICAgICAgcGF0aCxcclxuICAgICAgICAgIG1vZGU6IHBhcnNlRmlsZU1vZGUoZGVsZXRlZEZpbGVNb2RlISksXHJcbiAgICAgICAgICBoYXNoOiBiZWZvcmVIYXNoLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIFwiZmlsZSBjcmVhdGlvblwiOiB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IGRpZmZMaW5lVG9QYXRoIHx8IHRvUGF0aFxyXG4gICAgICAgIGlmICghcGF0aCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHBhcnNlIHN0YXRlOiBubyBwYXRoIGdpdmVuIGZvciBmaWxlIGNyZWF0aW9uXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5wdXNoKHtcclxuICAgICAgICAgIHR5cGU6IFwiZmlsZSBjcmVhdGlvblwiLFxyXG4gICAgICAgICAgaHVuazogKGh1bmtzICYmIGh1bmtzWzBdKSB8fCBudWxsLFxyXG4gICAgICAgICAgcGF0aCxcclxuICAgICAgICAgIG1vZGU6IHBhcnNlRmlsZU1vZGUobmV3RmlsZU1vZGUhKSxcclxuICAgICAgICAgIGhhc2g6IGFmdGVySGFzaCxcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBcInBhdGNoXCI6XHJcbiAgICAgIGNhc2UgXCJtb2RlIGNoYW5nZVwiOlxyXG4gICAgICAgIGRlc3RpbmF0aW9uRmlsZVBhdGggPSB0b1BhdGggfHwgZGlmZkxpbmVUb1BhdGhcclxuICAgICAgICBicmVha1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGFzc2VydE5ldmVyKHR5cGUpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRlc3RpbmF0aW9uRmlsZVBhdGggJiYgb2xkTW9kZSAmJiBuZXdNb2RlICYmIG9sZE1vZGUgIT09IG5ld01vZGUpIHtcclxuICAgICAgcmVzdWx0LnB1c2goe1xyXG4gICAgICAgIHR5cGU6IFwibW9kZSBjaGFuZ2VcIixcclxuICAgICAgICBwYXRoOiBkZXN0aW5hdGlvbkZpbGVQYXRoLFxyXG4gICAgICAgIG9sZE1vZGU6IHBhcnNlRmlsZU1vZGUob2xkTW9kZSksXHJcbiAgICAgICAgbmV3TW9kZTogcGFyc2VGaWxlTW9kZShuZXdNb2RlKSxcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGVzdGluYXRpb25GaWxlUGF0aCAmJiBodW5rcyAmJiBodW5rcy5sZW5ndGgpIHtcclxuICAgICAgcmVzdWx0LnB1c2goe1xyXG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcclxuICAgICAgICBwYXRoOiBkZXN0aW5hdGlvbkZpbGVQYXRoLFxyXG4gICAgICAgIGh1bmtzLFxyXG4gICAgICAgIGJlZm9yZUhhc2gsXHJcbiAgICAgICAgYWZ0ZXJIYXNoLFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUZpbGVNb2RlKG1vZGU6IHN0cmluZyk6IEZpbGVNb2RlIHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxyXG4gIGNvbnN0IHBhcnNlZE1vZGUgPSBwYXJzZUludChtb2RlLCA4KSAmIDBvNzc3XHJcbiAgaWYgKFxyXG4gICAgcGFyc2VkTW9kZSAhPT0gTk9OX0VYRUNVVEFCTEVfRklMRV9NT0RFICYmXHJcbiAgICBwYXJzZWRNb2RlICE9PSBFWEVDVVRBQkxFX0ZJTEVfTU9ERVxyXG4gICkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBmaWxlIG1vZGUgc3RyaW5nOiBcIiArIG1vZGUpXHJcbiAgfVxyXG4gIHJldHVybiBwYXJzZWRNb2RlXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhdGNoRmlsZShmaWxlOiBzdHJpbmcpOiBQYXJzZWRQYXRjaEZpbGUge1xyXG4gIGNvbnN0IGxpbmVzID0gZmlsZS5zcGxpdCgvXFxuL2cpXHJcbiAgaWYgKGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID09PSBcIlwiKSB7XHJcbiAgICBsaW5lcy5wb3AoKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgcmV0dXJuIGludGVycHJldFBhcnNlZFBhdGNoRmlsZShcclxuICAgICAgcGFyc2VQYXRjaExpbmVzKGxpbmVzLCB7IHN1cHBvcnRMZWdhY3lEaWZmczogZmFsc2UgfSksXHJcbiAgICApXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgaWYgKFxyXG4gICAgICBlIGluc3RhbmNlb2YgRXJyb3IgJiZcclxuICAgICAgZS5tZXNzYWdlID09PSBcImh1bmsgaGVhZGVyIGludGVncml0eSBjaGVjayBmYWlsZWRcIlxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBpbnRlcnByZXRQYXJzZWRQYXRjaEZpbGUoXHJcbiAgICAgICAgcGFyc2VQYXRjaExpbmVzKGxpbmVzLCB7IHN1cHBvcnRMZWdhY3lEaWZmczogdHJ1ZSB9KSxcclxuICAgICAgKVxyXG4gICAgfVxyXG4gICAgdGhyb3cgZVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeUh1bmtJbnRlZ3JpdHkoaHVuazogSHVuaykge1xyXG4gIC8vIHZlcmlmeSBodW5rIGludGVncml0eVxyXG4gIGxldCBvcmlnaW5hbExlbmd0aCA9IDBcclxuICBsZXQgcGF0Y2hlZExlbmd0aCA9IDBcclxuICBmb3IgKGNvbnN0IHsgdHlwZSwgbGluZXMgfSBvZiBodW5rLnBhcnRzKSB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSBcImNvbnRleHRcIjpcclxuICAgICAgICBwYXRjaGVkTGVuZ3RoICs9IGxpbmVzLmxlbmd0aFxyXG4gICAgICAgIG9yaWdpbmFsTGVuZ3RoICs9IGxpbmVzLmxlbmd0aFxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgXCJkZWxldGlvblwiOlxyXG4gICAgICAgIG9yaWdpbmFsTGVuZ3RoICs9IGxpbmVzLmxlbmd0aFxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgXCJpbnNlcnRpb25cIjpcclxuICAgICAgICBwYXRjaGVkTGVuZ3RoICs9IGxpbmVzLmxlbmd0aFxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYXNzZXJ0TmV2ZXIodHlwZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChcclxuICAgIG9yaWdpbmFsTGVuZ3RoICE9PSBodW5rLmhlYWRlci5vcmlnaW5hbC5sZW5ndGggfHxcclxuICAgIHBhdGNoZWRMZW5ndGggIT09IGh1bmsuaGVhZGVyLnBhdGNoZWQubGVuZ3RoXHJcbiAgKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJodW5rIGhlYWRlciBpbnRlZ3JpdHkgY2hlY2sgZmFpbGVkXCIpXHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.readPatch = readPatch;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const fs_extra_1 = require("fs-extra");
|
|
9
|
+
const path_1 = require("../path");
|
|
10
|
+
const path_2 = require("path");
|
|
11
|
+
const parse_1 = require("./parse");
|
|
12
|
+
function readPatch({ patchFilePath, patchDetails, patchDir, }) {
|
|
13
|
+
try {
|
|
14
|
+
return (0, parse_1.parsePatchFile)((0, fs_extra_1.readFileSync)(patchFilePath).toString());
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
const fixupSteps = [];
|
|
18
|
+
const relativePatchFilePath = (0, path_2.normalize)((0, path_1.relative)(process.cwd(), patchFilePath));
|
|
19
|
+
const patchBaseDir = relativePatchFilePath.slice(0, relativePatchFilePath.indexOf(patchDir));
|
|
20
|
+
if (patchBaseDir) {
|
|
21
|
+
fixupSteps.push(`cd ${patchBaseDir}`);
|
|
22
|
+
}
|
|
23
|
+
fixupSteps.push(`patch -p1 -i ${relativePatchFilePath.slice(relativePatchFilePath.indexOf(patchDir))}`);
|
|
24
|
+
fixupSteps.push(`npx patch-package ${patchDetails.pathSpecifier}`);
|
|
25
|
+
if (patchBaseDir) {
|
|
26
|
+
fixupSteps.push(`cd ${(0, path_1.relative)((0, path_1.resolve)(process.cwd(), patchBaseDir), process.cwd())}`);
|
|
27
|
+
}
|
|
28
|
+
console.log(`
|
|
29
|
+
${chalk_1.default.red.bold("**ERROR**")} ${chalk_1.default.red(`Failed to apply patch for package ${chalk_1.default.bold(patchDetails.humanReadablePathSpecifier)}`)}
|
|
30
|
+
|
|
31
|
+
This happened because the patch file ${relativePatchFilePath} could not be parsed.
|
|
32
|
+
|
|
33
|
+
If you just upgraded patch-package, you can try running:
|
|
34
|
+
|
|
35
|
+
${fixupSteps.join("\n ")}
|
|
36
|
+
|
|
37
|
+
Otherwise, try manually creating the patch file again.
|
|
38
|
+
|
|
39
|
+
If the problem persists, please submit a bug report:
|
|
40
|
+
|
|
41
|
+
https://github.com/ds300/patch-package/issues/new?title=Patch+file+parse+error&body=%3CPlease+attach+the+patch+file+in+question%3E
|
|
42
|
+
|
|
43
|
+
`);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9yZWFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBT0EsOEJBMERDO0FBakVELGtEQUF5QjtBQUN6Qix1Q0FBdUM7QUFDdkMsa0NBQTJDO0FBQzNDLCtCQUFnQztBQUVoQyxtQ0FBdUQ7QUFFdkQsU0FBZ0IsU0FBUyxDQUFDLEVBQ3hCLGFBQWEsRUFDYixZQUFZLEVBQ1osUUFBUSxHQUtUO0lBQ0MsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFBLHNCQUFjLEVBQUMsSUFBQSx1QkFBWSxFQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUE7UUFDL0IsTUFBTSxxQkFBcUIsR0FBRyxJQUFBLGdCQUFTLEVBQ3JDLElBQUEsZUFBUSxFQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FDdkMsQ0FBQTtRQUNELE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FDOUMsQ0FBQyxFQUNELHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FDeEMsQ0FBQTtRQUNELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLFlBQVksRUFBRSxDQUFDLENBQUE7UUFDdkMsQ0FBQztRQUNELFVBQVUsQ0FBQyxJQUFJLENBQ2IsZ0JBQWdCLHFCQUFxQixDQUFDLEtBQUssQ0FDekMscUJBQXFCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUN4QyxFQUFFLENBQ0osQ0FBQTtRQUNELFVBQVUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBO1FBQ2xFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsVUFBVSxDQUFDLElBQUksQ0FDYixNQUFNLElBQUEsZUFBUSxFQUFDLElBQUEsY0FBTyxFQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUN0RSxDQUFBO1FBQ0gsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUM7RUFDZCxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxlQUFLLENBQUMsR0FBRyxDQUNwQyxxQ0FBcUMsZUFBSyxDQUFDLElBQUksQ0FDN0MsWUFBWSxDQUFDLDBCQUEwQixDQUN4QyxFQUFFLENBQ0o7O3lDQUVvQyxxQkFBcUI7Ozs7TUFJeEQsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7O0NBUTlCLENBQUMsQ0FBQTtRQUNFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUNELE9BQU8sRUFBRSxDQUFBO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIlxyXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnMtZXh0cmFcIlxyXG5pbXBvcnQgeyByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gXCIuLi9wYXRoXCJcclxuaW1wb3J0IHsgbm9ybWFsaXplIH0gZnJvbSBcInBhdGhcIlxyXG5pbXBvcnQgeyBQYWNrYWdlRGV0YWlscyB9IGZyb20gXCIuLi9QYWNrYWdlRGV0YWlsc1wiXHJcbmltcG9ydCB7IHBhcnNlUGF0Y2hGaWxlLCBQYXRjaEZpbGVQYXJ0IH0gZnJvbSBcIi4vcGFyc2VcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRQYXRjaCh7XHJcbiAgcGF0Y2hGaWxlUGF0aCxcclxuICBwYXRjaERldGFpbHMsXHJcbiAgcGF0Y2hEaXIsXHJcbn06IHtcclxuICBwYXRjaEZpbGVQYXRoOiBzdHJpbmdcclxuICBwYXRjaERldGFpbHM6IFBhY2thZ2VEZXRhaWxzXHJcbiAgcGF0Y2hEaXI6IHN0cmluZ1xyXG59KTogUGF0Y2hGaWxlUGFydFtdIHtcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIHBhcnNlUGF0Y2hGaWxlKHJlYWRGaWxlU3luYyhwYXRjaEZpbGVQYXRoKS50b1N0cmluZygpKVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIGNvbnN0IGZpeHVwU3RlcHM6IHN0cmluZ1tdID0gW11cclxuICAgIGNvbnN0IHJlbGF0aXZlUGF0Y2hGaWxlUGF0aCA9IG5vcm1hbGl6ZShcclxuICAgICAgcmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0Y2hGaWxlUGF0aCksXHJcbiAgICApXHJcbiAgICBjb25zdCBwYXRjaEJhc2VEaXIgPSByZWxhdGl2ZVBhdGNoRmlsZVBhdGguc2xpY2UoXHJcbiAgICAgIDAsXHJcbiAgICAgIHJlbGF0aXZlUGF0Y2hGaWxlUGF0aC5pbmRleE9mKHBhdGNoRGlyKSxcclxuICAgIClcclxuICAgIGlmIChwYXRjaEJhc2VEaXIpIHtcclxuICAgICAgZml4dXBTdGVwcy5wdXNoKGBjZCAke3BhdGNoQmFzZURpcn1gKVxyXG4gICAgfVxyXG4gICAgZml4dXBTdGVwcy5wdXNoKFxyXG4gICAgICBgcGF0Y2ggLXAxIC1pICR7cmVsYXRpdmVQYXRjaEZpbGVQYXRoLnNsaWNlKFxyXG4gICAgICAgIHJlbGF0aXZlUGF0Y2hGaWxlUGF0aC5pbmRleE9mKHBhdGNoRGlyKSxcclxuICAgICAgKX1gLFxyXG4gICAgKVxyXG4gICAgZml4dXBTdGVwcy5wdXNoKGBucHggcGF0Y2gtcGFja2FnZSAke3BhdGNoRGV0YWlscy5wYXRoU3BlY2lmaWVyfWApXHJcbiAgICBpZiAocGF0Y2hCYXNlRGlyKSB7XHJcbiAgICAgIGZpeHVwU3RlcHMucHVzaChcclxuICAgICAgICBgY2QgJHtyZWxhdGl2ZShyZXNvbHZlKHByb2Nlc3MuY3dkKCksIHBhdGNoQmFzZURpciksIHByb2Nlc3MuY3dkKCkpfWAsXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZyhgXHJcbiR7Y2hhbGsucmVkLmJvbGQoXCIqKkVSUk9SKipcIil9ICR7Y2hhbGsucmVkKFxyXG4gICAgICBgRmFpbGVkIHRvIGFwcGx5IHBhdGNoIGZvciBwYWNrYWdlICR7Y2hhbGsuYm9sZChcclxuICAgICAgICBwYXRjaERldGFpbHMuaHVtYW5SZWFkYWJsZVBhdGhTcGVjaWZpZXIsXHJcbiAgICAgICl9YCxcclxuICAgICl9XHJcbiAgICBcclxuICBUaGlzIGhhcHBlbmVkIGJlY2F1c2UgdGhlIHBhdGNoIGZpbGUgJHtyZWxhdGl2ZVBhdGNoRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSBwYXJzZWQuXHJcbiAgIFxyXG4gIElmIHlvdSBqdXN0IHVwZ3JhZGVkIHBhdGNoLXBhY2thZ2UsIHlvdSBjYW4gdHJ5IHJ1bm5pbmc6XHJcbiAgXHJcbiAgICAke2ZpeHVwU3RlcHMuam9pbihcIlxcbiAgICBcIil9XHJcbiAgICBcclxuICBPdGhlcndpc2UsIHRyeSBtYW51YWxseSBjcmVhdGluZyB0aGUgcGF0Y2ggZmlsZSBhZ2Fpbi5cclxuICBcclxuICBJZiB0aGUgcHJvYmxlbSBwZXJzaXN0cywgcGxlYXNlIHN1Ym1pdCBhIGJ1ZyByZXBvcnQ6XHJcbiAgXHJcbiAgICBodHRwczovL2dpdGh1Yi5jb20vZHMzMDAvcGF0Y2gtcGFja2FnZS9pc3N1ZXMvbmV3P3RpdGxlPVBhdGNoK2ZpbGUrcGFyc2UrZXJyb3ImYm9keT0lM0NQbGVhc2UrYXR0YWNoK3RoZStwYXRjaCtmaWxlK2luK3F1ZXN0aW9uJTNFXHJcblxyXG5gKVxyXG4gICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgfVxyXG4gIHJldHVybiBbXVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reversePatch = void 0;
|
|
4
|
+
const parse_1 = require("./parse");
|
|
5
|
+
const assertNever_1 = require("../assertNever");
|
|
6
|
+
function reverseHunk(hunk) {
|
|
7
|
+
const header = {
|
|
8
|
+
original: hunk.header.patched,
|
|
9
|
+
patched: hunk.header.original,
|
|
10
|
+
};
|
|
11
|
+
const parts = [];
|
|
12
|
+
for (const part of hunk.parts) {
|
|
13
|
+
switch (part.type) {
|
|
14
|
+
case "context":
|
|
15
|
+
parts.push(part);
|
|
16
|
+
break;
|
|
17
|
+
case "deletion":
|
|
18
|
+
parts.push({
|
|
19
|
+
type: "insertion",
|
|
20
|
+
lines: part.lines,
|
|
21
|
+
noNewlineAtEndOfFile: part.noNewlineAtEndOfFile,
|
|
22
|
+
});
|
|
23
|
+
break;
|
|
24
|
+
case "insertion":
|
|
25
|
+
parts.push({
|
|
26
|
+
type: "deletion",
|
|
27
|
+
lines: part.lines,
|
|
28
|
+
noNewlineAtEndOfFile: part.noNewlineAtEndOfFile,
|
|
29
|
+
});
|
|
30
|
+
break;
|
|
31
|
+
default:
|
|
32
|
+
(0, assertNever_1.assertNever)(part.type);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// swap insertions and deletions over so deletions always come first
|
|
36
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
37
|
+
if (parts[i].type === "insertion" && parts[i + 1].type === "deletion") {
|
|
38
|
+
const tmp = parts[i];
|
|
39
|
+
parts[i] = parts[i + 1];
|
|
40
|
+
parts[i + 1] = tmp;
|
|
41
|
+
i += 1;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const result = {
|
|
45
|
+
header,
|
|
46
|
+
parts,
|
|
47
|
+
source: hunk.source,
|
|
48
|
+
};
|
|
49
|
+
(0, parse_1.verifyHunkIntegrity)(result);
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
function reversePatchPart(part) {
|
|
53
|
+
switch (part.type) {
|
|
54
|
+
case "file creation":
|
|
55
|
+
return {
|
|
56
|
+
type: "file deletion",
|
|
57
|
+
path: part.path,
|
|
58
|
+
hash: part.hash,
|
|
59
|
+
hunk: part.hunk && reverseHunk(part.hunk),
|
|
60
|
+
mode: part.mode,
|
|
61
|
+
};
|
|
62
|
+
case "file deletion":
|
|
63
|
+
return {
|
|
64
|
+
type: "file creation",
|
|
65
|
+
path: part.path,
|
|
66
|
+
hunk: part.hunk && reverseHunk(part.hunk),
|
|
67
|
+
mode: part.mode,
|
|
68
|
+
hash: part.hash,
|
|
69
|
+
};
|
|
70
|
+
case "rename":
|
|
71
|
+
return {
|
|
72
|
+
type: "rename",
|
|
73
|
+
fromPath: part.toPath,
|
|
74
|
+
toPath: part.fromPath,
|
|
75
|
+
};
|
|
76
|
+
case "patch":
|
|
77
|
+
return {
|
|
78
|
+
type: "patch",
|
|
79
|
+
path: part.path,
|
|
80
|
+
hunks: part.hunks.map(reverseHunk),
|
|
81
|
+
beforeHash: part.afterHash,
|
|
82
|
+
afterHash: part.beforeHash,
|
|
83
|
+
};
|
|
84
|
+
case "mode change":
|
|
85
|
+
return {
|
|
86
|
+
type: "mode change",
|
|
87
|
+
path: part.path,
|
|
88
|
+
newMode: part.oldMode,
|
|
89
|
+
oldMode: part.newMode,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const reversePatch = (patch) => {
|
|
94
|
+
return patch.map(reversePatchPart).reverse();
|
|
95
|
+
};
|
|
96
|
+
exports.reversePatch = reversePatch;
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9yZXZlcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQU1nQjtBQUNoQixnREFBNEM7QUFFNUMsU0FBUyxXQUFXLENBQUMsSUFBVTtJQUM3QixNQUFNLE1BQU0sR0FBZTtRQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO1FBQzdCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7S0FDOUIsQ0FBQTtJQUNELE1BQU0sS0FBSyxHQUFrQixFQUFFLENBQUE7SUFFL0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsS0FBSyxTQUFTO2dCQUNaLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2hCLE1BQUs7WUFDUCxLQUFLLFVBQVU7Z0JBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQztvQkFDVCxJQUFJLEVBQUUsV0FBVztvQkFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO29CQUNqQixvQkFBb0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CO2lCQUNoRCxDQUFDLENBQUE7Z0JBQ0YsTUFBSztZQUNQLEtBQUssV0FBVztnQkFDZCxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUNULElBQUksRUFBRSxVQUFVO29CQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7b0JBQ2pCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxvQkFBb0I7aUJBQ2hELENBQUMsQ0FBQTtnQkFDRixNQUFLO1lBQ1A7Z0JBQ0UsSUFBQSx5QkFBVyxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNwQixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUN2QixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtZQUNsQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ1IsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBUztRQUNuQixNQUFNO1FBQ04sS0FBSztRQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtLQUNwQixDQUFBO0lBRUQsSUFBQSwyQkFBbUIsRUFBQyxNQUFNLENBQUMsQ0FBQTtJQUUzQixPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLElBQW1CO0lBQzNDLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLEtBQUssZUFBZTtZQUNsQixPQUFPO2dCQUNMLElBQUksRUFBRSxlQUFlO2dCQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUN6QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7YUFDaEIsQ0FBQTtRQUNILEtBQUssZUFBZTtZQUNsQixPQUFPO2dCQUNMLElBQUksRUFBRSxlQUFlO2dCQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7YUFDaEIsQ0FBQTtRQUNILEtBQUssUUFBUTtZQUNYLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDdEIsQ0FBQTtRQUNILEtBQUssT0FBTztZQUNWLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7Z0JBQ2xDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO2FBQzNCLENBQUE7UUFDSCxLQUFLLGFBQWE7WUFDaEIsT0FBTztnQkFDTCxJQUFJLEVBQUUsYUFBYTtnQkFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2FBQ3RCLENBQUE7SUFDTCxDQUFDO0FBQ0gsQ0FBQztBQUVNLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBc0IsRUFBbUIsRUFBRTtJQUN0RSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUM5QyxDQUFDLENBQUE7QUFGWSxRQUFBLFlBQVksZ0JBRXhCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBQYXJzZWRQYXRjaEZpbGUsXHJcbiAgUGF0Y2hGaWxlUGFydCxcclxuICBIdW5rLFxyXG4gIEh1bmtIZWFkZXIsXHJcbiAgdmVyaWZ5SHVua0ludGVncml0eSxcclxufSBmcm9tIFwiLi9wYXJzZVwiXHJcbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSBcIi4uL2Fzc2VydE5ldmVyXCJcclxuXHJcbmZ1bmN0aW9uIHJldmVyc2VIdW5rKGh1bms6IEh1bmspOiBIdW5rIHtcclxuICBjb25zdCBoZWFkZXI6IEh1bmtIZWFkZXIgPSB7XHJcbiAgICBvcmlnaW5hbDogaHVuay5oZWFkZXIucGF0Y2hlZCxcclxuICAgIHBhdGNoZWQ6IGh1bmsuaGVhZGVyLm9yaWdpbmFsLFxyXG4gIH1cclxuICBjb25zdCBwYXJ0czogSHVua1tcInBhcnRzXCJdID0gW11cclxuXHJcbiAgZm9yIChjb25zdCBwYXJ0IG9mIGh1bmsucGFydHMpIHtcclxuICAgIHN3aXRjaCAocGFydC50eXBlKSB7XHJcbiAgICAgIGNhc2UgXCJjb250ZXh0XCI6XHJcbiAgICAgICAgcGFydHMucHVzaChwYXJ0KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgXCJkZWxldGlvblwiOlxyXG4gICAgICAgIHBhcnRzLnB1c2goe1xyXG4gICAgICAgICAgdHlwZTogXCJpbnNlcnRpb25cIixcclxuICAgICAgICAgIGxpbmVzOiBwYXJ0LmxpbmVzLFxyXG4gICAgICAgICAgbm9OZXdsaW5lQXRFbmRPZkZpbGU6IHBhcnQubm9OZXdsaW5lQXRFbmRPZkZpbGUsXHJcbiAgICAgICAgfSlcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIFwiaW5zZXJ0aW9uXCI6XHJcbiAgICAgICAgcGFydHMucHVzaCh7XHJcbiAgICAgICAgICB0eXBlOiBcImRlbGV0aW9uXCIsXHJcbiAgICAgICAgICBsaW5lczogcGFydC5saW5lcyxcclxuICAgICAgICAgIG5vTmV3bGluZUF0RW5kT2ZGaWxlOiBwYXJ0Lm5vTmV3bGluZUF0RW5kT2ZGaWxlLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBhc3NlcnROZXZlcihwYXJ0LnR5cGUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBzd2FwIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucyBvdmVyIHNvIGRlbGV0aW9ucyBhbHdheXMgY29tZSBmaXJzdFxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICBpZiAocGFydHNbaV0udHlwZSA9PT0gXCJpbnNlcnRpb25cIiAmJiBwYXJ0c1tpICsgMV0udHlwZSA9PT0gXCJkZWxldGlvblwiKSB7XHJcbiAgICAgIGNvbnN0IHRtcCA9IHBhcnRzW2ldXHJcbiAgICAgIHBhcnRzW2ldID0gcGFydHNbaSArIDFdXHJcbiAgICAgIHBhcnRzW2kgKyAxXSA9IHRtcFxyXG4gICAgICBpICs9IDFcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogSHVuayA9IHtcclxuICAgIGhlYWRlcixcclxuICAgIHBhcnRzLFxyXG4gICAgc291cmNlOiBodW5rLnNvdXJjZSxcclxuICB9XHJcblxyXG4gIHZlcmlmeUh1bmtJbnRlZ3JpdHkocmVzdWx0KVxyXG5cclxuICByZXR1cm4gcmVzdWx0XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJldmVyc2VQYXRjaFBhcnQocGFydDogUGF0Y2hGaWxlUGFydCk6IFBhdGNoRmlsZVBhcnQge1xyXG4gIHN3aXRjaCAocGFydC50eXBlKSB7XHJcbiAgICBjYXNlIFwiZmlsZSBjcmVhdGlvblwiOlxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFwiZmlsZSBkZWxldGlvblwiLFxyXG4gICAgICAgIHBhdGg6IHBhcnQucGF0aCxcclxuICAgICAgICBoYXNoOiBwYXJ0Lmhhc2gsXHJcbiAgICAgICAgaHVuazogcGFydC5odW5rICYmIHJldmVyc2VIdW5rKHBhcnQuaHVuayksXHJcbiAgICAgICAgbW9kZTogcGFydC5tb2RlLFxyXG4gICAgICB9XHJcbiAgICBjYXNlIFwiZmlsZSBkZWxldGlvblwiOlxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFwiZmlsZSBjcmVhdGlvblwiLFxyXG4gICAgICAgIHBhdGg6IHBhcnQucGF0aCxcclxuICAgICAgICBodW5rOiBwYXJ0Lmh1bmsgJiYgcmV2ZXJzZUh1bmsocGFydC5odW5rKSxcclxuICAgICAgICBtb2RlOiBwYXJ0Lm1vZGUsXHJcbiAgICAgICAgaGFzaDogcGFydC5oYXNoLFxyXG4gICAgICB9XHJcbiAgICBjYXNlIFwicmVuYW1lXCI6XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdHlwZTogXCJyZW5hbWVcIixcclxuICAgICAgICBmcm9tUGF0aDogcGFydC50b1BhdGgsXHJcbiAgICAgICAgdG9QYXRoOiBwYXJ0LmZyb21QYXRoLFxyXG4gICAgICB9XHJcbiAgICBjYXNlIFwicGF0Y2hcIjpcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBcInBhdGNoXCIsXHJcbiAgICAgICAgcGF0aDogcGFydC5wYXRoLFxyXG4gICAgICAgIGh1bmtzOiBwYXJ0Lmh1bmtzLm1hcChyZXZlcnNlSHVuayksXHJcbiAgICAgICAgYmVmb3JlSGFzaDogcGFydC5hZnRlckhhc2gsXHJcbiAgICAgICAgYWZ0ZXJIYXNoOiBwYXJ0LmJlZm9yZUhhc2gsXHJcbiAgICAgIH1cclxuICAgIGNhc2UgXCJtb2RlIGNoYW5nZVwiOlxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFwibW9kZSBjaGFuZ2VcIixcclxuICAgICAgICBwYXRoOiBwYXJ0LnBhdGgsXHJcbiAgICAgICAgbmV3TW9kZTogcGFydC5vbGRNb2RlLFxyXG4gICAgICAgIG9sZE1vZGU6IHBhcnQubmV3TW9kZSxcclxuICAgICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHJldmVyc2VQYXRjaCA9IChwYXRjaDogUGFyc2VkUGF0Y2hGaWxlKTogUGFyc2VkUGF0Y2hGaWxlID0+IHtcclxuICByZXR1cm4gcGF0Y2gubWFwKHJldmVyc2VQYXRjaFBhcnQpLnJldmVyc2UoKVxyXG59XHJcbiJdfQ==
|
package/dist/patchFs.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getGroupedPatches = exports.getPatchFiles = void 0;
|
|
7
|
+
const PackageDetails_1 = require("./PackageDetails");
|
|
8
|
+
const path_1 = require("./path");
|
|
9
|
+
const klaw_sync_1 = __importDefault(require("klaw-sync"));
|
|
10
|
+
const getPatchFiles = (patchesDir) => {
|
|
11
|
+
try {
|
|
12
|
+
return (0, klaw_sync_1.default)(patchesDir, { nodir: true })
|
|
13
|
+
.map(({ path }) => (0, path_1.relative)(patchesDir, path))
|
|
14
|
+
.filter((path) => path.endsWith(".patch"));
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
exports.getPatchFiles = getPatchFiles;
|
|
21
|
+
const getGroupedPatches = (patchesDirectory) => {
|
|
22
|
+
const files = (0, exports.getPatchFiles)(patchesDirectory);
|
|
23
|
+
if (files.length === 0) {
|
|
24
|
+
return {
|
|
25
|
+
numPatchFiles: 0,
|
|
26
|
+
pathSpecifierToPatchFiles: {},
|
|
27
|
+
warnings: [],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const warnings = [];
|
|
31
|
+
const pathSpecifierToPatchFiles = {};
|
|
32
|
+
for (const file of files) {
|
|
33
|
+
const details = (0, PackageDetails_1.getPackageDetailsFromPatchFilename)(file);
|
|
34
|
+
if (!details) {
|
|
35
|
+
warnings.push(`Unrecognized patch file in patches directory ${file}`);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (!pathSpecifierToPatchFiles[details.pathSpecifier]) {
|
|
39
|
+
pathSpecifierToPatchFiles[details.pathSpecifier] = [];
|
|
40
|
+
}
|
|
41
|
+
pathSpecifierToPatchFiles[details.pathSpecifier].push(details);
|
|
42
|
+
}
|
|
43
|
+
for (const arr of Object.values(pathSpecifierToPatchFiles)) {
|
|
44
|
+
arr.sort((a, b) => {
|
|
45
|
+
return (a.sequenceNumber ?? 0) - (b.sequenceNumber ?? 0);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
numPatchFiles: files.length,
|
|
50
|
+
pathSpecifierToPatchFiles,
|
|
51
|
+
warnings,
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
exports.getGroupedPatches = getGroupedPatches;
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0Y2hGcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXRjaEZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUd5QjtBQUN6QixpQ0FBaUM7QUFDakMsMERBQWdDO0FBRXpCLE1BQU0sYUFBYSxHQUFHLENBQUMsVUFBa0IsRUFBRSxFQUFFO0lBQ2xELElBQUksQ0FBQztRQUNILE9BQU8sSUFBQSxtQkFBUSxFQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUN6QyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFBLGVBQVEsRUFBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDN0MsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7QUFDSCxDQUFDLENBQUE7QUFSWSxRQUFBLGFBQWEsaUJBUXpCO0FBT00sTUFBTSxpQkFBaUIsR0FBRyxDQUFDLGdCQUF3QixFQUFrQixFQUFFO0lBQzVFLE1BQU0sS0FBSyxHQUFHLElBQUEscUJBQWEsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRTdDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPO1lBQ0wsYUFBYSxFQUFFLENBQUM7WUFDaEIseUJBQXlCLEVBQUUsRUFBRTtZQUM3QixRQUFRLEVBQUUsRUFBRTtTQUNiLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFBO0lBRTdCLE1BQU0seUJBQXlCLEdBQTRDLEVBQUUsQ0FBQTtJQUM3RSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUEsbURBQWtDLEVBQUMsSUFBSSxDQUFDLENBQUE7UUFDeEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUNyRSxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUN0RCx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ3ZELENBQUM7UUFDRCx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDO1FBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzFELENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE9BQU87UUFDTCxhQUFhLEVBQUUsS0FBSyxDQUFDLE1BQU07UUFDM0IseUJBQXlCO1FBQ3pCLFFBQVE7S0FDVCxDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBcENZLFFBQUEsaUJBQWlCLHFCQW9DN0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIFBhdGNoZWRQYWNrYWdlRGV0YWlscyxcclxuICBnZXRQYWNrYWdlRGV0YWlsc0Zyb21QYXRjaEZpbGVuYW1lLFxyXG59IGZyb20gXCIuL1BhY2thZ2VEZXRhaWxzXCJcclxuaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tIFwiLi9wYXRoXCJcclxuaW1wb3J0IGtsYXdTeW5jIGZyb20gXCJrbGF3LXN5bmNcIlxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFBhdGNoRmlsZXMgPSAocGF0Y2hlc0Rpcjogc3RyaW5nKSA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBrbGF3U3luYyhwYXRjaGVzRGlyLCB7IG5vZGlyOiB0cnVlIH0pXHJcbiAgICAgIC5tYXAoKHsgcGF0aCB9KSA9PiByZWxhdGl2ZShwYXRjaGVzRGlyLCBwYXRoKSlcclxuICAgICAgLmZpbHRlcigocGF0aCkgPT4gcGF0aC5lbmRzV2l0aChcIi5wYXRjaFwiKSlcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICByZXR1cm4gW11cclxuICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBHcm91cGVkUGF0Y2hlcyB7XHJcbiAgbnVtUGF0Y2hGaWxlczogbnVtYmVyXHJcbiAgcGF0aFNwZWNpZmllclRvUGF0Y2hGaWxlczogUmVjb3JkPHN0cmluZywgUGF0Y2hlZFBhY2thZ2VEZXRhaWxzW10+XHJcbiAgd2FybmluZ3M6IHN0cmluZ1tdXHJcbn1cclxuZXhwb3J0IGNvbnN0IGdldEdyb3VwZWRQYXRjaGVzID0gKHBhdGNoZXNEaXJlY3Rvcnk6IHN0cmluZyk6IEdyb3VwZWRQYXRjaGVzID0+IHtcclxuICBjb25zdCBmaWxlcyA9IGdldFBhdGNoRmlsZXMocGF0Y2hlc0RpcmVjdG9yeSlcclxuXHJcbiAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbnVtUGF0Y2hGaWxlczogMCxcclxuICAgICAgcGF0aFNwZWNpZmllclRvUGF0Y2hGaWxlczoge30sXHJcbiAgICAgIHdhcm5pbmdzOiBbXSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdXHJcblxyXG4gIGNvbnN0IHBhdGhTcGVjaWZpZXJUb1BhdGNoRmlsZXM6IFJlY29yZDxzdHJpbmcsIFBhdGNoZWRQYWNrYWdlRGV0YWlsc1tdPiA9IHt9XHJcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcbiAgICBjb25zdCBkZXRhaWxzID0gZ2V0UGFja2FnZURldGFpbHNGcm9tUGF0Y2hGaWxlbmFtZShmaWxlKVxyXG4gICAgaWYgKCFkZXRhaWxzKSB7XHJcbiAgICAgIHdhcm5pbmdzLnB1c2goYFVucmVjb2duaXplZCBwYXRjaCBmaWxlIGluIHBhdGNoZXMgZGlyZWN0b3J5ICR7ZmlsZX1gKVxyXG4gICAgICBjb250aW51ZVxyXG4gICAgfVxyXG4gICAgaWYgKCFwYXRoU3BlY2lmaWVyVG9QYXRjaEZpbGVzW2RldGFpbHMucGF0aFNwZWNpZmllcl0pIHtcclxuICAgICAgcGF0aFNwZWNpZmllclRvUGF0Y2hGaWxlc1tkZXRhaWxzLnBhdGhTcGVjaWZpZXJdID0gW11cclxuICAgIH1cclxuICAgIHBhdGhTcGVjaWZpZXJUb1BhdGNoRmlsZXNbZGV0YWlscy5wYXRoU3BlY2lmaWVyXS5wdXNoKGRldGFpbHMpXHJcbiAgfVxyXG4gIGZvciAoY29uc3QgYXJyIG9mIE9iamVjdC52YWx1ZXMocGF0aFNwZWNpZmllclRvUGF0Y2hGaWxlcykpIHtcclxuICAgIGFyci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIHJldHVybiAoYS5zZXF1ZW5jZU51bWJlciA/PyAwKSAtIChiLnNlcXVlbmNlTnVtYmVyID8/IDApXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG51bVBhdGNoRmlsZXM6IGZpbGVzLmxlbmd0aCxcclxuICAgIHBhdGhTcGVjaWZpZXJUb1BhdGNoRmlsZXMsXHJcbiAgICB3YXJuaW5ncyxcclxuICB9XHJcbn1cclxuIl19
|
package/dist/path.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.relative = exports.resolve = exports.dirname = exports.join = void 0;
|
|
7
|
+
const slash_1 = __importDefault(require("slash"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const join = (...args) => (0, slash_1.default)(path_1.default.join(...args));
|
|
10
|
+
exports.join = join;
|
|
11
|
+
var path_2 = require("path");
|
|
12
|
+
Object.defineProperty(exports, "dirname", { enumerable: true, get: function () { return path_2.dirname; } });
|
|
13
|
+
const resolve = (...args) => (0, slash_1.default)(path_1.default.resolve(...args));
|
|
14
|
+
exports.resolve = resolve;
|
|
15
|
+
const relative = (...args) => (0, slash_1.default)(path_1.default.relative(...args));
|
|
16
|
+
exports.relative = relative;
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUF5QjtBQUN6QixnREFBdUI7QUFFaEIsTUFBTSxJQUFJLEdBQXFCLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUEsZUFBSyxFQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQS9ELFFBQUEsSUFBSSxRQUEyRDtBQUU1RSw2QkFBOEI7QUFBckIsK0ZBQUEsT0FBTyxPQUFBO0FBRVQsTUFBTSxPQUFPLEdBQXdCLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUN0RCxJQUFBLGVBQUssRUFBQyxjQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQURqQixRQUFBLE9BQU8sV0FDVTtBQUV2QixNQUFNLFFBQVEsR0FBeUIsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQ3hELElBQUEsZUFBSyxFQUFDLGNBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBRGxCLFFBQUEsUUFBUSxZQUNVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNsYXNoIGZyb20gXCJzbGFzaFwiXHJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcclxuXHJcbmV4cG9ydCBjb25zdCBqb2luOiB0eXBlb2YgcGF0aC5qb2luID0gKC4uLmFyZ3MpID0+IHNsYXNoKHBhdGguam9pbiguLi5hcmdzKSlcclxuXHJcbmV4cG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiXHJcblxyXG5leHBvcnQgY29uc3QgcmVzb2x2ZTogdHlwZW9mIHBhdGgucmVzb2x2ZSA9ICguLi5hcmdzKSA9PlxyXG4gIHNsYXNoKHBhdGgucmVzb2x2ZSguLi5hcmdzKSlcclxuXHJcbmV4cG9ydCBjb25zdCByZWxhdGl2ZTogdHlwZW9mIHBhdGgucmVsYXRpdmUgPSAoLi4uYXJncykgPT5cclxuICBzbGFzaChwYXRoLnJlbGF0aXZlKC4uLmFyZ3MpKVxyXG4iXX0=
|