summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorMichael Wood <michael.g.wood@intel.com>2015-03-02 15:00:49 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-03-09 14:33:51 +0000
commitdcbfc74c3ce9b69c020ed18ae42b8b27f8dc3991 (patch)
tree70585603069654af81f13bac6d69f3b847567eb8 /bitbake
parentd8ae3ac160a0256f205908fb3f72a2a1a2a85c94 (diff)
downloadpoky-dcbfc74c3ce9b69c020ed18ae42b8b27f8dc3991.tar.gz
bitbake: toaster: Enforce unique layer names
We had some clever functionality to manage duplicate layer names by using layer versions and new revisions, unfortunately this was too opaque to the user. [YOCTO #7337] (Bitbake rev: 4590cfcb2d5e26518e04f8abc8e7c2dad973f6d2) Signed-off-by: Michael Wood <michael.g.wood@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/toaster/toastergui/static/js/importlayer.js94
-rw-r--r--bitbake/lib/toaster/toastergui/templates/importlayer.html39
-rwxr-xr-xbitbake/lib/toaster/toastergui/views.py11
3 files changed, 82 insertions, 62 deletions
diff --git a/bitbake/lib/toaster/toastergui/static/js/importlayer.js b/bitbake/lib/toaster/toastergui/static/js/importlayer.js
index 9d54286f4a..d14a8abcaf 100644
--- a/bitbake/lib/toaster/toastergui/static/js/importlayer.js
+++ b/bitbake/lib/toaster/toastergui/static/js/importlayer.js
@@ -148,7 +148,6 @@ function importLayerPageInit (ctx) {
148 headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, 148 headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
149 success: function (data) { 149 success: function (data) {
150 if (data.error != "ok") { 150 if (data.error != "ok") {
151 show_error_message(data, layerData);
152 console.log(data.error); 151 console.log(data.error);
153 } else { 152 } else {
154 /* Success layer import now go to the project page */ 153 /* Success layer import now go to the project page */
@@ -164,59 +163,7 @@ function importLayerPageInit (ctx) {
164 } 163 }
165 }); 164 });
166 165
167 function show_error_message(error, layerData) { 166 function enable_import_btn(enabled) {
168
169 var errorMsg = $("#import-error").fadeIn();
170 var errorType = error.error;
171 var body = errorMsg.children("p");
172 var title = errorMsg.children("h3");
173 var optionsList = errorMsg.children("ul");
174 var invalidLayerRevision = $("#invalid-layer-revision-hint");
175 var layerRevisionCtrl = $("#layer-revision-ctrl");
176
177 /* remove any existing items */
178 optionsList.children().each(function(){ $(this).remove(); });
179 body.text("");
180 title.text("");
181 invalidLayerRevision.hide();
182 layerNameCtrl.removeClass("error");
183 layerRevisionCtrl.removeClass("error");
184
185 switch (errorType){
186 case 'hint-layer-version-exists':
187 title.text("This layer already exists");
188 body.html("A layer <strong>"+layerData.name+"</strong> already exists with this Git repository URL and this revision. You can:");
189 optionsList.append("<li>Import <strong>"+layerData.name+"</strong> with a different revision </li>");
190 optionsList.append("<li>or <a href=\""+ctx.layerDetailsUrl+error.existing_layer_version+"/\" >change the revision of the existing layer</a></li>");
191
192 layerRevisionCtrl.addClass("error");
193
194 invalidLayerRevision.html("A layer <strong>"+layerData.name+"</strong> already exists with this revision.<br />You can import <strong>"+layerData.name+"</strong> with a different revision");
195 invalidLayerRevision.show();
196 break;
197
198 case 'hint-layer-exists-with-different-url':
199 title.text("This layer already exists");
200 body.html("A layer <strong>"+layerData.name+"</strong> already exists with a different Git repository URL:<p style='margin-top:10px;'><strong>"+error.current_url+"</strong></p><p>You can:</p>");
201 optionsList.append("<li>Import the layer under a different name</li>");
202 optionsList.append("<li>or <a href=\""+ctx.layerDetailsUrl+error.current_id+"/\" >change the Git repository URL of the existing layer</a></li>");
203 duplicatedLayerName.html("A layer <strong>"+layerData.name+"</strong> already exists with a different Git repository URL.<br />To import this layer give it a different name.");
204 duplicatedLayerName.show();
205 layerNameCtrl.addClass("error");
206 break;
207
208 case 'hint-layer-exists':
209 title.text("This layer already exists");
210 body.html("A layer <strong>"+layerData.name+"</strong> already exists. You can:");
211 optionsList.append("<li>Import the layer under a different name</li>");
212 break;
213 default:
214 title.text("Error")
215 body.text(data.error);
216 }
217 }
218
219 function enable_import_btn (enabled) {
220 var importAndAddHint = $("#import-and-add-hint"); 167 var importAndAddHint = $("#import-and-add-hint");
221 168
222 if (enabled) { 169 if (enabled) {
@@ -244,6 +191,38 @@ function importLayerPageInit (ctx) {
244 enable_import_btn(true); 191 enable_import_btn(true);
245 } 192 }
246 193
194 function layerExistsError(layer){
195 var dupLayerInfo = $("#duplicate-layer-info");
196 dupLayerInfo.find(".dup-layer-name").text(layer.name);
197 dupLayerInfo.find(".dup-layer-link").attr("href", layer.layerdetailurl);
198 dupLayerInfo.find("#dup-layer-vcs-url").text(layer.giturl);
199 dupLayerInfo.find("#dup-layer-revision").text(layer.revision);
200
201 $(".fields-apart-from-layer-name").fadeOut(function(){
202
203 dupLayerInfo.fadeIn();
204 });
205 }
206
207 layerNameInput.on('blur', function() {
208 if (!$(this).val()){
209 return;
210 }
211 var name = $(this).val();
212
213 /* Check if the layer name exists */
214 $.getJSON(ctx.xhrDataTypeaheadUrl, { type : "layers", project_id: ctx.projectId, include_added: "true" , value: name }, function(layer) {
215 if (layer.list.length > 0) {
216 for (var i in layer.list){
217 if (layer.list[i].name == name) {
218 console.log(layer.list[i])
219 layerExistsError(layer.list[i]);
220 }
221 }
222 }
223 });
224 });
225
247 vcsURLInput.on('input', function() { 226 vcsURLInput.on('input', function() {
248 check_form(); 227 check_form();
249 }); 228 });
@@ -260,6 +239,13 @@ function importLayerPageInit (ctx) {
260 return; 239 return;
261 } 240 }
262 241
242 if ($("#duplicate-layer-info").css("display") != "None"){
243 $("#duplicate-layer-info").fadeOut(function(){
244 $(".fields-apart-from-layer-name").show();
245 });
246
247 }
248
263 /* Don't remove the error class if we're displaying the error for another 249 /* Don't remove the error class if we're displaying the error for another
264 * reason. 250 * reason.
265 */ 251 */
diff --git a/bitbake/lib/toaster/toastergui/templates/importlayer.html b/bitbake/lib/toaster/toastergui/templates/importlayer.html
index 6b2111a1f4..5ef8a5786c 100644
--- a/bitbake/lib/toaster/toastergui/templates/importlayer.html
+++ b/bitbake/lib/toaster/toastergui/templates/importlayer.html
@@ -51,26 +51,51 @@
51 <div class="control-group" id="layer-name-ctrl"> 51 <div class="control-group" id="layer-name-ctrl">
52 <label class="control-label" for="import-layer-name"> 52 <label class="control-label" for="import-layer-name">
53 Layer name 53 Layer name
54 <span class="icon-question-sign get-help" title="Something like 'meta-mylayer'. Your layer name must be unique and can only include letters, numbers and dashes" /> 54 <span class="icon-question-sign get-help" title="Something like 'meta-mylayer'. Your layer name must be unique and can only include letters, numbers and dashes"></span>
55 </label> 55 </label>
56 <div class="controls"> 56 <div class="controls">
57 <input id="import-layer-name" type="text" required autofocus> 57 <input id="import-layer-name" type="text" required autofocus data-autocomplete="off" data-provide="typeahead">
58 <span class="help-inline" style="display: none;" id="invalid-layer-name-hint">A valid layer name can only include letters, numbers and dashes</span> 58 <span class="help-inline" style="display: none;" id="invalid-layer-name-hint">A valid layer name can only include letters, numbers and dashes</span>
59 <span class="help-inline" style="display: none;" id="duplicated-layer-name-hint"></span> 59 <span class="help-inline" style="display: none;" id="duplicated-layer-name-hint"></span>
60 </div> 60 </div>
61 61
62 </div> 62 </div>
63 <span id="duplicate-layer-info" style="display:none">
64 <div class="alert warning">
65 <h3>A layer called <a href="" class="dup-layer-link"><span class="dup-layer-name"></span></a> already exists</h3>
66 <p>Layer names must be unqiue. Please use a different layer name.</p>
67 </div>
68 <dl>
69 <dt>
70 The <span class="dup-layer-name"></span> repository url is
71 </dt>
72 <dd>
73 <span id="dup-layer-vcs-url"></span>
74 </dd>
75
76 <dt>
77 The <span class="dup-layer-name"></span> revision is
78 </dt>
79 <dd>
80 <span id="dup-layer-revision"></span>
81 </dd>
82 </dl>
83
84 <p><a href="" class="dup-layer-link">View the <span class="dup-layer-name"></span> layer information</a></p>
63 85
86 </span>
87
88 <span class="fields-apart-from-layer-name">
64 <label for="layer-git-repo-url" class="project-form"> 89 <label for="layer-git-repo-url" class="project-form">
65 Git repository URL 90 Git repository URL
66 <span class="icon-question-sign get-help" title="Fetch/clone URL of the repository. Currently, Toaster only supports Git repositories." /> 91 <span class="icon-question-sign get-help" title="Fetch/clone URL of the repository. Currently, Toaster only supports Git repositories." ></span>
67 </label> 92 </label>
68 93
69 <input type="text" id="layer-git-repo-url" class="input-xxlarge" required> 94 <input type="text" id="layer-git-repo-url" class="input-xxlarge" required>
70 <label class="project-form" for="layer-subdir"> 95 <label class="project-form" for="layer-subdir">
71 Repository subdirectory 96 Repository subdirectory
72 <span class="muted">(optional)</span> 97 <span class="muted">(optional)</span>
73 <span class="icon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)" /> 98 <span class="icon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></span>
74 </label> 99 </label>
75 <input type="text" id="layer-subdir"> 100 <input type="text" id="layer-subdir">
76 101
@@ -83,13 +108,16 @@
83 <span class="help-inline" style="diaply:none;" id="invalid-layer-revision-hint"></span> 108 <span class="help-inline" style="diaply:none;" id="invalid-layer-revision-hint"></span>
84 </div> 109 </div>
85 </div> 110 </div>
111 </span>
86 112
87 </fieldset> 113 </fieldset>
114
115 <span class="fields-apart-from-layer-name">
88 <fieldset class="air"> 116 <fieldset class="air">
89 <legend> 117 <legend>
90 Layer dependencies 118 Layer dependencies
91 <span class="muted">(optional)</span> 119 <span class="muted">(optional)</span>
92 <span class="icon-question-sign get-help heading-help" title="Other layers this layer depends upon" /> 120 <span class="icon-question-sign get-help heading-help" title="Other layers this layer depends upon"></span>
93 </legend> 121 </legend>
94 <ul class="unstyled configuration-list" id="layer-deps-list"> 122 <ul class="unstyled configuration-list" id="layer-deps-list">
95 </ul> 123 </ul>
@@ -105,6 +133,7 @@
105 <button class="btn btn-primary btn-large" data-toggle="modal" id="import-and-add-btn" data-target="#dependencies-message" disabled>Import and add to project</button> 133 <button class="btn btn-primary btn-large" data-toggle="modal" id="import-and-add-btn" data-target="#dependencies-message" disabled>Import and add to project</button>
106 <span class="help-inline" id="import-and-add-hint" style="vertical-align: middle;">To import a layer, you need to enter a repository URL, a branch, tag or commit and a layer name</span> 134 <span class="help-inline" id="import-and-add-hint" style="vertical-align: middle;">To import a layer, you need to enter a repository URL, a branch, tag or commit and a layer name</span>
107 </div> 135 </div>
136 </span>
108 </form> 137 </form>
109 138
110{% endblock %} 139{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
index 14029813e8..8034cfceaf 100755
--- a/bitbake/lib/toaster/toastergui/views.py
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -2279,9 +2279,14 @@ if toastermain.settings.MANAGED:
2279 2279
2280 2280
2281 def _lv_to_dict(x): 2281 def _lv_to_dict(x):
2282 return {"id": x.pk, "name": x.layer.name, "tooltip": x.layer.vcs_url+" | "+x.commit, 2282 return {"id": x.pk,
2283 "detail": "(" + x.layer.vcs_url + (")" if x.up_branch == None else " | "+x.up_branch.name+")"), 2283 "name": x.layer.name,
2284 "giturl": x.layer.vcs_url, "layerdetailurl" : reverse('layerdetails', args=(x.pk,))} 2284 "tooltip": x.layer.vcs_url+" | "+x.get_vcs_reference(),
2285 "detail": "(" + x.layer.vcs_url + (")" if x.up_branch == None else " | "+x.get_vcs_reference()+")"),
2286 "giturl": x.layer.vcs_url,
2287 "layerdetailurl" : reverse('layerdetails', args=(x.pk,)),
2288 "revision" : x.get_vcs_reference(),
2289 }
2285 2290
2286 2291
2287 # returns layers for current project release that are not in the project set, matching the name 2292 # returns layers for current project release that are not in the project set, matching the name