#!/usr/bin/env python3
# Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

import argparse
import sys

import gmaven
import utils

ARCHIVE_BUCKET = 'r8-releases'
REPO = 'https://github.com/google/smali'

def parse_options():
  result = argparse.ArgumentParser(description='Release Smali')
  result.add_argument('--version',
                      required=True,
                      metavar=('<version>'),
                      help='The version of smali to release.')
  result.add_argument('--dry-run',
                      default=False,
                      action='store_true',
                      help='Only perform non-commiting tasks and print others.')
  return result.parse_args()


def Main():
  options = parse_options()
  utils.check_gcert()
  gfile = ('/bigstore/r8-releases/smali/%s/smali-maven-release-%s.zip'
       % (options.version, options.version))
  release_id = gmaven.publisher_stage([gfile], options.dry_run)

  print('Staged Release ID %s.\n' % release_id)
  gmaven.publisher_stage_redir_test_info(
      release_id, 'com.android.tools.smali:smali:%s' % options.version, 'smali.jar')

  print()
  answer = input('Continue with publishing [y/N]:')

  if answer != 'y':
    print('Aborting release to Google maven')
    sys.exit(1)

  gmaven.publisher_publish(release_id, options.dry_run)

  print()
  print('Published. Use the email workflow for approval.')

if __name__ == '__main__':
  sys.exit(Main())
