Make short IDs directly accessible in BuildConfigurationValue.

PiperOrigin-RevId: 535620649
Change-Id: Ie76bd272012ce4d98c3a7a87d5c00e59e09eeb49
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationValue.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationValue.java
index 5b4a92e..dfbb264 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationValue.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationValue.java
@@ -775,6 +775,15 @@
     return buildOptions.checksum();
   }
 
+  /**
+   * Returns a user-friendly short configuration identifier.
+   *
+   * <p>See {@link BuildOptions#shortId()} for details.
+   */
+  public String shortId() {
+    return buildOptions.shortId();
+  }
+
   /** Returns a copy of the build configuration options for this configuration. */
   public BuildOptions cloneOptions() {
     return buildOptions.clone();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
index 490ce6d..cc22221 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
@@ -184,6 +184,19 @@
     return checksum;
   }
 
+  /**
+   * Returns a user-friendly configuration identifier as a prefix of <code>fullId</code>.
+   *
+   * <p>This eliminates having to manipulate long full hashes, just like Git short commit hashes.
+   */
+  public String shortId() {
+    // Inherit Git's default commit hash prefix length. It's a principled choice with similar usage
+    // patterns. cquery, which uses this, has access to every configuration in the build. If it
+    // turns out this setting produces ambiguous prefixes, we could always compare configurations
+    // to find the actual minimal unambiguous length.
+    return checksum() == null ? "null" : checksum().substring(0, 7);
+  }
+
   @Override
   public String toString() {
     return MoreObjects.toStringHelper(this)
@@ -193,16 +206,20 @@
         .toString();
   }
 
-  /** Returns the options contained in this collection. */
+  /** Returns the options contained in this collection, sorted by {@link FragmentOptions} name. */
   public ImmutableCollection<FragmentOptions> getNativeOptions() {
     return fragmentOptionsMap.values();
   }
 
-  /** Returns the set of fragment classes contained in these options. */
+  /**
+   * Returns the set of fragment classes contained in these options, sorted by {@link
+   * FragmentOptions} name.
+   */
   public ImmutableSet<Class<? extends FragmentOptions>> getFragmentClasses() {
     return fragmentOptionsMap.keySet();
   }
 
+  /** Starlark options, sorted lexicographically by name. */
   public ImmutableMap<Label, Object> getStarlarkOptions() {
     return starlarkOptionsMap;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryThreadsafeCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryThreadsafeCallback.java
index e2b3790..af55999 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryThreadsafeCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/CqueryThreadsafeCallback.java
@@ -111,30 +111,12 @@
     return configCache.computeIfAbsent(
         configKey, key -> skyframeExecutor.getConfiguration(eventHandler, key));
   }
-  /**
-   * Returns a user-friendly configuration identifier as a prefix of <code>fullId</code>.
-   *
-   * <p>This helps users read and manipulate what are otherwise distractingly long strings, in the
-   * same spirit as Git short commit hashes.
-   */
-  protected static String shortId(String fullId) {
-    // Inherit Git's default commit hash prefix length. It's a principled choice with similar usage
-    // patterns. cquery, which uses this, has access to every configuration in the build. If it
-    // turns out this setting produces ambiguous prefixes, we could always compare configurations
-    // to find the actual minimal unambiguous length.
-    return fullId.substring(0, 7);
-  }
 
   /**
-   * Returns a user-friendly configuration identifier, using special IDs for null configurations and
-   * {@link #shortId(String)} for others.
+   * Returns a user-friendly configuration identifier, using special IDs for null configurations.
    */
   protected static String shortId(@Nullable BuildConfigurationValue config) {
-    if (config == null) {
-      return "null";
-    } else {
-      return shortId(config.checksum());
-    }
+    return config == null ? "null" : config.shortId();
   }
 }
 
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
index 052a147..6e5b12f 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
@@ -124,14 +124,7 @@
                 .concat("#")
                 .concat(dep.transitionName())
                 .concat(" -> ")
-                .concat(
-                    dep.options().stream()
-                        .map(
-                            options -> {
-                              String checksum = options.checksum();
-                              return shortId(checksum);
-                            })
-                        .collect(joining(", "))));
+                .concat(dep.options().stream().map(BuildOptions::shortId).collect(joining(", "))));
         if (verbosity == CqueryOptions.Transitions.LITE) {
           continue;
         }