diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js index dcbad8e10fd960c6360412ed1255f94321bcb080..3735014e093551dd9f7ad6e68708310c566e0890 100644 --- a/gui/slick/js/core.js +++ b/gui/slick/js/core.js @@ -429,6 +429,27 @@ var SICKRAGE = { $('#log_dir').fileBrowser({title: _('Select log file folder location')}); $('#sickrage_background_path').fileBrowser({title: _('Select Background Image'), key: 'sickrage_background_path', includeFiles: 1, fileTypes: ['images']}); $('#custom_css_path').fileBrowser({title: _('Select CSS file'), key: 'custom_css_path', includeFiles: 1, fileTypes: ['css']}); + + // List remote branches available for checkout + const branchVersion = $('#branchVersion'); + const branchVersionLabel = $('#branchVersionLabel'); + const branchCheckout = $('#branchCheckout'); + $.getJSON(srRoot + '/home/fetchRemoteBranches', function(branches) { + if (branches.length) { + const baseOptionElem = $('<option></option>'); + let optionElem = null; + for (let i = 0; i < branches.length; i++) { + optionElem = baseOptionElem.clone().text(branches[i].name).attr('value', branches[i].name); + optionElem.prop('selected', Boolean(branches[i].current)); + optionElem.appendTo(branchVersion); + } + branchCheckout.prop('disabled', false); + branchVersionLabel.html(_('select branch to use (restart required)')); + } else { + branchCheckout.prop('disabled', true); + branchVersionLabel.html(_('error: No branches found.')).css({color: '#FF0000'}); + } + }); }, backupRestore: function() { $('#Backup').on('click', function() { diff --git a/gui/slick/js/core.min.js b/gui/slick/js/core.min.js index b6380bcb441386ac99132955a5d5a3c969154d47..d5f0c577c8bccc4b411bc2b8c5afb9d949d0841b 100644 Binary files a/gui/slick/js/core.min.js and b/gui/slick/js/core.min.js differ diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako index 18f53c0dab8adabf5290e8f894a261f3a5ee8625..0da50de5b68db34f73334108cd84b0d427e7e1a4 100644 --- a/gui/slick/views/config_general.mako +++ b/gui/slick/views/config_general.mako @@ -2,6 +2,7 @@ <%! import os import datetime + import sickbeard from sickbeard.common import SKIPPED, ARCHIVED, IGNORED, statusStrings, cpu_presets from sickbeard.sbdatetime import sbdatetime, date_presets, time_presets @@ -1085,36 +1086,14 @@ <div class="col-lg-9 col-md-8 col-sm-7 col-xs-12 component-desc"> <div class="row"> <div class="col-md-12"> - <select id="branchVersion" class="form-control form-control-inline input-sm pull-left" title="Branch Version"> - <% gh_branch = sickbeard.versionCheckScheduler.action.list_remote_branches() %> - <% gh_credentials = (sickbeard.GIT_AUTH_TYPE == 0 and sickbeard.GIT_USERNAME and sickbeard.GIT_PASSWORD) \ - or (sickbeard.GIT_AUTH_TYPE == 1 and sickbeard.GIT_TOKEN) %> - % if gh_branch: - % for cur_branch in gh_branch: - % if gh_credentials and sickbeard.DEVELOPER == 1: - <option value="${cur_branch}" ${('', 'selected="selected"')[sickbeard.BRANCH == cur_branch]}>${cur_branch}</option> - % elif gh_credentials and cur_branch in ['master', 'develop']: - <option value="${cur_branch}" ${('', 'selected="selected"')[sickbeard.BRANCH == cur_branch]}>${cur_branch}</option> - % elif cur_branch == 'master': - <option value="${cur_branch}" ${('', 'selected="selected"')[sickbeard.BRANCH == cur_branch]}>${cur_branch}</option> - % endif - % endfor - % endif - </select> - % if not gh_branch: - <input class="btn btn-inline" style="margin-left: 6px;" type="button" id="branchCheckout" value="Checkout Branch" disabled> - % else: - <input class="btn btn-inline" style="margin-left: 6px;" type="button" id="branchCheckout" value="Checkout Branch"> - % endif + <select id="branchVersion" class="form-control form-control-inline input-sm pull-left" title="Branch Version"></select> + <input class="btn btn-inline" style="margin-left: 6px;" type="button" id="branchCheckout" value="Checkout Branch" disabled> </div> </div> <div class="row"> <div class="col-md-12"> - % if not gh_branch: - <div class="clear-left" style="color:#FF0000"><label>${_('error: No branches found.')}</label></div> - % else: - <div class="clear-left"><label>${_('select branch to use (restart required)')}</label></div> - % endif + <% loading_spinner = static_url('images/loading16' + ('', '-dark')[sickbeard.THEME_NAME == 'dark'] + '.gif') %> + <div class="clear-left"><label id="branchVersionLabel"><img src="${loading_spinner}" height="16" width="16" /> Loading...</label></div> </div> </div> </div> diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index da9227f0ab02a90858ecaa3ee5333a191072c6ab..7a89584eea2ec45ca38ccb9d8c8ea25340618c61 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -36,6 +36,7 @@ import adba import markdown2 import six from dateutil import tz +from github.GithubException import GithubException from libtrakt import TraktAPI from libtrakt.exceptions import traktException from mako.exceptions import RichTraceback @@ -1301,6 +1302,29 @@ class Home(WebRoot): else: return self.redirect('/' + sickbeard.DEFAULT_PAGE + '/') + @staticmethod + def fetchRemoteBranches(): + response = [] + try: + gh_branches = sickbeard.versionCheckScheduler.action.list_remote_branches() + except GithubException: + gh_branches = None + + if gh_branches: + gh_credentials = (sickbeard.GIT_AUTH_TYPE == 0 and sickbeard.GIT_USERNAME and sickbeard.GIT_PASSWORD or + sickbeard.GIT_AUTH_TYPE == 1 and sickbeard.GIT_TOKEN) + for cur_branch in gh_branches: + branch_obj = {'name': cur_branch} + if cur_branch == sickbeard.BRANCH: + branch_obj['current'] = True + + if (gh_credentials and sickbeard.DEVELOPER == 1 or + gh_credentials and cur_branch in ['master', 'develop'] or + cur_branch == 'master'): + response.append(branch_obj) + + return json.dumps(response) + def branchCheckout(self, branch): if sickbeard.BRANCH != branch: sickbeard.BRANCH = branch