Change message about cycles in the WORKSPACE file

If a cycle is detected in the WORKSPACE file, i.e., a definition of a repository
is needed but not found till the place it is needed in the WORKSPACE file, this
can have two reasons,
- the definition could come later in the WORKSPACE file, or
- it could be missing completely.
Bazel has no chance of distinguishing those two cases, as the semantics of the
WORKSPACE file after this point depends on the not-found definition of the repository. So,
report both possibilities in the error message.

Closes #5697.

Change-Id: I92ff037c8b41c1fd78329db53800d11635b2e6e1
PiperOrigin-RevId: 234809390
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
index 7b6789c..71035b4 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
@@ -118,9 +118,13 @@
                     + fileLabel
                     + "'.\n"
                     + "It usually happens when the repository is not defined prior to being used.\n"
-                    + "Maybe repository '"
+                    + "This could either mean you have to add the '"
+                    + fileLabel.getWorkspaceName()
+                    + "' repository with a statement like `http_archive` in your WORKSPACE file"
+                    + " (note that transitive dependencies are not added automatically), or"
+                    + " the repository '"
                     + repositoryName
-                    + "' was defined later in your WORKSPACE file?"));
+                    + "' was defined too late in your WORKSPACE file."));
         return true;
       } else if (Iterables.any(cycle, IS_PACKAGE_LOOKUP)) {
         eventHandler.handle(
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java
index cd3eb21..4daa6b8 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java
@@ -255,7 +255,7 @@
       // This is expected
     }
     assertDoesNotContainEvent("cycle");
-    assertContainsEvent("Maybe repository 'foo' was defined later in your WORKSPACE file?");
+    assertContainsEvent("repository 'foo' was defined too late in your WORKSPACE file");
     assertContainsEvent("Failed to load Starlark extension '@foo//:def.bzl'.");
   }
 
@@ -279,7 +279,7 @@
       // This is expected
     }
     assertDoesNotContainEvent("cycle");
-    assertContainsEvent("Maybe repository 'foo' was defined later in your WORKSPACE file?");
+    assertContainsEvent("the repository 'foo' was defined too late in your WORKSPACE file");
     assertContainsEvent("Failed to load Starlark extension '@foo//:def.bzl'.");
   }
 
@@ -307,8 +307,7 @@
           .contains(
               "Failed to load Starlark extension "
                   + "'@git_repo//xyz:foo.bzl'.\n"
-                  + "It usually happens when the repository is not defined prior to being used.\n"
-                  + "Maybe repository 'git_repo' was defined later in your WORKSPACE file?");
+                  + "It usually happens when the repository is not defined prior to being used.\n");
     }
   }
 
diff --git a/src/test/shell/bazel/skylark_repository_test.sh b/src/test/shell/bazel/skylark_repository_test.sh
index 9708190..f1e9c9b 100755
--- a/src/test/shell/bazel/skylark_repository_test.sh
+++ b/src/test/shell/bazel/skylark_repository_test.sh
@@ -294,7 +294,7 @@
 
   expect_not_log "PACKAGE"
   expect_log "Failed to load Starlark extension '@foo//:ext.bzl'"
-  expect_log "Maybe repository 'foo' was defined later in your WORKSPACE file?"
+  expect_log "repository 'foo' was defined too late in your WORKSPACE file"
 }
 
 function test_load_nonexistent_with_subworkspace() {
@@ -313,7 +313,7 @@
 
   expect_not_log "PACKAGE"
   expect_log "Failed to load Starlark extension '@does_not_exist//:random.bzl'"
-  expect_log "Maybe repository 'does_not_exist' was defined later in your WORKSPACE file?"
+  expect_log "repository 'does_not_exist' was defined too late in your WORKSPACE file"
 
   # Retest with query //...
   bazel clean --expunge
@@ -322,7 +322,7 @@
 
   expect_not_log "PACKAGE"
   expect_log "Failed to load Starlark extension '@does_not_exist//:random.bzl'"
-  expect_log "Maybe repository 'does_not_exist' was defined later in your WORKSPACE file?"
+  expect_log "repository 'does_not_exist' was defined too late in your WORKSPACE file"
 }
 
 function test_skylark_local_repository() {