Merge "Get branch config: special handling for 404 response code"
diff --git a/ui/code-owners-service.js b/ui/code-owners-service.js
index cf9f1f5..13f18d7 100644
--- a/ui/code-owners-service.js
+++ b/ui/code-owners-service.js
@@ -60,6 +60,25 @@
   OTHER: 'OTHER',
 };
 
+// TODO: Try to remove it. The ResponseError and getErrorMessage duplicates
+// code from the gr-plugin-rest-api.ts. This code is required because
+// we want custom error processing in some functions. For details see
+// the original gr-plugin-rest-api.ts file/
+
+class ResponseError extends Error {
+  constructor(response) {
+    super();
+    this.response = response;
+  }
+}
+
+async function getErrorMessage(response) {
+  const text = await response.text();
+  return text ?
+    `${response.status}: ${text}` :
+    `${response.status}`;
+}
+
 /**
  * Responsible for communicating with the rest-api
  *
@@ -118,19 +137,42 @@
    * @param {string} branch
    */
   async getBranchConfig(project, branch) {
-    const config = await this.restApi.get(
-        `/projects/${encodeURIComponent(project)}/` +
-        `branches/${encodeURIComponent(branch)}/` +
-        `code_owners.branch_config`
-    );
-    if (config.override_approval && !(config.override_approval instanceof Array)) {
-      // In the upcoming backend changes, the override_approval will be changed
-      // to array with (possible) multiple items.
-      // While this transition is in progress, the frontend supports both API -
-      // the old one and the new one.
-      return {...config, override_approval: [config.override_approval]};
+    const errFn = (response, error) => {
+      if (error) throw error;
+      if (response) throw new ResponseError(response);
+      throw new Error('Generic REST API error');
     }
-    return config;
+    try {
+      const config = await this.restApi.send(
+          'GET',
+          `/projects/${encodeURIComponent(project)}/` +
+          `branches/${encodeURIComponent(branch)}/` +
+          `code_owners.branch_config`,
+          undefined,
+          errFn
+      );
+      if (config.override_approval && !(config.override_approval
+          instanceof Array)) {
+        // In the upcoming backend changes, the override_approval will be changed
+        // to array with (possible) multiple items.
+        // While this transition is in progress, the frontend supports both API -
+        // the old one and the new one.
+        return {...config, override_approval: [config.override_approval]};
+      }
+      return config;
+    } catch(err) {
+      if (err instanceof ResponseError) {
+        if (err.response.status === 404) {
+          // The 404 error means that the branch doesn't exist and
+          // the plugin should be disabled.
+          return {disabled: true};
+        }
+        return getErrorMessage(err.response).then(msg => {
+          throw new Error(msg);
+        });
+      }
+      throw err;
+    }
   }
 }