1 19 20 package org.netbeans.modules.versioning.system.cvss.ui.actions.tag; 21 22 import org.netbeans.modules.versioning.system.cvss.ui.actions.AbstractSystemAction; 23 import org.netbeans.modules.versioning.system.cvss.ui.actions.update.UpdateExecutor; 24 import org.netbeans.modules.versioning.system.cvss.FileInformation; 25 import org.netbeans.modules.versioning.system.cvss.CvsVersioningSystem; 26 import org.netbeans.modules.versioning.system.cvss.ExecutorSupport; 27 import org.netbeans.modules.versioning.system.cvss.ExecutorGroup; 28 import org.netbeans.modules.versioning.system.cvss.util.Context; 29 import org.netbeans.lib.cvsclient.command.update.UpdateCommand; 30 import org.netbeans.lib.cvsclient.command.tag.RtagCommand; 31 import org.netbeans.lib.cvsclient.command.GlobalOptions; 32 import org.openide.util.NbBundle; 33 import org.openide.util.RequestProcessor; 34 import org.openide.util.HelpCtx; 35 import org.openide.DialogDescriptor; 36 import org.openide.DialogDisplayer; 37 import org.openide.nodes.Node; 38 39 import javax.swing.*; 40 import java.awt.Dialog ; 41 import java.io.File ; 42 import java.text.MessageFormat ; 43 44 49 public class MergeBranchAction extends AbstractSystemAction { 50 51 private static final int enabledForStatus = FileInformation.STATUS_VERSIONED_MERGE 52 | FileInformation.STATUS_VERSIONED_MODIFIEDINREPOSITORY 53 | FileInformation.STATUS_VERSIONED_MODIFIEDLOCALLY 54 | FileInformation.STATUS_VERSIONED_REMOVEDINREPOSITORY 55 | FileInformation.STATUS_VERSIONED_UPTODATE; 56 57 protected String getBaseName(Node [] activatedNodes) { 58 return "CTL_MenuItem_MergeBranch"; } 60 61 protected int getFileEnabledStatus() { 62 return enabledForStatus; 63 } 64 65 protected int getDirectoryEnabledStatus() { 66 return FileInformation.STATUS_MANAGED & ~FileInformation.STATUS_NOTVERSIONED_EXCLUDED & ~FileInformation.STATUS_NOTVERSIONED_NEWLOCALLY; 67 } 68 69 public void performCvsAction(Node[] nodes) { 70 Context context = getContext(nodes); 71 72 String title = MessageFormat.format(NbBundle.getBundle(MergeBranchAction.class).getString("CTL_MergeBranchDialog_Title"), getContextDisplayName(nodes)); 74 MergePanel settings = new MergePanel(context.getFiles()); 75 76 JButton merge = new JButton(NbBundle.getMessage(MergeBranchAction.class, "CTL_MergeBranchDialog_Action_Merge")); settings.putClientProperty("OKButton", merge); merge.setToolTipText(NbBundle.getMessage(MergeBranchAction.class, "TT_MergeBranchDialog_Action_Merge")); JButton cancel = new JButton(NbBundle.getMessage(MergeBranchAction.class, "CTL_MergeBranchDialog_Action_Cancel")); cancel.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(MergeBranchAction.class, "ACSD_MergeBranchDialog_Action_Cancel")); DialogDescriptor descriptor = new DialogDescriptor( 82 settings, 83 title, 84 true, 85 new Object [] { merge, cancel }, 86 merge, 87 DialogDescriptor.DEFAULT_ALIGN, 88 new HelpCtx(MergeBranchAction.class), 89 null); 90 descriptor.setClosingOptions(null); 91 92 Dialog dialog = DialogDisplayer.getDefault().createDialog(descriptor); 93 dialog.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(MergeBranchAction.class, "ACSD_MergeBranchDialog")); dialog.setVisible(true); 95 if (descriptor.getValue() != merge) return; 96 97 settings.saveSettings(); 98 99 RequestProcessor.getDefault().post(new MergeBranchExecutor(context, settings, getRunningName(nodes), getContextDisplayName(nodes))); 100 } 101 102 protected boolean asynchronous() { 103 return false; 104 } 105 106 109 private static class MergeBranchExecutor implements Runnable { 110 111 private final Context context; 112 private final MergePanel settings; 113 private final String contextName; 114 private String temporaryTag; 115 private String name; 116 117 public MergeBranchExecutor(Context context, MergePanel settings, String name, String contextName) { 118 this.context = context; 119 this.settings = settings; 120 this.name = name; 121 this.contextName = contextName; 122 } 123 124 public void run() { 125 final ExecutorGroup group = new ExecutorGroup(name); 126 if (settings.isTaggingAfterMerge()) { 127 temporaryTag = settings.getAfterMergeTagName() + "_tempheadmarker"; final ExecutorSupport[] tmpTagging = tagHeadTemporary(); 129 group.addExecutors(tmpTagging); 130 Runnable cleanup = new Runnable () { 131 public void run() { 132 if (tmpTagging == null || ExecutorSupport.wait(tmpTagging)) { 133 group.addCleanups(removeTagHeadTemporary()); 134 } 135 } 136 }; 137 group.addBarrier(cleanup); 138 group.addExecutors(update()); 139 group.addBarrier(null); 140 group.addExecutors(tag()); 141 } else { 142 group.addExecutors(update()); 143 } 144 group.execute(); 145 } 146 147 154 private UpdateExecutor [] update() { 155 UpdateCommand cmd = new UpdateCommand(); 156 157 String headTag; 158 if (temporaryTag != null) { 159 headTag = temporaryTag; 160 } else if (settings.isMergingFromTrunk()) { 161 headTag = "HEAD"; } else if (settings.isMergingFromBranch()) { 163 headTag = settings.getBranchName(); 164 } else { 165 headTag = settings.getEndTagName(); 166 } 167 168 GlobalOptions options = CvsVersioningSystem.createGlobalOptions(); 169 if (context.getExclusions().size() > 0) { 170 options.setExclusions((File []) context.getExclusions().toArray(new File [context.getExclusions().size()])); 171 } 172 173 if (settings.isUsingMergeTag()) { 174 cmd.setMergeRevision1(settings.getMergeTagName()); 175 cmd.setMergeRevision2(headTag); 176 } else { 177 cmd.setMergeRevision1(headTag); 178 } 179 cmd.setFiles(context.getRootFiles()); 180 cmd.setBuildDirectories(true); 181 cmd.setPruneDirectories(true); 182 183 return UpdateExecutor.splitCommand(cmd, CvsVersioningSystem.getInstance(), options, contextName); 184 } 185 186 190 private RTagExecutor[] tag() { 191 RtagCommand cmd = new RtagCommand(); 192 193 cmd.setOverrideExistingTag(true); 194 cmd.setTagByRevision(temporaryTag); 195 cmd.setTag(settings.getAfterMergeTagName()); 196 197 return RTagExecutor.splitCommand(cmd, context.getFiles(), null); 198 } 199 200 204 private RTagExecutor[] tagHeadTemporary() { 205 RtagCommand cmd = new RtagCommand(); 206 207 cmd.setOverrideExistingTag(true); 208 cmd.setTagByRevision(settings.isMergingFromTrunk() ? "HEAD" : settings.getBranchName()); cmd.setTag(temporaryTag); 210 211 return RTagExecutor.splitCommand(cmd, context.getFiles(), null); 212 } 213 214 private RTagExecutor [] removeTagHeadTemporary() { 215 RtagCommand cmd = new RtagCommand(); 216 217 cmd.setDeleteTag(true); 218 cmd.setTag(temporaryTag); 219 220 return RTagExecutor.splitCommand(cmd, context.getFiles(), null); 221 } 222 } 223 } 224 | Popular Tags |