Merge branch 'master' of https://github.com/iksaif/euscan
Conflicts: euscanwww/djeuscan/processing/scan/scan_portage.py Signed-off-by: volpino <fox91@anche.no>
@@ -88,9 +88,12 @@ class Package(models.Model):
 | 
				
			|||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        unique_together = ['category', 'name']
 | 
					        unique_together = ['category', 'name']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __unicode__(self):
 | 
					    def cp(self):
 | 
				
			||||||
        return '%s/%s' % (self.category, self.name)
 | 
					        return '%s/%s' % (self.category, self.name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __unicode__(self):
 | 
				
			||||||
 | 
					        return self.cp()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def save(self, *args, **kwargs):
 | 
					    def save(self, *args, **kwargs):
 | 
				
			||||||
        self.full_clean()
 | 
					        self.full_clean()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -137,10 +140,17 @@ class Version(models.Model):
 | 
				
			|||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        unique_together = ['package', 'slot', 'revision', 'version', 'overlay']
 | 
					        unique_together = ['package', 'slot', 'revision', 'version', 'overlay']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def cpv(self):
 | 
				
			||||||
 | 
					        return '%s/%s-%s-%s' % (
 | 
				
			||||||
 | 
					            self.package.category, self.package.name, self.version,
 | 
				
			||||||
 | 
					            self.revision if self.revision != 'r0' else ''
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __unicode__(self):
 | 
					    def __unicode__(self):
 | 
				
			||||||
        return '%s/%s-%s-%s:%s [%s]' % (
 | 
					        return '%s/%s-%s-%s:%s [%s]' % (
 | 
				
			||||||
            self.package.category, self.package.name, self.version,
 | 
					            self.package.category, self.package.name, self.version,
 | 
				
			||||||
            self.revision, self.slot, self.overlay or "<upstream>"
 | 
					            self.revision if self.revision != 'r0' else '',
 | 
				
			||||||
 | 
					            self.slot, self.overlay or "<upstream>"
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def save(self, *args, **kwargs):
 | 
					    def save(self, *args, **kwargs):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -160,6 +160,7 @@ class ScanMetadata(object):
 | 
				
			|||||||
                    maintainer = self.store_maintainer(
 | 
					                    maintainer = self.store_maintainer(
 | 
				
			||||||
                        maintainer_name, maintainer_email
 | 
					                        maintainer_name, maintainer_email
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    herd.maintainers.add(maintainer)
 | 
					                    herd.maintainers.add(maintainer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -169,7 +170,7 @@ def scan_metadata(packages=None, category=None, logger=None, populate=False):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if category:
 | 
					    if category:
 | 
				
			||||||
        packages = Package.objects.filter(category=category)
 | 
					        packages = Package.objects.filter(category=category)
 | 
				
			||||||
    elif not packages:
 | 
					    elif packages == None:
 | 
				
			||||||
        packages = Package.objects.all()
 | 
					        packages = Package.objects.all()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if populate:
 | 
					    if populate:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,8 +31,11 @@ class ScanUpstream(object):
 | 
				
			|||||||
            ebuild = out[package]["metadata"]["ebuild"]
 | 
					            ebuild = out[package]["metadata"]["ebuild"]
 | 
				
			||||||
        except KeyError:
 | 
					        except KeyError:
 | 
				
			||||||
            self.logger.error(
 | 
					            self.logger.error(
 | 
				
			||||||
                "Error while scanning upstream for package %s!\n%s",
 | 
					                "Error while scanning upstream for package %s!",
 | 
				
			||||||
                package,
 | 
					                package
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            self.logger.debug(
 | 
				
			||||||
 | 
					                "Error %s",
 | 
				
			||||||
                out_json
 | 
					                out_json
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            return {}
 | 
					            return {}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -158,6 +158,7 @@ def update_portage_trees():
 | 
				
			|||||||
@task
 | 
					@task
 | 
				
			||||||
def update_portage(packages=None):
 | 
					def update_portage(packages=None):
 | 
				
			||||||
    update_portage_trees()
 | 
					    update_portage_trees()
 | 
				
			||||||
 | 
					    scan_metadata(packages=None, populate=True)
 | 
				
			||||||
    (
 | 
					    (
 | 
				
			||||||
        group_one(scan_portage, portage.settings.categories,
 | 
					        group_one(scan_portage, portage.settings.categories,
 | 
				
			||||||
                  attr_name="category", purge_packages=True,
 | 
					                  attr_name="category", purge_packages=True,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -132,6 +132,7 @@
 | 
				
			|||||||
        {% endif %}
 | 
					        {% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        {{ version.version }} - {{ version.urls }}
 | 
					        {{ version.version }} - {{ version.urls }}
 | 
				
			||||||
 | 
						  {% if confidence < 100 %}({{ version.confidence }}%){% endif %}
 | 
				
			||||||
      </li>
 | 
					      </li>
 | 
				
			||||||
      {% endfor %}
 | 
					      {% endfor %}
 | 
				
			||||||
     </ul>
 | 
					     </ul>
 | 
				
			||||||
@@ -168,9 +169,7 @@
 | 
				
			|||||||
  <dt>euscan log</dt>
 | 
					  <dt>euscan log</dt>
 | 
				
			||||||
  <dd>
 | 
					  <dd>
 | 
				
			||||||
    <p>Date: {{ log.datetime }}
 | 
					    <p>Date: {{ log.datetime }}
 | 
				
			||||||
    <pre class="log">
 | 
					    <pre class="log">{{ msg|ansi_to_html|safe }}</pre>
 | 
				
			||||||
      {{ log.result|ansi_to_html|safe }}
 | 
					 | 
				
			||||||
    </pre>
 | 
					 | 
				
			||||||
  </dd>
 | 
					  </dd>
 | 
				
			||||||
  {% endif %}
 | 
					  {% endif %}
 | 
				
			||||||
</dl>
 | 
					</dl>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,8 +3,6 @@ from django.conf import settings
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from euscan.version import is_version_type_stable, get_version_type
 | 
					from euscan.version import is_version_type_stable, get_version_type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from djeuscan.utils import plaintext2html
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
register = template.Library()
 | 
					register = template.Library()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -73,4 +71,6 @@ def version_type(version):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@register.filter
 | 
					@register.filter
 | 
				
			||||||
def ansi_to_html(text):
 | 
					def ansi_to_html(text):
 | 
				
			||||||
    return plaintext2html(text)
 | 
					    from ansi2html import Ansi2HTMLConverter
 | 
				
			||||||
 | 
					    conv = Ansi2HTMLConverter(inline=True, linkify=True)
 | 
				
			||||||
 | 
					    return conv.convert(text, full=False)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,92 +0,0 @@
 | 
				
			|||||||
import re
 | 
					 | 
				
			||||||
import cgi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
colorcodes = {
 | 
					 | 
				
			||||||
    'bold': ('\\\u001b[01m|\\\u001b[36;01m', '\\\u001b[39;49;00m'),
 | 
					 | 
				
			||||||
    'cyan': ('\\\u001b[36m', '\\\u001b[39m'),
 | 
					 | 
				
			||||||
    'blue': ('\\\u001b[34m', '\\\u001b[39m'),
 | 
					 | 
				
			||||||
    'red': ('\\\u001b[31m', '\\\u001b[39m'),
 | 
					 | 
				
			||||||
    'magenta': ('\\\u001b[35m', '\\\u001b[39m'),
 | 
					 | 
				
			||||||
    'green': ('\\\u001b[32;01m', '\\\u001b[39;49;00m'),
 | 
					 | 
				
			||||||
    'underline': ('\\\u001b[4m', '\\\u001b[24m'),
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def recolor(color, text):
 | 
					 | 
				
			||||||
    regexp = r"(?:%s)(.*?)(?:%s)" % colorcodes[color]
 | 
					 | 
				
			||||||
    regexp = regexp.replace('[', r'\[')
 | 
					 | 
				
			||||||
    return re.sub(
 | 
					 | 
				
			||||||
        regexp, r'''<span style="color: %s">\1</span>''' % color, text
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def bold(text):
 | 
					 | 
				
			||||||
    regexp = "(?:%s)(.*?)(?:%s)" % colorcodes['bold']
 | 
					 | 
				
			||||||
    regexp = regexp.replace('[', r'\[')
 | 
					 | 
				
			||||||
    return re.sub(regexp, r'<span style="font-weight:bold">\1</span>', text)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def underline(text):
 | 
					 | 
				
			||||||
    regexp = "(?:%s)(.*?)(?:%s)" % colorcodes['underline']
 | 
					 | 
				
			||||||
    regexp = regexp.replace('[', r'\[')
 | 
					 | 
				
			||||||
    return re.sub(
 | 
					 | 
				
			||||||
        regexp, r'<span style="text-decoration: underline">\1</span>', text
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def removebells(text):
 | 
					 | 
				
			||||||
    return text.replace('\07', '')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def removebackspaces(text):
 | 
					 | 
				
			||||||
    backspace_or_eol = r'(.\010)|(\033\[K)'
 | 
					 | 
				
			||||||
    n = 1
 | 
					 | 
				
			||||||
    while n > 0:
 | 
					 | 
				
			||||||
        text, n = re.subn(backspace_or_eol, '', text, 1)
 | 
					 | 
				
			||||||
    return text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def plaintext2html(text, tabstop=4):
 | 
					 | 
				
			||||||
    def do_sub(m):
 | 
					 | 
				
			||||||
        c = m.groupdict()
 | 
					 | 
				
			||||||
        if c['htmlchars']:
 | 
					 | 
				
			||||||
            return cgi.escape(c['htmlchars'])
 | 
					 | 
				
			||||||
        if c['lineend']:
 | 
					 | 
				
			||||||
            return '<br>'
 | 
					 | 
				
			||||||
        elif c['space']:
 | 
					 | 
				
			||||||
            t = m.group().replace('\t', ' ' * tabstop)
 | 
					 | 
				
			||||||
            t = t.replace(' ', ' ')
 | 
					 | 
				
			||||||
            return t
 | 
					 | 
				
			||||||
        elif c['space'] == '\t':
 | 
					 | 
				
			||||||
            return ' ' * tabstop
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            url = m.group('protocal')
 | 
					 | 
				
			||||||
            if url.startswith(' '):
 | 
					 | 
				
			||||||
                prefix = ' '
 | 
					 | 
				
			||||||
                url = url[1:]
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                prefix = ''
 | 
					 | 
				
			||||||
            last = m.groups()[-1]
 | 
					 | 
				
			||||||
            if last in ['\n', '\r', '\r\n']:
 | 
					 | 
				
			||||||
                last = '<br/>'
 | 
					 | 
				
			||||||
            return '%s%s' % (prefix, url)
 | 
					 | 
				
			||||||
    re_string = re.compile(
 | 
					 | 
				
			||||||
        r'(?P<htmlchars>[<&>])|(?P<space>^[ \t]+)|(?P<lineend>\r\n|\r|\n)|'
 | 
					 | 
				
			||||||
        r'(?P<protocal>(^|\s)((http|ftp)://.*?))(\s|$)',
 | 
					 | 
				
			||||||
        re.S | re.M | re.I
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    result = re.sub(re_string, do_sub, text)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    result = re.sub(r"\\n", "<br/>", result)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    result = recolor('cyan', result)
 | 
					 | 
				
			||||||
    result = recolor('blue', result)
 | 
					 | 
				
			||||||
    result = recolor('red', result)
 | 
					 | 
				
			||||||
    result = recolor('magenta', result)
 | 
					 | 
				
			||||||
    result = recolor('green', result)
 | 
					 | 
				
			||||||
    result = bold(result)
 | 
					 | 
				
			||||||
    result = underline(result)
 | 
					 | 
				
			||||||
    result = removebells(result)
 | 
					 | 
				
			||||||
    result = removebackspaces(result)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return result
 | 
					 | 
				
			||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
""" Views """
 | 
					""" Views """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import inspect
 | 
					import inspect
 | 
				
			||||||
 | 
					import json
 | 
				
			||||||
from annoying.decorators import render_to, ajax_request
 | 
					from annoying.decorators import render_to, ajax_request
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from django.http import Http404
 | 
					from django.http import Http404
 | 
				
			||||||
@@ -202,6 +203,13 @@ def package(request, category, package):
 | 
				
			|||||||
    log = log[0] if log else None
 | 
					    log = log[0] if log else None
 | 
				
			||||||
    vlog = VersionLog.objects.for_package(package, order=True)
 | 
					    vlog = VersionLog.objects.for_package(package, order=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    result = json.loads(log.result) if log else None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if result and package.cp() in result:
 | 
				
			||||||
 | 
					        msg = result[package.cp()]['messages']
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        msg = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        last_scan = EuscanResult.objects.for_package(package).latest().datetime
 | 
					        last_scan = EuscanResult.objects.for_package(package).latest().datetime
 | 
				
			||||||
    except EuscanResult.DoesNotExist:
 | 
					    except EuscanResult.DoesNotExist:
 | 
				
			||||||
@@ -242,6 +250,7 @@ def package(request, category, package):
 | 
				
			|||||||
        'upstream': upstream,
 | 
					        'upstream': upstream,
 | 
				
			||||||
        'log': log,
 | 
					        'log': log,
 | 
				
			||||||
        'vlog': vlog,
 | 
					        'vlog': vlog,
 | 
				
			||||||
 | 
					        'msg' : msg,
 | 
				
			||||||
        'last_scan': last_scan,
 | 
					        'last_scan': last_scan,
 | 
				
			||||||
        'favourited': favourited,
 | 
					        'favourited': favourited,
 | 
				
			||||||
        'refreshed': refreshed,
 | 
					        'refreshed': refreshed,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -239,7 +239,6 @@ CELERYD_CONCURRENCY = 4
 | 
				
			|||||||
TASKS_UPSTREAM_GROUPS = 32
 | 
					TASKS_UPSTREAM_GROUPS = 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!
 | 
				
			||||||
 
 | 
				
			|||||||
| 
		 Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.4 KiB  | 
| 
		 Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.0 KiB  | 
| 
		 Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 821 B  | 
| 
		 Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.1 KiB  |