Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@
import org.kohsuke.stapler.StaplerResponse2;
import org.kohsuke.stapler.verb.POST;

import com.cloudbees.hudson.plugins.folder.SaveAllJobsAction;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gratuitous import



/**
* A mutable folder.
*/
Expand Down Expand Up @@ -414,7 +417,7 @@ public DescriptorImpl getDescriptor() {
@Override public void remove(TopLevelItem item) throws IOException, IllegalArgumentException {
items.remove(item.getName());
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gratuitous whitespace

@Extension
public static class DescriptorImpl extends AbstractFolderDescriptor {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.cloudbees.hudson.plugins.folder;

import hudson.model.Action;
import hudson.model.Job;
import java.io.IOException;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

public class SaveAllJobsAction implements Action {

private final Folder folder;

public SaveAllJobsAction(Folder folder) {
this.folder = folder;
}

@Override
public String getIconFileName() {
return "save.png"; // small save icon
}

@Override
public String getDisplayName() {
return "Save All Jobs";
}

@Override
public String getUrlName() {
return "save-all-jobs";
}

// Called when the form is submitted
public void doIndex(StaplerRequest req, StaplerResponse rsp) throws IOException {
doSaveAll();
rsp.sendRedirect2("../"); // redirect back to folder page after saving
}

// Actual saving logic
public void doSaveAll() throws IOException {
for (Job<?, ?> job : folder.getAllJobs()) {
job.save();
}
}

Check warning on line 43 in src/main/java/com/cloudbees/hudson/plugins/folder/SaveAllJobsAction.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 34-43 are not covered by tests
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:l="/lib/layout" xmlns:f="/lib/form">
<l:layout title="Save All Jobs">
<l:main-panel>
<h1>Save All Jobs in Folder</h1>
<!-- POST to the action root so Stapler invokes doIndex() -->
<f:form method="post" action=".">
<f:submit value="Save All Jobs"/>
</f:form>
</l:main-panel>
</l:layout>
</j:jelly>
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.cloudbees.hudson.plugins.folder;

import hudson.Extension;
import hudson.model.Action;
import jenkins.model.TransientActionFactory;
import java.util.Collection;
import java.util.Collections;

@Extension
public class SaveAllJobsActionFactory extends TransientActionFactory<Folder> {

@Override
public Class<Folder> type() {
return Folder.class;
}

@Override
public Collection<? extends Action> createFor(Folder target) {
return Collections.singletonList(new SaveAllJobsAction(target));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.cloudbees.hudson.plugins.folder.health.FolderHealthMetricDescriptor;
import com.cloudbees.hudson.plugins.folder.properties.FolderCredentialsProvider;
import com.cloudbees.plugins.credentials.domains.DomainCredentials;
import com.cloudbees.hudson.plugins.folder.SaveAllJobsAction;
import org.htmlunit.HttpMethod;
import org.htmlunit.WebRequest;
import org.htmlunit.html.*;
Expand Down Expand Up @@ -398,6 +399,19 @@ public void interruptOnDelete() throws Exception {
f.addAction(a);
assertNotNull(f.getAction(WhoAmI.class));
}

@Test public void testSaveAllJobsActionAppears() throws Exception {
Folder f = createFolder();
SaveAllJobsAction action = new SaveAllJobsAction(f);

// Check action is not null
assertNotNull(action);

// Check URL mapping and display name
assertEquals("save-all-jobs", action.getUrlName());
assertEquals("Save All Jobs", action.getDisplayName());
}


@Issue("JENKINS-32487")
@Test public void shouldAssignPropertyOwnerOnCreationAndReload() throws Exception {
Expand Down