Skip to content
This repository was archived by the owner on Nov 6, 2020. It is now read-only.

Commit 4f6ad1b

Browse files
authored
Merge pull request #640 from microsoft/sunset
Sunset the extension
2 parents 69e2bb7 + 128ca61 commit 4f6ad1b

File tree

11 files changed

+95
-14
lines changed

11 files changed

+95
-14
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11

22

3+
## [v1.161.1](https://github.com/microsoft/azure-repos-vscode/tree/v1.161.1) (2020-09-04)
4+
5+
The Azure Repos VS Code extension has been sunsetted.
6+
Learn more at in our [deprecation notice](https://aka.ms/AA9k2vv).
7+
This version of the extension contains no functional changes other than a message box directing you to that notice.
8+
39
## [v1.161.0](https://github.com/microsoft/azure-repos-vscode/tree/v1.161.0) (2019-11-06)
410

511
[Full Changelog](https://github.com/microsoft/azure-repos-vscode/compare/v1.149.2...v1.161.0)

DEPRECATED.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Sunsetting the Azure Repos VS Code extension
2+
3+
We're sunsetting this Azure Repos VS Code extension.
4+
On 2020-11-06 (Nov 6, 2020), we'll remove it from the VS Code Marketplace and archive the repository.
5+
If you still have it installed, you may continue to use it, but it will not receive any further investment or updates.
6+
7+
## Why are we doing this?
8+
9+
Since we launched the extension four and a half years ago, Visual Studio Code has seen incredible adoption.
10+
Azure DevOps and Azure Repos have similarly continued to see amazing growth.
11+
However, use of TFVC, the centralized source control system, with VS Code has declined.
12+
The majority of VS Code users prefer Git, and therefore use of the extension has declined dramatically in the last 1-2 years.
13+
VS Code has great native Git support.
14+
Therefore we have taken the decision to discontinue support of this extension.
15+
Developers still using TFVC with VS Code will need to use an external version control client such as [the `tf` command line](https://docs.microsoft.com/azure/devops/repos/tfvc/use-team-foundation-version-control-commands).
16+
17+
## What will happen?
18+
19+
1. We'll ship an update which contains this notice but contains no other functional changes, bug fixes, etc.
20+
This serves to ensure that most users will see the notice.
21+
22+
2. On 2020-11-06 we'll unpublish the extension from the [Visual Studio Code Marketplace](https://marketplace.visualstudio.com/).
23+
Those who already have it installed can continue to use it, but without support from Microsoft.
24+
The extension won't receive any updates, bug fixes, or security fixes, so you use it at your own risk.
25+
26+
3. We will archive the [GitHub repository](https://github.com/microsoft/azure-repos-vscode) putting it into a read-only state. This will not delete the code or historical issues.
27+
28+
## Is there any action for me?
29+
30+
If you want to keep using the extension, no, there's no action.
31+
You can uninstall the extension on VS Code's extensions page.
32+
If you do, you won't be able to reinstall it once it's removed from the Marketplace.
33+
34+
## Thank you
35+
36+
To everyone who used the extension, provided feedback, or contributed bug fixes, THANK YOU!

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Azure Repos Extension for Visual Studio Code
2-
![Build Status](https://mseng.visualstudio.com/_apis/public/build/definitions/b924d696-3eae-4116-8443-9a18392d8544/3167/badge?branch=master)
2+
3+
**DEPRECATION NOTICE**:
4+
This extension is no longer receiving updates.
5+
[Learn more here](https://aka.ms/AA9k2vv).
6+
7+
---
38

49
This extension allows you to connect to Azure DevOps Services and Team Foundation Server and provides support for [Team Foundation Version Control (TFVC)](TFVC_README.md#quick-start).
510
It allows you to monitor your builds and manage your pull requests and work items for your TFVC or Git source repositories. The extension uses your local repository information

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "team",
33
"displayName": "Azure Repos",
44
"description": "Connect to Azure Repos and work with Git and Team Foundation Version Control (TFVC) repositories. Manage your pull requests, work items, and more.",
5-
"version": "1.161.0",
5+
"version": "1.161.1",
66
"publisher": "ms-vsts",
77
"icon": "assets/team.png",
88
"markdown": "standard",
@@ -229,7 +229,7 @@
229229
},
230230
"configuration": {
231231
"type": "object",
232-
"title": "Azure Repos extension options",
232+
"title": "Azure Repos",
233233
"properties": {
234234
"team.appInsights.enabled": {
235235
"type": "boolean",
@@ -277,6 +277,11 @@
277277
"default": true,
278278
"description": "Tracks whether the extension should display the Welcome message after the initial installation."
279279
},
280+
"team.showFarewellMessage": {
281+
"type": "boolean",
282+
"default": true,
283+
"description": "Show the deprecation message again?"
284+
},
280285
"tfvc.location": {
281286
"type": "string",
282287
"default": "",

src/extensionmanager.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ export class ExtensionManager implements Disposable {
244244
this._settings = new Settings(); //We need settings before showing the Welcome message
245245
Telemetry.Initialize(this._settings); //Need to initialize telemetry for showing welcome message
246246
if (!reinitializing) {
247+
await this.showFarewellMessage();
247248
await this.showWelcomeMessage(); //Ensure we show the message before hooking workspace.onDidChangeConfiguration
248249
}
249250

@@ -442,7 +443,7 @@ export class ExtensionManager implements Disposable {
442443
//Ensure this is async (and is awaited on) so that the extension doesn't continue until user deals with message
443444
private async showWelcomeMessage(): Promise<void> {
444445
if (this._settings.ShowWelcomeMessage) {
445-
const welcomeMessage: string = `Welcome to version ${Constants.ExtensionVersion} of the Azure Repos extension!`;
446+
const welcomeMessage: string = `This is version ${Constants.ExtensionVersion} of the Azure Repos extension.`;
446447
const messageItems: IButtonMessageItem[] = [];
447448
messageItems.push({ title : Strings.LearnMore,
448449
url : Constants.ReadmeLearnMoreUrl,
@@ -458,6 +459,21 @@ export class ExtensionManager implements Disposable {
458459
}
459460
}
460461

462+
private async showFarewellMessage(): Promise<void> {
463+
if (this._settings.ShowFarewellMessage) {
464+
const farewellMessage: string = `The Azure Repos extension has been sunsetted.`;
465+
const messageItems: IButtonMessageItem[] = [];
466+
messageItems.push({ title : Strings.LearnMore,
467+
url : Constants.FarewellLearnMoreUrl,
468+
telemetryId : TelemetryEvents.FarewellLearnMoreClick });
469+
messageItems.push({ title : Strings.DontShowAgain });
470+
const chosenItem: IButtonMessageItem = await VsCodeUtils.ShowInfoMessage(farewellMessage, ...messageItems);
471+
if (chosenItem && chosenItem.title === Strings.DontShowAgain) {
472+
this._settings.ShowFarewellMessage = false;
473+
}
474+
}
475+
}
476+
461477
//Set up the initial status bars
462478
private initializeStatusBars(): void {
463479
if (this.ensureMinimalInitialization()) {

src/helpers/constants.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
export class Constants {
99
static ExtensionName: string = "team";
1010
static ExtensionUserAgentName: string = "AzureReposVSCode";
11-
static ExtensionVersion: string = "1.161.0";
11+
static ExtensionVersion: string = "1.161.1";
1212
static OAuth: string = "OAuth";
13-
static TokenLearnMoreUrl: string = "https://aka.ms/v9r4jt";
13+
static TokenLearnMoreUrl: string = "https://aka.ms/gtgzt4";
1414
static TokenShowMeUrl: string = "https://aka.ms/o2wkmo";
1515
static ReadmeLearnMoreUrl: string = "https://aka.ms/jkapah";
16+
static FarewellLearnMoreUrl: string = "https://aka.ms/AA9k2vv";
1617
static TfvcLearnMoreUrl: string = "https://github.com/Microsoft/azure-repos-vscode/blob/master/TFVC_README.md#quick-start";
1718
static ServerWorkspaceUrl: string = "https://github.com/Microsoft/azure-repos-vscode/blob/master/TFVC_README.md#what-is-the-difference-between-a-local-and-server-workspace-how-can-i-tell-which-one-im-working-with";
1819
static VS2015U3CSRUrl: string = "https://msdn.microsoft.com/en-us/library/mt752379.aspx";
@@ -84,6 +85,7 @@ export class SettingNames {
8485
static TeamProject: string = SettingNames.SettingsPrefix + "teamProject";
8586
static BuildDefinitionId: string = SettingNames.SettingsPrefix + "buildDefinitionId";
8687
static ShowWelcomeMessage: string = SettingNames.SettingsPrefix + "showWelcomeMessage";
88+
static ShowFarewellMessage: string = SettingNames.SettingsPrefix + "showFarewellMessage";
8789
}
8890

8991
export class TelemetryEvents {
@@ -93,6 +95,7 @@ export class TelemetryEvents {
9395
static DeviceFlowFailed: string = TelemetryEvents.TelemetryPrefix + "deviceflowfailed";
9496
static DeviceFlowPat: string = TelemetryEvents.TelemetryPrefix + "deviceflowpat";
9597
static ExternalRepository: string = TelemetryEvents.TelemetryPrefix + "externalrepo";
98+
static FarewellLearnMoreClick: string = TelemetryEvents.TelemetryPrefix + "farewelllearnmoreclick";
9699
static Installed: string = TelemetryEvents.TelemetryPrefix + "installed";
97100
static ManualPat: string = TelemetryEvents.TelemetryPrefix + "manualpat";
98101
static OpenAdditionalQueryResults: string = TelemetryEvents.TelemetryPrefix + "openaddlqueryresults";

src/helpers/settings.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export interface ISettings {
7979
TeamProject: string;
8080
BuildDefinitionId: number;
8181
ShowWelcomeMessage: boolean;
82+
ShowFarewellMessage: boolean;
8283
}
8384

8485
export class Settings extends BaseSettings implements ISettings {
@@ -90,6 +91,7 @@ export class Settings extends BaseSettings implements ISettings {
9091
private _teamProject: string;
9192
private _buildDefinitionId: number;
9293
private _showWelcomeMessage: boolean;
94+
private _showFarewellMessage: boolean;
9395

9496
constructor() {
9597
super();
@@ -112,6 +114,7 @@ export class Settings extends BaseSettings implements ISettings {
112114
this._teamProject = this.readSetting<string>(SettingNames.TeamProject, undefined);
113115
this._buildDefinitionId = this.readSetting<number>(SettingNames.BuildDefinitionId, 0);
114116
this._showWelcomeMessage = this.readSetting<boolean>(SettingNames.ShowWelcomeMessage, true);
117+
this._showFarewellMessage = this.readSetting<boolean>(SettingNames.ShowFarewellMessage, true);
115118
}
116119

117120
public get AppInsightsEnabled(): boolean {
@@ -148,4 +151,11 @@ export class Settings extends BaseSettings implements ISettings {
148151
public set ShowWelcomeMessage(value: boolean) {
149152
this.writeSetting(SettingNames.ShowWelcomeMessage, value, true /*global*/);
150153
}
154+
155+
public get ShowFarewellMessage(): boolean {
156+
return this._showFarewellMessage;
157+
}
158+
public set ShowFarewellMessage(value: boolean) {
159+
this.writeSetting(SettingNames.ShowFarewellMessage, value, true /*global*/);
160+
}
151161
}

src/helpers/vscodeutils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"use strict";
66

77
import { commands, MessageItem, QuickPickItem, Range, window } from "vscode";
8-
import { Constants, MessageTypes } from "./constants";
8+
import { MessageTypes } from "./constants";
99
import { IButtonMessageItem } from "./vscodeutils.interfaces";
1010
import { Utils } from "./utils";
1111
import { Telemetry } from "../services/telemetry";
@@ -65,7 +65,7 @@ export class VsCodeUtils {
6565
private static async showMessage(message: string, type: MessageTypes, ...urlMessageItem: IButtonMessageItem[]): Promise<IButtonMessageItem> {
6666
//The following "cast" allows us to pass our own type around (and not reference "vscode" via an import)
6767
const messageItems: ButtonMessageItem[] = <ButtonMessageItem[]>urlMessageItem;
68-
const messageToDisplay: string = `(${Constants.ExtensionName}) ${Utils.FormatMessage(message)}`;
68+
const messageToDisplay: string = `${Utils.FormatMessage(message)}`;
6969

7070
//Use the typescript spread operator to pass the rest parameter to showErrorMessage
7171
let chosenItem: IButtonMessageItem;

test/contexts/contexthelper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export class SettingsMock implements ISettings {
1111
/* tslint:disable:variable-name */
1212
constructor(public AppInsightsEnabled: boolean, public AppInsightsKey: string, public LoggingLevel: string,
1313
public PollingInterval: number, public RemoteUrl: string, public TeamProject: string, public BuildDefinitionId: number,
14-
public ShowWelcomeMessage: boolean) {
14+
public ShowWelcomeMessage: boolean, public ShowFarewellMessage: boolean) {
1515
//nothing to do
1616
}
1717
/* tslint:enable:variable-name */

0 commit comments

Comments
 (0)