224 lines
5.5 KiB
Markdown
224 lines
5.5 KiB
Markdown
# NOSTR Core Library - Automatic Versioning System
|
|
|
|
## Overview
|
|
|
|
The NOSTR Core Library now features an automatic version increment system that automatically increments the patch version (e.g., v0.2.0 → v0.2.1) with each build. This ensures consistent versioning and traceability across builds.
|
|
|
|
## How It Works
|
|
|
|
### Version Format
|
|
The library uses semantic versioning with the format: `vMAJOR.MINOR.PATCH`
|
|
|
|
- **MAJOR**: Incremented for breaking changes (manual)
|
|
- **MINOR**: Incremented for new features (manual)
|
|
- **PATCH**: Incremented automatically with each build
|
|
|
|
### Automatic Increment Process
|
|
|
|
1. **Version Detection**: The build system scans all git tags matching `v*.*.*` pattern
|
|
2. **Highest Version**: Uses `sort -V` to find the numerically highest version (not chronologically latest)
|
|
3. **Patch Increment**: Increments the patch number by 1
|
|
4. **Git Tag Creation**: Creates a new git tag for the incremented version
|
|
5. **File Generation**: Generates `nostr_core/version.h` and `nostr_core/version.c` with build metadata
|
|
|
|
### Generated Files
|
|
|
|
The system automatically generates two files during each build:
|
|
|
|
#### `nostr_core/version.h`
|
|
```c
|
|
#define VERSION_MAJOR 0
|
|
#define VERSION_MINOR 2
|
|
#define VERSION_PATCH 1
|
|
#define VERSION_STRING "0.2.1"
|
|
#define VERSION_TAG "v0.2.1"
|
|
|
|
#define BUILD_DATE "2025-08-09"
|
|
#define BUILD_TIME "10:42:45"
|
|
#define BUILD_TIMESTAMP "2025-08-09 10:42:45"
|
|
|
|
#define GIT_HASH "ca6b475"
|
|
#define GIT_BRANCH "master"
|
|
|
|
// API functions
|
|
const char* nostr_core_get_version(void);
|
|
const char* nostr_core_get_version_full(void);
|
|
const char* nostr_core_get_build_info(void);
|
|
```
|
|
|
|
#### `nostr_core/version.c`
|
|
Contains the implementation of the version API functions.
|
|
|
|
## Usage
|
|
|
|
### Building with Auto-Versioning
|
|
|
|
All major build targets automatically increment the version:
|
|
|
|
```bash
|
|
# Build static library (increments version)
|
|
./build.sh lib
|
|
|
|
# Build shared library (increments version)
|
|
./build.sh shared
|
|
|
|
# Build all libraries (increments version)
|
|
./build.sh all
|
|
|
|
# Build examples (increments version)
|
|
./build.sh examples
|
|
|
|
# Install to system (increments version)
|
|
./build.sh install
|
|
```
|
|
|
|
### Non-Versioned Builds
|
|
|
|
Some targets do not increment versions:
|
|
|
|
```bash
|
|
# Clean build artifacts (no version increment)
|
|
./build.sh clean
|
|
|
|
# Run tests (no version increment)
|
|
./build.sh test
|
|
```
|
|
|
|
### Using Version Information in Code
|
|
|
|
```c
|
|
#include "version.h"
|
|
|
|
// Get version string
|
|
printf("Version: %s\n", nostr_core_get_version());
|
|
|
|
// Get full version with timestamp and commit
|
|
printf("Full: %s\n", nostr_core_get_version_full());
|
|
|
|
// Get detailed build information
|
|
printf("Build: %s\n", nostr_core_get_build_info());
|
|
|
|
// Use version macros
|
|
#if VERSION_MAJOR >= 1
|
|
// Use new API
|
|
#else
|
|
// Use legacy API
|
|
#endif
|
|
```
|
|
|
|
### Testing Version System
|
|
|
|
A version test example is provided:
|
|
|
|
```bash
|
|
# Build and run version test
|
|
gcc -I. -Inostr_core examples/version_test.c -o examples/version_test ./libnostr_core.a ./secp256k1/.libs/libsecp256k1.a -lm
|
|
./examples/version_test
|
|
```
|
|
|
|
## Version History Tracking
|
|
|
|
### View All Versions
|
|
```bash
|
|
# List all version tags
|
|
git tag --list
|
|
|
|
# View version history
|
|
git log --oneline --decorate --graph
|
|
```
|
|
|
|
### Current Version
|
|
```bash
|
|
# Check current version
|
|
cat VERSION
|
|
|
|
# Or check the latest git tag
|
|
git describe --tags --abbrev=0
|
|
```
|
|
|
|
## Manual Version Management
|
|
|
|
### Major/Minor Version Bumps
|
|
|
|
For major or minor version changes, manually create the appropriate tag:
|
|
|
|
```bash
|
|
# For a minor version bump (new features)
|
|
git tag v0.3.0
|
|
|
|
# For a major version bump (breaking changes)
|
|
git tag v1.0.0
|
|
```
|
|
|
|
The next build will automatically increment from the new base version.
|
|
|
|
### Resetting Version
|
|
|
|
To reset or fix version numbering:
|
|
|
|
```bash
|
|
# Delete incorrect tags (if needed)
|
|
git tag -d v0.2.1
|
|
git push origin --delete v0.2.1
|
|
|
|
# Create correct base version
|
|
git tag v0.2.0
|
|
|
|
# Next build will create v0.2.1
|
|
```
|
|
|
|
## Integration Notes
|
|
|
|
### Makefile Integration
|
|
- The `version.c` file is automatically included in `LIB_SOURCES`
|
|
- Version files are compiled and linked with the library
|
|
- Clean targets remove generated version object files
|
|
|
|
### Git Integration
|
|
- Version files (`version.h`, `version.c`) are excluded from git via `.gitignore`
|
|
- Only version tags and the `VERSION` file are tracked
|
|
- Build system works in any git repository with version tags
|
|
|
|
### Build System Integration
|
|
- Version increment is integrated directly into `build.sh`
|
|
- No separate scripts or external dependencies required
|
|
- Self-contained and portable across systems
|
|
|
|
## Example Output
|
|
|
|
When building, you'll see output like:
|
|
|
|
```
|
|
[INFO] Incrementing version...
|
|
[INFO] Current version: v0.2.0
|
|
[INFO] New version: v0.2.1
|
|
[SUCCESS] Created new version tag: v0.2.1
|
|
[SUCCESS] Generated version.h and version.c
|
|
[SUCCESS] Updated VERSION file to 0.2.1
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Version Not Incrementing
|
|
- Ensure you're in a git repository
|
|
- Check that git tags exist with `git tag --list`
|
|
- Verify tag format matches `v*.*.*` pattern
|
|
|
|
### Tag Already Exists
|
|
If a tag already exists, the build will continue with the existing version:
|
|
|
|
```
|
|
[WARNING] Tag v0.2.1 already exists - using existing version
|
|
```
|
|
|
|
### Missing Git Information
|
|
If git is not available, version files will show "unknown" for git hash and branch.
|
|
|
|
## Benefits
|
|
|
|
1. **Automatic Traceability**: Every build has a unique version
|
|
2. **Build Metadata**: Includes timestamp, git commit, and branch information
|
|
3. **API Integration**: Version information accessible via C API
|
|
4. **Zero Maintenance**: No manual version file editing required
|
|
5. **Git Integration**: Automatic git tag creation for version history
|