# GP - Git Push with Smart Commit Messages

A powerful, safe, and user-friendly Git workflow automation tool that intelligently generates commit messages and streamlines the commit-push process.

## Features

### 🚀 **Smart Commit Messages**
- **File type detection** - Recognizes source code, config files, documentation, and tests
- **Change analysis** - Detects additions, modifications, deletions, and renames
- **Conventional commits** - Uses prefixes like `feat:`, `docs:`, `test:`, `config:`
- **Intelligent descriptions** - Context-aware commit messages based on actual changes

### 🛡️ **Safety First**
- **Preview mode** - `--dry-run` shows exactly what will happen before executing
- **User confirmation** - Always asks before adding files or pushing changes
- **Change detection** - Prevents empty commits and handles unpushed commits
- **Clear feedback** - Colored output with detailed status information

### ⚡ **Workflow Enhancement**
- **Add-all default** - Automatically includes untracked and modified files
- **Unpushed commit handling** - Detects and offers to push existing commits
- **Branch flexibility** - Push to any branch with `--branch` option
- **Force mode** - Skip confirmations for automation scripts

### 🎯 **Professional CLI**
- **Comprehensive help** - Built-in documentation with examples
- **Bash completion** - Tab completion for all options
- **Version tracking** - Semantic versioning support
- **Standard conventions** - Follows Unix CLI best practices

## Installation

1. **Download the script:**
   ```bash
   curl -o gp https://raw.githubusercontent.com/your-repo/gp/main/gp
   chmod +x gp
   ```

2. **Place in your PATH:**
   ```bash
   mv gp ~/.local/bin/
   # or
   sudo mv gp /usr/local/bin/
   ```

3. **Verify installation:**
   ```bash
   gp version
   ```

## Quick Start

### Basic Usage
```bash
# Add all files, generate commit message, and push
gp

# Use custom commit message
gp "Fix authentication bug in login module"

# Preview what would happen without executing
gp --dry-run
```

### Example Workflow
```bash
$ gp --dry-run
[INFO] Current branch: main
[INFO] Repository: https://github.com/user/project

[INFO] Modified files (will be added):
  src/auth.py
  tests/test_auth.py
[INFO] Untracked files (will be added):
  docs/auth.md

[WARNING] Files will be automatically added before committing
[INFO] Generated commit message: 'feat: Update 3 files'
[WARNING] DRY RUN MODE - No changes will be made
[INFO] Would commit with message: 'feat: Update 3 files'
[INFO] Would push to: origin/main
```

## Command Reference

### Options

| Option | Description |
|--------|-------------|
| `-h, --help` | Show help message with examples |
| `-n, --dry-run` | Preview changes without executing |
| `-f, --force` | Skip all confirmations |
| `-a, --add-all` | Add all files including untracked (default) |
| `--staged-only` | Only commit staged changes |
| `-b, --branch BRANCH` | Push to specified branch |

### Commands

| Command | Description |
|---------|-------------|
| `gp` | Basic usage with smart defaults |
| `gp "message"` | Custom commit message |
| `gp version` | Show version information |
| `gp autocomplete` | Show completion options |

## Examples

### Basic Operations
```bash
# Standard workflow - add all files and push
gp

# Custom commit message
gp "Add user authentication feature"

# Preview before executing
gp --dry-run

# Push to different branch
gp --branch develop "Update feature branch"
```

### Advanced Usage
```bash
# Only commit staged files (don't add untracked)
gp --staged-only

# Force mode (no confirmations) - good for scripts
gp --force "Automated update"

# Combine options
gp --dry-run --branch feature/auth "Test authentication changes"
```

### Handling Different Scenarios

#### When you have unpushed commits:
```bash
$ gp
[INFO] No staged changes, but found 2 unpushed commit(s)
[INFO] Latest unpushed commit: abc1234 Fix parser bug

Push existing commits to origin/main? [y/N] y
[SUCCESS] Successfully pushed existing commits to origin/main
```

#### When you have mixed changes:
```bash
$ gp --staged-only
[INFO] Staged changes:
  src/main.py
[INFO] Modified files (unstaged, will NOT be included):
  README.md
[WARNING] Unstaged changes will NOT be included (use -a to include them)
```

## Smart Commit Message Examples

GP analyzes your changes and generates meaningful commit messages:

### Single File Changes
- `Add src/auth.py` - New file added
- `Update README.md` - Existing file modified
- `Remove old_config.json` - File deleted

### Multiple Files by Type
- `feat: Update 3 files` - Source code changes
- `docs: Update 2 files` - Documentation changes
- `test: Update 4 files` - Test file changes
- `config: Update 2 files` - Configuration changes

### File Type Detection
- **Source files**: `.py`, `.js`, `.cpp`, `.go`, `.rs`, etc.
- **Config files**: `.json`, `.yml`, `.toml`, `CMakeLists.txt`, etc.
- **Documentation**: `.md`, `.txt`, `.rst`, `README*`, `docs/*`
- **Tests**: `*test*`, `*spec*`, `test/*`, `tests/*`

## Safety Features

### Confirmation Prompts
```bash
$ gp
[INFO] Untracked files (will be added):
  new_feature.py
  tests/test_new_feature.py

Add these files and continue? [y/N] _
```

### Change Detection
- ✅ **Prevents empty commits** - Exits gracefully when no changes
- ✅ **Handles unpushed commits** - Offers to push existing commits
- ✅ **Validates git repository** - Ensures you're in a valid repo
- ✅ **Branch validation** - Confirms target branch exists

### Error Handling
- Clear error messages with suggested solutions
- Graceful handling of network issues
- Proper exit codes for script integration

## Configuration

### Environment Variables
None required - GP works out of the box.

### Git Configuration
GP respects your existing Git configuration:
- Uses your configured remote origin
- Respects Git ignore files
- Works with your existing Git hooks

## Integration

### Bash Completion
Add to your `.bashrc`:
```bash
# GP completion
_gp_completion() {
    local cur="${COMP_WORDS[COMP_CWORD]}"
    local opts=$(gp autocomplete)
    COMPREPLY=($(compgen -W "$opts" -- "$cur"))
}
complete -F _gp_completion gp
```

### Git Aliases
Add to your `.gitconfig`:
```ini
[alias]
    p = !gp
    pd = !gp --dry-run
    pf = !gp --force
```

### CI/CD Integration
```bash
# In your CI script
gp --force "Automated deployment [skip ci]"
```

## Troubleshooting

### Common Issues

#### "Not in a git repository"
- **Solution**: Run GP from within a Git repository
- **Check**: `git status` should work

#### "No changes to commit"
- **Cause**: Working tree is clean
- **Check**: `git status` to see if there are any changes

#### "Failed to push"
- **Cause**: Usually needs to pull first
- **Solution**: `git pull origin main` then try again

#### VSCode showing shellcheck errors
- **Solution**: Restart VSCode or reload the shellcheck extension
- **Check**: Command line `shellcheck gp` should show no errors

### Debug Mode
For verbose output, modify the script to set:
```bash
set -x  # Add after the shebang line for debug output
```

## Contributing

### Development
1. Fork the repository
2. Make your changes
3. Test with `shellcheck gp`
4. Submit a pull request

### Testing
```bash
# Lint the script
shellcheck gp

# Test basic functionality
./gp --dry-run

# Test with various scenarios
echo "test" > test.txt && ./gp --dry-run
```

## License

MIT License - see LICENSE file for details.

## Version History

- **v2.0.0** - Complete rewrite with safety features and smart commit messages
- **v1.0.0** - Basic git automation script

## Support

- **Issues**: Report bugs and feature requests on GitHub
- **Documentation**: This README and built-in help (`gp --help`)
- **Examples**: See the examples section above

---

**Made with ❤️ for developers who value safety and efficiency in their Git workflow.**