[TIC-CORE] Modify arguments of exports api 96/105096/1
authorChulwoo Shin <cw1.shin@samsung.com>
Thu, 15 Dec 2016 10:49:15 +0000 (19:49 +0900)
committerChulwoo Shin <cw1.shin@samsung.com>
Thu, 15 Dec 2016 10:49:15 +0000 (19:49 +0900)
modify input argument - output directory
relative/user path support

Change-Id: Ibd8ead11774ce76122314323b630b3bdd6267264
Signed-off-by: Chulwoo Shin <cw1.shin@samsung.com>
tic/command.py
tic/parser/repo_parser.py
tic/server/tic_server.py
tic/utils/file.py
tools/tic-core

index e506e6c..c2e80c0 100644 (file)
 
 import os
 import logging
-import shutil
 
 from tic.dependency import analyze_dependency, get_installed_packages
 from tic.parser.recipe_parser import get_default_recipe, convert_recipe_to_yaml
 from tic.parser.repo_parser import RepodataParser
 from tic.parser.view_parser import make_view_data
 from tic.utils.error import TICError
+from tic.utils.file import copyfile
 from tic.repo import get_repodata_from_repos
 from tic.pykickstarter import KSoption, kswriter
 
@@ -77,7 +77,7 @@ def analyze(repo_list, recipe_list=None):
     
     return result
 
-def exports(export_type, recipe, packages, output):
+def exports(export_type, recipe, packages, outdir):
     logger = logging.getLogger(__name__)
     if not export_type:
         export_type='ks'
@@ -116,7 +116,7 @@ def exports(export_type, recipe, packages, output):
         raise TICError('No ks file was created from kickstarter')
     
     # copy the ks to output directory
-    shutil.copy(kspath, output)
+    output=copyfile(kspath, outdir)
     logger.info('copy the ks file from %s to dst:%s', kspath, output)
     
     return output
index f979ca5..80bccc0 100644 (file)
@@ -21,6 +21,7 @@
 
 from lxml import etree
 from tic.utils.error import TICError
+import os
 import logging
 import re
 
@@ -29,7 +30,7 @@ class RepodataParser(object):
     def __init__(self, repodata_list):
         self.repodata_list = repodata_list
         
-    def _xml_parse(self, pkg_group, tree, tag_dic):
+    def _xml_parse(self, pkg_group, root, tag_dic):
         logger = logging.getLogger(__name__)
         meta_prefix = 'building-block'
         meta_prefix_root = 'building-block-root-'
@@ -38,8 +39,6 @@ class RepodataParser(object):
         meta_sub1_pattern = re.compile("(?P<root>.+)-(?P<sub1>.+)")
         meta_sub2_pattern = re.compile("(?P<root>.+)-(?P<sub1>.+)-(?P<sub2>.+)")
 
-        root = tree.getroot()
-        
         pkg_list = pkg_group.get('pkg_list')
         pkg2id = pkg_group.get('pkg2id')
         provides2id = pkg_group.get('provides2id')
@@ -179,8 +178,7 @@ class RepodataParser(object):
                         # the dependent package does not exist.
                         logger.warning('"%s" required by "%s" does not exist.', req_name, pkg_list[pkg_id].get('name'))
     
-    def _get_tagname(self, tree):
-        root = tree.getroot()
+    def _get_tagname(self, root):
         tags = {}
         # xmlns = re.sub('metadata$', '', root.tag) 
         tags['metadata'] = '{%s}metadata' % root.nsmap[None]
@@ -205,15 +203,19 @@ class RepodataParser(object):
         if not self.repodata_list:
             return None
         
-        tree_list = []
+        xml_list = []
         try:
             for repodata in self.repodata_list:
                 tree = etree.parse(repodata['primary'])
-                tree_list.append(tree)
+                xml_list.append(tree.getroot())
         except etree.XMLSyntaxError as e:
             raise TICError('primary.xml syntax error. %s', e)
         
-        tag_dic = self._get_tagname(tree_list[0])
+        tag_dic = self._get_tagname(xml_list[0])
+        
+        #TODO: temporary code (should be deleted)
+        meta_string='<?xml version="1.0" encoding="UTF-8"?><metadata xmlns="http://linux.duke.edu/metadata/common" xmlns:rpm="http://linux.duke.edu/metadata/rpm" packages="1467"><package type="rpm"><name>building-block-root-metapkg</name><arch>aarch64</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>Simple DirectMedia Layer</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="aarch64/SDL2-2.0.4-4.2.aarch64.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /><rpm:requires><rpm:entry name="building-block-sub1-metapkg-extsub1" /><rpm:entry name="building-block-sub1-metapkg-extsub2" /></rpm:requires></format></package><package type="rpm"><name>building-block-sub1-metapkg-extsub1</name><arch>aarch64</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub1-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="aarch64/SDL2-2.0.4-4.2.aarch64.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /><rpm:requires><rpm:entry name="building-block-sub2-metapkg-extsub1-exts1sub1" /></rpm:requires></format></package><package type="rpm"><name>building-block-sub2-metapkg-extsub1-exts1sub1</name><arch>aarch64</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub2-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="aarch64/SDL2-2.0.4-4.2.aarch64.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /></format></package><package type="rpm"><name>building-block-sub2-metapkg-extsub1-exts1sub2</name><arch>aarch64</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub2-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="aarch64/SDL2-2.0.4-4.2.aarch64.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /></format></package><package type="rpm"><name>building-block-sub1-metapkg-extsub2</name><arch>aarch64</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub1-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="aarch64/SDL2-2.0.4-4.2.aarch64.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /><rpm:requires><rpm:entry name="building-block-sub2-metapkg-extsub2-exts2sub1" /></rpm:requires></format></package><package type="rpm"><name>building-block-sub2-metapkg-extsub2-exts2sub1</name><arch>aarch64</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub2-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="aarch64/SDL2-2.0.4-4.2.aarch64.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /></format></package><package type="rpm"><name>building-block-sub2-metapkg-extsub2-exts2sub2</name><arch>aarch64</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub2-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="aarch64/SDL2-2.0.4-4.2.aarch64.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /></format></package></metadata>'
+        xml_list.append(etree.fromstring(meta_string))
         
         pkg_group = dict(pkg_list=[],
                          pkg2id={},
@@ -222,8 +224,8 @@ class RepodataParser(object):
                          meta_info=dict(root=[], sub1=[], sub2=[]))
         
         # parses the repodata (primary.xml)
-        for tree in tree_list:
-            self._xml_parse(pkg_group, tree, tag_dic)
+        for xml_root in xml_list:
+            self._xml_parse(pkg_group, xml_root, tag_dic)
             
         # set the requires id
         self._prepare_requires_id(pkg_group)
index 4750177..504f730 100644 (file)
@@ -68,6 +68,7 @@ def start(port_num=59001):
     with app.test_request_context():
         print(url_for('index'))
         print(url_for('analysis'))
+        print(url_for('exports'))
     app.run(host='0.0.0.0', threaded=True, port=port_num)
 
 
index 9e51ffb..442f3ce 100644 (file)
@@ -22,7 +22,7 @@
 import errno
 import gzip
 import os
-
+import shutil
 
 def make_dirs(dirname):
     try:
@@ -43,11 +43,9 @@ def decompress_gzip(intput_path, output_path):
         f.write(fobj.read())
         f.close()
     return output_path
-     
-# def decompress_bunzip(intput_path, output_path):
-#     with open(output_path, 'wb') as new_file, bz2.BZ2File(intput_path, 'rb') as file:
-#         for data in iter(lambda : file.read(100 * 1024), b''):
-#             new_file.write(data)
-
 
\ No newline at end of file
+def copyfile(src, dst):
+    abs_dst=os.path.abspath(os.path.expanduser(dst))
+    make_dirs(abs_dst)
+    shutil.copy(src, abs_dst)
+    return os.path.join(abs_dst, os.path.basename(src))
\ No newline at end of file
index 8400c77..acfd6d0 100644 (file)
@@ -48,13 +48,19 @@ def create_parser():
     subparsers = parser.add_subparsers(dest='subparser_name', help='sub-command help')
         
     # create the parser for the 'analyze' command
-    parser_analyze = subparsers.add_parser('analysis', help='analyze install-dependency of packages')
-    parser_analyze.add_argument('-r', "--repo", dest="repos", metavar="urls", nargs='+', help="The URL of repository [default: %(default)s]", required=True)
-    parser_analyze.add_argument('-o', "--output", dest="output", action="store", help="The result file is distributed in the output path", default=os.getcwd())
-    
-    parser_download = subparsers.add_parser('download', help='download repodata from repositories')
-    parser_download.add_argument('-r', "--repo", dest="repos", metavar="urls", nargs='+', help="The URL of repository [default: %(default)s]", required=True)
-    parser_download.add_argument('-o', "--output", dest="output", action="store", help="The result file is distributed in the output path [default: %(default)s]")
+    parser_analyze = subparsers.add_parser('analyze', help='analyze install-dependency of packages')
+    parser_analyze.add_argument('-r', "--repos", dest="repos", metavar="urls", nargs='+', help="The URL of repository [default: %(default)s]")
+    parser_analyze.add_argument('-c', "--recipes", dest="recipes", metavar="paths", nargs='+', help="The path of recipe")
+    parser_analyze.add_argument('-o', "--outdir", dest="outdir", action="store", help="The result file is distributed in the outdir path", default=os.getcwd())
+    # create the parser for the 'export' command
+    parser_export = subparsers.add_parser('export', help='export files')
+    parser_export.add_argument('-f', "--format", dest="format", metavar="recipe/ks", help="exports file foramt", required=True)
+    parser_export.add_argument('-c', "--recipes", dest="recipes", metavar="paths", nargs='+', help="The path of recipe")
+    parser_export.add_argument('-o', "--outdir", dest="outdir", action="store", help="The result file is distributed in the outdir path", default=os.getcwd())
+    # create the parser for the 'create' command
+    parser_create = subparsers.add_parser('create', help='create an image for tizen')
+    parser_create.add_argument('-r', "--input", dest="input", metavar="data", nargs='+', help="Input data files (kickstart/recipes)", required=True)
+    parser_create.add_argument('-o', "--outdir", dest="outdir", action="store", help="The result file is distributed in the output path", default=os.getcwd())
     
     parser_start = subparsers.add_parser('start', help='start the tic-core demon on system. port 59001 is used by default ')
     parser_start.add_argument('-p', "--port", dest="port", action="store", help="port number", default=59001)
@@ -69,10 +75,15 @@ def main(argv):
         # Process arguments
         args = parser.parse_args(argv[1:])
         
-        if args.subparser_name == 'analysis':
-            view_data = command.analyze(args.repos, None)
-            file.write(args.output, json.dumps(view_data))
-        elif args.subparser_name == 'download':
+        if args.subparser_name == 'analyze':
+            view_data = command.analyze(args.repos, args.recipes)
+            output_dir=os.path.abspath(os.path.expanduser(args.outdir))
+            file.write(os.path.join(output_dir, 'viewdata.json'), json.dumps(view_data))
+        elif args.subparser_name == 'export':
+            output=command.exports(args.format, args.recipes, None, args.outdir)
+            logger.info("export the %s file: %s", args.format, output)
+        elif args.subparser_name == 'create':
+            logger.info('create command is yet available')
             pass
         elif args.subparser_name == 'start':
             tic_server.start(args.port)