Change By: Zack Elan (25/Jul/12 10:18 PM)
Description: Steps to reproduce:
- Have a build job that uses the repo plugin
- Run that job
 such that it pulls down changes  where one or more  commits had no files changed (these seem to be merge commits in our case)  projects were added/removed from the manifest
- Access that job through the Jenkins API

Behavior:
- Going directly to the build's page in Jenkins works as I expect. However, I'm using a script that accesses Jenkins through its API. When I tack on '/api/json' or '/api/xml' to the URL, I get the following exception:

Caused by: java.lang.NullPointerException
    at hudson.plugins.repo.ChangeLogEntry$1.size(ChangeLogEntry.java:296)
    at java.util.AbstractList$Itr.hasNext(AbstractList.java:339)
    at org.kohsuke.stapler.export.Property.writeValue(Property.java:180)
    at org.kohsuke.stapler.export.Property.writeValue(Property.java:136)
    at org.kohsuke.stapler.export.Property.writeTo(Property.java:113)
    at org.kohsuke.stapler.export.Model.writeNestedObjectTo(Model.java:179)
    at org.kohsuke.stapler.export.Model.writeNestedObjectTo(Model.java:176)
    at org.kohsuke.stapler.export.Property.writeValue(Property.java:231)
    at org.kohsuke.stapler.export.Property.writeValue(Property.java:168)
    at org.kohsuke.stapler.export.Property.writeValue(Property.java:136)
    at org.kohsuke.stapler.export.Property.writeTo(Property.java:113)
    at org.kohsuke.stapler.export.Model.writeNestedObjectTo(Model.java:179)
    at org.kohsuke.stapler.export.Model.writeNestedObjectTo(Model.java:176)
    at org.kohsuke.stapler.export.Property.writeValue(Property.java:231)
    at org.kohsuke.stapler.export.Property.writeValue(Property.java:136)
    at org.kohsuke.stapler.export.Property.writeTo(Property.java:113)
    at org.kohsuke.stapler.export.Model.writeNestedObjectTo(Model.java:179)
    at org.kohsuke.stapler.export.Model.writeNestedObjectTo(Model.java:176)
    at org.kohsuke.stapler.export.Model.writeNestedObjectTo(Model.java:176)
    at org.kohsuke.stapler.export.Model.writeTo(Model.java:152)
    at org.kohsuke.stapler.ResponseImpl.serveExposedBean(ResponseImpl.java:200)
    at hudson.model.Api.doJson(Api.java:181)
    at sun.reflect.GeneratedMethodAccessor980.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:288)
    at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:151)
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:90)
    at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:111)
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:574)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:659)
    at org.kohsuke.stapler.MetaClass$4.doDispatch(MetaClass.java:203)
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:574)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:659)
    at org.kohsuke.stapler.MetaClass$12.dispatch(MetaClass.java:384)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:574)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:659)
    at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:241)
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:574)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:659)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:488)
    at org.kohsuke.stapler.Stapler.service(Stapler.java:162)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)

Looking at the code (git rev 3fb046cc), I see line 296 is "return modifiedFiles.size()" in this method:

@Override
public Collection<String> getAffectedPaths() {
return new AbstractList<String>() {
@Override
public String get(final int index) {
return modifiedFiles.get(index).getPath();
}

@Override
public int size() {
return modifiedFiles.size();
}
};
}

If modifiedFiles is null, it would cause the behavior I'm seeing.
 In ChangeLog.java there appear to be 2 places where null is passed in as the modifiedFiles of ChangeLogEntry - lines 125 and 133, handling manifest adds and removals.
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to