Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: releaseAutomation.py

Issue 29508667: Issue 4354, 4355 - handle dirty/outdated repos on release (Closed)
Patch Set: Adjusting error message, removing complexity, increasing readability Created Aug. 15, 2017, 2:38 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # This Source Code Form is subject to the terms of the Mozilla Public 1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this 2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
4 4 from __future__ import print_function
Sebastian Noack 2017/08/15 15:54:45 I would add a blank line below __future__ imports.
tlucas 2017/08/16 08:38:15 Done.
5 import os 5 import os
6 import re 6 import re
7 import codecs 7 import codecs
8 import subprocess 8 import subprocess
9 import tarfile 9 import tarfile
10 import json 10 import json
11 11
12 from packager import readMetadata, getDefaultFileName 12 from packager import readMetadata, getDefaultFileName
13 13
14 14
(...skipping 23 matching lines...) Expand all
38 if os.path.basename(fileinfo.name) in ('.hgtags', '.hgig nore'): 38 if os.path.basename(fileinfo.name) in ('.hgtags', '.hgig nore'):
39 continue 39 continue
40 filedata = repoarchive.extractfile(fileinfo) 40 filedata = repoarchive.extractfile(fileinfo)
41 fileinfo.name = re.sub(r'^[^/]+/', prefix, fileinfo.name ) 41 fileinfo.name = re.sub(r'^[^/]+/', prefix, fileinfo.name )
42 archive.addfile(fileinfo, filedata) 42 archive.addfile(fileinfo, filedata)
43 finally: 43 finally:
44 process.stdout.close() 44 process.stdout.close()
45 process.wait() 45 process.wait()
46 46
47 47
48 def repo_has_uncommitted():
49 """Checks if the given repository is clean"""
50 buff = subprocess.check_output(['hg', 'status'])
51
52 if len(buff):
53 print('Dirty / uncommitted changes in repository!')
54 return True
55
56 return False
57
58
59 def repo_has_outgoing():
60 """Checks whether there would be outgoing changesets to the given path"""
61 try:
62 subprocess.check_output(['hg', 'outgoing'])
63 print('Detected outgoing changesets!')
64 return True
65 except subprocess.CalledProcessError:
66 return False
Sebastian Noack 2017/08/15 15:54:45 What is if an unexpected exit code occurs? I think
tlucas 2017/08/16 08:38:15 Done.
67
68
69 def repo_has_incoming(repo_paths):
70 """Checks whether the local repositories are up-to-date"""
71 incoming = False
72
73 for repo_path in repo_paths:
74 try:
75 subprocess.check_output(['hg', 'incoming', '-R', repo_path])
76 print('Detected incoming changesets in "{}"'.format(repo_path))
77 incoming = True
78 except subprocess.CalledProcessError:
79 pass
80
81 return incoming
82
83
84 def continue_with_outgoing():
85 """Asks the user if he wants to continue despite facing warnings"""
86
87 print('If you proceed with the release, they will be included in the '
88 'release and pushed.')
89 print('Are you sure about continuing the release-process?')
90
91 while True:
92 choice = raw_input('Please choose (yes / no): ').lower()
93
94 if choice == 'yes':
95 return True
96 if choice == 'no':
97 return False
98
99 print('Please answer "yes" or "no"!')
100
101
48 def run(baseDir, type, version, keyFile, downloadsRepo): 102 def run(baseDir, type, version, keyFile, downloadsRepo):
103 # run repository-checks and bail out early, in case the user does not
104 # explicitly want to continue OR if the check would cause the process to
105 # abort anyway
106 def can_safely_release():
Sebastian Noack 2017/08/15 15:54:45 Do you really need a function here? Wouldn't this
tlucas 2017/08/16 08:38:15 I don't, but the equivalent would be: can_safely_
Sebastian Noack 2017/08/16 08:48:35 I guess, it is OK to keep the function. But then t
tlucas 2017/08/16 08:53:23 Agreed, Done.
107 if repo_has_uncommitted():
108 return False
109 if repo_has_incoming():
110 return False
111 if repo_has_outgoing():
112 return continue_with_outgoing()
113
114 if not can_safely_release():
115 print('Aborting release.')
116 return 1
117
49 if type == 'gecko': 118 if type == 'gecko':
50 import buildtools.packagerGecko as packager 119 import buildtools.packagerGecko as packager
51 elif type == 'safari': 120 elif type == 'safari':
52 import buildtools.packagerSafari as packager 121 import buildtools.packagerSafari as packager
53 elif type == 'edge': 122 elif type == 'edge':
54 import buildtools.packagerEdge as packager 123 import buildtools.packagerEdge as packager
55 elif type == 'chrome': 124 elif type == 'chrome':
56 import buildtools.packagerChrome as packager 125 import buildtools.packagerChrome as packager
57 126
58 # Replace version number in metadata file "manually", ConfigParser will mess 127 # Replace version number in metadata file "manually", ConfigParser will mess
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 create_sourcearchive(baseDir, archivePath) 185 create_sourcearchive(baseDir, archivePath)
117 downloads.append(archivePath) 186 downloads.append(archivePath)
118 187
119 # Now add the downloads and commit 188 # Now add the downloads and commit
120 subprocess.check_call(['hg', 'add', '-R', downloadsRepo] + downloads) 189 subprocess.check_call(['hg', 'add', '-R', downloadsRepo] + downloads)
121 subprocess.check_call(['hg', 'commit', '-R', downloadsRepo, '-m', 'Releasing %s %s' % (extensionName, version)]) 190 subprocess.check_call(['hg', 'commit', '-R', downloadsRepo, '-m', 'Releasing %s %s' % (extensionName, version)])
122 191
123 # Push all changes 192 # Push all changes
124 subprocess.check_call(['hg', 'push', '-R', baseDir]) 193 subprocess.check_call(['hg', 'push', '-R', baseDir])
125 subprocess.check_call(['hg', 'push', '-R', downloadsRepo]) 194 subprocess.check_call(['hg', 'push', '-R', downloadsRepo])
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld