[Toaster] [review-request][PATCH] bitbake: toaster: Enforce unique layer names

Damian, Alexandru alexandru.damian at intel.com
Mon Mar 9 05:19:07 PDT 2015


Taken for submission,

Thank you,
Alex

On Mon, Mar 2, 2015 at 3:00 PM, Michael Wood <michael.g.wood at intel.com>
wrote:

> 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]
>
> Signed-off-by: Michael Wood <michael.g.wood at intel.com>
> ---
>  .../toaster/toastergui/static/js/importlayer.js    | 94
> +++++++++-------------
>  .../toaster/toastergui/templates/importlayer.html  | 39 +++++++--
>  bitbake/lib/toaster/toastergui/views.py            | 11 ++-
>  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 9d54286..d14a8ab 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) {
>            headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
>            success: function (data) {
>              if (data.error != "ok") {
> -              show_error_message(data, layerData);
>                console.log(data.error);
>              } else {
>                /* Success layer import now go to the project page */
> @@ -164,59 +163,7 @@ function importLayerPageInit (ctx) {
>      }
>    });
>
> -  function show_error_message(error, layerData) {
> -
> -    var errorMsg = $("#import-error").fadeIn();
> -    var errorType = error.error;
> -    var body = errorMsg.children("p");
> -    var title = errorMsg.children("h3");
> -    var optionsList = errorMsg.children("ul");
> -    var invalidLayerRevision = $("#invalid-layer-revision-hint");
> -    var layerRevisionCtrl = $("#layer-revision-ctrl");
> -
> -    /* remove any existing items */
> -    optionsList.children().each(function(){ $(this).remove(); });
> -    body.text("");
> -    title.text("");
> -    invalidLayerRevision.hide();
> -    layerNameCtrl.removeClass("error");
> -    layerRevisionCtrl.removeClass("error");
> -
> -    switch (errorType){
> -      case 'hint-layer-version-exists':
> -        title.text("This layer already exists");
> -        body.html("A layer <strong>"+layerData.name+"</strong> already
> exists with this Git repository URL and this revision. You can:");
> -        optionsList.append("<li>Import
> <strong>"+layerData.name+"</strong> with a different revision </li>");
> -        optionsList.append("<li>or <a
> href=\""+ctx.layerDetailsUrl+error.existing_layer_version+"/\" >change the
> revision of the existing layer</a></li>");
> -
> -        layerRevisionCtrl.addClass("error");
> -
> -        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");
> -        invalidLayerRevision.show();
> -        break;
> -
> -      case 'hint-layer-exists-with-different-url':
> -        title.text("This layer already exists");
> -        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>");
> -        optionsList.append("<li>Import the layer under a different
> name</li>");
> -        optionsList.append("<li>or <a
> href=\""+ctx.layerDetailsUrl+error.current_id+"/\" >change the Git
> repository URL of the existing layer</a></li>");
> -        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.");
> -        duplicatedLayerName.show();
> -        layerNameCtrl.addClass("error");
> -        break;
> -
> -      case 'hint-layer-exists':
> -        title.text("This layer already exists");
> -        body.html("A layer <strong>"+layerData.name+"</strong> already
> exists. You can:");
> -        optionsList.append("<li>Import the layer under a different
> name</li>");
> -        break;
> -      default:
> -        title.text("Error")
> -        body.text(data.error);
> -    }
> -  }
> -
> -  function enable_import_btn (enabled) {
> +  function enable_import_btn(enabled) {
>      var importAndAddHint = $("#import-and-add-hint");
>
>      if (enabled) {
> @@ -244,6 +191,38 @@ function importLayerPageInit (ctx) {
>        enable_import_btn(true);
>    }
>
> +  function layerExistsError(layer){
> +    var dupLayerInfo = $("#duplicate-layer-info");
> +    dupLayerInfo.find(".dup-layer-name").text(layer.name);
> +    dupLayerInfo.find(".dup-layer-link").attr("href",
> layer.layerdetailurl);
> +    dupLayerInfo.find("#dup-layer-vcs-url").text(layer.giturl);
> +    dupLayerInfo.find("#dup-layer-revision").text(layer.revision);
> +
> +    $(".fields-apart-from-layer-name").fadeOut(function(){
> +
> +      dupLayerInfo.fadeIn();
> +    });
> +  }
> +
> +  layerNameInput.on('blur', function() {
> +      if (!$(this).val()){
> +        return;
> +      }
> +      var name = $(this).val();
> +
> +      /* Check if the layer name exists */
> +      $.getJSON(ctx.xhrDataTypeaheadUrl, { type : "layers", project_id:
> ctx.projectId, include_added: "true" , value: name }, function(layer) {
> +      if (layer.list.length > 0) {
> +        for (var i in layer.list){
> +          if (layer.list[i].name == name) {
> +            console.log(layer.list[i])
> +            layerExistsError(layer.list[i]);
> +          }
> +        }
> +      }
> +    });
> +  });
> +
>    vcsURLInput.on('input', function() {
>      check_form();
>    });
> @@ -260,6 +239,13 @@ function importLayerPageInit (ctx) {
>        return;
>      }
>
> +    if ($("#duplicate-layer-info").css("display") != "None"){
> +      $("#duplicate-layer-info").fadeOut(function(){
> +        $(".fields-apart-from-layer-name").show();
> +      });
> +
> +    }
> +
>      /* Don't remove the error class if we're displaying the error for
> another
>       * reason.
>       */
> diff --git a/bitbake/lib/toaster/toastergui/templates/importlayer.html
> b/bitbake/lib/toaster/toastergui/templates/importlayer.html
> index 19d2fc4..c687c12 100644
> --- a/bitbake/lib/toaster/toastergui/templates/importlayer.html
> +++ b/bitbake/lib/toaster/toastergui/templates/importlayer.html
> @@ -51,26 +51,51 @@
>                        <div class="control-group" id="layer-name-ctrl">
>                          <label class="control-label"
> for="import-layer-name">
>                              Layer name
> -                            <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 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>
>                          </label>
>                          <div class="controls">
> -                          <input id="import-layer-name" type="text"
> required autofocus>
> +                          <input id="import-layer-name" type="text"
> required autofocus data-autocomplete="off" data-provide="typeahead">
>                            <span class="help-inline" style="display:
> none;" id="invalid-layer-name-hint">A valid layer name can only include
> letters, numbers and dashes</span>
>                            <span class="help-inline" style="display:
> none;" id="duplicated-layer-name-hint"></span>
>                          </div>
>
>                        </div>
> +                      <span id="duplicate-layer-info"
> style="display:none">
> +                        <div class="alert warning">
> +                          <h3>A layer called <a href=""
> class="dup-layer-link"><span class="dup-layer-name"></span></a> already
> exists</h3>
> +                          <p>Layer names must be unqiue. Please use a
> different layer name.</p>
> +                        </div>
> +                        <dl>
> +                          <dt>
> +                            The <span class="dup-layer-name"></span>
> repository url is
> +                          </dt>
> +                          <dd>
> +                            <span id="dup-layer-vcs-url"></span>
> +                          </dd>
> +
> +                          <dt>
> +                            The <span class="dup-layer-name"></span>
> revision is
> +                          </dt>
> +                          <dd>
> +                            <span id="dup-layer-revision"></span>
> +                          </dd>
> +                        </dl>
> +
> +                        <p><a href="" class="dup-layer-link">View the
> <span class="dup-layer-name"></span> layer information</a></p>
>
> +                      </span>
> +
> +                      <span class="fields-apart-from-layer-name">
>                          <label for="layer-git-repo-url"
> class="project-form">
>                              Git repository URL
> -                            <span class="icon-question-sign get-help"
> title="Fetch/clone URL of the repository. Currently, Toaster only supports
> Git repositories." />
> +                            <span class="icon-question-sign get-help"
> title="Fetch/clone URL of the repository. Currently, Toaster only supports
> Git repositories." ></span>
>                          </label>
>
>                          <input type="text" id="layer-git-repo-url"
> class="input-xxlarge" required>
>                          <label class="project-form" for="layer-subdir">
>                              Repository subdirectory
>                              <span class="muted">(optional)</span>
> -                            <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 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>
>                          </label>
>                          <input type="text"  id="layer-subdir">
>
> @@ -83,13 +108,16 @@
>                                  <span class="help-inline"
> style="diaply:none;" id="invalid-layer-revision-hint"></span>
>                              </div>
>                            </div>
> +                        </span>
>
>                      </fieldset>
> +
> +                    <span class="fields-apart-from-layer-name">
>                      <fieldset class="air">
>                          <legend>
>                              Layer dependencies
>                              <span class="muted">(optional)</span>
> -                            <span class="icon-question-sign get-help
> heading-help" title="Other layers this layer depends upon" />
> +                            <span class="icon-question-sign get-help
> heading-help" title="Other layers this layer depends upon"></span>
>                          </legend>
>                          <ul class="unstyled configuration-list"
> id="layer-deps-list">
>                          </ul>
> @@ -105,6 +133,7 @@
>                        <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>
>                          <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>
>                      </div>
> +                  </span>
>                    </form>
>
>  {% endblock %}
> diff --git a/bitbake/lib/toaster/toastergui/views.py
> b/bitbake/lib/toaster/toastergui/views.py
> index 4f4ae67..b078d90 100755
> --- a/bitbake/lib/toaster/toastergui/views.py
> +++ b/bitbake/lib/toaster/toastergui/views.py
> @@ -2227,9 +2227,14 @@ if toastermain.settings.MANAGED:
>
>
>              def _lv_to_dict(x):
> -                return {"id": x.pk, "name": x.layer.name, "tooltip":
> x.layer.vcs_url+" | "+x.commit,
> -                        "detail": "(" + x.layer.vcs_url + (")" if
> x.up_branch == None else " | "+x.up_branch.name+")"),
> -                        "giturl": x.layer.vcs_url, "layerdetailurl" :
> reverse('layerdetails', args=(x.pk,))}
> +                return {"id": x.pk,
> +                        "name": x.layer.name,
> +                        "tooltip": x.layer.vcs_url+" |
> "+x.get_vcs_reference(),
> +                        "detail": "(" + x.layer.vcs_url + (")" if
> x.up_branch == None else " | "+x.get_vcs_reference()+")"),
> +                        "giturl": x.layer.vcs_url,
> +                        "layerdetailurl" : reverse('layerdetails', args=(
> x.pk,)),
> +                        "revision" : x.get_vcs_reference(),
> +                       }
>
>
>              # returns layers for current project release that are not in
> the project set, matching the name
> --
> 2.1.0
>
> --
> _______________________________________________
> toaster mailing list
> toaster at yoctoproject.org
> https://lists.yoctoproject.org/listinfo/toaster
>



-- 
Alex Damian
Yocto Project
SSG / OTC
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.yoctoproject.org/pipermail/toaster/attachments/20150309/bd49c8fd/attachment-0001.html>


More information about the toaster mailing list