Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
e3dfc219
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,发现更多精彩内容 >>
提交
e3dfc219
编写于
2月 20, 2020
作者:
S
Sandeep Somavarapu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix #90239
上级
5da116f3
变更
3
展开全部
隐藏空白更改
内联
并排
Showing
3 changed file
with
272 addition
and
189 deletion
+272
-189
src/vs/platform/userDataSync/common/extensionsMerge.ts
src/vs/platform/userDataSync/common/extensionsMerge.ts
+28
-13
src/vs/platform/userDataSync/common/extensionsSync.ts
src/vs/platform/userDataSync/common/extensionsSync.ts
+39
-17
src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts
...platform/userDataSync/test/common/extensionsMerge.test.ts
+205
-159
未找到文件。
src/vs/platform/userDataSync/common/extensionsMerge.ts
浏览文件 @
e3dfc219
...
...
@@ -29,6 +29,12 @@ export function merge(localExtensions: ISyncExtension[], remoteExtensions: ISync
};
}
// massage incoming extension - add disabled property
const
massageIncomingExtension
=
(
extension
:
ISyncExtension
):
ISyncExtension
=>
({
...
extension
,
...{
disabled
:
!!
extension
.
disabled
}
});
localExtensions
=
localExtensions
.
map
(
massageIncomingExtension
);
remoteExtensions
=
remoteExtensions
.
map
(
massageIncomingExtension
);
lastSyncExtensions
=
lastSyncExtensions
?
lastSyncExtensions
.
map
(
massageIncomingExtension
)
:
null
;
const
uuids
:
Map
<
string
,
string
>
=
new
Map
<
string
,
string
>
();
const
addUUID
=
(
identifier
:
IExtensionIdentifier
)
=>
{
if
(
identifier
.
uuid
)
{
uuids
.
set
(
identifier
.
id
.
toLowerCase
(),
identifier
.
uuid
);
}
};
localExtensions
.
forEach
(({
identifier
})
=>
addUUID
(
identifier
));
...
...
@@ -37,10 +43,12 @@ export function merge(localExtensions: ISyncExtension[], remoteExtensions: ISync
lastSyncExtensions
.
forEach
(({
identifier
})
=>
addUUID
(
identifier
));
}
const
addExtensionToMap
=
(
map
:
Map
<
string
,
ISyncExtension
>
,
extension
:
ISyncExtension
)
=>
{
const
getKey
=
(
extension
:
ISyncExtension
):
string
=>
{
const
uuid
=
extension
.
identifier
.
uuid
||
uuids
.
get
(
extension
.
identifier
.
id
.
toLowerCase
());
const
key
=
uuid
?
`uuid:
${
uuid
}
`
:
`id:
${
extension
.
identifier
.
id
.
toLowerCase
()}
`
;
map
.
set
(
key
,
extension
);
return
uuid
?
`uuid:
${
uuid
}
`
:
`id:
${
extension
.
identifier
.
id
.
toLowerCase
()}
`
;
};
const
addExtensionToMap
=
(
map
:
Map
<
string
,
ISyncExtension
>
,
extension
:
ISyncExtension
)
=>
{
map
.
set
(
getKey
(
extension
),
extension
);
return
map
;
};
const
localExtensionsMap
=
localExtensions
.
reduce
(
addExtensionToMap
,
new
Map
<
string
,
ISyncExtension
>
());
...
...
@@ -62,14 +70,17 @@ export function merge(localExtensions: ISyncExtension[], remoteExtensions: ISync
const
baseToLocal
=
compare
(
lastSyncExtensionsMap
,
localExtensionsMap
,
ignoredExtensionsSet
);
const
baseToRemote
=
compare
(
lastSyncExtensionsMap
,
remoteExtensionsMap
,
ignoredExtensionsSet
);
const
massageSyncExtension
=
(
extension
:
ISyncExtension
,
key
:
string
):
ISyncExtension
=>
{
// massage outgoing extension - remove disabled property
const
massageOutgoingExtension
=
(
extension
:
ISyncExtension
,
key
:
string
):
ISyncExtension
=>
{
const
massagedExtension
:
ISyncExtension
=
{
identifier
:
{
id
:
extension
.
identifier
.
id
,
uuid
:
startsWith
(
key
,
'
uuid:
'
)
?
key
.
substring
(
'
uuid:
'
.
length
)
:
undefined
},
enabled
:
extension
.
enabled
,
};
if
(
extension
.
disabled
)
{
massagedExtension
.
disabled
=
true
;
}
if
(
extension
.
version
)
{
massagedExtension
.
version
=
extension
.
version
;
}
...
...
@@ -90,25 +101,25 @@ export function merge(localExtensions: ISyncExtension[], remoteExtensions: ISync
if
(
baseToLocal
.
added
.
has
(
key
))
{
// Is different from local to remote
if
(
localToRemote
.
updated
.
has
(
key
))
{
updated
.
push
(
massage
Sync
Extension
(
remoteExtensionsMap
.
get
(
key
)
!
,
key
));
updated
.
push
(
massage
Outgoing
Extension
(
remoteExtensionsMap
.
get
(
key
)
!
,
key
));
}
}
else
{
// Add to local
added
.
push
(
massage
Sync
Extension
(
remoteExtensionsMap
.
get
(
key
)
!
,
key
));
added
.
push
(
massage
Outgoing
Extension
(
remoteExtensionsMap
.
get
(
key
)
!
,
key
));
}
}
// Remotely updated extensions
for
(
const
key
of
values
(
baseToRemote
.
updated
))
{
// Update in local always
updated
.
push
(
massage
Sync
Extension
(
remoteExtensionsMap
.
get
(
key
)
!
,
key
));
updated
.
push
(
massage
Outgoing
Extension
(
remoteExtensionsMap
.
get
(
key
)
!
,
key
));
}
// Locally added extensions
for
(
const
key
of
values
(
baseToLocal
.
added
))
{
// Not there in remote
if
(
!
baseToRemote
.
added
.
has
(
key
))
{
newRemoteExtensionsMap
.
set
(
key
,
massageSyncExtension
(
localExtensionsMap
.
get
(
key
)
!
,
key
)
);
newRemoteExtensionsMap
.
set
(
key
,
localExtensionsMap
.
get
(
key
)
!
);
}
}
...
...
@@ -121,7 +132,7 @@ export function merge(localExtensions: ISyncExtension[], remoteExtensions: ISync
// If not updated in remote
if
(
!
baseToRemote
.
updated
.
has
(
key
))
{
newRemoteExtensionsMap
.
set
(
key
,
massageSyncExtension
(
localExtensionsMap
.
get
(
key
)
!
,
key
)
);
newRemoteExtensionsMap
.
set
(
key
,
localExtensionsMap
.
get
(
key
)
!
);
}
}
...
...
@@ -133,9 +144,13 @@ export function merge(localExtensions: ISyncExtension[], remoteExtensions: ISync
}
}
const
remote
:
ISyncExtension
[]
=
[];
const
remoteChanges
=
compare
(
remoteExtensionsMap
,
newRemoteExtensionsMap
,
new
Set
<
string
>
());
const
remote
=
remoteChanges
.
added
.
size
>
0
||
remoteChanges
.
updated
.
size
>
0
||
remoteChanges
.
removed
.
size
>
0
?
values
(
newRemoteExtensionsMap
)
:
null
;
return
{
added
,
removed
,
updated
,
remote
};
if
(
remoteChanges
.
added
.
size
>
0
||
remoteChanges
.
updated
.
size
>
0
||
remoteChanges
.
removed
.
size
>
0
)
{
newRemoteExtensionsMap
.
forEach
((
value
,
key
)
=>
remote
.
push
(
massageOutgoingExtension
(
value
,
key
)));
}
return
{
added
,
removed
,
updated
,
remote
:
remote
.
length
?
remote
:
null
};
}
function
compare
(
from
:
Map
<
string
,
ISyncExtension
>
|
null
,
to
:
Map
<
string
,
ISyncExtension
>
,
ignoredExtensions
:
Set
<
string
>
):
{
added
:
Set
<
string
>
,
removed
:
Set
<
string
>
,
updated
:
Set
<
string
>
}
{
...
...
@@ -152,7 +167,7 @@ function compare(from: Map<string, ISyncExtension> | null, to: Map<string, ISync
const
fromExtension
=
from
!
.
get
(
key
)
!
;
const
toExtension
=
to
.
get
(
key
);
if
(
!
toExtension
||
fromExtension
.
enabled
!==
toExtension
.
en
abled
||
fromExtension
.
disabled
!==
toExtension
.
dis
abled
||
fromExtension
.
version
!==
toExtension
.
version
)
{
updated
.
add
(
key
);
...
...
src/vs/platform/userDataSync/common/extensionsSync.ts
浏览文件 @
e3dfc219
...
...
@@ -14,7 +14,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
import
{
localize
}
from
'
vs/nls
'
;
import
{
merge
}
from
'
vs/platform/userDataSync/common/extensionsMerge
'
;
import
{
isNonEmptyArray
}
from
'
vs/base/common/arrays
'
;
import
{
AbstractSynchroniser
,
IRemoteUserData
}
from
'
vs/platform/userDataSync/common/abstractSynchronizer
'
;
import
{
AbstractSynchroniser
,
IRemoteUserData
,
ISyncData
}
from
'
vs/platform/userDataSync/common/abstractSynchronizer
'
;
import
{
ITelemetryService
}
from
'
vs/platform/telemetry/common/telemetry
'
;
interface
ISyncPreviewResult
{
...
...
@@ -34,7 +34,7 @@ interface ILastSyncUserData extends IRemoteUserData {
export
class
ExtensionsSynchroniser
extends
AbstractSynchroniser
implements
IUserDataSynchroniser
{
readonly
resourceKey
:
ResourceKey
=
'
extensions
'
;
protected
readonly
version
:
number
=
1
;
protected
readonly
version
:
number
=
2
;
constructor
(
@
IEnvironmentService
environmentService
:
IEnvironmentService
,
...
...
@@ -75,7 +75,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
if
(
remoteUserData
.
syncData
!==
null
)
{
const
localExtensions
=
await
this
.
getLocalExtensions
();
const
remoteExtensions
:
ISyncExtension
[]
=
JSON
.
parse
(
remoteUserData
.
syncData
.
content
);
const
remoteExtensions
=
this
.
parseExtensions
(
remoteUserData
.
syncData
);
const
{
added
,
updated
,
remote
}
=
merge
(
localExtensions
,
remoteExtensions
,
[],
[],
this
.
getIgnoredExtensions
());
await
this
.
apply
({
added
,
removed
:
[],
updated
,
remote
,
remoteUserData
,
skippedExtensions
:
[],
lastSyncUserData
});
}
...
...
@@ -165,8 +165,8 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
}
private
async
getPreview
(
remoteUserData
:
IRemoteUserData
,
lastSyncUserData
:
ILastSyncUserData
|
null
):
Promise
<
ISyncPreviewResult
>
{
const
remoteExtensions
:
ISyncExtension
[]
=
remoteUserData
.
syncData
?
JSON
.
parse
(
remoteUserData
.
syncData
.
content
)
:
null
;
const
lastSyncExtensions
:
ISyncExtension
[]
|
null
=
lastSyncUserData
?
JSON
.
parse
(
lastSyncUserData
.
syncData
!
.
content
)
:
null
;
const
remoteExtensions
:
ISyncExtension
[]
|
null
=
remoteUserData
.
syncData
?
this
.
parseExtensions
(
remoteUserData
.
syncData
)
:
null
;
const
lastSyncExtensions
:
ISyncExtension
[]
|
null
=
lastSyncUserData
?
this
.
parseExtensions
(
lastSyncUserData
.
syncData
!
)
:
null
;
const
skippedExtensions
:
ISyncExtension
[]
=
lastSyncUserData
?
lastSyncUserData
.
skippedExtensions
||
[]
:
[];
const
localExtensions
=
await
this
.
getLocalExtensions
();
...
...
@@ -236,14 +236,14 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
// Builtin Extension: Sync only enablement state
if
(
installedExtension
&&
installedExtension
.
type
===
ExtensionType
.
System
)
{
if
(
e
.
enabled
)
{
this
.
logService
.
trace
(
'
Extensions: Enabling extension...
'
,
e
.
identifier
.
id
);
await
this
.
extensionEnablementService
.
enableExtension
(
e
.
identifier
);
this
.
logService
.
info
(
'
Extensions: Enabled extension
'
,
e
.
identifier
.
id
);
}
else
{
if
(
e
.
disabled
)
{
this
.
logService
.
trace
(
'
Extensions: Disabling extension...
'
,
e
.
identifier
.
id
);
await
this
.
extensionEnablementService
.
disableExtension
(
e
.
identifier
);
this
.
logService
.
info
(
'
Extensions: Disabled extension
'
,
e
.
identifier
.
id
);
}
else
{
this
.
logService
.
trace
(
'
Extensions: Enabling extension...
'
,
e
.
identifier
.
id
);
await
this
.
extensionEnablementService
.
enableExtension
(
e
.
identifier
);
this
.
logService
.
info
(
'
Extensions: Enabled extension
'
,
e
.
identifier
.
id
);
}
removeFromSkipped
.
push
(
e
.
identifier
);
return
;
...
...
@@ -252,14 +252,14 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
const
extension
=
await
this
.
extensionGalleryService
.
getCompatibleExtension
(
e
.
identifier
,
e
.
version
);
if
(
extension
)
{
try
{
if
(
e
.
enabled
)
{
this
.
logService
.
trace
(
'
Extensions: Enabling extension...
'
,
e
.
identifier
.
id
,
extension
.
version
);
await
this
.
extensionEnablementService
.
enableExtension
(
extension
.
identifier
);
this
.
logService
.
info
(
'
Extensions: Enabled extension
'
,
e
.
identifier
.
id
,
extension
.
version
);
}
else
{
if
(
e
.
disabled
)
{
this
.
logService
.
trace
(
'
Extensions: Disabling extension...
'
,
e
.
identifier
.
id
,
extension
.
version
);
await
this
.
extensionEnablementService
.
disableExtension
(
extension
.
identifier
);
this
.
logService
.
info
(
'
Extensions: Disabled extension
'
,
e
.
identifier
.
id
,
extension
.
version
);
}
else
{
this
.
logService
.
trace
(
'
Extensions: Enabling extension...
'
,
e
.
identifier
.
id
,
extension
.
version
);
await
this
.
extensionEnablementService
.
enableExtension
(
extension
.
identifier
);
this
.
logService
.
info
(
'
Extensions: Enabled extension
'
,
e
.
identifier
.
id
,
extension
.
version
);
}
// Install only if the extension does not exist
if
(
!
installedExtension
||
installedExtension
.
manifest
.
version
!==
extension
.
version
)
{
...
...
@@ -293,11 +293,33 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
return
newSkippedExtensions
;
}
private
parseExtensions
(
syncData
:
ISyncData
):
ISyncExtension
[]
{
let
extensions
:
ISyncExtension
[]
=
JSON
.
parse
(
syncData
.
content
);
if
(
syncData
.
version
!==
this
.
version
)
{
extensions
=
extensions
.
map
(
e
=>
{
// #region Migration from v1 (enabled -> disabled)
if
(
!
(
<
any
>
e
).
enabled
)
{
e
.
disabled
=
true
;
}
delete
(
<
any
>
e
).
enabled
;
// #endregion
return
e
;
});
}
return
extensions
;
}
private
async
getLocalExtensions
():
Promise
<
ISyncExtension
[]
>
{
const
installedExtensions
=
await
this
.
extensionManagementService
.
getInstalled
();
const
disabledExtensions
=
await
this
.
extensionEnablementService
.
getDisabledExtensions
();
const
disabledExtensions
=
this
.
extensionEnablementService
.
getDisabledExtensions
();
return
installedExtensions
.
map
(({
identifier
})
=>
({
identifier
,
enabled
:
!
disabledExtensions
.
some
(
disabledExtension
=>
areSameExtensions
(
disabledExtension
,
identifier
))
}));
.
map
(({
identifier
})
=>
{
const
syncExntesion
:
ISyncExtension
=
{
identifier
};
if
(
disabledExtensions
.
some
(
disabledExtension
=>
areSameExtensions
(
disabledExtension
,
identifier
)))
{
syncExntesion
.
disabled
=
true
;
}
return
syncExntesion
;
});
}
}
src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts
浏览文件 @
e3dfc219
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录