From a76ffb08afe1c9577711618b148c6b991815369f Mon Sep 17 00:00:00 2001 From: Stephen Connolly Date: Tue, 7 Mar 2017 16:23:28 +0000 Subject: [PATCH] [JENKINS-42511] Pick up the ComputedFolder API changes --- pom.xml | 4 +- .../jenkins/branch/MultiBranchProject.java | 318 +++++++++--------- .../jenkins/branch/OrganizationFolder.java | 101 +++--- 3 files changed, 219 insertions(+), 204 deletions(-) diff --git a/pom.xml b/pom.xml index 6b69a4b2..0604bd83 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ 1.642.3 - 2.0.7 + 2.1.0 @@ -93,7 +93,7 @@ org.jenkins-ci.plugins cloudbees-folder - 5.18 + 6.0.1 org.jenkins-ci.plugins diff --git a/src/main/java/jenkins/branch/MultiBranchProject.java b/src/main/java/jenkins/branch/MultiBranchProject.java index 5c31d1f8..93c75d3d 100644 --- a/src/main/java/jenkins/branch/MultiBranchProject.java +++ b/src/main/java/jenkins/branch/MultiBranchProject.java @@ -1271,11 +1271,11 @@ private int processHeadCreate(SCMHeadEvent event, TaskListener global, String } if (haveMatch) { long start = System.currentTimeMillis(); - try (StreamTaskListener listener = p.getComputation().createEventsListener()) { + try (StreamTaskListener listener = p.getComputation().createEventsListener(); + ChildObserver childObserver = p.openEventsChildObserver()) { try { listener.getLogger().format("[%tc] Received %s %s event from %s with timestamp %tc%n", start, eventClass, eventType, eventOrigin, eventTimestamp); - ChildObserver childObserver = p.createEventsChildObserver(); for (SCMSource source : p.getSCMSources()) { if (event.isMatch(source)) { source.fetch( @@ -1507,11 +1507,11 @@ private int processHeadUpdate(SCMHeadEvent event, TaskListener global, String matchCount++; global.getLogger().format("Found match against %s%n", pFullName); long start = System.currentTimeMillis(); - try (StreamTaskListener listener = p.getComputation().createEventsListener()) { + try (StreamTaskListener listener = p.getComputation().createEventsListener(); + ChildObserver childObserver = p.openEventsChildObserver()) { try { listener.getLogger().format("[%tc] Received %s %s event from %s with timestamp %tc%n", start, eventClass, eventType, eventOrigin, eventTimestamp); - ChildObserver childObserver = p.createEventsChildObserver(); for (Map.Entry m : matches.entrySet()) { m.getKey().fetch( p.getSCMSourceCriteria(m.getKey()), @@ -1597,10 +1597,10 @@ p.new SCMHeadObserverImpl( } if (haveMatch) { long start = System.currentTimeMillis(); - try (StreamTaskListener listener = p.getComputation().createEventsListener()) { + try (StreamTaskListener listener = p.getComputation().createEventsListener(); + ChildObserver childObserver = p.openEventsChildObserver()) { listener.getLogger().format("[%tc] Received %s %s event from %s with timestamp %tc%n", start, eventClass, eventType, eventOrigin, eventTimestamp); - ChildObserver childObserver = p.createEventsChildObserver(); try { for (SCMSource source : p.getSCMSources()) { if (event.isMatch(source)) { @@ -1883,108 +1883,92 @@ public SCMHeadObserverImpl(@NonNull SCMSource source, @NonNull ChildObserver

* {@inheritDoc} */ @Override - public void observe(@NonNull SCMHead head, @NonNull SCMRevision revision) { + public void observe(@NonNull SCMHead head, @NonNull SCMRevision revision) throws IOException, InterruptedException { Branch branch = newBranch(source, head); String rawName = branch.getName(); String encodedName = branch.getEncodedName(); P project = observer.shouldUpdate(encodedName); - Branch origBranch; - if (project == null) { - origBranch = null; - } else { - if (!_factory.isProject(project)) { - listener.getLogger().println("Detected unsupported subitem " - + ModelHyperlinkNote.encodeTo(project) + ", skipping"); - return; - } - origBranch = _factory.getBranch(project); - if (!(origBranch instanceof Branch.Dead)) { - if (!source.getId().equals(origBranch.getSourceId())) { - // check who has priority - int ourPriority = Integer.MAX_VALUE; - int oldPriority = Integer.MAX_VALUE; - int p = 1; - for (BranchSource s : sources) { - String sId = s.getSource().getId(); - if (sId.equals(source.getId())) { - ourPriority = p; - } - if (sId.equals(origBranch.getSourceId())) { - oldPriority = p; + try { + Branch origBranch; + if (project == null) { + origBranch = null; + } else { + if (!_factory.isProject(project)) { + listener.getLogger().println("Detected unsupported subitem " + + ModelHyperlinkNote.encodeTo(project) + ", skipping"); + return; + } + origBranch = _factory.getBranch(project); + if (!(origBranch instanceof Branch.Dead)) { + if (!source.getId().equals(origBranch.getSourceId())) { + // check who has priority + int ourPriority = Integer.MAX_VALUE; + int oldPriority = Integer.MAX_VALUE; + int p = 1; + for (BranchSource s : sources) { + String sId = s.getSource().getId(); + if (sId.equals(source.getId())) { + ourPriority = p; + } + if (sId.equals(origBranch.getSourceId())) { + oldPriority = p; + } + p++; } - p++; - } - if (oldPriority < ourPriority) { - listener.getLogger().println( - "Ignoring " + ModelHyperlinkNote.encodeTo(project) + " from source #" - + ourPriority + " as source #" + - oldPriority + " owns the branch name"); - return; - } else { - if (oldPriority == Integer.MAX_VALUE) { + if (oldPriority < ourPriority) { listener.getLogger().println( - "Takeover for " + ModelHyperlinkNote.encodeTo(project) + " by source #" - + ourPriority - + " from source that no longer exists"); + "Ignoring " + ModelHyperlinkNote.encodeTo(project) + " from source #" + + ourPriority + " as source #" + + oldPriority + " owns the branch name"); + return; } else { - listener.getLogger().println( - "Takeover for " + ModelHyperlinkNote.encodeTo(project) + " by source #" - + ourPriority - + " from source #" + oldPriority); + if (oldPriority == Integer.MAX_VALUE) { + listener.getLogger().println( + "Takeover for " + ModelHyperlinkNote.encodeTo(project) + " by source #" + + ourPriority + + " from source that no longer exists"); + } else { + listener.getLogger().println( + "Takeover for " + ModelHyperlinkNote.encodeTo(project) + " by source #" + + ourPriority + + " from source #" + oldPriority); + } } } } } - } - Action[] revisionActions = new Action[0]; - boolean headActionsFetched = false; - try { - branch.setActions(source.fetchActions(head, event, listener)); - headActionsFetched = true; - } catch (IOException | InterruptedException e) { - e.printStackTrace(listener.error("Could not fetch metadata of branch %s", rawName)); - } - try { - List actions = source.fetchActions(revision, event, listener); - revisionActions = actions.toArray(new Action[actions.size()]); - } catch (IOException | InterruptedException e) { - e.printStackTrace(listener.error("Could not fetch metadata for revision %s of branch %s", - revision, rawName)); - } - if (project != null) { - boolean rebuild = (origBranch instanceof Branch.Dead && !(branch instanceof Branch.Dead)) - || !(source.getId().equals(origBranch.getSourceId())); - if (!headActionsFetched) { - // we didn't fetch them so replicate previous actions - branch.setActions(origBranch.getActions()); + Action[] revisionActions = new Action[0]; + boolean headActionsFetched = false; + try { + branch.setActions(source.fetchActions(head, event, listener)); + headActionsFetched = true; + } catch (IOException | InterruptedException e) { + e.printStackTrace(listener.error("Could not fetch metadata of branch %s", rawName)); } - boolean needSave = !branch.equals(origBranch) || !branch.getActions().equals(origBranch.getActions()); - _factory.decorate(_factory.setBranch(project, branch)); - if (rebuild) { - listener.getLogger().format( - "%s reopened: %s (%s)%n", - StringUtils.defaultIfEmpty(head.getPronoun(), "Branch"), - rawName, - revision - ); - needSave = true; - if (isAutomaticBuild(source, head)) { - scheduleBuild( - _factory, - project, - revision, - listener, + try { + List actions = source.fetchActions(revision, event, listener); + revisionActions = actions.toArray(new Action[actions.size()]); + } catch (IOException | InterruptedException e) { + e.printStackTrace(listener.error("Could not fetch metadata for revision %s of branch %s", + revision, rawName)); + } + if (project != null) { + boolean rebuild = (origBranch instanceof Branch.Dead && !(branch instanceof Branch.Dead)) + || !(source.getId().equals(origBranch.getSourceId())); + if (!headActionsFetched) { + // we didn't fetch them so replicate previous actions + branch.setActions(origBranch.getActions()); + } + boolean needSave = + !branch.equals(origBranch) || !branch.getActions().equals(origBranch.getActions()); + _factory.decorate(_factory.setBranch(project, branch)); + if (rebuild) { + listener.getLogger().format( + "%s reopened: %s (%s)%n", + StringUtils.defaultIfEmpty(head.getPronoun(), "Branch"), rawName, - causeFactory.create(), - revisionActions + revision ); - } else { - listener.getLogger().format("No automatic builds for %s%n", rawName); - } - } else if (revision.isDeterministic()) { - SCMRevision lastBuild = _factory.getRevision(project); - if (!revision.equals(lastBuild)) { - listener.getLogger().format("Changes detected: %s (%s → %s)%n", rawName, lastBuild, revision); needSave = true; if (isAutomaticBuild(source, head)) { scheduleBuild( @@ -1999,16 +1983,11 @@ public void observe(@NonNull SCMHead head, @NonNull SCMRevision revision) { } else { listener.getLogger().format("No automatic builds for %s%n", rawName); } - } else { - listener.getLogger().format("No changes detected: %s (still at %s)%n", rawName, revision); - } - } else { - // fall back to polling when we have a non-deterministic revision/hash. - SCMTriggerItem scmProject = SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(project); - if (scmProject != null) { - PollingResult pollingResult = scmProject.poll(listener); - if (pollingResult.hasChanges()) { - listener.getLogger().format("Changes detected: %s%n", rawName); + } else if (revision.isDeterministic()) { + SCMRevision lastBuild = _factory.getRevision(project); + if (!revision.equals(lastBuild)) { + listener.getLogger() + .format("Changes detected: %s (%s → %s)%n", rawName, lastBuild, revision); needSave = true; if (isAutomaticBuild(source, head)) { scheduleBuild( @@ -2024,66 +2003,95 @@ public void observe(@NonNull SCMHead head, @NonNull SCMRevision revision) { listener.getLogger().format("No automatic builds for %s%n", rawName); } } else { - listener.getLogger().format("No changes detected: %s%n", rawName); + listener.getLogger().format("No changes detected: %s (still at %s)%n", rawName, revision); + } + } else { + // fall back to polling when we have a non-deterministic revision/hash. + SCMTriggerItem scmProject = SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(project); + if (scmProject != null) { + PollingResult pollingResult = scmProject.poll(listener); + if (pollingResult.hasChanges()) { + listener.getLogger().format("Changes detected: %s%n", rawName); + needSave = true; + if (isAutomaticBuild(source, head)) { + scheduleBuild( + _factory, + project, + revision, + listener, + rawName, + causeFactory.create(), + revisionActions + ); + } else { + listener.getLogger().format("No automatic builds for %s%n", rawName); + } + } else { + listener.getLogger().format("No changes detected: %s%n", rawName); + } } } - } + try { + if (needSave) { + project.save(); + } + } catch (IOException e) { + e.printStackTrace(listener.error("Could not save changes to " + rawName)); + } + return; + } + if (!observer.mayCreate(encodedName)) { + listener.getLogger().println("Ignoring duplicate branch project " + rawName); + return; + } + try (ChildNameGenerator.Trace trace = ChildNameGenerator.beforeCreateItem( + MultiBranchProject.this, encodedName, branch.getName() + )) { + if (getItem(encodedName) != null) { + throw new IllegalStateException( + "JENKINS-42511: attempted to redundantly create " + encodedName + " in " + + MultiBranchProject.this); + } + project = _factory.newInstance(branch); + } + if (!project.getName().equals(encodedName)) { + throw new IllegalStateException( + "Name of created project " + project + " did not match expected " + encodedName); + } + // HACK ALERT + // ========== + // We don't want to trigger a save, so we will do some trickery to ensure that observer.created(project) + // performs the save + BulkChange bc = new BulkChange(project); try { - if (needSave) { - project.save(); + if (project.getDisplayNameOrNull() == null && !rawName.equals(encodedName)) { + project.setDisplayName(rawName); } } catch (IOException e) { - e.printStackTrace(listener.error("Could not save changes to " + rawName)); - } - return; - } - if (!observer.mayCreate(encodedName)) { - listener.getLogger().println("Ignoring duplicate branch project " + rawName); - return; - } - try (ChildNameGenerator.Trace trace = ChildNameGenerator.beforeCreateItem( - MultiBranchProject.this, encodedName, branch.getName() - )){ - if (getItem(encodedName) != null) { - throw new IllegalStateException("JENKINS-42511: attempted to redundantly create " + encodedName + " in " + MultiBranchProject.this); + // ignore even if it does happen we didn't want a save + } finally { + bc.abort(); } - project = _factory.newInstance(branch); - } - if (!project.getName().equals(encodedName)) { - throw new IllegalStateException( - "Name of created project " + project + " did not match expected " + encodedName); - } - // HACK ALERT - // ========== - // We don't want to trigger a save, so we will do some trickery to ensure that observer.created(project) - // performs the save - BulkChange bc = new BulkChange(project); - try { - if (project.getDisplayNameOrNull() == null && !rawName.equals(encodedName)) { - project.setDisplayName(rawName); + // decorate contract is to ensure it dowes not trigger a save + _factory.decorate(project); + // ok it is now up to the observer to ensure it does the actual save. + observer.created(project); + if (isAutomaticBuild(source, head)) { + scheduleBuild( + _factory, + project, + revision, + listener, + rawName, + causeFactory.create(), + revisionActions + ); + } else { + listener.getLogger().format("No automatic builds for %s%n", rawName); } - } catch (IOException e) { - // ignore even if it does happen we didn't want a save } finally { - bc.abort(); - } - // decorate contract is to ensure it dowes not trigger a save - _factory.decorate(project); - // ok it is now up to the observer to ensure it does the actual save. - observer.created(project); - if (isAutomaticBuild(source, head)) { - scheduleBuild( - _factory, - project, - revision, - listener, - rawName, - causeFactory.create(), - revisionActions - ); - } else { - listener.getLogger().format("No automatic builds for %s%n", rawName); + observer.completed(encodedName); } } } diff --git a/src/main/java/jenkins/branch/OrganizationFolder.java b/src/main/java/jenkins/branch/OrganizationFolder.java index 358e8d52..cfb16383 100644 --- a/src/main/java/jenkins/branch/OrganizationFolder.java +++ b/src/main/java/jenkins/branch/OrganizationFolder.java @@ -951,8 +951,8 @@ public void onSCMHeadEvent(SCMHeadEvent event) { global.getLogger() .format("Project %s does not have a corresponding sub-project%n", p.getFullName()); - try (StreamTaskListener listener = p.getComputation().createEventsListener()) { - ChildObserver childObserver = p.createEventsChildObserver(); + try (StreamTaskListener listener = p.getComputation().createEventsListener(); + ChildObserver childObserver = p.openEventsChildObserver()) { long start = System.currentTimeMillis(); listener.getLogger() .format("[%tc] Received %s %s event from %s with timestamp %tc%n", @@ -1134,8 +1134,8 @@ public void onSCMSourceEvent(SCMSourceEvent event) { } if (haveMatch) { matchCount++; - try (StreamTaskListener listener = p.getComputation().createEventsListener()) { - ChildObserver childObserver = p.createEventsChildObserver(); + try (StreamTaskListener listener = p.getComputation().createEventsListener(); + ChildObserver childObserver = p.openEventsChildObserver()) { long start = System.currentTimeMillis(); listener.getLogger() .format("[%tc] Received %s %s event from %s with timestamp %tc%n", @@ -1288,57 +1288,64 @@ public void complete() throws IllegalStateException, IOException, InterruptedExc } String folderName = NameEncoder.encode(projectName); MultiBranchProject existing = observer.shouldUpdate(folderName); - if (existing != null) { - BulkChange bc = new BulkChange(existing); - try { - existing.setSourcesList(createBranchSources()); - existing.setOrphanedItemStrategy(getOrphanedItemStrategy()); - factory.updateExistingProject(existing, attributes, listener); - ProjectNameProperty property = - existing.getProperties().get(ProjectNameProperty.class); - if (property == null || !projectName.equals(property.getName())) { - existing.getProperties().remove(ProjectNameProperty.class); - existing.addProperty(new ProjectNameProperty(projectName)); + try { + if (existing != null) { + BulkChange bc = new BulkChange(existing); + try { + existing.setSourcesList(createBranchSources()); + existing.setOrphanedItemStrategy(getOrphanedItemStrategy()); + factory.updateExistingProject(existing, attributes, listener); + ProjectNameProperty property = + existing.getProperties().get(ProjectNameProperty.class); + if (property == null || !projectName.equals(property.getName())) { + existing.getProperties().remove(ProjectNameProperty.class); + existing.addProperty(new ProjectNameProperty(projectName)); + } + } finally { + bc.commit(); } - } finally { - bc.commit(); + existing.scheduleBuild(); + return; } - existing.scheduleBuild(); - return; - } - if (!observer.mayCreate(folderName)) { - listener.getLogger().println("Ignoring duplicate child " + projectName + " named " + folderName); - return; - } - MultiBranchProject project; - try (ChildNameGenerator.Trace trace = ChildNameGenerator.beforeCreateItem( - OrganizationFolder.this, folderName, projectName - )) { - if (getItem(folderName) != null) { - throw new IllegalStateException("JENKINS-42511: attempted to redundantly create " + folderName + " in " + OrganizationFolder.this); + if (!observer.mayCreate(folderName)) { + listener.getLogger() + .println("Ignoring duplicate child " + projectName + " named " + folderName); + return; } - project = factory.createNewProject( - OrganizationFolder.this, folderName, sources, attributes, listener - ); - } - BulkChange bc = new BulkChange(project); - try { - if (!projectName.equals(folderName)) { - project.setDisplayName(projectName); + MultiBranchProject project; + try (ChildNameGenerator.Trace trace = ChildNameGenerator.beforeCreateItem( + OrganizationFolder.this, folderName, projectName + )) { + if (getItem(folderName) != null) { + throw new IllegalStateException( + "JENKINS-42511: attempted to redundantly create " + folderName + " in " + + OrganizationFolder.this); + } + project = factory.createNewProject( + OrganizationFolder.this, folderName, sources, attributes, listener + ); } - project.addProperty(new ProjectNameProperty(projectName)); - project.setOrphanedItemStrategy(getOrphanedItemStrategy()); - project.getSourcesList().addAll(createBranchSources()); + BulkChange bc = new BulkChange(project); try { - project.addTrigger(new PeriodicFolderTrigger("1d")); - } catch (ANTLRException x) { - throw new IllegalStateException(x); + if (!projectName.equals(folderName)) { + project.setDisplayName(projectName); + } + project.addProperty(new ProjectNameProperty(projectName)); + project.setOrphanedItemStrategy(getOrphanedItemStrategy()); + project.getSourcesList().addAll(createBranchSources()); + try { + project.addTrigger(new PeriodicFolderTrigger("1d")); + } catch (ANTLRException x) { + throw new IllegalStateException(x); + } + } finally { + bc.commit(); } + observer.created(project); + project.scheduleBuild(); } finally { - bc.commit(); + observer.completed(folderName); } - observer.created(project); - project.scheduleBuild(); } catch (InterruptedException | IOException x) { throw x; } catch (Exception x) {