efa54e12b3defa15e050baeb2f20153be00cedbc
[platform/framework/web/crosswalk.git] / src / xwalk / app / tools / android / extension_manager.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2014 Intel Corporation. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
6 # pylint: disable=F0401
7
8 import fnmatch
9 import json
10 import optparse
11 import os
12 import sys
13
14 from util import CleanDir, RunCommand, GetVersion
15
16
17 """
18 * Fodler structure for extension.
19 1. 1 extension of 1 repo.
20 .
21 |-- all.gyp     #optional. If your extension is built from source.
22 |                          You have to provide this file.
23 |-- build.json  #required. Tell make_apk.json where to find extension.
24 |-- <other files and dirs>
25
26 2. multiple extesnions of 1 repo
27 .
28 |-- all.gyp
29 |-- <extension>
30     |-- build.json
31     |-- <other files and dirs>
32
33 * Format of build.json
34 Example:
35 {
36   "binary_path":"../out/Default/gen/iap"
37 }
38 The base dir of "binary_path" is the path of extension.
39 """
40
41
42 def GetExtensionList(extensions_path):
43   if not os.path.isdir(extensions_path):
44     return []
45
46   extension_list = []
47   for item in os.listdir(extensions_path):
48     sub_path = os.path.join(extensions_path, item)
49     if not os.path.isdir(sub_path):
50       continue
51     if os.path.isfile(os.path.join(sub_path, "build.json")):
52       extension_list.append(item)
53     else:
54       for sub_item in os.listdir(sub_path):
55         if os.path.isfile(
56             os.path.join(sub_path, sub_item, "build.json")):
57           extension_list.append(os.path.join(item, sub_item))
58
59   return extension_list
60
61
62 def EnableExtension(extension_name, extensions_path, is_enable):
63   extension_list = GetExtensionList(extensions_path)
64   filtered_extensions = fnmatch.filter(extension_list, extension_name)
65   for item in filtered_extensions:
66     build_json_path = os.path.join(extensions_path, item, "build.json")
67     with open(build_json_path, "r") as fd:
68       data = json.load(fd)
69       data["enable"] = is_enable
70     with open(build_json_path, "w") as fd:
71       fd.write(
72           json.dumps(data, sort_keys=True, indent=4, separators=(',', ': ')))
73
74
75 def GetExtensionStatus(extension_name, extensions_path):
76   build_json_path = os.path.join(extensions_path, extension_name, "build.json")
77   with open(build_json_path, "r") as fd:
78     data = json.load(fd)
79   return data.get('enable', True)
80
81
82 def BuildExtension(repo_path):
83   old_cwd = os.getcwd()
84   os.chdir(repo_path)
85   os.environ["GYP_GENERATORS"] = "ninja"
86   gyp_cmd = ["gyp", "--depth=.", "all.gyp"]
87   RunCommand(gyp_cmd, True)
88   #Currently, the output path is set to out/Default.
89   ninja_cmd = ["ninja", "-C", os.path.join("out", "Default")]
90   RunCommand(ninja_cmd, True)
91   os.chdir(old_cwd)
92
93
94 def HandleAdd(git_url, extensions_path, name=None):
95   if name is None:
96     name = git_url.split('/')[-1].split('.')[0]
97   if not os.path.isdir(extensions_path):
98     if os.path.isfile(extensions_path):
99       print "WARNING: Please remove file %s" % (extensions_path)
100       sys.exit(1)
101     else:
102       os.mkdir(extensions_path)
103   local_extension_path = os.path.join(extensions_path, name)
104   if os.path.exists(local_extension_path):
105     print "ERROR: You already have a repo named \"%s\"." % name
106     return 
107   os.mkdir(local_extension_path)
108   #Only support git.
109   git_cmd = ["git", "clone", git_url, local_extension_path]
110   RunCommand(git_cmd, True)
111   if os.path.isfile(os.path.join(local_extension_path, "all.gyp")):
112     BuildExtension(local_extension_path)
113
114
115 def HandleRemove(remove_name, extensions_path):
116   extension_path = os.path.join(extensions_path, remove_name)
117   if os.path.exists(extension_path):
118     CleanDir(extension_path)
119   else:
120     print "ERROR: Don't have extension \"%s\"" % (remove_name)
121
122
123 def PrintExtensionInfo(extension_name, extensions_path):
124   print "{0} {1}".format(
125       "+" if GetExtensionStatus(extension_name, extensions_path) else "-",
126       extension_name)
127
128
129 def HandleList(extensions_path):
130   extension_list = GetExtensionList(extensions_path)
131   print
132   for extension_name in extension_list:
133     PrintExtensionInfo(extension_name, extensions_path)
134   print
135
136
137 def HandleSearch(key, extensions_path):
138   extension_list = GetExtensionList(extensions_path)
139   filtered_extensions = fnmatch.filter(extension_list, key)
140   print
141   for extension_name in filtered_extensions:
142     PrintExtensionInfo(extension_name, extensions_path)
143   print
144
145
146 def HandleEnable(extension_name, extension_path):
147   EnableExtension(extension_name, extension_path, True)
148
149
150 def HandleDisable(extension_name, extension_path):
151   EnableExtension(extension_name, extension_path, False)
152
153
154 def HandleVersion():
155   version_path = \
156       os.path.join(os.path.dirname(os.path.realpath(__file__)), "VERSION")
157   if os.path.isfile(version_path):
158     print(GetVersion("VERSION"))
159   else:
160     print ("ERROR: VERSION was not found, so Crosswalk\'s version could not"
161            "be determined.")
162
163
164 def main(argv):
165   parser = optparse.OptionParser()
166   parser.add_option("--add", action="store",
167                     type="string", dest="git_url",
168                     metavar="URL",
169                     help="Add an extension")
170   parser.add_option("--enable", action="store",
171                     type="string", dest="enable",
172                     metavar="NAME",
173                     help="Enabled extension list")
174   parser.add_option("--disable", action="store",
175                     type="string", dest="disable",
176                     metavar="NAME",
177                     help="Disabled extension list")
178   parser.add_option("--name", action="store",
179                     type="string", dest="name",
180                     metavar="NAME",
181                     help="Extension name in local path. "
182                          "Work with --add option.")
183   parser.add_option("--remove", action="store",
184                     type="string", dest="remove_name",
185                     metavar="NAME",
186                     help="Remove an extension")
187   parser.add_option("-l", "--list", action="store_true",
188                     dest="list_extensions", default=False,
189                     help="List all extensions")
190   parser.add_option("--search", action="store",
191                     type="string", dest="search_key",
192                     metavar="KEYWORD",
193                     help="List all extensions")
194   parser.add_option("-v", "--version", action="store_true",
195                     dest="version", default=False,
196                     help="The version of this python tool.")
197
198   options, _ = parser.parse_args()
199   if len(argv) == 1:
200     parser.print_help()
201     return 0
202   
203   extensions_path = os.path.join(os.getcwd(), "extensions")
204
205   if options.git_url:
206     HandleAdd(options.git_url, extensions_path, options.name)
207   elif options.enable:
208     HandleEnable(options.enable, extensions_path)
209   elif options.disable:
210     HandleDisable(options.disable, extensions_path)
211   elif options.remove_name:
212     HandleRemove(options.remove_name, extensions_path)
213   elif options.list_extensions:
214     HandleList(extensions_path)
215   elif options.search_key:
216     HandleSearch(options.search_key, extensions_path)
217   elif options.version:
218     HandleVersion()
219
220
221 if __name__ == '__main__':
222   sys.exit(main(sys.argv))