Make CI removes Presubmit-Ready votes

So it can be retriggered simply by adding that votes back.

Fixes #92.

Change-Id: I681eea3e720910a2ac02bfe8d26da3cc42817ae2
diff --git a/jenkins/gerrit-verifier.groovy b/jenkins/gerrit-verifier.groovy
index b4b9c8d..ff07586 100644
--- a/jenkins/gerrit-verifier.groovy
+++ b/jenkins/gerrit-verifier.groovy
@@ -26,7 +26,7 @@
   def jobs = JenkinsUtils.jobsWithDescription("CR", "Gerrit project: " + change.project + ".")
 
   if (jobs != null && !jobs.empty) {
-    gerrit.addReviewer(change.number)
+    gerrit.startReview(change.number)
     for(job in jobs) {
       build job: job, propagate: false, wait: false, parameters: [
         [$class: 'StringParameterValue', name: 'REFSPEC', value: refspec],
@@ -39,7 +39,7 @@
 // Run the global presubmit job for a given change
 def globalPresubmit(gerrit, change) {
   def refspec = "+" + change.ref + ":" + change.ref.replaceAll('ref/', 'ref/remotes/origin/')
-  gerrit.addReviewer(change.number)
+  gerrit.startReview(change.number)
   build job: "CR/global-verifier", propagate: false, wait: false, parameters: [
     [$class: 'StringParameterValue', name: 'REFSPEC', value: refspec],
     [$class: 'StringParameterValue', name: 'BRANCH', value: change.sha1],
diff --git a/jenkins/lib/src/build/bazel/ci/GerritUtils.groovy b/jenkins/lib/src/build/bazel/ci/GerritUtils.groovy
index 8b78d71..390e33b 100644
--- a/jenkins/lib/src/build/bazel/ci/GerritUtils.groovy
+++ b/jenkins/lib/src/build/bazel/ci/GerritUtils.groovy
@@ -162,19 +162,46 @@
     if (maxChanges > 0) {
       url += "&n=${maxChanges}"
     }
-    url += "&q=${java.net.URLEncoder.encode(query)}"
+    url += "&q=${java.net.URLEncoder.encode(query.toString())}"
     def changes = new URL(url).getText().substring(5)
     def jsonSlurper = new JsonSlurper()
     return jsonSlurper.parseText(changes)
   }
 
+  @NonCPS
+  def removeVote(changeNumber, label, reviewer) {
+    def rev = java.net.URLEncoder.encode(reviewer.toString())
+    this.post("a/changes/${changeNumber}/reviewers/${rev}/votes/${label}/delete",
+              ["notify": "NONE"])
+  }
+
+  @NonCPS
+  def removeVotes(changeNumber, label) {
+    def changeLabels = query(changeNumber)[0].labels
+    if (label in changeLabels) {
+      for (reviewer in changeLabels[label].all) {
+        if (reviewer.value > 0) {
+	  this.removeVote(changeNumber, label, reviewer._account_id)
+        }
+      }
+    }
+  }
+
+  // Mark a code review as review started
+  @NonCPS
+  def startReview(changeNumber) {
+    this.addReviewer(changeNumber)
+    this.removeVotes(changeNumber, "Presubmit-Ready")
+    this.removeVote(changeNumber, "Verified", this.reviewer)
+  }
+
   // Returns the list of verified changes not reviewed by the Gerrit reviewer and matching
   // the given filter. The result is a list of dictionnary of matching change, containing the
   // sha1 of the last patch, the number of this patch, the number of the change, the reference
   // of the patch and the project of the change.
   @NonCPS
   def getVerifiedChanges(filter = "", verifiedLevel = 1, maxChanges = 0) {
-    def changesJson = query("status:open -reviewer:${reviewerEmail} ${filter}",
+    def changesJson = query("status:open ${filter}",
                             maxChanges).findAll { change ->
         def verified = change.labels.get("Presubmit-Ready", [])
         return verified.all.any({ it.value == verifiedLevel })
diff --git a/jenkins/lib/vars/gerritReview.groovy b/jenkins/lib/vars/gerritReview.groovy
index ff2142a..47c0753 100644
--- a/jenkins/lib/vars/gerritReview.groovy
+++ b/jenkins/lib/vars/gerritReview.groovy
@@ -26,7 +26,7 @@
   this.gerritBuild = currentBuild
   stage("Start Gerrit review") {
     echo "Reviewing change ${url} (${branch})"
-    gerrit.addReviewer(changeNum)
+    gerrit.startReview(changeNum)
     gerrit.comment(changeNum, branch,
                    "Starting build at ${JenkinsUtils.getBlueOceanUrl(currentBuild)}")
   }