~fahad-k/linaro-image-tools/lp1081714-support-4412-flashing

« back to all changes in this revision

Viewing changes to linaro_image_tools/hwpack/builder.py

  • Committer: fboudra at gmail
  • Date: 2012-10-04 16:56:35 UTC
  • mfrom: (570.2.4 linaro-image-tools)
  • Revision ID: fboudra@gmail.com-20121004165635-nr35vt8ppcwdejxw
Add Build-Info support.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
import tempfile
26
26
import os
27
27
import shutil
 
28
from glob import iglob
 
29
 
 
30
from debian.debfile import DebFile
28
31
 
29
32
from linaro_image_tools import cmd_runner
30
33
 
65
68
            shutil.rmtree(self.tempdir)
66
69
 
67
70
    def get_path(self, package_file_name, file_name=''):
68
 
        "Get package or file path in unpacker tmp dir."
 
71
        """Get package or file path in unpacker tmp dir."""
69
72
        package_dir = os.path.basename(package_file_name)
70
73
        return os.path.join(self.tempdir, package_dir, file_name)
71
74
 
214
217
        self.foreach_boards_and_bootloaders(
215
218
            self.do_find_copy_files_packages)
216
219
        packages = self.copy_files_packages
217
 
        del(self.copy_files_packages)
 
220
        del self.copy_files_packages
218
221
        return packages
219
222
 
220
223
    def build(self):
328
331
                        manifest_name += '.manifest.txt'
329
332
                        with open(manifest_name, 'w') as f:
330
333
                            f.write(self.hwpack.manifest_text())
 
334
 
 
335
                        logger.debug("Extracting build-info")
 
336
                        build_info_dir = os.path.join(fetcher.cache.tempdir,
 
337
                                                      'build-info')
 
338
                        build_info_available = 0
 
339
                        for deb_pkg in self.packages:
 
340
                            # Extract Build-Info attribute from debian control
 
341
                            deb_pkg_file_path = deb_pkg.filepath
 
342
                            deb_control = \
 
343
                                DebFile(deb_pkg_file_path).control.debcontrol()
 
344
                            build_info = deb_control.get('Build-Info')
 
345
                            if build_info is not None:
 
346
                                build_info_available += 1
 
347
                                # Extract debian packages with build
 
348
                                # information
 
349
                                env = os.environ
 
350
                                env['LC_ALL'] = 'C'
 
351
                                env['NO_PKG_MANGLE'] = '1'
 
352
                                proc = cmd_runner.Popen(['dpkg-deb', '-x',
 
353
                                       deb_pkg_file_path, build_info_dir],
 
354
                                       env=env, stdout=subprocess.PIPE,
 
355
                                       stderr=subprocess.PIPE)
 
356
                                (stdoutdata, stderrdata) = proc.communicate()
 
357
                                if proc.returncode:
 
358
                                    raise ValueError('dpkg-deb extract failed!'
 
359
                                        '\n%s' % stderrdata)
 
360
                                if stderrdata:
 
361
                                    raise ValueError('dpkg-deb extract had '
 
362
                                        'warnings:\n%s' % stderrdata)
 
363
 
 
364
                        # Concatenate BUILD-INFO.txt files
 
365
                        if build_info_available > 0:
 
366
                            dst_file = open('BUILD-INFO.txt', 'wb')
 
367
                            build_info_path = \
 
368
                                r'%s/usr/share/doc/*/BUILD-INFO.txt' % \
 
369
                                build_info_dir
 
370
                            for src_file in iglob(build_info_path):
 
371
                                with open(src_file, 'rb') as f:
 
372
                                    dst_file.write('Files-Pattern: %s\n' % \
 
373
                                                   out_name)
 
374
                                    shutil.copyfileobj(f, dst_file)
 
375
                            dst_file.close()