You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.0 KiB
152 lines
4.0 KiB
#!/usr/bin/python2
|
|
|
|
# Copyright 2017 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
"""Command line tool to pack audio related modules into a zip file."""
|
|
|
|
import argparse
|
|
import logging
|
|
import os
|
|
import subprocess
|
|
|
|
|
|
MODULES = ['audio_quality_measurement.py', 'audio_data.py', 'audio_analysis.py']
|
|
ENTRY = '__main__.py'
|
|
ENTRY_TARGET = 'check_quality.py'
|
|
|
|
def add_args(parser):
|
|
"""Adds command line arguments."""
|
|
parser.add_argument('-d', '--debug', action='store_true', default=False,
|
|
help='Show debug message.')
|
|
parser.add_argument('-o', '--out', type=str, default='audio_quality.zip',
|
|
help='Output file name. Default is audio_quality.zip.')
|
|
parser.add_argument('-s', '--skip-cleanup', action='store_true', default=False,
|
|
help='Skip cleaning up temporary files. Default is False')
|
|
|
|
|
|
def parse_args(parser):
|
|
"""Parses args.
|
|
|
|
@param parser: An argparse.ArgumentParser.
|
|
|
|
@returns: The namespace parsed from command line arguments.
|
|
|
|
"""
|
|
args = parser.parse_args()
|
|
return args
|
|
|
|
|
|
def create_link():
|
|
"""Creates a symbolic link from ENTRY to ENTRY_TARGET.
|
|
|
|
With this symlink, python can execute the zip file directly to execute
|
|
ENTRY_TARGET.
|
|
|
|
"""
|
|
command = ['ln', '-sf', ENTRY_TARGET, ENTRY]
|
|
logging.debug('Link command: %s', command)
|
|
subprocess.check_call(command)
|
|
|
|
|
|
def pack_files(out_file):
|
|
"""Packs audio related modules into a zip file.
|
|
|
|
Packs audio related modules in MODULES into a zip file.
|
|
Packs the symlink pointing to ENTRY_TARGET.
|
|
|
|
@param out_file: Zip file name.
|
|
|
|
"""
|
|
command = ['zip']
|
|
command.append(out_file)
|
|
command += MODULES
|
|
command.append(ENTRY)
|
|
command.append(ENTRY_TARGET)
|
|
logging.debug('Zip command: %s', command)
|
|
subprocess.check_call(command)
|
|
|
|
|
|
def check_packed_file(out_file):
|
|
"""Checks the packed file can be executed by python.
|
|
|
|
@param out_file: Zip file name.
|
|
|
|
"""
|
|
command = ['python', out_file, '--help']
|
|
logging.debug('Check command: %s', command)
|
|
output = subprocess.check_output(command)
|
|
logging.debug('output: %s', output)
|
|
|
|
|
|
def cleanup():
|
|
"""Cleans up the symobolic link."""
|
|
if os.path.exists(ENTRY):
|
|
os.unlink(ENTRY)
|
|
|
|
|
|
def repo_is_dirty():
|
|
"""Checks if a repo is dirty by git diff command.
|
|
|
|
@returns: True if there are uncommitted changes. False otherwise.
|
|
|
|
"""
|
|
try:
|
|
subprocess.check_call(['git', 'diff', '--quiet'])
|
|
subprocess.check_call(['git', 'diff', '--cached', '--quiet'])
|
|
except subprocess.CalledProcessError:
|
|
return True
|
|
return False
|
|
|
|
|
|
def get_git_sha1():
|
|
"""Returns git SHA-1 hash of HEAD.
|
|
|
|
@returns: git SHA-1 has of HEAD with minimum length 9.
|
|
|
|
"""
|
|
return subprocess.check_output(
|
|
['git', 'rev-parse', '--short', 'HEAD']).strip()
|
|
|
|
|
|
def append_name_with_git_hash(out_file):
|
|
"""Append the file with git SHA-1 hash.
|
|
|
|
For out_file like ABC.xyz, append the name ABC with git SHA-1 of HEAD, like
|
|
ABC_f4610bdd3.xyz.
|
|
If current repo contains uncommitted changes, it will be
|
|
ABC_f4610bdd3_dirty.xyz.
|
|
|
|
"""
|
|
basename, ext = os.path.splitext(out_file)
|
|
basename += '_'
|
|
basename += get_git_sha1()
|
|
if repo_is_dirty():
|
|
basename += '_dirty'
|
|
return basename + ext
|
|
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser(
|
|
description='Pack audio related modules into a zip file.')
|
|
|
|
add_args(parser)
|
|
args = parse_args(parser)
|
|
|
|
level = logging.DEBUG if args.debug else logging.INFO
|
|
format = '%(asctime)-15s:%(levelname)s:%(pathname)s:%(lineno)d: %(message)s'
|
|
logging.basicConfig(format=format, level=level)
|
|
|
|
out_file = append_name_with_git_hash(args.out)
|
|
|
|
try:
|
|
create_link()
|
|
pack_files(out_file)
|
|
check_packed_file(out_file)
|
|
finally:
|
|
if not args.skip_cleanup:
|
|
cleanup()
|
|
|
|
logging.info('Packed file: %s', out_file)
|