1 package com.proalpha.pds.gitutils.cherrypick;
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.InputStreamReader;
8 import java.nio.charset.StandardCharsets;
9 import java.util.ArrayList;
10 import java.util.Arrays;
11 import java.util.Collections;
12 import java.util.HashMap;
13 import java.util.HashSet;
14 import java.util.LinkedList;
15 import java.util.List;
18 import java.util.regex.Matcher;
19 import java.util.regex.Pattern;
21 import org.eclipse.core.runtime.FileLocator;
22 import org.eclipse.core.runtime.Path;
23 import org.eclipse.core.runtime.Platform;
24 import org.eclipse.jface.dialogs.IDialogSettings;
25 import org.eclipse.jface.dialogs.IMessageProvider;
26 import org.eclipse.jface.resource.ImageDescriptor;
27 import org.eclipse.jface.viewers.ArrayContentProvider;
28 import org.eclipse.jface.viewers.ComboViewer;
29 import org.eclipse.jface.viewers.StructuredSelection;
30 import org.eclipse.jface.wizard.WizardPage;
31 import org.eclipse.jgit.lib.Repository;
32 import org.eclipse.swt.SWT;
33 import org.eclipse.swt.custom.ScrolledComposite;
34 import org.eclipse.swt.events.FocusEvent;
35 import org.eclipse.swt.events.FocusListener;
36 import org.eclipse.swt.events.KeyEvent;
37 import org.eclipse.swt.events.KeyListener;
38 import org.eclipse.swt.events.SelectionAdapter;
39 import org.eclipse.swt.events.SelectionEvent;
40 import org.eclipse.swt.graphics.Point;
41 import org.eclipse.swt.layout.GridData;
42 import org.eclipse.swt.layout.GridLayout;
43 import org.eclipse.swt.widgets.Button;
44 import org.eclipse.swt.widgets.Composite;
45 import org.eclipse.swt.widgets.Display;
46 import org.eclipse.swt.widgets.Event;
47 import org.eclipse.swt.widgets.Group;
48 import org.eclipse.swt.widgets.Label;
49 import org.eclipse.swt.widgets.Listener;
50 import org.eclipse.swt.widgets.Text;
51 import org.eclipse.wb.swt.ResourceManager;
53 import com.proalpha.git.PaGitConfig;
54 import com.proalpha.git.model.server.GitServerRepository;
55 import com.proalpha.git.util.PaRepository;
56 import com.proalpha.git.util.bitbucket.BitbucketRestCallGetRepoList;
57 import com.proalpha.pds.gitutils.Activator;
58 import com.proalpha.pds.gitutils.PreferencesConstants;
62 private Repository targetRepository;
63 private List<GitServerRepository> currRepos;
64 private Map<String, Set<String>> projectRepositoryMap;
66 private ComboViewer cvSrcProject;
67 private ComboViewer cvSrcRepository;
68 private ComboViewer cvSrcBranch;
69 private Text txtSrcFeature;
70 private Text txtTargetBranchPoint;
71 private Button btnOnlyShowMaster;
72 private Button btnRunTest;
73 private Button btnRunTarget;
75 private org.eclipse.swt.widgets.List infoList;
76 private Label infoLabel;
77 private Display display;
79 ScrolledComposite scrolledComposite;
82 private Map<String, List<String>> causedIssues;
83 private static final String PAGE_NAME =
"pAGitMultiCherryPickPage";
88 this.targetRepository = repository;
89 setTitle(
"proALPHA MultiCherryPick");
90 setMessage(
"Select repository and branch which needs to get picked into your current repository", INFORMATION);
91 URL url = FileLocator.find(Platform.getBundle(
Activator.PLUGIN_ID),
new Path(
"icons/pA-logox72.png"),
92 Collections.emptyMap());
94 setImageDescriptor(ImageDescriptor.createFromURL(url));
96 causedIssues =
new HashMap<String, List<String>>();
100 private void disableAll() {
101 cvSrcBranch.getCombo().setEnabled(
false);
102 cvSrcProject.getCombo().setEnabled(
false);
103 cvSrcRepository.getCombo().setEnabled(
false);
104 btnRunTest.setEnabled(
false);
105 txtSrcFeature.setEnabled(
false);
106 txtTargetBranchPoint.setEnabled(
false);
107 btnOnlyShowMaster.setEnabled(
false);
112 private void enableAll() {
113 cvSrcBranch.getCombo().setEnabled(
true);
114 cvSrcProject.getCombo().setEnabled(
true);
115 cvSrcRepository.getCombo().setEnabled(
true);
116 btnRunTest.setEnabled(
true);
117 txtSrcFeature.setEnabled(
true);
118 txtTargetBranchPoint.setEnabled(
true);
119 btnOnlyShowMaster.setEnabled(
true);
127 public void createControl(Composite parent) {
131 currRepos = getServerRepositories();
132 projectRepositoryMap = fillProjectRepositoryMap();
134 Composite container =
new Composite(parent, SWT.NULL);
135 setControl(container);
136 display = this.getShell().getDisplay();
140 container.setLayout(
new GridLayout(1,
false));
142 this.createSourceControls(container);
143 this.createTargetControls(container);
144 setControl(container);
147 GridData gridData =
new GridData(SWT.FILL, SWT.CENTER,
false,
false, 3, 1);
148 Composite container_bottom =
new Composite(container, SWT.None);
149 container_bottom.setLayoutData(gridData);
150 gridData.widthHint = 488;
151 gridData.heightHint = 100;
154 scrolledComposite =
new ScrolledComposite(container_bottom, SWT.V_SCROLL | SWT.H_SCROLL);
155 scrolledComposite.setExpandHorizontal(
true);
156 scrolledComposite.setExpandVertical(
true);
157 scrolledComposite.setBounds(0, 0, 408, 100);
159 infoList =
new org.eclipse.swt.widgets.List(scrolledComposite, SWT.NONE);
160 infoList.setBounds(0, 0, 408, 100);
164 infoLabel =
new Label(scrolledComposite, SWT.NONE);
165 infoLabel.setBounds(0, 0, 408, 100);
166 infoLabel.setText(
"");
167 infoLabel.moveAbove(infoList);
170 scrolledComposite.setContent(infoLabel);
173 btnRunTest =
new Button(container_bottom, SWT.NONE);
174 btnRunTest.setBounds(408, 0, 80, 30);
175 btnRunTest.setText(
"Test Merge");
177 btnRunTarget =
new Button(container_bottom, SWT.NONE);
178 btnRunTarget.setBounds(408, 45, 80, 30);
179 btnRunTarget.setText(
"Target Merge");
180 btnRunTarget.setEnabled(
false);
182 addSrcWidgetListeners();
183 addTargetWidgetListeners();
184 addButtonWidgetListeners();
194 private void createTargetControls(Composite container) {
195 Group grpTarget =
new Group(container, SWT.NONE);
196 GridData gdGrpTarget =
new GridData(SWT.FILL, SWT.CENTER,
false,
false, 2, 1);
197 gdGrpTarget.widthHint = 450;
198 gdGrpTarget.heightHint = 60;
199 grpTarget.setLayoutData(gdGrpTarget);
200 grpTarget.setText(
"Target");
202 Label label1 =
new Label(grpTarget, SWT.NONE);
203 label1.setText(
"Repository");
204 label1.setBounds(10, 22, 80, 15);
206 Text txtTargetRepository;
207 txtTargetRepository =
new Text(grpTarget, SWT.NONE);
208 txtTargetRepository.setBounds(96, 23, 347, 21);
209 txtTargetRepository.setText(targetRepository.getDirectory().toString());
210 txtTargetRepository.setEnabled(
false);
212 Label lblBranchPoint =
new Label(grpTarget, SWT.NONE);
213 lblBranchPoint.setText(
"Branch Point");
214 lblBranchPoint.setBounds(10, 49, 80, 15);
216 txtTargetBranchPoint =
new Text(grpTarget, SWT.BORDER);
217 txtTargetBranchPoint.setBounds(96, 46, 212, 21);
221 List<String> branches = PaRepository.getMasterBranches(targetRepository);
223 String mainBranch =
null;
224 if (branches !=
null && !branches.isEmpty())
225 mainBranch = branches.get(0);
227 branches = PaRepository.getCodeFreezeBranches(targetRepository);
228 if (branches !=
null && !branches.isEmpty())
229 mainBranch = branches.get(0);
232 if (mainBranch ==
null)
235 mainBranch = targetRepository.getFullBranch();
237 String remoteTrackingRef = PaRepository.getRemoteTrackingBranch(targetRepository, mainBranch);
239 if (remoteTrackingRef ==
null || remoteTrackingRef.isEmpty())
242 remoteTrackingRef =
"HEAD";
244 txtTargetBranchPoint.setText(remoteTrackingRef);
245 cherryPickSettings.setTargetBranchPoint(remoteTrackingRef);
246 }
catch (IOException ex) {
247 setMessage(
"Could not determine the branch name to be used as branching point!", IMessageProvider.ERROR);
256 private void createSourceControls(Composite container) {
260 String gitDefaultProject =
"";
261 String gitShortDefaultRepo =
"";
262 if (gitDefaultRepo.contains(
"/")) {
263 String[] splitGitDefaultRepo = gitDefaultRepo.split(
"/");
264 gitDefaultProject = splitGitDefaultRepo[0];
265 gitShortDefaultRepo = splitGitDefaultRepo[1];
268 Group grpSource =
new Group(container, SWT.NONE);
269 GridData gdGrpSource =
new GridData(SWT.FILL, SWT.TOP,
true,
false, 2, 1);
270 gdGrpSource.heightHint = 111;
271 gdGrpSource.widthHint = 450;
272 grpSource.setLayoutData(gdGrpSource);
273 grpSource.setText(
"Source");
275 Label lblProject =
new Label(grpSource, SWT.NONE);
276 lblProject.setText(
"Project");
277 lblProject.setBounds(10, 22, 80, 15);
279 Label lblRepository =
new Label(grpSource, SWT.NONE);
280 lblRepository.setText(
"Repository");
281 lblRepository.setBounds(10, 49, 80, 15);
283 Label lblBranch =
new Label(grpSource, SWT.NONE);
284 lblBranch.setText(
"Branch");
285 lblBranch.setBounds(10, 76, 80, 15);
287 Label lblFeature =
new Label(grpSource, SWT.NONE);
288 lblFeature.setText(
"Feature");
289 lblFeature.setBounds(10, 103, 80, 15);
292 PrefixMatchFilter projectFilter =
new PrefixMatchFilter();
293 cvSrcProject =
new ComboViewer(grpSource, SWT.BORDER);
294 cvSrcProject.setContentProvider(ArrayContentProvider.getInstance());
295 cvSrcProject.getCombo().setBounds(96, 19, 212, 21);
296 cvSrcProject.addFilter(projectFilter);
298 Set<String> projectsSet = projectRepositoryMap.keySet();
299 String[] projects =
new String[projectsSet.size()];
300 projectsSet.toArray(projects);
301 Arrays.sort(projects);
302 cvSrcProject.setInput(projects);
303 cvSrcProject.setSelection(
new StructuredSelection(gitDefaultProject));
306 PrefixMatchFilter repositoryFilter =
new PrefixMatchFilter();
307 cvSrcRepository =
new ComboViewer(grpSource, SWT.BORDER);
308 cvSrcRepository.setContentProvider(ArrayContentProvider.getInstance());
309 cvSrcRepository.getCombo().setBounds(96, 46, 212, 21);
310 cvSrcRepository.addFilter(repositoryFilter);
312 Set<String> repositorySet = projectRepositoryMap.get(gitDefaultProject);
313 if (repositorySet ==
null) {
314 repositorySet =
new HashSet<String>();
316 String[] repositories =
new String[repositorySet.size()];
317 repositorySet.toArray(repositories);
318 Arrays.sort(repositories);
319 cvSrcRepository.setInput(repositories);
320 cvSrcRepository.setSelection(
new StructuredSelection(gitShortDefaultRepo));
322 PrefixMatchFilter branchFilter =
new PrefixMatchFilter();
323 cvSrcBranch =
new ComboViewer(grpSource, SWT.BORDER);
324 cvSrcBranch.setContentProvider(ArrayContentProvider.getInstance());
325 cvSrcBranch.getCombo().setBounds(96, 73, 212, 21);
326 cvSrcBranch.addFilter(branchFilter);
328 txtSrcFeature =
new Text(grpSource, SWT.BORDER);
329 txtSrcFeature.setBounds(96, 100, 162, 21);
331 Button btnRefreshRepos =
new Button(grpSource, SWT.NONE);
332 btnRefreshRepos.setToolTipText(
"Reload repositories from server");
334 btnRefreshRepos.setBounds(314, 18, 28, 23);
337 btnOnlyShowMaster =
new Button(grpSource, SWT.CHECK);
338 btnOnlyShowMaster.setBounds(314, 75, 129, 16);
339 btnOnlyShowMaster.setText(
"only show master");
340 btnOnlyShowMaster.setSelection(settings.getBoolean(
"ONLY_SHOW_MASTER"));
347 private void addSrcWidgetListeners() {
351 cvSrcRepository.getCombo().addFocusListener(
new FocusListener() {
353 public void focusGained(FocusEvent e) {
354 setMessage(
"Choose your source repository");
358 public void focusLost(FocusEvent e) {
359 if (cvSrcBranch.getCombo().getText().length() != 0)
364 cvSrcBranch.getCombo().addFocusListener(
new FocusListener() {
366 public void focusGained(FocusEvent e) {
367 setMessage(
"Choose your source branch");
371 public void focusLost(FocusEvent e) {
372 if (cvSrcBranch.getCombo().getText().length() != 0 && checkBranch()) {
373 String featureByBranch = getFeatureText(cvSrcBranch.getCombo().getText());
374 if (featureByBranch !=
null)
375 setTxtFeatureText(featureByBranch);
380 txtSrcFeature.addModifyListener(modifyEvent -> {
381 if (cvSrcBranch.getCombo().getText().length() != 0) {
383 cherryPickSettings.setSourceIssue(txtSrcFeature.getText());
384 btnRunTarget.setEnabled(
false);
387 txtSrcFeature.addFocusListener(
new FocusListener() {
389 public void focusGained(FocusEvent e) {
390 setMessage(
"Type your feature to pick");
394 public void focusLost(FocusEvent e) {
395 String features_string = txtSrcFeature.getText();
396 features_string = features_string.replaceAll(
"\\s",
"");
397 String[] features = features_string.split(
",");
400 for (String feature: features) {
401 if(!causedIssues.containsKey(feature)) {
402 fillCausedIssues(feature);
405 printCausedIssues(features);
409 KeyListener projectKeyListener = createKeyListener(cvSrcProject);
410 cvSrcProject.getCombo().addKeyListener(projectKeyListener);
412 KeyListener repositoryKeyListener = createKeyListener(cvSrcRepository);
413 cvSrcRepository.getCombo().addKeyListener(repositoryKeyListener);
415 KeyListener branchKeyListener = createKeyListener(cvSrcBranch);
416 cvSrcBranch.getCombo().addKeyListener(branchKeyListener);
418 cvSrcBranch.getCombo().addModifyListener(modifyListener -> {
419 if (cvSrcBranch.getCombo().getText().length() != 0 && checkBranch()) {
420 String featureByBranch = getFeatureText(cvSrcBranch.getCombo().getText());
421 if (featureByBranch !=
null)
422 setTxtFeatureText(featureByBranch);
428 private void printCausedIssues(String[] features) {
430 infoList.removeAll();
431 List<String> featuresList = Arrays.asList(features);
433 for(String causesIssue: features) {
434 List<String> caused = causedIssues.get(causesIssue);
435 for(String causedIssue: caused) {
436 if(!featuresList.contains(causedIssue)) {
437 String line =
"The issue " + causesIssue +
" causes the following issue " + causedIssue;
439 infoList.moveAbove(infoLabel);
445 private KeyListener createKeyListener(ComboViewer viewer) {
446 return new KeyListener() {
449 public void keyPressed(
final KeyEvent e) {
454 public void keyReleased(
final KeyEvent e) {
455 String currentInput = viewer.getCombo().getText();
456 String inputFilter = ((PrefixMatchFilter) viewer.getFilters()[0]).getInput();
460 if (currentInput.length() < inputFilter.length() || Character.isDigit(e.character)
461 || Character.isAlphabetic(e.character)) {
462 if (e.keyCode == SWT.ESC) {
463 ((PrefixMatchFilter) viewer.getFilters()[0]).setInput(
"");
466 ((PrefixMatchFilter) viewer.getFilters()[0]).setInput(currentInput);
470 viewer.refresh(
true);
471 viewer.getCombo().setListVisible(e.keyCode != SWT.ESC);
475 viewer.getCombo().setText(currentInput);
476 viewer.getCombo().setSelection(
new Point(currentInput.length(), currentInput.length()));
486 private void addTargetWidgetListeners() {
488 txtTargetBranchPoint.addModifyListener(modifyEvent -> {
489 if (txtTargetBranchPoint.getText().length() != 0) {
490 cherryPickSettings.setTargetBranchPoint(txtTargetBranchPoint.getText());
491 btnRunTarget.setEnabled(false);
495 txtTargetBranchPoint.addFocusListener(
new FocusListener() {
497 public void focusGained(FocusEvent e) {
498 setMessage(
"Type your new branch point");
502 public void focusLost(FocusEvent e) {
507 btnRunTest.addSelectionListener(
new SelectionAdapter() {
509 public void widgetSelected(SelectionEvent e) {
510 display.asyncExec(()->{
516 btnRunTarget.addSelectionListener(
new SelectionAdapter() {
518 public void widgetSelected(SelectionEvent e) {
519 display.asyncExec(()->{
525 infoList.addListener(SWT.MouseDoubleClick,
new Listener(){
527 public void handleEvent(Event event) {
528 int[] selections = infoList.getSelectionIndices();
529 for (
int i: selections) {
530 String[] caused = infoList.getItem(i).split(
" ");
531 String causedIssue = caused[caused.length-1];
532 String features = txtSrcFeature.getText();
533 features = features +
"," + causedIssue;
534 setTxtFeatureText(features);
540 private final String encodeText(String text)
throws Exception{
542 int[] offsets =
new int[] {47, 28, 36, 28, 122, 26, 32, 42, 73, 109, 50, 64, 89, 85, 83, 40};
543 byte[] text_bytes = text.getBytes(StandardCharsets.UTF_8);
544 int offset_index = 0;
545 for(
int i = 0; i < text_bytes.length; i++) {
546 int utf_char = text_bytes[i] - 32 + offsets[offset_index];
547 utf_char = (utf_char % 95) + 32;
548 text_bytes[i] = (byte) utf_char;
550 offset_index = (offset_index + 1) % offsets.length;
552 return new String(text_bytes, StandardCharsets.UTF_8);
555 private void setTxtFeatureText(String text) {
556 txtSrcFeature.setText(text);
557 txtSrcFeature.setFocus();
558 getShell().setFocus();
569 credentialPage.open();
570 String user = credentialPage.getUser();
571 String password = credentialPage.getPassword();
572 String encPassword =
"";
575 encPassword = encodeText(password);
576 encUser = encodeText(user);
577 }
catch (Exception e) {
581 cvSrcBranch.getCombo().setEnabled(
false);
583 display.syncExec(()->{
587 List<String> command =
null;
589 command = createCommand();
590 }
catch(Exception e) {
591 setInfoText(
"Not all fields set!");
596 command.add(
"target");
598 command.add(encUser);
600 command.add(encPassword);
601 setInfoText(
"Cherry Pick Issues:");
603 boolean result = run_command(command);
605 display.syncExec(()->{
611 private void runTest() {
612 cvSrcBranch.getCombo().setEnabled(
false);
614 display.syncExec(()->{
618 List<String> command =
null;
620 command = createCommand();
621 }
catch(Exception e) {
622 setInfoText(
"Not all fields set!");
631 setInfoText(
"Testrun:");
633 boolean result = run_command(command);
635 btnRunTarget.setEnabled(result);
637 display.syncExec(()->{
643 private void fillCausedIssues(String issue) {
644 List<String> command =
new LinkedList<String>();
645 command.add(
"python");
647 command.add(
"pa_common.pds_functions.jira_issue_links");
653 List<String> caused = getCausedIssues(command, issue);
654 causedIssues.put(issue, caused);
658 private List<String> getCausedIssues(List<String> command, String issue){
660 ProcessBuilder builder =
new ProcessBuilder();
661 builder.command(command);
663 List<String> caused =
new LinkedList<String>();
667 InputStream inputStream = p.getErrorStream();
668 BufferedReader bufRead =
new BufferedReader(
new InputStreamReader(inputStream));
670 while ((line = bufRead.readLine()) !=
null) {
671 if(line.contains(
"INFO") || line.contains(
"ERROR")) {
672 if (line.contains(issue)){
673 String[] splitLine = line.split(
" ");
674 String causedIssue = splitLine[2];
675 caused.add(causedIssue);
679 }
catch (IOException e) {
685 private boolean run_command(List<String> command) {
686 boolean result =
false;
687 ProcessBuilder builder =
new ProcessBuilder();
688 builder.command(command);
693 InputStream inputStream = p.getErrorStream();
694 BufferedReader bufRead =
new BufferedReader(
new InputStreamReader(inputStream));
696 String pythonOutput =
"";
697 boolean pythonHasLogged =
false;
699 while ((line = bufRead.readLine()) !=
null) {
700 pythonOutput = pythonOutput +
"\n" + line;
701 if(line.contains(
"INFO") || line.contains(
"ERROR")) {
702 pythonHasLogged =
true;
703 String text = infoLabel.getText();
704 String textLine = line;
705 display.syncExec(()->{
706 setInfoText(text +
"\n" + textLine);
708 if(line.contains(
"Cherry Pick Finished")) {
713 if (!pythonHasLogged) {
714 String info =
"Following command has failed:";
715 info = info +
"\n" + commandToString(command);
716 info = info +
"\n" + pythonOutput;
719 }
catch (IOException e) {
725 private void setInfoText(String text) {
726 infoLabel.setText(text);
727 scrolledComposite.setMinSize(infoLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
728 infoLabel.moveAbove(infoList);
732 private String commandToString(List<String> command) {
734 String outputCommand =
"";
735 for(String commandArgument: command) {
736 outputCommand = outputCommand +
" " + commandArgument;
738 return outputCommand;
743 public List<String> createCommand(){
744 String source_repo =
"https://git.proalpha.com/scm/";
745 String settings_target_branch = cherryPickSettings.getTargetBranchPoint();
746 String[] settings_target_branch_split = settings_target_branch.split(
"/");
747 String target_remote = settings_target_branch_split[0];
748 String target_branch = settings_target_branch_split[1];
749 String source_branch = cherryPickSettings.getSourceBranch();
750 source_repo += cherryPickSettings.getSourceRepoString();
751 String issues_no_spaces = txtSrcFeature.getText().replaceAll(
"\\s",
"");
752 String work_space = this.targetRepository.getDirectory().getParent();
753 String[] issues = issues_no_spaces.split(
",");
755 List<String> command =
new LinkedList<String>();
756 command.add(
"python");
758 command.add(
"pa_common.pds_functions.cherry_pick_issues");
760 command.add(target_remote);
762 command.add(target_branch);
764 command.add(source_repo);
766 command.add(source_branch);
768 command.add(work_space);
772 for(String issue: issues) {
782 private void addButtonWidgetListeners() {
783 btnOnlyShowMaster.addSelectionListener(
new SelectionAdapter() {
785 public void widgetSelected(SelectionEvent e) {
787 settings.put(
"ONLY_SHOW_MASTER", btnOnlyShowMaster.getSelection());
798 private List<GitServerRepository> getServerRepositories() {
800 ArrayList<GitServerRepository> serverRepositories;
802 BitbucketRestCallGetRepoList restcall =
new BitbucketRestCallGetRepoList();
803 restcall.setSubUrl(
"repos");
805 serverRepositories = restcall.getRestResponse();
807 return serverRepositories;
815 private String getFeatureText(String branchText) {
817 Pattern p = Pattern.compile(
"(.*\\.)?(" + PaGitConfig.getStringFromConfig(
"issue_key_format") +
")$");
818 Matcher m = p.matcher(branchText);
832 private boolean checkBranch() {
834 boolean foundIt =
false;
835 String srcBranchName = cvSrcBranch.getCombo().getText();
836 setMessage(
null, IMessageProvider.INFORMATION);
837 setErrorMessage(
null);
839 if (srcBranchName.length() == 0) {
843 String projectname = cvSrcProject.getCombo().getText();
844 String repoName = cvSrcRepository.getCombo().getText();
846 for (GitServerRepository repository : currRepos) {
847 if (repository.getProject().equals(projectname) && repository.getName().equals(repoName)) {
848 for (String actBranch : repository.getBranches()) {
849 if (actBranch.equals(srcBranchName)) {
859 setMessage(
"Branch not found!", IMessageProvider.WARNING);
863 cherryPickSettings.setSourceBranch(srcBranchName);
864 btnRunTarget.setEnabled(
false);
875 List<String> allBranches;
876 boolean foundIt =
false;
877 setMessage(
null, IMessageProvider.INFORMATION);
878 setErrorMessage(
null);
880 String projectname = cvSrcProject.getCombo().getText();
881 String repoName = cvSrcRepository.getCombo().getText();
883 for (GitServerRepository repository : currRepos) {
884 if (repository.getProject().equals(projectname) && repository.getName().equals(repoName)) {
885 allBranches = repository.getBranches();
886 Collections.sort(allBranches);
887 String[] branches = allBranches.stream().toArray(String[]::
new);
888 if (btnOnlyShowMaster.getSelection()) {
889 branches = filterMasterBranches(branches);
891 cvSrcBranch.setInput(branches);
898 setMessage(
"Repository not found!", IMessageProvider.WARNING);
899 cvSrcBranch.setInput(
new String[0]);
903 cherryPickSettings.setSourceRepoString(projectname, repoName);
904 btnRunTarget.setEnabled(
false);
913 String projectname = cvSrcProject.getCombo().getText();
914 if (!projectRepositoryMap.containsKey(projectname)) {
915 setMessage(
"Project not found!", IMessageProvider.WARNING);
916 cvSrcRepository.setInput(
new String[0]);
920 Set<String> repoSet = projectRepositoryMap.get(projectname);
921 String[] repos =
new String[repoSet.size()];
922 repoSet.toArray(repos);
924 cvSrcRepository.setInput(repos);
925 btnRunTarget.setEnabled(
false);
935 private Map<String, Set<String>> fillProjectRepositoryMap() {
937 projectRepositoryMap =
new HashMap<String, Set<String>>();
938 for (GitServerRepository repository : currRepos) {
940 Set<String> repositoriesForProject = projectRepositoryMap.get(repository.getProject());
942 if (repositoriesForProject !=
null) {
943 repositoriesForProject.add(repository.getName());
945 String projectName = repository.getProject();
946 String repositoryName = repository.getName();
947 Set<String> repositories =
new HashSet<String>();
948 repositories.add(repositoryName);
949 projectRepositoryMap.put(projectName, repositories);
952 return projectRepositoryMap;
962 private String[] filterMasterBranches(String[] branches) {
964 List<String> masterBranches =
new ArrayList<String>();
965 for (String branch : branches) {
966 if (branch.contains(
"master")) {
967 masterBranches.add(branch);
971 String[] masterArray =
new String[masterBranches.size()];
972 masterBranches.toArray(masterArray);
986 IDialogSettings section = dialogSettings.getSection(PAGE_NAME);
988 section = dialogSettings.addNewSection(PAGE_NAME);
static Activator getDefault()
IDialogSettings getDialogSettings()
void checkRepoAndProposeBranches()
void proposeRepositories()
static Image getPluginImage(Object plugin, String name)