Bug#761083: #761083 - debsources: inject binary packages metadata into the DB

2016-06-24 Thread Luciano Bello
On Friday 24 June 2016 16.41.57 Raphael Hertzog wrote:
> I thought the same when I saw this report... and the reason is likely that
> the tracker has almost no REST API at all right now and that it thus looked
> harder to implement there.

Indeed. That's the reason :)

/l



Bug#761083: #761083 - debsources: inject binary packages metadata into the DB

2016-06-24 Thread Matthieu Caneill
On Fri, Jun 24, 2016 at 04:41:57PM +0200, Raphael Hertzog wrote:
> > I don't mind at all you using sources.d.n for that purpose, but why
> > not tracker.d.o?
> 
> I thought the same when I saw this report... and the reason is likely that
> the tracker has almost no REST API at all right now and that it thus looked
> harder to implement there.

Thanks for the clarification Raphael!
Makes sense indeed to use debsources for that purpose.

Cheers,
--
Matthieu



Bug#761083: #761083 - debsources: inject binary packages metadata into the DB

2016-06-24 Thread Raphael Hertzog
Hi,

On Fri, 24 Jun 2016, Matthieu Caneill wrote:
> On Thu, Jun 09, 2016 at 12:01:09PM +0200, Luciano Bello wrote:
> > In the security team we would like to give information about which packages 
> > you should update when we release a DSA (currently, we give to the user the 
> > source package name). It would be easier for us if we have a way to get the 
> > binaries for packages in (old)stable. Sources.d.n is the way to go, I 
> > think. 
> > For that, this bug needs to be done :)
> 
> I don't mind at all you using sources.d.n for that purpose, but why
> not tracker.d.o?

I thought the same when I saw this report... and the reason is likely that
the tracker has almost no REST API at all right now and that it thus looked
harder to implement there.

Cheers,
-- 
Raphaël Hertzog ◈ Debian Developer

Support Debian LTS: http://www.freexian.com/services/debian-lts.html
Learn to master Debian: http://debian-handbook.info/get/



Bug#761083: #761083 - debsources: inject binary packages metadata into the DB

2016-06-24 Thread Matthieu Caneill
Hi Luciano,

On Thu, Jun 09, 2016 at 12:01:09PM +0200, Luciano Bello wrote:
> In the security team we would like to give information about which packages 
> you should update when we release a DSA (currently, we give to the user the 
> source package name). It would be easier for us if we have a way to get the 
> binaries for packages in (old)stable. Sources.d.n is the way to go, I think. 
> For that, this bug needs to be done :)

I don't mind at all you using sources.d.n for that purpose, but why
not tracker.d.o?

Code comments below:

> diff --git a/debsources/app/infobox.py b/debsources/app/infobox.py
> index dd6585c..3f75131 100644
> --- a/debsources/app/infobox.py
> +++ b/debsources/app/infobox.py
> @@ -14,7 +14,7 @@ from __future__ import absolute_import
>  from flask import url_for, current_app
>  
>  from debsources.models import (
> -PackageName, Package, Suite, SlocCount, Metric, Ctag)
> +PackageName, Package, Suite, SlocCount, Metric, Ctag, Binary, BinaryName)
>  from debsources.excepts import Http500Error, Http404Error
>  
>  PTS_PREFIX = "https://tracker.debian.org/pkg/;
> @@ -63,6 +63,22 @@ class Infobox(object):
>  
>  return [x[0] for x in suites]
>  
> +def _get_binary_names(self):
> +""" binary package names """
> +try:
> +print self.package, self.version

unnecessary debug line?

> +binaries = (self.session.query(BinaryName.name)
> +.filter(PackageName.name == self.package,
> +  Package.version == self.version,
> +  Package.name_id == PackageName.id,
> +  Binary.package_id == Package.id,
> +  Binary.name_id == BinaryName.id)
> +.all())
> +except Exception as e:  # pragma: no cover
> +raise Http500Error(e)
> +
> +return [x[0] for x in binaries]
> +
>  def _get_sloc(self):
>  """ sloccount """
>  try:
> @@ -160,3 +176,9 @@ class Infobox(object):
>  pkg_infos['copyright'] = False
>  
>  return pkg_infos
> +
> +def get_binaries(self):
> +"""
> +Retrieves the binary package names, in a list.
> +"""
> +return self._get_binary_names()

I don't understand why you don't store the binary names in pkg_infos,
instead of creating a different method?

> diff --git a/debsources/app/views.py b/debsources/app/views.py
> index e241f83..8ede294 100644
> --- a/debsources/app/views.py
> +++ b/debsources/app/views.py
> @@ -510,7 +510,9 @@ class PackageVersionsView(GeneralView):
>  # INFO PAGES #
>  class InfoPackageView(GeneralView):
>  def get_objects(self, package, version):
> -pkg_infos = Infobox(session, package, version).get_infos()
> +ib = Infobox(session, package, version)
> +pkg_infos = ib.get_infos()
> +binaries = ib.get_binaries()

Same remark as above, having everything in pkg_infos.get_infos would
be simpler IMHO. Unless I'm missing something?

>  return dict(pkg_infos=pkg_infos,
>  package=package,
> -version=version)
> +version=version,binaries=binaries)
> diff --git a/debsources/db_storage.py b/debsources/db_storage.py
> index 7f58c10..e6ed437 100644
> --- a/debsources/db_storage.py
> +++ b/debsources/db_storage.py
> @@ -14,7 +14,7 @@ from __future__ import absolute_import
>  import logging
>  
>  from debsources import fs_storage
> -from debsources.models import File, Package, PackageName, SuiteInfo, Suite
> +from debsources.models import File, Package, PackageName, SuiteInfo, Suite, 
> BinaryName, Binary
>  from debsources.models import VCS_TYPES
>  
>  
> @@ -65,6 +65,21 @@ def add_package(session, pkg, pkgdir, sticky=False):
>  session.flush()
>  file_table[relpath] = file_.id
>  
> +for binpkg in pkg['binary'].split(', '):
> +logging.debug('add to db %s (binary) ...' % binpkg)
> +
> +binary_name = session.query(BinaryName) \
> +  .filter_by(name=binpkg) \
> +  .first()
> +
> +if not binary_name:
> +binary_name = BinaryName(binpkg)
> +session.add(binary_name)
> +session.flush()
> +
> +
> session.add(Binary(name_id=binary_name.id,package_id=db_package.id))
> +
> +session.flush()
>  return file_table
>  
>  
> diff --git a/debsources/models.py b/debsources/models.py
> index c0e4583..468d28b 100644
> --- a/debsources/models.py
> +++ b/debsources/models.py
> @@ -207,8 +207,10 @@ class Binary(Base):
>  ForeignKey('packages.id', ondelete="CASCADE"),
>  index=True, nullable=False)
>  
> -def __init__(self, version, area="main"):
> -self.version = version
> +def __init__(self, name_id, package_id, version=None):
> +

Bug#761083: #761083 - debsources: inject binary packages metadata into the DB

2016-06-09 Thread Luciano Bello
In the security team we would like to give information about which packages 
you should update when we release a DSA (currently, we give to the user the 
source package name). It would be easier for us if we have a way to get the 
binaries for packages in (old)stable. Sources.d.n is the way to go, I think. 
For that, this bug needs to be done :)

The attached patch populates the database with the bin package names (in 
db_storage.add_package ). The data for this is coming from pkg['binary'].

It also shortly patches models.Binary.

Finally, it extends the view InfoPackageView with the list of binaries from 
the requested source pkg. For example: 
http://.../api/info/package/libcaca/0.99.beta18-1/
{
  "binaries": [
"libcaca-dev",
"libcaca0",
"caca-utils"
  ],
  "package": "libcaca",
...}

Cheers, lucianodiff --git a/debsources/app/infobox.py b/debsources/app/infobox.py
index dd6585c..3f75131 100644
--- a/debsources/app/infobox.py
+++ b/debsources/app/infobox.py
@@ -14,7 +14,7 @@ from __future__ import absolute_import
 from flask import url_for, current_app
 
 from debsources.models import (
-PackageName, Package, Suite, SlocCount, Metric, Ctag)
+PackageName, Package, Suite, SlocCount, Metric, Ctag, Binary, BinaryName)
 from debsources.excepts import Http500Error, Http404Error
 
 PTS_PREFIX = "https://tracker.debian.org/pkg/;
@@ -63,6 +63,22 @@ class Infobox(object):
 
 return [x[0] for x in suites]
 
+def _get_binary_names(self):
+""" binary package names """
+try:
+print self.package, self.version
+binaries = (self.session.query(BinaryName.name)
+.filter(PackageName.name == self.package,
+  Package.version == self.version,
+  Package.name_id == PackageName.id,
+  Binary.package_id == Package.id,
+  Binary.name_id == BinaryName.id)
+.all())
+except Exception as e:  # pragma: no cover
+raise Http500Error(e)
+
+return [x[0] for x in binaries]
+
 def _get_sloc(self):
 """ sloccount """
 try:
@@ -160,3 +176,9 @@ class Infobox(object):
 pkg_infos['copyright'] = False
 
 return pkg_infos
+
+def get_binaries(self):
+"""
+Retrieves the binary package names, in a list.
+"""
+return self._get_binary_names()
diff --git a/debsources/app/views.py b/debsources/app/views.py
index e241f83..8ede294 100644
--- a/debsources/app/views.py
+++ b/debsources/app/views.py
@@ -510,7 +510,9 @@ class PackageVersionsView(GeneralView):
 # INFO PAGES #
 class InfoPackageView(GeneralView):
 def get_objects(self, package, version):
-pkg_infos = Infobox(session, package, version).get_infos()
+ib = Infobox(session, package, version)
+pkg_infos = ib.get_infos()
+binaries = ib.get_binaries()
 return dict(pkg_infos=pkg_infos,
 package=package,
-version=version)
+version=version,binaries=binaries)
diff --git a/debsources/db_storage.py b/debsources/db_storage.py
index 7f58c10..e6ed437 100644
--- a/debsources/db_storage.py
+++ b/debsources/db_storage.py
@@ -14,7 +14,7 @@ from __future__ import absolute_import
 import logging
 
 from debsources import fs_storage
-from debsources.models import File, Package, PackageName, SuiteInfo, Suite
+from debsources.models import File, Package, PackageName, SuiteInfo, Suite, BinaryName, Binary
 from debsources.models import VCS_TYPES
 
 
@@ -65,6 +65,21 @@ def add_package(session, pkg, pkgdir, sticky=False):
 session.flush()
 file_table[relpath] = file_.id
 
+for binpkg in pkg['binary'].split(', '):
+logging.debug('add to db %s (binary) ...' % binpkg)
+
+binary_name = session.query(BinaryName) \
+  .filter_by(name=binpkg) \
+  .first()
+
+if not binary_name:
+binary_name = BinaryName(binpkg)
+session.add(binary_name)
+session.flush()
+
+session.add(Binary(name_id=binary_name.id,package_id=db_package.id))
+
+session.flush()
 return file_table
 
 
diff --git a/debsources/models.py b/debsources/models.py
index c0e4583..468d28b 100644
--- a/debsources/models.py
+++ b/debsources/models.py
@@ -207,8 +207,10 @@ class Binary(Base):
 ForeignKey('packages.id', ondelete="CASCADE"),
 index=True, nullable=False)
 
-def __init__(self, version, area="main"):
-self.version = version
+def __init__(self, name_id, package_id, version=None):
+self.version= version
+self.name_id= name_id
+self.package_id = package_id
 
 def __repr__(self):
 return self.version