Lightweight version control CLI tool with smart file detection and PyQt6 GUI
Project description
versctrl
Lightweight version control CLI tool with smart file detection and PyQt6 GUI
Overview
versctrl is a simple yet powerful version control tool designed for quick file backups with intelligent file detection. It provides both command-line and GUI interfaces for managing file versions.
Features
- Smart File Detection: Automatically detect files based on various strategies
- PyQt6 GUI: Modern graphical interface for file selection
- Gitignore Support: Respects .gitignore patterns
- Multiple Naming Schemes: Version numbers, timestamps, or simple naming
- Automatic Cleanup: Configurable history retention
- Statistics Dashboard: Track your backups and files
- Cross-platform: Works on Windows, macOS, and Linux
Installation
Requirements
- Python 3.7+
- PyQt6 (optional, for GUI features)
- lucide-py (optional, for better icons)
Method 1: Install from PyPI (Recommended)
# Install versctrl globally
pip install versctrl
# With GUI support
pip install versctrl[gui]
# With all optional features
pip install versctrl[all]
After installation, versctrl will be available globally in your terminal from any directory.
Verify Installation
# Check if versctrl is accessible
versctrl --help
# Check version
versctrl --version
Setting Up PATH (If Needed)
If versctrl is not recognized after installation, you may need to add Python's Scripts directory to your PATH:
Windows
# Find Python Scripts directory
python -m site --user-site
# Add to PATH (PowerShell - Admin)
$pythonScripts = python -c "import site; print(site.USER_BASE + '\\Scripts')"
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$pythonScripts", "User")
# Restart your terminal
Or manually:
- Open "Environment Variables" settings
- Edit "Path" under User variables
- Add:
C:\Users\YourUsername\AppData\Local\Programs\Python\Python3X\Scripts - Click OK and restart terminal
macOS/Linux
# Find Python Scripts directory
python3 -m site --user-base
# Add to PATH (add to ~/.bashrc, ~/.zshrc, or ~/.bash_profile)
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
# Reload shell configuration
source ~/.bashrc
# For zsh users
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
Verify PATH Setup
# Check if versctrl is in PATH
which versctrl # macOS/Linux
where versctrl # Windows
# Should output something like:
# /home/username/.local/bin/versctrl
# or C:\Users\Username\AppData\Local\Programs\Python\Python3X\Scripts\versctrl.exe
Optional Dependencies
# Install GUI support separately
pip install PyQt6
# Install enhanced icons
pip install lucide-py
# Install all optional dependencies
pip install PyQt6 lucide-py
Upgrading
# Upgrade to latest version
pip install --upgrade versctrl
# Upgrade with all features
pip install --upgrade versctrl[all]
Uninstallation
pip uninstall versctrl
Quick Start
1. Initialize Configuration
# Navigate to your project directory
cd /path/to/your/project
# Initialize versctrl
versctrl --init
This creates a versctrl.json configuration file in your current directory.
2. Select Files
Using GUI (Recommended)
versctrl --select
This launches a modern file browser with:
- Tree view of your project
- Smart detection strategies
- Search and filter capabilities
- Visual file type indicators
Using Smart Add (CLI)
# Add source files (respects .gitignore)
versctrl --smart-add smart
# Add Python files only
versctrl --smart-add python
# Add recently modified files
versctrl --smart-add recent --days 7
# Add web-related files
versctrl --smart-add web
# Add all non-excluded files
versctrl --smart-add all
3. Create Backup
versctrl --new
This creates backups of all tracked files according to your configuration.
4. List Backups
versctrl --list
Shows all existing backups with size and modification date.
5. Restore Backup
versctrl --restore filename-v1.txt
Restores a specific backup to its original location.
Global Usage
Once installed, you can use versctrl from anywhere:
# Backup your documents
cd ~/Documents/important-project
versctrl --init
versctrl --smart-add smart
versctrl --new
# Backup your code
cd ~/Code/my-app
versctrl --init
versctrl --select
versctrl --new
# Use different configs for different projects
cd ~/project1
versctrl --config project1.json --new
cd ~/project2
versctrl --config project2.json --new
Configuration
The versctrl.json file contains:
{
"files": [
"src/main.py",
"config.yaml",
"README.md"
],
"backup_dir": ".versctrl_backups",
"naming_scheme": "version",
"keep_history": 5,
"create_new_file": false
}
Configuration Options
| Option | Description | Default |
|---|---|---|
files |
List of files to track | [] |
backup_dir |
Directory for backups | .versctrl_backups |
naming_scheme |
version, timestamp, or simple |
version |
keep_history |
Number of backups to keep | 5 |
create_new_file |
Create empty file after backup | false |
Naming Schemes
- version:
file-v1.txt,file-v2.txt,file-v3.txt - timestamp:
file-20240101-143022.txt - simple:
file-old.txt(overwrites previous backup)
Smart Detection Strategies
smart (Recommended)
Detects source code files while respecting .gitignore patterns. Excludes:
- Version control directories (.git, .svn)
- Dependencies (node_modules, venv)
- Build artifacts (dist, build)
- IDE files (.idea, .vscode)
- Binary files
source
All source code files regardless of .gitignore:
- Programming languages (.py, .js, .java, .cpp, etc.)
- Web files (.html, .css, .scss)
- Configuration (.json, .yaml, .toml)
- Documentation (.md, .rst, .txt)
recent
Files modified within specified days:
versctrl --smart-add recent --days 7
python
Python files only (.py)
web
Web-related files:
- HTML, CSS, SCSS, SASS, LESS
- JavaScript, TypeScript
- Vue, Svelte components
all
All files except default exclusions
Command Reference
Initialize
versctrl --init
Creates default configuration file.
File Selection
# GUI selector
versctrl --select
# Smart add with strategy
versctrl --smart-add STRATEGY [--days N]
Backup Operations
# Create new backup
versctrl --new
# List all backups
versctrl --list
# Restore specific backup
versctrl --restore FILENAME
Information
# Show statistics
versctrl --stats
# Show version
versctrl --version
# Show help
versctrl --help
# Use custom config file
versctrl --config path/to/config.json
Statistics
The --stats command shows:
- Number of tracked files
- Existing vs missing files
- Total size of tracked files
- File type distribution
- Backup count and size
- Oldest and newest backups
- Configuration summary
Example output:
============================================================
Statistics
============================================================
Tracked Files: 15
Existing: 14
Missing: 1
Total Size: 2.45 MB
Top File Types:
.py: 8
.json: 3
.md: 2
.yaml: 1
.txt: 1
Backup Directory: .versctrl_backups
Total Backups: 42
Total Size: 12.3 MB
Oldest: 2024-01-15 10:30:00
Newest: 2024-01-20 14:22:15
Configuration:
Naming Scheme: version
Keep History: 5
Create New File: False
============================================================
Default Exclusions
versctrl automatically excludes:
Version Control
- .git, .svn, .hg, .bzr
Dependencies
- node_modules, bower_components, vendor
- venv, .venv, env, .env
Python
- pycache, *.pyc, *.pyo
- *.egg-info, dist, build
IDE
- .idea, .vscode, .vs
- *.swp, *.swo, *~
OS
- .DS_Store, Thumbs.db, desktop.ini
Build Artifacts
- *.o, *.so, *.dll, *.exe
Temporary
- tmp, temp, .tmp, .cache
- *.log, logs
- *.bak, *.backup, *.old
Gitignore Support
versctrl respects .gitignore patterns in your project root:
# Example .gitignore
node_modules/
*.log
.env
dist/
Files matching these patterns will be excluded from smart detection.
GUI Features
The PyQt6 GUI provides:
File Tree
- Hierarchical view of your project
- File type icons
- Size and modification date
- Checkbox selection
Smart Detection Panel
- Strategy selector
- Days parameter for recent files
- One-click application
Search and Filter
- Real-time search
- Filter by name or extension
Bulk Operations
- Select all / Deselect all
- Expand all / Collapse all
Visual Indicators
- Color-coded file types
- Size formatting
- Previously tracked files highlighted
Use Cases
Project Development
Track source files while excluding dependencies:
cd /path/to/project
versctrl --init
versctrl --smart-add smart
versctrl --new
Configuration Management
Track config files only:
cd /path/to/configs
versctrl --init
# Manually edit versctrl.json to add config files
versctrl --new
Document Versioning
Track recently modified documents:
cd ~/Documents/thesis
versctrl --init
versctrl --smart-add recent --days 7
versctrl --new
Web Development
Track web project files:
cd ~/Sites/my-website
versctrl --init
versctrl --smart-add web
versctrl --new
Multiple Projects
Manage backups across different projects:
# Setup project 1
cd ~/project1
versctrl --init
versctrl --smart-add smart
versctrl --new
# Setup project 2
cd ~/project2
versctrl --init
versctrl --smart-add python
versctrl --new
# Later, create backups from anywhere
cd ~/project1 && versctrl --new
cd ~/project2 && versctrl --new
Best Practices
- Use Smart Detection: Start with
--smart-add smartfor most projects - Review Selection: Use
--selectGUI to review auto-detected files - Regular Backups: Run
versctrl --newbefore major changes - Check Statistics: Use
--statsto monitor backup growth - Adjust History: Set
keep_historybased on your needs - Custom Config: Use
--configfor different project profiles - Per-Project Setup: Initialize versctrl in each project directory
- Backup Before Updates: Create backups before major refactoring
Troubleshooting
Command Not Found
If versctrl is not recognized:
# Check if pip installed it correctly
pip show versctrl
# Check Python Scripts directory
python -m site --user-base
# Try running with python -m
python -m versctrl --help
Then add the Scripts directory to your PATH (see installation section).
PyQt6 Not Found
pip install PyQt6
Permission Denied
Ensure you have write permissions for:
- Configuration file location
- Backup directory
- Tracked files
On Unix systems:
chmod +x ~/.local/bin/versctrl
Missing Files Warning
Files listed in config but not found on disk will show warnings. Update config with:
versctrl --select
Large Backup Size
Reduce keep_history or exclude large files:
{
"keep_history": 3
}
Import Errors
If you get import errors:
# Reinstall with all dependencies
pip uninstall versctrl
pip install versctrl[all]
Advanced Usage
Multiple Configurations
# Development config
versctrl --config dev.json --new
# Production config
versctrl --config prod.json --new
# Testing config
versctrl --config test.json --new
Automation with Scripts
Bash Script (Linux/macOS)
#!/bin/bash
# backup-all.sh
projects=(
"$HOME/Code/project1"
"$HOME/Code/project2"
"$HOME/Documents/thesis"
)
for project in "${projects[@]}"; do
echo "Backing up $project..."
cd "$project" && versctrl --new
done
PowerShell Script (Windows)
# backup-all.ps1
$projects = @(
"$env:USERPROFILE\Code\project1",
"$env:USERPROFILE\Code\project2",
"$env:USERPROFILE\Documents\thesis"
)
foreach ($project in $projects) {
Write-Host "Backing up $project..."
Set-Location $project
versctrl --new
}
Scheduled Backups
Linux/macOS (cron)
# Edit crontab
crontab -e
# Add daily backup at 6 PM
0 18 * * * cd /path/to/project && /home/user/.local/bin/versctrl --new
# Add hourly backup during work hours
0 9-17 * * 1-5 cd /path/to/project && /home/user/.local/bin/versctrl --new
Windows (Task Scheduler)
- Open Task Scheduler
- Create Basic Task
- Set trigger (daily, weekly, etc.)
- Action: Start a program
- Program:
versctrl - Arguments:
--new - Start in:
C:\path\to\project
Comparison with Git
| Feature | versctrl | Git |
|---|---|---|
| Setup | Single command | Multiple commands |
| Learning Curve | Minimal | Moderate to steep |
| File Selection | GUI + Smart detection | Manual staging |
| Backup Speed | Fast | Fast |
| History | Configurable limit | Unlimited |
| Collaboration | No | Yes |
| Branching | No | Yes |
| Merge Conflicts | No | Yes |
| Global Install | Yes | Yes |
| Best For | Quick backups, solo work | Team projects, complex history |
License
MIT License - See LICENSE file for details
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file versctrl-1.0.3.tar.gz.
File metadata
- Download URL: versctrl-1.0.3.tar.gz
- Upload date:
- Size: 21.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
02a37b6c20cb6e32c274b9d57eba0b5e13e7d364efa8c7555a43e8a9eb5f4b23
|
|
| MD5 |
e16a9a260ff186555044c137e5218246
|
|
| BLAKE2b-256 |
cb16b3bf7f7a86777b45d56d6b5c33313cefddf6d559605be74b89b31a53e226
|
File details
Details for the file versctrl-1.0.3-py3-none-any.whl.
File metadata
- Download URL: versctrl-1.0.3-py3-none-any.whl
- Upload date:
- Size: 20.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
85f848d58e800363a50795ae0243109b3516afdec5f652b1716f355c580a4a5a
|
|
| MD5 |
4261cd38d68471ee6cefe8f4e85c1d4b
|
|
| BLAKE2b-256 |
e1f57fc38b49503612e889431d2d5483af237f5f62c4eac453c6bb6df71480df
|