Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
jenkins
提交
ccf8427a
J
jenkins
项目概览
xxadev
/
jenkins
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
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,发现更多精彩内容 >>
提交
ccf8427a
编写于
3月 22, 2013
作者:
J
Jesse Glick
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' into cron-hash-JENKINS-17311
上级
3e71c976
f6a2f64b
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
119 addition
and
23 deletion
+119
-23
changelog.html
changelog.html
+9
-0
core/src/main/java/hudson/scheduler/CronTab.java
core/src/main/java/hudson/scheduler/CronTab.java
+1
-2
core/src/main/java/hudson/scm/ChangeLogSet.java
core/src/main/java/hudson/scm/ChangeLogSet.java
+3
-1
core/src/main/java/jenkins/model/Jenkins.java
core/src/main/java/jenkins/model/Jenkins.java
+3
-0
core/src/main/resources/hudson/model/Messages.properties
core/src/main/resources/hudson/model/Messages.properties
+2
-0
core/src/main/resources/hudson/model/Messages_ja.properties
core/src/main/resources/hudson/model/Messages_ja.properties
+1
-0
core/src/main/resources/hudson/scheduler/Messages.properties
core/src/main/resources/hudson/scheduler/Messages.properties
+2
-1
core/src/test/java/hudson/scheduler/CronTabTest.java
core/src/test/java/hudson/scheduler/CronTabTest.java
+11
-0
test/src/test/java/hudson/model/ViewTest.java
test/src/test/java/hudson/model/ViewTest.java
+36
-19
test/src/test/java/hudson/model/labels/LabelExpressionTest.java
...rc/test/java/hudson/model/labels/LabelExpressionTest.java
+4
-0
test/src/test/java/hudson/scm/ChangeLogSetTest.java
test/src/test/java/hudson/scm/ChangeLogSetTest.java
+47
-0
未找到文件。
changelog.html
浏览文件 @
ccf8427a
...
...
@@ -70,6 +70,15 @@ Upcoming changes</a>
<li
class=
'major rfe'
>
Performance improvement in master/slave communication throughput
(
<a
href=
"https://issues.jenkins-ci.org/browse/JENKINS-7813"
>
issue 7813
</a>
)
<li
class=
bug
>
Quoted label expression can result into dead executors (throwing exception)
(
<a
href=
"https://issues.jenkins-ci.org/browse/JENKINS-17128"
>
issue 17128
</a>
)
<li
class=
bug
>
ChangeLog should produce some output even if some (plugin) annotator fails
(
<a
href=
"https://issues.jenkins-ci.org/browse/JENKINS-17084"
>
issue 17084
</a>
)
<li
class=
bug
>
View name should not allow "..".
(
<a
href=
"https://issues.jenkins-ci.org/browse/JENKINS-16608"
>
issue 16608
</a>
)
</ul>
</div>
<!--=TRUNK-END=-->
...
...
core/src/main/java/hudson/scheduler/CronTab.java
浏览文件 @
ccf8427a
...
...
@@ -420,8 +420,7 @@ public final class CronTab {
// this rank has a sparse entry.
// if we have a sparse rank, one of them better be the left-most.
if
(
i
>
0
)
return
"Do you really mean \"every minute\" when you say \""
+
spec
+
"\"? "
+
"Perhaps you meant \"0 "
+
spec
.
substring
(
spec
.
indexOf
(
' '
)+
1
)+
"\""
;
return
Messages
.
CronTab_do_you_really_mean_every_minute_when_you
(
spec
,
"0 "
+
spec
.
substring
(
spec
.
indexOf
(
' '
)+
1
));
// once we find a sparse rank, upper ranks don't matter
return
null
;
}
...
...
core/src/main/java/hudson/scm/ChangeLogSet.java
浏览文件 @
ccf8427a
...
...
@@ -211,7 +211,9 @@ public abstract class ChangeLogSet<T extends ChangeLogSet.Entry> implements Iter
try
{
a
.
annotate
(
parent
.
build
,
this
,
markup
);
}
catch
(
Exception
e
)
{
LOGGER
.
fine
(
"ChangeLogAnnotator "
+
a
.
toString
()
+
" failed to annotate message '"
+
getMsg
()
+
"'; "
+
e
.
getMessage
());
LOGGER
.
info
(
"ChangeLogAnnotator "
+
a
.
toString
()
+
" failed to annotate message '"
+
getMsg
()
+
"'; "
+
e
.
getMessage
());
}
catch
(
Error
e
)
{
LOGGER
.
severe
(
"ChangeLogAnnotator "
+
a
.
toString
()
+
" failed to annotate message '"
+
getMsg
()
+
"'; "
+
e
.
getMessage
());
}
return
markup
.
toString
(
false
);
...
...
core/src/main/java/jenkins/model/Jenkins.java
浏览文件 @
ccf8427a
...
...
@@ -1570,6 +1570,7 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro
*/
public
Label
getLabel
(
String
expr
)
{
if
(
expr
==
null
)
return
null
;
expr
=
hudson
.
util
.
QuotedStringTokenizer
.
unquote
(
expr
);
while
(
true
)
{
Label
l
=
labels
.
get
(
expr
);
if
(
l
!=
null
)
...
...
@@ -2921,6 +2922,8 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro
if
(
name
==
null
||
name
.
length
()==
0
)
throw
new
Failure
(
Messages
.
Hudson_NoName
());
if
(
".."
.
equals
(
name
.
trim
()))
throw
new
Failure
(
Messages
.
Jenkins_NotAllowedName
(
".."
));
for
(
int
i
=
0
;
i
<
name
.
length
();
i
++
)
{
char
ch
=
name
.
charAt
(
i
);
if
(
Character
.
isISOControl
(
ch
))
{
...
...
core/src/main/resources/hudson/model/Messages.properties
浏览文件 @
ccf8427a
...
...
@@ -344,3 +344,5 @@ BuildAuthorizationToken.InvalidTokenProvided=Invalid token provided.
Jenkins.CheckDisplayName.NameNotUniqueWarning
=
The display name, "{0}", is used as a name by a job and could cause confusing search results.
Jenkins.CheckDisplayName.DisplayNameNotUniqueWarning
=
The display name, "{0}", is already in use by another job and could cause confusion and delay.
Jenkins.NotAllowedName
=
"{0}"
is not allowed name
\ No newline at end of file
core/src/main/resources/hudson/model/Messages_ja.properties
浏览文件 @
ccf8427a
...
...
@@ -333,3 +333,4 @@ ManageJenkinsAction.DisplayName=Jenkins\u306e\u7ba1\u7406
Jenkins.CheckDisplayName.NameNotUniqueWarning
=
\u8868\u
793a
\u7528\u
30d7
\u
30ed
\u
30b8
\u
30a7
\u
30af
\u
30c8
\u
540d "{0}"
\u
306f
\u
30d7
\u
30ed
\u
30b8
\u
30a7
\u
30af
\u
30c8
\u
540d
\u3068\u3057\u3066\u
65e2
\u
306b
\u
4f7f
\u7528\u3055\u
308c
\u3066\u3044\u
308b
\u
305f
\u3081\u3001\u
691c
\u
7d22
\u
7d50
\u
679c
\u3067\u
533a
\u5225\u3067\u
304d
\u
306a
\u3044\u3053\u3068\u
304c
\u3042\u
308a
\u
307e
\u3059\u3002
Jenkins.CheckDisplayName.DisplayNameNotUniqueWarning
=
\u8868\u
793a
\u7528\u
30d7
\u
30ed
\u
30b8
\u
30a7
\u
30af
\u
30c8
\u
540d "{0}"
\u
306f
\u
4ed6
\u
306e
\u
30d7
\u
30ed
\u
30b8
\u
30a7
\u
30af
\u
30c8
\u3067\u
4f7f
\u7528\u3055\u
308c
\u3066\u3044\u
308b
\u
305f
\u3081\u3001
\u
533a
\u5225\u3067\u
304d
\u
306a
\u3044\u3053\u3068\u
304c
\u3042\u
308a
\u
307e
\u3059\u3002
Jenkins.NotAllowedName
=
"{0}"
\u
306f
\u
8a31
\u
53ef
\u3055\u
308c
\u
306a
\u3044\u
540d
\u
524d
\u3067\u3059\u3002
core/src/main/resources/hudson/scheduler/Messages.properties
浏览文件 @
ccf8427a
...
...
@@ -23,4 +23,5 @@
BaseParser.StartEndReversed
=
You mean {0}-{1}?
BaseParser.MustBePositive
=
step must be positive, but found {0}
BaseParser.OutOfRange
=
{0} is an invalid value. Must be within {1} and {2}
CronTabList.InvalidInput
=
Invalid input: "{0}": {1}
\ No newline at end of file
CronTab.do_you_really_mean_every_minute_when_you
=
Do you really mean "every minute" when you say "{0}"? Perhaps you meant "{1}"
CronTabList.InvalidInput
=
Invalid input: "{0}": {1}
core/src/test/java/hudson/scheduler/CronTabTest.java
浏览文件 @
ccf8427a
...
...
@@ -173,6 +173,17 @@ public class CronTabTest {
compare
(
answer
,
x
.
floor
(
c
));
}
@Test
public
void
checkSanity
()
throws
Exception
{
assertEquals
(
Messages
.
CronTab_do_you_really_mean_every_minute_when_you
(
"* * * * *"
,
"0 * * * *"
),
new
CronTab
(
"* * * * *"
).
checkSanity
());
assertEquals
(
null
,
new
CronTab
(
"0 * * * *"
).
checkSanity
());
assertEquals
(
null
,
new
CronTab
(
"0 3 * * *"
).
checkSanity
());
assertEquals
(
null
,
new
CronTab
(
"H H(0-2) * * *"
,
Hash
.
from
(
"stuff"
)).
checkSanity
());
assertEquals
(
Messages
.
CronTab_do_you_really_mean_every_minute_when_you
(
"* 0 * * *"
,
"0 0 * * *"
),
new
CronTab
(
"* 0 * * *"
).
checkSanity
());
assertEquals
(
Messages
.
CronTab_do_you_really_mean_every_minute_when_you
(
"* 6,18 * * *"
,
"0 6,18 * * *"
),
new
CronTab
(
"* 6,18 * * *"
).
checkSanity
());
// dubious; could be improved:
assertEquals
(
Messages
.
CronTab_do_you_really_mean_every_minute_when_you
(
"* * 3 * *"
,
"0 * 3 * *"
),
new
CronTab
(
"* * 3 * *"
).
checkSanity
());
}
/**
* Humans can't easily see difference in two {@link Calendar}s, do help the diagnosis by using {@link DateFormat}.
*/
...
...
test/src/test/java/hudson/model/ViewTest.java
浏览文件 @
ccf8427a
...
...
@@ -35,6 +35,9 @@ import org.jvnet.hudson.test.HudsonTestCase;
import
org.w3c.dom.Text
;
import
static
hudson
.
model
.
Messages
.
Hudson_ViewName
;
import
static
junit
.
framework
.
TestCase
.
assertEquals
;
import
static
junit
.
framework
.
TestCase
.
assertNotNull
;
import
static
junit
.
framework
.
TestCase
.
fail
;
/**
* @author Kohsuke Kawaguchi
...
...
@@ -46,7 +49,7 @@ public class ViewTest extends HudsonTestCase {
assertNotNull
(
new
WebClient
().
goTo
(
"/"
).
getWebResponse
().
getResponseHeaderValue
(
"X-Hudson"
));
}
/**
/**
* Creating two views with the same name.
*/
@Email
(
"http://d.hatena.ne.jp/ssogabe/20090101/1230744150"
)
...
...
@@ -64,7 +67,7 @@ public class ViewTest extends HudsonTestCase {
submit
(
form
);
fail
(
"shouldn't be allowed to create two views of the same name."
);
}
catch
(
FailingHttpStatusCodeException
e
)
{
assertEquals
(
400
,
e
.
getStatusCode
());
assertEquals
(
400
,
e
.
getStatusCode
());
}
}
...
...
@@ -100,24 +103,24 @@ public class ViewTest extends HudsonTestCase {
assertEquals
(((
ProxyView
)
proxyView
).
getProxiedViewName
(),
"listView"
);
assertEquals
(((
ProxyView
)
proxyView
).
getProxiedView
(),
listView
);
}
public
void
testDeleteView
()
throws
Exception
{
WebClient
wc
=
new
WebClient
();
ListView
v
=
new
ListView
(
"list"
,
jenkins
);
jenkins
.
addView
(
v
);
HtmlPage
delete
=
wc
.
getPage
(
v
,
"delete"
);
submit
(
delete
.
getFormByName
(
"delete"
));
assertNull
(
jenkins
.
getView
(
"list"
));
User
user
=
User
.
get
(
"user"
,
true
);
MyViewsProperty
p
=
user
.
getProperty
(
MyViewsProperty
.
class
);
v
=
new
ListView
(
"list"
,
p
);
p
.
addView
(
v
);
delete
=
wc
.
getPage
(
v
,
"delete"
);
submit
(
delete
.
getFormByName
(
"delete"
));
assertNull
(
p
.
getView
(
"list"
));
WebClient
wc
=
new
WebClient
();
ListView
v
=
new
ListView
(
"list"
,
jenkins
);
jenkins
.
addView
(
v
);
HtmlPage
delete
=
wc
.
getPage
(
v
,
"delete"
);
submit
(
delete
.
getFormByName
(
"delete"
));
assertNull
(
jenkins
.
getView
(
"list"
));
User
user
=
User
.
get
(
"user"
,
true
);
MyViewsProperty
p
=
user
.
getProperty
(
MyViewsProperty
.
class
);
v
=
new
ListView
(
"list"
,
p
);
p
.
addView
(
v
);
delete
=
wc
.
getPage
(
v
,
"delete"
);
submit
(
delete
.
getFormByName
(
"delete"
));
assertNull
(
p
.
getView
(
"list"
));
}
@Bug
(
9367
)
...
...
@@ -137,4 +140,18 @@ public class ViewTest extends HudsonTestCase {
webClient
.
setJavaScriptEnabled
(
false
);
assertAllImageLoadSuccessfully
(
webClient
.
goTo
(
"asynchPeople"
));
}
@Bug
(
16608
)
public
void
testNotAlloedName
()
throws
Exception
{
HtmlForm
form
=
new
WebClient
().
goTo
(
"newView"
).
getFormByName
(
"createItem"
);
form
.
getInputByName
(
"name"
).
setValueAttribute
(
".."
);
form
.
getRadioButtonsByName
(
"mode"
).
get
(
0
).
setChecked
(
true
);
try
{
submit
(
form
);
fail
(
"\"..\" should not be allowed."
);
}
catch
(
FailingHttpStatusCodeException
e
)
{
assertEquals
(
400
,
e
.
getStatusCode
());
}
}
}
test/src/test/java/hudson/model/labels/LabelExpressionTest.java
浏览文件 @
ccf8427a
...
...
@@ -196,6 +196,10 @@ public class LabelExpressionTest extends HudsonTestCase {
public
void
testQuote
()
{
Label
l
=
jenkins
.
getLabel
(
"\"abc\\\\\\\"def\""
);
assertEquals
(
"abc\\\"def"
,
l
.
getName
());
l
=
jenkins
.
getLabel
(
"label1||label2"
);
// create label expression
l
=
jenkins
.
getLabel
(
"\"label1||label2\""
);
assertEquals
(
"label1||label2"
,
l
.
getName
());
}
/**
...
...
test/src/test/java/hudson/scm/ChangeLogSetTest.java
0 → 100644
浏览文件 @
ccf8427a
package
hudson.scm
;
import
hudson.Extension
;
import
hudson.MarkupText
;
import
hudson.model.AbstractBuild
;
import
hudson.scm.ChangeLogSet.Entry
;
import
org.jvnet.hudson.test.Bug
;
import
org.jvnet.hudson.test.FakeChangeLogSCM.EntryImpl
;
import
org.jvnet.hudson.test.HudsonTestCase
;
public
class
ChangeLogSetTest
extends
HudsonTestCase
{
@Bug
(
17084
)
public
void
testCatchingExceptionDuringAnnotation
()
throws
Exception
{
EntryImpl
change
=
new
EntryImpl
();
change
.
setParent
(
ChangeLogSet
.
createEmpty
(
null
));
// otherwise test would actually test only NPE thrown when accessing paret.build
boolean
notCaught
=
false
;
try
{
change
.
getMsgAnnotated
();
}
catch
(
Throwable
t
)
{
notCaught
=
true
;
}
assertEquals
((
new
EntryImpl
()).
getMsg
(),
change
.
getMsg
());
assertEquals
(
false
,
notCaught
);
}
@Extension
public
static
final
class
ThrowExceptionChangeLogAnnotator
extends
ChangeLogAnnotator
{
@Override
public
void
annotate
(
AbstractBuild
<?,?>
build
,
Entry
change
,
MarkupText
text
)
{
throw
new
RuntimeException
();
}
}
@Extension
public
static
final
class
ThrowErrorChangeLogAnnotator
extends
ChangeLogAnnotator
{
@Override
public
void
annotate
(
AbstractBuild
<?,?>
build
,
Entry
change
,
MarkupText
text
)
{
throw
new
Error
();
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录