#!/usr/bin/env python2.6

# Copyright (c) 2010, Code Aurora Forum. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#    # Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#    # Redistributions in binary form must reproduce the above
#       copyright notice, this list of conditions and the following
#       disclaimer in the documentation and/or other materials provided
#       with the distribution.
#    # Neither the name of Code Aurora Forum, Inc. nor the names of its
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# This script is designed to detect when a patchset uploaded to Gerrit is
# 'identical' (determined via git-patch-id) and reapply reviews onto the new
# patchset from the previous patchset.

# Get usage and help info by running: ./trivial_rebase.py --help
# Documentation is available here: https://www.codeaurora.org/xwiki/bin/QAEP/Gerrit

import json
from optparse import OptionParser
import subprocess

class CheckCallError(OSError):
  """CheckCall() returned non-0."""
  def __init__(self, command, cwd, retcode, stdout, stderr=None):
    OSError.__init__(self, command, cwd, retcode, stdout, stderr)
    self.command = command
    self.cwd = cwd
    self.retcode = retcode
    self.stdout = stdout
    self.stderr = stderr

def CheckCall(command, cwd=None):
  """Like subprocess.check_call() but returns stdout.

  Works on python 2.4
  """
  try:
    process = subprocess.Popen(command, cwd=cwd, stdout=subprocess.PIPE)
    std_out, std_err = process.communicate()
  except OSError, e:
    raise CheckCallError(command, cwd, e.errno, None)
  if process.returncode:
    raise CheckCallError(command, cwd, process.returncode, std_out, std_err)
  return std_out, std_err

def GsqlQuery(sql_query, server, port):
  """Runs a gerrit gsql query and returns the result"""
  gsql_cmd = ['ssh', '-p', port, server, 'gerrit', 'gsql', '--format',
              'JSON', '-c', sql_query]
  try:
    (gsql_out, _gsql_stderr) = CheckCall(gsql_cmd)
  except CheckCallError, e:
    print "return code is %s" % e.retcode
    print "stdout and stderr is\n%s%s" % (e.stdout, e.stderr)
    raise

  new_out = gsql_out.replace('}}\n', '}}\nsplit here\n')
  return new_out.split('split here\n')

def FindPrevRev(changeId, patchset, server, port):
  """Finds the revision of the previous patch set on the change"""
  sql_query = ("\"SELECT revision FROM patch_sets,changes WHERE "
               "patch_sets.change_id = changes.change_id AND "
               "patch_sets.patch_set_id = %s AND "
               "changes.change_key = \'%s\'\"" % ((patchset - 1), changeId))
  revisions = GsqlQuery(sql_query, server, port)

  json_dict = json.loads(revisions[0], strict=False)
  return json_dict["columns"]["revision"]

def GetApprovals(changeId, patchset, server, port):
  """Get all the approvals on a specific patch set

  Returns a list of approval dicts"""
  sql_query = ("\"SELECT value,account_id,category_id FROM patch_set_approvals "
               "WHERE patch_set_id = %s AND change_id = (SELECT change_id FROM "
               "changes WHERE change_key = \'%s\') AND value <> 0\""
               % ((patchset - 1), changeId))
  gsql_out = GsqlQuery(sql_query, server, port)
  approvals = []
  for json_str in gsql_out:
    data = json.loads(json_str, strict=False)
    if data["type"] == "row":
      approvals.append(data["columns"])
  return approvals

def GetEmailFromAcctId(account_id, server, port):
  """Returns the preferred email address associated with the account_id"""
  sql_query = ("\"SELECT preferred_email FROM accounts WHERE account_id = %s\""
               % account_id)
  email_addr = GsqlQuery(sql_query, server, port)

  json_dict = json.loads(email_addr[0], strict=False)
  return json_dict["columns"]["preferred_email"]

def GetPatchId(revision):
  git_show_cmd = ['git', 'show', revision]
  patch_id_cmd = ['git', 'patch-id']
  patch_id_process = subprocess.Popen(patch_id_cmd, stdout=subprocess.PIPE,
                                      stdin=subprocess.PIPE)
  git_show_process = subprocess.Popen(git_show_cmd, stdout=subprocess.PIPE)
  return patch_id_process.communicate(git_show_process.communicate()[0])[0]

def SuExec(server, port, private_key, as_user, cmd):
  suexec_cmd = ['ssh', '-l', "Gerrit Code Review", '-p', port, server, '-i',
                private_key, 'suexec', '--as', as_user, '--', cmd]
  CheckCall(suexec_cmd)

def DiffCommitMessages(commit1, commit2):
  log_cmd1 = ['git', 'log', '--pretty=format:"%an %ae%n%s%n%b"',
              commit1 + '^!']
  commit1_log = CheckCall(log_cmd1)
  log_cmd2 = ['git', 'log', '--pretty=format:"%an %ae%n%s%n%b"',
              commit2 + '^!']
  commit2_log = CheckCall(log_cmd2)
  if commit1_log != commit2_log:
    return True
  return False

def Main():
  server = 'localhost'
  usage = "usage: %prog <required options> [--server-port=PORT]"
  parser = OptionParser(usage=usage)
  parser.add_option("--change", dest="changeId", help="Change identifier")
  parser.add_option("--project", help="Project path in Gerrit")
  parser.add_option("--commit", help="Git commit-ish for this patchset")
  parser.add_option("--patchset", type="int", help="The patchset number")
  parser.add_option("--private-key-path", dest="private_key_path",
                    help="Full path to Gerrit SSH daemon's private host key")
  parser.add_option("--server-port", dest="port", default='29418',
                    help="Port to connect to Gerrit's SSH daemon "
                         "[default: %default]")

  (options, _args) = parser.parse_args()

  if not options.changeId:
    parser.print_help()
    exit(0)

  if options.patchset == 1:
    # Nothing to detect on first patchset
    exit(0)
  prev_revision = None
  prev_revision = FindPrevRev(options.changeId, options.patchset, server,
                              options.port)
  if not prev_revision:
    # Couldn't find a previous revision
    exit(0)
  prev_patch_id = GetPatchId(prev_revision)
  cur_patch_id = GetPatchId(options.commit)
  if cur_patch_id.split()[0] != prev_patch_id.split()[0]:
    # patch-ids don't match
    exit(0)
  # Patch ids match. This is a trivial rebase.
  # In addition to patch-id we should check if the commit message changed. Most
  # approvers would want to re-review changes when the commit message changes.
  changed = DiffCommitMessages(prev_revision, options.commit)
  if changed:
    # Insert a comment into the change letting the approvers know only the
    # commit message changed
    comment_msg = ("\'--message=New patchset patch-id matches previous patchset"
                   ", but commit message has changed.'")
    comment_cmd = ['ssh', '-p', options.port, server, 'gerrit', 'approve',
                   '--project', options.project, comment_msg, options.commit]
    CheckCall(comment_cmd)
    exit(0)

  # Need to get all approvals on prior patch set, then suexec them onto
  # this patchset.
  approvals = GetApprovals(options.changeId, options.patchset, server,
                           options.port)
  gerrit_approve_msg = ("\'Automatically re-added by Gerrit trivial rebase "
                        "detection script.\'")
  for approval in approvals:
    # Note: Sites with different 'copy_min_score' values in the
    # approval_categories DB table might want different behavior here.
    # Additional categories should also be added if desired.
    if approval["category_id"] == "CRVW":
      approve_category = '--code-review'
    elif approval["category_id"] == "VRIF":
      # Don't re-add verifies
      #approve_category = '--verified'
      continue
    elif approval["category_id"] == "SUBM":
      # We don't care about previous submit attempts
      continue
    else:
      print "Unsupported category: %s" % approval
      exit(0)

    score = approval["value"]
    gerrit_approve_cmd = ['gerrit', 'approve', '--project', options.project,
                          '--message', gerrit_approve_msg, approve_category,
                          score, options.commit]
    email_addr = GetEmailFromAcctId(approval["account_id"], server,
                                    options.port)
    SuExec(server, options.port, options.private_key_path, email_addr,
           ' '.join(gerrit_approve_cmd))
  exit(0)

if __name__ == "__main__":
  Main()
