Compare commits
9 Commits
euscan-0.1
...
euscan-0.1
Author | SHA1 | Date | |
---|---|---|---|
2d81d0a0be | |||
333c535230 | |||
72e43ac4fe | |||
2bd012ef82 | |||
b78e73038d | |||
d673c00e12 | |||
fef31c514c | |||
0e6c18b84b | |||
3569f1bb97 |
@ -2,6 +2,14 @@
|
|||||||
Change history
|
Change history
|
||||||
================
|
================
|
||||||
|
|
||||||
|
.. _version-0.2.0:
|
||||||
|
|
||||||
|
0.2.0
|
||||||
|
=====
|
||||||
|
:release-date: ???
|
||||||
|
|
||||||
|
* Better --quiet mode
|
||||||
|
|
||||||
.. _version-0.1.0:
|
.. _version-0.1.0:
|
||||||
|
|
||||||
0.1.0
|
0.1.0
|
||||||
|
13
TODO
13
TODO
@ -18,12 +18,12 @@ Site Handlers
|
|||||||
euscanwww
|
euscanwww
|
||||||
---------
|
---------
|
||||||
|
|
||||||
- add last scan in the footer
|
- add last scan in the footer [0.2.0]
|
||||||
- rss scan world + post ?
|
- rss scan world + post ?
|
||||||
- add an /about/config page that describe the current config (overlays, stuff in make.conf, euscan default settings, etc..)
|
- add an /about/config page that describe the current config (overlays, stuff in make.conf, euscan default settings, etc..) [0.2.0]
|
||||||
- add a table for overlays, change euscan_versions
|
- add a table for overlays, change euscan_versions [0.2.0]
|
||||||
|
|
||||||
### Commands
|
### Commands [0.2.0]
|
||||||
|
|
||||||
- euscan_init: init local tree (portage, layman, eix)
|
- euscan_init: init local tree (portage, layman, eix)
|
||||||
- euscan_addoverlay: add a layman overlay
|
- euscan_addoverlay: add a layman overlay
|
||||||
@ -33,9 +33,12 @@ euscanwww
|
|||||||
|
|
||||||
### Scan process
|
### Scan process
|
||||||
|
|
||||||
- Move to celery:
|
- Move to celery: [0.2.0]
|
||||||
- periodic task for emerge --sync; layman -S; eix-update etc... (every day ?)
|
- periodic task for emerge --sync; layman -S; eix-update etc... (every day ?)
|
||||||
- periodic task for euscan (once every week, groupped by category or package ?)
|
- periodic task for euscan (once every week, groupped by category or package ?)
|
||||||
|
|
||||||
This would allow easier on-demand refresh from web interface
|
This would allow easier on-demand refresh from web interface
|
||||||
|
|
||||||
|
### API
|
||||||
|
|
||||||
|
- Move to tastypie: [0.3.0]
|
||||||
|
18
bin/euscan
18
bin/euscan
@ -29,7 +29,8 @@ from gentoolkit import pprinter as pp
|
|||||||
from gentoolkit.eclean.search import (port_settings)
|
from gentoolkit.eclean.search import (port_settings)
|
||||||
from gentoolkit.errors import GentoolkitException
|
from gentoolkit.errors import GentoolkitException
|
||||||
|
|
||||||
from euscan import CONFIG, output
|
import euscan
|
||||||
|
from euscan import CONFIG
|
||||||
from euscan.scan import scan_upstream
|
from euscan.scan import scan_upstream
|
||||||
|
|
||||||
""" Globals """
|
""" Globals """
|
||||||
@ -198,7 +199,7 @@ def main():
|
|||||||
sys.exit(errno.EINVAL)
|
sys.exit(errno.EINVAL)
|
||||||
|
|
||||||
""" Change euscan's output """
|
""" Change euscan's output """
|
||||||
output = EOutput(CONFIG['quiet'])
|
euscan.output = EOutput(CONFIG['quiet'])
|
||||||
if CONFIG['verbose'] > 2:
|
if CONFIG['verbose'] > 2:
|
||||||
httplib.HTTPConnection.debuglevel = 1
|
httplib.HTTPConnection.debuglevel = 1
|
||||||
|
|
||||||
@ -219,18 +220,23 @@ def main():
|
|||||||
file=sys.stderr, end="")
|
file=sys.stderr, end="")
|
||||||
pp.die(1, "one of the above fully-qualified ebuild names instead.")
|
pp.die(1, "one of the above fully-qualified ebuild names instead.")
|
||||||
except GentoolkitException as err:
|
except GentoolkitException as err:
|
||||||
pp.die(1, str(err))
|
pp.die(1, '%s: %s' % (package, str(err)))
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
pp.die(1, str(err))
|
pp.die(1, '%s: %s' % (package, str(err)))
|
||||||
|
|
||||||
|
if not CONFIG['quiet']:
|
||||||
print ()
|
print ()
|
||||||
|
|
||||||
for url, version in ret:
|
for cp, url, version in ret:
|
||||||
|
if not CONFIG['quiet']:
|
||||||
print ("Upstream Version: "
|
print ("Upstream Version: "
|
||||||
+ pp.number("%s" % version)
|
+ pp.number("%s" % version)
|
||||||
+ pp.path(" %s" % url))
|
+ pp.path(" %s" % url))
|
||||||
|
else:
|
||||||
|
print (pp.cpv("%s-%s" % (cp, version))
|
||||||
|
+ ": " + pp.path(url))
|
||||||
|
|
||||||
if not len(ret):
|
if not len(ret) and not CONFIG['quiet']:
|
||||||
print (pp.warn("Didn't find any new version, "
|
print (pp.warn("Didn't find any new version, "
|
||||||
+ "check package's homepage for "
|
+ "check package's homepage for "
|
||||||
+ "more informations"));
|
+ "more informations"));
|
||||||
|
@ -60,7 +60,7 @@ def herd(request, herd):
|
|||||||
@render_to('euscan/maintainers.html')
|
@render_to('euscan/maintainers.html')
|
||||||
def maintainers(request):
|
def maintainers(request):
|
||||||
maintainers = Package.objects.filter(maintainers__isnull=False)
|
maintainers = Package.objects.filter(maintainers__isnull=False)
|
||||||
maintainers = maintainers.values('maintainers__id', 'maintainers__name')
|
maintainers = maintainers.values('maintainers__id', 'maintainers__name', 'maintainers__email')
|
||||||
maintainers = maintainers.annotate(n_packaged=Sum('n_packaged'),
|
maintainers = maintainers.annotate(n_packaged=Sum('n_packaged'),
|
||||||
n_overlay=Sum('n_overlay'),
|
n_overlay=Sum('n_overlay'),
|
||||||
n_versions=Sum('n_versions'))
|
n_versions=Sum('n_versions'))
|
||||||
|
@ -36,21 +36,23 @@ MANAGERS = ADMINS
|
|||||||
},
|
},
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
EUSCAN_ROOT = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
'default': {
|
'default': {
|
||||||
'ENGINE': 'django.db.backends.sqlite3',
|
'ENGINE': 'django.db.backends.sqlite3',
|
||||||
'NAME': os.path.join(os.path.dirname( __file__ ), 'euscan.db')
|
'NAME': os.path.join(EUSCAN_ROOT, 'euscan.db')
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
CACHES = {
|
CACHES = {
|
||||||
'default': {
|
'default': {
|
||||||
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
|
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
|
||||||
'LOCATION': os.path.join(os.path.dirname( __file__ ), 'euscan.cache'),
|
'LOCATION': os.path.join(EUSCAN_ROOT, 'euscan.cache'),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RRD_ROOT = os.path.join(os.path.dirname( __file__ ), 'rrd')
|
RRD_ROOT = os.path.join(EUSCAN_ROOT, 'rrd')
|
||||||
|
|
||||||
# Local time zone for this installation. Choices can be found here:
|
# Local time zone for this installation. Choices can be found here:
|
||||||
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
|
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
|
||||||
@ -77,7 +79,7 @@ USE_L10N = True
|
|||||||
|
|
||||||
# Absolute filesystem path to the directory that will hold user-uploaded files.
|
# Absolute filesystem path to the directory that will hold user-uploaded files.
|
||||||
# Example: "/home/media/media.lawrence.com/"
|
# Example: "/home/media/media.lawrence.com/"
|
||||||
MEDIA_ROOT = os.path.join(os.path.dirname( __file__ ), 'media/')
|
MEDIA_ROOT = os.path.join(EUSCAN_ROOT, 'media/')
|
||||||
|
|
||||||
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
||||||
# trailing slash if there is a path component (optional in other cases).
|
# trailing slash if there is a path component (optional in other cases).
|
||||||
@ -117,7 +119,7 @@ ROOT_URLCONF = 'euscanwww.urls'
|
|||||||
FORCE_SCRIPT_NAME=""
|
FORCE_SCRIPT_NAME=""
|
||||||
|
|
||||||
TEMPLATE_DIRS = (
|
TEMPLATE_DIRS = (
|
||||||
os.path.join(os.path.dirname( __file__ ), 'templates'),
|
os.path.join(EUSCAN_ROOT, 'templates'),
|
||||||
)
|
)
|
||||||
|
|
||||||
INSTALLED_APPS = (
|
INSTALLED_APPS = (
|
||||||
|
@ -20,7 +20,11 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="{% url euscan.views.maintainer maintainer.maintainers__id %}">
|
<a href="{% url euscan.views.maintainer maintainer.maintainers__id %}">
|
||||||
|
{% if maintainer.maintainers__name != maintainer.maintainers__email %}
|
||||||
|
{{ maintainer.maintainers__name }} <{{ maintainer.maintainers__email }}>
|
||||||
|
{% else %}
|
||||||
{{ maintainer.maintainers__name }}
|
{{ maintainer.maintainers__name }}
|
||||||
|
{% endif %}
|
||||||
</a>
|
</a>
|
||||||
{% package_bar maintainer %}
|
{% package_bar maintainer %}
|
||||||
</td>
|
</td>
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
from euscan.handlers import generic
|
from euscan.handlers import generic, php, pypi, rubygem, kde
|
||||||
from euscan.handlers import php
|
|
||||||
from euscan.handlers import pypi
|
|
||||||
from euscan.handlers import rubygem
|
|
||||||
|
|
||||||
handlers = [ php, pypi, rubygem, generic ]
|
handlers = [ kde, php, pypi, rubygem, generic ]
|
||||||
|
|
||||||
def find_best_handler(cpv, url):
|
def find_best_handler(cpv, url):
|
||||||
for handler in handlers:
|
for handler in handlers:
|
||||||
|
@ -6,8 +6,9 @@ from BeautifulSoup import BeautifulSoup
|
|||||||
|
|
||||||
import portage
|
import portage
|
||||||
|
|
||||||
from euscan import CONFIG, SCANDIR_BLACKLIST_URLS, BRUTEFORCE_BLACKLIST_PACKAGES, BRUTEFORCE_BLACKLIST_URLS, output
|
from euscan import CONFIG, SCANDIR_BLACKLIST_URLS, BRUTEFORCE_BLACKLIST_PACKAGES, BRUTEFORCE_BLACKLIST_URLS
|
||||||
from euscan import helpers
|
from euscan import helpers
|
||||||
|
import euscan
|
||||||
|
|
||||||
def scan_html(data, url, pattern):
|
def scan_html(data, url, pattern):
|
||||||
soup = BeautifulSoup(data)
|
soup = BeautifulSoup(data)
|
||||||
@ -17,6 +18,7 @@ def scan_html(data, url, pattern):
|
|||||||
href = link.get("href")
|
href = link.get("href")
|
||||||
if not href:
|
if not href:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if href.startswith(url):
|
if href.startswith(url):
|
||||||
href = href.replace(url, "", 1)
|
href = href.replace(url, "", 1)
|
||||||
|
|
||||||
@ -48,7 +50,7 @@ def scan_directory_recursive(cpv, url, steps):
|
|||||||
|
|
||||||
steps = steps[1:]
|
steps = steps[1:]
|
||||||
|
|
||||||
output.einfo("Scanning: %s" % url)
|
euscan.output.einfo("Scanning: %s" % url)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
fp = helpers.urlopen(url)
|
fp = helpers.urlopen(url)
|
||||||
@ -91,20 +93,22 @@ def scan_directory_recursive(cpv, url, steps):
|
|||||||
def scan(cpv, url):
|
def scan(cpv, url):
|
||||||
for bu in SCANDIR_BLACKLIST_URLS:
|
for bu in SCANDIR_BLACKLIST_URLS:
|
||||||
if re.match(bu, url):
|
if re.match(bu, url):
|
||||||
output.einfo("%s is blacklisted by rule %s" % (url, bu))
|
euscan.output.einfo("%s is blacklisted by rule %s" % (url, bu))
|
||||||
return []
|
return []
|
||||||
|
|
||||||
resolved_url = helpers.parse_mirror(url)
|
resolved_url = helpers.parse_mirror(url)
|
||||||
|
if not resolved_url:
|
||||||
|
return []
|
||||||
|
|
||||||
cp, ver, rev = portage.pkgsplit(cpv)
|
cp, ver, rev = portage.pkgsplit(cpv)
|
||||||
|
|
||||||
template = helpers.template_from_url(resolved_url, ver)
|
template = helpers.template_from_url(resolved_url, ver)
|
||||||
if '${' not in template:
|
if '${' not in template:
|
||||||
output.einfo("Url doesn't seems to depend on version: %s not found in %s"
|
euscan.output.einfo("Url doesn't seems to depend on version: %s not found in %s"
|
||||||
% (ver, resolved_url))
|
% (ver, resolved_url))
|
||||||
return []
|
return []
|
||||||
else:
|
else:
|
||||||
output.einfo("Scanning: %s" % template)
|
euscan.output.einfo("Scanning: %s" % template)
|
||||||
|
|
||||||
steps = helpers.generate_scan_paths(template)
|
steps = helpers.generate_scan_paths(template)
|
||||||
return scan_directory_recursive(cpv, "", steps)
|
return scan_directory_recursive(cpv, "", steps)
|
||||||
@ -113,18 +117,20 @@ def brute_force(cpv, url):
|
|||||||
cp, ver, rev = portage.pkgsplit(cpv)
|
cp, ver, rev = portage.pkgsplit(cpv)
|
||||||
|
|
||||||
url = helpers.parse_mirror(url)
|
url = helpers.parse_mirror(url)
|
||||||
|
if not url:
|
||||||
|
return []
|
||||||
|
|
||||||
for bp in BRUTEFORCE_BLACKLIST_PACKAGES:
|
for bp in BRUTEFORCE_BLACKLIST_PACKAGES:
|
||||||
if re.match(bp, cp):
|
if re.match(bp, cp):
|
||||||
output.einfo("%s is blacklisted by rule %s" % (cp, bp))
|
euscan.output.einfo("%s is blacklisted by rule %s" % (cp, bp))
|
||||||
return []
|
return []
|
||||||
|
|
||||||
for bp in BRUTEFORCE_BLACKLIST_URLS:
|
for bp in BRUTEFORCE_BLACKLIST_URLS:
|
||||||
if re.match(bp, url):
|
if re.match(bp, url):
|
||||||
output.einfo("%s is blacklisted by rule %s" % (cp, bp))
|
euscan.output.einfo("%s is blacklisted by rule %s" % (cp, bp))
|
||||||
return []
|
return []
|
||||||
|
|
||||||
output.einfo("Generating version from " + ver)
|
euscan.output.einfo("Generating version from " + ver)
|
||||||
|
|
||||||
components = helpers.split_version(ver)
|
components = helpers.split_version(ver)
|
||||||
versions = helpers.gen_versions(components, CONFIG["brute-force"])
|
versions = helpers.gen_versions(components, CONFIG["brute-force"])
|
||||||
@ -135,17 +141,17 @@ def brute_force(cpv, url):
|
|||||||
versions.remove(v)
|
versions.remove(v)
|
||||||
|
|
||||||
if not versions:
|
if not versions:
|
||||||
output.einfo("Can't generate new versions from " + ver)
|
euscan.output.einfo("Can't generate new versions from " + ver)
|
||||||
return []
|
return []
|
||||||
|
|
||||||
template = helpers.template_from_url(url, ver)
|
template = helpers.template_from_url(url, ver)
|
||||||
|
|
||||||
if '${PV}' not in template:
|
if '${PV}' not in template:
|
||||||
output.einfo("Url doesn't seems to depend on full version: %s not found in %s"
|
euscan.output.einfo("Url doesn't seems to depend on full version: %s not found in %s"
|
||||||
% (ver, url))
|
% (ver, url))
|
||||||
return []
|
return []
|
||||||
else:
|
else:
|
||||||
output.einfo("Brute forcing: %s" % template)
|
euscan.output.einfo("Brute forcing: %s" % template)
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
@ -173,7 +179,7 @@ def brute_force(cpv, url):
|
|||||||
result.append([url, version])
|
result.append([url, version])
|
||||||
|
|
||||||
if len(result) > CONFIG['brute-force-false-watermark']:
|
if len(result) > CONFIG['brute-force-false-watermark']:
|
||||||
output.einfo("Broken server detected ! Skipping brute force.")
|
euscan.output.einfo("Broken server detected ! Skipping brute force.")
|
||||||
return []
|
return []
|
||||||
|
|
||||||
if CONFIG["brute-force-recursive"]:
|
if CONFIG["brute-force-recursive"]:
|
||||||
|
34
pym/euscan/handlers/kde.py
Normal file
34
pym/euscan/handlers/kde.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
from euscan.handlers import generic
|
||||||
|
|
||||||
|
def can_handle(cpv, url):
|
||||||
|
if url.startswith('mirror://kde/'):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def clean_results(results):
|
||||||
|
ret = []
|
||||||
|
|
||||||
|
for path, version in results:
|
||||||
|
if version == '5SUMS':
|
||||||
|
continue
|
||||||
|
ret.append((path, version))
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def scan(cpv, url):
|
||||||
|
results = generic.scan(cpv, url)
|
||||||
|
|
||||||
|
if url.startswith('mirror://kde/unstable/'):
|
||||||
|
url = url.replace('mirror://kde/unstable/', 'mirror://kde/stable/')
|
||||||
|
results += generic.scan(cpv, url)
|
||||||
|
|
||||||
|
return clean_results(results)
|
||||||
|
|
||||||
|
def brute_force(cpv, url):
|
||||||
|
results = generic.brute_force(cpv, url)
|
||||||
|
|
||||||
|
if url.startswith('mirror://kde/unstable/'):
|
||||||
|
url = url.replace('mirror://kde/unstable/', 'mirror://kde/stable/')
|
||||||
|
results += generic.brute_force(cpv, url)
|
||||||
|
|
||||||
|
return clean_results(results)
|
@ -3,7 +3,8 @@ import portage
|
|||||||
import urllib2
|
import urllib2
|
||||||
import xml.dom.minidom
|
import xml.dom.minidom
|
||||||
|
|
||||||
from euscan import helpers, output
|
from euscan import helpers
|
||||||
|
import euscan
|
||||||
|
|
||||||
def can_handle(cpv, url):
|
def can_handle(cpv, url):
|
||||||
if url.startswith('http://pear.php.net/get/'):
|
if url.startswith('http://pear.php.net/get/'):
|
||||||
@ -29,7 +30,7 @@ def scan(cpv, url):
|
|||||||
orig_url = url
|
orig_url = url
|
||||||
url = 'http://%s/rest/r/%s/allreleases.xml' % (channel, pkg.lower())
|
url = 'http://%s/rest/r/%s/allreleases.xml' % (channel, pkg.lower())
|
||||||
|
|
||||||
output.einfo("Using: " + url)
|
euscan.output.einfo("Using: " + url)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
fp = helpers.urlopen(url)
|
fp = helpers.urlopen(url)
|
||||||
|
@ -4,7 +4,8 @@ import re
|
|||||||
|
|
||||||
import portage
|
import portage
|
||||||
|
|
||||||
from euscan import helpers, output
|
from euscan import helpers
|
||||||
|
import euscan
|
||||||
|
|
||||||
def can_handle(cpv, url):
|
def can_handle(cpv, url):
|
||||||
return url.startswith('mirror://pypi/')
|
return url.startswith('mirror://pypi/')
|
||||||
@ -24,7 +25,7 @@ def scan(cpv, url):
|
|||||||
|
|
||||||
package = guess_package(cpv, url)
|
package = guess_package(cpv, url)
|
||||||
|
|
||||||
output.einfo("Using PyPi XMLRPC: " + package)
|
euscan.output.einfo("Using PyPi XMLRPC: " + package)
|
||||||
|
|
||||||
client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
|
client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
|
||||||
versions = client.package_releases(package)
|
versions = client.package_releases(package)
|
||||||
|
@ -3,7 +3,8 @@ import portage
|
|||||||
import json
|
import json
|
||||||
import urllib2
|
import urllib2
|
||||||
|
|
||||||
from euscan import helpers, output
|
from euscan import helpers
|
||||||
|
import euscan
|
||||||
|
|
||||||
def can_handle(cpv, url):
|
def can_handle(cpv, url):
|
||||||
return url.startswith('mirror://rubygems/')
|
return url.startswith('mirror://rubygems/')
|
||||||
@ -24,7 +25,7 @@ def scan(cpv, url):
|
|||||||
gem = guess_gem(cpv, url)
|
gem = guess_gem(cpv, url)
|
||||||
url = 'http://rubygems.org/api/v1/versions/%s.json' % gem
|
url = 'http://rubygems.org/api/v1/versions/%s.json' % gem
|
||||||
|
|
||||||
output.einfo("Using: " + url)
|
euscan.output.einfo("Using: " + url)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
fp = helpers.urlopen(url)
|
fp = helpers.urlopen(url)
|
||||||
|
@ -15,7 +15,8 @@ except ImportError:
|
|||||||
import portage
|
import portage
|
||||||
from portage import dep
|
from portage import dep
|
||||||
|
|
||||||
from euscan import CONFIG, BLACKLIST_VERSIONS, ROBOTS_TXT_BLACKLIST_DOMAINS, output
|
from euscan import CONFIG, BLACKLIST_VERSIONS, ROBOTS_TXT_BLACKLIST_DOMAINS
|
||||||
|
import euscan
|
||||||
|
|
||||||
def htop_vercmp(a, b):
|
def htop_vercmp(a, b):
|
||||||
def fixver(v):
|
def fixver(v):
|
||||||
@ -87,7 +88,7 @@ def version_blacklisted(cp, version):
|
|||||||
None
|
None
|
||||||
|
|
||||||
if rule:
|
if rule:
|
||||||
output.einfo("%s is blacklisted by rule %s" % (cpv, bv))
|
euscan.output.einfo("%s is blacklisted by rule %s" % (cpv, bv))
|
||||||
return rule is not None
|
return rule is not None
|
||||||
|
|
||||||
def version_filtered(cp, base, version):
|
def version_filtered(cp, base, version):
|
||||||
@ -254,7 +255,7 @@ def urlallowed(url):
|
|||||||
|
|
||||||
def urlopen(url, timeout=None, verb="GET"):
|
def urlopen(url, timeout=None, verb="GET"):
|
||||||
if not urlallowed(url):
|
if not urlallowed(url):
|
||||||
output.einfo("Url '%s' blocked by robots.txt" % url)
|
euscan.output.einfo("Url '%s' blocked by robots.txt" % url)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if not timeout:
|
if not timeout:
|
||||||
@ -287,17 +288,17 @@ def tryurl(fileurl, template):
|
|||||||
result = True
|
result = True
|
||||||
|
|
||||||
if not urlallowed(fileurl):
|
if not urlallowed(fileurl):
|
||||||
output.einfo("Url '%s' blocked by robots.txt" % fileurl)
|
euscan.output.einfo("Url '%s' blocked by robots.txt" % fileurl)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
output.ebegin("Trying: " + fileurl)
|
euscan.output.ebegin("Trying: " + fileurl)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
basename = os.path.basename(fileurl)
|
basename = os.path.basename(fileurl)
|
||||||
|
|
||||||
fp = urlopen(fileurl, verb='HEAD')
|
fp = urlopen(fileurl, verb='HEAD')
|
||||||
if not fp:
|
if not fp:
|
||||||
output.eend(errno.EPERM)
|
euscan.output.eend(errno.EPERM)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
headers = fp.info()
|
headers = fp.info()
|
||||||
@ -328,21 +329,31 @@ def tryurl(fileurl, template):
|
|||||||
except IOError:
|
except IOError:
|
||||||
result = None
|
result = None
|
||||||
|
|
||||||
output.eend(errno.ENOENT if not result else 0)
|
euscan.output.eend(errno.ENOENT if not result else 0)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def regex_from_template(template):
|
def regex_from_template(template):
|
||||||
|
# Escape
|
||||||
template = re.escape(template)
|
template = re.escape(template)
|
||||||
|
|
||||||
|
# Unescape specific stuff
|
||||||
template = template.replace('\$\{', '${')
|
template = template.replace('\$\{', '${')
|
||||||
template = template.replace('\}', '}')
|
template = template.replace('\}', '}')
|
||||||
template = template.replace('}\.$', '}.$')
|
template = template.replace('}\.$', '}.$')
|
||||||
template = template.replace('${1}', r'([\d]+?)')
|
|
||||||
template = re.sub(r'(\$\{\d+\}\.?)+', r'([\w]+?)', template)
|
# Replace ${\d+}
|
||||||
|
#template = template.replace('${0}', r'([\d]+?)')
|
||||||
|
template = re.sub(r'(\$\{\d+\}(\.?))+', r'([\w\.]+?)', template)
|
||||||
|
|
||||||
#template = re.sub(r'(\$\{\d+\}\.?)+', r'([\w]+?)', template)
|
#template = re.sub(r'(\$\{\d+\}\.?)+', r'([\w]+?)', template)
|
||||||
#template = re.sub(r'(\$\{\d+\}\.+)+', '(.+?)\.', template)
|
#template = re.sub(r'(\$\{\d+\}\.+)+', '(.+?)\.', template)
|
||||||
#template = re.sub(r'(\$\{\d+\})+', '(.+?)', template)
|
#template = re.sub(r'(\$\{\d+\})+', '(.+?)', template)
|
||||||
|
|
||||||
|
# Full version
|
||||||
template = template.replace('${PV}', _v)
|
template = template.replace('${PV}', _v)
|
||||||
|
|
||||||
|
# End
|
||||||
template = template + r'/?$'
|
template = template + r'/?$'
|
||||||
return template
|
return template
|
||||||
|
|
||||||
@ -371,6 +382,7 @@ def generate_scan_paths(url):
|
|||||||
else:
|
else:
|
||||||
path += "/"
|
path += "/"
|
||||||
path += chunk
|
path += chunk
|
||||||
|
|
||||||
return steps
|
return steps
|
||||||
|
|
||||||
def parse_mirror(uri):
|
def parse_mirror(uri):
|
||||||
@ -383,8 +395,8 @@ def parse_mirror(uri):
|
|||||||
|
|
||||||
eidx = uri.find("/", 9)
|
eidx = uri.find("/", 9)
|
||||||
if eidx == -1:
|
if eidx == -1:
|
||||||
output.einfo("Invalid mirror definition in SRC_URI:\n")
|
euscan.output.einfo("Invalid mirror definition in SRC_URI:\n")
|
||||||
output.einfo(" %s\n" % (uri))
|
euscan.output.einfo(" %s\n" % (uri))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
mirrorname = uri[9:eidx]
|
mirrorname = uri[9:eidx]
|
||||||
@ -395,7 +407,7 @@ def parse_mirror(uri):
|
|||||||
shuffle(mirrors)
|
shuffle(mirrors)
|
||||||
uri = mirrors[0].strip("/") + "/" + path
|
uri = mirrors[0].strip("/") + "/" + path
|
||||||
else:
|
else:
|
||||||
output.einfo("No known mirror by the name: %s\n" % (mirrorname))
|
euscan.output.einfo("No known mirror by the name: %s" % (mirrorname))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return uri
|
return uri
|
||||||
|
@ -11,10 +11,12 @@ from gentoolkit import errors
|
|||||||
from gentoolkit.query import Query
|
from gentoolkit.query import Query
|
||||||
from gentoolkit.eclean.search import (port_settings)
|
from gentoolkit.eclean.search import (port_settings)
|
||||||
|
|
||||||
from euscan import CONFIG, BLACKLIST_PACKAGES, output
|
from euscan import CONFIG, BLACKLIST_PACKAGES
|
||||||
from euscan import handlers
|
from euscan import handlers
|
||||||
from euscan import helpers
|
from euscan import helpers
|
||||||
|
|
||||||
|
import euscan
|
||||||
|
|
||||||
def filter_versions(cp, versions):
|
def filter_versions(cp, versions):
|
||||||
filtered = {}
|
filtered = {}
|
||||||
|
|
||||||
@ -31,18 +33,19 @@ def filter_versions(cp, versions):
|
|||||||
|
|
||||||
filtered[version] = url
|
filtered[version] = url
|
||||||
|
|
||||||
return [ (filtered[version], version) for version in filtered ]
|
return [ (cp, filtered[version], version) for version in filtered ]
|
||||||
|
|
||||||
def scan_upstream_urls(cpv, urls):
|
def scan_upstream_urls(cpv, urls):
|
||||||
versions = []
|
versions = []
|
||||||
|
|
||||||
for filename in urls:
|
for filename in urls:
|
||||||
for url in urls[filename]:
|
for url in urls[filename]:
|
||||||
|
if not CONFIG['quiet']:
|
||||||
pp.uprint()
|
pp.uprint()
|
||||||
output.einfo("SRC_URI is '%s'" % url)
|
euscan.output.einfo("SRC_URI is '%s'" % url)
|
||||||
|
|
||||||
if '://' not in url:
|
if '://' not in url:
|
||||||
output.einfo("Invalid url '%s'" % url)
|
euscan.output.einfo("Invalid url '%s'" % url)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
''' Try normal scan '''
|
''' Try normal scan '''
|
||||||
@ -80,13 +83,15 @@ def scan_upstream(query):
|
|||||||
pkg = matches.pop()
|
pkg = matches.pop()
|
||||||
|
|
||||||
if not pkg:
|
if not pkg:
|
||||||
sys.stderr.write(pp.warn("Package '%s' only have a dev version (9999)" % pp.pkgquery(pkg.cp)))
|
sys.stderr.write(pp.warn("Package '%s' only have a dev version (9999)"
|
||||||
|
% pp.pkgquery(pkg.cp)))
|
||||||
return []
|
return []
|
||||||
|
|
||||||
if pkg.cp in BLACKLIST_PACKAGES:
|
if pkg.cp in BLACKLIST_PACKAGES:
|
||||||
sys.stderr.write(pp.warn("Package '%s' is blacklisted" % pp.pkgquery(pkg.cp)))
|
sys.stderr.write(pp.warn("Package '%s' is blacklisted" % pp.pkgquery(pkg.cp)))
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
if not CONFIG['quiet']:
|
||||||
pp.uprint(" * %s [%s]" % (pp.cpv(pkg.cpv), pp.section(pkg.repo_name())))
|
pp.uprint(" * %s [%s]" % (pp.cpv(pkg.cpv), pp.section(pkg.repo_name())))
|
||||||
pp.uprint()
|
pp.uprint()
|
||||||
|
|
||||||
|
7
setup.py
7
setup.py
@ -21,7 +21,7 @@ cwd = os.getcwd()
|
|||||||
try:
|
try:
|
||||||
from portage.const import EPREFIX
|
from portage.const import EPREFIX
|
||||||
except ImportError:
|
except ImportError:
|
||||||
EPREFIX='/'
|
EPREFIX=''
|
||||||
|
|
||||||
# Python files that need `__version__ = ""` subbed, relative to this dir:
|
# Python files that need `__version__ = ""` subbed, relative to this dir:
|
||||||
python_scripts = [os.path.join(cwd, path) for path in (
|
python_scripts = [os.path.join(cwd, path) for path in (
|
||||||
@ -72,15 +72,16 @@ core.setup(
|
|||||||
maintainer='Corentin Chary',
|
maintainer='Corentin Chary',
|
||||||
maintainer_email='corentin.chary@gmail.com',
|
maintainer_email='corentin.chary@gmail.com',
|
||||||
url='http://euscan.iksaif.net',
|
url='http://euscan.iksaif.net',
|
||||||
download_url='http://git.iksaif.net/?p=euscan.git;a=snapshot;h=HEAD;sf=tgz',
|
download_url='https://github.com/iksaif/euscan/tarball/' + ('master' if __version__ == '9999' else ('euscan-%s' % __version__)),
|
||||||
package_dir={'': 'pym'},
|
package_dir={'': 'pym'},
|
||||||
packages=packages,
|
packages=packages,
|
||||||
package_data = {},
|
package_data = {},
|
||||||
scripts=python_scripts,
|
scripts=python_scripts,
|
||||||
data_files=(
|
data_files=(
|
||||||
(os.path.join(EPREFIX, 'usr/share/man/man1'), glob('man/*')),
|
(os.path.join(os.sep, EPREFIX.lstrip(os.sep), 'usr/share/man/man1'), glob('man/*')),
|
||||||
),
|
),
|
||||||
cmdclass={
|
cmdclass={
|
||||||
'set_version': set_version,
|
'set_version': set_version,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user