Просмотр исходного кода

fetch defaults from autotest server

Shiv Tyagi 3 лет назад
Родитель
Сommit
1c00eca184
2 измененных файлов с 115 добавлено и 10 удалено
  1. 67 8
      app.py
  2. 48 2
      templates/index.html

+ 67 - 8
app.py

@@ -14,6 +14,8 @@ from distutils.dir_util import copy_tree
 from flask import Flask, render_template, request, send_from_directory, render_template_string, jsonify
 from threading import Thread, Lock
 import sys
+import re
+import requests
 # run at lower priority
 os.nice(20)
 
@@ -22,17 +24,18 @@ os.nice(20)
 appdir = os.path.dirname(__file__)
 
 class Vehicle:
-    def __init__(self, name):
+    def __init__(self, name, dir):
         self.name = name
+        self.dir = dir
 
 # create vehicle objects
-copter = Vehicle('Copter')
-plane = Vehicle('Plane')
-rover = Vehicle('Rover')
-sub = Vehicle('Sub')
-tracker = Vehicle('AntennaTracker')
-blimp = Vehicle('Blimp')
-heli = Vehicle('Heli')
+copter = Vehicle('Copter', 'ArduCopter')
+plane = Vehicle('Plane', 'ArduPlane')
+rover = Vehicle('Rover', 'Rover')
+sub = Vehicle('Sub', 'ArduSub')
+tracker = Vehicle('AntennaTracker', 'AntennaTracker')
+blimp = Vehicle('Blimp', 'Blimp')
+heli = Vehicle('Heli', 'ArduCopter')
 
 VEHICLES = [copter, plane, rover, sub, tracker, blimp, heli]
 default_vehicle = copter
@@ -638,6 +641,7 @@ def boards_and_features(remote, branch_name):
                 'label' : option.label,
                 'description' : option.description,
                 'default' : option.default,
+                'define' : option.define,
                 'dependency' : option.dependency,
             })
         features.append({
@@ -675,5 +679,60 @@ def get_allowed_branches(vehicle_name):
     # return jsonified result dictionary
     return jsonify(result)
 
+def get_firmware_version(vehicle_name, branch):
+    app.logger.info("Retrieving firmware version information for %s on branch: %s" % (vehicle_name, branch))
+    dir = ""
+    for vehicle in VEHICLES:
+        if vehicle.name == vehicle_name:
+            dir = vehicle.dir
+            break
+
+    if dir == "":
+        raise Exception("Could not determine vehicle directory")
+    head_lock.acquire()
+    output = subprocess.check_output(['git', 'show', branch+':'+dir+'/version.h'], cwd=sourcedir, encoding='utf-8', shell=False).rstrip()
+    head_lock.release()
+    match = re.search('define.THISFIRMWARE[\s\S]+V([0-9]+.[0-9]+.[0-9]+)', output)
+    if match is None:
+        raise Exception("Failed to retrieve firmware version from version.h")
+    firmware_version = match.group(1)
+    return firmware_version
+
+@app.route("/get_defaults/<string:vehicle_name>/<string:remote>/<string:branch_name>/<string:board>", methods = ['GET'])
+def get_deafults(vehicle_name, remote, branch_name, board):
+    if not remote == "upstream":
+        app.logger.error("Defaults requested for remote '%s' which is not supported" % remote)
+        return ("Bad remote. Only upstream is supported.", 400)
+
+    branch = remote + '/' + branch_name
+    if not is_valid_branch(branch):
+        app.logger.error("Bad branch")
+        return ("Bad branch", 400)
+
+    if not is_valid_vehicle(vehicle_name):
+        app.logger.error("Bad vehicle")
+        return ("Bad Vehicle", 400)
+
+    # Heli is built on copter
+    if vehicle_name == "Heli":
+        vehicle_name = "Copter"
+
+    artifacts_dir = vehicle_name
+    if branch_name == "master":
+        artifacts_dir += "/latest"
+    else:
+        artifacts_dir += ("/stable-"+get_firmware_version(vehicle_name, branch))
+
+    artifacts_dir += "/"+board
+    path = "https://firmware.ardupilot.org/"+artifacts_dir+"/features.txt"
+    response = requests.get(path, timeout=30)
+
+    if not response.status_code == 200:
+        return ("Could not retrieve features.txt for given vehicle, branch and board combination (Status Code: %d, path: %s)" % (response.status_code, path), response.status_code)
+    # split response by new line character to get a list of defines
+    result = response.text.split('\n')
+    # omit the last string as its always blank
+    return jsonify(result[:-1])
+
 if __name__ == '__main__':
     app.run()

+ 48 - 2
templates/index.html

@@ -52,6 +52,7 @@
             <div id="build_options"></div>
             <br>
             <input type="submit" value="Generate" id="submit" disabled>
+            <input type="button" value="Reset option defaults" id="reset_def" onclick="requestDefaults();">
         </form>
     </div>
     <hr>
@@ -59,6 +60,9 @@
     <div id="build_status"></div>
     <br/>
     <script>
+        // this object contains defines and their corresponding labels for build options
+        var define_labels = {};
+
         function init() {
             refresh_builds();
             requestBranches(document.getElementById("vehicle").value);
@@ -89,6 +93,7 @@
             document.getElementById('board_list').innerHTML = "<p>Please wait. Fetching boards on branch "+branch+" ...";
             document.getElementById('build_options').innerHTML = "<p>Please wait. Fetching build options on branch "+branch+" ...";            
             document.getElementById("submit").disabled = true;
+            document.getElementById("reset_def").disabled = true;
             document.getElementById("branch").disabled = true;
 
             xhr.onload = function () {
@@ -99,7 +104,9 @@
                     features = response_json['features'];
                     fillBoards(boards, default_board);
                     fillBuildOptions(features);
+                    requestDefaults();
                     document.getElementById("submit").disabled = false;
+                    document.getElementById("reset_def").disabled = false;
                 } else {
                     document.getElementById('board_list').innerHTML = "Something went wrong. Please try again. (Response says: "+xhr.response+")";
                     document.getElementById('build_options').innerHTML = "";      
@@ -132,6 +139,7 @@
                                     "<ul class='collapsibleList' id='outer_list'></ul>"+
                                 "</label>";
             outerList = document.getElementById("outer_list");
+            define_labels = [];
             buildOptions.forEach(category => {
                 outerListItem = document.createElement('li');
                 outerListItem.innerHTML = category['name'];
@@ -150,6 +158,7 @@
                     innerListItem.appendChild(checkBox);
                     innerListItem.appendChild(document.createTextNode(option['description']));
                     innerList.appendChild(innerListItem);
+                    define_labels[option['define']] = option['label'];
                 });
                 outerListItem.appendChild(innerList);
                 outerList.appendChild(outerListItem);
@@ -161,11 +170,9 @@
             cb = document.getElementById(f_label);
             switch (cb.name) {
                 case f_label:
-                    console.log("bol");
                     const f_dependency = f_dependency1.split(",")
                     var arrayLength = f_dependency.length;
                     for (var i = 0; i < arrayLength; i++) {
-                        console.log(i);
                         if (document.getElementById(f_dependency[i]).checked == false) {
                             document.getElementById(f_dependency[i]).checked = cb.checked;
                         }
@@ -178,6 +185,7 @@
             var xhr = new XMLHttpRequest();
             xhr.open('GET', '/get_allowed_branches/'+vehicle);           
             document.getElementById("submit").disabled = true;
+            document.getElementById("reset_def").disabled = true;
             document.getElementById("vehicle").disabled = true;
 
             xhr.onload = function () {
@@ -188,10 +196,16 @@
                     old_branch = document.getElementById("branch");
                     fillBranches(branches);
                     document.getElementById("submit").disabled = false;
+                    document.getElementById("reset_def").disabled = false;
                     if (old_branch == null || old_branch.value != default_branch){
                         // branch has changed
                         // fetch boards and features again
                         requestBoardsAndFeatures(default_branch);
+                    } else {
+                        // the new branch and the current branch are same
+                        // branches need not to be changed
+                        // Since the vehicle has changed, reset the defaults
+                        requestDefaults();
                     }
                 } else {
                     document.getElementById('branch_list').innerHTML = "Something went wrong. Please try again. (Response says: "+xhr.response+")";
@@ -216,6 +230,38 @@
                 branchList.appendChild(opt);
             });
         }
+
+        function requestDefaults() {
+            branch = document.getElementById('branch').value;
+            vehicle = document.getElementById('vehicle').value;
+            board = document.getElementById('board').value;
+            document.getElementById("reset_def").disabled = true;
+            
+            var xhr = new XMLHttpRequest();
+            xhr.open('GET', '/get_defaults/'+vehicle+'/'+branch+'/'+board);
+            xhr.onload = function () {
+                if (xhr.status == 200) {
+                    parsed_response = JSON.parse(xhr.response);
+                    setDefaults(parsed_response);
+                } else {
+                    console.log(xhr.response);
+                }
+                document.getElementById("reset_def").disabled = false;
+            }
+            xhr.send();
+        }
+
+        function setDefaults(defines_arr) {
+            for (var i=0; i<defines_arr.length; i++) {
+                var select_opt = (defines_arr[i][0] != '!');
+                var sanitised_define = (select_opt ? defines_arr[i] : defines_arr[i].substring(1)); // this removes the leading '!' from define if it contatins
+                var opt_label = define_labels[sanitised_define];
+                if (opt_label != undefined) {
+                    document.getElementById(opt_label).checked = select_opt;
+                }
+            }
+            return;
+        }
     </script>
 </div>
 </body>