From c4727728f4fb45c8a9617f72b030cc6b88c9d168 Mon Sep 17 00:00:00 2001 From: Robin Rosenberg Date: Sun, 14 Jun 2009 21:47:28 +0200 Subject: [PATCH] Add ref rename support to the branch dialog Signed-off-by: Robin Rosenberg Signed-off-by: Shawn O. Pearce --- .../src/org/spearce/egit/ui/UIText.java | 18 ++++ .../ui/internal/dialogs/BranchSelectionDialog.java | 108 +++++++++++++++++---- .../src/org/spearce/egit/ui/uitext.properties | 7 ++ 3 files changed, 112 insertions(+), 21 deletions(-) diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java index 654e1555..2d7d1e8d 100644 --- a/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java +++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/UIText.java @@ -893,6 +893,12 @@ public class UIText extends NLS { public static String BranchSelectionDialog_ErrorCouldNotRefresh; /** */ + public static String BranchSelectionDialog_ErrorCouldNotRenameRef; + + /** */ + public static String BranchSelectionDialog_ErrorCouldNotRenameRef2; + + /** */ public static String BranchSelectionDialog_BranchSuffix_Current; /** */ @@ -929,6 +935,12 @@ public class UIText extends NLS { public static String BranchSelectionDialog_QuestionNewBranchTitle; /** */ + public static String BranchSelectionDialog_QuestionNewBranchNameTitle; + + /** */ + public static String BranchSelectionDialog_QuestionNewBranchNameMessage; + + /** */ public static String BranchSelectionDialog_QuestionNewBranchMessage; /** */ @@ -944,6 +956,9 @@ public class UIText extends NLS { public static String BranchSelectionDialog_ErrorInvalidRefName; /** */ + public static String BranchSelectionDialog_ErrorRenameFailed; + + /** */ public static String BranchSelectionDialog_OkCheckout; /** */ @@ -953,6 +968,9 @@ public class UIText extends NLS { public static String BranchSelectionDialog_Refs; /** */ + public static String BranchSelectionDialog_Rename; + + /** */ public static String HistoryPage_ShowAllVersionsForProject; /** */ diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java index 5617695e..58022393 100644 --- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java +++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/BranchSelectionDialog.java @@ -48,8 +48,11 @@ import org.spearce.egit.ui.Activator; import org.spearce.egit.ui.UIText; import org.spearce.jgit.lib.Constants; import org.spearce.jgit.lib.ObjectId; +import org.spearce.jgit.lib.Ref; +import org.spearce.jgit.lib.RefRename; import org.spearce.jgit.lib.RefUpdate; import org.spearce.jgit.lib.Repository; +import org.spearce.jgit.lib.RefUpdate.Result; /** * The branch and reset selection dialog @@ -173,7 +176,7 @@ public class BranchSelectionDialog extends Dialog { curSubPrefix = null; } - int slashPos = shortName.indexOf("/"); + int slashPos = shortName.indexOf("/"); //$NON-NLS-1$ if (slashPos > -1) { String remoteName = shortName.substring(0, slashPos); shortName = shortName.substring(slashPos+1); @@ -277,6 +280,30 @@ public class BranchSelectionDialog extends Dialog { } } + private InputDialog getRefNameInputDialog(String prompt) { + InputDialog labelDialog = new InputDialog( + getShell(), + UIText.BranchSelectionDialog_QuestionNewBranchTitle, + prompt, + null, new IInputValidator() { + public String isValid(String newText) { + String testFor = Constants.R_HEADS + newText; + try { + if (repo.resolve(testFor) != null) + return UIText.BranchSelectionDialog_ErrorAlreadyExists; + } catch (IOException e1) { + Activator.logError(NLS.bind( + UIText.BranchSelectionDialog_ErrorCouldNotResolve, testFor), e1); + } + if (!Repository.isValidRefName(testFor)) + return UIText.BranchSelectionDialog_ErrorInvalidRefName; + return null; + } + }); + labelDialog.setBlockOnOpen(true); + return labelDialog; + } + @Override protected void createButtonsForButtonBar(Composite parent) { if (!showResetType) { @@ -284,43 +311,81 @@ public class BranchSelectionDialog extends Dialog { newButton.setFont(JFaceResources.getDialogFont()); newButton.setText(UIText.BranchSelectionDialog_NewBranch); ((GridLayout)parent.getLayout()).numColumns++; + Button renameButton = new Button(parent, SWT.PUSH); + renameButton.setText(UIText.BranchSelectionDialog_Rename); + renameButton.addSelectionListener(new SelectionListener() { + public void widgetSelected(SelectionEvent e) { + // check what ref name the user selected, if any. + refNameFromDialog(); + + String branchName; + if (refName.startsWith(Constants.R_HEADS)) + branchName = refName.substring(Constants.R_HEADS.length()); + else + branchName = refName; + InputDialog labelDialog = getRefNameInputDialog(NLS + .bind( + UIText.BranchSelectionDialog_QuestionNewBranchNameMessage, + branchName)); + if (labelDialog.open() == Window.OK) { + String newRefName = Constants.R_HEADS + labelDialog.getValue(); + try { + RefRename renameRef = repo.renameRef(refName, newRefName); + if (renameRef.rename() != Result.RENAMED) { + MessageDialog.openError(getShell(), + UIText.BranchSelectionDialog_ErrorRenameFailed, + NLS.bind(UIText.BranchSelectionDialog_ErrorCouldNotRenameRef, + new Object[] { refName, newRefName, renameRef.getResult() })); + Activator.logError(NLS.bind( + UIText.BranchSelectionDialog_ErrorCouldNotRenameRef2, + new Object[] { refName, newRefName }), null); + } + // FIXME: Update HEAD + } catch (IOException e1) { + Activator.logError(NLS.bind( + UIText.BranchSelectionDialog_ErrorCouldNotRenameRef2, + newRefName), e1); + } + try { + branchTree.removeAll(); + fillTreeWithBranches(newRefName); + } catch (IOException e1) { + Activator.logError( + UIText.BranchSelectionDialog_ErrorCouldNotRefreshBranchList, + e1); + } + } + } + public void widgetDefaultSelected(SelectionEvent e) { + widgetSelected(e); + } + }); newButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { // check what ref name the user selected, if any. refNameFromDialog(); - InputDialog labelDialog = new InputDialog( - getShell(), - UIText.BranchSelectionDialog_QuestionNewBranchTitle, - UIText.BranchSelectionDialog_QuestionNewBranchMessage, - null, new IInputValidator() { - public String isValid(String newText) { - String testFor = Constants.R_HEADS + newText; - try { - if (repo.resolve(testFor) != null) - return UIText.BranchSelectionDialog_ErrorAlreadyExists; - } catch (IOException e1) { - Activator.logError(NLS.bind( - UIText.BranchSelectionDialog_ErrorCouldNotResolve, testFor), e1); - } - if (!Repository.isValidRefName(testFor)) - return UIText.BranchSelectionDialog_ErrorInvalidRefName; - return null; - } - }); - labelDialog.setBlockOnOpen(true); + InputDialog labelDialog = getRefNameInputDialog(UIText.BranchSelectionDialog_QuestionNewBranchNameMessage); if (labelDialog.open() == Window.OK) { String newRefName = Constants.R_HEADS + labelDialog.getValue(); RefUpdate updateRef; try { updateRef = repo.updateRef(newRefName); + Ref startRef = repo.getRef(refName); ObjectId startAt; if (refName == null) startAt = repo.resolve(Constants.HEAD); else startAt = repo.resolve(refName); + String startBranch; + if (startRef != null) + startBranch = refName; + else + startBranch = startAt.name(); + startBranch = repo.shortenRefName(startBranch); updateRef.setNewObjectId(startAt); + updateRef.setRefLogMessage("branch: Created from " + startBranch, false); //$NON-NLS-1$ updateRef.update(); } catch (IOException e1) { Activator.logError(NLS.bind( @@ -338,6 +403,7 @@ public class BranchSelectionDialog extends Dialog { } } + public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties b/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties index 1d21c810..a2fd7202 100644 --- a/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties +++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/uitext.properties @@ -340,6 +340,10 @@ BranchSelectionDialog_ErrorCouldNotRefresh=Could not refresh list of branches BranchSelectionDialog_ErrorCouldNotRefreshBranchList=Could not refresh list of branches BranchSelectionDialog_ErrorCouldNotResolve=Could not attempt to resolve {0} BranchSelectionDialog_ErrorInvalidRefName=Invalid ref name +BranchSelectionDialog_ErrorCouldNotRenameRef=Failed to rename branch {0} -> {1}, status={2} +BranchSelectionDialog_ErrorCouldNotRenameRef2=Failed to rename branch {0} -> {1} +BranchSelectionDialog_ErrorRenameFailed=Rename failed + BranchSelectionDialog_LocalBranches=Local Branches BranchSelectionDialog_NewBranch=&New branch BranchSelectionDialog_NoBranchSeletectMessage=You must select a valid ref. @@ -347,7 +351,9 @@ BranchSelectionDialog_NoBranchSeletectTitle=No branch/tag selected BranchSelectionDialog_OkCheckout=&Checkout BranchSelectionDialog_OkReset=&Reset BranchSelectionDialog_QuestionNewBranchMessage=Enter name of new branch. It will branch from the selected branch. refs/heads/ will be prepended to the name you type +BranchSelectionDialog_QuestionNewBranchNameMessage=Enter new name of the {0} branch. refs/heads/ will be prepended to the name you type BranchSelectionDialog_QuestionNewBranchTitle=New branch +BranchSelectionDialog_QuestionNewBranchNameTitle=Rename branch BranchSelectionDialog_ReallyResetMessage=Resetting will overwrite any changes in your working directory.\n\nDo you wish to continue? BranchSelectionDialog_ReallyResetTitle=Really reset? BranchSelectionDialog_RemoteBranches=Remote Branches @@ -357,6 +363,7 @@ BranchSelectionDialog_ResetTypeMixed=&Mixed (working directory unmodified) BranchSelectionDialog_ResetTypeSoft=&Soft (Index and working directory unmodified) BranchSelectionDialog_Tags=Tags BranchSelectionDialog_Refs=&Refs +BranchSelectionDialog_Rename=&Rename Decorator_exceptionMessage=Errors occurred while applying Git decorations to resources. -- 2.11.4.GIT