Introduces graph solver program
[lcapit-junk-code.git] / klinus-series
blob5afa57a2e57c1f43d30fb86b36a56f37ab2b277f
1 #!/usr/bin/python
3 # Import a quilt tree into a kernel-linus package
5 # TODO:
6 # - Better spec parsing
7 # - Add directory contents sanity checks
9 # Luiz Fernando N. Capitulino
10 # <lcapitulino@mandriva.com.br>
12 import sys, os
13 from shutil import copy
14 from tempfile import NamedTemporaryFile
16 class SeriesFile():
17 def list(self):
18 for line in self.patches:
19 print line
21 def consistence(self):
22 for file in self.patches:
23 file = self.series_dir + file
24 if os.access(file, os.R_OK) is False:
25 return False
26 return True
28 def read(self):
29 series = open(self.series_file)
30 contents = series.readlines()
31 series.close()
33 for line in contents:
34 line = line.lstrip()
35 if len(line) == 0 or line[0] == '#':
36 continue
37 line = line.rstrip('# \n')
38 self.patches.append(line)
40 def __init__(self, dir_path):
41 self.series_dir = dir_path
42 self.series_file = dir_path + 'series'
43 self.patches = []
45 class KernelRpm():
46 def __list_patches(self, file, patches):
47 file.write('\n# Patch listing created by klinus-series\n')
48 count = self.icount
49 for line in patches:
50 file.write('Patch%d: %s\n' % (count, line))
51 count += 1
53 def __apply_patches(self, file, first, last):
54 file.write('\n# Apply patches by klinus-series\n')
55 for i in range(first, last):
56 file.write('%%patch%d -p1\n' % i)
58 def copy_patches(self, patches_dir, patches):
59 for file in patches:
60 src = patches_dir + '/' + file
61 copy(src, self.sources_dir)
63 def spec_add_patches(self, patches):
64 spec = open(self.spec_file)
65 contents = spec.readlines()
66 spec.close()
68 new_spec = NamedTemporaryFile('w')
70 endif = 0
71 done_list = done_apply = False
72 for line in contents:
73 if line == '%endif\n':
74 endif += 1
76 new_spec.write(line)
78 if not done_list and endif == self.list_mark:
79 self.__list_patches(new_spec, patches)
80 done_list = True
82 if not done_apply and endif == self.apply_mark:
83 last = self.icount + len(patches)
84 self.__apply_patches(new_spec, self.icount, last)
85 done_apply = True
87 new_spec.flush()
88 copy(new_spec.name, self.spec_file)
89 new_spec.close()
91 def __get_configs(self):
92 configs = []
93 for file in os.listdir(self.sources_dir):
94 if file.find('.config') != -1:
95 configs.append(os.path.basename(file))
96 return configs
98 def __get_arch(self, name):
99 index = name.find('-')
100 if index == -1:
101 index = name.find('.')
102 return name[:index]
104 def update_configs(self):
105 configs = self.__get_configs()
107 cur_dir = os.getcwd()
108 os.chdir(self.rpm_dir)
109 ret = os.system('bm -lp')
110 if ret != 0:
111 print 'ERROR: bm failed'
112 return
114 os.chdir('BUILD/kernel-linus-i386/linux-2.6.24')
115 for file in configs:
116 base = '../../../SOURCES/'
117 arch = self.__get_arch(file)
118 copy(base + file, '.config')
119 ret = os.system('make -j16 oldconfig ARCH=' + arch)
120 if ret != 0:
121 print 'ERROR: failed oldconfig for ' + file
122 continue
123 copy('.config', base + file)
125 os.chdir(cur_dir)
127 def __init__(self, dir_path):
128 self.rpm_dir = dir_path
129 self.spec_file = dir_path + '/SPECS/kernel-linus.spec'
130 self.sources_dir = dir_path + '/SOURCES/'
131 self.icount = 100
132 self.list_mark = 8
133 self.apply_mark = 23
135 def usage():
136 print 'usage: klinus-series < series-dir > < rpm-dir >'
138 def main():
139 if len(sys.argv) != 3:
140 usage()
141 sys.exit(1)
143 if sys.argv[1] == '-h' or sys.argv[1] == '--help':
144 usage()
145 sys.exit(0)
147 series_dir = sys.argv[1]
148 rpm_dir = sys.argv[2]
150 series = SeriesFile(series_dir)
151 series.read()
152 if series.consistence() is False:
153 print 'ERROR: series file is not consistent'
154 sys.exit(1)
156 kernel = KernelRpm(rpm_dir)
157 kernel.spec_add_patches(series.patches)
158 kernel.copy_patches(series_dir, series.patches)
159 kernel.update_configs()
161 if __name__ == "__main__":
162 main()