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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
#!/usr/bin/python -S
#
# Copyright 2009 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
# pylint: disable-msg=W0403
import _pythonpath
import sys
import re
from optparse import OptionParser
from canonical.lp import initZopeless
from canonical.launchpad.database import BinaryPackageName
class BaseNameList:
"""Base for Packages name list"""
def __init__(self, filename):
self.filename = filename
self.list = []
self._buildlist()
self.list.sort()
def _buildlist(self):
try:
f = open(self.filename)
except IOError:
print 'file %s not found. Exiting...' % self.filename
sys.exit(1)
for line in f:
line = self._check_format(line.strip())
if line:
if not self._valid_name(line):
print ' - Invalid package name: %s' % line
continue
self.list.append(line)
def _check_format(self, name):
assert isinstance(name, basestring), repr(name)
try:
# check that this is unicode data
name.decode("utf-8").encode("utf-8")
return name
except UnicodeError:
# check that this is latin-1 data
s = name.decode("latin-1").encode("utf-8")
s.decode("utf-8")
return s
def _valid_name(self, name):
pat = r"^[a-z0-9][a-z0-9\\+\\.\\-]+$"
if re.match(pat, name):
return True
class SourcePackageNameList(BaseNameList):
"""Build a sourcepackagename list from a given file"""
class BinaryPackageNameList(BaseNameList):
"""Build a binarypackagename list from a given file"""
class Counter:
def __init__(self, interval):
self._count = 0
self.interval = interval
if not interval:
setattr(self, 'step', self._fake_step)
else:
setattr(self, 'step', self._step)
def _step(self):
self._count += 1
if self._count > self.interval:
self.reset()
return True
def _fake_step(self):
return
def reset(self):
self._count = 0
class ProcessNames:
def __init__(self, source_list, binary_list, commit_interval=0):
self.source_list = source_list
self.binary_list = binary_list
self.ztm = initZopeless()
self.interval = commit_interval
self.count = Counter(commit_interval)
def commit(self):
print '\t\t@ Commiting...'
self.ztm.commit()
def processSource(self):
from lp.registry.model.sourcepackagename import SourcePackageName
if not self.source_list:
return
spnl = SourcePackageNameList(self.source_list).list
for name in spnl:
print '\t@ Evaluationg SourcePackageName %s' % name
SourcePackageName.ensure(name)
if self.count.step():
self.commit()
if self.interval:
self.commit()
self.count.reset()
def processBinary(self):
if not self.binary_list:
return
bpnl = BinaryPackageNameList(self.binary_list).list
for name in bpnl:
print '\t@ Evaluationg BinaryPackageName %s' % name
BinaryPackageName.ensure(name)
if self.count.step():
self.commit()
if self.interval:
self.commit()
self.count.reset()
if __name__ == '__main__':
parser = OptionParser()
parser.add_option(
"-s", "--source-file", dest="source_file",
help="SourcePackageName list file")
parser.add_option(
"-b", "--binary-file", dest="binary_file",
help="BinaryPackageName list file")
parser.add_option(
"-c", "--commit-interval", dest="commit_interval", default=0,
help="DB commit interval. Default 0 performs not commit.")
(options, args) = parser.parse_args()
processor = ProcessNames(
options.source_file, options.binary_file,
int(options.commit_interval))
processor.processSource()
processor.processBinary()
|