[TIC-CORE] support caching for analysis data
[archive/20170607/tools/tic-core.git] / tic / command.py
index 92f3c75..661466c 100644 (file)
@@ -21,6 +21,7 @@
 
 import os
 import logging
+import hashlib
 
 from tic.dependency import get_installed_packages
 from tic.parser.recipe_parser import get_default_recipe, convert_recipe_to_yaml
@@ -32,6 +33,7 @@ from tic.repo import get_repodata_from_repos
 from tic.pykickstarter import KSoption, kswriter
 from tic.utils import process
 from tic.utils import misc
+from tic.utils import file
 
 DEFAULT_CACHEDIR='/var/tmp/tic-core'
 DEFAULT_ANALYSIS_CACHEDIR='/var/tmp/tic-core/analysis'
@@ -60,13 +62,27 @@ def analyze(repo_list, recipe_list=None):
     #Download repodata from repositories (Remote/Local)
     repoinfo = get_repodata_from_repos(repos, DEFAULT_CACHEDIR)
     logger.info('time to get repodata from repo: %d ms', misc.get_timestamp() - start_time)
+    
+    checksum_list=[]
+    for repo in repoinfo:
+        checksum_list.append(repo['checksum'])
+    all_checksum = hashlib.sha256('_'.join(checksum_list)).hexdigest()
+    analysis_file=os.path.join(DEFAULT_ANALYSIS_CACHEDIR, all_checksum, 'analysis.json')
+    pkg_group=None
+    if os.path.exists(analysis_file):
+        pkg_group=file.read_json(analysis_file)
 
-    start_time = misc.get_timestamp()
-    # Parse the xml files for the analysis of package (.rpm)
-    repo_parser = RepodataParser('armv7l', repoinfo)
-    pkg_group = repo_parser.parse()
-    logger.info('packages: %d, provides: %d, files: %d', len(pkg_group['pkg_dict']), len(pkg_group['provides']), len(pkg_group['files']))
-    logger.info('time to parse repodata: %d ms', misc.get_timestamp() - start_time)
+    if not pkg_group or not pkg_group.get('pkg_dict'):
+        start_time = misc.get_timestamp()
+        # Parse the xml files for the analysis of package (.rpm)
+        repo_parser = RepodataParser('armv7l', repoinfo)
+        pkg_group = repo_parser.parse()
+        logger.info('packages: %d, provides: %d, files: %d', len(pkg_group['pkg_dict']), len(pkg_group['provides']), len(pkg_group['files']))
+        logger.info('time to parse repodata: %d ms', misc.get_timestamp() - start_time)
+        # dump to cached file
+        file.write_json_flock(analysis_file, pkg_group)
+    else:
+        logger.info('use a cache parsing data - %s', analysis_file)
 
     start_time = misc.get_timestamp()
     # Make a data for TIC (Tizen image creation)
@@ -128,8 +144,8 @@ def exports(export_type, recipe, packages, outdir, filename=None):
     # copy the ks to output directory
     output=copyfile(kspath, outdir, filename)
     logger.info('copy the ks file from %s to dst:%s', kspath, output)
-    
-    return output
+    result = {'kspath':output, 'arch':config.get('Architecture')}
+    return result
 
 def createimage(recipes, ksfile, outdir):
     logger = logging.getLogger(__name__)