Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
6a47ef2d
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,发现更多精彩内容 >>
提交
6a47ef2d
编写于
10月 25, 2020
作者:
S
Sandeep Somavarapu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
consider version while merging extension state
上级
27f036cd
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
45 addition
and
15 deletion
+45
-15
.eslintrc.json
.eslintrc.json
+2
-1
src/vs/platform/userDataSync/common/extensionsMerge.ts
src/vs/platform/userDataSync/common/extensionsMerge.ts
+43
-14
未找到文件。
.eslintrc.json
浏览文件 @
6a47ef2d
...
...
@@ -206,7 +206,8 @@
"vs/nls"
,
"**/vs/base/common/**"
,
"**/vs/base/parts/*/common/**"
,
"**/vs/platform/*/common/**"
"**/vs/platform/*/common/**"
,
"semver-umd"
]
},
{
...
...
src/vs/platform/userDataSync/common/extensionsMerge.ts
浏览文件 @
6a47ef2d
...
...
@@ -3,6 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import
*
as
semver
from
'
semver-umd
'
;
import
{
ISyncExtension
,
ISyncExtensionWithVersion
}
from
'
vs/platform/userDataSync/common/userDataSync
'
;
import
{
IExtensionIdentifier
}
from
'
vs/platform/extensions/common/extensions
'
;
import
{
deepClone
,
equals
}
from
'
vs/base/common/objects
'
;
...
...
@@ -83,13 +84,13 @@ export function merge(localExtensions: ISyncExtensionWithVersion[], remoteExtens
const
localExtension
=
localExtensionsMap
.
get
(
key
);
if
(
localExtension
)
{
const
remoteExtension
=
remoteExtensionsMap
.
get
(
key
)
!
;
const
mergedExtension
:
ISyncExtensionWithVersion
=
{
...
remoteExtension
,
version
:
localExtension
.
version
};
// merge extension state only when version matches and local extension has state
if
(
remoteExtension
.
version
===
localExtension
.
version
&&
localExtension
.
state
)
{
mergedExtension
.
state
=
mergeExtensionState
(
localExtension
.
state
,
remoteExtension
.
state
,
lastSyncExtensionsMap
?.
get
(
key
)?.
state
);
}
const
mergedExtension
:
ISyncExtensionWithVersion
=
{
...
remoteExtension
,
version
:
localExtension
.
version
,
state
:
mergeExtensionState
(
localExtension
,
remoteExtension
,
lastSyncExtensionsMap
?.
get
(
key
))
}
;
updated
.
push
(
massageOutgoingExtension
(
mergedExtension
,
key
));
newRemoteExtensionsMap
.
set
(
key
,
remote
Extension
);
newRemoteExtensionsMap
.
set
(
key
,
merged
Extension
);
}
};
...
...
@@ -196,25 +197,53 @@ function compare(from: Map<string, ISyncExtension> | null, to: Map<string, ISync
return
{
added
,
removed
,
updated
};
}
function
mergeExtensionState
(
local
:
IStringDictionary
<
any
>
,
remote
:
IStringDictionary
<
any
>
|
undefined
,
base
:
IStringDictionary
<
any
>
|
undefined
):
IStringDictionary
<
any
>
|
undefined
{
const
merged
:
IStringDictionary
<
any
>
=
deepClone
(
local
);
if
(
remote
)
{
const
baseToRemote
=
base
?
compareExtensionState
(
base
,
remote
)
:
{
added
:
Object
.
keys
(
remote
).
reduce
((
r
,
k
)
=>
{
r
.
add
(
k
);
return
r
;
},
new
Set
<
string
>
()),
removed
:
new
Set
<
string
>
(),
updated
:
new
Set
<
string
>
()
};
const
baseToLocal
=
base
?
compareExtensionState
(
base
,
local
)
:
{
added
:
Object
.
keys
(
local
).
reduce
((
r
,
k
)
=>
{
r
.
add
(
k
);
return
r
;
},
new
Set
<
string
>
()),
removed
:
new
Set
<
string
>
(),
updated
:
new
Set
<
string
>
()
};
function
mergeExtensionState
(
localExtension
:
ISyncExtensionWithVersion
,
remoteExtension
:
ISyncExtension
,
lastSyncExtension
:
ISyncExtension
|
undefined
):
IStringDictionary
<
any
>
|
undefined
{
const
localState
=
localExtension
.
state
;
const
remoteState
=
remoteExtension
.
state
;
const
baseState
=
lastSyncExtension
?.
state
;
// If remote extension has no version, use local state
if
(
!
remoteExtension
.
version
)
{
return
localState
;
}
// If local is latest, use local state
if
(
semver
.
gt
(
localExtension
.
version
,
remoteExtension
.
version
))
{
return
localState
;
}
// If remote is latest, use remote state
if
(
semver
.
gt
(
remoteExtension
.
version
,
localExtension
.
version
))
{
return
remoteState
;
}
/* Remote and local are on same version */
// If there is no local state, use remote state
if
(
!
localState
)
{
return
remoteState
;
}
// If there is no remote state, use local state
if
(
!
remoteState
)
{
return
localState
;
}
const
mergedState
:
IStringDictionary
<
any
>
=
deepClone
(
localState
);
if
(
remoteState
)
{
const
baseToRemote
=
baseState
?
compareExtensionState
(
baseState
,
remoteState
)
:
{
added
:
Object
.
keys
(
remoteState
).
reduce
((
r
,
k
)
=>
{
r
.
add
(
k
);
return
r
;
},
new
Set
<
string
>
()),
removed
:
new
Set
<
string
>
(),
updated
:
new
Set
<
string
>
()
};
const
baseToLocal
=
baseState
?
compareExtensionState
(
baseState
,
localState
)
:
{
added
:
Object
.
keys
(
localState
).
reduce
((
r
,
k
)
=>
{
r
.
add
(
k
);
return
r
;
},
new
Set
<
string
>
()),
removed
:
new
Set
<
string
>
(),
updated
:
new
Set
<
string
>
()
};
// Added/Updated in remote
for
(
const
key
of
[...
baseToRemote
.
added
.
values
(),
...
baseToRemote
.
updated
.
values
()])
{
merged
[
key
]
=
remo
te
[
key
];
merged
State
[
key
]
=
remoteSta
te
[
key
];
}
// Removed in remote
for
(
const
key
of
baseToRemote
.
removed
.
values
())
{
// Not updated in local
if
(
!
baseToLocal
.
updated
.
has
(
key
))
{
delete
merged
[
key
];
delete
merged
State
[
key
];
}
}
}
return
merged
;
return
merged
State
;
}
function
compareExtensionState
(
from
:
IStringDictionary
<
any
>
,
to
:
IStringDictionary
<
any
>
):
{
added
:
Set
<
string
>
,
removed
:
Set
<
string
>
,
updated
:
Set
<
string
>
}
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录