Remove "obsolete" and "default_obsolete" from the BUILD language.

Anyone who needs this kind of functionality in the future can redefine
it through user-defined constraints.

--
MOS_MIGRATED_REVID=88871811
diff --git a/docs/bazel-user-manual.html b/docs/bazel-user-manual.html
index dc73c3f..6981197 100644
--- a/docs/bazel-user-manual.html
+++ b/docs/bazel-user-manual.html
@@ -658,9 +658,9 @@
   building the former.
 </p>
 <p>
-Targets with <code>obsolete=1</code> or <code>tags=["manual"]</code> will
-be ignored by all command line wildcards (..., :*, :all, etc). The only
-way to run such targets is to specify them explicitly on the command line.
+  Targets with <code>tags=["manual"]</code> will be ignored by all command line
+  wildcards (..., :*, :all, etc). The only way to run such targets is to
+  specify them explicitly on the command line.
 </p>
 
 <h3 id='configurations'>Build configurations and cross-compilation</h3>
@@ -2915,11 +2915,6 @@
     to be flaky and will be automatically retried up to 3 times unless larger
     <code class='flag'>--flaky_test_attempts</code> value has been specified.
   </li>
-  <li>Test rules marked with the <code>obsolete=1</code> attribute will be
-    ignored by the <code>test_suite</code> rules and by all command line
-    wildcards - this behavior is identical to the <code>manual</code> keyword
-    described above.
-  </li>
 
 </ul>
 
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/obsolete.html b/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/obsolete.html
deleted file mode 100644
index 93363c5..0000000
--- a/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/obsolete.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<i>(Boolean; optional; default 0)</i><br/>
-If 1, only obsolete targets can depend on this target. It is an error when
-a non-obsolete target depends on an obsolete target.
-<p>
-As a transition, one can first mark a package as in
-<a href="#common.deprecation"><code>deprecation</code></a>.</p>
-<p>
-This attribute is useful when you want to prevent a target from
-being used but are yet not ready to delete the sources.</p>
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
index ad5756e..a14cd53 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
@@ -57,14 +57,6 @@
   private static final Label COVERAGE_SUPPORT_LABEL =
       Label.parseAbsoluteUnchecked("//tools/defaults:coverage");
 
-  private static final Attribute.ComputedDefault obsoleteDefault =
-      new Attribute.ComputedDefault() {
-        @Override
-        public Object getDefault(AttributeMap rule) {
-          return rule.getPackageDefaultObsolete();
-        }
-      };
-
   private static final Attribute.ComputedDefault testonlyDefault =
       new Attribute.ComputedDefault() {
         @Override
@@ -239,8 +231,6 @@
               .nonconfigurable("Used in core loading phase logic with no access to configs"))
           .add(attr("distribs", DISTRIBUTIONS)
               .nonconfigurable("Used in core loading phase logic with no access to configs"))
-          .add(attr("obsolete", BOOLEAN).value(obsoleteDefault)
-              .nonconfigurable("Used in core loading phase logic with no access to configs"))
           .add(attr(":action_listener", LABEL_LIST).cfg(HOST).value(ACTION_LISTENER))
           .build();
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
index c13c362..6ae21d9 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
@@ -110,11 +110,6 @@
   }
 
   @Override
-  public Boolean getPackageDefaultObsolete() {
-    return pkg.getDefaultObsolete();
-  }
-
-  @Override
   public Boolean getPackageDefaultTestOnly() {
     return pkg.getDefaultTestOnly();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
index def32b5..682d2dd 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
@@ -196,8 +196,6 @@
       @Override
       public String getPackageDefaultHdrsCheck() { return owner.getPackageDefaultHdrsCheck(); }
       @Override
-      public Boolean getPackageDefaultObsolete() { return owner.getPackageDefaultObsolete(); }
-      @Override
       public Boolean getPackageDefaultTestOnly() { return owner.getPackageDefaultTestOnly(); }
       @Override
       public String getPackageDefaultDeprecation() { return owner.getPackageDefaultDeprecation(); }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java b/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
index 52aecd1..131ed05 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
@@ -98,8 +98,6 @@
   // a more generic interface.
   String getPackageDefaultHdrsCheck();
 
-  Boolean getPackageDefaultObsolete();
-
   Boolean getPackageDefaultTestOnly();
 
   String getPackageDefaultDeprecation();
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index b909dd8..fc2b379 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -133,11 +133,6 @@
   private boolean defaultVisibilitySet;
 
   /**
-   * Default package-level 'obsolete' value for rules that do not specify it.
-   */
-  private boolean defaultObsolete = false;
-
-  /**
    * Default package-level 'testonly' value for rules that do not specify it.
    */
   private boolean defaultTestOnly = false;
@@ -288,13 +283,6 @@
   }
 
   /**
-   * Set the default 'obsolete' value for this package.
-   */
-  protected void setDefaultObsolete(boolean obsolete) {
-    defaultObsolete = obsolete;
-  }
-
-  /**
    * Set the default 'testonly' value for this package.
    */
   protected void setDefaultTestOnly(boolean testOnly) {
@@ -646,13 +634,6 @@
   }
 
   /**
-   * Returns the default obsolete value.
-   */
-  public Boolean getDefaultObsolete() {
-    return defaultObsolete;
-  }
-
-  /**
    * Returns the default testonly value.
    */
   public Boolean getDefaultTestOnly() {
@@ -660,7 +641,7 @@
   }
 
   /**
-   * Returns the default obsolete value.
+   * Returns the default deprecation value.
    */
   public String getDefaultDeprecation() {
     return defaultDeprecation;
@@ -946,14 +927,6 @@
       return self();
     }
 
-    /**
-     * Sets the default value of 'obsolete'. Rule-level 'obsolete' will override this.
-     */
-    B setDefaultObsolete(boolean defaultObsolete) {
-      pkg.setDefaultObsolete(defaultObsolete);
-      return self();
-    }
-
     /** Sets the default value of 'testonly'. Rule-level 'testonly' will override this. */
     B setDefaultTestonly(boolean defaultTestonly) {
       pkg.setDefaultTestOnly(defaultTestonly);
@@ -1350,8 +1323,7 @@
       // time, as forward references are permitted.
       List<Label> allTests = new ArrayList<>();
       for (Rule rule : rules) {
-        if (TargetUtils.isTestRule(rule) && !TargetUtils.hasManualTag(rule)
-            && !TargetUtils.isObsolete(rule)) {
+        if (TargetUtils.isTestRule(rule) && !TargetUtils.hasManualTag(rule)) {
           allTests.add(rule.getLabel());
         }
       }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
index cd407b6..1c56072 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
@@ -316,9 +316,6 @@
     // It's important to do this after setting the default visibility, since that implicitly sets
     // this bit to true
     builder.setDefaultVisibilitySet(packagePb.getDefaultVisibilitySet());
-    if (packagePb.hasDefaultObsolete()) {
-      builder.setDefaultObsolete(packagePb.getDefaultObsolete());
-    }
     if (packagePb.hasDefaultTestonly()) {
       builder.setDefaultTestonly(packagePb.getDefaultTestonly());
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index 4df5486..a641c7c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -159,18 +159,6 @@
     }
   }
 
-  private static class DefaultObsolete extends PackageArgument<Boolean> {
-    private DefaultObsolete() {
-      super("default_obsolete", Type.BOOLEAN);
-    }
-
-    @Override
-    protected void process(Package.LegacyBuilder pkgBuilder, Location location,
-        Boolean value) {
-      pkgBuilder.setDefaultObsolete(value);
-    }
-  }
-
   private static class DefaultTestOnly extends PackageArgument<Boolean> {
     private DefaultTestOnly() {
       super("default_testonly", Type.BOOLEAN);
@@ -432,7 +420,6 @@
            .add(new DefaultDeprecation())
            .add(new DefaultDistribs())
            .add(new DefaultLicenses())
-           .add(new DefaultObsolete())
            .add(new DefaultTestOnly())
            .add(new DefaultVisibility())
            .add(new Features())
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java b/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java
index 8971cf2..83b8a64 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java
@@ -200,7 +200,6 @@
       }
     }
 
-    builder.setDefaultObsolete(pkg.getDefaultObsolete());
     builder.setDefaultTestonly(pkg.getDefaultTestOnly());
     if (pkg.getDefaultDeprecation() != null) {
       builder.setDefaultDeprecation(pkg.getDefaultDeprecation());
diff --git a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
index fb0cee9..6dd3dac 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
@@ -119,18 +119,6 @@
     return hasConstraint(rule, "external");
   }
 
-  /**
-   * Returns true, iff the given target is a rule and it has the attribute
-   * <code>obsolete<code/> set to one.
-   */
-  public static boolean isObsolete(Target target) {
-    if (!(target instanceof Rule)) {
-      return false;
-    }
-    Rule rule = (Rule) target;
-    return (rule.isAttrDefined("obsolete", Type.BOOLEAN))
-        && NonconfigurableAttributeMapper.of(rule).get("obsolete", Type.BOOLEAN);
-  }
 
   /**
    * If the given target is a rule, returns its <code>deprecation<code/> value, or null if unset.
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/FilteringPolicies.java b/src/main/java/com/google/devtools/build/lib/pkgcache/FilteringPolicies.java
index df01326..3f486a4 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/FilteringPolicies.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/FilteringPolicies.java
@@ -58,20 +58,20 @@
 
   public static final FilteringPolicy NO_FILTER = new NoFilter();
 
-  private static class FilterManualAndObsolete extends AbstractFilteringPolicy {
+  private static class FilterManual extends AbstractFilteringPolicy {
     @Override
     public boolean shouldRetain(Target target, boolean explicit) {
-      return explicit || !(TargetUtils.hasManualTag(target) || TargetUtils.isObsolete(target));
+      return explicit || !(TargetUtils.hasManualTag(target));
     }
   }
 
-  public static final FilteringPolicy FILTER_MANUAL_AND_OBSOLETE = new FilterManualAndObsolete();
+  public static final FilteringPolicy FILTER_MANUAL = new FilterManual();
 
   private static class FilterTests extends AbstractFilteringPolicy {
     @Override
     public boolean shouldRetain(Target target, boolean explicit) {
       return TargetUtils.isTestOrTestSuiteRule(target)
-          && FILTER_MANUAL_AND_OBSOLETE.shouldRetain(target, explicit);
+          && FILTER_MANUAL.shouldRetain(target, explicit);
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/FilteringPolicy.java b/src/main/java/com/google/devtools/build/lib/pkgcache/FilteringPolicy.java
index ac27fb0..1513374 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/FilteringPolicy.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/FilteringPolicy.java
@@ -20,7 +20,7 @@
 
 /**
  * A filtering policy defines how target patterns are matched. For instance, we may wish to select
- * only tests, no tests, or remove obsolete targets.
+ * only tests or no tests.
  */
 public interface FilteringPolicy extends Serializable {
 
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunner.java b/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunner.java
index 4d8eea6..0a39ece 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunner.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunner.java
@@ -571,7 +571,7 @@
       boolean keepGoing) throws TargetParsingException, InterruptedException {
     ResolvedTargets<Target> result =
         targetPatternEvaluator.parseTargetPatternList(eventHandler, targetPatterns,
-            FilteringPolicies.FILTER_MANUAL_AND_OBSOLETE, keepGoing);
+            FilteringPolicies.FILTER_MANUAL, keepGoing);
     if (compileOneDependency) {
       return new CompileOneDependencyTransformer(packageManager)
           .transformCompileOneDependency(eventHandler, result);
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java b/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java
index 6661dbb..23db88d 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java
@@ -43,8 +43,7 @@
  */
 public class PathPackageLocator implements Serializable {
 
-  public static final Set<String> DEFAULT_TOP_LEVEL_EXCLUDES =
-      ImmutableSet.of("experimental", "obsolete");
+  public static final Set<String> DEFAULT_TOP_LEVEL_EXCLUDES = ImmutableSet.of("experimental");
 
   /**
    * An interface which accepts {@link PathFragment}s.