0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 09:31:22 -05:00

fix(std/tar): directory type bug (#6905)

This commit is contained in:
zfx 2020-07-31 00:01:31 +08:00 committed by GitHub
parent 391088c6ff
commit 95597fc6e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 11 deletions

View file

@ -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;
};

View file

@ -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);
});