Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
LinuxSuRen
jenkins
提交
46c58c52
J
jenkins
项目概览
LinuxSuRen
/
jenkins
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jenkins
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
46c58c52
编写于
7月 29, 2014
作者:
S
Stephen Connolly
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[FIXED JENKINS-23872] Jenkins users disappeared!
- Added migration logic to move the config files
上级
19d8b80b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
38 addition
and
2 deletion
+38
-2
core/src/main/java/hudson/model/User.java
core/src/main/java/hudson/model/User.java
+38
-2
未找到文件。
core/src/main/java/hudson/model/User.java
浏览文件 @
46c58c52
...
...
@@ -379,7 +379,33 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
}
finally
{
byNameLock
.
readLock
().
unlock
();
}
if
(
u
==
null
&&
(
create
||
getConfigFileFor
(
id
).
exists
()))
{
final
File
configFile
=
getConfigFileFor
(
id
);
if
(!
configFile
.
isFile
()
&&
!
configFile
.
getParentFile
().
isDirectory
())
{
// check for legacy users and migrate if safe to do so.
File
[]
legacy
=
getLegacyConfigFilesFor
(
id
);
if
(
legacy
!=
null
&&
legacy
.
length
>
0
)
{
for
(
File
p
:
legacy
)
{
final
XmlFile
legacyXml
=
new
XmlFile
(
XSTREAM
,
new
File
(
p
,
"config.xml"
));
try
{
Object
o
=
legacyXml
.
read
();
if
(
o
instanceof
User
)
{
User
tmp
=
(
User
)
o
;
if
(
idStrategy
().
equals
(
id
,
tmp
.
getId
())
&&
!
idStrategy
().
filenameOf
(
tmp
.
getId
())
.
equals
(
p
.
getParentFile
().
getName
()))
{
if
(!
p
.
getParentFile
().
renameTo
(
configFile
.
getParentFile
()))
{
LOGGER
.
log
(
Level
.
FINE
,
"Could not migrate user record from {0} to {1}"
,
new
Object
[]{
p
.
getParentFile
(),
configFile
.
getParentFile
()});
}
break
;
}
}
}
catch
(
IOException
e
)
{
// ignore
}
}
}
}
if
(
u
==
null
&&
(
create
||
configFile
.
exists
()))
{
User
tmp
=
new
User
(
id
,
fullName
);
User
prev
;
byNameLock
.
readLock
().
lock
();
...
...
@@ -393,7 +419,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
if
(
LOGGER
.
isLoggable
(
Level
.
FINE
)
&&
!
fullName
.
equals
(
prev
.
getFullName
()))
{
LOGGER
.
log
(
Level
.
FINE
,
"mismatch on fullName (‘"
+
fullName
+
"’ vs. ‘"
+
prev
.
getFullName
()
+
"’) for ‘"
+
id
+
"’"
,
new
Throwable
());
}
}
else
if
(!
id
.
equals
(
fullName
)
&&
!
getConfigFileFor
(
id
)
.
exists
())
{
}
else
if
(!
id
.
equals
(
fullName
)
&&
!
configFile
.
exists
())
{
// JENKINS-16332: since the fullName may not be recoverable from the id, and various code may store the id only, we must save the fullName
try
{
u
.
save
();
...
...
@@ -579,6 +605,16 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
return
new
File
(
getRootDir
(),
idStrategy
().
filenameOf
(
id
)
+
"/config.xml"
);
}
private
static
final
File
[]
getLegacyConfigFilesFor
(
final
String
id
)
{
return
getRootDir
().
listFiles
(
new
FileFilter
()
{
@Override
public
boolean
accept
(
File
pathname
)
{
return
pathname
.
isDirectory
()
&&
new
File
(
pathname
,
"config.xml"
).
isFile
()
&&
idStrategy
().
equals
(
pathname
.
getName
(),
id
);
}
});
}
/**
* Gets the directory where Hudson stores user information.
*/
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录