Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
#!/bin/bash #version=1.2.1 # update - safely update a script from ~/bin/claude/[scriptname]/ to ~/bin/ # # This script automates the process of updating scripts from their development # directory to the production bin directory. It automatically uses vc (version # control) to save earlier versions before overwriting, ensuring you can always # rollback to a previous version if needed. # # Usage: update scriptname # (or just 'update' from within ~/bin/claude/scriptname/ directory) # # The script will: # 1. Check if a vc backup exists for the current version (see vc script) # 2. If not, automatically run 'vc scriptname' to create a backup # 3. Copy the new version from ~/bin/claude/scriptname/ to ~/bin/ # 4. Set executable permissions SCRIPT_NAME="${1}" BIN_DIR="$HOME/bin" DEV_DIR="$HOME/bin/claude" VC_DIR="$HOME/bin/vc_version_check" # If no argument provided, try to infer from current directory if [[ -z "$SCRIPT_NAME" ]]; then CURRENT_DIR=$(basename "$(pwd)") PARENT_DIR=$(basename "$(dirname "$(pwd)")") if [[ "$PARENT_DIR" == "claude" ]]; then SCRIPT_NAME="$CURRENT_DIR" echo "Inferring script name from directory: $SCRIPT_NAME" else echo "Error: Please provide script name or run from within ~/bin/claude/[scriptname]/" echo "Usage: update scriptname" exit 1 fi fi SOURCE_FILE="$DEV_DIR/$SCRIPT_NAME/$SCRIPT_NAME" TARGET_FILE="$BIN_DIR/$SCRIPT_NAME" VC_BACKUP_DIR="$VC_DIR/$SCRIPT_NAME" # Check if source file exists if [[ ! -f "$SOURCE_FILE" ]]; then echo "Error: Source file not found: $SOURCE_FILE" exit 1 fi # Check if target file exists if [[ ! -f "$TARGET_FILE" ]]; then echo "Warning: Target file does not exist: $TARGET_FILE" echo "This appears to be a new script. Copying without version control..." cp "$SOURCE_FILE" "$TARGET_FILE" chmod +x "$TARGET_FILE" echo "Copied $SOURCE_FILE to $TARGET_FILE" exit 0 fi # Function to extract version from a script extract_version() { local file="$1" # Search first 10 lines for version pattern (case insensitive) local version=$(head -n 10 "$file" 2>/dev/null | grep -iE "^#\s*version" | head -n 1 | sed -E 's/^#\s*version\s*=?\s*([0-9]+\.[0-9]+(\.[0-9]+)?).*/\1/') if [[ -z "$version" ]]; then echo "0.0.0" else echo "$version" fi } # Compare source and target versions SOURCE_VERSION=$(extract_version "$SOURCE_FILE") SOURCE_SIZE=$(stat -c%s "$SOURCE_FILE" 2>/dev/null || stat -f%z "$SOURCE_FILE" 2>/dev/null) TARGET_VERSION=$(extract_version "$TARGET_FILE") TARGET_SIZE=$(stat -c%s "$TARGET_FILE" 2>/dev/null || stat -f%z "$TARGET_FILE" 2>/dev/null) echo "Target: v$TARGET_VERSION (${TARGET_SIZE} bytes) | Source: v$SOURCE_VERSION (${SOURCE_SIZE} bytes)" # Check if source and target are identical if [[ "$SOURCE_VERSION" == "$TARGET_VERSION" && "$SOURCE_SIZE" == "$TARGET_SIZE" ]]; then echo "✓ No update needed - source and target are identical" exit 0 fi # Check if we need to backup the current version before overwriting NEED_BACKUP=true if [[ -d "$VC_BACKUP_DIR" && -n "$(ls -A "$VC_BACKUP_DIR" 2>/dev/null)" ]]; then # Look for existing backups of the target version for backup in "$VC_BACKUP_DIR"/*; do if [[ -f "$backup" ]]; then # Check if backup filename contains this version if [[ "$backup" =~ \[v${TARGET_VERSION}\] ]]; then BACKUP_SIZE=$(stat -c%s "$backup" 2>/dev/null || stat -f%z "$backup" 2>/dev/null) if [[ "$BACKUP_SIZE" == "$TARGET_SIZE" ]]; then echo "✓ Current version already backed up" NEED_BACKUP=false break else echo "Note: Found backup for v$TARGET_VERSION but size differs (${BACKUP_SIZE} vs ${TARGET_SIZE} bytes)" fi fi fi done fi if [[ "$NEED_BACKUP" == "true" ]]; then echo "Creating backup of v$TARGET_VERSION before overwriting..." vc "$SCRIPT_NAME" if [[ $? -ne 0 ]]; then echo "Error: Failed to create vc backup" exit 1 fi fi # Copy the new version echo "Updating $SCRIPT_NAME..." cp "$SOURCE_FILE" "$TARGET_FILE" chmod +x "$TARGET_FILE" # Backup the newly installed version echo "Creating backup of new v$SOURCE_VERSION..." vc "$SCRIPT_NAME" if [[ $? -ne 0 ]]; then echo "Warning: Failed to create vc backup of new version (but update succeeded)" fi echo "✓ Successfully updated to v$SOURCE_VERSION"
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)