Skip to content

Commit 7f0b6e4

Browse files
committed
Merge branch 'master' into fix-678
2 parents b36afff + 6793e16 commit 7f0b6e4

12 files changed

+197
-102
lines changed

src/api/index.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,11 @@ export class AtelierAPI {
338338
return this.cookies;
339339
}
340340

341+
// Not Modified
342+
if (response.status === 304) {
343+
throw { statusCode: response.status, message: response.statusText };
344+
}
345+
341346
const buffer = await response.buffer();
342347
const data: Atelier.Response = JSON.parse(buffer.toString("utf-8"));
343348

@@ -431,7 +436,7 @@ export class AtelierAPI {
431436
}
432437

433438
// api v1+
434-
public getDoc(name: string, format?: string): Promise<Atelier.Response<Atelier.Document>> {
439+
public getDoc(name: string, format?: string, mtime?: number): Promise<Atelier.Response<Atelier.Document>> {
435440
let params = {};
436441
if (!format && config("multilineMethodArgs") && this._config.apiVersion >= 4) {
437442
format = "udl-multiline";
@@ -442,7 +447,11 @@ export class AtelierAPI {
442447
};
443448
}
444449
name = this.transformNameIfCsp(name);
445-
return this.request(1, "GET", `${this.ns}/doc/${name}`, null, params);
450+
const headers = {};
451+
if (mtime && mtime > 0) {
452+
headers["IF_NONE_MATCH"] = new Date(mtime).toISOString().replace(/T|Z/g, " ").trim();
453+
}
454+
return this.request(1, "GET", `${this.ns}/doc/${name}`, null, params, headers);
446455
}
447456

448457
// api v1+

src/commands/addServerNamespaceToWorkspace.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export async function addServerNamespaceToWorkspace(): Promise<void> {
2424
return;
2525
}
2626
// Get its namespace list
27-
let uri = vscode.Uri.parse(`isfs://${serverName}/`);
27+
let uri = vscode.Uri.parse(`isfs://${serverName}:%sys/`);
2828
await resolveConnectionSpec(serverName);
2929
// Prepare a displayable form of its connection spec as a hint to the user.
3030
// This will never return the default value (second parameter) because we only just resolved the connection spec.

src/commands/compile.ts

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
workspaceState,
1414
} from "../extension";
1515
import { DocumentContentProvider } from "../providers/DocumentContentProvider";
16-
import { currentFile, CurrentFile, currentWorkspaceFolder, outputChannel, workspaceFolderUri } from "../utils";
16+
import { currentFile, CurrentFile, currentWorkspaceFolder, outputChannel, uriOfWorkspaceFolder } from "../utils";
1717
import { RootNode } from "../explorer/models/rootNode";
1818
import { PackageNode } from "../explorer/models/packageNode";
1919
import { ClassNode } from "../explorer/models/classNode";
@@ -137,10 +137,17 @@ What do you want to do?`,
137137
} else {
138138
if (error.errorText && error.errorText !== "") {
139139
outputChannel.appendLine("\n" + error.errorText);
140-
vscode.window.showErrorMessage(
141-
`Failed to save file '${file.name}' on the server. Check output channel for details.`,
142-
"Dismiss"
143-
);
140+
vscode.window
141+
.showErrorMessage(
142+
`Failed to save file '${file.name}' on the server. Check 'ObjectScript' output channel for details.`,
143+
"Show",
144+
"Dismiss"
145+
)
146+
.then((action) => {
147+
if (action === "Show") {
148+
outputChannel.show(true);
149+
}
150+
});
144151
} else {
145152
vscode.window.showErrorMessage(`Failed to save file '${file.name}' on the server.`, "Dismiss");
146153
}
@@ -231,9 +238,15 @@ async function compile(docs: CurrentFile[], flags?: string): Promise<any> {
231238
.catch((error: Error) => {
232239
if (!config("suppressCompileErrorMessages")) {
233240
vscode.window
234-
.showErrorMessage("Compilation failed. Check output channel for details.", "Dismiss")
235-
.then((data) => {
236-
outputChannel.show(true);
241+
.showErrorMessage(
242+
"Compilation failed. Check 'ObjectScript' output channel for details.",
243+
"Show",
244+
"Dismiss"
245+
)
246+
.then((action) => {
247+
if (action === "Show") {
248+
outputChannel.show(true);
249+
}
237250
});
238251
}
239252
// Even when compile failed we should still fetch server changes
@@ -373,7 +386,7 @@ export async function importFolder(uri: vscode.Uri, noCompile = false): Promise<
373386
}
374387
let globpattern = "*.{cls,inc,int,mac}";
375388
const workspace = currentWorkspaceFolder();
376-
const workspacePath = workspaceFolderUri(workspace).fsPath;
389+
const workspacePath = uriOfWorkspaceFolder(workspace).fsPath;
377390
const folderPathNoWorkspaceArr = uripath.replace(workspacePath + path.sep, "").split(path.sep);
378391
if (folderPathNoWorkspaceArr.includes("csp")) {
379392
// This folder is a CSP application, so import all files

src/commands/export.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import path = require("path");
33
import * as vscode from "vscode";
44
import { AtelierAPI } from "../api";
55
import { config } from "../extension";
6-
import { mkdirSyncRecursive, notNull, outputChannel, workspaceFolderUri } from "../utils";
6+
import { mkdirSyncRecursive, notNull, outputChannel, uriOfWorkspaceFolder } from "../utils";
77
import { NodeBase } from "../explorer/models/nodeBase";
88

99
const filesFilter = (file: any) => {
@@ -185,7 +185,10 @@ export async function exportList(files: string[], workspaceFolder: string, names
185185
}
186186
const { atelier, folder, addCategory, map } = config("export", workspaceFolder);
187187

188-
const root = [workspaceFolderUri(workspaceFolder).fsPath, typeof folder === "string" && folder.length ? folder : null]
188+
const root = [
189+
uriOfWorkspaceFolder(workspaceFolder).fsPath,
190+
typeof folder === "string" && folder.length ? folder : null,
191+
]
189192
.filter(notNull)
190193
.join(path.sep);
191194
const run = async (fileList) => {

src/commands/viewOthers.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,17 @@ export async function viewOthers(forceEditable = false): Promise<void> {
200200
.catch((err) => {
201201
if (err.errorText && err.errorText !== "") {
202202
outputChannel.appendLine("\n" + err.errorText);
203-
vscode.window.showErrorMessage(`Failed to get other documents. Check output channel for details.`, "Dismiss");
203+
vscode.window
204+
.showErrorMessage(
205+
`Failed to get other documents. Check 'ObjectScript' output channel for details.`,
206+
"Show",
207+
"Dismiss"
208+
)
209+
.then((action) => {
210+
if (action === "Show") {
211+
outputChannel.show(true);
212+
}
213+
});
204214
} else {
205215
vscode.window.showErrorMessage(`Failed to get other documents.`, "Dismiss");
206216
}

src/providers/DocumentContentProvider.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { AtelierAPI } from "../api";
66

77
import { getFileName, getFolderName } from "../commands/export";
88
import { config, FILESYSTEM_SCHEMA, FILESYSTEM_READONLY_SCHEMA, OBJECTSCRIPT_FILE_SCHEMA } from "../extension";
9-
import { currentWorkspaceFolder, workspaceFolderUri } from "../utils";
9+
import { currentWorkspaceFolder, uriOfWorkspaceFolder } from "../utils";
1010

1111
export class DocumentContentProvider implements vscode.TextDocumentContentProvider {
1212
public get onDidChange(): vscode.Event<vscode.Uri> {
@@ -16,7 +16,7 @@ export class DocumentContentProvider implements vscode.TextDocumentContentProvid
1616
public static getAsFile(name: string, workspaceFolder: string): string {
1717
const { atelier, folder, addCategory, map } = config("export", workspaceFolder);
1818

19-
const root = [workspaceFolderUri(workspaceFolder).fsPath, folder].join(path.sep);
19+
const root = [uriOfWorkspaceFolder(workspaceFolder).fsPath, folder].join(path.sep);
2020
const fileName = getFileName(root, name, atelier, addCategory, map);
2121
if (fs.existsSync(fileName)) {
2222
return fs.realpathSync.native(fileName);
@@ -26,7 +26,7 @@ export class DocumentContentProvider implements vscode.TextDocumentContentProvid
2626
public static getAsFolder(name: string, workspaceFolder: string, category?: string): string {
2727
const { atelier, folder, addCategory } = config("export", workspaceFolder);
2828

29-
const root = [workspaceFolderUri(workspaceFolder).fsPath, folder].join(path.sep);
29+
const root = [uriOfWorkspaceFolder(workspaceFolder).fsPath, folder].join(path.sep);
3030
const folderName = getFolderName(root, name, atelier, addCategory ? category : null);
3131
if (fs.existsSync(folderName)) {
3232
return fs.realpathSync.native(folderName);
@@ -49,7 +49,7 @@ export class DocumentContentProvider implements vscode.TextDocumentContentProvid
4949
// if wFolderUri was passed it takes precedence
5050
if (!wFolderUri) {
5151
workspaceFolder = workspaceFolder && workspaceFolder !== "" ? workspaceFolder : currentWorkspaceFolder();
52-
wFolderUri = workspaceFolderUri(workspaceFolder);
52+
wFolderUri = uriOfWorkspaceFolder(workspaceFolder);
5353
}
5454
let uri: vscode.Uri;
5555
if (wFolderUri.scheme === FILESYSTEM_SCHEMA || wFolderUri.scheme === FILESYSTEM_READONLY_SCHEMA) {

src/providers/FileSystemProvider/File.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ export class File implements vscode.FileStat {
1010
public data?: Uint8Array;
1111
public constructor(name: string, fileName: string, ts: string, size: number, data: string | Buffer) {
1212
this.type = vscode.FileType.File;
13-
this.ctime = new Date(ts).getTime();
14-
this.mtime = new Date(ts).getTime();
13+
this.ctime = Number(new Date(ts + "Z"));
14+
this.mtime = this.ctime;
1515
this.size = size;
1616
this.fileName = fileName;
1717
this.name = name;
Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import * as vscode from "vscode";
22
import * as url from "url";
3-
import { DocSearchResult } from "../../api/atelier";
43
import { AtelierAPI } from "../../api";
4+
import { StudioOpenDialog } from "../../queries";
5+
import { studioOpenDialogFromURI } from "../../utils/FileProviderUtil";
56

67
export class FileSearchProvider implements vscode.FileSearchProvider {
78
/**
@@ -15,58 +16,56 @@ export class FileSearchProvider implements vscode.FileSearchProvider {
1516
options: vscode.FileSearchOptions,
1617
token: vscode.CancellationToken
1718
): vscode.ProviderResult<vscode.Uri[]> {
18-
const folderQuery = url.parse(options.folder.toString(true), true).query;
19-
const type = folderQuery.type || "all";
20-
const category =
21-
folderQuery.csp === "" || folderQuery.csp === "1" ? "CSP" : type === "cls" ? "CLS" : type === "rtn" ? "RTN" : "*";
22-
const generated = folderQuery.generated === "1";
23-
const api = new AtelierAPI(options.folder);
19+
const uri = url.parse(options.folder.toString(true), true);
20+
const csp = uri.query.csp === "" || uri.query.csp === "1";
2421
let filter = query.pattern;
25-
if (category !== "CSP") {
22+
if (!csp) {
2623
if (options.folder.path !== "/") {
2724
filter = options.folder.path.slice(1) + "/%" + filter;
2825
}
2926
filter = filter.replace(/\//g, ".");
3027
}
31-
let counter = 0;
32-
if (!api.enabled) {
33-
return null;
28+
if (filter.length) {
29+
filter = "Name Like '%" + filter + "%'";
30+
} else {
31+
// When this is called without a query.pattern, every file is supposed to be returned, so do not provide a filter
32+
filter = "";
3433
}
35-
return api
36-
.getDocNames({
37-
filter,
38-
category,
39-
generated,
34+
let counter = 0;
35+
return studioOpenDialogFromURI(options.folder, { flat: true, filter: filter })
36+
.then((data) => {
37+
return data.result.content;
4038
})
41-
.then((data) => data.result.content)
42-
.then((files: DocSearchResult[]) =>
43-
files
44-
.map((file) => {
45-
if (category !== "CSP" && file.cat === "CSP") {
39+
.then((data: StudioOpenDialog[]) => {
40+
const api = new AtelierAPI(options.folder);
41+
return data
42+
.map((item: StudioOpenDialog) => {
43+
// item.Type only matters here if it is 5 (CSP)
44+
if (item.Type == "5" && !csp) {
4645
return null;
4746
}
48-
if (file.cat !== "CSP") {
49-
if (file.name.startsWith("%") && api.ns !== "%SYS") {
47+
if (item.Type !== "5") {
48+
if (item.Name.startsWith("%") && api.ns !== "%SYS") {
5049
return null;
5150
}
5251
// Convert dotted name to slashed one, treating the likes of ABC.1.int or DEF.T1.int in the same way
5352
// as the Studio dialog does.
54-
const nameParts = file.name.split(".");
53+
const nameParts = item.Name.split(".");
5554
const dotParts = nameParts
5655
.slice(-2)
5756
.join(".")
5857
.match(/^[A-Z]?\d*[.](mac|int|inc)$/)
5958
? 3
6059
: 2;
61-
file.name = nameParts.slice(0, -dotParts).join("/") + "/" + nameParts.slice(-dotParts).join(".");
60+
item.Name = nameParts.slice(0, -dotParts).join("/") + "/" + nameParts.slice(-dotParts).join(".");
6261
}
6362
if (!options.maxResults || ++counter <= options.maxResults) {
64-
return options.folder.with({ path: `/${file.name}` });
63+
return vscode.Uri.parse(`${options.folder.scheme}://${options.folder.authority}/${item.Name}`, true);
6564
} else {
6665
return null;
6766
}
6867
})
69-
.filter((el) => el !== null)
70-
);
68+
.filter((el) => el !== null);
69+
});
7170
}
7271
}

0 commit comments

Comments
 (0)