xref: /aosp_15_r20/external/autotest/utils/packager.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li#!/usr/bin/python3 -u
2*9c5db199SXin Li
3*9c5db199SXin Li"""
4*9c5db199SXin LiUtility to upload or remove the packages from the packages repository.
5*9c5db199SXin Li"""
6*9c5db199SXin Li
7*9c5db199SXin Lifrom __future__ import absolute_import
8*9c5db199SXin Lifrom __future__ import division
9*9c5db199SXin Lifrom __future__ import print_function
10*9c5db199SXin Liimport logging, optparse, os, shutil, sys, tempfile
11*9c5db199SXin Liimport common
12*9c5db199SXin Lifrom autotest_lib.client.common_lib import utils as client_utils
13*9c5db199SXin Lifrom autotest_lib.client.common_lib import global_config, error
14*9c5db199SXin Lifrom autotest_lib.client.common_lib import packages
15*9c5db199SXin Lifrom autotest_lib.server import utils as server_utils
16*9c5db199SXin Li
17*9c5db199SXin Lic = global_config.global_config
18*9c5db199SXin Lilogging.basicConfig(level=logging.DEBUG)
19*9c5db199SXin Li
20*9c5db199SXin LiACTION_REMOVE = 'remove'
21*9c5db199SXin LiACTION_UPLOAD = 'upload'
22*9c5db199SXin LiACTION_TAR_ONLY = 'tar_only'
23*9c5db199SXin Li
24*9c5db199SXin Lidef get_exclude_string(client_dir):
25*9c5db199SXin Li    '''
26*9c5db199SXin Li    Get the exclude string for the tar command to exclude specific
27*9c5db199SXin Li    subdirectories inside client_dir.
28*9c5db199SXin Li    For profilers we need to exclude everything except the __init__.py
29*9c5db199SXin Li    file so that the profilers can be imported.
30*9c5db199SXin Li    '''
31*9c5db199SXin Li    exclude_string = ('--exclude="deps/*" --exclude="tests/*" --exclude=.git '
32*9c5db199SXin Li                      '--exclude="site_tests/*" --exclude="**.pyc"')
33*9c5db199SXin Li
34*9c5db199SXin Li    # Get the profilers directory
35*9c5db199SXin Li    prof_dir = os.path.join(client_dir, 'profilers')
36*9c5db199SXin Li
37*9c5db199SXin Li    # Include the __init__.py file for the profilers and exclude all its
38*9c5db199SXin Li    # subdirectories
39*9c5db199SXin Li    for f in os.listdir(prof_dir):
40*9c5db199SXin Li        if os.path.isdir(os.path.join(prof_dir, f)):
41*9c5db199SXin Li            exclude_string += ' --exclude="profilers/%s"' % f
42*9c5db199SXin Li
43*9c5db199SXin Li    # The '.' here is needed to zip the files in the current
44*9c5db199SXin Li    # directory. We use '-C' for tar to change to the required
45*9c5db199SXin Li    # directory i.e. src_dir and then zip up the files in that
46*9c5db199SXin Li    # directory(which is '.') excluding the ones in the exclude_dirs
47*9c5db199SXin Li    exclude_string += " ."
48*9c5db199SXin Li
49*9c5db199SXin Li    # TODO(milleral): This is sad and ugly.  http://crbug.com/258161
50*9c5db199SXin Li    # Surprisingly, |exclude_string| actually means argument list, and
51*9c5db199SXin Li    # we'd like to package up the current global_config.ini also, so let's
52*9c5db199SXin Li    # just tack it on here.
53*9c5db199SXin Li    # Also note that this only works because tar prevents us from un-tarring
54*9c5db199SXin Li    # files into parent directories.
55*9c5db199SXin Li    exclude_string += " ../global_config.ini"
56*9c5db199SXin Li
57*9c5db199SXin Li    return exclude_string
58*9c5db199SXin Li
59*9c5db199SXin Li
60*9c5db199SXin Lidef parse_args():
61*9c5db199SXin Li    parser = optparse.OptionParser()
62*9c5db199SXin Li    parser.add_option("-d", "--dependency", help="package the dependency"
63*9c5db199SXin Li                      " from client/deps directory and upload to the repo",
64*9c5db199SXin Li                      dest="dep")
65*9c5db199SXin Li    parser.add_option("-p", "--profiler", help="package the profiler "
66*9c5db199SXin Li                      "from client/profilers directory and upload to the repo",
67*9c5db199SXin Li                      dest="prof")
68*9c5db199SXin Li    parser.add_option("-t", "--test", help="package the test from client/tests"
69*9c5db199SXin Li                      " or client/site_tests and upload to the repo.",
70*9c5db199SXin Li                      dest="test")
71*9c5db199SXin Li    parser.add_option("-c", "--client", help="package the client "
72*9c5db199SXin Li                      "directory alone without the tests, deps and profilers",
73*9c5db199SXin Li                      dest="client", action="store_true", default=False)
74*9c5db199SXin Li    parser.add_option("-f", "--file", help="simply uploads the specified"
75*9c5db199SXin Li                      "file on to the repo", dest="file")
76*9c5db199SXin Li    parser.add_option("-r", "--repository", help="the URL of the packages"
77*9c5db199SXin Li                      "repository location to upload the packages to.",
78*9c5db199SXin Li                      dest="repo", default=None)
79*9c5db199SXin Li    parser.add_option("-o", "--output_dir", help="the output directory"
80*9c5db199SXin Li                      "to place tarballs and md5sum files in.",
81*9c5db199SXin Li                      dest="output_dir", default=None)
82*9c5db199SXin Li    parser.add_option("-a", "--action", help="the action to perform",
83*9c5db199SXin Li                      dest="action", choices=(ACTION_UPLOAD, ACTION_REMOVE,
84*9c5db199SXin Li                                              ACTION_TAR_ONLY), default=None)
85*9c5db199SXin Li    parser.add_option("--all", help="Upload all the files locally "
86*9c5db199SXin Li                      "to all the repos specified in global_config.ini. "
87*9c5db199SXin Li                      "(includes the client, tests, deps and profilers)",
88*9c5db199SXin Li                      dest="all", action="store_true", default=False)
89*9c5db199SXin Li
90*9c5db199SXin Li    options, args = parser.parse_args()
91*9c5db199SXin Li    return options, args
92*9c5db199SXin Li
93*9c5db199SXin Lidef get_build_dir(name, dest_dir, pkg_type):
94*9c5db199SXin Li    """Method to generate the build directory where the tarball and checksum
95*9c5db199SXin Li    is stored. The following package types are handled: test, dep, profiler.
96*9c5db199SXin Li    Package type 'client' is not handled.
97*9c5db199SXin Li    """
98*9c5db199SXin Li    if pkg_type == 'client':
99*9c5db199SXin Li        # NOTE: The "tar_only" action for pkg_type "client" has no use
100*9c5db199SXin Li        # case yet. No known invocations of packager.py with
101*9c5db199SXin Li        # --action=tar_only send in clients in the command line. Please
102*9c5db199SXin Li        # confirm the behaviour is expected before this type is enabled for
103*9c5db199SXin Li        # "tar_only" actions.
104*9c5db199SXin Li        print('Tar action not supported for pkg_type= %s, name = %s' %
105*9c5db199SXin Li                pkg_type, name)
106*9c5db199SXin Li        return None
107*9c5db199SXin Li    # For all packages, the work-dir should have 'client' appended to it.
108*9c5db199SXin Li    base_build_dir = os.path.join(dest_dir, 'client')
109*9c5db199SXin Li    if pkg_type == 'test':
110*9c5db199SXin Li        build_dir = os.path.join(get_test_dir(name, base_build_dir), name)
111*9c5db199SXin Li    else:
112*9c5db199SXin Li        # For profiler and dep, we append 's', and then append the name.
113*9c5db199SXin Li        # TODO(pmalani): Make this less fiddly?
114*9c5db199SXin Li        build_dir = os.path.join(base_build_dir, pkg_type + 's', name)
115*9c5db199SXin Li    return build_dir
116*9c5db199SXin Li
117*9c5db199SXin Lidef process_packages(pkgmgr, pkg_type, pkg_names, src_dir,
118*9c5db199SXin Li                     action, dest_dir=None):
119*9c5db199SXin Li    """Method to upload or remove package depending on the flag passed to it.
120*9c5db199SXin Li
121*9c5db199SXin Li    If tar_only is set to True, this routine is solely used to generate a
122*9c5db199SXin Li    tarball and compute the md5sum from that tarball.
123*9c5db199SXin Li    If the tar_only flag is True, then the remove flag is ignored.
124*9c5db199SXin Li    """
125*9c5db199SXin Li    exclude_string = ' .'
126*9c5db199SXin Li    names = [p.strip() for p in pkg_names.split(',')]
127*9c5db199SXin Li    for name in names:
128*9c5db199SXin Li        print("process_packages: Processing %s ... " % name)
129*9c5db199SXin Li        if pkg_type == 'client':
130*9c5db199SXin Li            pkg_dir = src_dir
131*9c5db199SXin Li            exclude_string = get_exclude_string(pkg_dir)
132*9c5db199SXin Li        elif pkg_type == 'test':
133*9c5db199SXin Li            # if the package is a test then look whether it is in client/tests
134*9c5db199SXin Li            # or client/site_tests
135*9c5db199SXin Li            pkg_dir = os.path.join(get_test_dir(name, src_dir), name)
136*9c5db199SXin Li        else:
137*9c5db199SXin Li            # for the profilers and deps
138*9c5db199SXin Li            pkg_dir = os.path.join(src_dir, name)
139*9c5db199SXin Li
140*9c5db199SXin Li        pkg_name = pkgmgr.get_tarball_name(name, pkg_type)
141*9c5db199SXin Li
142*9c5db199SXin Li        exclude_string_tar = ((
143*9c5db199SXin Li            ' --exclude="**%s" --exclude="**%s.checksum" ' %
144*9c5db199SXin Li            (pkg_name, pkg_name)) + exclude_string)
145*9c5db199SXin Li        if action == ACTION_TAR_ONLY:
146*9c5db199SXin Li            # We don't want any pre-existing tarballs and checksums to
147*9c5db199SXin Li            # be repackaged, so we should purge these.
148*9c5db199SXin Li            build_dir = get_build_dir(name, dest_dir, pkg_type)
149*9c5db199SXin Li            try:
150*9c5db199SXin Li                packages.check_diskspace(build_dir)
151*9c5db199SXin Li            except error.RepoDiskFullError as e:
152*9c5db199SXin Li                msg = ("Work_dir directory for packages %s does not have "
153*9c5db199SXin Li                       "enough space available: %s" % (build_dir, e))
154*9c5db199SXin Li                raise error.RepoDiskFullError(msg)
155*9c5db199SXin Li            tarball_path = pkgmgr.tar_package(pkg_name, pkg_dir,
156*9c5db199SXin Li                                              build_dir, exclude_string_tar)
157*9c5db199SXin Li
158*9c5db199SXin Li            # Create the md5 hash too.
159*9c5db199SXin Li            md5sum = pkgmgr.compute_checksum(tarball_path)
160*9c5db199SXin Li            md5sum_filepath = os.path.join(build_dir, pkg_name + '.checksum')
161*9c5db199SXin Li            with open(md5sum_filepath, "w") as f:
162*9c5db199SXin Li                f.write(md5sum)
163*9c5db199SXin Li
164*9c5db199SXin Li        elif action == ACTION_UPLOAD:
165*9c5db199SXin Li            # Tar the source and upload
166*9c5db199SXin Li            temp_dir = tempfile.mkdtemp()
167*9c5db199SXin Li            try:
168*9c5db199SXin Li                try:
169*9c5db199SXin Li                    packages.check_diskspace(temp_dir)
170*9c5db199SXin Li                except error.RepoDiskFullError as e:
171*9c5db199SXin Li                    msg = ("Temporary directory for packages %s does not have "
172*9c5db199SXin Li                           "enough space available: %s" % (temp_dir, e))
173*9c5db199SXin Li                    raise error.RepoDiskFullError(msg)
174*9c5db199SXin Li
175*9c5db199SXin Li                # Check if tarball already exists. If it does, then don't
176*9c5db199SXin Li                # create a tarball again.
177*9c5db199SXin Li                tarball_path = os.path.join(pkg_dir, pkg_name);
178*9c5db199SXin Li                if os.path.exists(tarball_path):
179*9c5db199SXin Li                    print("process_packages: Tarball %s already exists" %
180*9c5db199SXin Li                          tarball_path)
181*9c5db199SXin Li                else:
182*9c5db199SXin Li                    tarball_path = pkgmgr.tar_package(pkg_name, pkg_dir,
183*9c5db199SXin Li                                                      temp_dir,
184*9c5db199SXin Li                                                      exclude_string_tar)
185*9c5db199SXin Li                # Compare the checksum with what packages.checksum has. If they
186*9c5db199SXin Li                # match then we don't need to perform the upload.
187*9c5db199SXin Li                if not pkgmgr.compare_checksum(tarball_path):
188*9c5db199SXin Li                    pkgmgr.upload_pkg(tarball_path, update_checksum=True)
189*9c5db199SXin Li                else:
190*9c5db199SXin Li                    logging.warning('Checksum not changed for %s, not copied '
191*9c5db199SXin Li                                    'in packages/ directory.', tarball_path)
192*9c5db199SXin Li            finally:
193*9c5db199SXin Li                # remove the temporary directory
194*9c5db199SXin Li                shutil.rmtree(temp_dir)
195*9c5db199SXin Li        elif action == ACTION_REMOVE:
196*9c5db199SXin Li            pkgmgr.remove_pkg(pkg_name, remove_checksum=True)
197*9c5db199SXin Li        print("Done.")
198*9c5db199SXin Li
199*9c5db199SXin Li
200*9c5db199SXin Lidef tar_packages(pkgmgr, pkg_type, pkg_names, src_dir, temp_dir):
201*9c5db199SXin Li    """Tar all packages up and return a list of each tar created"""
202*9c5db199SXin Li    tarballs = []
203*9c5db199SXin Li    exclude_string = ' .'
204*9c5db199SXin Li    names = [p.strip() for p in pkg_names.split(',')]
205*9c5db199SXin Li    for name in names:
206*9c5db199SXin Li        print("tar_packages: Processing %s ... " % name)
207*9c5db199SXin Li        if pkg_type == 'client':
208*9c5db199SXin Li            pkg_dir = src_dir
209*9c5db199SXin Li            exclude_string = get_exclude_string(pkg_dir)
210*9c5db199SXin Li        elif pkg_type == 'test':
211*9c5db199SXin Li            # if the package is a test then look whether it is in client/tests
212*9c5db199SXin Li            # or client/site_tests
213*9c5db199SXin Li            pkg_dir = os.path.join(get_test_dir(name, src_dir), name)
214*9c5db199SXin Li        else:
215*9c5db199SXin Li            # for the profilers and deps
216*9c5db199SXin Li            pkg_dir = os.path.join(src_dir, name)
217*9c5db199SXin Li
218*9c5db199SXin Li        pkg_name = pkgmgr.get_tarball_name(name, pkg_type)
219*9c5db199SXin Li
220*9c5db199SXin Li        # We don't want any pre-existing tarballs and checksums to
221*9c5db199SXin Li        # be repackaged, so we should purge these.
222*9c5db199SXin Li        exclude_string_tar = ((
223*9c5db199SXin Li            ' --exclude="**%s" --exclude="**%s.checksum" ' %
224*9c5db199SXin Li            (pkg_name, pkg_name)) + exclude_string)
225*9c5db199SXin Li        # Check if tarball already exists. If it does, don't duplicate
226*9c5db199SXin Li        # the effort.
227*9c5db199SXin Li        tarball_path = os.path.join(pkg_dir, pkg_name)
228*9c5db199SXin Li        if os.path.exists(tarball_path):
229*9c5db199SXin Li          print("tar_packages: Tarball %s already exists" % tarball_path)
230*9c5db199SXin Li        else:
231*9c5db199SXin Li            tarball_path = pkgmgr.tar_package(pkg_name, pkg_dir,
232*9c5db199SXin Li                                              temp_dir, exclude_string_tar)
233*9c5db199SXin Li        tarballs.append(tarball_path)
234*9c5db199SXin Li    return tarballs
235*9c5db199SXin Li
236*9c5db199SXin Li
237*9c5db199SXin Lidef process_all_packages(pkgmgr, client_dir, action):
238*9c5db199SXin Li    """Process a full upload of packages as a directory upload."""
239*9c5db199SXin Li    dep_dir = os.path.join(client_dir, "deps")
240*9c5db199SXin Li    prof_dir = os.path.join(client_dir, "profilers")
241*9c5db199SXin Li    # Directory where all are kept
242*9c5db199SXin Li    temp_dir = tempfile.mkdtemp()
243*9c5db199SXin Li    try:
244*9c5db199SXin Li        packages.check_diskspace(temp_dir)
245*9c5db199SXin Li    except error.RepoDiskFullError as e:
246*9c5db199SXin Li        print("Temp destination for packages is full %s, aborting upload: %s"
247*9c5db199SXin Li               % (temp_dir, e))
248*9c5db199SXin Li        os.rmdir(temp_dir)
249*9c5db199SXin Li        sys.exit(1)
250*9c5db199SXin Li
251*9c5db199SXin Li    # process tests
252*9c5db199SXin Li    tests_list = get_subdir_list('tests', client_dir)
253*9c5db199SXin Li    tests = ','.join(tests_list)
254*9c5db199SXin Li
255*9c5db199SXin Li    # process site_tests
256*9c5db199SXin Li    site_tests_list = get_subdir_list('site_tests', client_dir)
257*9c5db199SXin Li    site_tests = ','.join(site_tests_list)
258*9c5db199SXin Li
259*9c5db199SXin Li    # process deps
260*9c5db199SXin Li    deps_list = get_subdir_list('deps', client_dir)
261*9c5db199SXin Li    deps = ','.join(deps_list)
262*9c5db199SXin Li
263*9c5db199SXin Li    # process profilers
264*9c5db199SXin Li    profilers_list = get_subdir_list('profilers', client_dir)
265*9c5db199SXin Li    profilers = ','.join(profilers_list)
266*9c5db199SXin Li
267*9c5db199SXin Li    # Update md5sum
268*9c5db199SXin Li    if action == ACTION_UPLOAD:
269*9c5db199SXin Li        all_packages = []
270*9c5db199SXin Li        all_packages.extend(tar_packages(pkgmgr, 'profiler', profilers,
271*9c5db199SXin Li                                         prof_dir, temp_dir))
272*9c5db199SXin Li        all_packages.extend(tar_packages(pkgmgr, 'dep', deps, dep_dir,
273*9c5db199SXin Li                                         temp_dir))
274*9c5db199SXin Li        all_packages.extend(tar_packages(pkgmgr, 'test', site_tests,
275*9c5db199SXin Li                                         client_dir, temp_dir))
276*9c5db199SXin Li        all_packages.extend(tar_packages(pkgmgr, 'test', tests, client_dir,
277*9c5db199SXin Li                                         temp_dir))
278*9c5db199SXin Li        all_packages.extend(tar_packages(pkgmgr, 'client', 'autotest',
279*9c5db199SXin Li                                         client_dir, temp_dir))
280*9c5db199SXin Li        for package in all_packages:
281*9c5db199SXin Li            pkgmgr.upload_pkg(package, update_checksum=True)
282*9c5db199SXin Li        client_utils.run('rm -rf ' + temp_dir)
283*9c5db199SXin Li    elif action == ACTION_REMOVE:
284*9c5db199SXin Li        process_packages(pkgmgr, 'test', tests, client_dir, action=action)
285*9c5db199SXin Li        process_packages(pkgmgr, 'test', site_tests, client_dir, action=action)
286*9c5db199SXin Li        process_packages(pkgmgr, 'client', 'autotest', client_dir,
287*9c5db199SXin Li                         action=action)
288*9c5db199SXin Li        process_packages(pkgmgr, 'dep', deps, dep_dir, action=action)
289*9c5db199SXin Li        process_packages(pkgmgr, 'profiler', profilers, prof_dir,
290*9c5db199SXin Li                         action=action)
291*9c5db199SXin Li
292*9c5db199SXin Li
293*9c5db199SXin Li# Get the list of sub directories present in a directory
294*9c5db199SXin Lidef get_subdir_list(name, client_dir):
295*9c5db199SXin Li    dir_name = os.path.join(client_dir, name)
296*9c5db199SXin Li    return [f for f in
297*9c5db199SXin Li            os.listdir(dir_name)
298*9c5db199SXin Li            if os.path.isdir(os.path.join(dir_name, f)) ]
299*9c5db199SXin Li
300*9c5db199SXin Li
301*9c5db199SXin Li# Look whether the test is present in client/tests and client/site_tests dirs
302*9c5db199SXin Lidef get_test_dir(name, client_dir):
303*9c5db199SXin Li    names_test = os.listdir(os.path.join(client_dir, 'tests'))
304*9c5db199SXin Li    names_site_test = os.listdir(os.path.join(client_dir, 'site_tests'))
305*9c5db199SXin Li    if name in names_test:
306*9c5db199SXin Li        src_dir = os.path.join(client_dir, 'tests')
307*9c5db199SXin Li    elif name in names_site_test:
308*9c5db199SXin Li        src_dir = os.path.join(client_dir, 'site_tests')
309*9c5db199SXin Li    else:
310*9c5db199SXin Li        print("Test %s not found" % name)
311*9c5db199SXin Li        sys.exit(0)
312*9c5db199SXin Li    return src_dir
313*9c5db199SXin Li
314*9c5db199SXin Li
315*9c5db199SXin Lidef main():
316*9c5db199SXin Li    # get options and args
317*9c5db199SXin Li    options, args = parse_args()
318*9c5db199SXin Li
319*9c5db199SXin Li    server_dir = server_utils.get_server_dir()
320*9c5db199SXin Li    autotest_dir = os.path.abspath(os.path.join(server_dir, '..'))
321*9c5db199SXin Li
322*9c5db199SXin Li    # extract the pkg locations from global config
323*9c5db199SXin Li    repo_urls = c.get_config_value('PACKAGES', 'fetch_location',
324*9c5db199SXin Li                                   type=list, default=[])
325*9c5db199SXin Li    upload_paths = c.get_config_value('PACKAGES', 'upload_location',
326*9c5db199SXin Li                                      type=list, default=[])
327*9c5db199SXin Li
328*9c5db199SXin Li    if options.repo:
329*9c5db199SXin Li        upload_paths.append(options.repo)
330*9c5db199SXin Li
331*9c5db199SXin Li    # Having no upload paths basically means you're not using packaging.
332*9c5db199SXin Li    if not upload_paths:
333*9c5db199SXin Li        print("No upload locations found. Please set upload_location under"
334*9c5db199SXin Li              " PACKAGES in the global_config.ini or provide a location using"
335*9c5db199SXin Li              " the --repository option.")
336*9c5db199SXin Li        return
337*9c5db199SXin Li
338*9c5db199SXin Li    client_dir = os.path.join(autotest_dir, "client")
339*9c5db199SXin Li
340*9c5db199SXin Li    # Bail out if the client directory does not exist
341*9c5db199SXin Li    if not os.path.exists(client_dir):
342*9c5db199SXin Li        sys.exit(0)
343*9c5db199SXin Li
344*9c5db199SXin Li    dep_dir = os.path.join(client_dir, "deps")
345*9c5db199SXin Li    prof_dir = os.path.join(client_dir, "profilers")
346*9c5db199SXin Li
347*9c5db199SXin Li    # Due to the delayed uprev-ing of certain ebuilds, we need to support
348*9c5db199SXin Li    # both the legacy command line and the new one.
349*9c5db199SXin Li    # So, if the new "action" option isn't specified, try looking for the
350*9c5db199SXin Li    # old style remove/upload argument
351*9c5db199SXin Li    if options.action is None:
352*9c5db199SXin Li        if len(args) == 0 or args[0] not in ['upload', 'remove']:
353*9c5db199SXin Li            print("Either 'upload' or 'remove' needs to be specified "
354*9c5db199SXin Li                  "for the package")
355*9c5db199SXin Li            sys.exit(0)
356*9c5db199SXin Li        cur_action = args[0]
357*9c5db199SXin Li    else:
358*9c5db199SXin Li        cur_action = options.action
359*9c5db199SXin Li
360*9c5db199SXin Li    if cur_action == ACTION_TAR_ONLY and options.output_dir is None:
361*9c5db199SXin Li        print("An output dir has to be specified")
362*9c5db199SXin Li        sys.exit(0)
363*9c5db199SXin Li
364*9c5db199SXin Li    pkgmgr = packages.PackageManager(autotest_dir, repo_urls=repo_urls,
365*9c5db199SXin Li                                     upload_paths=upload_paths,
366*9c5db199SXin Li                                     run_function_dargs={'timeout':600})
367*9c5db199SXin Li
368*9c5db199SXin Li    if options.all:
369*9c5db199SXin Li        process_all_packages(pkgmgr, client_dir, action=cur_action)
370*9c5db199SXin Li
371*9c5db199SXin Li    if options.client:
372*9c5db199SXin Li        process_packages(pkgmgr, 'client', 'autotest', client_dir,
373*9c5db199SXin Li                         action=cur_action)
374*9c5db199SXin Li
375*9c5db199SXin Li    if options.dep:
376*9c5db199SXin Li        process_packages(pkgmgr, 'dep', options.dep, dep_dir,
377*9c5db199SXin Li                         action=cur_action, dest_dir=options.output_dir)
378*9c5db199SXin Li
379*9c5db199SXin Li    if options.test:
380*9c5db199SXin Li        process_packages(pkgmgr, 'test', options.test, client_dir,
381*9c5db199SXin Li                         action=cur_action, dest_dir=options.output_dir)
382*9c5db199SXin Li
383*9c5db199SXin Li    if options.prof:
384*9c5db199SXin Li        process_packages(pkgmgr, 'profiler', options.prof, prof_dir,
385*9c5db199SXin Li                         action=cur_action, dest_dir=options.output_dir)
386*9c5db199SXin Li
387*9c5db199SXin Li    if options.file:
388*9c5db199SXin Li        if cur_action == ACTION_REMOVE:
389*9c5db199SXin Li            pkgmgr.remove_pkg(options.file, remove_checksum=True)
390*9c5db199SXin Li        elif cur_action == ACTION_UPLOAD:
391*9c5db199SXin Li            pkgmgr.upload_pkg(options.file, update_checksum=True)
392*9c5db199SXin Li
393*9c5db199SXin Li
394*9c5db199SXin Liif __name__ == "__main__":
395*9c5db199SXin Li    main()
396