(p: string)
| 74 | } |
| 75 | |
| 76 | async installFromTarball(p: string) { |
| 77 | const installFolder = folderUtils.getInstallFolder(); |
| 78 | |
| 79 | const archiveEntries = new Map<string, Set<string>>(); |
| 80 | const {list: tarT} = await import(`tar/list`); |
| 81 | |
| 82 | let hasShortEntries = false; |
| 83 | |
| 84 | await tarT({file: p, onentry: entry => { |
| 85 | const segments = entry.path.split(/\//g); |
| 86 | if (segments.length > 0 && segments[segments.length - 1] !== `.corepack`) |
| 87 | return; |
| 88 | |
| 89 | if (segments.length < 3) { |
| 90 | hasShortEntries = true; |
| 91 | } else { |
| 92 | let references = archiveEntries.get(segments[0]); |
| 93 | if (typeof references === `undefined`) |
| 94 | archiveEntries.set(segments[0], references = new Set()); |
| 95 | |
| 96 | references.add(segments[1]); |
| 97 | } |
| 98 | }}); |
| 99 | |
| 100 | if (hasShortEntries || archiveEntries.size < 1) |
| 101 | throw new UsageError(`Invalid archive format; did it get generated by 'corepack pack'?`); |
| 102 | |
| 103 | const {extract: tarX} = await import(`tar/extract`); |
| 104 | |
| 105 | for (const [name, references] of archiveEntries) { |
| 106 | for (const reference of references) { |
| 107 | if (!isSupportedPackageManager(name)) |
| 108 | throw new UsageError(`Unsupported package manager '${name}'`); |
| 109 | |
| 110 | this.log({name, reference}); |
| 111 | |
| 112 | // Recreate the folder in case it was deleted somewhere else: |
| 113 | await fs.promises.mkdir(installFolder, {recursive: true}); |
| 114 | |
| 115 | await tarX({file: p, cwd: installFolder}, [`${name}/${reference}`]); |
| 116 | |
| 117 | if (!this.cacheOnly) { |
| 118 | await this.context.engine.activatePackageManager({name, reference}); |
| 119 | } |
| 120 | } |
| 121 | } |
| 122 | } |
| 123 | } |
no test coverage detected