Skip to content

Feature Request: Add public API for checking environment staleness #34

Closed

Description

@yzx9

A public API on Builder that checks whether an environment is up-to-date without triggering a build or modifying anything. This enables applications to quickly answer "does this environment need syncing?" before committing to an expensive rebuild.

The cost difference matters:

Operation Time
Config-level check (read appose.json, compare) < 0.01 s
Tool-level check (uv sync --check, pixi install --check) < 1s
Actual sync/rebuild > 1s

Use Cases

  • Background health checks: An application can poll on startup or periodically to show a green/yellow/red environment status indicator, without blocking the user or triggering heavy operations.
  • Pre-flight warnings: Before executing a script, quickly check whether the environment is stale and warn: "Environment may be out of sync. Rebuild recommended."
  • Lazy sync with progress feedback: Use the check as a fast gate. If stale, show a progress UI and then call build(). The user only waits when a rebuild is actually needed.
  • Appose.wrap() validation: After wrapping an existing environment, verify it is consistent before running user code.

Today, applications have no choice but to either always rebuild (slow) or blindly trust the environment (risky). This API removes that tradeoff.

Proposed API

public interface Builder<T extends Builder<T>> {
  // ... existing methods ...

  /**
   * Checks whether the environment at the default directory is up-to-date
   * without modifying anything.
   */
  boolean isUpToDate() throws IOException;

 /**
   * Performs a deeper check using tool-specific verification
   * (e.g., uv sync --check, pixi install --check).
   * Returns a result with details about what is out of sync.
   */
  CheckResult checkUpToDate() throws IOException;
}

public interface CheckResult {
  boolean isUpToDate();
  String description();
}

Two tiers: isUpToDate() for a fast config-level check (current protected api), checkUpToDate() for a deeper tool-level check that catches environment drift.

Existing Implementation

BaseBuilder already has a protected boolean isUpToDate(File envDir) method that compares appose.json against the current builder state. This is a starting point, but it has two problems:

  1. Not public: isUpToDate() is protected on BaseBuilder, not declared on the Builder interface. External code cannot call it.
  2. Only checks declared configuration: It compares the builder's input parameters (declaration file content, package lists, channels, etc.) against a stored snapshot. It cannot detect manual modifications (pip install/conda remove inside the env), lock file drift, or partial/corrupted builds. The deep check (checkUpToDate()) would need to invoke tool-specific commands to cover these cases.

Activity

  1. changed the title [-]Feature: Add public API for checking environment staleness[/-] [+]Feature Request: Add public API for checking environment staleness[/+] on Jun 1, 2026
  2. ctrueden commented on Oct 9, 2026

    @ctrueden
    Member

    Sorry @yzx9 for ignoring your PR apposed/appose-java#10 for so long. There is now a status check API as of apposed/appose-python@a7832f1 and apposed/appose-java@2432023. The new status() method on Builder returns one of MISSING, INCOMPATIBLE (of another builder's type), EXTERNAL (not built by Appose), STALE, or CURRENT. Please reopen this issue if this method is not sufficient to address your needs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions