source: branches/1.5/tools/sali_check @ 555

Last change on this file since 555 was 555, checked in by dennis, 7 years ago

Preparing new release new version of SALI

  • Property svn:executable set to *
File size: 8.4 KB
Line 
1#!/usr/bin/env python
2
3import os
4import sys
5import re
6import ftplib
7import datetime
8import xmlrpclib
9import getpass
10
11WIKI_URL = 'https://%s:%s@oss.trac.surfsara.nl/sali/login/xmlrpc'
12WIKI_PAGE = 'SaliUsedPrograms'
13EXCLUDE_VERSIONS = ['1.1.0','1.1.1','1.2.0','1.2.1','1.2.2','1.2.3','1.2.4','1.3.0','1.3.1','1.3.2', '1.4.0', '1.4.5', '1.4.6']
14
15### TAKEN FROM http://code.activestate.com/recipes/135435-sort-a-string-using-numeric-order
16def sorted_copy(alist):
17    # inspired by Alex Martelli
18    # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52234
19    indices = map(_generate_index, alist)
20    decorated = zip(indices, alist)
21    decorated.sort()
22    return [ item for index, item in decorated ]
23   
24def _generate_index(str):
25    """
26    Splits a string into alpha and numeric elements, which
27    is used as an index for sorting"
28    """
29    #
30    # the index is built progressively
31    # using the _append function
32    #
33    index = []
34    def _append(fragment, alist=index):
35        if fragment.isdigit(): fragment = int(fragment)
36        alist.append(fragment)
37
38    # initialize loop
39    prev_isdigit = str[0].isdigit()
40    current_fragment = ''
41    # group a string into digit and non-digit parts
42    for char in str:
43        curr_isdigit = char.isdigit()
44        if curr_isdigit == prev_isdigit:
45            current_fragment += char
46        else:
47            _append(current_fragment)
48            current_fragment = char
49            prev_isdigit = curr_isdigit
50    _append(current_fragment)   
51    return tuple(index)
52### END EXTERNAL
53
54def replace_version( value, program, version ):
55    return value.replace( '$(%s_VERSION)' % program.upper(), version )
56
57def read_maked(path):
58
59    for item in os.listdir(path):
60
61        program = None
62        version = None
63        tarball = None
64        info    = None
65
66        if item.endswith('.rul'):
67            program = item[:-4]
68
69            if program == 'xmlrpc-c':
70                program = 'xmlrpc'
71
72            if program == 'popt':
73                continue
74
75            if program == 'kernel':
76                program = 'linux'
77                regex =  r'%s_(?P<vartype>[A-Z]+)(?P<assign>[:= \t]+)(?P<value>.+)$' % program.upper()
78            else:
79                regex =  r'^%s_(?P<vartype>[A-Z]+)(?P<assign>[:= \t]+)(?P<value>.+)$' % program.upper()
80
81            fi = open(os.path.join(path,item),'r')
82            data = fi.read()
83            fi.close()
84
85            ## match: PROGRAM_VARIABLE = VALUE
86            for result in re.finditer(regex,data,re.MULTILINE):
87                if result.group('vartype').lower() == 'version':
88                    if program == 'linux':
89                        if not version:
90                            version = list()
91                        if result.group('value') not in version:
92                            version.append( result.group('value') )
93                    else:
94                        version = result.group('value')
95                elif result.group('vartype').lower() == 'tarball':
96                    tarball = result.group('value')
97                elif result.group('vartype').lower() == 'info':
98                    info = result.group('value')
99
100            yield(program,version,tarball,info)
101
102DATA = dict()
103
104def append_to_dict(path,sversion):
105
106    ## First we check the trunk
107    path = os.path.join(os.path.join(path,sversion),'initrd/make.d')
108    for program,version,tarball,info in read_maked(path):
109        if not DATA.has_key(program):
110            DATA[program] = dict()
111
112        DATA[program]['tarball'] = tarball
113        DATA[program]['info'] = info
114       
115        if not DATA[program].has_key('versions'):
116            DATA[program]['versions'] = dict()
117
118        if not DATA[program]['versions'].has_key(version):
119            DATA[program]['versions'][version] = list()
120
121        DATA[program]['versions'][version].append(sversion)
122
123def append_main_maked(ipath,sversion):
124
125    path = os.path.join(os.path.join(ipath,sversion),'make.d')
126    if not os.path.exists(path):
127        path = os.path.join(os.path.join(ipath,sversion),'kernel/make.d')
128
129    for program,version,tarball,info in read_maked(path):
130        if not DATA.has_key(program):
131            DATA[program] = dict()
132
133        DATA[program]['tarball'] = tarball
134        DATA[program]['info'] = info
135       
136        if not DATA[program].has_key('versions'):
137            DATA[program]['versions'] = dict()
138
139        if program == 'linux':
140            for lversion in version:
141                if not DATA[program]['versions'].has_key(lversion):
142                    DATA[program]['versions'][lversion] = list()
143
144                DATA[program]['versions'][lversion].append(sversion)
145        else:
146            if not DATA[program]['versions'].has_key(version):
147                DATA[program]['versions'][version] = list()
148
149            DATA[program]['versions'][version].append(sversion)
150
151def tags_or_branches(path):
152    for version in os.listdir(path):
153        if version in EXCLUDE_VERSIONS:
154            continue
155
156        if os.path.exists(os.path.join(os.path.join(path,version),'initrd/make.d')):
157            append_to_dict(path,version)
158            append_main_maked(path,version)
159
160def column(word,length,align=''):
161    pattern = '%'+align+str(length)+'s'
162    return pattern % word
163
164if __name__ == '__main__':
165
166    action = 'trac'
167    path = None
168
169    if len(sys.argv) > 1 and len(sys.argv) < 4:
170        if os.path.exists(sys.argv[1]):
171            path = sys.argv[1]
172
173        if sys.argv[2] in ['print','trac']:
174            action = sys.argv[2]
175
176    if not path:
177        print "No path valid and/or given"
178        sys.exit(1)
179           
180    tags_or_branches(os.path.join(path,'tags'))
181    tags_or_branches(os.path.join(path,'branches'))
182
183    append_to_dict(path,'trunk')
184    append_main_maked(path,'trunk')
185
186    ftp = ftplib.FTP('ftp.sara.nl')
187    ftp.login()
188    try:
189        ftp_data = ftp.nlst('pub/sali/sources')
190    except ftplib.error_perm, resp:
191        ftp_data = list()
192    ftp.close()
193
194    ftp_data = [os.path.basename(item) for item in ftp_data if not os.path.basename(item) in ['.','..']]
195
196    tarballs = list()
197    trac_data = list()
198    if action == 'trac':
199        trac_data.append( '= Packages used by SALI =' )
200
201    for key in sorted_copy(DATA.keys()):
202        if action == 'trac':
203            trac_data.append( '== %s ==' % key )
204            if DATA[key]['info']:
205                trac_data.append( 'Project webpage: [%s]' % DATA[key]['info'] )
206            trac_data.append( '||= Version =||= Used by sali: =||= Tarball =||' )
207        else:
208            print key
209
210        for version in sorted_copy(DATA[key]['versions'].keys()):
211            if action == 'trac':
212                trac_data.append( '|| %s || %s || %s ||' % ( 
213                    version, 
214                    ', '.join(sorted_copy(DATA[key]['versions'][version])),
215                    ' ftp://ftp.sara.nl/pub/sali/sources/'+replace_version(DATA[key]['tarball'],key,version)
216                ) )
217            else:
218                print column(version,16),'|','Tarbal: ftp://ftp.sara.nl/pub/sali/sources/'+replace_version(DATA[key]['tarball'],key,version)
219                print column('',16),'|','Used in sali:', ', '.join(sorted_copy(DATA[key]['versions'][version]))
220                print
221            tarballs.append(replace_version(DATA[key]['tarball'],key,version))
222
223    if action == 'trac' and trac_data:
224     
225        unix_user = getpass.getuser()
226 
227        username = raw_input('Username [%s]: ' % unix_user)
228        password = getpass.getpass('Password: ')
229
230        if not username and unix_user:
231            username = unix_user
232
233        try:
234            server = xmlrpclib.ServerProxy( WIKI_URL % ( username, password ) )
235            rslt = server.wiki.putPage( 
236                WIKI_PAGE, 
237                "\n".join( trac_data ), 
238                { 'comment': 'autoupdate %s' % str( datetime.datetime.now() ) } 
239            )
240
241            if rslt:
242                print "Data has been save on wikipage %s" % WIKI_PAGE
243            else:
244                print "A unknown error has occurred, failed to save data"
245        except xmlrpclib.ProtocolError, err:
246            print "An error has occured: %s" % err.errcode
247            print "   %s" % str( err )
248        except xmlrpclib.Fault, fault:
249            if fault.faultCode == 1:
250                print "Wikipage is already up to date"
251
252    if ftp_data and action != 'trac':
253        ftp_data = set( ftp_data )
254
255        print "Not used tarballs:"
256        for tar in sorted_copy( ftp_data.difference( set( tarballs ) ) ):
257            print ' -',tar
258        print "Note: linux and zlib excluded"
Note: See TracBrowser for help on using the repository browser.