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

Unified Diff: releaseAutomation.py

Issue 29508667: Issue 4354, 4355 - handle dirty/outdated repos on release (Closed)
Patch Set: Created Aug. 16, 2017, 11:24 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: releaseAutomation.py
diff --git a/releaseAutomation.py b/releaseAutomation.py
index 5578abf1d948fe185e046cdb70ccd4734fa876ed..34f426d40126634da2ce6e4fac7b586ba3af04a9 100644
--- a/releaseAutomation.py
+++ b/releaseAutomation.py
@@ -2,6 +2,8 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+from __future__ import print_function
+
import os
import re
import codecs
@@ -45,7 +47,76 @@ def create_sourcearchive(repo, output):
process.wait()
+def repo_has_uncommitted():
+ """Checks if the given repository is clean"""
+ buff = subprocess.check_output(['hg', 'status'])
+
+ if len(buff):
+ print('Dirty / uncommitted changes in repository!')
+ return True
+
+ return False
+
+
+def repo_has_outgoing():
+ """Checks whether there would be outgoing changesets to the given path"""
+ try:
+ subprocess.check_output(['hg', 'outgoing'])
+ print('Detected outgoing changesets!')
+ return True
+ except subprocess.CalledProcessError as e:
+ if e.returncode == 1:
+ return False
+ raise
+
+
+def repo_has_incoming(*repo_paths):
+ """Checks whether the local repositories are up-to-date"""
+ incoming = False
+
+ for repo_path in repo_paths:
+ try:
+ subprocess.check_output(['hg', 'incoming', '-R', repo_path])
+ print('Detected incoming changesets in "{}"'.format(repo_path))
+ incoming = True
+ except subprocess.CalledProcessError as e:
+ if e.returncode != 1:
+ raise
+
+ return incoming
+
+
+def continue_with_outgoing():
+ """Asks the user if they want to continue despite facing warnings"""
+
+ print('If you proceed with the release, they will be included in the '
+ 'release and pushed.')
+ print('Are you sure about continuing the release process?')
+
+ while True:
+ choice = raw_input('Please choose (yes / no): ').lower().strip()
+
+ if choice == 'yes':
+ return True
+ if choice == 'no':
+ return False
+
+
+def can_safely_release(*repo_paths):
+ """Run repository-checks in order to bail out early if necessary"""
+ if repo_has_uncommitted():
+ return False
+ if repo_has_incoming(*repo_paths):
+ return False
+ if repo_has_outgoing():
+ return continue_with_outgoing()
+
+
def run(baseDir, type, version, keyFile, downloadsRepo):
+ if not can_safely_release(baseDir, downloadsRepo):
+ print('Aborting release.')
+ return 1
+
if type == 'gecko':
import buildtools.packagerGecko as packager
elif type == 'safari':
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld