mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[Mercurial] IDEA-56109 Push dialog: branch selector, 'force' option.
This commit is contained in:
@@ -20,20 +20,10 @@ hg4idea.error=Error
|
||||
hg4idea.revert=Revert
|
||||
hg4idea.commit=Commit
|
||||
|
||||
hg4idea.init.dialog.title=Create Mercurial repository
|
||||
hg4idea.init.dialog.incorrect.path=The specified path is incorrect
|
||||
hg4idea.init.dialog.option.create.repository.for.whole.project=&Create repository for the whole project
|
||||
hg4idea.init.dialog.option.select.folder=&Select where to create repository
|
||||
hg4idea.init.destination.directory.description=Select directory where the new Mercurial repository will be created.
|
||||
hg4idea.init.destination.directory.title=Select directory for hg init
|
||||
hg4idea.init.this.is.hg.root=The selected folder {0} is already a Mercurial root
|
||||
hg4idea.init.already.under.hg.description=<html>The selected directory <b><code>{0}</code></b> is already under Mercurial: <b><code>{1}</code></b><br/>Would you like to create new repository in the selected folder or use the parent one?</html>
|
||||
hg4idea.init.already.under.hg.title=This directory is already under hg
|
||||
hg4idea.init.already.under.hg.dialog.title=Directory is under hg
|
||||
hg4idea.init.already.under.hg.option.use.parent=Use parent repository, but keep working in this project.
|
||||
hg4idea.init.already.under.hg.option.create.repo.here=Create new repository here.
|
||||
hg4idea.init.created.notification.title=Mercurial repository created
|
||||
hg4idea.init.created.notification.description=Repository was created in {0}
|
||||
hg4idea.add.title=Add files to Mercurial
|
||||
hg4idea.add.single.title=Add file to Mercurial
|
||||
hg4idea.add.body=Do you want to add the following file to Mercurial?\n{0}\n\nIf you say NO, you can still add it later manually.
|
||||
hg4idea.add.progress=Adding files to Mercurial
|
||||
|
||||
hg4idea.clone.title=Clone Mercurial Repository
|
||||
hg4idea.clone.button.clone=Clone
|
||||
@@ -60,20 +50,37 @@ hg4idea.configuration.executable.error=\"{0}\" doesn''t appear to be a valid hg
|
||||
|
||||
hg4idea.command.executable.error=Error executing \"{0}\". Make sure you have setup the right executable in Mercurial configuration
|
||||
|
||||
hg4idea.commit.success=Repository \"{0}\" committed
|
||||
hg4idea.commit.partial.merge.message=<html>Partial commits are not allowed during merge, and following files are not included:<ul>{0}</ul>Perform commit with all files included ?</html>
|
||||
hg4idea.commit.partial.merge.title=Partial Merge Commit
|
||||
hg4idea.commit.error.messageEmpty=Please provide a commit message
|
||||
|
||||
hg4idea.add.title=Add files to Mercurial
|
||||
hg4idea.add.single.title=Add file to Mercurial
|
||||
hg4idea.add.body=Do you want to add the following file to Mercurial?\n{0}\n\nIf you say NO, you can still add it later manually.
|
||||
hg4idea.add.progress=Adding files to Mercurial
|
||||
hg4idea.init.dialog.title=Create Mercurial repository
|
||||
hg4idea.init.dialog.incorrect.path=The specified path is incorrect
|
||||
hg4idea.init.dialog.option.create.repository.for.whole.project=&Create repository for the whole project
|
||||
hg4idea.init.dialog.option.select.folder=&Select where to create repository
|
||||
hg4idea.init.destination.directory.description=Select directory where the new Mercurial repository will be created.
|
||||
hg4idea.init.destination.directory.title=Select directory for hg init
|
||||
hg4idea.init.this.is.hg.root=The selected folder {0} is already a Mercurial root
|
||||
hg4idea.init.already.under.hg.description=<html>The selected directory <b><code>{0}</code></b> is already under Mercurial: <b><code>{1}</code></b><br/>Would you like to create new repository in the selected folder or use the parent one?</html>
|
||||
hg4idea.init.already.under.hg.title=This directory is already under hg
|
||||
hg4idea.init.already.under.hg.dialog.title=Directory is under hg
|
||||
hg4idea.init.already.under.hg.option.use.parent=Use parent repository, but keep working in this project.
|
||||
hg4idea.init.already.under.hg.option.create.repo.here=Create new repository here.
|
||||
hg4idea.init.created.notification.title=Mercurial repository created
|
||||
hg4idea.init.created.notification.description=Repository was created in {0}
|
||||
|
||||
hg4idea.move.progress=Moving files in the VCS...
|
||||
|
||||
hg4idea.push.dialog.title=Push
|
||||
hg4idea.push.branch=&Branch
|
||||
hg4idea.push.force=&Force push
|
||||
|
||||
hg4idea.remove.single.title=Remove file from Mercurial
|
||||
hg4idea.remove.single.body=Do you want to remove the following file from Mercurial?\n{0}\n\nIf you say NO, you can still remove it later manually.
|
||||
hg4idea.remove.multiple.title=Remove files from Mercurial
|
||||
hg4idea.remove.progress=Removing files from the VCS...
|
||||
|
||||
hg4idea.move.progress=Moving files in the VCS...
|
||||
|
||||
hg4idea.update.error.uncommittedMerge=outstanding uncommitted merge in repository {0}, not updating or merging
|
||||
hg4idea.update.error.localchanges=outstanding uncommitted changes in repository {0}, not merging with pulled head
|
||||
hg4idea.update.error.merge.multipleLocalHeads=More than one local head in repository {0}, not merging
|
||||
@@ -84,16 +91,13 @@ hg4idea.update.progress.updating.to.pulled.head=Updating to pulled head
|
||||
hg4idea.update.progress.merging=Merging with pulled head
|
||||
|
||||
hg4idea.progress.updatingworkingdir=Updating local working directory
|
||||
|
||||
hg4idea.progress.integrating=Integrating {0} ...
|
||||
hg4idea.progress.merging=Performing merge...
|
||||
hg4idea.progress.updating=Updating {0} ...
|
||||
hg4idea.progress.countingHeads=Checking number of heads...
|
||||
hg4idea.progress.pull.with.rebase=Rebasing patches
|
||||
hg4idea.progress.pull.with.update=Updating repository
|
||||
hg4idea.commit.success=Repository \"{0}\" committed
|
||||
hg4idea.commit.partial.merge.message=<html>Partial commits are not allowed during merge, and following files are not included:<ul>{0}</ul>Perform commit with all files included ?</html>
|
||||
hg4idea.commit.partial.merge.title=Partial Merge Commit
|
||||
|
||||
hg4idea.error.invalidTarget=Invalid integration target
|
||||
hg4idea.status.currentSituationtext=<html><b>{0}</b><em>({1})</em></html>
|
||||
hg4idea.status.currentSituation.description=<html>Current mercurial branch and parents of the working directory</html>
|
||||
@@ -103,5 +107,4 @@ hg4idea.error.invalidExecutable=\"{0}\" is not a valid mercurial executable
|
||||
hg4idea.integrate.other.head=Other head: {0}
|
||||
|
||||
hgidea.dialog.login.password.required=Login and password required
|
||||
|
||||
hg4idea.exception.file.not.under.hg=The file {0} is not under Mercurial.
|
||||
hg4idea.exception.file.not.under.hg=The file {0} is not under Mercurial.
|
||||
@@ -43,14 +43,11 @@ public class HgPushAction extends HgAbstractGlobalAction {
|
||||
}
|
||||
|
||||
public void execute() {
|
||||
HgPushCommand command = new HgPushCommand(
|
||||
project, dialog.getRepository(), dialog.getTarget()
|
||||
);
|
||||
if (dialog.isRevisionSelected()) {
|
||||
command.setRevision(dialog.getRevision());
|
||||
}
|
||||
HgCommandResult result = command.execute();
|
||||
new HgCommandResultNotifier(project).process(result);
|
||||
HgPushCommand command = new HgPushCommand(project, dialog.getRepository(), dialog.getTarget());
|
||||
command.setRevision(dialog.getRevision());
|
||||
command.setForce(dialog.isForce());
|
||||
command.setBranch(dialog.getBranch());
|
||||
new HgCommandResultNotifier(project).process(command.execute());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -23,35 +23,51 @@ import java.util.List;
|
||||
|
||||
public class HgPushCommand {
|
||||
|
||||
private final Project project;
|
||||
private final VirtualFile repo;
|
||||
private final String destination;
|
||||
private final Project myProject;
|
||||
private final VirtualFile myRepo;
|
||||
private final String myDestination;
|
||||
private final HgCommandAuthenticator authenticator = new HgCommandAuthenticator();
|
||||
|
||||
private String revision;
|
||||
private String myRevision;
|
||||
private boolean myForce;
|
||||
private HgTagBranch myBranch;
|
||||
|
||||
public HgPushCommand(Project project, @NotNull VirtualFile repo, String destination) {
|
||||
this.project = project;
|
||||
this.repo = repo;
|
||||
this.destination = destination;
|
||||
myProject = project;
|
||||
myRepo = repo;
|
||||
myDestination = destination;
|
||||
}
|
||||
|
||||
public void setRevision(String revision) {
|
||||
this.revision = revision;
|
||||
myRevision = revision;
|
||||
}
|
||||
|
||||
public void setForce(boolean force) {
|
||||
myForce = force;
|
||||
}
|
||||
|
||||
public void setBranch(HgTagBranch branch) {
|
||||
myBranch = branch;
|
||||
}
|
||||
|
||||
public HgCommandResult execute() {
|
||||
List<String> arguments = new LinkedList<String>();
|
||||
if (StringUtils.isNotBlank(revision)) {
|
||||
final List<String> arguments = new LinkedList<String>();
|
||||
if (StringUtils.isNotBlank(myRevision)) {
|
||||
arguments.add("-r");
|
||||
arguments.add(revision);
|
||||
arguments.add(myRevision);
|
||||
}
|
||||
arguments.add(destination);
|
||||
|
||||
HgCommandResult result = authenticator.executeCommandAndAuthenticateIfNecessary(project, repo, destination, "push", arguments);
|
||||
|
||||
project.getMessageBus().syncPublisher(HgVcs.OUTGOING_TOPIC).update(project);
|
||||
if (myBranch != null) {
|
||||
arguments.add("-b");
|
||||
arguments.add(myBranch.getName());
|
||||
}
|
||||
if (myForce) {
|
||||
arguments.add("-f");
|
||||
}
|
||||
arguments.add(myDestination);
|
||||
|
||||
final HgCommandResult result = authenticator.executeCommandAndAuthenticateIfNecessary(myProject, myRepo, myDestination, "push", arguments);
|
||||
myProject.getMessageBus().syncPublisher(HgVcs.OUTGOING_TOPIC).update(myProject);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
<grid id="27dc6" binding="contentPanel" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<xy x="20" y="20" width="529" height="243"/>
|
||||
<xy x="20" y="20" width="529" height="307"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<grid id="16351" layout-manager="GridLayoutManager" row-count="5" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<grid id="16351" layout-manager="GridLayoutManager" row-count="6" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
|
||||
@@ -18,7 +18,7 @@
|
||||
<children>
|
||||
<vspacer id="f51de">
|
||||
<constraints>
|
||||
<grid row="4" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
|
||||
<grid row="5" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
</vspacer>
|
||||
<component id="59224" class="javax.swing.JLabel">
|
||||
@@ -36,7 +36,7 @@
|
||||
</constraints>
|
||||
<properties/>
|
||||
</component>
|
||||
<grid id="3b42" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<grid id="3b42" layout-manager="GridLayoutManager" row-count="3" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false">
|
||||
@@ -65,16 +65,33 @@
|
||||
<text value="tip"/>
|
||||
</properties>
|
||||
</component>
|
||||
<vspacer id="d2af5">
|
||||
<constraints>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
</vspacer>
|
||||
<hspacer id="27a66">
|
||||
<constraints>
|
||||
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
|
||||
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
</hspacer>
|
||||
<component id="5fcc4" class="javax.swing.JCheckBox" binding="forceCheckBox" default-binding="true">
|
||||
<constraints>
|
||||
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text resource-bundle="org/zmlx/hg4idea/HgVcsMessages" key="hg4idea.push.force"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="e6341" class="javax.swing.JCheckBox" binding="branchCheckBox" default-binding="true">
|
||||
<constraints>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text resource-bundle="org/zmlx/hg4idea/HgVcsMessages" key="hg4idea.push.branch"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="1adc4" class="javax.swing.JComboBox" binding="branchComboBox">
|
||||
<constraints>
|
||||
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
</component>
|
||||
</children>
|
||||
</grid>
|
||||
<nested-form id="9e17d" form-file="org/zmlx/hg4idea/ui/HgRepositorySelectorComponent.form" binding="hgRepositorySelectorComponent">
|
||||
|
||||
@@ -16,7 +16,11 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.DialogWrapper;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.zmlx.hg4idea.HgVcsMessages;
|
||||
import org.zmlx.hg4idea.command.HgShowConfigCommand;
|
||||
import org.zmlx.hg4idea.command.HgTagBranch;
|
||||
import org.zmlx.hg4idea.command.HgTagBranchCommand;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
@@ -26,20 +30,25 @@ import javax.swing.event.DocumentListener;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public class HgPushDialog extends DialogWrapper {
|
||||
|
||||
private final Project project;
|
||||
private final Project myProject;
|
||||
|
||||
private JPanel contentPanel;
|
||||
private JTextField repositoryTxt;
|
||||
private JCheckBox revisionCbx;
|
||||
private JTextField revisionTxt;
|
||||
private HgRepositorySelectorComponent hgRepositorySelectorComponent;
|
||||
private JCheckBox forceCheckBox;
|
||||
private JCheckBox branchCheckBox;
|
||||
private JComboBox branchComboBox;
|
||||
|
||||
public HgPushDialog(Project project) {
|
||||
super(project, false);
|
||||
this.project = project;
|
||||
myProject = project;
|
||||
|
||||
hgRepositorySelectorComponent.setTitle("Select repository to push from");
|
||||
hgRepositorySelectorComponent.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
@@ -47,30 +56,13 @@ public class HgPushDialog extends DialogWrapper {
|
||||
}
|
||||
});
|
||||
|
||||
revisionCbx.addChangeListener(new ChangeListener() {
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
update();
|
||||
}
|
||||
});
|
||||
final UpdatingListener updatingListener = new UpdatingListener();
|
||||
revisionCbx.addChangeListener(updatingListener);
|
||||
branchCheckBox.addChangeListener(updatingListener);
|
||||
repositoryTxt.getDocument().addDocumentListener(updatingListener);
|
||||
revisionTxt.getDocument().addDocumentListener(updatingListener);
|
||||
|
||||
DocumentListener documentListener = new DocumentListener() {
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
};
|
||||
|
||||
repositoryTxt.getDocument().addDocumentListener(documentListener);
|
||||
revisionTxt.getDocument().addDocumentListener(documentListener);
|
||||
|
||||
setTitle("Push");
|
||||
setTitle(HgVcsMessages.message("hg4idea.push.dialog.title"));
|
||||
init();
|
||||
}
|
||||
|
||||
@@ -87,34 +79,70 @@ public class HgPushDialog extends DialogWrapper {
|
||||
return repositoryTxt.getText();
|
||||
}
|
||||
|
||||
public boolean isRevisionSelected() {
|
||||
return revisionCbx.isSelected();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getRevision() {
|
||||
return revisionTxt.getText();
|
||||
return revisionCbx.isSelected() ? revisionTxt.getText() : null;
|
||||
}
|
||||
|
||||
private void updateRepository() {
|
||||
VirtualFile repo = hgRepositorySelectorComponent.getRepository();
|
||||
HgShowConfigCommand configCommand = new HgShowConfigCommand(project);
|
||||
String defaultPath = configCommand.getDefaultPath(repo);
|
||||
repositoryTxt.setText(defaultPath);
|
||||
update();
|
||||
@Nullable
|
||||
public HgTagBranch getBranch() {
|
||||
return branchCheckBox.isSelected() ? (HgTagBranch) branchComboBox.getSelectedItem() : null;
|
||||
}
|
||||
|
||||
public boolean isForce() {
|
||||
return forceCheckBox.isSelected();
|
||||
}
|
||||
|
||||
protected JComponent createCenterPanel() {
|
||||
return contentPanel;
|
||||
}
|
||||
|
||||
private void updateRepository() {
|
||||
final VirtualFile repo = hgRepositorySelectorComponent.getRepository();
|
||||
final HgShowConfigCommand configCommand = new HgShowConfigCommand(myProject);
|
||||
final String defaultPath = configCommand.getDefaultPath(repo);
|
||||
repositoryTxt.setText(defaultPath);
|
||||
loadBranches(repo);
|
||||
update();
|
||||
}
|
||||
|
||||
private void loadBranches(VirtualFile root) {
|
||||
final List<HgTagBranch> branches = new HgTagBranchCommand(myProject, root).listBranches();
|
||||
branchComboBox.setModel(new DefaultComboBoxModel(branches.toArray()));
|
||||
}
|
||||
|
||||
private void update() {
|
||||
setOKActionEnabled(validateOptions());
|
||||
revisionTxt.setEnabled(revisionCbx.isSelected());
|
||||
branchComboBox.setEnabled(branchCheckBox.isSelected());
|
||||
}
|
||||
|
||||
private boolean validateOptions() {
|
||||
return StringUtils.isNotBlank(repositoryTxt.getText())
|
||||
&& !(revisionCbx.isSelected() && StringUtils.isBlank(revisionTxt.getText()));
|
||||
&& !(revisionCbx.isSelected() && StringUtils.isBlank(revisionTxt.getText()))
|
||||
&& !(branchCheckBox.isSelected() && (branchComboBox.getSelectedItem() == null));
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the form on every change.
|
||||
*/
|
||||
private class UpdatingListener implements ChangeListener, DocumentListener {
|
||||
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
update();
|
||||
}
|
||||
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user