mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-11-14 20:59:27 +00:00
Make tab width 2 spaces (#445)
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -2,26 +2,26 @@ import { inject, injectable } from 'inversify';
|
||||
import URI from '@theia/core/lib/common/uri';
|
||||
import { Event } from '@theia/core/lib/common/event';
|
||||
import {
|
||||
Disposable,
|
||||
DisposableCollection,
|
||||
Disposable,
|
||||
DisposableCollection,
|
||||
} from '@theia/core/lib/common/disposable';
|
||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
||||
import {
|
||||
Stat,
|
||||
FileType,
|
||||
FileChange,
|
||||
FileWriteOptions,
|
||||
FileDeleteOptions,
|
||||
FileOverwriteOptions,
|
||||
FileSystemProvider,
|
||||
FileSystemProviderError,
|
||||
FileSystemProviderErrorCode,
|
||||
FileSystemProviderCapabilities,
|
||||
WatchOptions,
|
||||
Stat,
|
||||
FileType,
|
||||
FileChange,
|
||||
FileWriteOptions,
|
||||
FileDeleteOptions,
|
||||
FileOverwriteOptions,
|
||||
FileSystemProvider,
|
||||
FileSystemProviderError,
|
||||
FileSystemProviderErrorCode,
|
||||
FileSystemProviderCapabilities,
|
||||
WatchOptions,
|
||||
} from '@theia/filesystem/lib/common/files';
|
||||
import {
|
||||
FileService,
|
||||
FileServiceContribution,
|
||||
FileService,
|
||||
FileServiceContribution,
|
||||
} from '@theia/filesystem/lib/browser/file-service';
|
||||
import { AuthenticationClientService } from '../auth/authentication-client-service';
|
||||
import { Create, CreateApi } from './create-api';
|
||||
@@ -33,176 +33,174 @@ export const REMOTE_ONLY_FILES = ['sketch.json'];
|
||||
|
||||
@injectable()
|
||||
export class CreateFsProvider
|
||||
implements
|
||||
FileSystemProvider,
|
||||
FrontendApplicationContribution,
|
||||
FileServiceContribution
|
||||
implements
|
||||
FileSystemProvider,
|
||||
FrontendApplicationContribution,
|
||||
FileServiceContribution
|
||||
{
|
||||
@inject(AuthenticationClientService)
|
||||
protected readonly authenticationService: AuthenticationClientService;
|
||||
@inject(AuthenticationClientService)
|
||||
protected readonly authenticationService: AuthenticationClientService;
|
||||
|
||||
@inject(CreateApi)
|
||||
protected readonly createApi: CreateApi;
|
||||
@inject(CreateApi)
|
||||
protected readonly createApi: CreateApi;
|
||||
|
||||
@inject(SketchesService)
|
||||
protected readonly sketchesService: SketchesService;
|
||||
@inject(SketchesService)
|
||||
protected readonly sketchesService: SketchesService;
|
||||
|
||||
@inject(ArduinoPreferences)
|
||||
protected readonly arduinoPreferences: ArduinoPreferences;
|
||||
@inject(ArduinoPreferences)
|
||||
protected readonly arduinoPreferences: ArduinoPreferences;
|
||||
|
||||
protected readonly toDispose = new DisposableCollection();
|
||||
protected readonly toDispose = new DisposableCollection();
|
||||
|
||||
readonly onFileWatchError: Event<void> = Event.None;
|
||||
readonly onDidChangeFile: Event<readonly FileChange[]> = Event.None;
|
||||
readonly onDidChangeCapabilities: Event<void> = Event.None;
|
||||
readonly capabilities: FileSystemProviderCapabilities =
|
||||
FileSystemProviderCapabilities.FileReadWrite |
|
||||
FileSystemProviderCapabilities.PathCaseSensitive |
|
||||
FileSystemProviderCapabilities.Access;
|
||||
readonly onFileWatchError: Event<void> = Event.None;
|
||||
readonly onDidChangeFile: Event<readonly FileChange[]> = Event.None;
|
||||
readonly onDidChangeCapabilities: Event<void> = Event.None;
|
||||
readonly capabilities: FileSystemProviderCapabilities =
|
||||
FileSystemProviderCapabilities.FileReadWrite |
|
||||
FileSystemProviderCapabilities.PathCaseSensitive |
|
||||
FileSystemProviderCapabilities.Access;
|
||||
|
||||
onStop(): void {
|
||||
this.toDispose.dispose();
|
||||
}
|
||||
onStop(): void {
|
||||
this.toDispose.dispose();
|
||||
}
|
||||
|
||||
registerFileSystemProviders(service: FileService): void {
|
||||
service.onWillActivateFileSystemProvider((event) => {
|
||||
if (event.scheme === CreateUri.scheme) {
|
||||
event.waitUntil(
|
||||
(async () => {
|
||||
service.registerProvider(CreateUri.scheme, this);
|
||||
})()
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
watch(uri: URI, opts: WatchOptions): Disposable {
|
||||
return Disposable.NULL;
|
||||
}
|
||||
|
||||
async stat(uri: URI): Promise<Stat> {
|
||||
if (CreateUri.equals(CreateUri.root, uri)) {
|
||||
this.getCreateApi; // This will throw when not logged in.
|
||||
return {
|
||||
type: FileType.Directory,
|
||||
ctime: 0,
|
||||
mtime: 0,
|
||||
size: 0,
|
||||
};
|
||||
}
|
||||
const resource = await this.getCreateApi.stat(uri.path.toString());
|
||||
const mtime = Date.parse(resource.modified_at);
|
||||
return {
|
||||
type: this.toFileType(resource.type),
|
||||
ctime: mtime,
|
||||
mtime,
|
||||
size: 0,
|
||||
};
|
||||
}
|
||||
|
||||
async mkdir(uri: URI): Promise<void> {
|
||||
await this.getCreateApi.createDirectory(uri.path.toString());
|
||||
}
|
||||
|
||||
async readdir(uri: URI): Promise<[string, FileType][]> {
|
||||
const resources = await this.getCreateApi.readDirectory(
|
||||
uri.path.toString(),
|
||||
{
|
||||
secrets: true,
|
||||
}
|
||||
registerFileSystemProviders(service: FileService): void {
|
||||
service.onWillActivateFileSystemProvider((event) => {
|
||||
if (event.scheme === CreateUri.scheme) {
|
||||
event.waitUntil(
|
||||
(async () => {
|
||||
service.registerProvider(CreateUri.scheme, this);
|
||||
})()
|
||||
);
|
||||
return resources
|
||||
.filter((res) => !REMOTE_ONLY_FILES.includes(res.name))
|
||||
.map(({ name, type }) => [name, this.toFileType(type)]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
watch(uri: URI, opts: WatchOptions): Disposable {
|
||||
return Disposable.NULL;
|
||||
}
|
||||
|
||||
async stat(uri: URI): Promise<Stat> {
|
||||
if (CreateUri.equals(CreateUri.root, uri)) {
|
||||
this.getCreateApi; // This will throw when not logged in.
|
||||
return {
|
||||
type: FileType.Directory,
|
||||
ctime: 0,
|
||||
mtime: 0,
|
||||
size: 0,
|
||||
};
|
||||
}
|
||||
const resource = await this.getCreateApi.stat(uri.path.toString());
|
||||
const mtime = Date.parse(resource.modified_at);
|
||||
return {
|
||||
type: this.toFileType(resource.type),
|
||||
ctime: mtime,
|
||||
mtime,
|
||||
size: 0,
|
||||
};
|
||||
}
|
||||
|
||||
async delete(uri: URI, opts: FileDeleteOptions): Promise<void> {
|
||||
return;
|
||||
async mkdir(uri: URI): Promise<void> {
|
||||
await this.getCreateApi.createDirectory(uri.path.toString());
|
||||
}
|
||||
|
||||
if (!opts.recursive) {
|
||||
throw new Error(
|
||||
'Arduino Create file-system provider does not support non-recursive deletion.'
|
||||
);
|
||||
}
|
||||
const stat = await this.stat(uri);
|
||||
if (!stat) {
|
||||
throw new FileSystemProviderError(
|
||||
'File not found.',
|
||||
FileSystemProviderErrorCode.FileNotFound
|
||||
);
|
||||
}
|
||||
switch (stat.type) {
|
||||
case FileType.Directory: {
|
||||
await this.getCreateApi.deleteDirectory(uri.path.toString());
|
||||
break;
|
||||
}
|
||||
case FileType.File: {
|
||||
await this.getCreateApi.deleteFile(uri.path.toString());
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
throw new FileSystemProviderError(
|
||||
`Unexpected file type '${
|
||||
stat.type
|
||||
}' for resource: ${uri.toString()}`,
|
||||
FileSystemProviderErrorCode.Unknown
|
||||
);
|
||||
}
|
||||
}
|
||||
async readdir(uri: URI): Promise<[string, FileType][]> {
|
||||
const resources = await this.getCreateApi.readDirectory(
|
||||
uri.path.toString(),
|
||||
{
|
||||
secrets: true,
|
||||
}
|
||||
);
|
||||
return resources
|
||||
.filter((res) => !REMOTE_ONLY_FILES.includes(res.name))
|
||||
.map(({ name, type }) => [name, this.toFileType(type)]);
|
||||
}
|
||||
|
||||
async delete(uri: URI, opts: FileDeleteOptions): Promise<void> {
|
||||
return;
|
||||
|
||||
if (!opts.recursive) {
|
||||
throw new Error(
|
||||
'Arduino Create file-system provider does not support non-recursive deletion.'
|
||||
);
|
||||
}
|
||||
|
||||
async rename(
|
||||
oldUri: URI,
|
||||
newUri: URI,
|
||||
options: FileOverwriteOptions
|
||||
): Promise<void> {
|
||||
await this.getCreateApi.rename(
|
||||
oldUri.path.toString(),
|
||||
newUri.path.toString()
|
||||
const stat = await this.stat(uri);
|
||||
if (!stat) {
|
||||
throw new FileSystemProviderError(
|
||||
'File not found.',
|
||||
FileSystemProviderErrorCode.FileNotFound
|
||||
);
|
||||
}
|
||||
switch (stat.type) {
|
||||
case FileType.Directory: {
|
||||
await this.getCreateApi.deleteDirectory(uri.path.toString());
|
||||
break;
|
||||
}
|
||||
case FileType.File: {
|
||||
await this.getCreateApi.deleteFile(uri.path.toString());
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
throw new FileSystemProviderError(
|
||||
`Unexpected file type '${stat.type}' for resource: ${uri.toString()}`,
|
||||
FileSystemProviderErrorCode.Unknown
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async rename(
|
||||
oldUri: URI,
|
||||
newUri: URI,
|
||||
options: FileOverwriteOptions
|
||||
): Promise<void> {
|
||||
await this.getCreateApi.rename(
|
||||
oldUri.path.toString(),
|
||||
newUri.path.toString()
|
||||
);
|
||||
}
|
||||
|
||||
async readFile(uri: URI): Promise<Uint8Array> {
|
||||
const content = await this.getCreateApi.readFile(uri.path.toString());
|
||||
return new TextEncoder().encode(content);
|
||||
}
|
||||
|
||||
async writeFile(
|
||||
uri: URI,
|
||||
content: Uint8Array,
|
||||
options: FileWriteOptions
|
||||
): Promise<void> {
|
||||
await this.getCreateApi.writeFile(uri.path.toString(), content);
|
||||
}
|
||||
|
||||
async access(uri: URI, mode?: number): Promise<void> {
|
||||
this.getCreateApi; // Will throw if not logged in.
|
||||
}
|
||||
|
||||
public toFileType(type: Create.ResourceType): FileType {
|
||||
switch (type) {
|
||||
case 'file':
|
||||
return FileType.File;
|
||||
case 'sketch':
|
||||
case 'folder':
|
||||
return FileType.Directory;
|
||||
default:
|
||||
return FileType.Unknown;
|
||||
}
|
||||
}
|
||||
|
||||
private get getCreateApi(): CreateApi {
|
||||
const { session } = this.authenticationService;
|
||||
if (!session) {
|
||||
throw new FileSystemProviderError(
|
||||
'Not logged in.',
|
||||
FileSystemProviderErrorCode.NoPermissions
|
||||
);
|
||||
}
|
||||
|
||||
async readFile(uri: URI): Promise<Uint8Array> {
|
||||
const content = await this.getCreateApi.readFile(uri.path.toString());
|
||||
return new TextEncoder().encode(content);
|
||||
}
|
||||
|
||||
async writeFile(
|
||||
uri: URI,
|
||||
content: Uint8Array,
|
||||
options: FileWriteOptions
|
||||
): Promise<void> {
|
||||
await this.getCreateApi.writeFile(uri.path.toString(), content);
|
||||
}
|
||||
|
||||
async access(uri: URI, mode?: number): Promise<void> {
|
||||
this.getCreateApi; // Will throw if not logged in.
|
||||
}
|
||||
|
||||
public toFileType(type: Create.ResourceType): FileType {
|
||||
switch (type) {
|
||||
case 'file':
|
||||
return FileType.File;
|
||||
case 'sketch':
|
||||
case 'folder':
|
||||
return FileType.Directory;
|
||||
default:
|
||||
return FileType.Unknown;
|
||||
}
|
||||
}
|
||||
|
||||
private get getCreateApi(): CreateApi {
|
||||
const { session } = this.authenticationService;
|
||||
if (!session) {
|
||||
throw new FileSystemProviderError(
|
||||
'Not logged in.',
|
||||
FileSystemProviderErrorCode.NoPermissions
|
||||
);
|
||||
}
|
||||
|
||||
return this.createApi.init(
|
||||
this.authenticationService,
|
||||
this.arduinoPreferences
|
||||
);
|
||||
}
|
||||
return this.createApi.init(
|
||||
this.authenticationService,
|
||||
this.arduinoPreferences
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,22 +2,22 @@ export const posix = { sep: '/' };
|
||||
|
||||
// TODO: poor man's `path.join(path, '..')` in the browser.
|
||||
export function parentPosix(path: string): string {
|
||||
const segments = path.split(posix.sep) || [];
|
||||
segments.pop();
|
||||
let modified = segments.join(posix.sep);
|
||||
if (path.charAt(path.length - 1) === posix.sep) {
|
||||
modified += posix.sep;
|
||||
}
|
||||
return modified;
|
||||
const segments = path.split(posix.sep) || [];
|
||||
segments.pop();
|
||||
let modified = segments.join(posix.sep);
|
||||
if (path.charAt(path.length - 1) === posix.sep) {
|
||||
modified += posix.sep;
|
||||
}
|
||||
return modified;
|
||||
}
|
||||
|
||||
export function basename(path: string): string {
|
||||
const segments = path.split(posix.sep) || [];
|
||||
return segments.pop()!;
|
||||
const segments = path.split(posix.sep) || [];
|
||||
return segments.pop()!;
|
||||
}
|
||||
|
||||
export function posixSegments(posixPath: string): string[] {
|
||||
return posixPath.split(posix.sep).filter((segment) => !!segment);
|
||||
return posixPath.split(posix.sep).filter((segment) => !!segment);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -32,28 +32,28 @@ export function posixSegments(posixPath: string): string[] {
|
||||
* ```
|
||||
*/
|
||||
export function splitSketchPath(
|
||||
raw: string,
|
||||
sep = '/sketches_v2/'
|
||||
raw: string,
|
||||
sep = '/sketches_v2/'
|
||||
): [string, string] {
|
||||
if (!sep) {
|
||||
throw new Error('Invalid separator. Cannot be zero length.');
|
||||
}
|
||||
const index = raw.indexOf(sep);
|
||||
if (index === -1) {
|
||||
throw new Error(`Invalid path pattern. Raw path was '${raw}'.`);
|
||||
}
|
||||
const createRoot = raw.substring(0, index + sep.length - 1); // TODO: validate the `createRoot` format.
|
||||
const posixPath = raw.substr(index + sep.length - 1);
|
||||
if (!posixPath) {
|
||||
throw new Error(`Could not extract POSIX path from '${raw}'.`);
|
||||
}
|
||||
return [createRoot, posixPath];
|
||||
if (!sep) {
|
||||
throw new Error('Invalid separator. Cannot be zero length.');
|
||||
}
|
||||
const index = raw.indexOf(sep);
|
||||
if (index === -1) {
|
||||
throw new Error(`Invalid path pattern. Raw path was '${raw}'.`);
|
||||
}
|
||||
const createRoot = raw.substring(0, index + sep.length - 1); // TODO: validate the `createRoot` format.
|
||||
const posixPath = raw.substr(index + sep.length - 1);
|
||||
if (!posixPath) {
|
||||
throw new Error(`Could not extract POSIX path from '${raw}'.`);
|
||||
}
|
||||
return [createRoot, posixPath];
|
||||
}
|
||||
|
||||
export function toPosixPath(raw: string): string {
|
||||
if (raw === posix.sep) {
|
||||
return posix.sep; // Handles the root resource case.
|
||||
}
|
||||
const [, posixPath] = splitSketchPath(raw);
|
||||
return posixPath;
|
||||
if (raw === posix.sep) {
|
||||
return posix.sep; // Handles the root resource case.
|
||||
}
|
||||
const [, posixPath] = splitSketchPath(raw);
|
||||
return posixPath;
|
||||
}
|
||||
|
||||
@@ -4,36 +4,34 @@ import { Create } from './create-api';
|
||||
import { toPosixPath, parentPosix, posix } from './create-paths';
|
||||
|
||||
export namespace CreateUri {
|
||||
export const scheme = 'arduino-create';
|
||||
export const root = toUri(posix.sep);
|
||||
export const scheme = 'arduino-create';
|
||||
export const root = toUri(posix.sep);
|
||||
|
||||
export function toUri(posixPathOrResource: string | Create.Resource): URI {
|
||||
const posixPath =
|
||||
typeof posixPathOrResource === 'string'
|
||||
? posixPathOrResource
|
||||
: toPosixPath(posixPathOrResource.path);
|
||||
return new URI(
|
||||
Uri.parse(posixPath).with({ scheme, authority: 'create' })
|
||||
);
|
||||
}
|
||||
export function toUri(posixPathOrResource: string | Create.Resource): URI {
|
||||
const posixPath =
|
||||
typeof posixPathOrResource === 'string'
|
||||
? posixPathOrResource
|
||||
: toPosixPath(posixPathOrResource.path);
|
||||
return new URI(Uri.parse(posixPath).with({ scheme, authority: 'create' }));
|
||||
}
|
||||
|
||||
export function is(uri: URI): boolean {
|
||||
return uri.scheme === scheme;
|
||||
}
|
||||
export function is(uri: URI): boolean {
|
||||
return uri.scheme === scheme;
|
||||
}
|
||||
|
||||
export function equals(left: URI, right: URI): boolean {
|
||||
return is(left) && is(right) && left.toString() === right.toString();
|
||||
}
|
||||
export function equals(left: URI, right: URI): boolean {
|
||||
return is(left) && is(right) && left.toString() === right.toString();
|
||||
}
|
||||
|
||||
export function parent(uri: URI): URI {
|
||||
if (!is(uri)) {
|
||||
throw new Error(
|
||||
`Invalid URI scheme. Expected '${scheme}' got '${uri.scheme}' instead.`
|
||||
);
|
||||
}
|
||||
if (equals(uri, root)) {
|
||||
return uri;
|
||||
}
|
||||
return toUri(parentPosix(uri.path.toString()));
|
||||
export function parent(uri: URI): URI {
|
||||
if (!is(uri)) {
|
||||
throw new Error(
|
||||
`Invalid URI scheme. Expected '${scheme}' got '${uri.scheme}' instead.`
|
||||
);
|
||||
}
|
||||
if (equals(uri, root)) {
|
||||
return uri;
|
||||
}
|
||||
return toUri(parentPosix(uri.path.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user