Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

VS Code doesn't correctly uninstall duplicate extensions with different publisher ID #76211

Closed
fiveisprime opened this issue Jun 26, 2019 · 8 comments
Assignees
Labels
bug Issue identified by VS Code Team member as probable bug extensions Issues concerning extensions important Issue identified as high-priority verified Verification succeeded
Milestone

Comments

@fiveisprime
Copy link
Member

I recently worked with the marketplace team to transfer an extension between publishers. Once I published the extension under the new publisher, VS Code recognized the extension needed to update and installed the extension under the new publisher.

The problem is that VS Code doesn't correctly uninstall the old extension so users who had the extension with the old publisher now have both extensions, which causes conflict when registering events.

VS Code should recognize a duplicate extension with conflicting publisher IDs and remove the previous/oldest version.

See: microsoft/vscode-docker#1008

@vscodebot
Copy link

vscodebot bot commented Jun 26, 2019

(Experimental duplicate detection)
Thanks for submitting this issue. Please also check if it is already covered by an existing one, like:

@vscodebot vscodebot bot added the extensions Issues concerning extensions label Jun 26, 2019
@gjsjohnmurray
Copy link
Contributor

See #59918 (comment) for how I migrated an extension to a new publisher id. Part of my procedure included releasing a stub version under the old publisher id. The old extension doesn't automatically uninstall but at least it doesn't interfere with the new one.

@sandy081
Copy link
Member

AFIK old extension with old name will not interfere with new extension with new name.

If you still have the set up to reproduce, can you please open the extensions directory under which extensions are created and open the old extension folder and provide us the package.json contents?

Also open the package.json of the new extension and check if they have metadata property set and the UUID is same for both?

@sandy081 sandy081 added the info-needed Issue requires more information from poster label Jun 27, 2019
@ejizba
Copy link
Member

ejizba commented Jun 27, 2019

@sandy081 you can reproduce in the following way (I'm testing on insiders)

  1. Start with an instance of VS Code without any Docker extension
  2. Download the old vsix from this release and install
  3. Wait to see if it updates automatically - it doesn't
  4. Try to install the new docker from the extensions view
  5. Now I have both:
    Screen Shot 2019-06-27 at 8 44 43 AM
"ms-azuretools" package.json
{
	"name": "vscode-docker",
	"version": "0.6.4",
	"preview": true,
	"publisher": "ms-azuretools",
	"displayName": "Docker",
	"description": "Adds syntax highlighting, commands, hover tips, and linting for Dockerfile and docker-compose files.",
	"license": "SEE LICENSE IN LICENSE.md",
	"icon": "images/docker_icon.png",
	"aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217",
	"galleryBanner": {
		"color": "#1289B9",
		"theme": "dark"
	},
	"categories": [
		"Programming Languages",
		"Linters",
		"Azure"
	],
	"keywords": [
		"docker",
		"compose",
		"container",
		"multi-root ready"
	],
	"repository": {
		"type": "git",
		"url": "https://github.com/microsoft/vscode-docker"
	},
	"homepage": "https://github.com/Microsoft/vscode-docker/blob/master/README.md",
	"activationEvents": [
		"onCommand:vscode-docker.acr.createRegistry",
		"onCommand:vscode-docker.acr.deleteImage",
		"onCommand:vscode-docker.acr.deleteRegistry",
		"onCommand:vscode-docker.acr.deleteRepository",
		"onCommand:vscode-docker.acr.pullImage",
		"onCommand:vscode-docker.acr.pullRepo",
		"onCommand:vscode-docker.acr.quickBuild",
		"onCommand:vscode-docker.acr.runTask",
		"onCommand:vscode-docker.acr.runTaskFile",
		"onCommand:vscode-docker.acr.showTask",
		"onCommand:vscode-docker.acr.untagImage",
		"onCommand:vscode-docker.acr.viewLogs",
		"onCommand:vscode-docker.api.configure",
		"onCommand:vscode-docker.browseAzurePortal",
		"onCommand:vscode-docker.browseDockerHub",
		"onCommand:vscode-docker.compose.down",
		"onCommand:vscode-docker.compose.restart",
		"onCommand:vscode-docker.compose.up",
		"onCommand:vscode-docker.configure",
		"onCommand:vscode-docker.connectCustomRegistry",
		"onCommand:vscode-docker.container.open-shell",
		"onCommand:vscode-docker.container.remove",
		"onCommand:vscode-docker.container.restart",
		"onCommand:vscode-docker.container.show-logs",
		"onCommand:vscode-docker.container.start",
		"onCommand:vscode-docker.container.start.azurecli",
		"onCommand:vscode-docker.container.start.interactive",
		"onCommand:vscode-docker.container.stop",
		"onCommand:vscode-docker.createWebApp",
		"onCommand:vscode-docker.disconnectCustomRegistry",
		"onCommand:vscode-docker.dockerHubLogin",
		"onCommand:vscode-docker.dockerHubLogout",
		"onCommand:vscode-docker.explorer.refresh",
		"onCommand:vscode-docker.image.build",
		"onCommand:vscode-docker.image.inspect",
		"onCommand:vscode-docker.image.push",
		"onCommand:vscode-docker.image.remove",
		"onCommand:vscode-docker.images.selectGroupBy",
		"onCommand:vscode-docker.image.tag",
		"onCommand:vscode-docker.setRegistryAsDefault",
		"onCommand:vscode-docker.system.prune",
		"onDebugInitialConfigurations",
		"onDebugResolve:docker-coreclr",
		"onLanguage:dockerfile",
		"onLanguage:yaml",
		"onView:dockerExplorer"
	],
	"main": "main",
	"contributes": {
		"menus": {
			"commandPalette": [
				{
					"command": "vscode-docker.api.configure",
					"when": "never"
				},
				{
					"command": "vscode-docker.browseDockerHub",
					"when": "false"
				},
				{
					"command": "vscode-docker.createWebApp",
					"when": "false"
				},
				{
					"command": "vscode-docker.setRegistryAsDefault",
					"when": "never"
				},
				{
					"command": "vscode-docker.acr.createRegistry",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.acr.deleteImage",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.acr.deleteRegistry",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.acr.deleteRepository",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.acr.pullImage",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.acr.pullRepo",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.acr.quickBuild",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.acr.runTask",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.acr.runTaskFile",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.acr.showTask",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.acr.untagImage",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.acr.viewLogs",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.browseAzurePortal",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.compose.down",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.compose.restart",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.compose.up",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.configure",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.connectCustomRegistry",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.container.open-shell",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.container.remove",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.container.restart",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.container.show-logs",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.container.start",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.container.start.azurecli",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.container.start.interactive",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.container.stop",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.disconnectCustomRegistry",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.dockerHubLogin",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.dockerHubLogout",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.explorer.refresh",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.image.build",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.image.inspect",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.image.push",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.image.remove",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.images.selectGroupBy",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.image.tag",
					"when": "!isOldDockerPublisherInstalled"
				},
				{
					"command": "vscode-docker.system.prune",
					"when": "!isOldDockerPublisherInstalled"
				}
			],
			"editor/context": [
				{
					"when": "!isOldDockerPublisherInstalled && editorLangId == dockerfile && isAzureAccountInstalled",
					"command": "vscode-docker.acr.quickBuild",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && editorLangId == yaml",
					"command": "vscode-docker.acr.runTaskFile",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename == docker-compose.yml",
					"command": "vscode-docker.compose.down",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename == docker-compose.yml",
					"command": "vscode-docker.compose.restart",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename == docker-compose.yml",
					"command": "vscode-docker.compose.up",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename == docker-compose.debug.yml",
					"command": "vscode-docker.compose.down",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename == docker-compose.debug.yml",
					"command": "vscode-docker.compose.restart",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename == docker-compose.debug.yml",
					"command": "vscode-docker.compose.up",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && editorLangId == dockerfile",
					"command": "vscode-docker.image.build",
					"group": "docker"
				}
			],
			"explorer/context": [
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename =~ /(^|\\.)dockerfile$/i",
					"command": "vscode-docker.acr.quickBuild",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename =~ /^(?:(?!^docker-compose\\.ya?ml$).)*\\.ya?ml$/i",
					"command": "vscode-docker.acr.runTaskFile",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename =~ /docker-compose/i",
					"command": "vscode-docker.compose.down",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename =~ /docker-compose/i",
					"command": "vscode-docker.compose.restart",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename =~ /docker-compose/i",
					"command": "vscode-docker.compose.up",
					"group": "docker"
				},
				{
					"when": "!isOldDockerPublisherInstalled && resourceFilename =~ /dockerfile/i",
					"command": "vscode-docker.image.build",
					"group": "docker"
				}
			],
			"view/title": [
				{
					"command": "vscode-docker.explorer.refresh",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer",
					"group": "navigation@1"
				},
				{
					"command": "vscode-docker.system.prune",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer",
					"group": "navigation@2"
				}
			],
			"view/item/context": [
				{
					"command": "vscode-docker.images.selectGroupBy",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^imagesRootNode$/",
					"group": "inline"
				},
				{
					"command": "vscode-docker.acr.createRegistry",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem == azureRegistryRootNode",
					"group": "default"
				},
				{
					"command": "vscode-docker.acr.deleteImage",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem == azureImageTagNode",
					"group": "default"
				},
				{
					"command": "vscode-docker.acr.deleteRegistry",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem == azureRegistryNode",
					"group": "default"
				},
				{
					"command": "vscode-docker.acr.deleteRepository",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem == azureRepositoryNode",
					"group": "default"
				},
				{
					"command": "vscode-docker.acr.pullImage",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem == azureImageTagNode",
					"group": "default"
				},
				{
					"command": "vscode-docker.acr.pullRepo",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem == azureRepositoryNode",
					"group": "default"
				},
				{
					"command": "vscode-docker.acr.runTask",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem == taskNode",
					"group": "default"
				},
				{
					"command": "vscode-docker.acr.showTask",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem == taskNode",
					"group": "default"
				},
				{
					"command": "vscode-docker.acr.untagImage",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem == azureImageTagNode",
					"group": "default"
				},
				{
					"command": "vscode-docker.acr.viewLogs",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(azureRegistryNode|azureImageTagNode|taskNode)$/",
					"group": "default"
				},
				{
					"command": "vscode-docker.browseDockerHub",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(dockerHubImageTagNode|dockerHubRepositoryNode|dockerHubOrgNode)$/",
					"group": "default"
				},
				{
					"command": "vscode-docker.browseAzurePortal",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(azureRegistryNode|azureRepositoryNode|azureImageTagNode)$/",
					"group": "default"
				},
				{
					"command": "vscode-docker.connectCustomRegistry",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem == customRootNode",
					"group": "default"
				},
				{
					"command": "vscode-docker.container.open-shell",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(runningLocalContainerNode|containersRootNode)$/",
					"group": "default"
				},
				{
					"command": "vscode-docker.container.remove",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(stoppedLocalContainerNode|runningLocalContainerNode|containersRootNode)$/",
					"group": "default"
				},
				{
					"command": "vscode-docker.container.restart",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(runningLocalContainerNode|stoppedLocalContainerNode|containersRootNode)$/",
					"group": "default"
				},
				{
					"command": "vscode-docker.container.show-logs",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(runningLocalContainerNode|stoppedLocalContainerNode|containersRootNode)$/",
					"group": "default"
				},
				{
					"command": "vscode-docker.container.start",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
					"group": "5_default"
				},
				{
					"command": "vscode-docker.container.start.interactive",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
					"group": "5_default"
				},
				{
					"command": "vscode-docker.container.stop",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(runningLocalContainerNode|containersRootNode)$/",
					"group": "5_default"
				},
				{
					"command": "vscode-docker.createWebApp",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(azureImageTagNode|dockerHubImageTagNode|customImageTagNode)$/",
					"group": "5_default"
				},
				{
					"command": "vscode-docker.disconnectCustomRegistry",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(customRegistryNode)$/",
					"group": "5_default"
				},
				{
					"command": "vscode-docker.dockerHubLogout",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem == dockerHubRootNode",
					"group": "5_default"
				},
				{
					"command": "vscode-docker.image.inspect",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
					"group": "5_default"
				},
				{
					"command": "vscode-docker.image.push",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
					"group": "5_default"
				},
				{
					"command": "vscode-docker.image.remove",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
					"group": "5_default"
				},
				{
					"command": "vscode-docker.image.tag",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
					"group": "5_default"
				},
				{
					"command": "vscode-docker.setRegistryAsDefault",
					"when": "!isOldDockerPublisherInstalled && view == dockerExplorer && viewItem =~ /^(customRegistryNode|azureRegistryNode|dockerHubOrgNode)$/",
					"group": "5_default"
				}
			]
		},
		"debuggers": [
			{
				"type": "docker",
				"label": "Docker: Node.js",
				"configurationSnippets": [
					{
						"label": "Docker: Attach to Node",
						"description": "Docker: Attach to Node",
						"body": {
							"type": "node",
							"request": "attach",
							"name": "Docker: Attach to Node",
							"remoteRoot": "/usr/src/app"
						}
					}
				]
			},
			{
				"type": "docker-coreclr",
				"label": "Docker: Launch .NET Core (Preview)",
				"configurationSnippets": [
					{
						"label": "Docker: Launch .NET Core (Preview)",
						"description": "Docker: Launch .NET Core (Preview)",
						"body": {
							"name": "Docker: Launch .NET Core (Preview)",
							"type": "docker-coreclr",
							"request": "launch",
							"preLaunchTask": "build",
							"dockerBuild": {},
							"dockerRun": {}
						}
					}
				],
				"configurationAttributes": {
					"launch": {
						"properties": {
							"appFolder": {
								"type": "string",
								"description": "Path to the folder for the application."
							},
							"appOutput": {
								"type": "string",
								"description": "Path to the output assembly for the application."
							},
							"appProject": {
								"type": "string",
								"description": "Path to the application project file."
							},
							"dockerBuild": {
								"description": "Options for building the Docker image used for debugging.",
								"properties": {
									"args": {
										"type": "object",
										"description": "Build arguments applied to the Docker image used for debugging.",
										"additionalProperties": {
											"type": "string"
										}
									},
									"context": {
										"type": "string",
										"description": "Path to the Docker build context."
									},
									"dockerfile": {
										"type": "string",
										"description": "Path to the Dockerfile used for the build."
									},
									"labels": {
										"type": "object",
										"description": "Labels applied to the Docker image used for debugging.",
										"additionalProperties": {
											"type": "string"
										}
									},
									"tag": {
										"type": "string",
										"description": "Tag applied to the Docker image used for debugging."
									},
									"target": {
										"type": "string",
										"description": "Docker build target (stage) used for debugging."
									}
								}
							},
							"dockerRun": {
								"description": "Options for running the Docker container used for debugging.",
								"properties": {
									"containerName": {
										"type": "string",
										"description": "Name of the container used for debugging."
									},
									"env": {
										"type": "object",
										"description": "Environment variables applied to the Docker container used for debugging.",
										"additionalProperties": {
											"type": "string"
										}
									},
									"envFiles": {
										"type": "array",
										"description": "Files of environment variables read in and applied to the Docker container used for debugging.",
										"items": {
											"type": "string"
										}
									},
									"labels": {
										"type": "object",
										"description": "Labels applied to the Docker container used for debugging.",
										"additionalProperties": {
											"type": "string"
										}
									},
									"network": {
										"type": "string",
										"description": "The network to which the container will be connected."
									},
									"networkAlias": {
										"type": "string",
										"description": "The network-scoped alias to assign to the container."
									},
									"ports": {
										"type": "array",
										"description": "Ports that are going to be mapped on the host.",
										"items": {
											"type": "object",
											"properties": {
												"hostPort": {
													"type": "string",
													"description": "Port number to be bound on the host."
												},
												"containerPort": {
													"type": "string",
													"description": "Port number of the container to be bound."
												},
												"protocol": {
													"type": "string",
													"description": "Specific protocol for the binding (`tcp | udp`).",
													"enum": [
														"tcp",
														"udp"
													]
												},
												"required": [
													"containerPort"
												]
											}
										}
									},
									"extraHosts": {
										"type": "array",
										"description": "Hosts to be added to the container's `hosts` file for DNS resolution.",
										"items": {
											"type": "object",
											"properties": {
												"hostname": {
													"type": "string",
													"description": "Hostname for dns resolution."
												},
												"ip": {
													"type": "string",
													"description": "IP associated to the hostname."
												}
											},
											"required": [
												"hostname",
												"ip"
											]
										}
									},
									"volumes": {
										"type": "array",
										"description": "Volumes that are going to be mapped to the container.",
										"items": {
											"type": "object",
											"properties": {
												"localPath": {
													"type": "string",
													"description": "Path on local machine that will be mapped. The folder will be created if it does not exist."
												},
												"containerPath": {
													"type": "string",
													"description": "Path where the volume will be mapped within the container. The folder will be created if it does not exist."
												},
												"permissions": {
													"type": "string",
													"description": "Permissions for the container for the mapped volume, `rw` for read-write or `ro` for read-only.",
													"enum": [
														"rw",
														"ro"
													]
												}
											},
											"required": [
												"localPath",
												"containerPath"
											]
										}
									}
								}
							}
						}
					}
				}
			}
		],
		"languages": [
			{
				"id": "dockerfile",
				"aliases": [
					"Dockerfile"
				],
				"filenamePatterns": [
					"*.dockerfile",
					"Dockerfile"
				]
			},
			{
				"id": "ignore",
				"filenames": [
					".dockerignore"
				]
			}
		],
		"configuration": {
			"type": "object",
			"title": "Docker configuration options",
			"properties": {
				"docker.defaultRegistryPath": {
					"type": "string",
					"default": "",
					"description": "Default registry and path when tagging an image"
				},
				"docker.showExplorer": {
					"type": "boolean",
					"default": true,
					"description": "Show or hide the Explorer"
				},
				"docker.explorerRefreshInterval": {
					"type": "number",
					"default": 1000,
					"description": "Explorer refresh interval, default is 1000ms"
				},
				"docker.groupImagesBy": {
					"type": "string",
					"default": "Repository",
					"description": "How to group items in the treeview Images node",
					"enum": [
						"None",
						"Repository",
						"RepositoryName",
						"ImageId"
					]
				},
				"docker.imageBuildContextPath": {
					"type": "string",
					"default": "",
					"description": "Build context PATH to pass to Docker build command"
				},
				"docker.truncateLongRegistryPaths": {
					"type": "boolean",
					"default": false,
					"description": "Truncate long Image and Container registry paths in the Explorer"
				},
				"docker.truncateMaxLength": {
					"type": "number",
					"default": 10,
					"description": "Maximum number of characters for long registry paths in the Explorer, including elipsis"
				},
				"docker.host": {
					"type": "string",
					"default": "",
					"description": "Full host address to connect to (with protocol). Equivalent to setting the DOCKER_HOST environment variable"
				},
				"docker.importCertificates": {
					"oneOf": [
						{
							"type": "boolean"
						},
						{
							"type": "object",
							"properties": {
								"useCertificateStore": {
									"type": "boolean",
									"default": true,
									"description": "On Mac and Windows, indicates whether to automatically import certificates from the system certificate store. Ignored on Linux."
								},
								"certificatePaths": {
									"type": "array",
									"items": {
										"type": "string"
									},
									"default": [
										"/etc/ssl/certs/ca-certificates",
										"/etc/openssl/certs",
										"/etc/pki/tls/certs",
										"/usr/local/share/certs"
									],
									"description": "Paths to files or folders containing certificates to import. For Linux, the correct path to pick up system-wide certificates will depend on the distribution."
								}
							}
						}
					],
					"default": false,
					"description": "True causes the extension to attempt to find system-wide certificates, false indicates that the default Node.js trusted certificates list will be used. Use an object to get more fine-grained control."
				},
				"docker.languageserver.diagnostics.deprecatedMaintainer": {
					"scope": "resource",
					"type": "string",
					"default": "warning",
					"enum": [
						"ignore",
						"warning",
						"error"
					],
					"description": "Controls the diagnostic severity for the deprecated MAINTAINER instruction"
				},
				"docker.languageserver.diagnostics.emptyContinuationLine": {
					"scope": "resource",
					"type": "string",
					"default": "warning",
					"enum": [
						"ignore",
						"warning",
						"error"
					],
					"description": "Controls the diagnostic severity for flagging empty continuation lines found in instructions that span multiple lines"
				},
				"docker.languageserver.diagnostics.directiveCasing": {
					"scope": "resource",
					"type": "string",
					"default": "warning",
					"enum": [
						"ignore",
						"warning",
						"error"
					],
					"description": "Controls the diagnostic severity for parser directives that are not written in lowercase"
				},
				"docker.languageserver.diagnostics.instructionCasing": {
					"scope": "resource",
					"type": "string",
					"default": "warning",
					"enum": [
						"ignore",
						"warning",
						"error"
					],
					"description": "Controls the diagnostic severity for instructions that are not written in uppercase"
				},
				"docker.languageserver.diagnostics.instructionCmdMultiple": {
					"scope": "resource",
					"type": "string",
					"default": "warning",
					"enum": [
						"ignore",
						"warning",
						"error"
					],
					"description": "Controls the diagnostic severity for flagging a Dockerfile with multiple CMD instructions"
				},
				"docker.languageserver.diagnostics.instructionEntrypointMultiple": {
					"scope": "resource",
					"type": "string",
					"default": "warning",
					"enum": [
						"ignore",
						"warning",
						"error"
					],
					"description": "Controls the diagnostic severity for flagging a Dockerfile with multiple ENTRYPOINT instructions"
				},
				"docker.languageserver.diagnostics.instructionHealthcheckMultiple": {
					"scope": "resource",
					"type": "string",
					"default": "warning",
					"enum": [
						"ignore",
						"warning",
						"error"
					],
					"description": "Controls the diagnostic severity for flagging a Dockerfile with multiple HEALTHCHECK instructions"
				},
				"docker.languageserver.diagnostics.instructionJSONInSingleQuotes": {
					"scope": "resource",
					"type": "string",
					"default": "warning",
					"enum": [
						"ignore",
						"warning",
						"error"
					],
					"description": "Controls the diagnostic severity for JSON instructions that are written incorrectly with single quotes"
				},
				"docker.languageserver.diagnostics.instructionWorkdirRelative": {
					"scope": "resource",
					"type": "string",
					"default": "warning",
					"enum": [
						"ignore",
						"warning",
						"error"
					],
					"description": "Controls the diagnostic severity for WORKDIR instructions that do not point to an absolute path"
				},
				"docker.attachShellCommand.linuxContainer": {
					"type": "string",
					"default": "/bin/sh -c \"[ -e /bin/bash ] && /bin/bash || /bin/sh\"",
					"description": "Attach command to use for Linux containers"
				},
				"docker.attachShellCommand.windowsContainer": {
					"type": "string",
					"default": "powershell",
					"description": "Attach command to use for Windows containers"
				},
				"docker.promptOnSystemPrune": {
					"type": "boolean",
					"default": true,
					"description": "Prompt for confirmation when running System Prune command"
				},
				"docker.dockerComposeBuild": {
					"type": "boolean",
					"default": true,
					"description": "Run docker-compose with the --build argument, defaults to true"
				},
				"docker.dockerComposeDetached": {
					"type": "boolean",
					"default": true,
					"description": "Run docker-compose with the --d (detached) argument, defaults to true"
				}
			}
		},
		"commands": [
			{
				"command": "vscode-docker.images.selectGroupBy",
				"title": "Group Images By...",
				"icon": {
					"light": "images/SortingGrouping_16x.svg",
					"dark": "images/SortingGrouping_16x.svg"
				},
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.createRegistry",
				"title": "Create Azure Registry",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.deleteImage",
				"title": "Delete Azure Image",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.deleteRegistry",
				"title": "Delete Azure Registry",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.deleteRepository",
				"title": "Delete Azure Repository",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.pullImage",
				"title": "Pull Tag from Azure",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.pullRepo",
				"title": "Pull Repository from Azure",
				"description": "Pull all Image tags from an Azure Repository",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.quickBuild",
				"title": "ACR Tasks: Build Image",
				"description": "Queue an Azure build from a Dockerfile",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.runTask",
				"title": "Run Task",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.runTaskFile",
				"title": "Run ACR Task File",
				"description": "Run an ACR task from a yaml file.",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.showTask",
				"title": "Show Task Properties",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.untagImage",
				"title": "Untag Azure Image",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.acr.viewLogs",
				"title": "View Task Logs",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.api.configure",
				"title": "Add Docker Files to Workspace (API)"
			},
			{
				"command": "vscode-docker.browseDockerHub",
				"title": "Browse in Docker Hub",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.browseAzurePortal",
				"title": "Browse in the Azure Portal",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.compose.down",
				"title": "Compose Down",
				"description": "Stops a composition of containers",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.compose.restart",
				"title": "Compose Restart",
				"description": "Restarts a composition of containers",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.compose.up",
				"title": "Compose Up",
				"description": "Starts a composition of containers",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.configure",
				"title": "Add Docker Files to Workspace",
				"description": "Add Dockerfile, docker-compose.yml files",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.connectCustomRegistry",
				"title": "Connect to a Private Registry... (Preview)",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.container.open-shell",
				"title": "Attach Shell",
				"description": "Open a terminal with an interactive shell for a running container",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.container.remove",
				"title": "Remove Container",
				"description": "Remove a stopped container",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.container.restart",
				"title": "Restart Container",
				"description": "Restart one or more containers",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.container.show-logs",
				"title": "Show Logs",
				"description": "Show the logs of a running container",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.container.start",
				"title": "Run",
				"description": "Starts a container from an image",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.container.start.azurecli",
				"title": "Azure CLI",
				"description": "Starts a container from the Azure CLI image and runs it interactively",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.container.start.interactive",
				"title": "Run Interactive",
				"description": "Starts a container from an image and runs it interactively",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.container.stop",
				"title": "Stop Container",
				"description": "Stop a running container",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.createWebApp",
				"title": "Deploy Image to Azure App Service",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.disconnectCustomRegistry",
				"title": "Disconnect from Private Registry",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.dockerHubLogin",
				"title": "Log In to Docker Hub",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.dockerHubLogout",
				"title": "Log Out of Docker Hub",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.explorer.refresh",
				"title": "Refresh Explorer",
				"category": "Docker",
				"icon": {
					"light": "images/light/refresh.svg",
					"dark": "images/dark/refresh.svg"
				}
			},
			{
				"command": "vscode-docker.image.build",
				"title": "Build Image",
				"description": "Build a Docker image from a Dockerfile",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.image.inspect",
				"title": "Inspect Image",
				"description": "Inspect the metadata of a Docker image",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.image.push",
				"title": "Push",
				"description": "Push an image to a registry",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.image.remove",
				"title": "Remove Image",
				"description": "Remove a Docker image",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.image.tag",
				"title": "Tag Image",
				"description": "Tag a Docker image",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.setRegistryAsDefault",
				"title": "Set as Default Registry Path",
				"category": "Docker"
			},
			{
				"command": "vscode-docker.system.prune",
				"title": "System Prune",
				"category": "Docker",
				"icon": {
					"light": "images/light/prune.svg",
					"dark": "images/dark/prune.svg"
				}
			}
		],
		"views": {
			"dockerView": [
				{
					"id": "dockerExplorer",
					"name": "Explorer",
					"when": "config.docker.showExplorer == true"
				}
			]
		},
		"viewsContainers": {
			"activitybar": [
				{
					"icon": "images/docker.svg",
					"id": "dockerView",
					"title": "Docker"
				}
			]
		}
	},
	"engines": {
		"vscode": "^1.26.0"
	},
	"scripts": {
		"vscode:prepublish": "npm run webpack-prod",
		"build": "tsc -p ./",
		"compile": "tsc -watch -p ./",
		"package": "vsce package",
		"lint": "tslint --project tsconfig.json -t verbose",
		"lint-fix": "tslint --project tsconfig.json -t verbose --fix",
		"postinstall": "node ./node_modules/vscode/bin/install",
		"pretest": "npm run build && npm run webpack",
		"test": "gulp test",
		"all": "npm i && npm run lint && npm test",
		"webpack": "gulp webpack-dev",
		"webpack-prod": "gulp webpack-prod",
		"webpack-profile": "webpack --profile --json --mode production > webpack-stats.json && echo Use http://webpack.github.io/analyse to analyze the stats"
	},
	"extensionDependencies": [
		"vscode.docker",
		"vscode.yaml"
	],
	"devDependencies": {
		"@types/adm-zip": "^0.4.32",
		"@types/deep-equal": "^1.0.1",
		"@types/dockerode": "^2.5.12",
		"@types/fs-extra": "^5.0.5",
		"@types/glob": "5.0.35",
		"@types/keytar": "^4.4.0",
		"@types/mocha": "^5.2.6",
		"@types/node": "^11.12.0",
		"@types/request-promise-native": "^1.0.15",
		"@types/semver": "^5.5.0",
		"@types/string-replace-webpack-plugin": "^0.1.0",
		"@types/xml2js": "^0.4.3",
		"adm-zip": "^0.4.11",
		"copy-webpack-plugin": "^4.5.4",
		"gulp": "^4.0.0",
		"mocha": "^5.2.0",
		"mocha-junit-reporter": "^1.18.0",
		"mocha-multi-reporters": "^1.1.7",
		"string-replace-webpack-plugin": "^0.1.3",
		"ts-node": "^7.0.1",
		"tslint": "^5.14.0",
		"tslint-microsoft-contrib": "^6.1.0",
		"typescript": "^3.3.4000",
		"umd-compat-loader": "^2.1.1",
		"vsce": "^1.59.0",
		"vscode": "^1.1.18",
		"vscode-azureextensiondev": "^0.1.8",
		"webpack": "^4.29.6",
		"webpack-cli": "^3.3.0"
	},
	"dependencies": {
		"adal-node": "^0.1.28",
		"azure-arm-containerregistry": "^3.0.0",
		"azure-arm-resource": "^2.0.0-preview",
		"azure-arm-website": "^1.0.0-preview",
		"azure-storage": "^2.8.1",
		"clipboardy": "^1.2.3",
		"deep-equal": "^1.0.1",
		"dockerfile-language-server-nodejs": "^0.0.20",
		"dockerode": "^2.5.8",
		"fs-extra": "^6.0.1",
		"glob": "7.1.2",
		"gradle-to-js": "^1.2.1",
		"mac-ca": "^1.0.4",
		"moment": "^2.24.0",
		"ms-rest": "^2.5.0",
		"ms-rest-azure": "^2.6.0",
		"opn": "^6.0.0",
		"request": "^2.88.0",
		"request-promise-native": "^1.0.5",
		"semver": "^6.0.0",
		"tar": "^4.4.6",
		"vscode-azureextensionui": "^0.23.2",
		"vscode-languageclient": "^5.1.1",
		"win-ca": "^2.4.1",
		"xml2js": "^0.4.19"
	},
	"__metadata": {
		"id": "0479fc1c-3d67-49f9-b087-fb9069afe48f",
		"publisherId": "52b787f2-79a9-4f32-99b4-393afe3005d3",
		"publisherDisplayName": "Microsoft"
	}
}
"PeterJausovec" package.json
{
  "name": "vscode-docker",
  "version": "0.6.2",
  "preview": true,
  "publisher": "PeterJausovec",
  "displayName": "Docker",
  "description": "Adds syntax highlighting, commands, hover tips, and linting for Dockerfile and docker-compose files.",
  "license": "SEE LICENSE IN LICENSE.md",
  "icon": "images/docker_icon.png",
  "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217",
  "galleryBanner": {
    "color": "#1289B9",
    "theme": "dark"
  },
  "categories": [
    "Programming Languages",
    "Linters",
    "Azure"
  ],
  "keywords": [
    "docker",
    "compose",
    "container",
    "multi-root ready"
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/microsoft/vscode-docker"
  },
  "homepage": "https://github.com/Microsoft/vscode-docker/blob/master/README.md",
  "activationEvents": [
    "onCommand:vscode-docker.acr.createRegistry",
    "onCommand:vscode-docker.acr.deleteImage",
    "onCommand:vscode-docker.acr.deleteRegistry",
    "onCommand:vscode-docker.acr.deleteRepository",
    "onCommand:vscode-docker.acr.pullImage",
    "onCommand:vscode-docker.acr.pullRepo",
    "onCommand:vscode-docker.acr.quickBuild",
    "onCommand:vscode-docker.acr.runTask",
    "onCommand:vscode-docker.acr.runTaskFile",
    "onCommand:vscode-docker.acr.showTask",
    "onCommand:vscode-docker.acr.untagImage",
    "onCommand:vscode-docker.acr.viewLogs",
    "onCommand:vscode-docker.api.configure",
    "onCommand:vscode-docker.browseAzurePortal",
    "onCommand:vscode-docker.browseDockerHub",
    "onCommand:vscode-docker.compose.down",
    "onCommand:vscode-docker.compose.restart",
    "onCommand:vscode-docker.compose.up",
    "onCommand:vscode-docker.configure",
    "onCommand:vscode-docker.connectCustomRegistry",
    "onCommand:vscode-docker.container.open-shell",
    "onCommand:vscode-docker.container.remove",
    "onCommand:vscode-docker.container.restart",
    "onCommand:vscode-docker.container.show-logs",
    "onCommand:vscode-docker.container.start",
    "onCommand:vscode-docker.container.start.azurecli",
    "onCommand:vscode-docker.container.start.interactive",
    "onCommand:vscode-docker.container.stop",
    "onCommand:vscode-docker.createWebApp",
    "onCommand:vscode-docker.disconnectCustomRegistry",
    "onCommand:vscode-docker.dockerHubLogin",
    "onCommand:vscode-docker.dockerHubLogout",
    "onCommand:vscode-docker.explorer.refresh",
    "onCommand:vscode-docker.image.build",
    "onCommand:vscode-docker.image.inspect",
    "onCommand:vscode-docker.image.push",
    "onCommand:vscode-docker.image.remove",
    "onCommand:vscode-docker.images.selectGroupBy",
    "onCommand:vscode-docker.image.tag",
    "onCommand:vscode-docker.setRegistryAsDefault",
    "onCommand:vscode-docker.system.prune",
    "onDebugInitialConfigurations",
    "onDebugResolve:docker-coreclr",
    "onLanguage:dockerfile",
    "onLanguage:yaml",
    "onView:dockerExplorer"
  ],
  "main": "main",
  "contributes": {
    "menus": {
      "commandPalette": [
        {
          "command": "vscode-docker.api.configure",
          "when": "never"
        },
        {
          "command": "vscode-docker.browseDockerHub",
          "when": "false"
        },
        {
          "command": "vscode-docker.createWebApp",
          "when": "false"
        },
        {
          "command": "vscode-docker.setRegistryAsDefault",
          "when": "never"
        }
      ],
      "editor/context": [
        {
          "when": "editorLangId == dockerfile && isAzureAccountInstalled",
          "command": "vscode-docker.acr.quickBuild",
          "group": "docker"
        },
        {
          "when": "editorLangId == yaml",
          "command": "vscode-docker.acr.runTaskFile",
          "group": "docker"
        },
        {
          "when": "resourceFilename == docker-compose.yml",
          "command": "vscode-docker.compose.down",
          "group": "docker"
        },
        {
          "when": "resourceFilename == docker-compose.yml",
          "command": "vscode-docker.compose.restart",
          "group": "docker"
        },
        {
          "when": "resourceFilename == docker-compose.yml",
          "command": "vscode-docker.compose.up",
          "group": "docker"
        },
        {
          "when": "resourceFilename == docker-compose.debug.yml",
          "command": "vscode-docker.compose.down",
          "group": "docker"
        },
        {
          "when": "resourceFilename == docker-compose.debug.yml",
          "command": "vscode-docker.compose.restart",
          "group": "docker"
        },
        {
          "when": "resourceFilename == docker-compose.debug.yml",
          "command": "vscode-docker.compose.up",
          "group": "docker"
        },
        {
          "when": "editorLangId == dockerfile",
          "command": "vscode-docker.image.build",
          "group": "docker"
        }
      ],
      "explorer/context": [
        {
          "when": "resourceFilename =~ /(^|\\.)dockerfile$/i",
          "command": "vscode-docker.acr.quickBuild",
          "group": "docker"
        },
        {
          "when": "resourceFilename =~ /^(?:(?!^docker-compose\\.ya?ml$).)*\\.ya?ml$/i",
          "command": "vscode-docker.acr.runTaskFile",
          "group": "docker"
        },
        {
          "when": "resourceFilename =~ /docker-compose/i",
          "command": "vscode-docker.compose.down",
          "group": "docker"
        },
        {
          "when": "resourceFilename =~ /docker-compose/i",
          "command": "vscode-docker.compose.restart",
          "group": "docker"
        },
        {
          "when": "resourceFilename =~ /docker-compose/i",
          "command": "vscode-docker.compose.up",
          "group": "docker"
        },
        {
          "when": "resourceFilename =~ /dockerfile/i",
          "command": "vscode-docker.image.build",
          "group": "docker"
        }
      ],
      "view/title": [
        {
          "command": "vscode-docker.explorer.refresh",
          "when": "view == dockerExplorer",
          "group": "navigation@1"
        },
        {
          "command": "vscode-docker.system.prune",
          "when": "view == dockerExplorer",
          "group": "navigation@2"
        }
      ],
      "view/item/context": [
        {
          "command": "vscode-docker.images.selectGroupBy",
          "when": "view == dockerExplorer && viewItem =~ /^imagesRootNode$/",
          "group": "inline"
        },
        {
          "command": "vscode-docker.acr.createRegistry",
          "when": "view == dockerExplorer && viewItem == azureRegistryRootNode",
          "group": "default"
        },
        {
          "command": "vscode-docker.acr.deleteImage",
          "when": "view == dockerExplorer && viewItem == azureImageTagNode",
          "group": "default"
        },
        {
          "command": "vscode-docker.acr.deleteRegistry",
          "when": "view == dockerExplorer && viewItem == azureRegistryNode",
          "group": "default"
        },
        {
          "command": "vscode-docker.acr.deleteRepository",
          "when": "view == dockerExplorer && viewItem == azureRepositoryNode",
          "group": "default"
        },
        {
          "command": "vscode-docker.acr.pullImage",
          "when": "view == dockerExplorer && viewItem == azureImageTagNode",
          "group": "default"
        },
        {
          "command": "vscode-docker.acr.pullRepo",
          "when": "view == dockerExplorer && viewItem == azureRepositoryNode",
          "group": "default"
        },
        {
          "command": "vscode-docker.acr.runTask",
          "when": "view == dockerExplorer && viewItem == taskNode",
          "group": "default"
        },
        {
          "command": "vscode-docker.acr.showTask",
          "when": "view == dockerExplorer && viewItem == taskNode",
          "group": "default"
        },
        {
          "command": "vscode-docker.acr.untagImage",
          "when": "view == dockerExplorer && viewItem == azureImageTagNode",
          "group": "default"
        },
        {
          "command": "vscode-docker.acr.viewLogs",
          "when": "view == dockerExplorer && viewItem =~ /^(azureRegistryNode|azureImageTagNode|taskNode)$/",
          "group": "default"
        },
        {
          "command": "vscode-docker.browseDockerHub",
          "when": "view == dockerExplorer && viewItem =~ /^(dockerHubImageTagNode|dockerHubRepositoryNode|dockerHubOrgNode)$/",
          "group": "default"
        },
        {
          "command": "vscode-docker.browseAzurePortal",
          "when": "view == dockerExplorer && viewItem =~ /^(azureRegistryNode|azureRepositoryNode|azureImageTagNode)$/",
          "group": "default"
        },
        {
          "command": "vscode-docker.connectCustomRegistry",
          "when": "view == dockerExplorer && viewItem == customRootNode",
          "group": "default"
        },
        {
          "command": "vscode-docker.container.open-shell",
          "when": "view == dockerExplorer && viewItem =~ /^(runningLocalContainerNode|containersRootNode)$/",
          "group": "default"
        },
        {
          "command": "vscode-docker.container.remove",
          "when": "view == dockerExplorer && viewItem =~ /^(stoppedLocalContainerNode|runningLocalContainerNode|containersRootNode)$/",
          "group": "default"
        },
        {
          "command": "vscode-docker.container.restart",
          "when": "view == dockerExplorer && viewItem =~ /^(runningLocalContainerNode|stoppedLocalContainerNode|containersRootNode)$/",
          "group": "default"
        },
        {
          "command": "vscode-docker.container.show-logs",
          "when": "view == dockerExplorer && viewItem =~ /^(runningLocalContainerNode|stoppedLocalContainerNode|containersRootNode)$/",
          "group": "default"
        },
        {
          "command": "vscode-docker.container.start",
          "when": "view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
          "group": "5_default"
        },
        {
          "command": "vscode-docker.container.start.interactive",
          "when": "view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
          "group": "5_default"
        },
        {
          "command": "vscode-docker.container.stop",
          "when": "view == dockerExplorer && viewItem =~ /^(runningLocalContainerNode|containersRootNode)$/",
          "group": "5_default"
        },
        {
          "command": "vscode-docker.createWebApp",
          "when": "view == dockerExplorer && viewItem =~ /^(azureImageTagNode|dockerHubImageTagNode|customImageTagNode)$/",
          "group": "5_default"
        },
        {
          "command": "vscode-docker.disconnectCustomRegistry",
          "when": "view == dockerExplorer && viewItem =~ /^(customRegistryNode)$/",
          "group": "5_default"
        },
        {
          "command": "vscode-docker.dockerHubLogout",
          "when": "view == dockerExplorer && viewItem == dockerHubRootNode",
          "group": "5_default"
        },
        {
          "command": "vscode-docker.image.inspect",
          "when": "view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
          "group": "5_default"
        },
        {
          "command": "vscode-docker.image.push",
          "when": "view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
          "group": "5_default"
        },
        {
          "command": "vscode-docker.image.remove",
          "when": "view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
          "group": "5_default"
        },
        {
          "command": "vscode-docker.image.tag",
          "when": "view == dockerExplorer && viewItem =~ /^(localImageNode|imagesRootNode)$/",
          "group": "5_default"
        },
        {
          "command": "vscode-docker.setRegistryAsDefault",
          "when": "view == dockerExplorer && viewItem =~ /^(customRegistryNode|azureRegistryNode|dockerHubOrgNode)$/",
          "group": "5_default"
        }
      ]
    },
    "debuggers": [
      {
        "type": "docker",
        "label": "Docker: Node.js",
        "configurationSnippets": [
          {
            "label": "Docker: Attach to Node",
            "description": "Docker: Attach to Node",
            "body": {
              "type": "node",
              "request": "attach",
              "name": "Docker: Attach to Node",
              "remoteRoot": "/usr/src/app"
            }
          }
        ]
      },
      {
        "type": "docker-coreclr",
        "label": "Docker: Launch .NET Core (Preview)",
        "configurationSnippets": [
          {
            "label": "Docker: Launch .NET Core (Preview)",
            "description": "Docker: Launch .NET Core (Preview)",
            "body": {
              "name": "Docker: Launch .NET Core (Preview)",
              "type": "docker-coreclr",
              "request": "launch",
              "preLaunchTask": "build",
              "dockerBuild": {},
              "dockerRun": {}
            }
          }
        ],
        "configurationAttributes": {
          "launch": {
            "properties": {
              "appFolder": {
                "type": "string",
                "description": "Path to the folder for the application."
              },
              "appOutput": {
                "type": "string",
                "description": "Path to the output assembly for the application."
              },
              "appProject": {
                "type": "string",
                "description": "Path to the application project file."
              },
              "dockerBuild": {
                "description": "Options for building the Docker image used for debugging.",
                "properties": {
                  "args": {
                    "type": "object",
                    "description": "Build arguments applied to the Docker image used for debugging.",
                    "additionalProperties": {
                      "type": "string"
                    }
                  },
                  "context": {
                    "type": "string",
                    "description": "Path to the Docker build context."
                  },
                  "dockerfile": {
                    "type": "string",
                    "description": "Path to the Dockerfile used for the build."
                  },
                  "labels": {
                    "type": "object",
                    "description": "Labels applied to the Docker image used for debugging.",
                    "additionalProperties": {
                      "type": "string"
                    }
                  },
                  "tag": {
                    "type": "string",
                    "description": "Tag applied to the Docker image used for debugging."
                  },
                  "target": {
                    "type": "string",
                    "description": "Docker build target (stage) used for debugging."
                  }
                }
              },
              "dockerRun": {
                "description": "Options for running the Docker container used for debugging.",
                "properties": {
                  "containerName": {
                    "type": "string",
                    "description": "Name of the container used for debugging."
                  },
                  "env": {
                    "type": "object",
                    "description": "Environment variables applied to the Docker container used for debugging.",
                    "additionalProperties": {
                      "type": "string"
                    }
                  },
                  "envFiles": {
                    "type": "array",
                    "description": "Files of environment variables read in and applied to the Docker container used for debugging.",
                    "items": {
                      "type": "string"
                    }
                  },
                  "labels": {
                    "type": "object",
                    "description": "Labels applied to the Docker container used for debugging.",
                    "additionalProperties": {
                      "type": "string"
                    }
                  },
                  "network": {
                    "type": "string",
                    "description": "The network to which the container will be connected."
                  },
                  "networkAlias": {
                    "type": "string",
                    "description": "The network-scoped alias to assign to the container."
                  },
                  "ports": {
                    "type": "array",
                    "description": "Ports that are going to be mapped on the host.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "hostPort": {
                          "type": "string",
                          "description": "Port number to be bound on the host."
                        },
                        "containerPort": {
                          "type": "string",
                          "description": "Port number of the container to be bound."
                        },
                        "protocol": {
                          "type": "string",
                          "description": "Specific protocol for the binding (`tcp | udp`).",
                          "enum": [
                            "tcp",
                            "udp"
                          ]
                        },
                        "required": [
                          "containerPort"
                        ]
                      }
                    }
                  },
                  "extraHosts": {
                    "type": "array",
                    "description": "Hosts to be added to the container's `hosts` file for DNS resolution.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "hostname": {
                          "type": "string",
                          "description": "Hostname for dns resolution."
                        },
                        "ip": {
                          "type": "string",
                          "description": "IP associated to the hostname."
                        }
                      },
                      "required": [
                        "hostname",
                        "ip"
                      ]
                    }
                  },
                  "volumes": {
                    "type": "array",
                    "description": "Volumes that are going to be mapped to the container.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "localPath": {
                          "type": "string",
                          "description": "Path on local machine that will be mapped. The folder will be created if it does not exist."
                        },
                        "containerPath": {
                          "type": "string",
                          "description": "Path where the volume will be mapped within the container. The folder will be created if it does not exist."
                        },
                        "permissions": {
                          "type": "string",
                          "description": "Permissions for the container for the mapped volume, `rw` for read-write or `ro` for read-only.",
                          "enum": [
                            "rw",
                            "ro"
                          ]
                        }
                      },
                      "required": [
                        "localPath",
                        "containerPath"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    ],
    "languages": [
      {
        "id": "dockerfile",
        "aliases": [
          "Dockerfile"
        ],
        "filenamePatterns": [
          "*.dockerfile",
          "Dockerfile"
        ]
      },
      {
        "id": "ignore",
        "filenames": [
          ".dockerignore"
        ]
      }
    ],
    "configuration": {
      "type": "object",
      "title": "Docker configuration options",
      "properties": {
        "docker.defaultRegistryPath": {
          "type": "string",
          "default": "",
          "description": "Default registry and path when tagging an image"
        },
        "docker.showExplorer": {
          "type": "boolean",
          "default": true,
          "description": "Show or hide the Explorer"
        },
        "docker.explorerRefreshInterval": {
          "type": "number",
          "default": 1000,
          "description": "Explorer refresh interval, default is 1000ms"
        },
        "docker.groupImagesBy": {
          "type": "string",
          "default": "Repository",
          "description": "How to group items in the treeview Images node",
          "enum": [
            "None",
            "Repository",
            "RepositoryName",
            "ImageId"
          ]
        },
        "docker.imageBuildContextPath": {
          "type": "string",
          "default": "",
          "description": "Build context PATH to pass to Docker build command"
        },
        "docker.truncateLongRegistryPaths": {
          "type": "boolean",
          "default": false,
          "description": "Truncate long Image and Container registry paths in the Explorer"
        },
        "docker.truncateMaxLength": {
          "type": "number",
          "default": 10,
          "description": "Maximum number of characters for long registry paths in the Explorer, including elipsis"
        },
        "docker.host": {
          "type": "string",
          "default": "",
          "description": "Full host address to connect to (with protocol). Equivalent to setting the DOCKER_HOST environment variable"
        },
        "docker.importCertificates": {
          "oneOf": [
            {
              "type": "boolean"
            },
            {
              "type": "object",
              "properties": {
                "useCertificateStore": {
                  "type": "boolean",
                  "default": true,
                  "description": "On Mac and Windows, indicates whether to automatically import certificates from the system certificate store. Ignored on Linux."
                },
                "certificatePaths": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "default": [
                    "/etc/ssl/certs/ca-certificates",
                    "/etc/openssl/certs",
                    "/etc/pki/tls/certs",
                    "/usr/local/share/certs"
                  ],
                  "description": "Paths to files or folders containing certificates to import. For Linux, the correct path to pick up system-wide certificates will depend on the distribution."
                }
              }
            }
          ],
          "default": false,
          "description": "True causes the extension to attempt to find system-wide certificates, false indicates that the default Node.js trusted certificates list will be used. Use an object to get more fine-grained control."
        },
        "docker.languageserver.diagnostics.deprecatedMaintainer": {
          "scope": "resource",
          "type": "string",
          "default": "warning",
          "enum": [
            "ignore",
            "warning",
            "error"
          ],
          "description": "Controls the diagnostic severity for the deprecated MAINTAINER instruction"
        },
        "docker.languageserver.diagnostics.emptyContinuationLine": {
          "scope": "resource",
          "type": "string",
          "default": "warning",
          "enum": [
            "ignore",
            "warning",
            "error"
          ],
          "description": "Controls the diagnostic severity for flagging empty continuation lines found in instructions that span multiple lines"
        },
        "docker.languageserver.diagnostics.directiveCasing": {
          "scope": "resource",
          "type": "string",
          "default": "warning",
          "enum": [
            "ignore",
            "warning",
            "error"
          ],
          "description": "Controls the diagnostic severity for parser directives that are not written in lowercase"
        },
        "docker.languageserver.diagnostics.instructionCasing": {
          "scope": "resource",
          "type": "string",
          "default": "warning",
          "enum": [
            "ignore",
            "warning",
            "error"
          ],
          "description": "Controls the diagnostic severity for instructions that are not written in uppercase"
        },
        "docker.languageserver.diagnostics.instructionCmdMultiple": {
          "scope": "resource",
          "type": "string",
          "default": "warning",
          "enum": [
            "ignore",
            "warning",
            "error"
          ],
          "description": "Controls the diagnostic severity for flagging a Dockerfile with multiple CMD instructions"
        },
        "docker.languageserver.diagnostics.instructionEntrypointMultiple": {
          "scope": "resource",
          "type": "string",
          "default": "warning",
          "enum": [
            "ignore",
            "warning",
            "error"
          ],
          "description": "Controls the diagnostic severity for flagging a Dockerfile with multiple ENTRYPOINT instructions"
        },
        "docker.languageserver.diagnostics.instructionHealthcheckMultiple": {
          "scope": "resource",
          "type": "string",
          "default": "warning",
          "enum": [
            "ignore",
            "warning",
            "error"
          ],
          "description": "Controls the diagnostic severity for flagging a Dockerfile with multiple HEALTHCHECK instructions"
        },
        "docker.languageserver.diagnostics.instructionJSONInSingleQuotes": {
          "scope": "resource",
          "type": "string",
          "default": "warning",
          "enum": [
            "ignore",
            "warning",
            "error"
          ],
          "description": "Controls the diagnostic severity for JSON instructions that are written incorrectly with single quotes"
        },
        "docker.languageserver.diagnostics.instructionWorkdirRelative": {
          "scope": "resource",
          "type": "string",
          "default": "warning",
          "enum": [
            "ignore",
            "warning",
            "error"
          ],
          "description": "Controls the diagnostic severity for WORKDIR instructions that do not point to an absolute path"
        },
        "docker.attachShellCommand.linuxContainer": {
          "type": "string",
          "default": "/bin/sh -c \"[ -e /bin/bash ] && /bin/bash || /bin/sh\"",
          "description": "Attach command to use for Linux containers"
        },
        "docker.attachShellCommand.windowsContainer": {
          "type": "string",
          "default": "powershell",
          "description": "Attach command to use for Windows containers"
        },
        "docker.promptOnSystemPrune": {
          "type": "boolean",
          "default": true,
          "description": "Prompt for confirmation when running System Prune command"
        },
        "docker.dockerComposeBuild": {
          "type": "boolean",
          "default": true,
          "description": "Run docker-compose with the --build argument, defaults to true"
        },
        "docker.dockerComposeDetached": {
          "type": "boolean",
          "default": true,
          "description": "Run docker-compose with the --d (detached) argument, defaults to true"
        }
      }
    },
    "commands": [
      {
        "command": "vscode-docker.images.selectGroupBy",
        "title": "Group Images By...",
        "icon": {
          "light": "images/SortingGrouping_16x.svg",
          "dark": "images/SortingGrouping_16x.svg"
        },
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.createRegistry",
        "title": "Create Azure Registry",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.deleteImage",
        "title": "Delete Azure Image",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.deleteRegistry",
        "title": "Delete Azure Registry",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.deleteRepository",
        "title": "Delete Azure Repository",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.pullImage",
        "title": "Pull Tag from Azure",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.pullRepo",
        "title": "Pull Repository from Azure",
        "description": "Pull all Image tags from an Azure Repository",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.quickBuild",
        "title": "ACR Tasks: Build Image",
        "description": "Queue an Azure build from a Dockerfile",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.runTask",
        "title": "Run Task",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.runTaskFile",
        "title": "Run ACR Task File",
        "description": "Run an ACR task from a yaml file.",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.showTask",
        "title": "Show Task Properties",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.untagImage",
        "title": "Untag Azure Image",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.acr.viewLogs",
        "title": "View Task Logs",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.api.configure",
        "title": "Add Docker Files to Workspace (API)"
      },
      {
        "command": "vscode-docker.browseDockerHub",
        "title": "Browse in Docker Hub",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.browseAzurePortal",
        "title": "Browse in the Azure Portal",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.compose.down",
        "title": "Compose Down",
        "description": "Stops a composition of containers",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.compose.restart",
        "title": "Compose Restart",
        "description": "Restarts a composition of containers",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.compose.up",
        "title": "Compose Up",
        "description": "Starts a composition of containers",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.configure",
        "title": "Add Docker Files to Workspace",
        "description": "Add Dockerfile, docker-compose.yml files",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.connectCustomRegistry",
        "title": "Connect to a Private Registry... (Preview)",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.container.open-shell",
        "title": "Attach Shell",
        "description": "Open a terminal with an interactive shell for a running container",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.container.remove",
        "title": "Remove Container",
        "description": "Remove a stopped container",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.container.restart",
        "title": "Restart Container",
        "description": "Restart one or more containers",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.container.show-logs",
        "title": "Show Logs",
        "description": "Show the logs of a running container",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.container.start",
        "title": "Run",
        "description": "Starts a container from an image",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.container.start.azurecli",
        "title": "Azure CLI",
        "description": "Starts a container from the Azure CLI image and runs it interactively",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.container.start.interactive",
        "title": "Run Interactive",
        "description": "Starts a container from an image and runs it interactively",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.container.stop",
        "title": "Stop Container",
        "description": "Stop a running container",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.createWebApp",
        "title": "Deploy Image to Azure App Service",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.disconnectCustomRegistry",
        "title": "Disconnect from Private Registry",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.dockerHubLogin",
        "title": "Log In to Docker Hub",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.dockerHubLogout",
        "title": "Log Out of Docker Hub",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.explorer.refresh",
        "title": "Refresh Explorer",
        "category": "Docker",
        "icon": {
          "light": "images/light/refresh.svg",
          "dark": "images/dark/refresh.svg"
        }
      },
      {
        "command": "vscode-docker.image.build",
        "title": "Build Image",
        "description": "Build a Docker image from a Dockerfile",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.image.inspect",
        "title": "Inspect Image",
        "description": "Inspect the metadata of a Docker image",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.image.push",
        "title": "Push",
        "description": "Push an image to a registry",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.image.remove",
        "title": "Remove Image",
        "description": "Remove a Docker image",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.image.tag",
        "title": "Tag Image",
        "description": "Tag a Docker image",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.setRegistryAsDefault",
        "title": "Set as Default Registry Path",
        "category": "Docker"
      },
      {
        "command": "vscode-docker.system.prune",
        "title": "System Prune",
        "category": "Docker",
        "icon": {
          "light": "images/light/prune.svg",
          "dark": "images/dark/prune.svg"
        }
      }
    ],
    "views": {
      "dockerView": [
        {
          "id": "dockerExplorer",
          "name": "Explorer",
          "when": "config.docker.showExplorer == true"
        }
      ]
    },
    "viewsContainers": {
      "activitybar": [
        {
          "icon": "images/docker.svg",
          "id": "dockerView",
          "title": "Docker"
        }
      ]
    }
  },
  "engines": {
    "vscode": "^1.26.0"
  },
  "scripts": {
    "vscode:prepublish": "npm run webpack-prod",
    "build": "tsc -p ./",
    "compile": "tsc -watch -p ./",
    "package": "vsce package",
    "lint": "tslint --project tsconfig.json -t verbose",
    "lint-fix": "tslint --project tsconfig.json -t verbose --fix",
    "postinstall": "node ./node_modules/vscode/bin/install",
    "pretest": "npm run build && npm run webpack",
    "test": "gulp test",
    "all": "npm i && npm run lint && npm test",
    "webpack": "gulp webpack-dev",
    "webpack-prod": "gulp webpack-prod",
    "webpack-profile": "webpack --profile --json --mode production > webpack-stats.json && echo Use http://webpack.github.io/analyse to analyze the stats"
  },
  "extensionDependencies": [
    "vscode.docker",
    "vscode.yaml"
  ],
  "devDependencies": {
    "@types/adm-zip": "^0.4.32",
    "@types/deep-equal": "^1.0.1",
    "@types/dockerode": "^2.5.12",
    "@types/fs-extra": "^5.0.5",
    "@types/glob": "5.0.35",
    "@types/keytar": "^4.4.0",
    "@types/mocha": "^5.2.6",
    "@types/node": "^11.12.0",
    "@types/request-promise-native": "^1.0.15",
    "@types/semver": "^5.5.0",
    "@types/string-replace-webpack-plugin": "^0.1.0",
    "@types/xml2js": "^0.4.3",
    "adm-zip": "^0.4.11",
    "copy-webpack-plugin": "^4.5.4",
    "gulp": "^4.0.0",
    "mocha": "^5.2.0",
    "mocha-junit-reporter": "^1.18.0",
    "mocha-multi-reporters": "^1.1.7",
    "string-replace-webpack-plugin": "^0.1.3",
    "ts-node": "^7.0.1",
    "tslint": "^5.14.0",
    "tslint-microsoft-contrib": "^6.1.0",
    "typescript": "^3.3.4000",
    "umd-compat-loader": "^2.1.1",
    "vsce": "^1.59.0",
    "vscode": "^1.1.18",
    "vscode-azureextensiondev": "^0.1.8",
    "webpack": "^4.29.6",
    "webpack-cli": "^3.3.0"
  },
  "dependencies": {
    "adal-node": "^0.1.28",
    "azure-arm-containerregistry": "^3.0.0",
    "azure-arm-resource": "^2.0.0-preview",
    "azure-arm-website": "^1.0.0-preview",
    "azure-storage": "^2.8.1",
    "clipboardy": "^1.2.3",
    "deep-equal": "^1.0.1",
    "dockerfile-language-server-nodejs": "^0.0.20",
    "dockerode": "^2.5.8",
    "fs-extra": "^6.0.1",
    "glob": "7.1.2",
    "gradle-to-js": "^1.2.1",
    "mac-ca": "^1.0.4",
    "moment": "^2.24.0",
    "ms-rest": "^2.5.0",
    "ms-rest-azure": "^2.6.0",
    "opn": "^6.0.0",
    "request": "^2.88.0",
    "request-promise-native": "^1.0.5",
    "semver": "^6.0.0",
    "tar": "^4.4.6",
    "vscode-azureextensionui": "^0.23.2",
    "vscode-languageclient": "^5.1.1",
    "win-ca": "^2.4.1",
    "xml2js": "^0.4.19"
  }
}

The old one does not seem to have the metadata property set. I wasn't sure if installing from a vsix was the problem, so I tried the same exact steps with an old version of the azure storage extension, and it did have "metadata" set and it did update automatically.

As I side note, I tried to install the old version directly from VS Code (instead of from a vsix), but no luck.
Screen Shot 2019-06-27 at 8 37 47 AM
Screen Shot 2019-06-27 at 8 34 37 AM
Screen Shot 2019-06-27 at 8 34 22 AM

@sandy081 sandy081 added bug Issue identified by VS Code Team member as probable bug important Issue identified as high-priority and removed info-needed Issue requires more information from poster labels Jun 27, 2019
@sandy081 sandy081 added this to the June 2019 milestone Jun 27, 2019
@sandy081
Copy link
Member

@EricJizbaMSFT Thanks for the info.

It is too late testing with old VSIX because

  • It has old id and we cannot synchronise this with Marketplace and hence it will miss the metadata property.

The trick I use to mimic rename scenario is as follows:

  • Install the new renamed extension
  • Go to Extensions folder and open package.json and update publisher id to different value and version to old version.
  • Make sure .obsolete file in the extensions folder does not has the entry to which you updated
  • Open VS Code and you will see an update to the new version with new id.
  • Run the update and make sure everything works as expected.

OR

  • If you have the old VSIX, install the VSIX and copy the metadata into the package.json from new extension.

When I followed above steps I could reproduce the reported issue that

  • old and new extension are running together immediately after updating the extension

This is regression because of the feature no reload of extension after install. Our extension host is treating these two extensions as different extensions when updated. This happens only during no reload case and once window is reloaded extensions are distinguished correctly. So workaround is to reload the window.

I am working on the fix which will be available in insiders tomorrow and in stable next week.

@sandy081
Copy link
Member

Filed separate issue for Install Previous version action error - #76253

@ejizba
Copy link
Member

ejizba commented Jun 27, 2019

@sandy081 We saw a bunch of issues, but didn't realize it only happened in the "no reload" case. I took a closer look at telemetry and it backs up your claim as well - thanks for all your help!

@sandy081
Copy link
Member

To Verify:

  1. Install the new docker extension
  2. Go to Extensions folder and open its package.json and update publisher id to different value and version to old version.
  3. Make sure .obsolete file in the extensions folder does not has the entry to which you changed
  4. Open VS Code and you should see an update badge on extensions viewlet
  5. Installed Docker extension should show an update
  6. Update the extension and you should see a reload button. Do not click on reload yet.
  7. Open Docker viewlet and check there are no errors shown like duplicate command registrations.
  8. Open Running Extensions view and make sure only one docker extension is running
  9. Reload the window and make sure there are no more updates and the extension is see in the installed extensions view
  10. Make sure Docker viewlet opens without any issues and Running Extensions view show only one Docker extension.

@aeschli aeschli added the verified Verification succeeded label Jun 28, 2019
@vscodebot vscodebot bot locked and limited conversation to collaborators Aug 11, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bug Issue identified by VS Code Team member as probable bug extensions Issues concerning extensions important Issue identified as high-priority verified Verification succeeded
Projects
None yet
Development

No branches or pull requests

5 participants