Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
52cc4e6a
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
52cc4e6a
编写于
12月 09, 2020
作者:
S
Sandeep Somavarapu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
#108793 check casing and use proper extUri
上级
8b9b8df0
变更
6
显示空白变更内容
内联
并排
Showing
6 changed file
with
59 addition
and
52 deletion
+59
-52
src/vs/platform/configuration/common/configurationModels.ts
src/vs/platform/configuration/common/configurationModels.ts
+3
-2
src/vs/platform/configuration/common/configurationService.ts
src/vs/platform/configuration/common/configurationService.ts
+2
-1
src/vs/workbench/api/common/extHostWorkspace.ts
src/vs/workbench/api/common/extHostWorkspace.ts
+18
-18
src/vs/workbench/services/configuration/browser/configuration.ts
...workbench/services/configuration/browser/configuration.ts
+24
-19
src/vs/workbench/services/configuration/browser/configurationService.ts
...ch/services/configuration/browser/configurationService.ts
+6
-7
src/vs/workbench/services/configuration/common/configurationEditingService.ts
...vices/configuration/common/configurationEditingService.ts
+6
-5
未找到文件。
src/vs/platform/configuration/common/configurationModels.ts
浏览文件 @
52cc4e6a
...
...
@@ -16,7 +16,7 @@ import { Registry } from 'vs/platform/registry/common/platform';
import
{
Disposable
}
from
'
vs/base/common/lifecycle
'
;
import
{
Emitter
,
Event
}
from
'
vs/base/common/event
'
;
import
{
IFileService
}
from
'
vs/platform/files/common/files
'
;
import
{
dirname
}
from
'
vs/base/common/resources
'
;
import
{
IExtUri
}
from
'
vs/base/common/resources
'
;
export
class
ConfigurationModel
implements
IConfigurationModel
{
...
...
@@ -348,11 +348,12 @@ export class UserSettings extends Disposable {
constructor
(
private
readonly
userSettingsResource
:
URI
,
private
readonly
scopes
:
ConfigurationScope
[]
|
undefined
,
extUri
:
IExtUri
,
private
readonly
fileService
:
IFileService
)
{
super
();
this
.
parser
=
new
ConfigurationModelParser
(
this
.
userSettingsResource
.
toString
(),
this
.
scopes
);
this
.
_register
(
this
.
fileService
.
watch
(
dirname
(
this
.
userSettingsResource
)));
this
.
_register
(
this
.
fileService
.
watch
(
extUri
.
dirname
(
this
.
userSettingsResource
)));
this
.
_register
(
Event
.
filter
(
this
.
fileService
.
onDidFilesChange
,
e
=>
e
.
contains
(
this
.
userSettingsResource
))(()
=>
this
.
_onDidChange
.
fire
()));
}
...
...
src/vs/platform/configuration/common/configurationService.ts
浏览文件 @
52cc4e6a
...
...
@@ -12,6 +12,7 @@ import { Event, Emitter } from 'vs/base/common/event';
import
{
URI
}
from
'
vs/base/common/uri
'
;
import
{
IFileService
}
from
'
vs/platform/files/common/files
'
;
import
{
RunOnceScheduler
}
from
'
vs/base/common/async
'
;
import
{
extUriBiasedIgnorePathCase
}
from
'
vs/base/common/resources
'
;
export
class
ConfigurationService
extends
Disposable
implements
IConfigurationService
,
IDisposable
{
...
...
@@ -29,7 +30,7 @@ export class ConfigurationService extends Disposable implements IConfigurationSe
fileService
:
IFileService
)
{
super
();
this
.
userConfiguration
=
this
.
_register
(
new
UserSettings
(
this
.
settingsResource
,
undefined
,
fileService
));
this
.
userConfiguration
=
this
.
_register
(
new
UserSettings
(
this
.
settingsResource
,
undefined
,
extUriBiasedIgnorePathCase
,
fileService
));
this
.
configuration
=
new
Configuration
(
new
DefaultConfigurationModel
(),
new
ConfigurationModel
());
this
.
reloadConfigurationScheduler
=
this
.
_register
(
new
RunOnceScheduler
(()
=>
this
.
reloadConfiguration
(),
50
));
...
...
src/vs/workbench/api/common/extHostWorkspace.ts
浏览文件 @
52cc4e6a
...
...
@@ -10,7 +10,7 @@ import { Emitter, Event } from 'vs/base/common/event';
import
{
TernarySearchTree
}
from
'
vs/base/common/map
'
;
import
{
Schemas
}
from
'
vs/base/common/network
'
;
import
{
Counter
}
from
'
vs/base/common/numbers
'
;
import
{
basename
,
basenameOrAuthority
,
dirname
,
isEqual
,
relativePath
}
from
'
vs/base/common/resources
'
;
import
{
basename
,
basenameOrAuthority
,
dirname
,
ExtUri
,
relativePath
}
from
'
vs/base/common/resources
'
;
import
{
compare
}
from
'
vs/base/common/strings
'
;
import
{
withUndefinedAsNull
}
from
'
vs/base/common/types
'
;
import
{
URI
}
from
'
vs/base/common/uri
'
;
...
...
@@ -37,27 +37,27 @@ export interface IExtHostWorkspaceProvider {
resolveProxy
(
url
:
string
):
Promise
<
string
|
undefined
>
;
}
function
isFolderEqual
(
folderA
:
URI
,
folderB
:
URI
):
boolean
{
return
isEqual
(
folderA
,
folderB
);
function
isFolderEqual
(
folderA
:
URI
,
folderB
:
URI
,
extHostFileSystemInfo
:
IExtHostFileSystemInfo
):
boolean
{
return
new
ExtUri
(
uri
=>
ignorePathCasing
(
uri
,
extHostFileSystemInfo
)).
isEqual
(
folderA
,
folderB
);
}
function
compareWorkspaceFolderByUri
(
a
:
vscode
.
WorkspaceFolder
,
b
:
vscode
.
WorkspaceFolder
):
number
{
return
isFolderEqual
(
a
.
uri
,
b
.
uri
)
?
0
:
compare
(
a
.
uri
.
toString
(),
b
.
uri
.
toString
());
function
compareWorkspaceFolderByUri
(
a
:
vscode
.
WorkspaceFolder
,
b
:
vscode
.
WorkspaceFolder
,
extHostFileSystemInfo
:
IExtHostFileSystemInfo
):
number
{
return
isFolderEqual
(
a
.
uri
,
b
.
uri
,
extHostFileSystemInfo
)
?
0
:
compare
(
a
.
uri
.
toString
(),
b
.
uri
.
toString
());
}
function
compareWorkspaceFolderByUriAndNameAndIndex
(
a
:
vscode
.
WorkspaceFolder
,
b
:
vscode
.
WorkspaceFolder
):
number
{
function
compareWorkspaceFolderByUriAndNameAndIndex
(
a
:
vscode
.
WorkspaceFolder
,
b
:
vscode
.
WorkspaceFolder
,
extHostFileSystemInfo
:
IExtHostFileSystemInfo
):
number
{
if
(
a
.
index
!==
b
.
index
)
{
return
a
.
index
<
b
.
index
?
-
1
:
1
;
}
return
isFolderEqual
(
a
.
uri
,
b
.
uri
)
?
compare
(
a
.
name
,
b
.
name
)
:
compare
(
a
.
uri
.
toString
(),
b
.
uri
.
toString
());
return
isFolderEqual
(
a
.
uri
,
b
.
uri
,
extHostFileSystemInfo
)
?
compare
(
a
.
name
,
b
.
name
)
:
compare
(
a
.
uri
.
toString
(),
b
.
uri
.
toString
());
}
function
delta
(
oldFolders
:
vscode
.
WorkspaceFolder
[],
newFolders
:
vscode
.
WorkspaceFolder
[],
compare
:
(
a
:
vscode
.
WorkspaceFolder
,
b
:
vscode
.
WorkspaceFolder
)
=>
number
):
{
removed
:
vscode
.
WorkspaceFolder
[],
added
:
vscode
.
WorkspaceFolder
[]
}
{
const
oldSortedFolders
=
oldFolders
.
slice
(
0
).
sort
(
compare
);
const
newSortedFolders
=
newFolders
.
slice
(
0
).
sort
(
compare
);
function
delta
(
oldFolders
:
vscode
.
WorkspaceFolder
[],
newFolders
:
vscode
.
WorkspaceFolder
[],
compare
:
(
a
:
vscode
.
WorkspaceFolder
,
b
:
vscode
.
WorkspaceFolder
,
extHostFileSystemInfo
:
IExtHostFileSystemInfo
)
=>
number
,
extHostFileSystemInfo
:
IExtHostFileSystemInfo
):
{
removed
:
vscode
.
WorkspaceFolder
[],
added
:
vscode
.
WorkspaceFolder
[]
}
{
const
oldSortedFolders
=
oldFolders
.
slice
(
0
).
sort
(
(
a
,
b
)
=>
compare
(
a
,
b
,
extHostFileSystemInfo
)
);
const
newSortedFolders
=
newFolders
.
slice
(
0
).
sort
(
(
a
,
b
)
=>
compare
(
a
,
b
,
extHostFileSystemInfo
)
);
return
arrayDelta
(
oldSortedFolders
,
newSortedFolders
,
compare
);
return
arrayDelta
(
oldSortedFolders
,
newSortedFolders
,
(
a
,
b
)
=>
compare
(
a
,
b
,
extHostFileSystemInfo
)
);
}
function
ignorePathCasing
(
uri
:
URI
,
extHostFileSystemInfo
:
IExtHostFileSystemInfo
):
boolean
{
...
...
@@ -87,7 +87,7 @@ class ExtHostWorkspaceImpl extends Workspace {
if
(
previousConfirmedWorkspace
)
{
folders
.
forEach
((
folderData
,
index
)
=>
{
const
folderUri
=
URI
.
revive
(
folderData
.
uri
);
const
existingFolder
=
ExtHostWorkspaceImpl
.
_findFolder
(
previousUnconfirmedWorkspace
||
previousConfirmedWorkspace
,
folderUri
);
const
existingFolder
=
ExtHostWorkspaceImpl
.
_findFolder
(
previousUnconfirmedWorkspace
||
previousConfirmedWorkspace
,
folderUri
,
extHostFileSystemInfo
);
if
(
existingFolder
)
{
existingFolder
.
name
=
folderData
.
name
;
...
...
@@ -106,15 +106,15 @@ class ExtHostWorkspaceImpl extends Workspace {
newWorkspaceFolders
.
sort
((
f1
,
f2
)
=>
f1
.
index
<
f2
.
index
?
-
1
:
1
);
const
workspace
=
new
ExtHostWorkspaceImpl
(
id
,
name
,
newWorkspaceFolders
,
configuration
?
URI
.
revive
(
configuration
)
:
null
,
!!
isUntitled
,
uri
=>
ignorePathCasing
(
uri
,
extHostFileSystemInfo
));
const
{
added
,
removed
}
=
delta
(
oldWorkspace
?
oldWorkspace
.
workspaceFolders
:
[],
workspace
.
workspaceFolders
,
compareWorkspaceFolderByUri
);
const
{
added
,
removed
}
=
delta
(
oldWorkspace
?
oldWorkspace
.
workspaceFolders
:
[],
workspace
.
workspaceFolders
,
compareWorkspaceFolderByUri
,
extHostFileSystemInfo
);
return
{
workspace
,
added
,
removed
};
}
private
static
_findFolder
(
workspace
:
ExtHostWorkspaceImpl
,
folderUriToFind
:
URI
):
MutableWorkspaceFolder
|
undefined
{
private
static
_findFolder
(
workspace
:
ExtHostWorkspaceImpl
,
folderUriToFind
:
URI
,
extHostFileSystemInfo
:
IExtHostFileSystemInfo
):
MutableWorkspaceFolder
|
undefined
{
for
(
let
i
=
0
;
i
<
workspace
.
folders
.
length
;
i
++
)
{
const
folder
=
workspace
.
workspaceFolders
[
i
];
if
(
isFolderEqual
(
folder
.
uri
,
folderUriToFind
))
{
if
(
isFolderEqual
(
folder
.
uri
,
folderUriToFind
,
extHostFileSystemInfo
))
{
return
folder
;
}
}
...
...
@@ -254,7 +254,7 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac
const
validatedDistinctWorkspaceFoldersToAdd
:
{
uri
:
vscode
.
Uri
,
name
?:
string
}[]
=
[];
if
(
Array
.
isArray
(
workspaceFoldersToAdd
))
{
workspaceFoldersToAdd
.
forEach
(
folderToAdd
=>
{
if
(
URI
.
isUri
(
folderToAdd
.
uri
)
&&
!
validatedDistinctWorkspaceFoldersToAdd
.
some
(
f
=>
isFolderEqual
(
f
.
uri
,
folderToAdd
.
uri
)))
{
if
(
URI
.
isUri
(
folderToAdd
.
uri
)
&&
!
validatedDistinctWorkspaceFoldersToAdd
.
some
(
f
=>
isFolderEqual
(
f
.
uri
,
folderToAdd
.
uri
,
this
.
_extHostFileSystemInfo
)))
{
validatedDistinctWorkspaceFoldersToAdd
.
push
({
uri
:
folderToAdd
.
uri
,
name
:
folderToAdd
.
name
||
basenameOrAuthority
(
folderToAdd
.
uri
)
});
}
});
...
...
@@ -283,13 +283,13 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac
for
(
let
i
=
0
;
i
<
newWorkspaceFolders
.
length
;
i
++
)
{
const
folder
=
newWorkspaceFolders
[
i
];
if
(
newWorkspaceFolders
.
some
((
otherFolder
,
index
)
=>
index
!==
i
&&
isFolderEqual
(
folder
.
uri
,
otherFolder
.
uri
)))
{
if
(
newWorkspaceFolders
.
some
((
otherFolder
,
index
)
=>
index
!==
i
&&
isFolderEqual
(
folder
.
uri
,
otherFolder
.
uri
,
this
.
_extHostFileSystemInfo
)))
{
return
false
;
// cannot add the same folder multiple times
}
}
newWorkspaceFolders
.
forEach
((
f
,
index
)
=>
f
.
index
=
index
);
// fix index
const
{
added
,
removed
}
=
delta
(
currentWorkspaceFolders
,
newWorkspaceFolders
,
compareWorkspaceFolderByUriAndNameAndIndex
);
const
{
added
,
removed
}
=
delta
(
currentWorkspaceFolders
,
newWorkspaceFolders
,
compareWorkspaceFolderByUriAndNameAndIndex
,
this
.
_extHostFileSystemInfo
);
if
(
added
.
length
===
0
&&
removed
.
length
===
0
)
{
return
false
;
// nothing actually changed
}
...
...
src/vs/workbench/services/configuration/browser/configuration.ts
浏览文件 @
52cc4e6a
...
...
@@ -4,7 +4,6 @@
*--------------------------------------------------------------------------------------------*/
import
{
URI
}
from
'
vs/base/common/uri
'
;
import
*
as
resources
from
'
vs/base/common/resources
'
;
import
{
Event
,
Emitter
}
from
'
vs/base/common/event
'
;
import
*
as
errors
from
'
vs/base/common/errors
'
;
import
{
Disposable
,
IDisposable
,
dispose
,
toDisposable
,
MutableDisposable
,
combinedDisposable
}
from
'
vs/base/common/lifecycle
'
;
...
...
@@ -22,6 +21,7 @@ import { equals } from 'vs/base/common/objects';
import
{
IConfigurationModel
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
IRemoteAgentService
}
from
'
vs/workbench/services/remote/common/remoteAgentService
'
;
import
{
hash
}
from
'
vs/base/common/hash
'
;
import
{
IUriIdentityService
}
from
'
vs/workbench/services/uriIdentity/common/uriIdentity
'
;
export
class
UserConfiguration
extends
Disposable
{
...
...
@@ -36,10 +36,11 @@ export class UserConfiguration extends Disposable {
constructor
(
private
readonly
userSettingsResource
:
URI
,
private
readonly
scopes
:
ConfigurationScope
[]
|
undefined
,
private
readonly
fileService
:
IFileService
private
readonly
fileService
:
IFileService
,
private
readonly
uriIdentityService
:
IUriIdentityService
,
)
{
super
();
this
.
userConfiguration
.
value
=
new
UserSettings
(
this
.
userSettingsResource
,
this
.
scopes
,
this
.
fileService
);
this
.
userConfiguration
.
value
=
new
UserSettings
(
this
.
userSettingsResource
,
this
.
scopes
,
uriIdentityService
.
extUri
,
this
.
fileService
);
this
.
_register
(
this
.
userConfiguration
.
value
.
onDidChange
(()
=>
this
.
reloadConfigurationScheduler
.
schedule
()));
this
.
reloadConfigurationScheduler
=
this
.
_register
(
new
RunOnceScheduler
(()
=>
this
.
reload
().
then
(
configurationModel
=>
this
.
_onDidChangeConfiguration
.
fire
(
configurationModel
)),
50
));
}
...
...
@@ -53,9 +54,9 @@ export class UserConfiguration extends Disposable {
return
this
.
userConfiguration
.
value
!
.
loadConfiguration
();
}
const
folder
=
resources
.
dirname
(
this
.
userSettingsResource
);
const
standAloneConfigurationResources
:
[
string
,
URI
][]
=
[
TASKS_CONFIGURATION_KEY
].
map
(
name
=>
([
name
,
resources
.
joinPath
(
folder
,
`
${
name
}
.json`
)]));
const
fileServiceBasedConfiguration
=
new
FileServiceBasedConfiguration
(
folder
.
toString
(),
[
this
.
userSettingsResource
],
standAloneConfigurationResources
,
this
.
scopes
,
this
.
fileService
);
const
folder
=
this
.
uriIdentityService
.
extUri
.
dirname
(
this
.
userSettingsResource
);
const
standAloneConfigurationResources
:
[
string
,
URI
][]
=
[
TASKS_CONFIGURATION_KEY
].
map
(
name
=>
([
name
,
this
.
uriIdentityService
.
extUri
.
joinPath
(
folder
,
`
${
name
}
.json`
)]));
const
fileServiceBasedConfiguration
=
new
FileServiceBasedConfiguration
(
folder
.
toString
(),
[
this
.
userSettingsResource
],
standAloneConfigurationResources
,
this
.
scopes
,
this
.
fileService
,
this
.
uriIdentityService
);
const
configurationModel
=
await
fileServiceBasedConfiguration
.
loadConfiguration
();
this
.
userConfiguration
.
value
=
fileServiceBasedConfiguration
;
...
...
@@ -88,11 +89,12 @@ class FileServiceBasedConfiguration extends Disposable {
private
readonly
settingsResources
:
URI
[],
private
readonly
standAloneConfigurationResources
:
[
string
,
URI
][],
private
readonly
scopes
:
ConfigurationScope
[]
|
undefined
,
private
fileService
:
IFileService
private
fileService
:
IFileService
,
private
uriIdentityService
:
IUriIdentityService
)
{
super
();
this
.
allResources
=
[...
this
.
settingsResources
,
...
this
.
standAloneConfigurationResources
.
map
(([,
resource
])
=>
resource
)];
this
.
_register
(
combinedDisposable
(...
this
.
allResources
.
map
(
resource
=>
this
.
fileService
.
watch
(
resources
.
dirname
(
resource
)))));
this
.
_register
(
combinedDisposable
(...
this
.
allResources
.
map
(
resource
=>
this
.
fileService
.
watch
(
uriIdentityService
.
extUri
.
dirname
(
resource
)))));
this
.
_folderSettingsModelParser
=
new
ConfigurationModelParser
(
name
,
this
.
scopes
);
this
.
_standAloneConfigurations
=
[];
this
.
_cache
=
new
ConfigurationModel
();
...
...
@@ -165,7 +167,7 @@ class FileServiceBasedConfiguration extends Disposable {
return
true
;
}
// One of the resource's parent got deleted
if
(
this
.
allResources
.
some
(
resource
=>
event
.
contains
(
resources
.
dirname
(
resource
),
FileChangeType
.
DELETED
)))
{
if
(
this
.
allResources
.
some
(
resource
=>
event
.
contains
(
this
.
uriIdentityService
.
extUri
.
dirname
(
resource
),
FileChangeType
.
DELETED
)))
{
return
true
;
}
return
false
;
...
...
@@ -194,6 +196,7 @@ export class RemoteUserConfiguration extends Disposable {
remoteAuthority
:
string
,
configurationCache
:
IConfigurationCache
,
fileService
:
IFileService
,
uriIdentityService
:
IUriIdentityService
,
remoteAgentService
:
IRemoteAgentService
)
{
super
();
...
...
@@ -201,7 +204,7 @@ export class RemoteUserConfiguration extends Disposable {
this
.
_userConfiguration
=
this
.
_cachedConfiguration
=
new
CachedRemoteUserConfiguration
(
remoteAuthority
,
configurationCache
);
remoteAgentService
.
getEnvironment
().
then
(
async
environment
=>
{
if
(
environment
)
{
const
userConfiguration
=
this
.
_register
(
new
FileServiceBasedRemoteUserConfiguration
(
environment
.
settingsPath
,
REMOTE_MACHINE_SCOPES
,
this
.
_fileService
));
const
userConfiguration
=
this
.
_register
(
new
FileServiceBasedRemoteUserConfiguration
(
environment
.
settingsPath
,
REMOTE_MACHINE_SCOPES
,
this
.
_fileService
,
uriIdentityService
));
this
.
_register
(
userConfiguration
.
onDidChangeConfiguration
(
configurationModel
=>
this
.
onDidUserConfigurationChange
(
configurationModel
)));
this
.
_userConfigurationInitializationPromise
=
userConfiguration
.
initialize
();
const
configurationModel
=
await
this
.
_userConfigurationInitializationPromise
;
...
...
@@ -260,7 +263,8 @@ class FileServiceBasedRemoteUserConfiguration extends Disposable {
constructor
(
private
readonly
configurationResource
:
URI
,
private
readonly
scopes
:
ConfigurationScope
[]
|
undefined
,
private
readonly
fileService
:
IFileService
private
readonly
fileService
:
IFileService
,
private
readonly
uriIdentityService
:
IUriIdentityService
,
)
{
super
();
...
...
@@ -283,7 +287,7 @@ class FileServiceBasedRemoteUserConfiguration extends Disposable {
}
private
watchDirectory
():
void
{
const
directory
=
resources
.
dirname
(
this
.
configurationResource
);
const
directory
=
this
.
uriIdentityService
.
extUri
.
dirname
(
this
.
configurationResource
);
this
.
directoryWatcherDisposable
=
this
.
fileService
.
watch
(
directory
);
}
...
...
@@ -713,11 +717,12 @@ export class FolderConfiguration extends Disposable implements IFolderConfigurat
configFolderRelativePath
:
string
,
private
readonly
workbenchState
:
WorkbenchState
,
fileService
:
IFileService
,
uriIdentityService
:
IUriIdentityService
,
private
readonly
configurationCache
:
IConfigurationCache
)
{
super
();
this
.
configurationFolder
=
resources
.
joinPath
(
workspaceFolder
.
uri
,
configFolderRelativePath
);
this
.
configurationFolder
=
uriIdentityService
.
extUri
.
joinPath
(
workspaceFolder
.
uri
,
configFolderRelativePath
);
this
.
cachedFolderConfiguration
=
new
CachedFolderConfiguration
(
workspaceFolder
.
uri
,
configFolderRelativePath
,
configurationCache
);
if
(
this
.
configurationCache
.
needsCaching
(
workspaceFolder
.
uri
))
{
this
.
folderConfiguration
=
this
.
cachedFolderConfiguration
;
...
...
@@ -725,12 +730,12 @@ export class FolderConfiguration extends Disposable implements IFolderConfigurat
.
then
(()
=>
{
this
.
folderConfiguration
.
dispose
();
this
.
folderConfigurationDisposable
.
dispose
();
this
.
folderConfiguration
=
this
.
createFileServiceBasedConfiguration
(
fileService
);
this
.
folderConfiguration
=
this
.
createFileServiceBasedConfiguration
(
fileService
,
uriIdentityService
);
this
.
_register
(
this
.
folderConfiguration
.
onDidChange
(
e
=>
this
.
onDidFolderConfigurationChange
()));
this
.
onDidFolderConfigurationChange
();
});
}
else
{
this
.
folderConfiguration
=
this
.
createFileServiceBasedConfiguration
(
fileService
);
this
.
folderConfiguration
=
this
.
createFileServiceBasedConfiguration
(
fileService
,
uriIdentityService
);
this
.
folderConfigurationDisposable
=
this
.
_register
(
this
.
folderConfiguration
.
onDidChange
(
e
=>
this
.
onDidFolderConfigurationChange
()));
}
}
...
...
@@ -748,10 +753,10 @@ export class FolderConfiguration extends Disposable implements IFolderConfigurat
this
.
_onDidChange
.
fire
();
}
private
createFileServiceBasedConfiguration
(
fileService
:
IFileService
)
{
const
settingsResources
=
[
resources
.
joinPath
(
this
.
configurationFolder
,
`
${
FOLDER_SETTINGS_NAME
}
.json`
)];
const
standAloneConfigurationResources
:
[
string
,
URI
][]
=
[
TASKS_CONFIGURATION_KEY
,
LAUNCH_CONFIGURATION_KEY
].
map
(
name
=>
([
name
,
resources
.
joinPath
(
this
.
configurationFolder
,
`
${
name
}
.json`
)]));
return
new
FileServiceBasedConfiguration
(
this
.
configurationFolder
.
toString
(),
settingsResources
,
standAloneConfigurationResources
,
WorkbenchState
.
WORKSPACE
===
this
.
workbenchState
?
FOLDER_SCOPES
:
WORKSPACE_SCOPES
,
fileService
);
private
createFileServiceBasedConfiguration
(
fileService
:
IFileService
,
uriIdentityService
:
IUriIdentityService
)
{
const
settingsResources
=
[
uriIdentityService
.
extUri
.
joinPath
(
this
.
configurationFolder
,
`
${
FOLDER_SETTINGS_NAME
}
.json`
)];
const
standAloneConfigurationResources
:
[
string
,
URI
][]
=
[
TASKS_CONFIGURATION_KEY
,
LAUNCH_CONFIGURATION_KEY
].
map
(
name
=>
([
name
,
uriIdentityService
.
extUri
.
joinPath
(
this
.
configurationFolder
,
`
${
name
}
.json`
)]));
return
new
FileServiceBasedConfiguration
(
this
.
configurationFolder
.
toString
(),
settingsResources
,
standAloneConfigurationResources
,
WorkbenchState
.
WORKSPACE
===
this
.
workbenchState
?
FOLDER_SCOPES
:
WORKSPACE_SCOPES
,
fileService
,
uriIdentityService
);
}
private
updateCache
():
Promise
<
void
>
{
...
...
src/vs/workbench/services/configuration/browser/configurationService.ts
浏览文件 @
52cc4e6a
...
...
@@ -23,7 +23,6 @@ import { ConfigurationEditingService, EditableConfigurationTarget } from 'vs/wor
import
{
WorkspaceConfiguration
,
FolderConfiguration
,
RemoteUserConfiguration
,
UserConfiguration
}
from
'
vs/workbench/services/configuration/browser/configuration
'
;
import
{
JSONEditingService
}
from
'
vs/workbench/services/configuration/common/jsonEditingService
'
;
import
{
IJSONSchema
,
IJSONSchemaMap
}
from
'
vs/base/common/jsonSchema
'
;
import
{
isEqual
,
dirname
}
from
'
vs/base/common/resources
'
;
import
{
mark
}
from
'
vs/base/common/performance
'
;
import
{
IRemoteAgentService
}
from
'
vs/workbench/services/remote/common/remoteAgentService
'
;
import
{
IFileService
}
from
'
vs/platform/files/common/files
'
;
...
...
@@ -103,10 +102,10 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
this
.
logService
=
logService
;
this
.
_configuration
=
new
Configuration
(
this
.
defaultConfiguration
,
new
ConfigurationModel
(),
new
ConfigurationModel
(),
new
ConfigurationModel
(),
new
ResourceMap
(),
new
ConfigurationModel
(),
new
ResourceMap
<
ConfigurationModel
>
(),
this
.
workspace
);
this
.
cachedFolderConfigs
=
new
ResourceMap
<
FolderConfiguration
>
();
this
.
localUserConfiguration
=
this
.
_register
(
new
UserConfiguration
(
environmentService
.
settingsResource
,
remoteAuthority
?
LOCAL_MACHINE_SCOPES
:
undefined
,
fileService
));
this
.
localUserConfiguration
=
this
.
_register
(
new
UserConfiguration
(
environmentService
.
settingsResource
,
remoteAuthority
?
LOCAL_MACHINE_SCOPES
:
undefined
,
fileService
,
uriIdentityService
));
this
.
_register
(
this
.
localUserConfiguration
.
onDidChangeConfiguration
(
userConfiguration
=>
this
.
onLocalUserConfigurationChanged
(
userConfiguration
)));
if
(
remoteAuthority
)
{
const
remoteUserConfiguration
=
this
.
remoteUserConfiguration
=
this
.
_register
(
new
RemoteUserConfiguration
(
remoteAuthority
,
configurationCache
,
fileService
,
remoteAgentService
));
const
remoteUserConfiguration
=
this
.
remoteUserConfiguration
=
this
.
_register
(
new
RemoteUserConfiguration
(
remoteAuthority
,
configurationCache
,
fileService
,
uriIdentityService
,
remoteAgentService
));
this
.
_register
(
remoteUserConfiguration
.
onDidInitialize
(
remoteUserConfigurationModel
=>
{
this
.
_register
(
remoteUserConfiguration
.
onDidChangeConfiguration
(
remoteUserConfigurationModel
=>
this
.
onRemoteUserConfigurationChanged
(
remoteUserConfigurationModel
)));
this
.
onRemoteUserConfigurationChanged
(
remoteUserConfigurationModel
);
...
...
@@ -179,7 +178,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
public
isCurrentWorkspace
(
workspaceIdentifier
:
ISingleFolderWorkspaceIdentifier
|
IWorkspaceIdentifier
):
boolean
{
switch
(
this
.
getWorkbenchState
())
{
case
WorkbenchState
.
FOLDER
:
return
isSingleFolderWorkspaceIdentifier
(
workspaceIdentifier
)
&&
isEqual
(
workspaceIdentifier
,
this
.
workspace
.
folders
[
0
].
uri
);
return
isSingleFolderWorkspaceIdentifier
(
workspaceIdentifier
)
&&
this
.
uriIdentityService
.
extUri
.
isEqual
(
workspaceIdentifier
,
this
.
workspace
.
folders
[
0
].
uri
);
case
WorkbenchState
.
WORKSPACE
:
return
isWorkspaceIdentifier
(
workspaceIdentifier
)
&&
this
.
workspace
.
id
===
workspaceIdentifier
.
id
;
}
...
...
@@ -216,7 +215,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
// Recompute current workspace folders if we have folders to add
const
workspaceConfigPath
=
this
.
getWorkspace
().
configuration
!
;
const
workspaceConfigFolder
=
dirname
(
workspaceConfigPath
);
const
workspaceConfigFolder
=
this
.
uriIdentityService
.
extUri
.
dirname
(
workspaceConfigPath
);
currentWorkspaceFolders
=
toWorkspaceFolders
(
newStoredFolders
,
workspaceConfigPath
,
this
.
uriIdentityService
.
extUri
);
const
currentWorkspaceFolderUris
=
currentWorkspaceFolders
.
map
(
folder
=>
folder
.
uri
);
...
...
@@ -265,7 +264,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
}
private
contains
(
resources
:
URI
[],
toCheck
:
URI
):
boolean
{
return
resources
.
some
(
resource
=>
isEqual
(
resource
,
toCheck
));
return
resources
.
some
(
resource
=>
this
.
uriIdentityService
.
extUri
.
isEqual
(
resource
,
toCheck
));
}
// Workspace Configuration Service Impl
...
...
@@ -675,7 +674,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat
return
Promise
.
all
([...
folders
.
map
(
folder
=>
{
let
folderConfiguration
=
this
.
cachedFolderConfigs
.
get
(
folder
.
uri
);
if
(
!
folderConfiguration
)
{
folderConfiguration
=
new
FolderConfiguration
(
folder
,
FOLDER_CONFIG_FOLDER_NAME
,
this
.
getWorkbenchState
(),
this
.
fileService
,
this
.
configurationCache
);
folderConfiguration
=
new
FolderConfiguration
(
folder
,
FOLDER_CONFIG_FOLDER_NAME
,
this
.
getWorkbenchState
(),
this
.
fileService
,
this
.
uriIdentityService
,
this
.
configurationCache
);
this
.
_register
(
folderConfiguration
.
onDidChange
(()
=>
this
.
onWorkspaceFolderConfigurationChanged
(
folder
)));
this
.
cachedFolderConfigs
.
set
(
folder
.
uri
,
this
.
_register
(
folderConfiguration
));
}
...
...
src/vs/workbench/services/configuration/common/configurationEditingService.ts
浏览文件 @
52cc4e6a
...
...
@@ -5,7 +5,6 @@
import
*
as
nls
from
'
vs/nls
'
;
import
{
URI
}
from
'
vs/base/common/uri
'
;
import
*
as
resources
from
'
vs/base/common/resources
'
;
import
*
as
json
from
'
vs/base/common/json
'
;
import
{
setProperty
}
from
'
vs/base/common/jsonEdit
'
;
import
{
Queue
}
from
'
vs/base/common/async
'
;
...
...
@@ -29,6 +28,7 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/
import
{
IPreferencesService
}
from
'
vs/workbench/services/preferences/common/preferences
'
;
import
{
withUndefinedAsNull
,
withNullAsUndefined
}
from
'
vs/base/common/types
'
;
import
{
IRemoteAgentService
}
from
'
vs/workbench/services/remote/common/remoteAgentService
'
;
import
{
IUriIdentityService
}
from
'
vs/workbench/services/uriIdentity/common/uriIdentity
'
;
export
const
enum
ConfigurationEditingErrorCode
{
...
...
@@ -155,7 +155,8 @@ export class ConfigurationEditingService {
@
INotificationService
private
readonly
notificationService
:
INotificationService
,
@
IPreferencesService
private
readonly
preferencesService
:
IPreferencesService
,
@
IEditorService
private
readonly
editorService
:
IEditorService
,
@
IRemoteAgentService
remoteAgentService
:
IRemoteAgentService
@
IRemoteAgentService
remoteAgentService
:
IRemoteAgentService
,
@
IUriIdentityService
private
readonly
uriIdentityService
:
IUriIdentityService
)
{
this
.
queue
=
new
Queue
<
void
>
();
remoteAgentService
.
getEnvironment
().
then
(
environment
=>
{
...
...
@@ -437,8 +438,8 @@ export class ConfigurationEditingService {
}
private
defaultResourceValue
(
resource
:
URI
):
string
{
const
basename
:
string
=
resources
.
basename
(
resource
);
const
configurationValue
:
string
=
basename
.
substr
(
0
,
basename
.
length
-
resources
.
extname
(
resource
).
length
);
const
basename
:
string
=
this
.
uriIdentityService
.
extUri
.
basename
(
resource
);
const
configurationValue
:
string
=
basename
.
substr
(
0
,
basename
.
length
-
this
.
uriIdentityService
.
extUri
.
extname
(
resource
).
length
);
switch
(
configurationValue
)
{
case
TASKS_CONFIGURATION_KEY
:
return
TASKS_DEFAULT
;
default
:
return
'
{}
'
;
...
...
@@ -585,7 +586,7 @@ export class ConfigurationEditingService {
private
getConfigurationFileResource
(
target
:
EditableConfigurationTarget
,
relativePath
:
string
,
resource
:
URI
|
null
|
undefined
):
URI
|
null
{
if
(
target
===
EditableConfigurationTarget
.
USER_LOCAL
)
{
if
(
relativePath
)
{
return
resources
.
joinPath
(
resources
.
dirname
(
this
.
environmentService
.
settingsResource
),
relativePath
);
return
this
.
uriIdentityService
.
extUri
.
joinPath
(
this
.
uriIdentityService
.
extUri
.
dirname
(
this
.
environmentService
.
settingsResource
),
relativePath
);
}
else
{
return
this
.
environmentService
.
settingsResource
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录