Fixes to apply recursive (#7714)

* Fix apply recursive Promise.all to correctly await promises and fix apply to not apply defaults to child files.

* PR comments
This commit is contained in:
Charles Gagnon
2019-10-14 15:04:14 -07:00
committed by GitHub
parent f18b65a690
commit 26ece1ee86
8 changed files with 80 additions and 55 deletions

View File

@@ -15,9 +15,9 @@ import * as nls from 'vscode-nls';
import * as constants from '../constants';
import { WebHDFS, HdfsError } from '../hdfs/webhdfs';
import { AclEntry, PermissionStatus } from '../hdfs/aclEntry';
import { PermissionStatus } from '../hdfs/aclEntry';
import { Mount, MountStatus } from '../hdfs/mount';
import { FileStatus, HdfsFileType } from '../hdfs/fileStatus';
import { FileStatus, hdfsFileTypeToFileType } from '../hdfs/fileStatus';
const localize = nls.loadMessageBundle();
@@ -28,15 +28,21 @@ export function joinHdfsPath(parent: string, child: string): string {
return `${parent}/${child}`;
}
export const enum FileType {
Directory = 'Directory',
File = 'File',
Symlink = 'Symlink'
}
export interface IFile {
path: string;
isDirectory: boolean;
fileType: FileType;
mountStatus?: MountStatus;
}
export class File implements IFile {
public mountStatus?: MountStatus;
constructor(public path: string, public isDirectory: boolean) {
constructor(public path: string, public fileType: FileType) {
}
@@ -44,16 +50,16 @@ export class File implements IFile {
return joinHdfsPath(path, fileName);
}
public static createChild(parent: IFile, fileName: string, isDirectory: boolean): IFile {
return new File(File.createPath(parent.path, fileName), isDirectory);
public static createChild(parent: IFile, fileName: string, fileType: FileType): IFile {
return new File(File.createPath(parent.path, fileName), fileType);
}
public static createFile(parent: IFile, fileName: string): File {
return File.createChild(parent, fileName, false);
return File.createChild(parent, fileName, FileType.File);
}
public static createDirectory(parent: IFile, fileName: string): IFile {
return File.createChild(parent, fileName, true);
return File.createChild(parent, fileName, FileType.Directory);
}
public static getBasename(file: IFile): string {
@@ -81,12 +87,10 @@ export interface IFileSource {
/**
* Sets the ACL status for given path
* @param path The path to the file/folder to set the ACL on
* @param ownerEntry The entry corresponding to the path owner
* @param groupEntry The entry corresponding to the path owning group
* @param otherEntry The entry corresponding to default permissions for all other users
* @param aclEntries The ACL entries to set
* @param fileType The type of file we're setting to determine if defaults should be applied. Use undefined if type is unknown
* @param permissionStatus The status containing the permissions to set
*/
setAcl(path: string, ownerEntry: AclEntry, groupEntry: AclEntry, otherEntry: AclEntry, aclEntries: AclEntry[]): Promise<void>;
setAcl(path: string, fileType: FileType | undefined, permissionStatus: PermissionStatus): Promise<void>;
/**
* Removes the default ACLs for the specified path
* @param path The path to remove the default ACLs for
@@ -204,7 +208,7 @@ export class HdfsFileSource implements IFileSource {
}
else {
let hdfsFiles: IFile[] = fileStatuses.map(fileStatus => {
let file = new File(File.createPath(path, fileStatus.pathSuffix), fileStatus.type === HdfsFileType.Directory);
let file = new File(File.createPath(path, fileStatus.pathSuffix), hdfsFileTypeToFileType(fileStatus.type));
if (this.mounts && this.mounts.has(file.path)) {
file.mountStatus = MountStatus.Mount;
}
@@ -385,14 +389,13 @@ export class HdfsFileSource implements IFileSource {
/**
* Sets the ACL status for given path
* @param path The path to the file/folder to set the ACL on
* @param ownerEntry The entry corresponding to the path owner
* @param groupEntry The entry corresponding to the path owning group
* @param otherEntry The entry corresponding to default permissions for all other users
* @param fileType The type of file we're setting to determine if defaults should be applied. Use undefined if type is unknown
* @param ownerEntry The status containing the permissions to set
* @param aclEntries The ACL entries to set
*/
public setAcl(path: string, ownerEntry: AclEntry, groupEntry: AclEntry, otherEntry: AclEntry, aclEntries: AclEntry[]): Promise<void> {
public setAcl(path: string, fileType: FileType | undefined, permissionStatus: PermissionStatus): Promise<void> {
return new Promise((resolve, reject) => {
this.client.setAcl(path, ownerEntry, groupEntry, otherEntry, aclEntries, (error: HdfsError) => {
this.client.setAcl(path, fileType, permissionStatus, (error: HdfsError) => {
if (error) {
reject(error);
} else {

View File

@@ -12,7 +12,7 @@ const localize = nls.loadMessageBundle();
import { ApiWrapper } from '../apiWrapper';
import { Command, ICommandViewContext, ProgressCommand, ICommandObjectExplorerContext } from './command';
import { File, IFile, joinHdfsPath } from './fileSources';
import { File, IFile, joinHdfsPath, FileType } from './fileSources';
import { FolderNode, FileNode, HdfsFileSourceNode } from './hdfsProvider';
import { IPrompter, IQuestion, QuestionTypes } from '../prompts/question';
import * as constants from '../constants';
@@ -102,8 +102,15 @@ export class UploadFilesCommand extends ProgressCommand {
private mapPathsToFiles(): (value: string, index: number, array: string[]) => Promise<File> {
return async (path: string) => {
let isDir = (await fs.lstat(path)).isDirectory();
return new File(path, isDir);
const stats = (await fs.lstat(path));
if (stats.isDirectory()) {
return new File(path, FileType.Directory);
} else if (stats.isSymbolicLink()) {
return new File(path, FileType.Symlink);
} else {
return new File(path, FileType.File);
}
};
}
@@ -113,7 +120,7 @@ export class UploadFilesCommand extends ProgressCommand {
// Throw here so that all recursion is ended
throw new Error('Upload canceled');
}
if (file.isDirectory) {
if (file.fileType === FileType.Directory) {
let dirName = fspath.basename(file.path);
let subFolder = await folderNode.mkdir(dirName);
let children: IFile[] = await Promise.all((await fs.readdir(file.path))

View File

@@ -11,7 +11,7 @@ import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import * as Constants from '../constants';
import { IFileSource, IHdfsOptions, IFile, File, FileSourceFactory } from './fileSources';
import { IFileSource, IHdfsOptions, IFile, File, FileSourceFactory, FileType } from './fileSources';
import { CancelableStream } from './cancelableStream';
import { TreeNode } from './treeNodes';
import * as utils from '../utils';
@@ -132,8 +132,9 @@ export class FolderNode extends HdfsFileSourceNode {
if (files) {
// Note: for now, assuming HDFS-provided sorting is sufficient
this.children = files.map((file) => {
let node: TreeNode = file.isDirectory ? new FolderNode(this.context, file.path, this.fileSource, Constants.MssqlClusterItems.Folder, this.getChildMountStatus(file))
: new FileNode(this.context, file.path, this.fileSource, this.getChildMountStatus(file));
let node: TreeNode = file.fileType === FileType.File ?
new FileNode(this.context, file.path, this.fileSource, this.getChildMountStatus(file)) :
new FolderNode(this.context, file.path, this.fileSource, Constants.MssqlClusterItems.Folder, this.getChildMountStatus(file));
node.parent = this;
return node;
});