diff options
author | zfx <502545703@qq.com> | 2020-07-31 00:01:31 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-30 12:01:31 -0400 |
commit | 95597fc6e2ed9975c26eae77ba68ae42ca2c331a (patch) | |
tree | 817a716d465cf9d040a7901614a9d8bbaa07b7f0 /std/archive | |
parent | 391088c6ff531ac6714e9076eb62f2294793ccdd (diff) |
fix(std/tar): directory type bug (#6905)
Diffstat (limited to 'std/archive')
-rw-r--r-- | std/archive/tar.ts | 31 | ||||
-rw-r--r-- | std/archive/tar_test.ts | 29 |
2 files changed, 49 insertions, 11 deletions
diff --git a/std/archive/tar.ts b/std/archive/tar.ts index 5fcfedc0f..9e417007f 100644 --- a/std/archive/tar.ts +++ b/std/archive/tar.ts @@ -105,15 +105,16 @@ function pad(num: number, bytes: number, base?: number): string { return "000000000000".substr(numString.length + 12 - bytes) + numString; } -const types: { [key: string]: string } = { - "": "file", - "0": "file", - "1": "link", - "2": "symlink", - "3": "character-device", - "4": "block-device", - "5": "directory", -}; +enum FileTypes { + "file" = 0, + "link" = 1, + "symlink" = 2, + "character-device" = 3, + "block-device" = 4, + "directory" = 5, + "fifo" = 6, + "contiguous-file" = 7, +} /* struct posix_header { // byte offset @@ -352,6 +353,10 @@ export class Tar { let info: Deno.FileInfo | undefined; if (opts.filePath) { info = await Deno.stat(opts.filePath); + if (info.isDirectory) { + info.size = 0; + opts.reader = new Deno.Buffer(); + } } const mode = opts.fileMode || (info && info.mode) || @@ -374,6 +379,10 @@ export class Tar { const fileSize = info?.size ?? opts.contentSize; assert(fileSize != null, "fileSize must be set"); + + const type = opts.type + ? FileTypes[opts.type as keyof typeof FileTypes] + : (info?.isDirectory ? FileTypes.directory : FileTypes.file); const tarData: TarDataWithSource = { fileName, fileNamePrefix, @@ -383,7 +392,7 @@ export class Tar { fileSize: pad(fileSize, 11), mtime: pad(mtime, 11), checksum: " ", - type: "0", // just a file + type: type.toString(), ustar, owner: opts.owner || "", group: opts.group || "", @@ -593,7 +602,7 @@ export class Untar { ); meta.fileSize = parseInt(decoder.decode(header.fileSize), 8); - meta.type = types[meta.type as string] || meta.type; + meta.type = FileTypes[parseInt(meta.type!)] ?? meta.type; return meta; }; diff --git a/std/archive/tar_test.ts b/std/archive/tar_test.ts index 17dfe7745..0f7f51e30 100644 --- a/std/archive/tar_test.ts +++ b/std/archive/tar_test.ts @@ -395,3 +395,32 @@ Deno.test("untarLinuxGeneratedTar", async function (): Promise<void> { file.close(); }); + +Deno.test("directoryEntryType", async function (): Promise<void> { + const tar = new Tar(); + + tar.append("directory/", { + reader: new Deno.Buffer(), + contentSize: 0, + type: "directory", + }); + + const filePath = resolve("archive", "testdata"); + tar.append("archive/testdata/", { + filePath, + }); + + const outputFile = resolve("archive", "testdata", "directory_type_test.tar"); + const file = await Deno.open(outputFile, { create: true, write: true }); + await Deno.copy(tar.getReader(), file); + await file.close(); + + const reader = await Deno.open(outputFile, { read: true }); + const untar = new Untar(reader); + for await (const entry of untar) { + assertEquals(entry.type, "directory"); + } + + await reader.close(); + await Deno.remove(outputFile); +}); |