Skip to content

Commit

Permalink
Move packages retrieval logic to packages api, fix src and compiled p…
Browse files Browse the repository at this point in the history
…ackage conflicts
  • Loading branch information
David Moreau Simard committed Sep 29, 2015
1 parent 76d18e2 commit 1be6470
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 57 deletions.
56 changes: 52 additions & 4 deletions versiontracker/api/packages.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,28 @@
# License for the specific language governing permissions and limitations
# under the License.

import configparser
import dnf
import io
import requests
from flask_restful import Resource

from versiontracker import settings
from versiontracker import utils


class Packages(Resource):
def get(self, repository, package=None, property=None):
packages = {}
try:
repository_packages = utils.get_packages_from_repo(repository)
repository_packages = _get_packages_from_repo(repository)
except KeyError as e:
raise KeyError("{0} repository is not configured: {1}".format(repository, repr(e)))

for repository_package in repository_packages:
packages[repository_package.name] = {}
package_index = "%s-%s" % (repository_package.name, repository_package.arch)
packages[package_index] = {}
for pkg_property in settings.PACKAGE_PROPERTIES:
packages[repository_package.name][pkg_property] = getattr(repository_package, pkg_property)
packages[package_index][pkg_property] = getattr(repository_package, pkg_property)

if package:
if property:
Expand All @@ -44,3 +48,47 @@ def get(self, repository, package=None, property=None):
raise KeyError("{0} is not in the list of packages: {1}".format(package, repr(e)))

return packages


def _fetch_base_urls(repository):
"""
Parses a ini-like repo file and returns the base urls
"""
repo_config = _url_as_ini_file(settings.REPOSITORIES[repository]['url'])
config = configparser.ConfigParser()
config.read_file(repo_config)

base_urls = list()
for repo in config.sections():
base_urls.append((config.get(repo, 'name'),
config.get(repo, 'baseurl')))

return base_urls


def _get_packages_from_repo(repository):
"""
Uses the dnf API to fetch the list of all available packages off of a baseurl
"""
base = dnf.Base()
base_urls = _fetch_base_urls(repository)
for name, base_url in base_urls:
repo = dnf.repo.Repo(name, settings.TMPDIR)
repo.baseurl = [base_url]
base.repos.add(repo)
base.fill_sack()

# Query all available packages in sack
packages = base.sack.query().available().run()

return packages


def _url_as_ini_file(url):
"""
Returns a file-like object of an URL to use it with configparser
"""
text = requests.get(url).text
inifile = io.StringIO(text)
inifile.seek(0)
return inifile
4 changes: 2 additions & 2 deletions versiontracker/templates/compare.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ <h1>Package comparison for {{ tags[tag]['friendly_name'] }}</h1>
{% if (show_source_rpm) or (not show_source_rpm and packages[package]['arch'] != 'src') %}
<tr>
{% if packages[package]['different'] %}
<td><span class="label label-primary" style="font-size:100%">{{ package }}</span></td>
<td><span class="label label-primary" style="font-size:100%">{{ packages[package]['name'] }}</span></td>
{% else %}
<td>{{ package }}</td>
<td>{{ packages[package]['name'] }}</td>
{% endif %}
<td>{{ packages[package]['arch'] }}</td>
{% for repository in repositories %}
Expand Down
59 changes: 8 additions & 51 deletions versiontracker/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,72 +14,28 @@

""" Utilities and helper functions """
import collections
import configparser
import dnf
import io
import requests

from versiontracker import settings
from versiontracker.api.packages import Packages


def _url_as_ini_file(url):
"""
Returns a file-like object of an URL to use it with configparser
"""
text = requests.get(url).text
inifile = io.StringIO(text)
inifile.seek(0)
return inifile


def fetch_base_urls(version):
"""
Parses a ini-like repo file and returns the base urls
"""
repo_config = _url_as_ini_file(settings.REPOSITORIES[version]['url'])
config = configparser.ConfigParser()
config.read_file(repo_config)

base_urls = list()
for repository in config.sections():
base_urls.append((config.get(repository, 'name'),
config.get(repository, 'baseurl')))

return base_urls


def get_packages_from_repo(repository):
"""
Uses the dnf API to fetch the list of all available packages off of a baseurl
"""
base = dnf.Base()
base_urls = fetch_base_urls(repository)
for name, base_url in base_urls:
repo = dnf.repo.Repo(name, settings.TMPDIR)
repo.baseurl = [base_url]
base.repos.add(repo)
base.fill_sack()

# Query all available packages in sack
packages = base.sack.query().available().run()

return packages

def diff_packages(repositories):
"""
Iterates over a list of packages dictionaries and highlights differences, if any.
Returns the same dictionary with an extra key to show if there are differences.
Creates common keys for packages such as arch, package name and different.
"""
# TODO: I don't like this part, it works but needs improvement.
# Retrieve packages for each repository
packages = collections.OrderedDict()
for repository in repositories:
repository_packages = get_packages_from_repo(repository)
repository_packages = Packages().get(repository)
for package in repository_packages:
if package.name not in packages:
packages[package.name] = collections.defaultdict(dict)
if package not in packages:
packages[package] = collections.defaultdict(dict)
for property in settings.PACKAGE_PROPERTIES:
packages[package.name][repository][property] = getattr(package, property)
packages[package][repository][property] = repository_packages[package][property]

# Highlight package differences, if any
for package in packages:
Expand All @@ -89,6 +45,7 @@ def diff_packages(repositories):
try:
if not packages[package]['arch']:
packages[package]['arch'] = packages[package][repository]['arch']
packages[package]['name'] = packages[package][repository]['name']
except KeyError:
pass
try:
Expand Down

0 comments on commit 1be6470

Please sign in to comment.