Merge "Fix: this.codeOwnersCacheApi.getStatus is not a function"
diff --git a/ui/code-owners-service.js b/ui/code-owners-service.js
index bf9fa4e..f7ee6d2 100644
--- a/ui/code-owners-service.js
+++ b/ui/code-owners-service.js
@@ -136,11 +136,13 @@
 
   async getStatus() {
     const status = await this._getStatus();
-    if (status.enabled && !this.isOnLatestPatchset(status.patchsetNumber)) {
-      // status is outdated, abort and re-init
+    if (status.enabled && this._isOnOlderPatchset(status.patchsetNumber)) {
+      // status is returned for an older patchset. Abort, re-init and refetch
+      // new status - it is expected, that after several retry a status
+      // for the newest patchset is returned
       this.reset();
       this.prefetch();
-      return await this.codeOwnersCacheApi.getStatus();
+      return await this.getStatus();
     }
     return status;
   }
@@ -153,18 +155,21 @@
         enabled: false,
         codeOwnerStatusMap: new Map(),
         rawStatuses: [],
+        newerPatchsetUploaded: false,
       };
     }
 
-    const onwerStatus = await this.codeOwnersCacheApi.listOwnerStatus();
+    const ownerStatus = await this.codeOwnersCacheApi.listOwnerStatus();
 
     return {
       enabled: true,
-      patchsetNumber: onwerStatus.patch_set_number,
+      patchsetNumber: ownerStatus.patch_set_number,
       codeOwnerStatusMap: this._formatStatuses(
-          onwerStatus.file_code_owner_statuses
+          ownerStatus.file_code_owner_statuses
       ),
-      rawStatuses: onwerStatus.file_code_owner_statuses,
+      rawStatuses: ownerStatus.file_code_owner_statuses,
+      newerPatchsetUploaded:
+        this._isOnNewerPatchset(ownerStatus.patch_set_number),
     };
   }
 
@@ -274,9 +279,14 @@
     });
   }
 
-  isOnLatestPatchset(patchsetId) {
+  _isOnNewerPatchset(patchsetId) {
     const latestRevision = this.change.revisions[this.change.current_revision];
-    return `${latestRevision._number}` === `${patchsetId}`;
+    return patchsetId > latestRevision._number;
+  }
+
+  _isOnOlderPatchset(patchsetId) {
+    const latestRevision = this.change.revisions[this.change.current_revision];
+    return patchsetId < latestRevision._number;
   }
 
   reset() {
diff --git a/ui/owner-requirement.js b/ui/owner-requirement.js
index 5fcbeec..6bc3465 100644
--- a/ui/owner-requirement.js
+++ b/ui/owner-requirement.js
@@ -66,17 +66,22 @@
         <template is="dom-if" if="[[!_isLoading]]">
           <template is="dom-if" if="[[!_pluginFailed(model.pluginStatus)]]">
             <template is="dom-if" if="[[!model.branchConfig.no_code_owners_defined]]">
-              <span>[[_computeStatusText(_statusCount, _isOverriden)]]</span>
-              <template is="dom-if" if="[[_overrideInfoUrl]]">
-                <a on-click="_reportDocClick" href="[[_overrideInfoUrl]]"
-                  target="_blank">
-                  <iron-icon icon="gr-icons:help-outline"
-                    title="Documentation for overriding code owners"></iron-icon>
-                </a>
+              <template is="dom-if" if="[[!_newerPatchsetUploaded]]">
+                <span>[[_computeStatusText(_statusCount, _isOverriden)]]</span>
+                <template is="dom-if" if="[[_overrideInfoUrl]]">
+                  <a on-click="_reportDocClick" href="[[_overrideInfoUrl]]"
+                    target="_blank">
+                    <iron-icon icon="gr-icons:help-outline"
+                      title="Documentation for overriding code owners"></iron-icon>
+                  </a>
+                </template>
+                <gr-button link on-click="_openReplyDialog">
+                  [[_getSuggestOwnersText(_statusCount)]]
+                </gr-button>
               </template>
-              <gr-button link on-click="_openReplyDialog">
-                [[_getSuggestOwnersText(_statusCount)]]
-              </gr-button>
+              <template is="dom-if" if="[[_newerPatchsetUploaded]]">
+                <span>A newer patch set has been uploaded.</span>
+              </template>
             </template>
             <template is="dom-if" if="[[model.branchConfig.no_code_owners_defined]]">
               <span>No code-owners file</span>
@@ -99,6 +104,7 @@
   static get properties() {
     return {
       _statusCount: Object,
+      _newerPatchsetUploaded: Boolean,
       _isLoading: {
         type: Boolean,
         computed: '_computeIsLoading(model.branchConfig, model.status, ' +
@@ -143,10 +149,12 @@
   _onStatusChanged(status, userRole) {
     if (!status || !userRole) {
       this._statusCount = undefined;
+      this._newerPatchsetUploaded = undefined;
       return;
     }
     const rawStatuses = status.rawStatuses;
     this._statusCount = this._getStatusCount(rawStatuses);
+    this._newerPatchsetUploaded = status.newerPatchsetUploaded;
     this.reporting.reportLifeCycle('owners-submit-requirement-summary-shown',
         {...this._statusCount, user_role: userRole});
   }
diff --git a/ui/owner-status-column.js b/ui/owner-status-column.js
index 8f57a2b..ae56d36 100644
--- a/ui/owner-status-column.js
+++ b/ui/owner-status-column.js
@@ -48,14 +48,18 @@
 };
 
 class BaseEl extends CodeOwnersModelMixin(Polymer.Element) {
-  computeHidden(change, patchRange) {
-    if ([change, patchRange].includes(undefined)) return true;
+  computeHidden(change, patchRange, newerPatchsetUploaded) {
+    if ([change, patchRange, newerPatchsetUploaded].includes(undefined)) {
+      return true;
+    }
     // if code-owners is not a submit requirement, don't show status column
     if (change.requirements &&
         !change.requirements.find(r => r.type === 'code-owners')) {
       return true;
     }
 
+    if (newerPatchsetUploaded) return true;
+
     const latestPatchset = change.revisions[change.current_revision];
     // only show if its comparing against base
     if (patchRange.basePatchNum !== 'PARENT') return true;
@@ -97,7 +101,8 @@
       hidden: {
         type: Boolean,
         reflectToAttribute: true,
-        computed: 'computeHidden(change, patchRange)',
+        computed: 'computeHidden(change, patchRange, ' +
+          'model.status.newerPatchsetUploaded)',
       },
     };
   }