3
# Copyright 2009 Canonical Ltd. This software is licensed under the
4
# GNU Affero General Public License version 3 (see the file LICENSE).
11
from zope.component import getUtility
13
from canonical.lp import initZopeless
14
from canonical.launchpad.database.product import Product
15
from canonical.launchpad.scripts import execute_zcml_for_scripts
16
from canonical.launchpad.interfaces.product import (
17
valid_sourceforge_project_name)
18
from canonical.launchpad.webapp.interfaces import (
19
IStoreSelector, MAIN_STORE, MASTER_FLAVOR)
22
re_find_project_names = [
23
re.compile(r'(?:sou?rcefor..|sf)[.]net/projects?/([^/]+)'),
24
re.compile(r'([a-zA-Z0-9-]+)[.](?:sou?rceforge|sf)[.]net'),
28
def extract_project_name(project_name):
29
# Remove whitespace and slashes.
30
project_name = project_name.strip().strip('/')
31
if valid_sourceforge_project_name(project_name):
34
# Try to pattern match.
35
for regex in re_find_project_names:
36
match = regex.search(project_name)
38
if valid_sourceforge_project_name(match.group(1)):
46
execute_zcml_for_scripts()
48
store = getUtility(IStoreSelector).get(MAIN_STORE, MASTER_FLAVOR)
50
# Get all products with a sourceforgeproject.
51
products = store.find(Product,
52
Product.sourceforgeproject != None,
53
Product.sourceforgeproject != '')
55
for product in products:
56
if not valid_sourceforge_project_name(product.sourceforgeproject):
57
extracted_project_name = (
58
extract_project_name(product.sourceforgeproject))
60
product.sourceforgeproject, extracted_project_name)
61
product.sourceforgeproject = extracted_project_name
66
if __name__ == '__main__':
67
sys.exit(main(sys.argv))