From d08068d00ce62c83317a4d99b592932c0c3fa656 Mon Sep 17 00:00:00 2001
From: Kfir Hadas <sharkykh@gmail.com>
Date: Sun, 6 Aug 2017 03:04:38 +0300
Subject: [PATCH] Refactor fetching remote branches (/config/general/) (#3945)

* Quick fix for Mako error on /config/general/

when fetching remote branches from an unavailable repository on Github

* Move remote branch fetching to webserve.py / core.js

* Update minified core.js

* Fix issues
---
 gui/slick/js/core.js                |  21 +++++++++++++++++++
 gui/slick/js/core.min.js            | Bin 87924 -> 88414 bytes
 gui/slick/views/config_general.mako |  31 +++++-----------------------
 sickbeard/webserve.py               |  24 +++++++++++++++++++++
 4 files changed, 50 insertions(+), 26 deletions(-)

diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js
index dcbad8e10..3735014e0 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
GIT binary patch
delta 463
zcmeyej`iLq)(x9f{H>Go^NLFpN^Dg$l$4W-67!NX!cvQhGxPJ5G<8xjMST*JQgf6v
zb@Gv<oHJ6Bv-3+!lr*iUACzVko@{WNwLUGiBsn7}H8;N`)d_5DYO#_|T4`Q#NoIbY
zMxJJMW|~HxUQTLWdP#<6HN+LgAVY2P3qVTjZ1kZFB~9y`)DneE+q}}89P70FA`K8X
z)z-i|)dpsQb*i?urbec1v0idceqO4EW`bTxYDI}gUUX`#US48us-|9INlB50Qdwe7
zX{wSALR?d?peVmUL#a45CpEbwHAP9sDL+3aH8BsOH@UQ^C^fG{Q&T5XFR`E?H7_M3
zU!z3RI)8GZnTU-}s$ND(ZjMGgOuqso2o*~56-tX!6*P)ci%SxVN)(Dx3rjPLQd2aQ
zG&O5ebBa?H@+UW1iP|Fcrxq3E7g;Iz<wK1~Emla&FU?EQQ_|GbOD-<fs7}t$$uF`}
YQg(AQFfcGss?}`Xpt5~~3gZzY07^TbZU6uP

delta 18
acmcb&iS^4m)(x9fn&+r(pQFZj$Or&gTL^Xl

diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako
index 18f53c0da..0da50de5b 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 da9227f0a..7a89584ee 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
-- 
GitLab