Merge branch 'master' of https://github.com/iksaif/euscan
This commit is contained in:
		
							
								
								
									
										13
									
								
								bin/euscan
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								bin/euscan
									
									
									
									
									
								
							@@ -128,7 +128,10 @@ def print_usage(_error=None, help=None):
 | 
				
			|||||||
        print(yellow(" -I, --ignore-pre-release-if-stable") +
 | 
					        print(yellow(" -I, --ignore-pre-release-if-stable") +
 | 
				
			||||||
            " - Ignore non-stable versions only if current\n" +
 | 
					            " - Ignore non-stable versions only if current\n" +
 | 
				
			||||||
            " " * 38 + "version is stable", file=out)
 | 
					            " " * 38 + "version is stable", file=out)
 | 
				
			||||||
 | 
					        print(yellow("     --mirror") +
 | 
				
			||||||
 | 
					            "              - use mirror:// URIs", file=out)
 | 
				
			||||||
 | 
					        print(yellow("     --ebuild-uri") +
 | 
				
			||||||
 | 
					            "              - use ebuild variables in URIs", file=out)
 | 
				
			||||||
        print(file=out)
 | 
					        print(file=out)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if _error in ('packages',) or help:
 | 
					    if _error in ('packages',) or help:
 | 
				
			||||||
@@ -182,12 +185,14 @@ def parse_args():
 | 
				
			|||||||
                pp.output.nocolor()
 | 
					                pp.output.nocolor()
 | 
				
			||||||
            elif o in ("-p", "--progress"):
 | 
					            elif o in ("-p", "--progress"):
 | 
				
			||||||
                CONFIG['progress'] = isatty
 | 
					                CONFIG['progress'] = isatty
 | 
				
			||||||
            elif o in ("-m", "--mirror"):
 | 
					            elif o in ("--mirror"):
 | 
				
			||||||
                CONFIG['mirror'] = True
 | 
					                CONFIG['mirror'] = True
 | 
				
			||||||
            elif o in ("-i", "--ignore-pre-release"):
 | 
					            elif o in ("-i", "--ignore-pre-release"):
 | 
				
			||||||
                CONFIG['ignore-pre-release'] = True
 | 
					                CONFIG['ignore-pre-release'] = True
 | 
				
			||||||
            elif o in ("-I", "--ignore-pre-release-if-stable"):
 | 
					            elif o in ("-I", "--ignore-pre-release-if-stable"):
 | 
				
			||||||
                CONFIG['ignore-pre-release-if-stable'] = True
 | 
					                CONFIG['ignore-pre-release-if-stable'] = True
 | 
				
			||||||
 | 
					            elif o in ("--ebuild-uri"):
 | 
				
			||||||
 | 
					                CONFIG['ebuild-uri'] = True
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                return_code = False
 | 
					                return_code = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -195,11 +200,11 @@ def parse_args():
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # here are the different allowed command line options (getopt args)
 | 
					    # here are the different allowed command line options (getopt args)
 | 
				
			||||||
    getopt_options = {'short': {}, 'long': {}}
 | 
					    getopt_options = {'short': {}, 'long': {}}
 | 
				
			||||||
    getopt_options['short']['global'] = "hVCqv1bf:pmiI"
 | 
					    getopt_options['short']['global'] = "hVCqv1bf:piI"
 | 
				
			||||||
    getopt_options['long']['global'] = [
 | 
					    getopt_options['long']['global'] = [
 | 
				
			||||||
        "help", "version", "nocolor", "quiet", "verbose", "oneshot",
 | 
					        "help", "version", "nocolor", "quiet", "verbose", "oneshot",
 | 
				
			||||||
        "brute-force=", "format=", "progress", "mirror", "ignore-pre-release",
 | 
					        "brute-force=", "format=", "progress", "mirror", "ignore-pre-release",
 | 
				
			||||||
        "ignore-pre-release-if-stable",
 | 
					        "ignore-pre-release-if-stable", "ebuild-uri"
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    short_opts = getopt_options['short']['global']
 | 
					    short_opts = getopt_options['short']['global']
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ or::
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    python setup.py install  # to install euscan and requirements
 | 
					    python setup.py install  # to install euscan and requirements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If you prefer to use portage just install dev-python/django-celery-2.5.5
 | 
					If you prefer to use portage just install dev-python/django-celery
 | 
				
			||||||
 | 
					
 | 
				
			||||||
There's the need of having a broker for tasks. The default and reccommended
 | 
					There's the need of having a broker for tasks. The default and reccommended
 | 
				
			||||||
broker is RabbitMQ.
 | 
					broker is RabbitMQ.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,14 +8,12 @@ from xml.etree.ElementTree import iterparse, ParseError
 | 
				
			|||||||
from django.db.transaction import commit_on_success
 | 
					from django.db.transaction import commit_on_success
 | 
				
			||||||
from django.core.management.color import color_style
 | 
					from django.core.management.color import color_style
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from euscan.helpers import get_version_type
 | 
					from euscan.version import get_version_type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from djeuscan.processing import FakeLogger
 | 
					from djeuscan.processing import FakeLogger
 | 
				
			||||||
from djeuscan.models import Package, Version, VersionLog
 | 
					from djeuscan.models import Package, Version, VersionLog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PORTDB = None
 | 
				
			||||||
PORTDB = portage.db[portage.root]["porttree"].dbapi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ScanPortage(object):
 | 
					class ScanPortage(object):
 | 
				
			||||||
    def __init__(self, logger=None, no_log=False, purge_packages=False,
 | 
					    def __init__(self, logger=None, no_log=False, purge_packages=False,
 | 
				
			||||||
@@ -25,6 +23,10 @@ class ScanPortage(object):
 | 
				
			|||||||
        self.purge_packages = purge_packages
 | 
					        self.purge_packages = purge_packages
 | 
				
			||||||
        self.purge_versions = purge_versions
 | 
					        self.purge_versions = purge_versions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if not PORTDB: # Lazy loading for portdb
 | 
				
			||||||
 | 
					            global PORTDB
 | 
				
			||||||
 | 
					            PORTDB = portage.db[portage.root]["porttree"].dbapi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.style = color_style()
 | 
					        self.style = color_style()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._cache = {'packages': {}, 'versions': {}}
 | 
					        self._cache = {'packages': {}, 'versions': {}}
 | 
				
			||||||
@@ -342,9 +344,14 @@ def scan_portage(packages=None, category=None, no_log=False,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if prefetch:
 | 
					    if prefetch:
 | 
				
			||||||
        logger.info('Prefetching objects...')
 | 
					        logger.info('Prefetching objects...')
 | 
				
			||||||
        for package in Package.objects.all():
 | 
					        ppackages = Package.objects.all()
 | 
				
			||||||
 | 
					        pversions = Version.objects.select_related('package').all()
 | 
				
			||||||
 | 
					        if category:
 | 
				
			||||||
 | 
					            ppackages = ppackages.filter(category=category)
 | 
				
			||||||
 | 
					            pversions = pversions.filter(package__category=category)
 | 
				
			||||||
 | 
					        for package in ppackages:
 | 
				
			||||||
            scan_handler.cache_store_package(package)
 | 
					            scan_handler.cache_store_package(package)
 | 
				
			||||||
        for version in Version.objects.select_related('package').all():
 | 
					        for version in pversions:
 | 
				
			||||||
            scan_handler.cache_store_version(version)
 | 
					            scan_handler.cache_store_version(version)
 | 
				
			||||||
        logger.info('done')
 | 
					        logger.info('done')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -153,9 +153,12 @@ def scan_upstream(packages=None, purge_versions=False,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    for pkg in packages:
 | 
					    for pkg in packages:
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            scan_handler.scan('%s/%s' % (pkg.category, pkg.name))
 | 
					            package = '%s/%s' % (pkg.category, pkg.name)
 | 
				
			||||||
        except AttributeError:
 | 
					        except AttributeError:
 | 
				
			||||||
            scan_handler.scan(pkg)
 | 
					            package = pkg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        logger.info('Scanning %s' % package)
 | 
				
			||||||
 | 
					        scan_handler.scan(package)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    scan_handler.purge_old_versions()
 | 
					    scan_handler.purge_old_versions()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,10 +9,8 @@ from celery.task import task, group, chord
 | 
				
			|||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from djeuscan.models import Package, RefreshPackageQuery
 | 
					from djeuscan.models import Package, RefreshPackageQuery
 | 
				
			||||||
from djeuscan.processing.misc import regen_rrds, update_counters, \
 | 
					from djeuscan.processing import scan, misc
 | 
				
			||||||
    update_portage_trees
 | 
					from djeuscan.utils import queryset_iterator
 | 
				
			||||||
from djeuscan.processing.scan import scan_metadata, scan_portage, scan_upstream
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TaskFailedException(Exception):
 | 
					class TaskFailedException(Exception):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
@@ -20,103 +18,85 @@ class TaskFailedException(Exception):
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
    pass
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def group_one(task, seq, *args, **kwargs):
 | 
				
			||||||
def _chunks(it, n):
 | 
					 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Chunk generator, takes an iterator and the desired size of the chunk
 | 
					    Create a group of tasks, each task handle one element of seq
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    for first in it:
 | 
					 | 
				
			||||||
        yield [first] + list(islice(it, n - 1))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def _run_in_chunks(task, packages, kwargs=None,
 | 
					 | 
				
			||||||
                   concurrently=settings.TASKS_CONCURRENTLY,
 | 
					 | 
				
			||||||
                   n=settings.TASKS_SUBTASK_PACKAGES):
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    Launches a group at a time with <concurrently> subtasks.
 | 
					 | 
				
			||||||
    Each subtask has <n> packages to handle
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    output = []
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    chunk_generator = _chunks(iter(packages), n)
 | 
					 | 
				
			||||||
    done = False
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while not done:
 | 
					 | 
				
			||||||
    tasks = []
 | 
					    tasks = []
 | 
				
			||||||
        for _ in range(concurrently):
 | 
					    for i in seq:
 | 
				
			||||||
            try:
 | 
					        tasks.append(task.subtask(args=[seq[i]] + list(args), kwargs=kwargs))
 | 
				
			||||||
                chunk = chunk_generator.next()
 | 
					    return group(tasks)
 | 
				
			||||||
            except StopIteration:
 | 
					 | 
				
			||||||
                done = True
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                tasks.append(task.subtask((chunk, ), kwargs))
 | 
					 | 
				
			||||||
        output.extend(group(tasks)())
 | 
					 | 
				
			||||||
    return output
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def group_chunks(task, seq, n, *args, **kwargs):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Creates a group of tasks, each subtask has <n> elements to handle
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    tasks = []
 | 
				
			||||||
 | 
					    for i in xrange(0, len(seq), n):
 | 
				
			||||||
 | 
					        tasks.append(task.subtask(args=[seq[i:i+n]] + list(args), kwargs=kwargs))
 | 
				
			||||||
 | 
					    return group(tasks)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@task
 | 
					@task
 | 
				
			||||||
def regen_rrds_task():
 | 
					def regen_rrds():
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Regenerate RRDs
 | 
					    Regenerate RRDs
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    return regen_rrds()
 | 
					    misc.regen_rrds()
 | 
				
			||||||
 | 
					    return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@task
 | 
					@task
 | 
				
			||||||
def update_counters_task(fast=True):
 | 
					def update_counters(fast=False):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Updates counters
 | 
					    Updates counters
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    return update_counters(fast=fast)
 | 
					    logger = update_counters.get_logger()
 | 
				
			||||||
 | 
					    logger.info("Updating counters (fast=%s)...", fast)
 | 
				
			||||||
 | 
					    misc.update_counters(fast=fast)
 | 
				
			||||||
 | 
					    logger.info("Done")
 | 
				
			||||||
 | 
					    return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@task
 | 
					@task
 | 
				
			||||||
def _scan_metadata_task(packages):
 | 
					def scan_metadata(packages=[], category=None):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Scans metadata for the given set of packages
 | 
					    Scans metadata for the given set of packages
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    logger = _scan_metadata_task.get_logger()
 | 
					    logger = scan_metadata.get_logger()
 | 
				
			||||||
    logger.info("Starting metadata scanning subtask for %d packages...",
 | 
					 | 
				
			||||||
                len(packages))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    scan_metadata(
 | 
					    if packages:
 | 
				
			||||||
 | 
					        logger.info("Starting metadata scan for %d packages...",
 | 
				
			||||||
 | 
					                    len(packages))
 | 
				
			||||||
 | 
					    elif category:
 | 
				
			||||||
 | 
					        logger.info("Starting metadata scan for %s...",
 | 
				
			||||||
 | 
					                    category)
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        logger.info("Starting metadata scan...")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    scan.scan_metadata(
 | 
				
			||||||
        packages=packages,
 | 
					        packages=packages,
 | 
				
			||||||
 | 
					        category=category,
 | 
				
			||||||
        logger=logger,
 | 
					        logger=logger,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					    return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@task
 | 
					@task
 | 
				
			||||||
def scan_metadata_list_task(query):
 | 
					def scan_portage(packages=[], category=None,
 | 
				
			||||||
    """
 | 
					                 no_log=False, purge_packages=False,
 | 
				
			||||||
    Runs a parallel metadata scan for packages in the query list (space
 | 
					                 purge_versions=False, prefetch=False):
 | 
				
			||||||
    separated string). Task used only from the web interface.
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    return _run_in_chunks(_scan_metadata_task, [p for p in query.split()])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@task
 | 
					 | 
				
			||||||
def scan_metadata_all_task():
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    Runs a parallel metadata scan for all packages
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    return _run_in_chunks(_scan_metadata_task, Package.objects.all())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@task
 | 
					 | 
				
			||||||
def _scan_portage_task(packages, category=None, no_log=False,
 | 
					 | 
				
			||||||
                       purge_packages=False, purge_versions=False,
 | 
					 | 
				
			||||||
                       prefetch=False):
 | 
					 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Scans portage for the given set of packages
 | 
					    Scans portage for the given set of packages
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    logger = _scan_portage_task.get_logger()
 | 
					    logger = scan_portage.get_logger()
 | 
				
			||||||
    if packages:
 | 
					 | 
				
			||||||
        logger.info("Starting portage scanning subtask for %d packages...",
 | 
					 | 
				
			||||||
                    len(packages))
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        logger.info("Starting portage scanning for all packages...")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    scan_portage(
 | 
					    if packages:
 | 
				
			||||||
 | 
					        logger.info("Starting portage scan for %d packages...",
 | 
				
			||||||
 | 
					                    len(packages))
 | 
				
			||||||
 | 
					    elif category:
 | 
				
			||||||
 | 
					        logger.info("Starting portage scan for %s...",
 | 
				
			||||||
 | 
					                    category)
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        logger.info("Starting portage scan...")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    scan.scan_portage(
 | 
				
			||||||
        packages=packages,
 | 
					        packages=packages,
 | 
				
			||||||
        category=category,
 | 
					        category=category,
 | 
				
			||||||
        no_log=no_log,
 | 
					        no_log=no_log,
 | 
				
			||||||
@@ -125,131 +105,77 @@ def _scan_portage_task(packages, category=None, no_log=False,
 | 
				
			|||||||
        prefetch=prefetch,
 | 
					        prefetch=prefetch,
 | 
				
			||||||
        logger=logger,
 | 
					        logger=logger,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					    return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@task
 | 
					@task
 | 
				
			||||||
def scan_portage_list_task(query, no_log=False, purge_packages=False,
 | 
					def scan_upstream(packages=[], purge_versions=False):
 | 
				
			||||||
                           purge_versions=False, prefetch=False):
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    Runs a parallel portage scan for packages in the query list (space
 | 
					 | 
				
			||||||
    separated string). Task used only from the web interface.
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    kwargs = {"no_log": no_log, "purge_packages": purge_packages,
 | 
					 | 
				
			||||||
              "purge_versions": purge_versions, "prefetch": prefetch}
 | 
					 | 
				
			||||||
    return _run_in_chunks(
 | 
					 | 
				
			||||||
        _scan_portage_task, [p for p in query.split()], kwargs
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@task
 | 
					 | 
				
			||||||
def scan_portage_all_task(no_log=False, purge_packages=False,
 | 
					 | 
				
			||||||
                          purge_versions=False, prefetch=False):
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    Runs a syncronous portage scan for all packages
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    _scan_portage_task(
 | 
					 | 
				
			||||||
        packages=None,
 | 
					 | 
				
			||||||
        category=None,
 | 
					 | 
				
			||||||
        no_log=no_log,
 | 
					 | 
				
			||||||
        purge_packages=purge_packages,
 | 
					 | 
				
			||||||
        purge_versions=purge_versions,
 | 
					 | 
				
			||||||
        prefetch=prefetch,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@task
 | 
					 | 
				
			||||||
def _scan_upstream_task(packages, purge_versions=False):
 | 
					 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Scans upstream for the given set of packages
 | 
					    Scans upstream for the given set of packages
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    logger = _scan_upstream_task.get_logger()
 | 
					    logger = scan_upstream.get_logger()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    logger.info("Starting upstream scanning subtask for %d packages...",
 | 
					    if len(packages):
 | 
				
			||||||
 | 
					        logger.info("Starting upstream scan subtask for %d packages...",
 | 
				
			||||||
 | 
					                    len(packages))
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        logger.info("Starting upstream scan...",
 | 
				
			||||||
                    len(packages))
 | 
					                    len(packages))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    result = scan_upstream(
 | 
					    scan.scan_upstream(
 | 
				
			||||||
        packages=packages,
 | 
					        packages=packages,
 | 
				
			||||||
        purge_versions=purge_versions,
 | 
					        purge_versions=purge_versions,
 | 
				
			||||||
        logger=logger,
 | 
					        logger=logger,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    # TODO: implement some kind of error raising in case of failure
 | 
					    return True
 | 
				
			||||||
    #if not result:
 | 
					 | 
				
			||||||
    #    raise TaskFailedException
 | 
					 | 
				
			||||||
    return result
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
@task
 | 
					@task
 | 
				
			||||||
def scan_upstream_list_task(query, purge_versions=False):
 | 
					def update_portage_trees():
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    Runs a parallel upstream scan for packages in the query list (space
 | 
					 | 
				
			||||||
    separated string). Task used only from the web interface.
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    kwargs = {"purge_versions": purge_versions}
 | 
					 | 
				
			||||||
    return _run_in_chunks(_scan_upstream_task, [p for p in query.split()],
 | 
					 | 
				
			||||||
                          kwargs)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@task
 | 
					 | 
				
			||||||
def scan_upstream_all_task(purge_versions=False):
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    Runs a parallel portage scan for all packages
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    kwargs = {"purge_versions": purge_versions}
 | 
					 | 
				
			||||||
    return _run_in_chunks(
 | 
					 | 
				
			||||||
        _scan_upstream_task,
 | 
					 | 
				
			||||||
        Package.objects.all().order_by('?'),
 | 
					 | 
				
			||||||
        kwargs
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@task
 | 
					 | 
				
			||||||
def update_portage_trees_task():
 | 
					 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Update portage tree
 | 
					    Update portage tree
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    logger = update_portage_trees_task.get_logger()
 | 
					    logger = update_portage_trees.get_logger()
 | 
				
			||||||
    update_portage_trees(logger=logger)
 | 
					    misc.update_portage_trees(logger=logger)
 | 
				
			||||||
 | 
					    return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@task
 | 
					@task
 | 
				
			||||||
def update_task(update_portage_trees=True, scan_portage=True,
 | 
					def update_portage(packages=None):
 | 
				
			||||||
                scan_metadata=True, scan_upstream=True, update_counters=True):
 | 
					    (
 | 
				
			||||||
    """
 | 
					        update_portage_trees.s() |
 | 
				
			||||||
    Update the whole euscan system
 | 
					        scan_portage.si(purge_packages=True, purge_versions=True, prefetch=True) |
 | 
				
			||||||
    """
 | 
					        #scan_metadata.si() |
 | 
				
			||||||
    if update_portage_trees:
 | 
					        group_one(scan_metadata, portage.settings.categories) |
 | 
				
			||||||
        update_portage_trees_task()
 | 
					        update_counters.si(fast=False)
 | 
				
			||||||
    if scan_portage:
 | 
					    )()
 | 
				
			||||||
        scan_portage_all_task(prefetch=True, purge_packages=True,
 | 
					    return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@task
 | 
				
			||||||
 | 
					def update_upstream():
 | 
				
			||||||
 | 
					    if settings.TASKS_UPSTREAM_GROUPS >= 1:
 | 
				
			||||||
 | 
					        packages = Package.objects.all()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        scan_upstream_sub = group_chunks(scan_upstream, packages,
 | 
				
			||||||
 | 
					                                         settings.TASKS_UPSTREAM_GROUPS,
 | 
				
			||||||
                                         purge_versions=True)
 | 
					                                         purge_versions=True)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # metadata and upstream scan can run concurrently, launch them
 | 
					 | 
				
			||||||
    # in a group and wait for them to finish
 | 
					 | 
				
			||||||
    tasks = []
 | 
					 | 
				
			||||||
    if scan_metadata:
 | 
					 | 
				
			||||||
        tasks.append(scan_metadata_all_task.subtask())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if scan_upstream:
 | 
					 | 
				
			||||||
        tasks.append(scan_upstream_all_task.subtask())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if update_counters:
 | 
					 | 
				
			||||||
        chord(tasks)(
 | 
					 | 
				
			||||||
            # immutable means that the result of previous tasks is not passed
 | 
					 | 
				
			||||||
            update_counters_task.subtask((), {"fast": False}, immutable=True)
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        group(tasks)()
 | 
					        scan_upstream_sub = scan_upstream.si(purge_versions=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (
 | 
				
			||||||
 | 
					        scan_upstream_sub |
 | 
				
			||||||
 | 
					        update_counters.si(fast=False)
 | 
				
			||||||
 | 
					    )()
 | 
				
			||||||
 | 
					    return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@task
 | 
					@task
 | 
				
			||||||
def scan_package_task(package):
 | 
					def scan_package(package):
 | 
				
			||||||
    _scan_portage_task([package], purge_packages=True, purge_versions=True)
 | 
					    scan_portage([package], purge_packages=True, purge_versions=True)
 | 
				
			||||||
    _scan_metadata_task([package])
 | 
					    scan_metadata([package])
 | 
				
			||||||
    _scan_upstream_task([package])
 | 
					    scan_upstream([package])
 | 
				
			||||||
 | 
					    return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@task(rate_limit="1/m")
 | 
				
			||||||
# Periodic tasks
 | 
					def scan_package_user(package):
 | 
				
			||||||
 | 
					    scan_package(package)
 | 
				
			||||||
 | 
					    return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@task
 | 
					@task
 | 
				
			||||||
def consume_refresh_package_request():
 | 
					def consume_refresh_package_request():
 | 
				
			||||||
@@ -257,25 +183,39 @@ def consume_refresh_package_request():
 | 
				
			|||||||
    Satisfies user requests for package refreshing, runs every minute
 | 
					    Satisfies user requests for package refreshing, runs every minute
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        obj = RefreshPackageQuery.objects.all().order_by('-priority')[0]
 | 
					        query = RefreshPackageQuery.objects.all().order_by('-priority')[0]
 | 
				
			||||||
    except IndexError:
 | 
					    except IndexError:
 | 
				
			||||||
        return {}
 | 
					        return
 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        result = scan_package_task(obj.package)
 | 
					 | 
				
			||||||
        obj.delete()
 | 
					 | 
				
			||||||
        return result
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pkg = query.package
 | 
				
			||||||
 | 
					    query.delete()
 | 
				
			||||||
 | 
					    scan_package_user.delay(pkg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
admin_tasks = [
 | 
					admin_tasks = [
 | 
				
			||||||
    regen_rrds_task,
 | 
					    regen_rrds,
 | 
				
			||||||
    update_counters_task,
 | 
					    update_counters,
 | 
				
			||||||
    scan_metadata_list_task,
 | 
					    scan_metadata,
 | 
				
			||||||
    scan_metadata_all_task,
 | 
					    scan_portage,
 | 
				
			||||||
    scan_portage_all_task,
 | 
					    scan_upstream,
 | 
				
			||||||
    scan_portage_list_task,
 | 
					    update_portage_trees,
 | 
				
			||||||
    scan_upstream_all_task,
 | 
					    update_portage,
 | 
				
			||||||
    scan_upstream_list_task,
 | 
					    update_upstream,
 | 
				
			||||||
    update_portage_trees_task,
 | 
					    scan_package,
 | 
				
			||||||
    update_task,
 | 
					 | 
				
			||||||
    scan_package_task,
 | 
					 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					""" Chunk helpers (chunks can't use keyword arguments) """
 | 
				
			||||||
 | 
					@task
 | 
				
			||||||
 | 
					def scan_metadata_category(category):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Helper for calling scan_metadata with a category
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    scan_metadata(category=category)
 | 
				
			||||||
 | 
					    return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@task
 | 
				
			||||||
 | 
					def scan_upstream_purge(*packages):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Helper for calling scan_upstream with purge_versions=True
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    scan_upstream(packages, purge_versions=True)
 | 
				
			||||||
 | 
					    return True
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<table id="table" class="display">
 | 
					<table id="table" class="display">
 | 
				
			||||||
  <thead>
 | 
					  <thead>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<table id="table" class="display">
 | 
					<table id="table" class="display">
 | 
				
			||||||
  <thead>
 | 
					  <thead>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<table id="table" class="display">
 | 
					<table id="table" class="display">
 | 
				
			||||||
  <thead>
 | 
					  <thead>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
{% load mul %}
 | 
					{% load mul %}
 | 
				
			||||||
{% load sub %}
 | 
					{% load sub %}
 | 
				
			||||||
{% load div %}
 | 
					{% load div %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
{% load sub %}
 | 
					{% load sub %}
 | 
				
			||||||
{% load div %}
 | 
					{% load div %}
 | 
				
			||||||
{% load mul %}
 | 
					{% load mul %}
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
  {{ block.super }} - Watched categories
 | 
					  {{ block.super }} - Watched categories
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
  {{ block.super }} - Watched herds
 | 
					  {{ block.super }} - Watched herds
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
  {{ block.super }} - Watched maintainers
 | 
					  {{ block.super }} - Watched maintainers
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
  {{ block.super }} - Watched packages
 | 
					  {{ block.super }} - Watched packages
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
{{ block.super }} - Overlay: {{ overlay }}
 | 
					{{ block.super }} - Overlay: {{ overlay }}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load sub %}
 | 
					{% load sub %}
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
{% load url from future %}
 | 
					{% load url from future %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block meta %}
 | 
					{% block meta %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "euscan/_datatable.html" %}
 | 
					{% extends "euscan/_datatable.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load euscan_tags %}
 | 
					{% load djeuscan_helpers %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block title %}
 | 
					{% block title %}
 | 
				
			||||||
{{ block.super }} - World Scan
 | 
					{{ block.super }} - World Scan
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,10 @@
 | 
				
			|||||||
from django import template
 | 
					from django import template
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from euscan import helpers
 | 
					from euscan.version import is_version_type_stable, get_version_type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
register = template.Library()
 | 
					register = template.Library()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
@register.inclusion_tag('euscan/_packages.html', takes_context=True)
 | 
					@register.inclusion_tag('euscan/_packages.html', takes_context=True)
 | 
				
			||||||
def packages(context, pkgs):
 | 
					def packages(context, pkgs):
 | 
				
			||||||
    context['packages'] = pkgs
 | 
					    context['packages'] = pkgs
 | 
				
			||||||
@@ -61,9 +60,9 @@ def overlays_table(overlays):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@register.filter
 | 
					@register.filter
 | 
				
			||||||
def is_stable(version_type):
 | 
					def is_stable(version_type):
 | 
				
			||||||
    return helpers.is_version_type_stable(version_type)
 | 
					    return is_version_type_stable(version_type)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@register.filter
 | 
					@register.filter
 | 
				
			||||||
def version_type(version):
 | 
					def version_type(version):
 | 
				
			||||||
    return helpers.get_version_type(version)
 | 
					    return get_version_type(version)
 | 
				
			||||||
							
								
								
									
										22
									
								
								euscanwww/djeuscan/utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								euscanwww/djeuscan/utils.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					def queryset_iterator(queryset, chunksize=1000):
 | 
				
			||||||
 | 
					        '''''
 | 
				
			||||||
 | 
					        Iterate over a Django Queryset ordered by the primary key
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        This method loads a maximum of chunksize (default: 1000) rows in it's
 | 
				
			||||||
 | 
					        memory at the same time while django normally would load all rows in it's
 | 
				
			||||||
 | 
					        memory. Using the iterator() method only causes it to not preload all the
 | 
				
			||||||
 | 
					        classes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Note that the implementation of the iterator does not support ordered query sets.
 | 
				
			||||||
 | 
					        '''
 | 
				
			||||||
 | 
					        import gc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pk = 0
 | 
				
			||||||
 | 
					        last_pk = queryset.order_by('-pk')[0].pk
 | 
				
			||||||
 | 
					        queryset = queryset.order_by('pk')
 | 
				
			||||||
 | 
					        while pk < last_pk:
 | 
				
			||||||
 | 
					            for row in queryset.filter(pk__gt=pk)[:chunksize]:
 | 
				
			||||||
 | 
					                pk = row.pk
 | 
				
			||||||
 | 
					                yield row
 | 
				
			||||||
 | 
					            gc.collect()
 | 
				
			||||||
@@ -159,7 +159,6 @@ TEMPLATE_CONTEXT_PROCESSORS = (
 | 
				
			|||||||
INSTALLED_APPS = (
 | 
					INSTALLED_APPS = (
 | 
				
			||||||
    'euscanwww',
 | 
					    'euscanwww',
 | 
				
			||||||
    'djeuscan',
 | 
					    'djeuscan',
 | 
				
			||||||
 | 
					 | 
				
			||||||
    'django.contrib.auth',
 | 
					    'django.contrib.auth',
 | 
				
			||||||
    'django.contrib.contenttypes',
 | 
					    'django.contrib.contenttypes',
 | 
				
			||||||
    'django.contrib.sessions',
 | 
					    'django.contrib.sessions',
 | 
				
			||||||
@@ -237,10 +236,10 @@ CELERY_RESULT_BACKEND = "amqp"
 | 
				
			|||||||
BROKER_CONNECTION_TIMEOUT = 3600
 | 
					BROKER_CONNECTION_TIMEOUT = 3600
 | 
				
			||||||
CELERYD_CONCURRENCY = 4
 | 
					CELERYD_CONCURRENCY = 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TASKS_CONCURRENTLY = 8
 | 
					TASKS_UPSTREAM_GROUPS = 32
 | 
				
			||||||
TASKS_SUBTASK_PACKAGES = 32
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
 | 
					CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
 | 
				
			||||||
 | 
					CELERYBEAT_SCHEDULE = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# LDAP authentication
 | 
					# LDAP authentication
 | 
				
			||||||
# TODO: Test data - change me!
 | 
					# TODO: Test data - change me!
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,7 @@ CONFIG = {
 | 
				
			|||||||
    'mirror': False,
 | 
					    'mirror': False,
 | 
				
			||||||
    'ignore-pre-release': False,
 | 
					    'ignore-pre-release': False,
 | 
				
			||||||
    'ignore-pre-release-if-stable': False,
 | 
					    'ignore-pre-release-if-stable': False,
 | 
				
			||||||
 | 
					    'ebuild-uri': False,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BLACKLIST_VERSIONS = [
 | 
					BLACKLIST_VERSIONS = [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,27 +33,6 @@ VERSION_CMP_PACKAGE_QUIRKS = {
 | 
				
			|||||||
_v_end = '((-|_)(pre|p|beta|b|alpha|a|rc|r)\d*)'
 | 
					_v_end = '((-|_)(pre|p|beta|b|alpha|a|rc|r)\d*)'
 | 
				
			||||||
_v = r'((\d+)((\.\d+)*)([a-zA-Z]*?)(' + _v_end + '*))'
 | 
					_v = r'((\d+)((\.\d+)*)([a-zA-Z]*?)(' + _v_end + '*))'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
def is_version_stable(version):
 | 
					 | 
				
			||||||
    return is_version_type_stable(get_version_type(version))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def is_version_type_stable(version_type):
 | 
					 | 
				
			||||||
    return version_type not in ("alpha", "beta", "pre", "rc")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def get_version_type(version):
 | 
					 | 
				
			||||||
    types = []
 | 
					 | 
				
			||||||
    gentoo_types = ("alpha", "beta", "pre", "rc", "p")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for token in re.findall("[\._-]([a-zA-Z]+)", version):
 | 
					 | 
				
			||||||
        if token in gentoo_types:
 | 
					 | 
				
			||||||
            types.append(token)
 | 
					 | 
				
			||||||
    if types:
 | 
					 | 
				
			||||||
        return types[0]  # TODO: consider returning all types
 | 
					 | 
				
			||||||
    return "release"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Stolen from g-pypi
 | 
					# Stolen from g-pypi
 | 
				
			||||||
def gentoo_mangle_version(up_pv):
 | 
					def gentoo_mangle_version(up_pv):
 | 
				
			||||||
    """Convert PV to MY_PV if needed
 | 
					    """Convert PV to MY_PV if needed
 | 
				
			||||||
@@ -416,7 +395,7 @@ def urlallowed(url):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        setdefaulttimeout(timeout)
 | 
					        setdefaulttimeout(timeout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return rp.can_fetch(CONFIG['user-agent'], url) if rp else False
 | 
					    return rp.can_fetch(CONFIG['user-agent'], url) if rp else True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def urlopen(url, timeout=None, verb="GET"):
 | 
					def urlopen(url, timeout=None, verb="GET"):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,10 +5,9 @@ import signal
 | 
				
			|||||||
import time
 | 
					import time
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from gentoolkit import pprinter as pp
 | 
					 | 
				
			||||||
import portage
 | 
					import portage
 | 
				
			||||||
from portage.output import EOutput, TermProgressBar
 | 
					from portage.output import EOutput, TermProgressBar
 | 
				
			||||||
 | 
					from gentoolkit import pprinter as pp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ProgressHandler(object):
 | 
					class ProgressHandler(object):
 | 
				
			||||||
    def __init__(self, progress_bar):
 | 
					    def __init__(self, progress_bar):
 | 
				
			||||||
@@ -66,6 +65,31 @@ def clean_colors(string):
 | 
				
			|||||||
    return string
 | 
					    return string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def transform_url(config, cpv, url):
 | 
				
			||||||
 | 
					    if config['mirror']:
 | 
				
			||||||
 | 
					        url = to_mirror(url)
 | 
				
			||||||
 | 
					    if config['ebuild-uri']:
 | 
				
			||||||
 | 
					        url = to_ebuild_uri(cpv, url)
 | 
				
			||||||
 | 
					    return url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def to_ebuild_uri(cpv, url):
 | 
				
			||||||
 | 
					    cat, pkg, ver, rev = portage.catpkgsplit(cpv)
 | 
				
			||||||
 | 
					    p = '%s-%s' % (pkg, ver)
 | 
				
			||||||
 | 
					    pvr = '%s%s' % (ver, '-%s' % rev if rev != 'r0' else '')
 | 
				
			||||||
 | 
					    pf = '%s-%s' % (pkg, pvr)
 | 
				
			||||||
 | 
					    evars = (
 | 
				
			||||||
 | 
					        (p  , 'P'),
 | 
				
			||||||
 | 
					        (pkg, 'PN'),
 | 
				
			||||||
 | 
					        (ver, 'PV'),
 | 
				
			||||||
 | 
					        (rev, 'PR'),
 | 
				
			||||||
 | 
					        (pvr, 'PVR'),
 | 
				
			||||||
 | 
					        (pf , 'PF'),
 | 
				
			||||||
 | 
					        (cat, 'CATEGORY')
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    for src, dst in evars:
 | 
				
			||||||
 | 
					        url = url.replace(src, '${%s}' % dst)
 | 
				
			||||||
 | 
					    return url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def to_mirror(url):
 | 
					def to_mirror(url):
 | 
				
			||||||
    mirrors = portage.settings.thirdpartymirrors()
 | 
					    mirrors = portage.settings.thirdpartymirrors()
 | 
				
			||||||
    for mirror_name in mirrors:
 | 
					    for mirror_name in mirrors:
 | 
				
			||||||
@@ -146,15 +170,17 @@ class EuscanOutput(object):
 | 
				
			|||||||
            raise TypeError("Invalid output format")
 | 
					            raise TypeError("Invalid output format")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def result(self, cp, version, urls, handler, confidence):
 | 
					    def result(self, cp, version, urls, handler, confidence):
 | 
				
			||||||
        from euscan.helpers import get_version_type
 | 
					        from euscan.version import get_version_type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if self.config['format']:
 | 
					        cpv = '%s-%s' % (cp, version)
 | 
				
			||||||
 | 
					        urls = ' '.join(transform_url(self.config, cpv, url) for url in urls.split())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self.config['format'] in ['json']:
 | 
				
			||||||
            _curr = self.queries[self.current_query]
 | 
					            _curr = self.queries[self.current_query]
 | 
				
			||||||
            _curr["result"].append(
 | 
					            _curr["result"].append(
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    "version": version,
 | 
					                    "version": version,
 | 
				
			||||||
                    "urls": [to_mirror(url) if self.config['mirror'] else url
 | 
					                    "urls": urls.split(),
 | 
				
			||||||
                             for url in urls.split()],
 | 
					 | 
				
			||||||
                    "handler": handler,
 | 
					                    "handler": handler,
 | 
				
			||||||
                    "confidence": confidence,
 | 
					                    "confidence": confidence,
 | 
				
			||||||
                    "type": get_version_type(version)
 | 
					                    "type": get_version_type(version)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,8 @@ from gentoolkit.package import Package
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from euscan import CONFIG, BLACKLIST_PACKAGES
 | 
					from euscan import CONFIG, BLACKLIST_PACKAGES
 | 
				
			||||||
from euscan import handlers, output
 | 
					from euscan import handlers, output
 | 
				
			||||||
from euscan.helpers import version_blacklisted, is_version_stable
 | 
					from euscan.helpers import version_blacklisted
 | 
				
			||||||
 | 
					from euscan.version import is_version_stable
 | 
				
			||||||
from euscan.ebuild import package_from_ebuild
 | 
					from euscan.ebuild import package_from_ebuild
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,22 @@
 | 
				
			|||||||
import re
 | 
					import re
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def is_version_type_stable(version_type):
 | 
				
			||||||
 | 
					    return version_type not in ("alpha", "beta", "pre", "rc")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def is_version_stable(version):
 | 
				
			||||||
 | 
					    return is_version_type_stable(get_version_type(version))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_version_type(version):
 | 
				
			||||||
 | 
					    types = []
 | 
				
			||||||
 | 
					    gentoo_types = ("alpha", "beta", "pre", "rc", "p")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for token in re.findall("[\._-]([a-zA-Z]+)", version):
 | 
				
			||||||
 | 
					        if token in gentoo_types:
 | 
				
			||||||
 | 
					            types.append(token)
 | 
				
			||||||
 | 
					    if types:
 | 
				
			||||||
 | 
					        return types[0]  # TODO: consider returning all types
 | 
				
			||||||
 | 
					    return "release"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Stolen from pkg_resources, but importing it is not a good idea
 | 
					# Stolen from pkg_resources, but importing it is not a good idea
 | 
				
			||||||
 | 
					
 | 
				
			||||||
component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE)
 | 
					component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user