package fitnesse.revisioncontrol.responders; import fitnesse.FitNesseContext; import fitnesse.html.HtmlTableListingBuilder; import fitnesse.html.HtmlTag; import fitnesse.http.Request; import fitnesse.http.Response; import fitnesse.revisioncontrol.NewRevisionResults; import fitnesse.revisioncontrol.OperationStatus; import fitnesse.revisioncontrol.RevisionControlDetail; import fitnesse.revisioncontrol.svn.client.SVNEventActionTags; import fitnesse.revisioncontrol.wiki.RevisionControlledFileSystemPage; import org.tmatesoft.svn.core.wc.SVNEventAction; import java.util.HashMap; import java.util.List; import java.util.Map; import static fitnesse.revisioncontrol.CheckinOperationHtmlBuilder.CHECKIN_FOR_DELETED_PAGE; import static fitnesse.revisioncontrol.CheckinOperationHtmlBuilder.COMMIT_MESSAGE; import static fitnesse.revisioncontrol.RevisionControlOperation.CHECKIN; import static org.tmatesoft.svn.core.wc.SVNEventAction.COMMIT_DELETED; public class CheckinResponder extends RevisionControlResponder { private String commitMessage; private boolean checkinForDeletedPage; public CheckinResponder() { super(CHECKIN); } @Override public Response makeResponse(FitNesseContext context, Request request) throws Exception { commitMessage = (String) request.getInput(COMMIT_MESSAGE); checkinForDeletedPage = isCheckinForDeletedPage(request); return super.makeResponse(context, request); } @Override protected void performOperation(RevisionControlledFileSystemPage page, HtmlTag tag) { Map<String, String> checkinArgs = new HashMap<String, String>(); checkinArgs.put(COMMIT_MESSAGE, commitMessage != null ? commitMessage : ""); NewRevisionResults results = page.execute(CHECKIN, checkinArgs); if (anyChildPageDeleteCheckedIn(results)) { page.clearCachedChildren(); } if (checkinForDeletedPage) { clearCachedChildrenForParent(page); } makeResultsHtml(results, tag); } private void makeResultsHtml(NewRevisionResults results, HtmlTag tag) { if (results.getStatus().equals(OperationStatus.NOTHING_TO_DO)) { tag.add("No changes to check in"); } else { HtmlTableListingBuilder table = new RevisionControlDetailsTableBuilder(results, rootPagePath); tag.add(table.getTable()); tag.add("At revision " + results.getNewRevision()); } } private void clearCachedChildrenForParent(RevisionControlledFileSystemPage page) { try { if (page.getParent() instanceof RevisionControlledFileSystemPage) { ((RevisionControlledFileSystemPage) page.getParent()).clearCachedChildren(); } } catch (Exception e) { // ok, nothing to clear } } private boolean isCheckinForDeletedPage(Request request) { return "yes".equalsIgnoreCase((String) request.getInput(CHECKIN_FOR_DELETED_PAGE)); } private boolean anyChildPageDeleteCheckedIn(NewRevisionResults results) { List<RevisionControlDetail> revisionControlDetailList = results.getDetails(); for (RevisionControlDetail detail : revisionControlDetailList) { if (detail.getActionTags().contains(SVNEventActionTags.getTag(COMMIT_DELETED))) { return true; } } return false; } }