Skip to contentSkip to conversation

recipe blacklisted information

PATCH Superseded Alex Franco 6 participants 16 messages Nov 30, 2015 – Dec 2, 2015 1 message not in the archive

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 recipe blacklisted information

Display blacklisted information for recipes on Layerindex, in the recipe details, as well as the recipe search page, and layer page tables. This information is pulled from the PNBLACKLIST variable. Includes a hover text containing the reason for blacklist labels.

Changes to Django and Layerindex files:
- models.py, update.py
- migration file
- templates and static content (stylesheet)

[YOCTO #7855]

---
 .../0010_auto__add_field_recipe_blacklisted.py     | 197 +++++++++++++++++++++
 layerindex/models.py                               |   1 +
 layerindex/static/css/additional.css               |  19 +-
 layerindex/update.py                               |   1 +
 templates/layerindex/detail.html                   |   3 +-
 templates/layerindex/recipedetail.html             |  13 +-
 templates/layerindex/recipes.html                  |   3 +-
 7 files changed, 232 insertions(+), 5 deletions(-)
 create mode 100644 layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py
layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +197 -0
new file mode 100644
index 0000000..e1bb12c
@@ -0,0 +1,197 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding field 'Recipe.blacklisted'
+        db.add_column('layerindex_recipe', 'blacklisted',
+                      self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Deleting field 'Recipe.blacklisted'
+        db.delete_column('layerindex_recipe', 'blacklisted')
+
+
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'layerindex.bbappend': {
+            'Meta': {'object_name': 'BBAppend'},
+            'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'filepath': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']"})
+        },
+        'layerindex.bbclass': {
+            'Meta': {'object_name': 'BBClass'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']"}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'layerindex.branch': {
+            'Meta': {'object_name': 'Branch'},
+            'bitbake_branch': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+            'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+            'sort_priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'})
+        },
+        'layerindex.classicrecipe': {
+            'Meta': {'object_name': 'ClassicRecipe', '_ormbases': ['layerindex.Recipe']},
+            'classic_category': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'cover_comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'cover_layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
+            'cover_pn': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'cover_status': ('django.db.models.fields.CharField', [], {'default': "'U'", 'max_length': '1'}),
+            'cover_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'recipe_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['layerindex.Recipe']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'layerindex.layerbranch': {
+            'Meta': {'object_name': 'LayerBranch'},
+            'actual_branch': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
+            'branch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.Branch']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'layer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerItem']"}),
+            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'vcs_last_commit': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'vcs_last_fetch': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'vcs_last_rev': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
+            'vcs_subdir': ('django.db.models.fields.CharField', [], {'max_length': '40', 'blank': 'True'})
+        },
+        'layerindex.layerdependency': {
+            'Meta': {'object_name': 'LayerDependency'},
+            'dependency': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependents_set'", 'to': "orm['layerindex.LayerItem']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependencies_set'", 'to': "orm['layerindex.LayerBranch']"})
+        },
+        'layerindex.layeritem': {
+            'Meta': {'object_name': 'LayerItem'},
+            'classic': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'description': ('django.db.models.fields.TextField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'index_preference': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'layer_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'mailing_list_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'N'", 'max_length': '1'}),
+            'summary': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'usage_url': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'vcs_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'vcs_web_file_base_url': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'vcs_web_tree_base_url': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'vcs_web_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
+        },
+        'layerindex.layermaintainer': {
+            'Meta': {'object_name': 'LayerMaintainer'},
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']"}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'responsibility': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'A'", 'max_length': '1'})
+        },
+        'layerindex.layernote': {
+            'Meta': {'object_name': 'LayerNote'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'layer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerItem']"}),
+            'text': ('django.db.models.fields.TextField', [], {})
+        },
+        'layerindex.machine': {
+            'Meta': {'object_name': 'Machine'},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']"}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
+        },
+        'layerindex.recipe': {
+            'Meta': {'object_name': 'Recipe'},
+            'bbclassextend': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'blacklisted': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'bugtracker': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'filepath': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'inherits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']"}),
+            'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'pn': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'provides': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'pv': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'section': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'summary': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
+        },
+        'layerindex.recipechange': {
+            'Meta': {'object_name': 'RecipeChange'},
+            'bugtracker': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+            'changeset': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.RecipeChangeset']"}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['layerindex.Recipe']"}),
+            'section': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'summary': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
+        },
+        'layerindex.recipechangeset': {
+            'Meta': {'object_name': 'RecipeChangeset'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+        },
+        'layerindex.recipefiledependency': {
+            'Meta': {'object_name': 'RecipeFileDependency'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['layerindex.LayerBranch']"}),
+            'path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
+            'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.Recipe']"})
+        }
+    }
+
+    complete_apps = ['layerindex']
\ No newline at end of file
layerindex/models.py +1 -0
index c9e9620..cde8fe3 100644
@@ -244,6 +244,7 @@ class Recipe(models.Model):
     bbclassextend = models.CharField(max_length=100, blank=True)
     inherits = models.CharField(max_length=255, blank=True)
     updated = models.DateTimeField(auto_now = True)
+    blacklisted = models.CharField(max_length=255, blank=True)
 
     def vcs_web_url(self):
         url = self.layerbranch.file_url(os.path.join(self.filepath, self.filename))
layerindex/static/css/additional.css +17 -2
index f76582c..e6cf526 100644
@@ -200,14 +200,29 @@ padding: 8px;
     margin-left: 8px;
 }
 
-.icon-hdd {
+.label-inverse, .icon-hdd {
     margin-left: 6px;
 }
 
-.icon-hdd:hover {
+.label-inverse:hover, .icon-hdd:hover {
     cursor: pointer;
 }
 
+.label-inverse:hover {
+    background-color: #999;
+}
+
 ul.unstyled {
     margin-bottom: 0;
 }
+
+blockquote.span7.warn {
+    border-color: #c09853;
+    margin-bottom: 0;
+    margin-left: 0;
+    min-height: 0;
+}
+
+.valign-middle {
+    vertical-align: middle;
+}
layerindex/update.py +1 -0
index 1e96da6..3680498 100755
@@ -69,6 +69,7 @@ def update_recipe_file(data, path, recipe, layerdir_start, repodir):
         gr = set(data.getVar("__inherit_cache", True) or [])
         lr = set(envdata.getVar("__inherit_cache", True) or [])
         recipe.inherits = ' '.join(sorted({split_recipe_fn(r)[0] for r in lr if r not in gr}))
+        recipe.blacklisted = envdata.getVarFlag('PNBLACKLIST', recipe.pn, True) or ""
         recipe.save()
 
         # Get file dependencies within this layer
templates/layerindex/detail.html +2 -1
index 8a734ff..feb2c6c 100644
@@ -198,7 +198,7 @@
                         <tbody>
                             {% for recipe in layerbranch.sorted_recipes %}
                                 <tr>
-                                    <td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}</td>
+                                    <td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}{% if recipe.blacklisted %}<span class="label label-inverse" title="{{ recipe.blacklisted }}">blacklisted</span>{% endif %}</td>
                                     <td>{{ recipe.pv }}</td>
                                     <td class="span8">{{ recipe.short_desc }}</td>
                                 </tr>
@@ -323,6 +323,7 @@
                 })
 
                 $('.icon-hdd').tooltip({title:"Inherits image"});
+                $('.label-inverse').tooltip();
             });
         });
     </script>
templates/layerindex/recipedetail.html +12 -1
index 3b8c79b..7dbb362 100644
@@ -30,9 +30,20 @@
         <div class="row-fluid">
 
             <div class="page-header">
-                <h1>{{ recipe.name }} {{ recipe.pv }}</h1>
+                <h1>{{ recipe.name }} {{ recipe.pv }} {% if recipe.blacklisted %} <span class="label label-inverse valign-middle">blacklisted</span> {% endif %}</h1>
             </div>
 
+            {% if recipe.blacklisted %}
+                <div class="alert">
+                    <div class="row-fluid">
+                        <p>This recipe is <strong>blacklisted</strong> by the <a href="{% url layer_item recipe.layerbranch.branch.name recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a> layer. The reason provided is:</p>
+                        <blockquote class="span7 warn">
+                            <p>{{ recipe.blacklisted }}</p>
+                        </blockquote>
+                    </div>
+                </div>
+            {% endif %}
+
                 <table class="table table-striped table-bordered">
                     <tbody>
                         <tr>
templates/layerindex/recipes.html +2 -1
index 322d7c6..c2141a4 100644
@@ -52,7 +52,7 @@
                     <tbody>
                         {% for recipe in recipe_list %}
                             <tr {% if recipe.preferred_count > 0 %}class="muted"{% endif %}>
-                                <td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}</td>
+                                <td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}{% if recipe.blacklisted %}<span class="label label-inverse" title="{{ recipe.blacklisted }}">blacklisted</span>{% endif %}</td>
                                 <td>{{ recipe.pv }}</td>
                                 <td>{{ recipe.short_desc }}</td>
                                 <td><a href="{% url layer_item url_branch recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a></td>
@@ -84,6 +84,7 @@
             firstfield.focus()
 
         $('.icon-hdd').tooltip({title:"Inherits image"});
+        $('.label-inverse').tooltip();
     });
 </script>
 {% endblock %}
Signature · 1 line
1.8.4.5
#1 lore raw

Hi Alex,

Quoted 440 lines · On Mon, 30 Nov 2015 16:03:05 Alex Franco wrote:

Display blacklisted information for recipes on Layerindex, in the recipe details, as well as the recipe search page, and layer page tables. This information is pulled from the PNBLACKLIST variable. Includes a hover text containing the reason for blacklist labels.

Changes to Django and Layerindex files:
- models.py, update.py
- migration file
- templates and static content (stylesheet)

[YOCTO #7855]

---
 .../0010_auto__add_field_recipe_blacklisted.py     | 197
+++++++++++++++++++++ layerindex/models.py                               | 
 1 +
 layerindex/static/css/additional.css               |  19 +-
 layerindex/update.py                               |   1 +
 templates/layerindex/detail.html                   |   3 +-
 templates/layerindex/recipedetail.html             |  13 +-
 templates/layerindex/recipes.html                  |   3 +-
 7 files changed, 232 insertions(+), 5 deletions(-)
 create mode 100644

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py

diff --git a/layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py b/layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file mode 100644
index 0000000..e1bb12c

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +13 -0
@@ -0,0 +1,197 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding field 'Recipe.blacklisted'
+        db.add_column('layerindex_recipe', 'blacklisted',
+                     

self.gf('django.db.models.fields.CharField')(default='', max_length=255,
blank=True), + keep_default=False)

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +11 -0
+
+
+    def backwards(self, orm):
+        # Deleting field 'Recipe.blacklisted'
+        db.delete_column('layerindex_recipe', 'blacklisted')
+
+
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key':

'True'}), + 'name': ('django.db.models.fields.CharField', [],
{'unique': 'True', 'max_length': '80'}), + 'permissions':
('django.db.models.fields.related.ManyToManyField', [], {'to':
"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) +
},

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +2 -0
+        'auth.permission': {
+            'Meta': {'ordering': "('content_type__app_label',

'content_type__model', 'codename')", 'unique_together': "(('content_type',
'codename'),)", 'object_name': 'Permission'}, + 'codename':
('django.db.models.fields.CharField', [], {'max_length': '100'}), +
'content_type': ('django.db.models.fields.related.ForeignKey', [],
{'to': "orm['contenttypes.ContentType']"}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +

     'name': ('django.db.models.fields.CharField', [], {'max_length':

'50'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [],

{'default': 'datetime.datetime.now'}), + 'email':
('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank':
'True'}), + 'first_name': ('django.db.models.fields.CharField',
[], {'max_length': '30', 'blank': 'True'}), + 'groups':
('django.db.models.fields.related.ManyToManyField', [], {'to':
"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), +
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [],
{'default': 'True'}), + 'is_staff':
('django.db.models.fields.BooleanField', [], {'default': 'False'}), +

     'is_superuser': ('django.db.models.fields.BooleanField', [],

{'default': 'False'}), + 'last_login':
('django.db.models.fields.DateTimeField', [], {'default':
'datetime.datetime.now'}), + 'last_name':
('django.db.models.fields.CharField', [], {'max_length': '30', 'blank':
'True'}), + 'password': ('django.db.models.fields.CharField',
[], {'max_length': '128'}), + 'user_permissions':
('django.db.models.fields.related.ManyToManyField', [], {'to':
"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), +

      'username': ('django.db.models.fields.CharField', [], {'unique':

'True', 'max_length': '30'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +2 -0
+        'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together':

"(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table':
"'django_content_type'"}, + 'app_label':
('django.db.models.fields.CharField', [], {'max_length': '100'}), +
'id': ('django.db.models.fields.AutoField', [], {'primary_key':
'True'}), + 'model': ('django.db.models.fields.CharField', [],
{'max_length': '100'}), + 'name':
('django.db.models.fields.CharField', [], {'max_length': '100'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.bbappend': {
+            'Meta': {'object_name': 'BBAppend'},
+            'filename': ('django.db.models.fields.CharField', [],

{'max_length': '255'}), + 'filepath':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'id': ('django.db.models.fields.AutoField', [],
{'primary_key': 'True'}), + 'layerbranch':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.LayerBranch']"}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.bbclass': {
+            'Meta': {'object_name': 'BBClass'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key':

'True'}), + 'layerbranch':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.LayerBranch']"}), + 'name':
('django.db.models.fields.CharField', [], {'max_length': '100'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.branch': {
+            'Meta': {'object_name': 'Branch'},
+            'bitbake_branch': ('django.db.models.fields.CharField', [],

{'max_length': '50'}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +

     'name': ('django.db.models.fields.CharField', [], {'max_length':

'50'}), + 'short_description':
('django.db.models.fields.CharField', [], {'max_length': '50', 'blank':
'True'}), + 'sort_priority':
('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank':
'True'}), + 'updated': ('django.db.models.fields.DateTimeField',
[], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank':
'True'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +2 -0
+        'layerindex.classicrecipe': {
+            'Meta': {'object_name': 'ClassicRecipe', '_ormbases':

['layerindex.Recipe']}, + 'classic_category':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'cover_comment':
('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'cover_layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']", 'null': 'True', 'on_delete':
'models.SET_NULL', 'blank': 'True'}), + 'cover_pn':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'cover_status':
('django.db.models.fields.CharField', [], {'default': "'U'", 'max_length':
'1'}), + 'cover_verified':
('django.db.models.fields.BooleanField', [], {'default': 'False'}), +

     'recipe_ptr': ('django.db.models.fields.related.OneToOneField', [],

{'to': "orm['layerindex.Recipe']", 'unique': 'True', 'primary_key':
'True'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.layerbranch': {
+            'Meta': {'object_name': 'LayerBranch'},
+            'actual_branch': ('django.db.models.fields.CharField', [],

{'max_length': '80', 'blank': 'True'}), + 'branch':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.Branch']"}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +

     'layer': ('django.db.models.fields.related.ForeignKey', [], {'to':

"orm['layerindex.LayerItem']"}), + 'updated':
('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank':
'True'}), + 'vcs_last_commit':
('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank':
'True'}), + 'vcs_last_fetch':
('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank':
'True'}), + 'vcs_last_rev':
('django.db.models.fields.CharField', [], {'max_length': '80', 'blank':
'True'}), + 'vcs_subdir': ('django.db.models.fields.CharField',
[], {'max_length': '40', 'blank': 'True'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.layerdependency': {
+            'Meta': {'object_name': 'LayerDependency'},
+            'dependency': ('django.db.models.fields.related.ForeignKey',

[], {'related_name': "'dependents_set'", 'to':
"orm['layerindex.LayerItem']"}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +

     'layerbranch': ('django.db.models.fields.related.ForeignKey', [],

{'related_name': "'dependencies_set'", 'to':
"orm['layerindex.LayerBranch']"}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.layeritem': {
+            'Meta': {'object_name': 'LayerItem'},
+            'classic': ('django.db.models.fields.BooleanField', [],

{'default': 'False'}), + 'description':
('django.db.models.fields.TextField', [], {}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +

     'index_preference': ('django.db.models.fields.IntegerField', [],

{'default': '0'}), + 'layer_type':
('django.db.models.fields.CharField', [], {'max_length': '1'}), +
'mailing_list_url': ('django.db.models.fields.URLField', [],
{'max_length': '200', 'blank': 'True'}), + 'name':
('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length':
'40'}), + 'status': ('django.db.models.fields.CharField', [],
{'default': "'N'", 'max_length': '1'}), + 'summary':
('django.db.models.fields.CharField', [], {'max_length': '200'}), +
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now':
'True', 'blank': 'True'}), + 'usage_url':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'vcs_url': ('django.db.models.fields.CharField', [],
{'max_length': '255'}), + 'vcs_web_file_base_url':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'vcs_web_tree_base_url':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'vcs_web_url': ('django.db.models.fields.URLField',
[], {'max_length': '200', 'blank': 'True'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.layermaintainer': {
+            'Meta': {'object_name': 'LayerMaintainer'},
+            'email': ('django.db.models.fields.CharField', [],

{'max_length': '255'}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +

     'layerbranch': ('django.db.models.fields.related.ForeignKey', [],

{'to': "orm['layerindex.LayerBranch']"}), + 'name':
('django.db.models.fields.CharField', [], {'max_length': '255'}), +
'responsibility': ('django.db.models.fields.CharField', [],
{'max_length': '200', 'blank': 'True'}), + 'status':
('django.db.models.fields.CharField', [], {'default': "'A'", 'max_length':
'1'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.layernote': {
+            'Meta': {'object_name': 'LayerNote'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key':

'True'}), + 'layer':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.LayerItem']"}), + 'text':
('django.db.models.fields.TextField', [], {}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.machine': {
+            'Meta': {'object_name': 'Machine'},
+            'description': ('django.db.models.fields.CharField', [],

{'max_length': '255'}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +

     'layerbranch': ('django.db.models.fields.related.ForeignKey', [],

{'to': "orm['layerindex.LayerBranch']"}), + 'name':
('django.db.models.fields.CharField', [], {'max_length': '255'}), +
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now':
'True', 'blank': 'True'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.recipe': {
+            'Meta': {'object_name': 'Recipe'},
+            'bbclassextend': ('django.db.models.fields.CharField', [],

{'max_length': '100', 'blank': 'True'}), + 'blacklisted':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'bugtracker': ('django.db.models.fields.URLField',
[], {'max_length': '200', 'blank': 'True'}), + 'description':
('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'filename': ('django.db.models.fields.CharField', [], {'max_length':
'255'}), + 'filepath': ('django.db.models.fields.CharField', [],
{'max_length': '255', 'blank': 'True'}), + 'homepage':
('django.db.models.fields.URLField', [], {'max_length': '200', 'blank':
'True'}), + 'id': ('django.db.models.fields.AutoField', [],
{'primary_key': 'True'}), + 'inherits':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'layerbranch':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.LayerBranch']"}), + 'license':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'pn': ('django.db.models.fields.CharField', [],
{'max_length': '100', 'blank': 'True'}), + 'provides':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'pv': ('django.db.models.fields.CharField', [],
{'max_length': '100', 'blank': 'True'}), + 'section':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'summary': ('django.db.models.fields.CharField', [],
{'max_length': '200', 'blank': 'True'}), + 'updated':
('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank':
'True'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.recipechange': {
+            'Meta': {'object_name': 'RecipeChange'},
+            'bugtracker': ('django.db.models.fields.URLField', [],

{'max_length': '200', 'blank': 'True'}), + 'changeset':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.RecipeChangeset']"}), + 'description':
('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200',
'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField',
[], {'primary_key': 'True'}), + 'license':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'recipe':
('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'",
'to': "orm['layerindex.Recipe']"}), + 'section':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'summary': ('django.db.models.fields.CharField', [],
{'max_length': '100', 'blank': 'True'}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.recipechangeset': {
+            'Meta': {'object_name': 'RecipeChangeset'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key':

'True'}), + 'name': ('django.db.models.fields.CharField', [],
{'max_length': '255'}), + 'user':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['auth.User']"}) + },

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+        'layerindex.recipefiledependency': {
+            'Meta': {'object_name': 'RecipeFileDependency'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key':

'True'}), + 'layerbranch':
('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'",
'to': "orm['layerindex.LayerBranch']"}), + 'path':
('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index':
'True'}), + 'recipe':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.Recipe']"}) + }

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3 -0
+    }
+
+    complete_apps = ['layerindex']
\ No newline at end of file
layerindex/models.py +1 -0
index c9e9620..cde8fe3 100644
@@ -244,6 +244,7 @@ class Recipe(models.Model):
     bbclassextend = models.CharField(max_length=100, blank=True)
     inherits = models.CharField(max_length=255, blank=True)
     updated = models.DateTimeField(auto_now = True)
+    blacklisted = models.CharField(max_length=255, blank=True)
 
     def vcs_web_url(self):
         url = self.layerbranch.file_url(os.path.join(self.filepath,

self.filename)) diff --git a/layerindex/static/css/additional.css b/layerindex/static/css/additional.css index f76582c..e6cf526 100644

layerindex/static/css/additional.css +17 -2
@@ -200,14 +200,29 @@ padding: 8px;
     margin-left: 8px;
 }
 
-.icon-hdd {
+.label-inverse, .icon-hdd {
     margin-left: 6px;
 }
 
-.icon-hdd:hover {
+.label-inverse:hover, .icon-hdd:hover {
     cursor: pointer;
 }
 
+.label-inverse:hover {
+    background-color: #999;
+}
+
 ul.unstyled {
     margin-bottom: 0;
 }
+
+blockquote.span7.warn {
+    border-color: #c09853;
+    margin-bottom: 0;
+    margin-left: 0;
+    min-height: 0;
+}
+
+.valign-middle {
+    vertical-align: middle;
+}
layerindex/update.py +0 -0
index 1e96da6..3680498 100755
@@ -69,6 +69,7 @@ def update_recipe_file(data, path, recipe, layerdir_start,
 repodir): gr = set(data.getVar("__inherit_cache", True) or [])
         lr = set(envdata.getVar("__inherit_cache", True) or [])
         recipe.inherits = ' '.join(sorted({split_recipe_fn(r)[0] for r in

lr if r not in gr})) + recipe.blacklisted =
envdata.getVarFlag('PNBLACKLIST', recipe.pn, True) or "" recipe.save()

# Get file dependencies within this layer

(quoted diff) +0 -0

b/templates/layerindex/detail.html index 8a734ff..feb2c6c 100644

templates/layerindex/detail.html +0 -1
@@ -198,7 +198,7 @@
                         <tbody>
                             {% for recipe in layerbranch.sorted_recipes %}
                                 <tr>
-                                    <td><a href="{% url recipe recipe.id

%}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}</td> +
<td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}{% if recipe.blacklisted %}<span class="label label-inverse" title="{{ recipe.blacklisted }}">blacklisted</span>{% endif %}</td> <td>{{ recipe.pv }}</td>

                                     <td class="span8">{{ recipe.short_desc
}}</td> </tr>
templates/layerindex/detail.html +1 -0
@@ -323,6 +323,7 @@
                 })
 
                 $('.icon-hdd').tooltip({title:"Inherits image"});
+                $('.label-inverse').tooltip();
             });
         });
     </script>
(quoted diff) +0 -0

b/templates/layerindex/recipedetail.html index 3b8c79b..7dbb362 100644

templates/layerindex/recipedetail.html +1 -1
@@ -30,9 +30,20 @@
         <div class="row-fluid">
 
             <div class="page-header">
-                <h1>{{ recipe.name }} {{ recipe.pv }}</h1>
+                <h1>{{ recipe.name }} {{ recipe.pv }} {% if

recipe.blacklisted %} <span class="label label-inverse valign-middle">blacklisted</span> {% endif %}</h1> </div>

templates/layerindex/recipedetail.html +4 -0
+            {% if recipe.blacklisted %}
+                <div class="alert">
+                    <div class="row-fluid">
+                        <p>This recipe is <strong>blacklisted</strong> by

the <a href="{% url layer_item recipe.layerbranch.branch.name recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a>
layer. The reason provided is:</p> + <blockquote
class="span7 warn">

templates/layerindex/recipedetail.html +6 -0
+                            <p>{{ recipe.blacklisted }}</p>
+                        </blockquote>
+                    </div>
+                </div>
+            {% endif %}
+
                 <table class="table table-striped table-bordered">
                     <tbody>
                         <tr>
(quoted diff) +0 -0

b/templates/layerindex/recipes.html index 322d7c6..c2141a4 100644

templates/layerindex/recipes.html +0 -0
@@ -52,7 +52,7 @@
                     <tbody>
                         {% for recipe in recipe_list %}
                             <tr {% if recipe.preferred_count > 0

%}class="muted"{% endif %}> - <td><a
href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}</td> +

                      <td><a href="{% url recipe recipe.id %}">{{

recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}{% if recipe.blacklisted %}<span class="label label-inverse" title="{{ recipe.blacklisted }}">blacklisted</span>{% endif %}</td> <td>{{ recipe.pv }}</td>
<td>{{ recipe.short_desc }}</td> <td><a href="{% url layer_item url_branch
recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a></td> @@ -84,6 +84,7 @@

Quoted 7 lines
             firstfield.focus()

         $('.icon-hdd').tooltip({title:"Inherits image"});
+        $('.label-inverse').tooltip();
     });

</script>
{% endblock %}

This looks great, thanks.

Another thing that just occurred to me though - apologies for not raising it earlier - for the benefit of newer users it may be useful to explain implications of the blacklisting. What I'd suggest is we put a line after the reason on the recipe detail page saying "This means that the recipe will not be buildable until the PNBLACKLIST value is cleared and the issue that caused it to be added has been fixed or worked around." (Just on the recipe detail page - not in the popup.)

Does that sound OK?

Cheers,
Paul

Signature · 2 lines
Paul Eggleton
Intel Open Source Technology Centre
#2 lore raw

strange QA issue - how to ignore automatic so dependency

I'm trying to include binary JDK into my linux image.
just unpacking jdk-...tar.gz into recipe image and packing it into RPM (I'm using RPM as base of my distribution).

after adding
INSANE_SKIP_${PN} = "file-rdeps ldflags dev-so build-deps" into recipe I've got no errors or warning while building recipe itself, RPM is created and it contains some dynamic libraries dependencies....

but I've got error building rootfs with this recipe:

....(skipped)...
Updating cache... ######################################## [100%]

Computing transaction...error: Can't install tps-jdk-7u60+linux+arm+vfp+hflt-r0@cortexa8hf_vfp_neon: no package provides libXrender.so.1

I can't include libXrender.so.1 into my image, I can't remove libraries from JDK.

Is there any way to ignore this dependency?

something like RPM_LDD_IGNORE_CHECK="libX*"

#3 lore raw

Re: strange QA issue - how to ignore automatic so dependency

Quoted 14 lines · Dvorkin Dmitry

I'm trying to include binary JDK into my linux image.
just unpacking jdk-...tar.gz into recipe image and packing it into RPM (I'm using RPM as base of my distribution).

after adding
INSANE_SKIP_${PN} = "file-rdeps ldflags dev-so build-deps" into recipe I've got no errors or warning while building recipe itself, RPM is created and it contains some dynamic libraries dependencies....

but I've got error building rootfs with this recipe:

Quoted 8 lines

....(skipped)...
Updating cache... ######################################## [100%]

Computing transaction...error: Can't install tps-jdk-7u60+linux+arm+vfp+hflt-r0@cortexa8hf_vfp_neon: no package provides libXrender.so.1

I can't include libXrender.so.1 into my image, I can't remove libraries from JDK.

Is there any way to ignore this dependency?

No, and if you ignored it then this binary won’t function as expected on the system. So you should find out providers of missing rdeps and add them to your image via depends

Quoted 8 lines

something like RPM_LDD_IGNORE_CHECK="libX*"

--
_______________________________________________
yocto mailing list
[email protected]
https://lists.yoctoproject.org/listinfo/yocto

#4 lore raw

Re: strange QA issue - how to ignore automatic so dependency

I know. But
it really does not require to have libX* in the system to successfully run JDK+our software We're using simple tar xvzf jdk-...tar.gz in all of our embedded systems, so I know what I'm talking about, sorry. This feature blocks my efforts to have a well-designed system with Poky/Yocto... :(

Quoted 31 lines · Khem Raj
Quoted 13 lines · Dvorkin Dmitry

I'm trying to include binary JDK into my linux image.
just unpacking jdk-...tar.gz into recipe image and packing it into RPM (I'm using RPM as base of my distribution).

after adding
INSANE_SKIP_${PN} = "file-rdeps ldflags dev-so build-deps" into recipe I've got no errors or warning while building recipe itself, RPM is created and it contains some dynamic libraries dependencies....

but I've got error building rootfs with this recipe:

Quoted 8 lines

....(skipped)...
Updating cache... ######################################## [100%]

Computing transaction...error: Can't install tps-jdk-7u60+linux+arm+vfp+hflt-r0@cortexa8hf_vfp_neon: no package provides libXrender.so.1

I can't include libXrender.so.1 into my image, I can't remove libraries from JDK.

Is there any way to ignore this dependency?

No, and if you ignored it then this binary won’t function as expected on the system. So you should find out providers of missing rdeps and add them to your image via depends

Quoted 7 lines

something like RPM_LDD_IGNORE_CHECK="libX*"

--
_______________________________________________
yocto mailing list
[email protected]
https://lists.yoctoproject.org/listinfo/yocto

#5 lore raw

Re: strange QA issue - how to ignore automatic so dependency

Quoted 6 lines · Dvorkin Dmitry

I know. But
it really does not require to have libX* in the system to successfully run JDK+our software We're using simple tar xvzf jdk-...tar.gz in all of our embedded systems, so I know what I'm talking about, sorry.

you are walking muddy water, I will caution you before I hand a chainsaw to you as I suggest something as below. you can use patchelf or something like that on these binaries and remove the dependencies after unpacking them run the .so in question via patchelf --remove-needed <deplib-to-remove>
and that will make shlibs code in OE not flag them

Quoted 1 line

This feature blocks my efforts to have a well-designed system with Poky/Yocto... :(

Well designed would mean to adhere to prerequisites as needed by prebuilt software you are using

Quoted 35 lines · Khem Raj
Quoted 31 lines
Quoted 13 lines · Dvorkin Dmitry

I'm trying to include binary JDK into my linux image.
just unpacking jdk-...tar.gz into recipe image and packing it into RPM (I'm using RPM as base of my distribution).

after adding
INSANE_SKIP_${PN} = "file-rdeps ldflags dev-so build-deps" into recipe I've got no errors or warning while building recipe itself, RPM is created and it contains some dynamic libraries dependencies....

but I've got error building rootfs with this recipe:

Quoted 8 lines

....(skipped)...
Updating cache... ######################################## [100%]

Computing transaction...error: Can't install tps-jdk-7u60+linux+arm+vfp+hflt-r0@cortexa8hf_vfp_neon: no package provides libXrender.so.1

I can't include libXrender.so.1 into my image, I can't remove libraries from JDK.

Is there any way to ignore this dependency?

No, and if you ignored it then this binary won’t function as expected on the system. So you should find out providers of missing rdeps and add them to your image via depends

Quoted 7 lines

something like RPM_LDD_IGNORE_CHECK="libX*"

--
_______________________________________________
yocto mailing list
[email protected]
https://lists.yoctoproject.org/listinfo/yocto

#6 lore raw

Re: strange QA issue - how to ignore automatic so dependency

Quoted 6 lines · Khem Raj
Quoted 5 lines · Dvorkin Dmitry

I know. But
it really does not require to have libX* in the system to successfully run JDK+our software We're using simple tar xvzf jdk-...tar.gz in all of our embedded systems, so I know what I'm talking about, sorry.

you are walking muddy water, I will caution you before I hand a chainsaw to you as I suggest something as below.

I see. Thank you!

Quoted 40 lines

you can use patchelf or something like that on these binaries and remove the dependencies after unpacking them run the .so in question via patchelf --remove-needed <deplib-to-remove>
and that will make shlibs code in OE not flag them

Quoted 1 line

This feature blocks my efforts to have a well-designed system with Poky/Yocto... :(

Well designed would mean to adhere to prerequisites as needed by prebuilt software you are using

Quoted 33 lines · Khem Raj
Quoted 31 lines
Quoted 13 lines · Dvorkin Dmitry

I'm trying to include binary JDK into my linux image.
just unpacking jdk-...tar.gz into recipe image and packing it into RPM (I'm using RPM as base of my distribution).

after adding
INSANE_SKIP_${PN} = "file-rdeps ldflags dev-so build-deps" into recipe I've got no errors or warning while building recipe itself, RPM is created and it contains some dynamic libraries dependencies....

but I've got error building rootfs with this recipe:

Quoted 8 lines

....(skipped)...
Updating cache... ######################################## [100%]

Computing transaction...error: Can't install tps-jdk-7u60+linux+arm+vfp+hflt-r0@cortexa8hf_vfp_neon: no package provides libXrender.so.1

I can't include libXrender.so.1 into my image, I can't remove libraries from JDK.

Is there any way to ignore this dependency?

No, and if you ignored it then this binary won’t function as expected on the system. So you should find out providers of missing rdeps and add them to your image via depends

Quoted 7 lines

something like RPM_LDD_IGNORE_CHECK="libX*"

--
_______________________________________________
yocto mailing list
[email protected]
https://lists.yoctoproject.org/listinfo/yocto

#7 lore raw
In reply to Paul Eggleton
Quoted 39 lines · Paul Eggleton

Hi Alex,

Quoted 24 lines · On Mon, 30 Nov 2015 16:03:05 Alex Franco wrote:

Display blacklisted information for recipes on Layerindex, in the recipe details, as well as the recipe search page, and layer page tables. This information is pulled from the PNBLACKLIST variable. Includes a hover text containing the reason for blacklist labels.

Changes to Django and Layerindex files:
- models.py, update.py
- migration file
- templates and static content (stylesheet)

[YOCTO #7855]

---
 .../0010_auto__add_field_recipe_blacklisted.py     | 197
+++++++++++++++++++++ layerindex/models.py                               | 
 1 +
 layerindex/static/css/additional.css               |  19 +-
 layerindex/update.py                               |   1 +
 templates/layerindex/detail.html                   |   3 +-
 templates/layerindex/recipedetail.html             |  13 +-
 templates/layerindex/recipes.html                  |   3 +-
 7 files changed, 232 insertions(+), 5 deletions(-)
 create mode 100644
Quoted 2 lines

layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py

This looks great, thanks.

Another thing that just occurred to me though - apologies for not raising it earlier - for the benefit of newer users it may be useful to explain implications of the blacklisting. What I'd suggest is we put a line after the reason on the recipe detail page saying "This means that the recipe will not be buildable until the PNBLACKLIST value is cleared and the issue that caused it to be added has been fixed or worked around." (Just on the recipe detail page - not in the popup.)

Quoted 1 line

Does that sound OK?

Maybe some more information how to clear PNBLACKLIST (people often don't know that they can just set it to empty value in their bbappend or even distro/local config).

Signature · 1 line
Martin 'JaMa' Jansa     jabber: [email protected]
#8 lore raw
Quoted 14 lines · On 01/12/2015 09:40, "[email protected] on behalf of Martin…
Quoted 5 lines

Another thing that just occurred to me though - apologies for not raising it
earlier - for the benefit of newer users it may be useful to explain implications of the blacklisting. What I'd suggest is we put a line after the

Quoted 8 lines

reason on the recipe detail page saying "This means that the recipe will not
be buildable until the PNBLACKLIST value is cleared and the issue that caused
it to be added has been fixed or worked around." (Just on the recipe detail
page - not in the popup.)
Does that sound OK?

Quoted 3 lines

Maybe some more information how to clear PNBLACKLIST (people often don't know that they can just set it to empty value in their bbappend or even distro/local config).

I think explaining what blacklisting means, its implications and how to clear it is an excellent idea, but it seems there is quite a lot to say, and the layer index itself might not be the best place to show it all. So what about adding all this to the documentation, then link to it from the layer index? The recipe details page would then look like the attached image.

Alex, sorry for nitpicking: using the .label-inverse class means that the label in the h1 of the recipe details page also hovers. Only labels with a tooltip should hover, so maybe we should go back to the extra class, or just qualify the hover styles so that they only apply to .label-inverse inside tables (td > .label-inverse:hover). Apologies: I should have picked this up before you submitted the patch.

Cheers

Belén

Quoted 3 lines
Signature · 2 lines
-- 
Martin 'JaMa' Jansa     jabber: [email protected]
#9 lore raw
Quoted 24 lines · Belen
Quoted 14 lines · On 01/12/2015 09:40, "[email protected] on behalf of Martin…
Quoted 5 lines

Another thing that just occurred to me though - apologies for not raising it
earlier - for the benefit of newer users it may be useful to explain implications of the blacklisting. What I'd suggest is we put a line after the

Quoted 8 lines

reason on the recipe detail page saying "This means that the recipe will not
be buildable until the PNBLACKLIST value is cleared and the issue that caused
it to be added has been fixed or worked around." (Just on the recipe detail
page - not in the popup.)
Does that sound OK?

Quoted 3 lines

Maybe some more information how to clear PNBLACKLIST (people often don't know that they can just set it to empty value in their bbappend or even distro/local config).

Quoted 6 lines

I think explaining what blacklisting means, its implications and how to clear it is an excellent idea, but it seems there is quite a lot to say, and the layer index itself might not be the best place to show it all. So what about adding all this to the documentation, then link to it from the layer index? The recipe details page would then look like the attached image.

Agreed, LGTM.

Quoted 16 lines

Alex, sorry for nitpicking: using the .label-inverse class means that the label in the h1 of the recipe details page also hovers. Only labels with a tooltip should hover, so maybe we should go back to the extra class, or just qualify the hover styles so that they only apply to .label-inverse inside tables (td > .label-inverse:hover). Apologies: I should have picked this up before you submitted the patch.

Cheers

Belén

Quoted 3 lines
Signature · 2 lines
-- 
Martin 'JaMa' Jansa     jabber: [email protected]
Signature · 1 line
Martin 'JaMa' Jansa     jabber: [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

#11 lore raw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.

@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though, I can fix the hover situation and also add in the link to the documentation.

@All: I suppose the link should go to:

http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-
PNBLACKLIST

- - Alex Franco
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQEcBAEBAgAGBQJWXeZFAAoJEPR9uwMY2lTL65EH/171Bk40iVaF7Jgg/gdYDOSG 1HS8eYw55ldjEDh8YAGKKdboHyPD8pY65P8lAovY9lzFDP9rx29QO8pKv2CoG48S 9MLjLxrAtRmXpqUWhp5LZ+GKjRNfSvUTnyergS/8uzh6uG0fsAnQ9li4XvHqonAi c/mMG44tWTYclA4YBVFRLaAR5aDCYbIGZOf7qL79XkdNF3WMOLHPzzeGcZQ8Ch89 /Ox4KxFMfS3jLcn7uMSTGddX5ehjsbA+WvF9sBfeKkjYVzUhMIGJ/r7uNWOeHBwJ aB4tVHBtGrGHVrstgeKIlpjyppv9qfHReOZG841Sf8XVY02kdX6jH4kwM1Wg11k= =WLLq
-----END PGP SIGNATURE-----

#12 lore raw
Quoted 10 lines · On Tue, 01 Dec 2015 12:26:18 Alex Franco wrote:

@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.

@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though, I can fix the hover situation and also add in the link to the documentation.
@All: I suppose the link should go to:

http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-> PNBLACKLIST

Yes, that's really the only place we could link to; unfortunately though I just noticed there is an obvious mistake in there about inheriting the class globally within the recipe (a contradiction); it also doesn't mention the class is inherited globally by default.

Cheers,
Paul

Signature · 2 lines
Paul Eggleton
Intel Open Source Technology Centre
#13 lore raw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hmm I swear reading that, the message I get is that one should inherit the blacklist class in local.conf (if not on there already) and also set the (varflag) value of that variable for your recipe there.

Perhaps the part that reads "the blacklist class, which the recipe must inherit globally" suffers from a wording issue, saying "must inherit" rather than "by default inherits".

I guess next step here's creating a documentation bug report/ticket.

Meanwhile, the changes are ready and showcased here [1]

I'll let you review this before I sent v3 of the patch ;)

@Belen, I did something possibly hacky with the css in order to accomplish this, the warn blockquote is set to take 100% of the horizontal space available within the alert div. If that runs counter to some design philosophy (perhaps specifically since we're using bootstrap) let me know please :b

The hovering now only works within a TD...

Alex Franco

[1] http://yctb03.ostc.intel.com:9999/

Quoted 11 lines · Paul Eggleton
Quoted 10 lines · On Tue, 01 Dec 2015 12:26:18 Alex Franco wrote:

@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.

@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though, I can fix the hover situation and also add in the link to the documentation.
@All: I suppose the link should go to:

http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-> PNBLACKLIST

Quoted 2 lines

Yes, that's really the only place we could link to; unfortunately

though I

Quoted 1 line

just noticed there is an obvious mistake in there about inheriting the

class

Quoted 6 lines

globally within the recipe (a contradiction); it also doesn't mention the class is inherited globally by default.

Cheers,
Paul

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQEcBAEBAgAGBQJWXj+bAAoJEPR9uwMY2lTLYT4H/1CUZHoE9nSCRhB9zRmbe/gq fYxLRCHt34DZvTjA5N+KNJd80z9NOo1q6jWKu0Rh6XHQgExTuruzi1nkyJ4BIoRD ziexugIXyYFJIymT6m38sZfwBV+KA+FSoTKplj+ZjLdC3HzSpKoVmFHO/wx/coC+ s90uyagoFYtAb/cmaLJmZW+q9J9v/UtAop4CD7nuLVhJvVxYIe2/Cub2MGrZy5P/ EcciqfI8Cn/cWoGfptoRmBOA2yjAR1SqZtwWCOLze68eiRkV/P/3uMgMOy9i2feM l13puV0OVnoxsfTFDuZHzXt/5LHmCdI/URzPK3OAL83QlJtwKck1cLU6Ufywlhc= =LBgn
-----END PGP SIGNATURE-----

#14 lore raw
Quoted 18 lines · Alex Franco

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hmm I swear reading that, the message I get is that one should inherit the blacklist class in local.conf (if not on there already) and also set the (varflag) value of that variable for your recipe there.

Perhaps the part that reads "the blacklist class, which the recipe must inherit globally" suffers from a wording issue, saying "must inherit" rather than "by default inherits".

I guess next step here's creating a documentation bug report/ticket.

Meanwhile, the changes are ready and showcased here [1]

I'll let you review this before I sent v3 of the patch ;)

Quoted 7 lines

@Belen, I did something possibly hacky with the css in order to accomplish this, the warn blockquote is set to take 100% of the horizontal space available within the alert div. If that runs counter to some design philosophy (perhaps specifically since we're using bootstrap) let me know please :b

The hovering now only works within a TD...

This works for me :)

Thanks!

Belén

Quoted 46 lines

Alex Franco

[1] http://yctb03.ostc.intel.com:9999/

Quoted 4 lines · Paul Eggleton
Quoted 3 lines · On Tue, 01 Dec 2015 12:26:18 Alex Franco wrote:

@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.

Quoted 8 lines
Quoted 8 lines

@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though,
I can fix the hover situation and also add in the link to the documentation.
@All: I suppose the link should go to:

http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var->
PNBLACKLIST

Quoted 2 lines

Yes, that's really the only place we could link to; unfortunately

though I

Quoted 1 line

just noticed there is an obvious mistake in there about inheriting the

class

Quoted 7 lines

globally within the recipe (a contradiction); it also doesn't mention the
class is inherited globally by default.

Cheers,
Paul

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQEcBAEBAgAGBQJWXj+bAAoJEPR9uwMY2lTLYT4H/1CUZHoE9nSCRhB9zRmbe/gq fYxLRCHt34DZvTjA5N+KNJd80z9NOo1q6jWKu0Rh6XHQgExTuruzi1nkyJ4BIoRD ziexugIXyYFJIymT6m38sZfwBV+KA+FSoTKplj+ZjLdC3HzSpKoVmFHO/wx/coC+ s90uyagoFYtAb/cmaLJmZW+q9J9v/UtAop4CD7nuLVhJvVxYIe2/Cub2MGrZy5P/ EcciqfI8Cn/cWoGfptoRmBOA2yjAR1SqZtwWCOLze68eiRkV/P/3uMgMOy9i2feM l13puV0OVnoxsfTFDuZHzXt/5LHmCdI/URzPK3OAL83QlJtwKck1cLU6Ufywlhc= =LBgn
-----END PGP SIGNATURE-----

#15 lore raw
In reply to Paul Eggleton
Quoted 14 lines · Paul
Quoted 10 lines · On Tue, 01 Dec 2015 12:26:18 Alex Franco wrote:

@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.

@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though, I can fix the hover situation and also add in the link to the documentation.
@All: I suppose the link should go to:

Quoted 2 lines

http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var->
PNBLACKLIST

Quoted 6 lines

Yes, that's really the only place we could link to; unfortunately though I
just noticed there is an obvious mistake in there about inheriting the class
globally within the recipe (a contradiction); it also doesn't mention the class is inherited globally by default.

Could we ask Scott to correct the mistake and the omission?

Belén

Quoted 7 lines

Cheers,
Paul

Signature · 2 lines
Paul Eggleton
Intel Open Source Technology Centre
#16 lore raw
Quoted 15 lines · Belen
Quoted 14 lines · Paul
Quoted 12 lines · On Tue, 01 Dec 2015 12:26:18 Alex Franco wrote:

@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.

@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though, I can fix the hover situation and also add in the link to the documentation.

@All: I suppose the link should go to:
http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var->

PNBLACKLIST

Quoted 8 lines
Quoted 6 lines

Yes, that's really the only place we could link to; unfortunately though I
just noticed there is an obvious mistake in there about inheriting the class
globally within the recipe (a contradiction); it also doesn't mention the class is inherited globally by default.

Could we ask Scott to correct the mistake and the omission?

It's on my documentation todo list; I will probably file a bug.

Cheers,
Paul

Signature · 2 lines
Paul Eggleton
Intel Open Source Technology Centre