diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/i18n/Messages.java b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/i18n/Messages.java index 12d2d84..1045051 100644 --- a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/i18n/Messages.java +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/i18n/Messages.java @@ -4,6 +4,7 @@ public class Messages extends NLS { private static final String BUNDLE_NAME = "org.abapgit.adt.ui.internal.i18n.messages"; //$NON-NLS-1$ + public static String AbapGitView_action_select_branch; public static String AbapGitDialogPageObjLog_default_filename; public static String AbapGitView_action_clone; public static String AbapGitView_action_refresh; @@ -202,6 +203,7 @@ public class Messages extends NLS { public static String AbapGitStagingView_TransportWBKey; public static String AbapGitStagingView_PackageRel; public static String AbapGitStagingView_TransportRel; + public static String AbapGitWizardPageRepositoryAndCredentials_select_branch_title; static { // initialize resource bundle diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/i18n/messages.properties b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/i18n/messages.properties index 2f1b021..3d515ff 100644 --- a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/i18n/messages.properties +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/i18n/messages.properties @@ -8,6 +8,8 @@ AbapGitView_action_open_repo=Open Repository in Browser AbapGitView_action_open_repo_tooltip=Open Repository in Browser AbapGitView_action_open_repo_error_dialog_title=Error while opening repository in browser AbapGitView_action_open_xtol=Open Linked Package +AbapGitView_action_select_branch=Switch Branch +AbapGitWizardPageRepositoryAndCredentials_select_branch_title=Select Branch AbapGitView_column_branch=Branch AbapGitView_column_firstcommitat=Last Changed (UTC) AbapGitView_column_folder_logic=Folder Logic diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/AbapGitView.java b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/AbapGitView.java index 794959a..f9f2dab 100644 --- a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/AbapGitView.java +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/AbapGitView.java @@ -19,6 +19,7 @@ import org.abapgit.adt.ui.internal.dialogs.AbapGitDialogObjLog; import org.abapgit.adt.ui.internal.i18n.Messages; import org.abapgit.adt.ui.internal.repositories.actions.OpenRepositoryAction; +import org.abapgit.adt.ui.internal.repositories.actions.SwitchbranchAction; import org.abapgit.adt.ui.internal.staging.AbapGitStagingView; import org.abapgit.adt.ui.internal.staging.IAbapGitStagingView; import org.abapgit.adt.ui.internal.util.AbapGitUIServiceFactory; @@ -101,7 +102,8 @@ public class AbapGitView extends ViewPart implements IAbapGitRepositoriesView { public static final String ID = "org.abapgit.adt.ui.views.AbapGitView"; //$NON-NLS-1$ protected TableViewer viewer; - protected Action actionRefresh, actionWizard, actionCopy, actionOpen, actionShowMyRepos, actionPullWizard, actionOpenRepository; + protected Action actionRefresh, actionWizard, actionCopy, actionOpen, actionShowMyRepos, actionPullWizard, actionOpenRepository, + actionSwitch; private ISelection lastSelection; protected IProject lastProject; private ViewerFilter searchFilter; @@ -113,6 +115,10 @@ public class AbapGitView extends ViewPart implements IAbapGitRepositoriesView { //key binding for copy text private static final KeyStroke KEY_STROKE_COPY = KeyStroke.getInstance(SWT.MOD1, 'C' | 'c'); + public void refresh() { + updateView(true); + } + private final ISelectionListener selectionListener = new ISelectionListener() { private boolean isUpdatingSelection = false; @Override @@ -403,6 +409,10 @@ public void menuAboutToShow(IMenuManager manager) { } //separator manager.add(new Separator()); + //switch Branch Action + manager.add(AbapGitView.this.actionSwitch); + //separator + manager.add(new Separator()); //copy to clip-board action manager.add(AbapGitView.this.actionCopy); //unlink action @@ -564,6 +574,9 @@ public void run() { //Open repository in external browser this.actionOpenRepository = new OpenRepositoryAction(this); + + //Switch Branches + this.actionSwitch = new SwitchbranchAction(this); } private List getRepositories(String destinationId, Boolean byCurrUser) { diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/actions/SwitchbranchAction.java b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/actions/SwitchbranchAction.java new file mode 100644 index 0000000..ad80053 --- /dev/null +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/actions/SwitchbranchAction.java @@ -0,0 +1,52 @@ +package org.abapgit.adt.ui.internal.repositories.actions; + +import org.abapgit.adt.backend.model.abapgitrepositories.IRepository; +import org.abapgit.adt.ui.AbapGitUIPlugin; +import org.abapgit.adt.ui.internal.i18n.Messages; +import org.abapgit.adt.ui.internal.repositories.AbapGitView; +import org.abapgit.adt.ui.internal.repositories.IAbapGitRepositoriesView; +import org.abapgit.adt.ui.internal.repositories.wizards.AbapGitWizardBranchSelection; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.plugin.AbstractUIPlugin; + +import com.sap.adt.tools.core.project.AdtProjectServiceFactory; + +public class SwitchbranchAction extends Action { + + private IRepository selRepo; + private final IViewPart view; + private IProject project; + + public SwitchbranchAction(IViewPart view) { + super(Messages.AbapGitView_action_select_branch); + setToolTipText(Messages.AbapGitView_action_select_branch); + setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(AbapGitUIPlugin.PLUGIN_ID, "icons/etool/compare_view.png")); //$NON-NLS-1$ + this.view = view; + } + + @Override + public void run() { + this.project = getProject(); + this.selRepo = getRepository(); + if (this.selRepo != null) { + String destination = AdtProjectServiceFactory.createProjectService().getDestinationId(this.project); + WizardDialog dialog = new WizardDialog(this.view.getViewSite().getShell(), + new AbapGitWizardBranchSelection(this.project, this.selRepo, destination)); + dialog.open(); + } + + ((AbapGitView) this.view).refresh(); + + } + + private IRepository getRepository() { + return ((IAbapGitRepositoriesView) this.view).getRepositorySelection(); + } + + private IProject getProject() { + return ((IAbapGitRepositoriesView) this.view).getProject(); + } +} diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/wizards/AbapGitWizardBranchSelection.java b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/wizards/AbapGitWizardBranchSelection.java new file mode 100644 index 0000000..dd90b7a --- /dev/null +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/wizards/AbapGitWizardBranchSelection.java @@ -0,0 +1,182 @@ +package org.abapgit.adt.ui.internal.repositories.wizards; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +import org.abapgit.adt.backend.IExternalRepositoryInfoService; +import org.abapgit.adt.backend.IRepositoryService; +import org.abapgit.adt.backend.RepositoryServiceFactory; +import org.abapgit.adt.backend.model.abapgitrepositories.IRepository; +import org.abapgit.adt.ui.AbapGitUIPlugin; +import org.abapgit.adt.ui.internal.i18n.Messages; +import org.abapgit.adt.ui.internal.util.AbapGitUIServiceFactory; +import org.abapgit.adt.ui.internal.util.IAbapGitService; +import org.abapgit.adt.ui.internal.wizards.AbapGitWizard.CloneData; +import org.abapgit.adt.ui.internal.wizards.AbapGitWizardPageRepositoryAndCredentials; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.dialogs.DialogPage; +import org.eclipse.jface.dialogs.IPageChangingListener; +import org.eclipse.jface.dialogs.PageChangingEvent; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.wizard.IWizardContainer; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.plugin.AbstractUIPlugin; + +import com.sap.adt.tools.core.model.adtcore.IAdtObjectReference; +import com.sap.adt.tools.core.ui.packages.AdtPackageServiceUIFactory; +import com.sap.adt.tools.core.ui.packages.IAdtPackageServiceUI; + +public class AbapGitWizardBranchSelection extends Wizard { + + private final IProject project; + final CloneData cloneData; + public IRepository selRepoData; + private final String destination; + private IAbapGitService abapGitService; + private PageChangeListener pageChangeListener; + AbapGitWizardPageRepositoryAndCredentials pageCredentials; + AbapGitWizardPageBranchSelection pageBranchAndPackage; + + public AbapGitWizardBranchSelection(IProject project, IRepository selRepo, String destination) { + this.project = project; + this.cloneData = new CloneData(); + this.destination = destination; + this.selRepoData = selRepo; + this.cloneData.url = selRepo.getUrl(); + this.cloneData.branch = selRepo.getBranchName(); + if (this.abapGitService == null) { + this.abapGitService = AbapGitUIServiceFactory.createAbapGitService(); + } + getPackageAndRepoType(); + + setWindowTitle(Messages.AbapGitView_action_select_branch); + setNeedsProgressMonitor(true); + setDefaultPageImageDescriptor( + AbstractUIPlugin.imageDescriptorFromPlugin(AbapGitUIPlugin.PLUGIN_ID, "icons/wizban/abapGit_import_wizban.png")); //$NON-NLS-1$ + } + + public Object getProject() { + return this.project; + } + + public Object getSelectedRepository() { + return this.selRepoData; + } + + public boolean getPackageAndRepoType() { + + try { + String packageName = AbapGitWizardBranchSelection.this.selRepoData.getPackage(); + PlatformUI.getWorkbench().getProgressService().run(true, true, new IRunnableWithProgress() { + + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + monitor.beginTask(Messages.AbapGitWizardPageBranchAndPackage_task_package_validation_message, IProgressMonitor.UNKNOWN); + + //Get repository type (public / private) + IExternalRepositoryInfoService externalRepoInfoService = RepositoryServiceFactory + .createExternalRepositoryInfoService(AbapGitWizardBranchSelection.this.destination, null); + AbapGitWizardBranchSelection.this.cloneData.externalRepoInfo = externalRepoInfoService + .getExternalRepositoryInfo(AbapGitWizardBranchSelection.this.selRepoData.getUrl(), "", "", null); //$NON-NLS-1$ //$NON-NLS-2$ + + IAdtPackageServiceUI packageServiceUI = AdtPackageServiceUIFactory.getOrCreateAdtPackageServiceUI(); + if (packageServiceUI.packageExists(AbapGitWizardBranchSelection.this.destination, packageName, monitor)) { + List packageRefs = packageServiceUI.find(AbapGitWizardBranchSelection.this.destination, + packageName, monitor); + AbapGitWizardBranchSelection.this.cloneData.packageRef = packageRefs.stream().findFirst().orElse(null); + } + + } + }); + return true; + } catch (InvocationTargetException e) { + return false; + } catch (InterruptedException e) { + ((WizardPage) getContainer().getCurrentPage()).setPageComplete(false); + ((WizardPage) getContainer().getCurrentPage()).setMessage(e.getMessage(), DialogPage.ERROR); + return false; + } + + } + + @Override + public void setContainer(IWizardContainer wizardContainer) { + super.setContainer(wizardContainer); + + if (this.pageChangeListener == null && wizardContainer != null) { + Assert.isLegal(wizardContainer instanceof WizardDialog, "Wizard container must be of type WizardDialog"); //$NON-NLS-1$ + + this.pageChangeListener = new PageChangeListener(); + ((WizardDialog) wizardContainer).addPageChangingListener(this.pageChangeListener); + + } + } + + @Override + public void addPages() { + this.pageCredentials = new AbapGitWizardPageBranchSelectionCredentials(this.project, this.destination, this.cloneData); + this.pageBranchAndPackage = new AbapGitWizardPageBranchSelection(this.project, this.destination, this.cloneData, false); + addPage(this.pageCredentials); + addPage(this.pageBranchAndPackage); + } + + @Override + public boolean performFinish() { + try { + getContainer().run(true, true, new IRunnableWithProgress() { + + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + // Unlink + RepositoryServiceFactory + .createRepositoryService(AbapGitWizardBranchSelection.this.abapGitService + .getDestination(AbapGitWizardBranchSelection.this.project), monitor) + .unlinkRepository(AbapGitWizardBranchSelection.this.selRepoData.getKey(), monitor); + // Relink + IRepositoryService repoService = RepositoryServiceFactory + .createRepositoryService(AbapGitWizardBranchSelection.this.destination, monitor); + repoService.cloneRepository(AbapGitWizardBranchSelection.this.selRepoData.getUrl(), + AbapGitWizardBranchSelection.this.cloneData.branch, AbapGitWizardBranchSelection.this.selRepoData.getPackage(), + AbapGitWizardBranchSelection.this.selRepoData.getFolderLogic(), + AbapGitWizardBranchSelection.this.selRepoData.getTransportRequest(), + AbapGitWizardBranchSelection.this.cloneData.user, AbapGitWizardBranchSelection.this.cloneData.pass, monitor) + .getAbapObjects(); +// + } + }); + } catch (InvocationTargetException | InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return true; + } + + final class PageChangeListener implements IPageChangingListener { + @Override + public void handlePageChanging(final PageChangingEvent event) { + //-> Credentials page -> Branch & Package page + if (event.getCurrentPage() == AbapGitWizardBranchSelection.this.pageCredentials + && event.getTargetPage() == AbapGitWizardBranchSelection.this.pageBranchAndPackage) { + if (!AbapGitWizardBranchSelection.this.pageCredentials.validateAll()) { + event.doit = false; + return; + } + + } + + //-> Branch & Package page -> Credentials page + if (event.getCurrentPage() == AbapGitWizardBranchSelection.this.pageBranchAndPackage + && event.getTargetPage() == AbapGitWizardBranchSelection.this.pageCredentials) { + if (AbapGitWizardBranchSelection.this.pageBranchAndPackage.validateAll()) { + event.doit = false; + return; + } + } + } + } +} diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/wizards/AbapGitWizardPageBranchSelection.java b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/wizards/AbapGitWizardPageBranchSelection.java new file mode 100644 index 0000000..4999612 --- /dev/null +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/wizards/AbapGitWizardPageBranchSelection.java @@ -0,0 +1,27 @@ +package org.abapgit.adt.ui.internal.repositories.wizards; + +import org.abapgit.adt.ui.internal.wizards.AbapGitWizard.CloneData; +import org.abapgit.adt.ui.internal.wizards.AbapGitWizardPageBranchAndPackage; +import org.eclipse.core.resources.IProject; + +public class AbapGitWizardPageBranchSelection extends AbapGitWizardPageBranchAndPackage { + + public AbapGitWizardPageBranchSelection(IProject project, String destination, CloneData cloneData, Boolean pullAction) { + super(project, destination, cloneData, pullAction); + } + + @Override + public void setVisible(boolean visible) { + super.setVisible(visible); + + if (visible) { + this.comboBranches.getCombo().setEnabled(true); + } + } + + @Override + public boolean canFlipToNextPage() { + return false; + } + +} diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/wizards/AbapGitWizardPageBranchSelectionCredentials.java b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/wizards/AbapGitWizardPageBranchSelectionCredentials.java new file mode 100644 index 0000000..45fc913 --- /dev/null +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/wizards/AbapGitWizardPageBranchSelectionCredentials.java @@ -0,0 +1,62 @@ +package org.abapgit.adt.ui.internal.repositories.wizards; + +import org.abapgit.adt.backend.model.abapgitexternalrepo.AccessMode; +import org.abapgit.adt.ui.internal.i18n.Messages; +import org.abapgit.adt.ui.internal.wizards.AbapGitWizard.CloneData; +import org.abapgit.adt.ui.internal.wizards.AbapGitWizardPageRepositoryAndCredentials; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.dialogs.DialogPage; +import org.eclipse.jface.dialogs.TrayDialog; + +public class AbapGitWizardPageBranchSelectionCredentials extends AbapGitWizardPageRepositoryAndCredentials { + + private final CloneData cloneData; + + public AbapGitWizardPageBranchSelectionCredentials(IProject project, String destination, CloneData cloneData) { + super(project, destination, cloneData, false); + this.cloneData = cloneData; + setTitle(Messages.AbapGitWizardPageRepositoryAndCredentials_select_branch_title); + } + + @Override + public boolean validateAll() { + if (!validateClientOnly()) { + return false; + } + + fetchRepositories(); + if (this.cloneData.repositories == null) { + return false; + } + + if (this.cloneData.externalRepoInfo == null) { + fetchExternalRepoInfo(); + if (this.cloneData.externalRepoInfo == null) { + return false; + } + } + if (this.cloneData.externalRepoInfo.getAccessMode() == AccessMode.PRIVATE) { + if (!this.txtUser.isVisible()) { + setUserAndPassControlsVisible(true); + this.txtUser.setFocus(); + setPageComplete(false); + setMessage(Messages.AbapGitWizardPageRepositoryAndCredentials_repo_is_private, DialogPage.INFORMATION); + return false; + } else { + // update the info, now that we have proper user/password + if (!fetchExternalRepoInfo()) { + return false; + } + } + } + //Close the tray of the dialog if it was open + TrayDialog dialog = (TrayDialog) getContainer(); + + if (dialog.getTray() != null) { + dialog.closeTray(); + } + + return true; + } + +} diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPageBranchAndPackage.java b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPageBranchAndPackage.java index 2f57785..d55e4e6 100644 --- a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPageBranchAndPackage.java +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPageBranchAndPackage.java @@ -72,7 +72,7 @@ public class AbapGitWizardPageBranchAndPackage extends WizardPage { private Button checkbox_lnp; private Boolean chboxLinkAndPull; private TextViewer txtPackage; - private ComboViewer comboBranches; + protected ComboViewer comboBranches; private final Boolean pullAction; private boolean backButtonEnabled = true; diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPageRepositoryAndCredentials.java b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPageRepositoryAndCredentials.java index 7527f44..061b758 100644 --- a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPageRepositoryAndCredentials.java +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPageRepositoryAndCredentials.java @@ -44,7 +44,7 @@ public class AbapGitWizardPageRepositoryAndCredentials extends WizardPage { private final CloneData cloneData; private Text txtURL; - private Text txtUser; + protected Text txtUser; private Text txtPwd; private Label lblUser; private Label lblPwd; @@ -189,7 +189,7 @@ public void run(IProgressMonitor monitor) throws InvocationTargetException, Inte } - private boolean validateClientOnly() { + protected boolean validateClientOnly() { setMessage(null); setPageComplete(true); @@ -279,7 +279,7 @@ public boolean validateAll() { return true; } - private void fetchRepositories() { + public void fetchRepositories() { try { getContainer().run(true, true, new IRunnableWithProgress() { @@ -300,7 +300,7 @@ public void run(IProgressMonitor monitor) throws InvocationTargetException, Inte } } - private boolean fetchExternalRepoInfo() { + protected boolean fetchExternalRepoInfo() { try { getContainer().run(true, true, new IRunnableWithProgress() { @@ -337,7 +337,7 @@ public void run(IProgressMonitor monitor) throws InvocationTargetException, Inte } } - private void setUserAndPassControlsVisible(boolean visible) { + protected void setUserAndPassControlsVisible(boolean visible) { this.txtUser.setVisible(visible); this.txtPwd.setVisible(visible); this.lblUser.setVisible(visible); diff --git a/test/org.abapgit.adt.ui.test/src/org/abapgit/adt/ui/internal/repositories/wizards/TestPdeAbapGitRepositoriesSelectionWizard.java b/test/org.abapgit.adt.ui.test/src/org/abapgit/adt/ui/internal/repositories/wizards/TestPdeAbapGitRepositoriesSelectionWizard.java new file mode 100644 index 0000000..944b833 --- /dev/null +++ b/test/org.abapgit.adt.ui.test/src/org/abapgit/adt/ui/internal/repositories/wizards/TestPdeAbapGitRepositoriesSelectionWizard.java @@ -0,0 +1,51 @@ +package org.abapgit.adt.ui.internal.repositories.wizards; + +import static org.easymock.EasyMock.*; +import static org.junit.Assert.*; + + +import org.abapgit.adt.backend.model.abapgitrepositories.IRepository; + +import org.eclipse.core.resources.IProject; + +import org.junit.Before; +import org.junit.Test; + + +import com.sap.adt.tools.core.project.IAbapProject; + +public class TestPdeAbapGitRepositoriesSelectionWizard { + + private AbapGitWizardBranchSelection wizard; + private IProject mockProject; + private IRepository mockRepo; + + @Before + public void setUp() { + // Create mocks using EasyMock + mockProject = createMock(IProject.class); + mockRepo = createMock(IRepository.class); + + // Mock the getAdapter method for the IProject mock + IAbapProject mockAbapProject = createMock(IAbapProject.class); // Mock IAbapProject + expect(mockProject.getAdapter(IAbapProject.class)).andReturn(mockAbapProject); // Mock the return value + + expect(mockRepo.getUrl()).andReturn("https://repo.url"); + expect(mockRepo.getBranchName()).andReturn("main"); + expect(mockRepo.getPackage()).andReturn("$TEMP_PKG"); + replay(mockRepo); + + // Set up the wizard with the mocks + wizard = new AbapGitWizardBranchSelection(mockProject, mockRepo, "SYS_00_useren_000"); + } + + @Test + public void testWizardInitialization() { + // Check if the wizard initializes correctly + assertNotNull("Wizard should not be null", wizard); + assertEquals("Expected URL", "https://repo.url", wizard.cloneData.url); + assertEquals("Expected branch", "main", wizard.cloneData.branch); + + } + +}