# `nextflow.scm` The `nextflow.scm` package defines the Git provider interface and implements several built-in Git providers. It also manages local pipeline repositories using a Strategy pattern to support different repository management approaches. ## Class Diagram ```{mermaid} diagrams/nextflow.scm.mmd ``` ```{note} Some classes may be excluded from the above diagram for brevity. ``` ## Architecture overview ### Repository strategies The `AssetManager` uses the **Strategy pattern** to support different ways of managing local pipeline installations: - **`LegacyRepositoryStrategy`**: Traditional approach where each project gets a full git clone in `$NXF_HOME/{project}` directory. Only one revision can exist at a time per project. - **`MultiRevisionRepositoryStrategy`**: Modern approach that allows multiple revisions to coexist efficiently by: - Maintaining a shared bare repository in `$NXF_HOME/.repos/{project}/bare/` - Creating lightweight clones for each commit in `$NXF_HOME/.repos/{project}/clones/{commitId}/` - Sharing git objects between revisions to minimize disk space ### Strategy selection The `AssetManager` automatically selects the appropriate strategy based on: 1. **Environment variable**: `NXF_SCM_LEGACY=true` forces legacy mode 2. **Repository status**: Detected by checking existing repository structure: - `UNINITIALIZED`: No repository exists, use Multi-Revision (default) - `LEGACY_ONLY`: Only legacy `.git` directory exists, use Legacy - `BARE_ONLY`: Only bare repository exists, use Multi-Revision - `HYBRID`: Both exist, prefer Multi-Revision ### Repository provider The `RepositoryProvider` class is the base class for all Git providers. It defines how to authenticate with the provider, clone a Git repository, inspect branches and tags, etc. The provider is used by repository strategies to interact with remote Git services. ## Key components ### AssetManager Central class that manages pipeline assets. Key responsibilities include: - Project name resolution and validation - Strategy selection and initialization - Provider configuration and authentication - Repository download and checkout operations - Coordination between strategy and provider ### RepositoryStrategy Interface defining for repository management operations: - `download()`: Download or update a revision - `checkout()`: Switch to a specific revision - `drop()`: Delete local copies - `getLocalPath()`: Get path to working directory - `getGit()`: Access JGit repository instance