mysql FTS
[ebuildfind.git] / commands / parse.py
blob4a61dc1ab5c2116da952c489902798c947d15a5a
1 from __future__ import with_statement
3 import os, re
5 from django.conf import settings
7 os.environ['DJANGO_SETTINGS_MODULE'] = 'ebuilds.settings'
9 from layman.debug import Message
11 from ebuilds.ebuildfind.models import Ebuild, Overlay
13 from manage_layman import LaymanManager
15 OVERLAYS_BASE = settings.ROOT_PATH + "ebuilds/" + "ebuildfind/commands/var/overlays/"
17 class EbuildParser:
18 def __init__(self, overlay, category, app, file_path):
19 path, filename = os.path.split(os.path.realpath(file_path))
21 name_version, ext = os.path.splitext(filename)
22 n = len(app)
24 version = name_version[n+1:]
26 self.name = app
27 self.version = version
28 self.category = category
29 self.overlay = overlay
31 with open(file_path) as file:
32 f = file.read()
33 regex1 = re.compile(r'([a-z_]+\s*\(\))\s*{.*}', re.DOTALL)
34 f = re.sub(regex1, r'', f)
35 regex2 = re.compile(r'(for.*done)', re.DOTALL)
36 f = re.sub(regex2, r'', f)
37 data = dict(re.findall("(DESCRIPTION|HOMEPAGE|KEYWORDS|LICENSE|IUSE)=\"(.+)\"", f))
39 def notnull(d, key):
40 try:
41 return d[key]
42 except:
43 return ""
45 self.description = notnull(data, "DESCRIPTION")
46 self.description = self.description.replace("\n"," ")
47 self.homepage = notnull(data, "HOMEPAGE")
48 self.keywords = notnull(data, "KEYWORDS")
49 self.license = notnull(data, "LICENSE")
50 self.iuse = notnull(data, "IUSE")
52 def __repr__(self):
53 output = "%s/%s [%s] @ %s" % (self.category, self.name, self.version, self.overlay)
54 output += " " + self.description
55 output += " " + self.homepage
56 output += " " + self.keywords
57 output += " " + self.license
58 output += " " + self.iuse
59 return output
61 def exclude_directory(path, dir):
62 exclude_dir = ["eclass", "profiles", "README-TODO", "Documentation", "sets", "index"]
63 return os.path.isdir(path) and dir not in exclude_dir and not dir.startswith(".")
65 def ParseEbuilds():
66 i = 0
67 Ebuild.objects.all().delete()
68 overlays = os.listdir(OVERLAYS_BASE)
70 for overlay in overlays:
71 path_overlay = os.path.join(OVERLAYS_BASE, overlay)
73 if exclude_directory(path_overlay, overlay):
74 overlay_name = overlay
75 print "is present", overlay_name
77 overlay = Overlay.objects.get(name=overlay)
79 categories = os.listdir(path_overlay)
81 for category in categories:
82 path_overlay_category = os.path.join(path_overlay, category)
84 if exclude_directory(path_overlay_category, category):
85 apps = os.listdir(path_overlay_category)
86 for app in apps:
87 path_overlay_category_app = os.path.join(path_overlay_category, app)
88 if exclude_directory(path_overlay_category_app, app):
89 ebuilds = os.listdir(path_overlay_category_app)
91 for ebuild in ebuilds:
92 if ebuild.endswith(".ebuild"):
93 if exclude_directory(path_overlay_category_app, ebuild):
95 path_ebuild = os.path.join(path_overlay_category_app, ebuild)
97 e = EbuildParser(overlay_name, category, app, path_ebuild)
100 ebuild = Ebuild()
101 ebuild.name = unicode(e.name)
102 ebuild.category = unicode(e.category)
103 ebuild.version = unicode(e.version)
104 ebuild.description = unicode(e.description, errors="replace")
105 ebuild.keywords = unicode(e.keywords)
106 ebuild.license = unicode(e.license)
107 ebuild.iuse = unicode(e.iuse)
108 ebuild.homepage = unicode(e.homepage)
109 ebuild.overlay = overlay
110 ebuild.save()
112 ebuild.index()
114 def ParseOverlays():
115 h = LaymanManager()
116 overlays = h.List()
118 for name, overlay in overlays.items():
119 """ check if new overlay is ready """
120 o = Overlay.objects.all().filter(name=name)
121 print "add ? > ", name
122 if not o:
123 print "added !", name
124 o = Overlay()
125 o.name = name
126 o.description = overlay["description"]
127 o.link = overlay["link"]
128 o.save()
130 def main():
131 print "# >>> Parse Overlays"
132 ParseOverlays()
133 print "# >>> Parse Ebuilds"
134 ParseEbuilds()
136 if __name__ == "__main__":
137 main()