aboutsummaryrefslogtreecommitdiff
blob: f85e1f46ba63f3e7e8b6291c9f36e0365ee62e1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import os.path
import re
from datetime import datetime, timedelta
from gentoolkit.package import Package
from dateutil.parser import  parse

from djeuscan.processing import FakeLogger
from djeuscan.models import Version


def get_version_date(version, date_limit):
    """
    Returns the datetime when the version was added to Portage, if less than date_limit
    """
    changelog_path = os.path.join(os.path.dirname(version.ebuild_path), "ChangeLog")
    if not os.path.exists(changelog_path):
        return

    with open(changelog_path) as changelog:
        for line in changelog:
            match = re.match(r"^\*([^\(]+) \((\d\d \w\w\w \d\d\d\d)\)\s*$", line)
            if match:
                version_date = parse(match.group(2)).date()
                if version_date < date_limit:
                    return version_date


def stabilization_candidates(date_limit=None, logger=None):
    """
    Collect stabilization candidates
    """

    if logger is None:
        logger = FakeLogger()

    if date_limit is None:
        date_limit = (datetime.utcnow() - timedelta(days=30)).date()

    logger.info("Starting collecting stabilization candidates - date_limit=%s", str(date_limit))

    # Set all versions to not be stabilization_candidates
    #Version.objects.update(stabilization_candidate=False)

    # For every version check if it's unstable.
    # If it is then check if can be a stabilization candidate
    for version in Version.objects.filter(overlay='gentoo').exclude(version='9999').exclude(version='99999999'):
        pkg = Package(version.cpv())
        keywords = pkg.environment("KEYWORDS").split()
        if all([x.startswith("~") for x in keywords]):
            version_date = get_version_date(version, date_limit)
            if version_date:
                logger.info('+ [s] %s @ %s', version, version_date)
                # XXX: What should we save? A flag and version_date? Just the date?
                #version.stabilization_candidate = True
                #version.save()

    logger.info("Finished collecting stabilization candidates")