Skip to content

Commit 8588127

Browse files
open repository in external browser with branch (#284)
* Open repo in ext browser with branch * Handled Github, Gitlab & Bitbucket domains for branch navigation. For other domains, navigation to repository would be supported * Unit tests added
1 parent 9d96d29 commit 8588127

File tree

3 files changed

+135
-4
lines changed

3 files changed

+135
-4
lines changed

org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/actions/OpenRepositoryAction.java

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package org.abapgit.adt.ui.internal.repositories.actions;
22

33
import java.net.MalformedURLException;
4-
import java.net.URL;
4+
import java.net.URI;
5+
import java.net.URISyntaxException;
56

67
import org.abapgit.adt.backend.model.abapgitrepositories.IRepository;
78
import org.abapgit.adt.ui.AbapGitUIPlugin;
@@ -22,6 +23,13 @@
2223
*/
2324
public class OpenRepositoryAction extends Action {
2425
private final IViewPart view;
26+
private static final String REFS_HEADS = "refs/heads/"; //$NON-NLS-1$
27+
private static final String GITHUB_DOMAIN = "github.com"; //$NON-NLS-1$
28+
private static final String GITLAB_DOMAIN = "gitlab.com"; //$NON-NLS-1$
29+
private static final String GITHUB_WDF_SAP_DOMAIN = "github.wdf.sap.corp"; //$NON-NLS-1$
30+
private static final String GITHUB_INFRA_HANA_DOMAIN = "github.infra.hana.ondemand.com"; //$NON-NLS-1$
31+
private static final String GITHUB_TOOLS_DOMAIN = "github.tools.sap"; //$NON-NLS-1$
32+
private static final String BIT_BUCKET_DOMAIN = "bitbucket.org"; //$NON-NLS-1$
2533

2634
/**
2735
* @param view
@@ -39,9 +47,12 @@ public void run() {
3947
IRepository repository = getRepository();
4048
if (repository != null) {
4149
try {
42-
// Open default external browser
43-
PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(new URL(repository.getUrl()));
44-
} catch (PartInitException | MalformedURLException exception) {
50+
// Get Repository link
51+
String repoLink = getLink(repository);
52+
// Open the link in default external browser
53+
URI repositoryUri = new URI(repoLink);
54+
PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(repositoryUri.toURL());
55+
} catch (PartInitException | MalformedURLException | URISyntaxException exception) {
4556
MessageDialog.openError(this.view.getViewSite().getShell(), Messages.AbapGitView_action_open_repo_error_dialog_title,
4657
exception.getMessage());
4758
AbapGitUIPlugin.getDefault().getLog()
@@ -50,6 +61,63 @@ public void run() {
5061
}
5162
}
5263

64+
public String getLink(IRepository repository) throws URISyntaxException {
65+
// Get Connected branch
66+
String repoLink = repository.getUrl();
67+
URI repoURI = new URI(repository.getUrl());
68+
String domain = repoURI.getHost();
69+
String path = getPath(repoURI);
70+
String branch = repository.getBranchName();
71+
if (isGithubDomain(domain) || isGitlabDomain(domain)) {
72+
branch = branch.replace(REFS_HEADS, "/tree/"); //$NON-NLS-1$
73+
repoLink = constructRepoBranchURI(repoURI, path + branch);
74+
} else if (isBitbucketDomain(domain)) {
75+
branch = branch.replace(REFS_HEADS, "/src/"); //$NON-NLS-1$
76+
repoLink = constructRepoBranchURI(repoURI, path + branch);
77+
}
78+
// return the concatenated link that redirects to the branch
79+
return repoLink;
80+
}
81+
82+
// method to construct URI from repository URI with new path and branch details
83+
private String constructRepoBranchURI(URI repoURI, String path) throws URISyntaxException {
84+
URI reconstructedRepoURI = new URI(repoURI.getScheme(), null, repoURI.getHost(), repoURI.getPort(), path, null, null); // not taking the username for the link
85+
return reconstructedRepoURI.toString();
86+
}
87+
88+
// method to check if the domain is a github domain
89+
private boolean isGithubDomain(String domain) {
90+
if (domain.equals(GITHUB_DOMAIN) || domain.equals(GITHUB_TOOLS_DOMAIN) || domain.equals(GITHUB_INFRA_HANA_DOMAIN)
91+
|| domain.equals(GITHUB_WDF_SAP_DOMAIN)) {
92+
return true;
93+
}
94+
return false;
95+
}
96+
97+
// method to check if the domain is a gitlab domain
98+
private boolean isGitlabDomain(String domain) {
99+
if (domain.equals(GITLAB_DOMAIN)) {
100+
return true;
101+
}
102+
return false;
103+
}
104+
105+
// method to check if the domain is a bitbucket domain
106+
private boolean isBitbucketDomain(String domain) {
107+
if (domain.equals(BIT_BUCKET_DOMAIN)) {
108+
return true;
109+
}
110+
return false;
111+
}
112+
113+
private String getPath(URI repoURI) {
114+
String path = repoURI.getPath();
115+
if (path.endsWith(".git")) { //$NON-NLS-1$
116+
path = path.substring(0, path.length() - 4); // Remove ".git"
117+
}
118+
return path;
119+
}
120+
53121
private IRepository getRepository() {
54122
if (this.view instanceof IAbapGitStagingView) {
55123
//abapGit staging view

test/org.abapgit.adt.ui.test/src/org/abapgit/adt/ui/internal/repositories/TestsPdeAbapGitRepositoriesUtil.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.abapgit.adt.ui.internal.repositories;
22

3+
import org.abapgit.adt.backend.model.abapgitrepositories.IRepository;
4+
import org.abapgit.adt.backend.model.abapgitrepositories.impl.AbapgitrepositoriesFactoryImpl;
35
import org.eclipse.core.resources.IProject;
46
import org.eclipse.core.resources.IWorkspace;
57
import org.eclipse.core.resources.IWorkspaceRunnable;
@@ -67,6 +69,17 @@ public void run(IProgressMonitor monitor) throws CoreException {
6769
}, new NullProgressMonitor());
6870
return projects[0].getProject();
6971
}
72+
73+
public IRepository createDummyRepository() {
74+
IRepository dummy = AbapgitrepositoriesFactoryImpl.eINSTANCE.createRepository();
75+
dummy.setUrl("https://github.com/dummy_url");
76+
dummy.setPackage("$AP_GITHUB");
77+
dummy.setCreatedEmail("dummy_user_one@email.com");
78+
dummy.setBranchName("refs/heads/master");
79+
dummy.setDeserializedAt("20200322180503");
80+
dummy.setStatusText("dummy_status");
81+
return dummy;
82+
}
7083

7184
protected void waitInUI(long timeout){
7285
Display display = Display.getCurrent();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.abapgit.adt.ui.internal.repositories.actions;
2+
3+
import org.junit.BeforeClass;
4+
import org.junit.Test;
5+
import org.junit.Assert;
6+
7+
import java.net.URISyntaxException;
8+
9+
import org.abapgit.adt.backend.model.abapgitrepositories.IRepository;
10+
import org.abapgit.adt.backend.model.abapgitrepositories.impl.AbapgitrepositoriesFactoryImpl;
11+
import org.abapgit.adt.ui.internal.repositories.AbapGitView;
12+
import org.abapgit.adt.ui.internal.repositories.TestsPdeAbapGitRepositoriesUtil;
13+
import org.eclipse.core.runtime.CoreException;
14+
15+
public class TestUnitAbapGitRepositoriesOpenAction {
16+
17+
private static OpenRepositoryAction openAction;
18+
private static AbapGitView view;
19+
private static IRepository dummyGitSelection;
20+
private static IRepository dummyBitSelection;
21+
private static TestsPdeAbapGitRepositoriesUtil utils;
22+
23+
@BeforeClass
24+
public static void setup() throws CoreException {
25+
utils = new TestsPdeAbapGitRepositoriesUtil();
26+
view = utils.initializeView();
27+
// git based host
28+
dummyGitSelection = utils.createDummyRepository();
29+
// bitbucket host
30+
dummyBitSelection = AbapgitrepositoriesFactoryImpl.eINSTANCE.createRepository();
31+
dummyBitSelection.setUrl("https://user1234@bitbucket.org/user1234/dummy.git");
32+
dummyBitSelection.setPackage("$AP_GITHUB");
33+
dummyBitSelection.setCreatedEmail("dummy_user_one@email.com");
34+
dummyBitSelection.setBranchName("refs/heads/master");
35+
dummyBitSelection.setDeserializedAt("20200322180503");
36+
dummyBitSelection.setStatusText("dummy_status");
37+
openAction = new OpenRepositoryAction(view);
38+
}
39+
40+
@Test
41+
public void testOpenRepositoryInBrowserAction() throws URISyntaxException {
42+
String actualGitLink = openAction.getLink(dummyGitSelection);
43+
String expectedGitLink = "https://github.com/dummy_url/tree/master";
44+
Assert.assertEquals(actualGitLink, expectedGitLink);
45+
46+
String actualBitLink = openAction.getLink(dummyBitSelection);
47+
String expectedBitLink = "https://bitbucket.org/user1234/dummy/src/master";
48+
Assert.assertEquals(actualBitLink, expectedBitLink);
49+
}
50+
}

0 commit comments

Comments
 (0)