A shell script to quickly switch in or out your development repositories

Composer

Usage:

`./switch vendor/package`, e.g.:

./switch eugenefvdm/api-collection

The script:

#!/bin/bash

# Check if package name is provided
if [ -z "$1" ]; then
    echo "Usage: $0 <vendor/package>"
    echo "Example: $0 eugenefvdm/api-collection"
    exit 1
fi

# Store full package name
FULL_PACKAGE_NAME="$1"

# Extract package name from vendor/package format
PACKAGE_NAME=$(echo "$1" | cut -d'/' -f2)

# Check if composer.json exists
if [ ! -f "composer.json" ]; then
    echo "Error: composer.json not found in current directory"
    exit 1
fi

# Create a temporary file
TMP_FILE=$(mktemp)

# Check if the repository already exists - fixed the grep pattern
if grep -q "\"url\": \"../$(echo $PACKAGE_NAME | sed 's/\//\\\//g')\"" composer.json; then
    echo "Found repository for $PACKAGE_NAME, removing it..."
    
    # Use jq to remove the repository entry if it exists
    jq --arg pkg "../$PACKAGE_NAME" '
    if .repositories then
        .repositories = (.repositories | map(select(.url != $pkg)))
        | if .repositories == [] then del(.repositories) else . end
    else .
    end' composer.json > "$TMP_FILE"
    
    mv "$TMP_FILE" composer.json
    echo "Removed repository entry for $PACKAGE_NAME"
else
    echo "Repository for $PACKAGE_NAME not found, adding it..."
    
    # Use jq to add the repository
    jq --arg pkg "../$PACKAGE_NAME" '
    if .repositories then
        .repositories += [{"type": "path", "url": $pkg}]
    else
        . + {"repositories": [{"type": "path", "url": $pkg}]}
    end' composer.json > "$TMP_FILE"
    
    mv "$TMP_FILE" composer.json
    echo "Added repository entry for $PACKAGE_NAME"
fi

# Format the JSON file
if command -v jq &> /dev/null; then
    jq '.' composer.json > "$TMP_FILE" && mv "$TMP_FILE" composer.json
fi

# Run composer require with the package name
echo "Running 'composer require $FULL_PACKAGE_NAME'"
composer require "$FULL_PACKAGE_NAME"

echo "Done!"
lang-bash