diff --git a/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js b/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js
index a8e25fdec98..006f1728da0 100644
--- a/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js
+++ b/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js
@@ -203,6 +203,17 @@ export default Controller.extend({
);
},
sourceIsHttp: match("model.remote_theme.remote_url", /^http(s)?:\/\//),
+
+ @discourseComputed(
+ "model.remote_theme.remote_url",
+ "model.remote_theme.branch"
+ )
+ remoteThemeLink(remoteThemeUrl, remoteThemeBranch) {
+ return remoteThemeBranch
+ ? `${remoteThemeUrl.replace(/\.git$/, "")}/tree/${remoteThemeBranch}`
+ : remoteThemeUrl;
+ },
+
actions: {
updateToLatest() {
this.set("updatingRemote", true);
diff --git a/app/assets/javascripts/admin/templates/customize-themes-show.hbs b/app/assets/javascripts/admin/templates/customize-themes-show.hbs
index b4c4e9a8f46..ed4dcf0eb18 100644
--- a/app/assets/javascripts/admin/templates/customize-themes-show.hbs
+++ b/app/assets/javascripts/admin/templates/customize-themes-show.hbs
@@ -63,7 +63,7 @@
{{#if model.remote_theme.remote_url}}
{{#if sourceIsHttp}}
- {{i18n "admin.customize.theme.source_url"}}{{d-icon "link"}}
+ {{i18n "admin.customize.theme.source_url"}}{{d-icon "link"}}
{{else}}
{{model.remote_theme.remote_url}}
{{/if}}
diff --git a/app/serializers/theme_serializer.rb b/app/serializers/theme_serializer.rb
index 0682f694877..7d568904541 100644
--- a/app/serializers/theme_serializer.rb
+++ b/app/serializers/theme_serializer.rb
@@ -47,7 +47,7 @@ class BasicThemeSerializer < ApplicationSerializer
end
class RemoteThemeSerializer < ApplicationSerializer
- attributes :id, :remote_url, :remote_version, :local_version, :commits_behind,
+ attributes :id, :remote_url, :remote_version, :local_version, :commits_behind, :branch,
:remote_updated_at, :updated_at, :github_diff_link, :last_error_text, :is_git?,
:license_url, :about_url, :authors, :theme_version, :minimum_discourse_version, :maximum_discourse_version
diff --git a/test/javascripts/admin/controllers/admin-customize-themes-show-test.js.es6 b/test/javascripts/admin/controllers/admin-customize-themes-show-test.js.es6
new file mode 100644
index 00000000000..10cc64279ec
--- /dev/null
+++ b/test/javascripts/admin/controllers/admin-customize-themes-show-test.js.es6
@@ -0,0 +1,49 @@
+import { mapRoutes } from "discourse/mapping-router";
+import Theme from "admin/models/theme";
+
+moduleFor("controller:admin-customize-themes-show", {
+ beforeEach() {
+ this.registry.register("router:main", mapRoutes());
+ },
+ needs: ["controller:adminUser"]
+});
+
+const repoUrl = "https://github.com/discourse/discourse-brand-header.git";
+const remoteTheme = Theme.create({
+ id: 2,
+ default: true,
+ name: "default",
+ remote_theme: {
+ remote_url: repoUrl
+ }
+});
+
+QUnit.test("can display source url for remote themes", function(assert) {
+ const controller = this.subject({
+ model: remoteTheme
+ });
+
+ assert.deepEqual(
+ controller.get("remoteThemeLink"),
+ repoUrl,
+ "returns theme's repo URL"
+ );
+});
+
+QUnit.test("can display source url for remote theme branches", function(
+ assert
+) {
+ const branchUrl =
+ "https://github.com/discourse/discourse-brand-header/tree/beta";
+ remoteTheme["remote_theme"]["branch"] = "beta";
+
+ const controller = this.subject({
+ model: remoteTheme
+ });
+
+ assert.deepEqual(
+ controller.get("remoteThemeLink"),
+ branchUrl,
+ "returns theme's repo URL to branch"
+ );
+});