Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Side by Side Diff: infra/bots/assets/asset_utils.py

Issue 2069543002: Add asset management scripts (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Add FYI prints for asset creation Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 #
3 # Copyright 2016 Google Inc.
4 #
5 # Use of this source code is governed by a BSD-style license that can be
6 # found in the LICENSE file.
7
8
9 """Utilities for managing assets."""
10
11
12 import argparse
13 import os
14 import shlex
15 import subprocess
16 import sys
17
18 SKIA_DIR = os.path.abspath(os.path.realpath(os.path.join(
19 os.path.dirname(os.path.abspath(__file__)),
20 os.pardir, os.pardir, os.pardir)))
21 INFRA_BOTS_DIR = os.path.join(SKIA_DIR, 'infra', 'bots')
22 sys.path.insert(0, INFRA_BOTS_DIR)
23 import utils
24 import zip_utils
25
26
27 DEFAULT_GS_BUCKET = 'skia-buildbots'
28 GS_SUBDIR_TMPL = 'gs://%s/assets/%s'
29 GS_PATH_TMPL = '%s/%s.zip'
30 VERSION_FILENAME = 'VERSION'
31 ZIP_BLACKLIST = ['.git', '.svn', '*.pyc', '.DS_STORE']
32
33
34 class _GSWrapper(object):
35 """Wrapper object for interacting with Google Storage."""
36 def __init__(self, gsutil):
37 gsutil = os.path.abspath(gsutil) if gsutil else 'gsutil'
38 self._gsutil = [gsutil]
39 if gsutil.endswith('.py'):
40 self._gsutil = ['python', gsutil]
41
42 def copy(self, src, dst):
43 """Copy src to dst."""
44 subprocess.check_call(self._gsutil + ['cp', src, dst])
45
46 def list(self, path):
47 """List objects in the given path."""
48 try:
49 return subprocess.check_output(self._gsutil + ['ls', path]).splitlines()
50 except subprocess.CalledProcessError:
51 # If the prefix does not exist, we'll get an error, which is okay.
52 return []
53
54
55 class Asset(object):
56 def __init__(self, name, gs_bucket, gsutil=None):
57 self._gs = _GSWrapper(gsutil)
58 self._gs_subdir = GS_SUBDIR_TMPL % (gs_bucket, name)
59 self._name = name
60
61 @property
62 def version_file(self):
63 """Return the path to the version file for this asset."""
64 return os.path.join(SKIA_DIR, 'infra', 'bots', 'assets', self._name,
65 VERSION_FILENAME)
66
67 def get_current_version(self):
68 """Obtain the current version of the asset."""
69 with open(self.version_file) as f:
70 return int(f.read())
71
72 def get_available_versions(self):
73 """Return the existing version numbers for this asset."""
74 files = self._gs.list(self._gs_subdir)
75 bnames = [os.path.basename(f) for f in files]
76 suffix = '.zip'
77 versions = [int(f[:-len(suffix)]) for f in bnames if f.endswith(suffix)]
78 versions.sort()
79 return versions
80
81 def get_next_version(self):
82 """Find the next available version number for the asset."""
83 versions = self.get_available_versions()
84 if len(versions) == 0:
85 return 0
86 return versions[-1] + 1
87
88 def download_version(self, version, target_dir):
89 """Download the specified version of the asset."""
90 gs_path = GS_PATH_TMPL % (self._gs_subdir, str(version))
91 target_dir = os.path.abspath(target_dir)
92 with utils.tmp_dir():
93 zip_file = os.path.join(os.getcwd(), '%d.zip' % version)
94 self._gs.copy(gs_path, zip_file)
95 zip_utils.unzip(zip_file, target_dir)
96
97 def download_current_version(self, target_dir):
98 """Download the version of the asset specified in its version file."""
99 v = self.get_current_version()
100 self.download_version(v, target_dir)
101
102 def upload_new_version(self, target_dir, commit=False):
103 """Upload a new version and update the version file for the asset."""
104 version = self.get_next_version()
105 target_dir = os.path.abspath(target_dir)
106 with utils.tmp_dir():
107 zip_file = os.path.join(os.getcwd(), '%d.zip' % version)
108 zip_utils.zip(target_dir, zip_file, blacklist=ZIP_BLACKLIST)
109 gs_path = GS_PATH_TMPL % (self._gs_subdir, str(version))
110 self._gs.copy(zip_file, gs_path)
111
112 def _write_version():
113 with open(self.version_file, 'w') as f:
114 f.write(str(version))
115 subprocess.check_call([utils.GIT, 'add', self.version_file])
116
117 with utils.chdir(SKIA_DIR):
rmistry 2016/06/15 13:47:18 Does this have to go to SKIA_DIR for the below to
borenet 2016/06/15 14:31:27 I change to SKIA_DIR for the git commit stuff, jus
118 if commit:
119 with utils.git_branch():
120 _write_version()
121 subprocess.check_call([
122 utils.GIT, 'commit', '-m', 'Update %s version' % self._name])
123 subprocess.check_call([utils.GIT, 'cl', 'upload', '--bypass-hooks'])
124 else:
125 _write_version()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698