提交 b85b46af 编写于 作者: C Christof Marti

Match SSH connection string without username (fixes #16680)

上级 aba60c3d
......@@ -16,8 +16,8 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace
import { IOptions } from 'vs/workbench/common/options';
const SshProtocolMatcher = /^[^:]+@([^:]+):/;
const SecondLevelDomainMatcher = /[^.]+\.[^.]+$/;
const SshProtocolMatcher = /^([^@:]+@)?([^:]+):/;
const SecondLevelDomainMatcher = /[^@.]+\.[^.]+$/;
const RemoteMatcher = /^\s*url\s*=\s*(.+\S)\s*$/mg;
type Tags = { [index: string]: boolean | number };
......@@ -146,9 +146,11 @@ export class WorkspaceStats {
}
private extractDomain(url: string): string {
let match = url.match(SshProtocolMatcher);
if (match) {
return this.stripLowLevelDomains(match[1]);
if (url.indexOf('://') === -1) {
let match = url.match(SshProtocolMatcher);
if (match) {
return this.stripLowLevelDomains(match[2]);
}
}
try {
let uri = URI.parse(url);
......@@ -161,7 +163,10 @@ export class WorkspaceStats {
return null;
}
private getDomainsOfRemotes(text): string[] {
/**
* Public for testing.
*/
public getDomainsOfRemotes(text): string[] {
let domains = new ArraySet<string>(), match;
while (match = RemoteMatcher.exec(text)) {
let domain = this.extractDomain(match[1]);
......
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as assert from 'assert';
import { WorkspaceStats } from 'vs/workbench/services/telemetry/common/workspaceStats';
suite('Telemetry - WorkspaceStats', () => {
test('HTTPS remotes', function () {
const stats = new WorkspaceStats(null, null, null);
assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('https://github.com/Microsoft/vscode.git')), ['github.com']);
assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('https://git.example.com/gitproject.git')), ['example.com']);
assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('https://username@github.com/username/repository.git')), ['github.com']);
assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('https://username:password@github.com/username/repository.git')), ['github.com']);
});
test('SSH remotes', function () {
const stats = new WorkspaceStats(null, null, null);
assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('ssh://user@git.server.org/project.git')), ['server.org']);
});
test('SCP-like remotes', function () {
const stats = new WorkspaceStats(null, null, null);
assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('git@github.com:Microsoft/vscode.git')), ['github.com']);
assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('user@git.server.org:project.git')), ['server.org']);
assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('git.server.org:project.git')), ['server.org']);
});
test('Local remotes', function () {
const stats = new WorkspaceStats(null, null, null);
assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('/opt/git/project.git')), []);
assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('file:///opt/git/project.git')), []);
});
function remote(url: string): string {
return `[remote "origin"]
url = ${url}
fetch = +refs/heads/*:refs/remotes/origin/*
`;
}
});
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册