#!/usr/bin/python2

# Copyright 2014 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Add message to codereview issue.

This script takes a codereview issue number as its argument and a (possibly
multi-line) message on stdin.  It appends the message to the given issue.

Usage:
  echo MESSAGE | %prog CODEREVIEW_ISSUE
or:
  %prog CODEREVIEW_ISSUE <<EOF
  MESSAGE
  EOF
or:
  %prog --help
"""

import optparse
import sys

import fix_pythonpath  # pylint: disable=W0611
from common.py.utils import find_depot_tools  # pylint: disable=W0611
import rietveld


RIETVELD_URL = 'https://codereview.chromium.org'


def add_codereview_message(issue, message):
  """Add a message to a given codereview.

  Args:
      codereview_url: (string) we will extract the issue number from
          this url, or this could simply be the issue number.
      message: (string) message to add.
  """
  # Passing None for the email and password will result in a prompt or
  # reuse of existing cached credentials.
  my_rietveld = rietveld.Rietveld(RIETVELD_URL, email=None, password=None)
  
  my_rietveld.add_comment(issue, message)


def main(argv):
  """main function; see module-level docstring and GetOptionParser help.

  Args:
      argv: sys.argv[1:]-type argument list.
  """
  option_parser = optparse.OptionParser(usage=__doc__)
  _, arguments = option_parser.parse_args(argv)

  if len(arguments) > 1:
    option_parser.error('Extra arguments.')
  if len(arguments) != 1:
    option_parser.error('Missing issue number.')

  message = sys.stdin.read()
  add_codereview_message(int(arguments[0]), message)


if __name__ == '__main__':
  main(sys.argv[1:])

