|
|
|
|
@@ -264,9 +264,18 @@ index 28f8a69a2a91f9cb9f4dbd73ed3e689b2b3afe84..b5f5b10004d3e36092a30f685938a606
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
diff --git a/product.json b/product.json
|
|
|
|
|
index 7cab6d1b9f3b84bfc703856e93773a293fd198cf..31d3d5a943192eee791e1121415b436dc1ed3822 100644
|
|
|
|
|
index 7cab6d1b9f3b84bfc703856e93773a293fd198cf..6924d94f65b390f52885b1036f7e96bce0e34680 100644
|
|
|
|
|
--- a/product.json
|
|
|
|
|
+++ b/product.json
|
|
|
|
|
@@ -1,6 +1,6 @@
|
|
|
|
|
{
|
|
|
|
|
- "nameShort": "Code - OSS",
|
|
|
|
|
- "nameLong": "Code - OSS",
|
|
|
|
|
+ "nameShort": "code-server",
|
|
|
|
|
+ "nameLong": "code-server",
|
|
|
|
|
"applicationName": "code-oss",
|
|
|
|
|
"dataFolderName": ".vscode-oss",
|
|
|
|
|
"win32MutexName": "vscodeoss",
|
|
|
|
|
@@ -20,7 +20,7 @@
|
|
|
|
|
"darwinBundleIdentifier": "com.visualstudio.code.oss",
|
|
|
|
|
"linuxIconName": "com.visualstudio.code.oss",
|
|
|
|
|
@@ -276,6 +285,22 @@ index 7cab6d1b9f3b84bfc703856e93773a293fd198cf..31d3d5a943192eee791e1121415b436d
|
|
|
|
|
"urlProtocol": "code-oss",
|
|
|
|
|
"extensionAllowedProposedApi": [
|
|
|
|
|
"ms-vscode.vscode-js-profile-flame",
|
|
|
|
|
@@ -136,5 +136,14 @@
|
|
|
|
|
"publisherDisplayName": "Microsoft"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
- ]
|
|
|
|
|
+ ],
|
|
|
|
|
+
|
|
|
|
|
+ "//": "https://github.com/VSCodium/vscodium/pull/155/files",
|
|
|
|
|
+ "documentationUrl": "https://go.microsoft.com/fwlink/?LinkID=533484#vscode",
|
|
|
|
|
+ "keyboardShortcutsUrlMac": "https://go.microsoft.com/fwlink/?linkid=832143",
|
|
|
|
|
+ "keyboardShortcutsUrlLinux": "https://go.microsoft.com/fwlink/?linkid=832144",
|
|
|
|
|
+ "keyboardShortcutsUrlWin": "https://go.microsoft.com/fwlink/?linkid=832145",
|
|
|
|
|
+ "introductoryVideosUrl": "https://go.microsoft.com/fwlink/?linkid=832146",
|
|
|
|
|
+ "tipsAndTricksUrl": "https://go.microsoft.com/fwlink/?linkid=852118",
|
|
|
|
|
+ "newsletterSignupUrl": "https://www.research.net/r/vsc-newsletter"
|
|
|
|
|
}
|
|
|
|
|
diff --git a/remote/.yarnrc b/remote/.yarnrc
|
|
|
|
|
deleted file mode 100644
|
|
|
|
|
index c1a32ce532afa501fb19bdbcf6bcb0ec151ecd99..0000000000000000000000000000000000000000
|
|
|
|
|
@@ -744,10 +769,10 @@ index 096b9e23493539c9937940a56e555d95bbae38d9..ef37e614004f550f7b64eacd362f6894
|
|
|
|
|
remove(key: string, scope: StorageScope): void {
|
|
|
|
|
diff --git a/src/vs/server/browser/client.ts b/src/vs/server/browser/client.ts
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000000000000000000000000000000000000..3c0703b7174ad792a4b42841e96ee93765d71601
|
|
|
|
|
index 0000000000000000000000000000000000000000..385b9da491d38a9f5d10fab6e4666c84a892f49d
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/src/vs/server/browser/client.ts
|
|
|
|
|
@@ -0,0 +1,189 @@
|
|
|
|
|
@@ -0,0 +1,240 @@
|
|
|
|
|
+import { Emitter } from 'vs/base/common/event';
|
|
|
|
|
+import { URI } from 'vs/base/common/uri';
|
|
|
|
|
+import { localize } from 'vs/nls';
|
|
|
|
|
@@ -766,6 +791,8 @@ index 0000000000000000000000000000000000000000..3c0703b7174ad792a4b42841e96ee937
|
|
|
|
|
+import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
|
|
|
|
|
+import { Options } from 'vs/server/ipc.d';
|
|
|
|
|
+import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
|
|
|
|
|
+import { ILogService } from 'vs/platform/log/common/log';
|
|
|
|
|
+import * as path from 'vs/base/common/path';
|
|
|
|
|
+
|
|
|
|
|
+class TelemetryService extends TelemetryChannelClient {
|
|
|
|
|
+ public constructor(
|
|
|
|
|
@@ -897,8 +924,57 @@ index 0000000000000000000000000000000000000000..3c0703b7174ad792a4b42841e96ee937
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const logService = (services.get(ILogService) as ILogService);
|
|
|
|
|
+ const storageService = (services.get(IStorageService) as IStorageService);
|
|
|
|
|
+ // We set this here first in case the path changes.
|
|
|
|
|
+ const updateCheckEndpoint = path.join(window.location.pathname, "/update/check")
|
|
|
|
|
+ const getUpdate = async (): Promise<void> => {
|
|
|
|
|
+ logService.debug("Checking for update...");
|
|
|
|
|
+
|
|
|
|
|
+ const response = await fetch(updateCheckEndpoint, {
|
|
|
|
|
+ headers: { "Accept": "application/json" },
|
|
|
|
|
+ });
|
|
|
|
|
+ if (!response.ok) {
|
|
|
|
|
+ throw new Error(response.statusText);
|
|
|
|
|
+ }
|
|
|
|
|
+ const json = await response.json();
|
|
|
|
|
+ if (json.error) {
|
|
|
|
|
+ throw new Error(json.error);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (json.isLatest) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const lastNoti = storageService.getNumber("csLastUpdateNotification", StorageScope.GLOBAL);
|
|
|
|
|
+ if (lastNoti) {
|
|
|
|
|
+ // Only remind them again after two days.
|
|
|
|
|
+ const timeout = 1000*60*24*2;
|
|
|
|
|
+ const threshold = lastNoti + timeout;
|
|
|
|
|
+ if (Date.now() < threshold) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ storageService.store("csLastUpdateNotification", Date.now(), StorageScope.GLOBAL);
|
|
|
|
|
+ (services.get(INotificationService) as INotificationService).notify({
|
|
|
|
|
+ severity: Severity.Info,
|
|
|
|
|
+ message: `[code-server v${json.latest}](https://github.com/cdr/code-server/releases/tag/v${json.latest}) has been released!`,
|
|
|
|
|
+ });
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ const updateLoop = (): void => {
|
|
|
|
|
+ getUpdate().catch((error) => {
|
|
|
|
|
+ logService.debug(`failed to check for update: ${error}`);
|
|
|
|
|
+ }).finally(() => {
|
|
|
|
|
+ // Check again every 6 hours.
|
|
|
|
|
+ setTimeout(updateLoop, 1000*60*6);
|
|
|
|
|
+ });
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ updateLoop();
|
|
|
|
|
+
|
|
|
|
|
+ // This will be used to set the background color while VS Code loads.
|
|
|
|
|
+ const theme = (services.get(IStorageService) as IStorageService).get("colorThemeData", StorageScope.GLOBAL);
|
|
|
|
|
+ const theme = storageService.get("colorThemeData", StorageScope.GLOBAL);
|
|
|
|
|
+ if (theme) {
|
|
|
|
|
+ localStorage.setItem("colorThemeData", theme);
|
|
|
|
|
+ }
|
|
|
|
|
@@ -3687,6 +3763,20 @@ index 021af6e0f8983c492f9cdd048ba2dcae7640bc1d..814dd0ff2fa7737e07833d8092c8f489
|
|
|
|
|
|
|
|
|
|
module = module.with({ path: ensureSuffix(module.path, '.js') });
|
|
|
|
|
const response = await fetch(module.toString(true));
|
|
|
|
|
diff --git a/src/vs/workbench/browser/actions/navigationActions.ts b/src/vs/workbench/browser/actions/navigationActions.ts
|
|
|
|
|
index 7344a3a29b32f7b370b99bf0cfdc79a322195ff8..dc21396e83e2f53914447d3460c2ee1103ecb28e 100644
|
|
|
|
|
--- a/src/vs/workbench/browser/actions/navigationActions.ts
|
|
|
|
|
+++ b/src/vs/workbench/browser/actions/navigationActions.ts
|
|
|
|
|
@@ -310,4 +310,8 @@ actionsRegistry.registerWorkbenchAction(SyncActionDescriptor.from(FocusNextPart,
|
|
|
|
|
actionsRegistry.registerWorkbenchAction(SyncActionDescriptor.from(FocusPreviousPart, { primary: KeyMod.Shift | KeyCode.F6 }), 'View: Focus Previous Part', CATEGORIES.View.value);
|
|
|
|
|
|
|
|
|
|
const workbenchRegistry = Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench);
|
|
|
|
|
-workbenchRegistry.registerWorkbenchContribution(GoHomeContributor, LifecyclePhase.Ready);
|
|
|
|
|
+// See https://github.com/cdr/code-server/issues/2328
|
|
|
|
|
+// workbenchRegistry.registerWorkbenchContribution(GoHomeContributor, LifecyclePhase.Ready);
|
|
|
|
|
+export const _1 = workbenchRegistry;
|
|
|
|
|
+export const _2 = GoHomeContributor;
|
|
|
|
|
+export const _3 = LifecyclePhase.Ready;
|
|
|
|
|
diff --git a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css b/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css
|
|
|
|
|
index ced2d815834e40a1543e80516472799075980733..dfcae73e8a042307600c67f163aa00ba9e0762f4 100644
|
|
|
|
|
--- a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css
|
|
|
|
|
@@ -3764,6 +3854,73 @@ index 74f6922e98b4bb6a7fb100f5aac015afe9fc171b..3243a97c2d378013d96ffbe87e9df6dd
|
|
|
|
|
|
|
|
|
|
.scm-view .monaco-list .monaco-list-row .resource-group > .actions,
|
|
|
|
|
.scm-view .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions {
|
|
|
|
|
diff --git a/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts b/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts
|
|
|
|
|
index 6af6a4b7f42654ec6cc60e0ba5efd376919f3e04..3a8176951628e0b2528aae8796ba684c3ab53d9a 100644
|
|
|
|
|
--- a/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts
|
|
|
|
|
+++ b/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts
|
|
|
|
|
@@ -4,6 +4,7 @@
|
|
|
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
import { escape } from 'vs/base/common/strings';
|
|
|
|
|
+import product from 'vs/platform/product/common/product';
|
|
|
|
|
import { localize } from 'vs/nls';
|
|
|
|
|
|
|
|
|
|
export default () => `
|
|
|
|
|
@@ -11,7 +12,7 @@ export default () => `
|
|
|
|
|
<div class="welcomePage" role="document">
|
|
|
|
|
<div class="title">
|
|
|
|
|
<h1 class="caption">${escape(localize('welcomePage.vscode', "Visual Studio Code"))}</h1>
|
|
|
|
|
- <p class="subtitle detail">${escape(localize({ key: 'welcomePage.editingEvolved', comment: ['Shown as subtitle on the Welcome page.'] }, "Editing evolved"))}</p>
|
|
|
|
|
+ <p class="subtitle detail">VS Code v${product.version}</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="row">
|
|
|
|
|
<div class="splash">
|
|
|
|
|
@@ -32,6 +33,19 @@ export default () => `
|
|
|
|
|
</ul>
|
|
|
|
|
<p class="none detail">${escape(localize('welcomePage.noRecentFolders', "No recent folders"))}</p>
|
|
|
|
|
</div>
|
|
|
|
|
+ <div class="section help">
|
|
|
|
|
+ <h2 class="caption">code-server ${escape(localize('welcomePage.help', "Help"))}</h2>
|
|
|
|
|
+ <ul>
|
|
|
|
|
+ <li><a href="https://github.com/cdr/code-server">GitHub Repository</a></li>
|
|
|
|
|
+ <li><a href="https://github.com/cdr/code-server/releases/tag/v${product.codeServerVersion}">Release Notes</a></li>
|
|
|
|
|
+ <li><a href="https://github.com/cdr/code-server/issues">Issue Tracker</a></li>
|
|
|
|
|
+ <li><a href="https://github.com/cdr/code-server/blob/master/doc/FAQ.md">FAQ</a></li>
|
|
|
|
|
+ <li><a href="https://github.com/cdr/code-server/blob/master/doc/guide.md">Setup Guide</a></li>
|
|
|
|
|
+ <li><a href="https://github.com/cdr/code-server/tree/master/doc">Docs</a></li>
|
|
|
|
|
+ <li><a href="https://github.com/cdr/code-server/discussions">Discussions</a></li>
|
|
|
|
|
+ <li><a href="https://cdr.co/join-community">Slack</a></li>
|
|
|
|
|
+ </ul>
|
|
|
|
|
+ </div>
|
|
|
|
|
<div class="section help">
|
|
|
|
|
<h2 class="caption">${escape(localize('welcomePage.help', "Help"))}</h2>
|
|
|
|
|
<ul>
|
|
|
|
|
diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css
|
|
|
|
|
index 738ce140c1af76ee0017c59cc883578e966f5348..80833b7023ed5795bb3de303b54ec08d9dab9b94 100644
|
|
|
|
|
--- a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css
|
|
|
|
|
+++ b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css
|
|
|
|
|
@@ -94,7 +94,7 @@
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.monaco-workbench .part.editor > .content .welcomePage .splash .section {
|
|
|
|
|
- margin-bottom: 5em;
|
|
|
|
|
+ margin-bottom: 3em;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.monaco-workbench .part.editor > .content .welcomePage .splash ul {
|
|
|
|
|
diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts
|
|
|
|
|
index 4a61a79fe447e2aa238af568791bff1e0cec4d29..69cc2e4331a3b04d05d79632920f5c5bbfa924e8 100644
|
|
|
|
|
--- a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts
|
|
|
|
|
+++ b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts
|
|
|
|
|
@@ -328,7 +328,7 @@ class WelcomePage extends Disposable {
|
|
|
|
|
|
|
|
|
|
const prodName = container.querySelector('.welcomePage .title .caption') as HTMLElement;
|
|
|
|
|
if (prodName) {
|
|
|
|
|
- prodName.textContent = this.productService.nameLong;
|
|
|
|
|
+ prodName.textContent = `code-server v${this.productService.codeServerVersion}`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
recentlyOpened.then(({ workspaces }) => {
|
|
|
|
|
diff --git a/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts b/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts
|
|
|
|
|
index ed4f26407391bd62219a9f8245a5cd63a7cb7488..92f26d1b082f80475cf76409a4569e948e9e0bd9 100644
|
|
|
|
|
--- a/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts
|
|
|
|
|
@@ -3797,18 +3954,25 @@ index 85d83f37da179a1e39266cf72a02e971f590308e..0659738b36df1747c9afcabf8d9abf26
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts
|
|
|
|
|
index a8d43045ecc8cbe04b3f8440cff16d42aadbcad0..cd589c6f75eccbeefbf364d426ac882396b26fb4 100644
|
|
|
|
|
index a8d43045ecc8cbe04b3f8440cff16d42aadbcad0..8e122c761ac7ddfee11f9dda2ac5e845b893cc28 100644
|
|
|
|
|
--- a/src/vs/workbench/services/environment/browser/environmentService.ts
|
|
|
|
|
+++ b/src/vs/workbench/services/environment/browser/environmentService.ts
|
|
|
|
|
@@ -119,8 +119,18 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment
|
|
|
|
|
@@ -119,8 +119,25 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment
|
|
|
|
|
@memoize
|
|
|
|
|
get logFile(): URI { return joinPath(this.options.logsPath, 'window.log'); }
|
|
|
|
|
|
|
|
|
|
+ // NOTE@coder: Use the regular path for extensions that write directly to disk
|
|
|
|
|
+ // instead of using the VS Code API.
|
|
|
|
|
+ // NOTE@coder: Use the same path in // ../../../../platform/environment/node/environmentService.ts
|
|
|
|
|
+ // and don't use the user data scheme. This solves two problems:
|
|
|
|
|
+ // 1. Extensions running in the browser (like Vim) might use these paths
|
|
|
|
|
+ // directly instead of using the file service and most likely can't write
|
|
|
|
|
+ // to `/User` on disk.
|
|
|
|
|
+ // 2. Settings will be stored in the file system instead of in browser
|
|
|
|
|
+ // storage. Using browser storage makes sharing or seeding settings
|
|
|
|
|
+ // between browsers difficult. We may want to revisit this once/if we get
|
|
|
|
|
+ // settings sync.
|
|
|
|
|
@memoize
|
|
|
|
|
- get userRoamingDataHome(): URI { return URI.file('/User').with({ scheme: Schemas.userData }); }
|
|
|
|
|
+ get userRoamingDataHome(): URI { return URI.file(this.userDataPath).with({ scheme: Schemas.userData }); }
|
|
|
|
|
+ get userRoamingDataHome(): URI { return joinPath(URI.file(this.userDataPath).with({ scheme: Schemas.vscodeRemote }), 'User'); }
|
|
|
|
|
+ @memoize
|
|
|
|
|
+ get userDataPath(): string {
|
|
|
|
|
+ const dataPath = this.payload?.get("userDataPath");
|
|
|
|
|
@@ -3820,7 +3984,7 @@ index a8d43045ecc8cbe04b3f8440cff16d42aadbcad0..cd589c6f75eccbeefbf364d426ac8823
|
|
|
|
|
|
|
|
|
|
@memoize
|
|
|
|
|
get settingsResource(): URI { return joinPath(this.userRoamingDataHome, 'settings.json'); }
|
|
|
|
|
@@ -301,7 +311,12 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment
|
|
|
|
|
@@ -301,7 +318,12 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment
|
|
|
|
|
extensionHostDebugEnvironment.params.port = parseInt(value);
|
|
|
|
|
break;
|
|
|
|
|
case 'enableProposedApi':
|
|
|
|
|
|