Index: cros_mark_as_stable.py |
diff --git a/cros_mark_as_stable.py b/cros_mark_as_stable.py |
index 56978f95a2902a701d846177b8a8cc63dac725ed..dd3192cb5097f3166c8c95eb4663c1b44d92bb9e 100755 |
--- a/cros_mark_as_stable.py |
+++ b/cros_mark_as_stable.py |
@@ -23,16 +23,16 @@ import generate_test_report |
gflags.DEFINE_string('board', 'x86-generic', |
'Board for which the package belongs.', short_name='b') |
gflags.DEFINE_string('commit_ids', '', |
- '''Optional list of commit ids for each package. |
+ """Optional list of commit ids for each package. |
This list must either be empty or have the same length as |
the packages list. If not set all rev'd ebuilds will have |
- empty commit id's.''', |
+ empty commit id's.""", |
short_name='i') |
gflags.DEFINE_string('packages', '', |
'Space separated list of packages to mark as stable.', |
short_name='p') |
-gflags.DEFINE_boolean('push', False, |
- 'Creates, commits and pushes the stable ebuild.') |
+gflags.DEFINE_string('push_options', '', |
+ 'Options to use with git-cl push using push command.') |
gflags.DEFINE_boolean('verbose', False, |
'Prints out verbose information about what is going on.', |
short_name='v') |
@@ -47,6 +47,18 @@ _CHROMIUMOS_OVERLAYS_DIRECTORY = \ |
_GIT_COMMIT_MESSAGE = \ |
'Marking 9999 ebuild for %s with commit %s as stable.' |
+# Dictionary of valid commands with usage information. |
+_COMMAND_DICTIONARY = { |
+ 'clean': |
+ 'Cleans up previous calls to either commit or push', |
+ 'commit': |
+ 'Marks given ebuilds as stable locally', |
+ 'push': |
+ 'Pushes previous marking of ebuilds to remote repo', |
+ } |
+ |
+# Name used for stabilizing branch. |
+_STABLE_BRANCH_NAME = 'stabilizing_branch' |
# ======================= Global Helper Functions ======================== |
@@ -56,23 +68,67 @@ def _Print(message): |
if gflags.FLAGS.verbose: |
print message |
- |
-def _CheckSaneArguments(package_list, commit_id_list): |
- """Checks to make sure the flags are sane. Dies if arguments are not sane""" |
- if not gflags.FLAGS.packages: |
- generate_test_report.Die('Please specify at least one package') |
- if not gflags.FLAGS.board: |
- generate_test_report.Die('Please specify a board') |
+def _CheckOnStabilizingBranch(): |
+ """Returns true if the git branch is on the stabilizing branch.""" |
+ current_branch = _RunCommand('git branch | grep \*').split()[1] |
+ return current_branch == _STABLE_BRANCH_NAME |
+ |
+def _CheckSaneArguments(package_list, commit_id_list, command): |
+ """Checks to make sure the flags are sane. Dies if arguments are not sane.""" |
+ if not command in _COMMAND_DICTIONARY.keys(): |
+ _PrintUsageAndDie('%s is not a valid command' % command) |
+ if not gflags.FLAGS.packages and command == 'commit': |
+ _PrintUsageAndDie('Please specify at least one package') |
+ if not gflags.FLAGS.board and command == 'commit': |
+ _PrintUsageAndDie('Please specify a board') |
if commit_id_list and (len(package_list) != len(commit_id_list)): |
- print commit_id_list |
- print len(commit_id_list) |
- generate_test_report.Die( |
+ _PrintUsageAndDie( |
'Package list is not the same length as the commit id list') |
-def _PrintUsageAndDie(): |
- """Prints the usage and returns an error exit code.""" |
- generate_test_report.Die('Usage: %s ARGS\n%s' % (sys.argv[0], gflags.FLAGS)) |
+def _Clean(): |
+ """Cleans up uncommitted changes on either stabilizing branch or master.""" |
+ if _CheckOnStabilizingBranch(): |
+ _RunCommand('git reset HEAD --hard') |
+ _RunCommand('git checkout master') |
+ _RunCommand('git reset HEAD --hard') |
+ |
+ |
+def _PrintUsageAndDie(error_message=''): |
+ """Prints optional error_message the usage and returns an error exit code.""" |
+ command_usage = 'Commands: \n' |
+ # Add keys and usage information from dictionary. |
+ commands = sorted(_COMMAND_DICTIONARY.keys()) |
+ for command in commands: |
+ command_usage += ' %s: %s\n' % (command, _COMMAND_DICTIONARY[command]) |
+ commands_str = '|'.join(commands) |
+ print 'Usage: %s FLAGS [%s]\n\n%s\nFlags:%s' % (sys.argv[0], commands_str, |
+ command_usage, gflags.FLAGS) |
+ if error_message: |
+ generate_test_report.Die(error_message) |
+ else: |
+ sys.exit(1) |
+ |
+ |
+def _PushChange(): |
+ """Pushes changes to the git repository. |
+ |
+ Pushes locals commits from calls to CommitChange to the remote git |
+ repository specified by os.pwd. |
+ |
+ Raises: |
+ OSError: Error occurred while pushing. |
+ """ |
+ |
+ # TODO(sosa) - Add logic for buildbot to check whether other slaves have |
+ # completed and push this change only if they have. |
+ |
+ # Sanity check to make sure we're on a stabilizing branch before pushing. |
+ if not _CheckOnStabilizingBranch(): |
+ generate_test_report.Die('Expected %s to be on branch "%s"' % |
+ (_CHROMIUMOS_OVERLAYS_DIRECTORY, |
+ _STABLE_BRANCH_NAME)) |
+ _RunCommand('git cl push %s' % gflags.FLAGS.push_options) |
def _RunCommand(command): |
@@ -91,12 +147,6 @@ class _GitBranch(object): |
def __init__(self, branch_name): |
"""Sets up variables but does not create the branch.""" |
self.branch_name = branch_name |
- self._cleaned_up = False |
- |
- def __del__(self): |
- """Ensures we're checked back out to the master branch.""" |
- if not self._cleaned_up: |
- self.CleanUp() |
def CreateBranch(self): |
"""Creates a new git branch or replaces an existing one.""" |
@@ -104,11 +154,6 @@ class _GitBranch(object): |
self.Delete() |
self._Checkout(self.branch_name) |
- def CleanUp(self): |
- """Does a git checkout back to the master branch.""" |
- self._Checkout('master', create=False) |
- self._cleaned_up = True |
- |
def _Checkout(self, target, create=True): |
"""Function used internally to create and move between branches.""" |
if create: |
@@ -259,69 +304,56 @@ class EBuildStableMarker(object): |
git_commit_cmd = 'git commit -am "%s"' % message |
_RunCommand(git_commit_cmd) |
- # TODO(sosa): This doesn't work yet. Want to directly push without a prompt. |
- def PushChange(self): |
- """Pushes changes to the git repository. |
- |
- Pushes locals commits from calls to CommitChange to the remote git |
- repository specified by os.pwd. |
- |
- Raises: |
- OSError: Error occurred while pushing. |
- """ |
- print 'Push currently not implemented' |
- # TODO(sosa): Un-comment once PushChange works. |
- # _Print('Pushing changes for %s' % self._ebuild.package) |
- # git_commit_cmd = 'git push' |
- # _RunCommand(git_commit_cmd) |
- |
def main(argv): |
try: |
argv = gflags.FLAGS(argv) |
- except gflags.FlagsError: |
- _PrintUsageAndDie() |
+ if len(argv) != 2: |
+ _PrintUsageAndDie('Must specify a valid command') |
+ else: |
+ command = argv[1] |
+ except gflags.FlagsError, e : |
+ _PrintUsageAndDie(str(e)) |
package_list = gflags.FLAGS.packages.split(' ') |
if gflags.FLAGS.commit_ids: |
commit_id_list = gflags.FLAGS.commit_ids.split(' ') |
else: |
commit_id_list = None |
- _CheckSaneArguments(package_list, commit_id_list) |
+ _CheckSaneArguments(package_list, commit_id_list, command) |
- pwd = os.curdir |
os.chdir(_CHROMIUMOS_OVERLAYS_DIRECTORY) |
- work_branch = _GitBranch('stabilizing_branch') |
- work_branch.CreateBranch() |
- if not work_branch.Exists(): |
- generate_test_report.Die('Unable to create stabilizing branch') |
- index = 0 |
- try: |
- for index in range(len(package_list)): |
- # Gather the package and optional commit id to work on. |
- package = package_list[index] |
- commit_id = "" |
- if commit_id_list: |
- commit_id = commit_id_list[index] |
- |
- _Print('Working on %s' % package) |
- worker = EBuildStableMarker(_EBuild(package, commit_id)) |
- worker.RevEBuild(commit_id) |
- worker.CommitChange(_GIT_COMMIT_MESSAGE % (package, commit_id)) |
- if gflags.FLAGS.push: |
- worker.PushChange() |
- |
- except (OSError, IOError): |
- print 'An exception occurred %s' % sys.exc_info()[0] |
- print 'Only the following packages were revved: %s' % package_list[:index] |
- print '''Note you will have to go into the chromiumos-overlay directory and |
- reset the git repo yourself. |
- ''' |
- finally: |
- # Always run the last two cleanup functions. |
- work_branch.CleanUp() |
- os.chdir(pwd) |
+ if command == 'clean': |
+ _Clean() |
+ elif command == 'commit': |
+ work_branch = _GitBranch(_STABLE_BRANCH_NAME) |
+ work_branch.CreateBranch() |
+ if not work_branch.Exists(): |
+ generate_test_report.Die('Unable to create stabilizing branch in %s' % |
+ _CHROMIUMOS_OVERLAYS_DIRECTORY) |
+ index = 0 |
+ try: |
+ for index in range(len(package_list)): |
+ # Gather the package and optional commit id to work on. |
+ package = package_list[index] |
+ commit_id = "" |
+ if commit_id_list: |
+ commit_id = commit_id_list[index] |
+ |
+ _Print('Working on %s' % package) |
+ worker = EBuildStableMarker(_EBuild(package, commit_id)) |
+ worker.RevEBuild(commit_id) |
+ worker.CommitChange(_GIT_COMMIT_MESSAGE % (package, commit_id)) |
+ |
+ except (OSError, IOError), e: |
+ print ('An exception occurred %s\n' |
+ 'Only the following packages were revved: %s\n' |
+ 'Note you will have to go into %s' |
+ 'and reset the git repo yourself.' % |
+ (e, package_list[:index], _CHROMIUMOS_OVERLAYS_DIRECTORY)) |
+ elif command == 'push': |
+ _PushChange() |
if __name__ == '__main__': |