Git call diagrams

Each diagram shows the git commands one venv-patcher command runs, in order. It is the fastest way to see what a command really does.

Every git call runs in the package folder. Each one also gets gc.auto=0 and maintenance.auto=false.


apply

        sequenceDiagram
    participant User
    participant venv-patcher
    participant Manifest
    participant Git

    User->>venv-patcher: venv-patcher apply -f patches.yml
    Note over venv-patcher: Check: running in a venv
    venv-patcher->>Manifest: load
    opt --force
        Note over venv-patcher,Git: reset, as below, for -p packages or all
    end

    loop For each -f file
        Note over venv-patcher: Read YAML, or TOML on 3.11+<br/>Check version, package, path
        loop For each entry (filtered by -p)
            opt Has a path, package tracked
                venv-patcher->>Git: status --porcelain
                Note over venv-patcher: Changes? Record failure: use --force
            end
            alt No path: only git tracking
                Note over venv-patcher,Git: import package, then init and<br/>initial commit as below, once
            else Already applied (same resolved path)
                Note over venv-patcher: Same hash: warn, skip<br/>Other hash or gone: record failure
            else New
                Note over venv-patcher: import package, find its folder
                opt Not importable
                    venv-patcher->>Manifest: save failure
                    Note over venv-patcher: Stop, unless --skip-missing
                end

                opt No initial commit yet
                    venv-patcher->>Git: init -q
                    Note over venv-patcher: Add __pycache__/, *.pyc, *.pyo<br/>to .gitignore
                    venv-patcher->>Git: add .
                    venv-patcher->>Git: commit -q -m initial --allow-empty
                    Note over Git: name venv-patcher, date 1970-01-01
                    venv-patcher->>Git: rev-parse HEAD
                    venv-patcher->>Manifest: save initial commit
                end

                Note over venv-patcher: Patch file exists?<br/>sha256sum matches?
                venv-patcher->>Git: <apply-command> <patch file>
                Note over Git: default: git am<br/>pinned author, email, date
                venv-patcher->>Git: status --porcelain
                opt Changes left (e.g. git apply)
                    venv-patcher->>Git: add -A
                    venv-patcher->>Git: commit -q -m <comments>
                end
                opt Apply or commit failed
                    Note over venv-patcher: .git/rebase-apply there?
                    venv-patcher->>Git: am --abort
                    venv-patcher->>Git: reset -q --hard HEAD
                    venv-patcher->>Git: clean -q -fd
                end
                venv-patcher->>Manifest: save applied or failed
            end
        end
    end
    

list

list runs no git command. It only reads the manifest.

        sequenceDiagram
    participant User
    participant venv-patcher
    participant Manifest

    User->>venv-patcher: venv-patcher list
    Note over venv-patcher: Check: running in a venv
    venv-patcher->>Manifest: load
    loop For each package, sorted
        Note over venv-patcher: Print folder, initial commit,<br/>each result [OK] or [FAIL]
    end
    

reset

        sequenceDiagram
    participant User
    participant venv-patcher
    participant Manifest
    participant Git

    User->>venv-patcher: venv-patcher reset [-p <package>]
    Note over venv-patcher: Check: running in a venv
    venv-patcher->>Manifest: load
    loop For each package (filtered by -p)
        Note over venv-patcher: Skip if no folder or no initial commit<br/>Warn if the folder is gone
        venv-patcher->>Git: status --porcelain
        alt Changed outside (e.g. pip upgrade)
            Note over venv-patcher: Remove .git, keep the files
            venv-patcher->>Manifest: no initial commit, empty patches, save
        else Unchanged
            opt .git/rebase-apply there
                venv-patcher->>Git: am --abort
            end
            venv-patcher->>Git: reset -q --hard <initial commit>
            venv-patcher->>Git: clean -q -fd
            venv-patcher->>Manifest: empty patches, save
        end
    end