Files
sunday/UPSTREAM.md
2025-11-16 13:17:07 +10:00

357 lines
8.5 KiB
Markdown

# Updating from Upstream
This guide explains how to keep your forked Sunday Comics site up-to-date with framework improvements while preserving your customizations.
## Fork-and-Customize Workflow
Sunday Comics is designed to be forked and customized for your own webcomic. The project separates:
- **Core framework files** (updated by upstream) - app logic, templates, scripts
- **User content files** (your comic data) - comics, images, markdown content
- **User configuration** (your settings) - config and design variables
When you pull updates from upstream, you'll get new features and bug fixes without losing your content or customizations.
---
## Initial Setup
### 1. Fork the Repository
On GitHub, click "Fork" to create your own copy of Sunday Comics.
### 2. Clone Your Fork
```bash
git clone https://github.com/YOUR-USERNAME/sunday-comics.git
cd sunday-comics
```
### 3. Add Upstream Remote
Add the original repository as an "upstream" remote:
```bash
git remote add upstream https://github.com/ORIGINAL-AUTHOR/sunday-comics.git
```
Verify your remotes:
```bash
git remote -v
# origin https://github.com/YOUR-USERNAME/sunday-comics.git (fetch)
# origin https://github.com/YOUR-USERNAME/sunday-comics.git (push)
# upstream https://github.com/ORIGINAL-AUTHOR/sunday-comics.git (fetch)
# upstream https://github.com/ORIGINAL-AUTHOR/sunday-comics.git (push)
```
### 4. Set Up Your Configuration
**Option A: Track your config in git (recommended)**
Your `comics_data.py` and `static/css/variables.css` files are already set up. Customize them and commit:
```bash
# Edit your configuration
nano comics_data.py
nano static/css/variables.css
# Commit your changes
git add comics_data.py static/css/variables.css
git commit -m "Configure site settings and design"
git push origin main
```
**Option B: Keep config out of git**
If you prefer to keep your config private:
```bash
# Uncomment the gitignore lines for config files
nano .gitignore
# Uncomment:
# comics_data.py
# static/css/variables.css
# Copy the example files
cp comics_data.py comics_data.py.backup
# Now comics_data.py won't be tracked
```
---
## Getting Updates from Upstream
### 1. Fetch Upstream Changes
```bash
git fetch upstream
```
This downloads new commits from the original repository without modifying your files.
### 2. Review What Changed
See what's new in upstream:
```bash
# View commit log
git log HEAD..upstream/main --oneline
# See which files changed
git diff HEAD..upstream/main --stat
# Review the CHANGELOG
git show upstream/main:CHANGELOG.md
```
### 3. Merge Upstream Changes
```bash
# Merge upstream into your current branch
git merge upstream/main
```
**If there are no conflicts:**
```bash
# Push the updates to your fork
git push origin main
```
**If there are conflicts** (see next section).
---
## Handling Merge Conflicts
Conflicts may occur if both you and upstream modified the same file. Common scenarios:
### Scenario 1: Framework Added New Config Options
**Example:** Upstream added a new setting to `comics_data.py.example`
**What to do:**
1. The merge conflict will only be in `comics_data.py.example` (not your `comics_data.py`)
2. Accept upstream's version:
```bash
git checkout --theirs comics_data.py.example
git add comics_data.py.example
```
3. Review `comics_data.py.example` for new settings
4. Manually add any new settings you want to your `comics_data.py`
### Scenario 2: CSS Variables Conflict
**Example:** Both you and upstream added/changed CSS variables
**What to do:**
1. Open the conflicted file:
```bash
nano static/css/variables.css
```
2. Look for conflict markers:
```
<<<<<<< HEAD
--your-custom-variable: #ff0000;
=======
--new-upstream-variable: #00ff00;
>>>>>>> upstream/main
```
3. Keep both variables:
```css
--your-custom-variable: #ff0000;
--new-upstream-variable: #00ff00;
```
4. Save and mark as resolved:
```bash
git add static/css/variables.css
git commit -m "Merge upstream CSS variables"
```
### Scenario 3: Rare - Core File Conflicts
If you modified a core framework file (app.py, templates, etc.), you may have conflicts.
**Best practice:** Avoid modifying core files. If you need custom behavior:
- Add new routes/functions instead of modifying existing ones
- Use template blocks for customization
- Open an issue/PR to suggest the feature for upstream
**If you must resolve:**
```bash
# Open the conflicted file
nano path/to/conflicted_file.py
# Resolve conflicts manually
# Then:
git add path/to/conflicted_file.py
git commit -m "Merge upstream changes with custom modifications"
```
---
## File Categories Reference
### Core Framework (Upstream Updates)
**DO NOT modify these files** - you'll get conflicts when merging:
- `app.py` - Flask application
- `data_loader.py` - YAML loading logic
- `scripts/*.py` - Utility scripts
- `templates/*.html` - Jinja templates (unless extending)
- `static/css/style.css` - Core CSS framework
- `static/js/*.js` - JavaScript functionality
- `version.py`, `VERSION` - Version info
- `Dockerfile`, `docker-compose.yml` - Deployment config
- Documentation files (README, CLAUDE, etc.)
### User Configuration (You Customize)
**Safe to modify** - tracked in git:
- `comics_data.py` - Your site settings
- `static/css/variables.css` - Your design variables
- `data/comics/*.yaml` - Your comic metadata
- `content/*.md` - Your markdown content (about page, author notes)
- `static/images/*` - Your images and graphics
### Template Files (Reference)
**Use as reference** - copy to create your versions:
- `comics_data.py.example` - Default configuration template
- `data/comics/TEMPLATE.yaml` - Comic file template
### Generated Files (Ignored by Git)
**Automatically regenerated:**
- `static/feed.rss` - RSS feed
- `static/sitemap.xml` - Sitemap
- `data/comics/.comics_cache.pkl` - Comic cache
- `__pycache__/` - Python bytecode
---
## Migration Notes
When upstream releases breaking changes, check `CHANGELOG.md` for migration instructions.
**Example migration scenario:**
```markdown
## [2025.03.15] - Breaking Changes
### Changed
- Renamed `SHOW_HEADER_IMAGE` to `HEADER_IMAGE` in comics_data.py
**Migration:** Update your `comics_data.py`:
- Old: `SHOW_HEADER_IMAGE = True`
- New: `HEADER_IMAGE = 'title.jpg'`
```
After merging, check the CHANGELOG and update your config accordingly.
---
## Best Practices
### ✅ DO:
- Keep your fork's main branch in sync with upstream
- Customize via `comics_data.py` and `variables.css`
- Add your comics to `data/comics/`
- Read the CHANGELOG before/after merging
- Test your site after merging updates
- Commit your changes regularly
### ❌ DON'T:
- Modify core framework files (app.py, templates, etc.)
- Delete or rename upstream files (you'll break updates)
- Force push over merged commits
- Ignore merge conflicts (resolve them properly)
---
## Troubleshooting
### "I modified a core file and now I have conflicts"
**Option 1: Keep your changes** (advanced)
```bash
# Resolve conflicts manually, testing thoroughly
git mergetool
git commit
```
**Option 2: Discard your changes** (start fresh)
```bash
# Reset to upstream version
git checkout upstream/main -- path/to/file.py
git add path/to/file.py
git commit -m "Reset to upstream version"
```
### "I want to see what changed before merging"
```bash
# Create a test branch
git checkout -b test-upstream-merge
# Merge in the test branch
git merge upstream/main
# If you like it, merge to main
git checkout main
git merge test-upstream-merge
# If not, delete the test branch
git checkout main
git branch -D test-upstream-merge
```
### "My site broke after merging"
```bash
# Check what changed
git log --oneline -10
# Test the previous version
git checkout HEAD~1
python app.py
# If it works, the issue is in the latest commit
git checkout main
git diff HEAD~1 HEAD
# Read CHANGELOG for migration notes
cat CHANGELOG.md
```
---
## Getting Help
- **Check the docs:** `README.md`, `CLAUDE.md`, `CHANGELOG.md`
- **Report issues:** [GitHub Issues](https://github.com/ORIGINAL-AUTHOR/sunday-comics/issues)
- **Ask questions:** Open a discussion or issue on GitHub
---
## Summary
**Regular update workflow:**
```bash
# Every few weeks/months:
git fetch upstream # Get new commits
git log HEAD..upstream/main --oneline # Review changes
git merge upstream/main # Merge updates
# Resolve any conflicts
git push origin main # Push to your fork
python scripts/publish_comic.py # Rebuild site
```
Your comics, images, and config stay safe - only the framework code updates!