Merge "feat: Detect and error on comment lines in commit message formatting"
diff --git a/Documentation/rest-api-accounts.txt b/Documentation/rest-api-accounts.txt
index cb3517d..1c77e4a 100644
--- a/Documentation/rest-api-accounts.txt
+++ b/Documentation/rest-api-accounts.txt
@@ -3009,6 +3009,7 @@
 |Field Name                 |        |Description
 |`project`                  |        |The name of the project.
 |`filter`                   |optional|A filter string to be applied to the project.
+|`problem`                  |optional|An error message when project is for example hidden or deleted.
 |`notify_new_changes`       |optional|Notify on new changes.
 |`notify_new_patch_sets`    |optional|Notify on new patch sets.
 |`notify_all_comments`      |optional|Notify on comments.
diff --git a/java/com/google/gerrit/extensions/client/ProjectWatchInfo.java b/java/com/google/gerrit/extensions/client/ProjectWatchInfo.java
index 8f5af76..c446d87 100644
--- a/java/com/google/gerrit/extensions/client/ProjectWatchInfo.java
+++ b/java/com/google/gerrit/extensions/client/ProjectWatchInfo.java
@@ -19,6 +19,7 @@
 public class ProjectWatchInfo {
   public String project;
   public String filter;
+  public String problem;
 
   public Boolean notifyNewChanges;
   public Boolean notifyNewPatchSets;
@@ -32,6 +33,7 @@
       ProjectWatchInfo w = (ProjectWatchInfo) obj;
       return Objects.equals(project, w.project)
           && Objects.equals(filter, w.filter)
+          && Objects.equals(problem, w.problem)
           && Objects.equals(notifyNewChanges, w.notifyNewChanges)
           && Objects.equals(notifyNewPatchSets, w.notifyNewPatchSets)
           && Objects.equals(notifyAllComments, w.notifyAllComments)
@@ -46,6 +48,7 @@
     return Objects.hash(
         project,
         filter,
+        problem,
         notifyNewChanges,
         notifyNewPatchSets,
         notifyAllComments,
@@ -61,6 +64,9 @@
     if (filter != null) {
       b.append("%filter=").append(filter);
     }
+    if (problem != null) {
+      b.append("%problem=").append(problem);
+    }
     b.append("(notifyAbandonedChanges=")
         .append(toBoolean(notifyAbandonedChanges))
         .append(", notifyAllComments=")
diff --git a/java/com/google/gerrit/server/restapi/account/GetWatchedProjects.java b/java/com/google/gerrit/server/restapi/account/GetWatchedProjects.java
index 00c70d0..8f047a3 100644
--- a/java/com/google/gerrit/server/restapi/account/GetWatchedProjects.java
+++ b/java/com/google/gerrit/server/restapi/account/GetWatchedProjects.java
@@ -26,6 +26,7 @@
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
 import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.RestReadView;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.account.AccountResource;
@@ -35,6 +36,7 @@
 import com.google.gerrit.server.permissions.GlobalPermission;
 import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.project.ProjectsCollection;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
@@ -53,13 +55,18 @@
   private final PermissionBackend permissionBackend;
   private final Provider<IdentifiedUser> self;
   private final Accounts accounts;
+  private final ProjectsCollection projectsCollection;
 
   @Inject
   public GetWatchedProjects(
-      PermissionBackend permissionBackend, Provider<IdentifiedUser> self, Accounts accounts) {
+      PermissionBackend permissionBackend,
+      Provider<IdentifiedUser> self,
+      Accounts accounts,
+      ProjectsCollection projectsCollection) {
     this.permissionBackend = permissionBackend;
     this.self = self;
     this.accounts = accounts;
+    this.projectsCollection = projectsCollection;
   }
 
   @Override
@@ -84,11 +91,16 @@
             .collect(toList()));
   }
 
-  private static ProjectWatchInfo toProjectWatchInfo(
+  private ProjectWatchInfo toProjectWatchInfo(
       ProjectWatchKey key, ImmutableSet<NotifyType> watchTypes) {
     ProjectWatchInfo pwi = new ProjectWatchInfo();
     pwi.filter = key.filter();
     pwi.project = key.project().get();
+    try {
+      var unused = projectsCollection.parse(key.project().get());
+    } catch (RestApiException | IOException | PermissionBackendException e) {
+      pwi.problem = e.getMessage();
+    }
     pwi.notifyAbandonedChanges = toBoolean(watchTypes.contains(NotifyType.ABANDONED_CHANGES));
     pwi.notifyNewChanges = toBoolean(watchTypes.contains(NotifyType.NEW_CHANGES));
     pwi.notifyNewPatchSets = toBoolean(watchTypes.contains(NotifyType.NEW_PATCHSETS));