#!/usr/bin/env python
#
# Copyright 2020 Google LLC
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


"""Bulk abandon Gerrit CLs."""


import argparse
import os
import re
import subprocess
import sys

from infra import git
from infra import go


def run_abandon_cls(args):
  """Bulk abandon Gerrit CLs."""
  go.mod_download()
  go.install(go.INFRA_GO+'/scripts/abandon_gerrit_cls')
  subprocess.check_call([
      'abandon_gerrit_cls',
      '--gerrit_instance', args.gerrit_instance,
      '--abandon_reason', args.abandon_reason,
      '--last_modified_before_days', str(args.last_modified_before_days),
  ])


def main():
  # TODO(rmistry): Instead of attempting to keep these args in sync, defer to
  # abandon_gerrit_cls for argument parsing.
  d = 'Helper script for bulk abandoning gerrit CLs'
  parser = argparse.ArgumentParser(description=d)
  parser.add_argument(
      '--gerrit-instance', '-g', default='https://skia-review.googlesource.com',
      help='Name of the gerrit instance.')
  parser.add_argument(
      '--abandon-reason', '-a', default='',
      help='Will be used as reason for abandoning.')
  parser.add_argument(
      '--last-modified-before-days', '-l', default=0,
      help='If 3 is specified then all CLs that were modified after 3 days ago '
           'will be returned.')
  args = parser.parse_args()

  go.check()
  run_abandon_cls(args)


if __name__ == '__main__':
  main()
