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

Commit

Permalink
Merge pull request #640 from microsoft/sunset
Browse files Browse the repository at this point in the history
Sunset the extension
  • Loading branch information
vtbassmatt authored Oct 2, 2020
2 parents 69e2bb7 + 128ca61 commit 4f6ad1b
Show file tree
Hide file tree
Showing 11 changed files with 95 additions and 14 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@


## [v1.161.1](https://github.com/microsoft/azure-repos-vscode/tree/v1.161.1) (2020-09-04)

The Azure Repos VS Code extension has been sunsetted.
Learn more at in our [deprecation notice](https://aka.ms/AA9k2vv).
This version of the extension contains no functional changes other than a message box directing you to that notice.

## [v1.161.0](https://github.com/microsoft/azure-repos-vscode/tree/v1.161.0) (2019-11-06)

[Full Changelog](https://github.com/microsoft/azure-repos-vscode/compare/v1.149.2...v1.161.0)
Expand Down
36 changes: 36 additions & 0 deletions DEPRECATED.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Sunsetting the Azure Repos VS Code extension

We're sunsetting this Azure Repos VS Code extension.
On 2020-11-06 (Nov 6, 2020), we'll remove it from the VS Code Marketplace and archive the repository.
If you still have it installed, you may continue to use it, but it will not receive any further investment or updates.

## Why are we doing this?

Since we launched the extension four and a half years ago, Visual Studio Code has seen incredible adoption.
Azure DevOps and Azure Repos have similarly continued to see amazing growth.
However, use of TFVC, the centralized source control system, with VS Code has declined.
The majority of VS Code users prefer Git, and therefore use of the extension has declined dramatically in the last 1-2 years.
VS Code has great native Git support.
Therefore we have taken the decision to discontinue support of this extension.
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).

## What will happen?

1. We'll ship an update which contains this notice but contains no other functional changes, bug fixes, etc.
This serves to ensure that most users will see the notice.

2. On 2020-11-06 we'll unpublish the extension from the [Visual Studio Code Marketplace](https://marketplace.visualstudio.com/).
Those who already have it installed can continue to use it, but without support from Microsoft.
The extension won't receive any updates, bug fixes, or security fixes, so you use it at your own risk.

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.

## Is there any action for me?

If you want to keep using the extension, no, there's no action.
You can uninstall the extension on VS Code's extensions page.
If you do, you won't be able to reinstall it once it's removed from the Marketplace.

## Thank you

To everyone who used the extension, provided feedback, or contributed bug fixes, THANK YOU!
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Azure Repos Extension for Visual Studio Code
![Build Status](https://mseng.visualstudio.com/_apis/public/build/definitions/b924d696-3eae-4116-8443-9a18392d8544/3167/badge?branch=master)

**DEPRECATION NOTICE**:
This extension is no longer receiving updates.
[Learn more here](https://aka.ms/AA9k2vv).

---

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).
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
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 7 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "team",
"displayName": "Azure Repos",
"description": "Connect to Azure Repos and work with Git and Team Foundation Version Control (TFVC) repositories. Manage your pull requests, work items, and more.",
"version": "1.161.0",
"version": "1.161.1",
"publisher": "ms-vsts",
"icon": "assets/team.png",
"markdown": "standard",
Expand Down Expand Up @@ -229,7 +229,7 @@
},
"configuration": {
"type": "object",
"title": "Azure Repos extension options",
"title": "Azure Repos",
"properties": {
"team.appInsights.enabled": {
"type": "boolean",
Expand Down Expand Up @@ -277,6 +277,11 @@
"default": true,
"description": "Tracks whether the extension should display the Welcome message after the initial installation."
},
"team.showFarewellMessage": {
"type": "boolean",
"default": true,
"description": "Show the deprecation message again?"
},
"tfvc.location": {
"type": "string",
"default": "",
Expand Down
18 changes: 17 additions & 1 deletion src/extensionmanager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ export class ExtensionManager implements Disposable {
this._settings = new Settings(); //We need settings before showing the Welcome message
Telemetry.Initialize(this._settings); //Need to initialize telemetry for showing welcome message
if (!reinitializing) {
await this.showFarewellMessage();
await this.showWelcomeMessage(); //Ensure we show the message before hooking workspace.onDidChangeConfiguration
}

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

private async showFarewellMessage(): Promise<void> {
if (this._settings.ShowFarewellMessage) {
const farewellMessage: string = `The Azure Repos extension has been sunsetted.`;
const messageItems: IButtonMessageItem[] = [];
messageItems.push({ title : Strings.LearnMore,
url : Constants.FarewellLearnMoreUrl,
telemetryId : TelemetryEvents.FarewellLearnMoreClick });
messageItems.push({ title : Strings.DontShowAgain });
const chosenItem: IButtonMessageItem = await VsCodeUtils.ShowInfoMessage(farewellMessage, ...messageItems);
if (chosenItem && chosenItem.title === Strings.DontShowAgain) {
this._settings.ShowFarewellMessage = false;
}
}
}

//Set up the initial status bars
private initializeStatusBars(): void {
if (this.ensureMinimalInitialization()) {
Expand Down
7 changes: 5 additions & 2 deletions src/helpers/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@
export class Constants {
static ExtensionName: string = "team";
static ExtensionUserAgentName: string = "AzureReposVSCode";
static ExtensionVersion: string = "1.161.0";
static ExtensionVersion: string = "1.161.1";
static OAuth: string = "OAuth";
static TokenLearnMoreUrl: string = "https://aka.ms/v9r4jt";
static TokenLearnMoreUrl: string = "https://aka.ms/gtgzt4";
static TokenShowMeUrl: string = "https://aka.ms/o2wkmo";
static ReadmeLearnMoreUrl: string = "https://aka.ms/jkapah";
static FarewellLearnMoreUrl: string = "https://aka.ms/AA9k2vv";
static TfvcLearnMoreUrl: string = "https://github.com/Microsoft/azure-repos-vscode/blob/master/TFVC_README.md#quick-start";
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";
static VS2015U3CSRUrl: string = "https://msdn.microsoft.com/en-us/library/mt752379.aspx";
Expand Down Expand Up @@ -84,6 +85,7 @@ export class SettingNames {
static TeamProject: string = SettingNames.SettingsPrefix + "teamProject";
static BuildDefinitionId: string = SettingNames.SettingsPrefix + "buildDefinitionId";
static ShowWelcomeMessage: string = SettingNames.SettingsPrefix + "showWelcomeMessage";
static ShowFarewellMessage: string = SettingNames.SettingsPrefix + "showFarewellMessage";
}

export class TelemetryEvents {
Expand All @@ -93,6 +95,7 @@ export class TelemetryEvents {
static DeviceFlowFailed: string = TelemetryEvents.TelemetryPrefix + "deviceflowfailed";
static DeviceFlowPat: string = TelemetryEvents.TelemetryPrefix + "deviceflowpat";
static ExternalRepository: string = TelemetryEvents.TelemetryPrefix + "externalrepo";
static FarewellLearnMoreClick: string = TelemetryEvents.TelemetryPrefix + "farewelllearnmoreclick";
static Installed: string = TelemetryEvents.TelemetryPrefix + "installed";
static ManualPat: string = TelemetryEvents.TelemetryPrefix + "manualpat";
static OpenAdditionalQueryResults: string = TelemetryEvents.TelemetryPrefix + "openaddlqueryresults";
Expand Down
10 changes: 10 additions & 0 deletions src/helpers/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ export interface ISettings {
TeamProject: string;
BuildDefinitionId: number;
ShowWelcomeMessage: boolean;
ShowFarewellMessage: boolean;
}

export class Settings extends BaseSettings implements ISettings {
Expand All @@ -90,6 +91,7 @@ export class Settings extends BaseSettings implements ISettings {
private _teamProject: string;
private _buildDefinitionId: number;
private _showWelcomeMessage: boolean;
private _showFarewellMessage: boolean;

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

public get AppInsightsEnabled(): boolean {
Expand Down Expand Up @@ -148,4 +151,11 @@ export class Settings extends BaseSettings implements ISettings {
public set ShowWelcomeMessage(value: boolean) {
this.writeSetting(SettingNames.ShowWelcomeMessage, value, true /*global*/);
}

public get ShowFarewellMessage(): boolean {
return this._showFarewellMessage;
}
public set ShowFarewellMessage(value: boolean) {
this.writeSetting(SettingNames.ShowFarewellMessage, value, true /*global*/);
}
}
4 changes: 2 additions & 2 deletions src/helpers/vscodeutils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"use strict";

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

//Use the typescript spread operator to pass the rest parameter to showErrorMessage
let chosenItem: IButtonMessageItem;
Expand Down
2 changes: 1 addition & 1 deletion test/contexts/contexthelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export class SettingsMock implements ISettings {
/* tslint:disable:variable-name */
constructor(public AppInsightsEnabled: boolean, public AppInsightsKey: string, public LoggingLevel: string,
public PollingInterval: number, public RemoteUrl: string, public TeamProject: string, public BuildDefinitionId: number,
public ShowWelcomeMessage: boolean) {
public ShowWelcomeMessage: boolean, public ShowFarewellMessage: boolean) {
//nothing to do
}
/* tslint:enable:variable-name */
Expand Down
8 changes: 4 additions & 4 deletions test/contexts/externalcontext.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ describe("ExternalContext", function() {
const repoPath: string = path.join(__dirname, TEST_REPOS_FOLDER, repoName, DOT_GIT_FOLDER);
const ctx: ExternalContext = new ExternalContext(repoPath);

const mock: SettingsMock = new SettingsMock(false, undefined, undefined, 1, "https://xplatalm.visualstudio.com", "L2.VSCodeExtension.RC", undefined, true);
const mock: SettingsMock = new SettingsMock(false, undefined, undefined, 1, "https://xplatalm.visualstudio.com", "L2.VSCodeExtension.RC", undefined, true, true);
const initialized: Boolean = await ctx.Initialize(mock);

assert.isTrue(initialized);
Expand All @@ -83,7 +83,7 @@ describe("ExternalContext", function() {
const repoPath: string = path.join(__dirname, TEST_REPOS_FOLDER, repoName, DOT_GIT_FOLDER);
const ctx: ExternalContext = new ExternalContext(repoPath);

const mock: SettingsMock = new SettingsMock(false, undefined, undefined, 1, undefined, "L2.VSCodeExtension.RC", undefined, true);
const mock: SettingsMock = new SettingsMock(false, undefined, undefined, 1, undefined, "L2.VSCodeExtension.RC", undefined, true, true);
const initialized: Boolean = await ctx.Initialize(mock);

assert.isFalse(initialized);
Expand All @@ -100,7 +100,7 @@ describe("ExternalContext", function() {
const repoPath: string = path.join(__dirname, TEST_REPOS_FOLDER, repoName, DOT_GIT_FOLDER);
const ctx: ExternalContext = new ExternalContext(repoPath);

const mock: SettingsMock = new SettingsMock(false, undefined, undefined, 1, "https://xplatalm.visualstudio.com", undefined, undefined, true);
const mock: SettingsMock = new SettingsMock(false, undefined, undefined, 1, "https://xplatalm.visualstudio.com", undefined, undefined, true, true);
const initialized: Boolean = await ctx.Initialize(mock);

assert.isFalse(initialized);
Expand All @@ -117,7 +117,7 @@ describe("ExternalContext", function() {
const repoPath: string = path.join(__dirname, TEST_REPOS_FOLDER, repoName, DOT_GIT_FOLDER);
const ctx: ExternalContext = new ExternalContext(repoPath);

const mock: SettingsMock = new SettingsMock(false, undefined, undefined, 1, undefined, undefined, undefined, true);
const mock: SettingsMock = new SettingsMock(false, undefined, undefined, 1, undefined, undefined, undefined, true, true);
const initialized: Boolean = await ctx.Initialize(mock);

assert.isFalse(initialized);
Expand Down

0 comments on commit 4f6ad1b

Please sign in to comment.