summaryrefslogtreecommitdiff
path: root/docs/handbook/meshmc/release-notes.md
blob: 02391fca2cd0831640b7e1d7e47479207744b071 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
# Release Notes

## Versioning Scheme

MeshMC follows a three-component version scheme:

```
MAJOR.MINOR.HOTFIX
```

Defined in the top-level `CMakeLists.txt`:

```cmake
set(MeshMC_VERSION_MAJOR    7)
set(MeshMC_VERSION_MINOR    0)
set(MeshMC_VERSION_HOTFIX   0)
set(MeshMC_VERSION_NAME "${MeshMC_VERSION_MAJOR}.${MeshMC_VERSION_MINOR}.${MeshMC_VERSION_HOTFIX}")
```

| Component | When Incremented |
|---|---|
| **MAJOR** | Breaking changes, major feature overhauls |
| **MINOR** | New features, significant improvements |
| **HOTFIX** | Bug fixes, security patches |

### Build Metadata

Additional version metadata is generated at build time:

```cmake
set(MeshMC_BUILD_PLATFORM "${CMAKE_SYSTEM_NAME}")   # Linux, Darwin, Windows
set(MeshMC_GIT_COMMIT ...)                            # Git commit hash
set(MeshMC_GIT_TAG ...)                               # Git tag if on a tag
```

The full version string displayed in the About dialog includes platform and git info.

## Update System

MeshMC uses a dual-source update checking system.

### UpdateChecker

```cpp
class UpdateChecker : public QObject
{
    Q_OBJECT
public:
    void checkForUpdate(QString updateUrl, bool notifyNoUpdate);

    bool hasNewUpdate() const;
    QString getLatestVersion() const;
    QString getDownloadUrl() const;
    QString getChangelog() const;

signals:
    void updateAvailable(QString version, QString url, QString changelog);
    void noUpdateAvailable();
    void updateCheckFailed();

private:
    void parseRSSFeed(const QByteArray& data);
    void parseGitHubRelease(const QJsonObject& release);

    QString m_currentVersion;
    QString m_latestVersion;
    QString m_downloadUrl;
    QString m_changelog;
    bool m_hasUpdate = false;
};
```

### Update Sources

#### RSS Feed

Primary update channel — an RSS/Atom feed listing available versions:

```
https://projecttick.org/feed/meshmc.xml
```

The feed contains:
- Version number
- Download URLs per platform
- Changelog summary

#### GitHub Releases

Fallback/alternative update source using the GitHub Releases API:

```
https://api.github.com/repos/Project-Tick/MeshMC/releases/latest
```

Returns:
- Tag name (version)
- Release body (changelog in Markdown)
- Asset download URLs

### Update Check Flow

```
Application startup (if AutoUpdate enabled)
    │
    └── UpdateChecker::checkForUpdate()
            │
            ├── Fetch RSS feed
            │   ├── Parse version from <item> entries
            │   ├── Compare with current version
            │   └── Extract download URL + changelog
            │
            ├── OR Fetch GitHub release
            │   ├── Parse tag_name for version
            │   ├── Compare with current version
            │   └── Extract asset URL + body
            │
            ├── If new version available:
            │   └── emit updateAvailable(version, url, changelog)
            │       └── MainWindow shows update notification
            │
            └── If no update:
                └── emit noUpdateAvailable()
```

### Update Settings

```cpp
m_settings->registerSetting("AutoUpdate", true);
m_settings->registerSetting("UpdateChannel", "stable");
```

| Setting | Values | Description |
|---|---|---|
| `AutoUpdate` | `true`/`false` | Check for updates on startup |
| `UpdateChannel` | `stable`/`beta` | Which release channel to follow |

### Update Dialog

When an update is available, `UpdateDialog` is shown:

- Displays current version vs. available version
- Shows changelog (rendered from Markdown via cmark)
- "Update Now" button → opens download URL in browser
- "Skip This Version" → suppresses notification for this version
- "Remind Me Later" → dismisses until next startup

### Sparkle (macOS)

On macOS, updates are handled by the Sparkle framework instead of the built-in `UpdateChecker`:

- Native macOS update UI
- Differential updates (only download changed parts)
- Code signature verification
- Appcast feed (XML similar to RSS)
- Background update installation

```cpp
#ifdef Q_OS_MACOS
    // Use Sparkle for updates instead of built-in checker
    SUUpdater* updater = [SUUpdater sharedUpdater];
    [updater setAutomaticallyChecksForUpdates:autoUpdate];
    [updater checkForUpdatesInBackground];
#endif
```

## Distribution

### Build Artifacts

| Platform | Artifact | Format |
|---|---|---|
| Linux | AppImage | `.AppImage` |
| Linux | Tarball | `.tar.gz` |
| Linux | Nix | Flake output |
| macOS | Disk Image | `.dmg` (app bundle) |
| Windows | Installer | `.exe` (NSIS) |
| Windows | Portable | `.zip` |

### Release Branches

| Branch | Purpose |
|---|---|
| `develop` | Active development |
| `release-7.x` | Current stable release line |
| Tagged releases | `v7.0.0`, `v7.0.1`, etc. |

Backports from `develop` to `release-*` branches are automated via GitHub Actions (see [Contributing](contributing.md#backporting)).

## Changelog Format

Release changelogs follow this structure:

```markdown
## MeshMC 7.0.0

### New Features
- Feature description

### Bug Fixes
- Fix description

### Internal Changes
- Change description

### Dependencies
- Updated Qt to 6.7.x
```

## Current Version

**MeshMC 7.0.0** — Initial release as MeshMC (fork of PrismLauncher/MultiMC).

Key features:
- C++23 codebase with Qt6
- Microsoft Account authentication via OAuth2
- Multi-platform support (Linux, macOS, Windows)
- Instance management with component system
- Mod management with CurseForge, Modrinth, ATLauncher, FTB, Technic integration
- Customizable themes and icon packs
- Managed Java downloads
- Automatic update checking