Revert "git cl: delete no longer used Rietveld methods."

This reverts commit 38d36a616db2bfd86379225cc45c981f89161ced.

Reason for revert: breaks git cl archive for old rietveld branches.

Original change's description:
> git cl: delete no longer used Rietveld methods.
> 
> R=​ehmaldonado
> 
> Bug: 770408
> Change-Id: I4dc034839180a7587ee368793547c5b74c2572f6
> Reviewed-on: https://chromium-review.googlesource.com/c/1279139
> Commit-Queue: Andrii Shyshkalov <tandrii@chromium.org>
> Reviewed-by: Edward Lesmes <ehmaldonado@chromium.org>

TBR=tandrii@chromium.org,ehmaldonado@chromium.org

Change-Id: Ifff7b5e13b104841ecf2c190b043ad23f9dbcccd
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 770408
Reviewed-on: https://chromium-review.googlesource.com/c/1284990
Reviewed-by: Andrii Shyshkalov <tandrii@chromium.org>
Commit-Queue: Andrii Shyshkalov <tandrii@chromium.org>
diff --git a/git_cl.py b/git_cl.py
index 4bee4c3..2439bcf 100755
--- a/git_cl.py
+++ b/git_cl.py
@@ -1973,25 +1973,88 @@
     raise NotImplementedError()
 
   def GetIssueOwner(self):
-    raise NotImplementedError()
+    return (self.GetIssueProperties() or {}).get('owner_email')
 
   def GetReviewers(self):
-    raise NotImplementedError()
+    return (self.GetIssueProperties() or {}).get('reviewers')
 
   def AddComment(self, message, publish=None):
-    raise NotImplementedError()
+    return self.RpcServer().add_comment(self.GetIssue(), message)
 
-  def GetCommentsSummary(self, readable=True):
-    raise NotImplementedError()
+  def GetCommentsSummary(self, _readable=True):
+    summary = []
+    for message in self.GetIssueProperties().get('messages', []):
+      date = datetime.datetime.strptime(message['date'], '%Y-%m-%d %H:%M:%S.%f')
+      summary.append(_CommentSummary(
+        date=date,
+        disapproval=bool(message['disapproval']),
+        approval=bool(message['approval']),
+        sender=message['sender'],
+        message=message['text'],
+      ))
+    return summary
 
   def GetStatus(self):
-    raise NotImplementedError()
+    """Applies a rough heuristic to give a simple summary of an issue's review
+    or CQ status, assuming adherence to a common workflow.
+
+    Returns None if no issue for this branch, or one of the following keywords:
+      * 'error'    - error from review tool (including deleted issues)
+      * 'unsent'   - not sent for review
+      * 'waiting'  - waiting for review
+      * 'reply'    - waiting for owner to reply to review
+      * 'not lgtm' - Code-Review label has been set negatively
+      * 'lgtm'     - LGTM from at least one approved reviewer
+      * 'commit'   - in the commit queue
+      * 'closed'   - closed
+    """
+    if not self.GetIssue():
+      return None
+
+    try:
+      props = self.GetIssueProperties()
+    except urllib2.HTTPError:
+      return 'error'
+
+    if props.get('closed'):
+      # Issue is closed.
+      return 'closed'
+    if props.get('commit') and not props.get('cq_dry_run', False):
+      # Issue is in the commit queue.
+      return 'commit'
+
+    messages = props.get('messages') or []
+    if not messages:
+      # No message was sent.
+      return 'unsent'
+
+    if get_approving_reviewers(props):
+      return 'lgtm'
+    elif get_approving_reviewers(props, disapproval=True):
+      return 'not lgtm'
+
+    # Skip CQ messages that don't require owner's action.
+    while messages and messages[-1]['sender'] == COMMIT_BOT_EMAIL:
+      if 'Dry run:' in messages[-1]['text']:
+        messages.pop()
+      elif 'The CQ bit was unchecked' in messages[-1]['text']:
+        # This message always follows prior messages from CQ,
+        # so skip this too.
+        messages.pop()
+      else:
+        # This is probably a CQ messages warranting user attention.
+        break
+
+    if messages[-1]['sender'] != props.get('owner_email'):
+      # Non-LGTM reply from non-owner and not CQ bot.
+      return 'reply'
+    return 'waiting'
 
   def UpdateDescriptionRemote(self, description, force=False):
-    raise NotImplementedError()
+    self.RpcServer().update_description(self.GetIssue(), description)
 
   def CloseIssue(self):
-    raise NotImplementedError()
+    return self.RpcServer().close_issue(self.GetIssue())
 
   def SetFlag(self, flag, value):
     return self.SetFlags({flag: value})