Compare commits

...

41 commits
v0.0.1 ... main

Author SHA1 Message Date
f59319ad16
removed curlpp includes causing build to fail 2024-10-25 21:27:56 -06:00
13487a1498
Removed extra line from README.md 2024-08-28 23:42:52 -06:00
62bb8fabdf
Simplified README.md and added ninja build info 2024-08-28 23:42:08 -06:00
aebd86b70a
Updated README.md to install on Arch Linux 2024-08-28 23:36:25 -06:00
d50dbeb051
Updated .gitignore 2024-08-28 23:31:15 -06:00
7570f48cad
Updated PKGBUILD to remove existing module links 2024-08-28 23:29:49 -06:00
David Allen
341f0752a3
Merge pull request #16 from davidallendj/pkgbuild
Update PKGBUILD to build using `main` branch
2024-08-28 23:21:20 -06:00
9f56c0b8c7
Updated PKGBUILD to build from git 'main' 2024-08-28 23:20:04 -06:00
a6635b1f02
Added ignore_validation flag check and CLI argument 2024-08-18 14:42:31 -06:00
e8020aa0b0
Added log prints in main.cpp 2024-08-18 14:42:30 -06:00
1e92c16cdf
Removed unused includes from main.cpp 2024-08-18 14:42:30 -06:00
2b5c838a4f
Added ignore_validation flag to config 2024-08-18 14:42:30 -06:00
6199486b68
Updated README.md with updating submodules 2024-08-18 14:42:27 -06:00
David Allen
f77d92cfef
Merge pull request #12 from davidallendj/project-validation
Add project validation check and corresponding CLI `--ignore-validation` option
2024-08-18 14:04:37 -06:00
c78cdd3da9
Added ignore_validation flag check and CLI argument 2024-08-18 13:42:02 -06:00
ce347d9b56
Added log prints in main.cpp 2024-08-18 13:41:25 -06:00
6ab1345cfe
Removed unused includes from main.cpp 2024-08-18 13:35:51 -06:00
920d648a51
Added ignore_validation flag to config 2024-08-18 13:35:21 -06:00
adb80a7176
Added initial SConstruct 2024-08-17 21:28:02 -06:00
1fe1f19891 Updated README.md with updating submodules 2024-07-15 20:43:02 -06:00
defbc079cd
Initial SConstruct build script 2024-07-14 21:26:43 -06:00
5819c76289
Tidied repository with other small changes 2024-07-14 20:17:47 -06:00
c1ca0524f1
Updated compile script to fetch dependencies 2024-07-14 20:12:15 -06:00
56adb85f4d
Updated Dockerfile 2024-07-14 20:11:37 -06:00
113dee2194
Added more useful info to README.md 2024-06-09 00:22:50 -06:00
050b7a482b
Added more needed dependencies 2024-06-09 00:11:44 -06:00
e225312197
Fixed curl C++ wrapper library from AUR 2024-06-09 00:09:20 -06:00
846bc4932f
Updated README.md to include getting deps and linking headers 2024-06-09 00:07:14 -06:00
13da8c03f2
More README tidying 2024-05-07 22:37:58 -06:00
23b27bf276
Tidied README.md 2024-05-07 22:36:49 -06:00
3eacaf1d72
Removed .trunk directory 2024-05-07 22:22:38 -06:00
2e9da2582a
Removed trunk related files 2024-05-07 22:17:46 -06:00
14dd5a1c7a
Updated README.md with Arch Linux install packages 2024-05-07 22:16:27 -06:00
d4b8c7ea36
Updated README.md 2024-03-03 19:27:52 -07:00
396ec234cf
Updated README.md 2024-03-03 19:24:49 -07:00
6141f7af8b
Updated README.md 2024-03-03 19:21:23 -07:00
644d79a7e4
Updated bin/compile.sh script to build with newer version of CMake 2024-03-03 19:17:36 -07:00
4b0ded6b5b
Removed Poco as dependencies 2024-03-03 19:11:11 -07:00
d2a77fe28f Bump default godot version for search
- Change error code from `NONE` TO `IGNORE`
- Added format function to utils
- Implement version functions
2024-01-27 14:34:17 -07:00
d9a9ea6426 Updated README.md 2023-10-07 13:46:39 -06:00
ce5f0aaa63 Created initial PKGBUILD and Dockerfile
- Update `bin/compile.sh` to generate sha256sums from binaries
2023-10-07 13:42:59 -06:00
31 changed files with 312 additions and 80 deletions

2
.gitignore vendored
View file

@ -16,3 +16,5 @@ vgcore.*
config.json
*.txt
actions-runner/
**.tar.gz
**.tar.zst

3
.gitmodules vendored
View file

@ -16,3 +16,6 @@
[submodule "modules/argparse"]
path = modules/argparse
url = https://github.com/p-ranav/argparse
[submodule "modules/indicators"]
path = modules/indicators
url = https://github.com/p-ranav/indicators

3
.trunk/.gitignore vendored
View file

@ -1,3 +0,0 @@
*out
*logs
external

View file

@ -1 +0,0 @@
/home/david/.cache/trunk/repos/4c139ff7a07a0441c956056eef1736ac/actions

View file

@ -1 +0,0 @@
/home/david/.cache/trunk/repos/4c139ff7a07a0441c956056eef1736ac/notifications

View file

@ -1,11 +0,0 @@
version: 0.1
cli:
version: 1.2.1
lint:
enabled:
- git-diff-check@SYSTEM
- gitleaks@8.9.0
- markdownlint@0.32.1
- prettier@2.7.1
- shellcheck@0.8.0
- shfmt@3.5.0

View file

@ -23,7 +23,7 @@ find_package(RapidJSON CONFIG REQUIRED)
find_package(fmt CONFIG REQUIRED)
find_package(Catch2 CONFIG REQUIRED)
find_package(cxxopts CONFIG REQUIRED)
find_package(Poco CONFIG REQUIRED COMPONENTS Net JSON Util)
#find_package(Poco CONFIG REQUIRED COMPONENTS Net JSON Util)
find_package(libzip CONFIG REQUIRED)
find_package(SQLiteCpp CONFIG REQUIRED)
@ -36,6 +36,9 @@ set(INCLUDE_DIRS
"include"
"/usr/include/doctest"
${RAPIDJSON_INCLUDE_DIRS}
# Poco::Net
# Poco::JSON
#Poco::Util
)
set(LINK_LIBS
fmt::fmt
@ -43,6 +46,9 @@ set(LINK_LIBS
Catch2::Catch2
cxxopts::cxxopts
SQLiteCpp
#Poco::Net
#Poco::JSON
#Poco::Util
-lcurlpp
-lzip
-lsqlite3

17
Dockerfile Normal file
View file

@ -0,0 +1,17 @@
FROM cgr.dev/chainguard/wolfi-base
RUN apk add --no-cache tini
# run as nobody
USER 65534:65534
# build the binary then copy into container
RUN bin/compile.sh --link
RUN bin/compile.sh --all
COPY build/gdpm.static /gdpm
CMD ["/gdpm"]
ENTRYPOINT [ "/sbin/tini", "--" ]

136
README.md
View file

@ -7,24 +7,26 @@ GDPM is an attempt to make a simple, front-end, command-line, package manager de
\*GDPM has not been tested for Windows or Mac.
- [Quick Start](#quick-start)
- [Rational](#rationale)
- [How It Works](#how-it-works)
- [Features](#features)
- [Building from Source](#building-from-source)
- [Prerequisites](#prerequisites)
- [Macro Definitions](#macro-definitions)
- [API Documentation](#api-documentation)
- [How to use the CLI](#how-to-use-the-cli)
- [Installing, Removing, Updating, and Listing](#installing-removing-updating-and-listing)
- [Searching](#searching)
- [Linking and Cloning](#linking-and-cloning)
- [Cleaning Temporary Files](#cleaning-temporary-files)
- [Managing Remote Sources](#managing-remote-sources)
- [Managing Configuration Properties](#managing-configuration-properties)
- [Planned Features](#planned-features)
- [Known Issues](#known-issues)
- [License](#license)
- [Godot Package Manager (GDPM)](#godot-package-manager-gdpm)
- [Quick Start](#quick-start)
- [Rationale](#rationale)
- [How It Works](#how-it-works)
- [Features](#features)
- [Installing with Package Managers](#installing-with-package-managers)
- [Building from Source](#building-from-source)
- [Prerequisites](#prerequisites)
- [Macro Definitions](#macro-definitions)
- [API Documentation](#api-documentation)
- [How to use the CLI](#how-to-use-the-cli)
- [Installing, Removing, Updating, and Listing](#installing-removing-updating-and-listing)
- [Searching](#searching)
- [Linking and Cloning](#linking-and-cloning)
- [Cleaning Temporary Files](#cleaning-temporary-files)
- [Managing Remote Sources](#managing-remote-sources)
- [Managing Configuration Properties](#managing-configuration-properties)
- [Planned Features](#planned-features)
- [Known Issues](#known-issues)
- [License](#license)
@ -33,10 +35,16 @@ GDPM is an attempt to make a simple, front-end, command-line, package manager de
Common commands for searching, installing, listing, and removing assets.
```bash
gdpm search demo
gdpm install "Third Person Controller" --skip-prompt
# fetch updates local database if "no packages to install" error
gdpm fetch
# search and install "Godot Jolt" globally
gdpm search jolt
gdpm install "Godot Jolt" --skip-prompt
# list installed packages and remove
gdpm list --style=table
gdpm remove "Third Person Controller" --clean
gdpm remove "Godot Jolt" --clean
```
Use `gdpm help` to see full list of commands.
@ -98,6 +106,20 @@ The local database stores all the information sent by the Asset API with additio
* Export list of installed packages to reinstall later.
* Parallel downloads using `libcurl`.
## Installing with Package Managers
Currently, `gdpm` can only be installed using `makepkg` on Arch Linux with plans of packaging for other distributions in the future.
```bash
git clone https://github.com/davidallendj/gdpm && cd gdpm/dist/archlinux
makepkg -si
```
This should build the static binary from source and then install it in `/usr/bin/gdpm`.
## Building from Source
The project uses the CMake or Meson build system and has been tested with GCC and Clang on Arch/Manjaro Linux. CMake is preferred, but a `meson.build` script is provided and should work with some tweaking. Building on Windows or Mac has not been tested yet so it's not guaranteed to work. Compiling with CMake will build 2 executables, 3 shared libraries, and an archive library to link, while compiling with Meson only builds an executable that links with a shared library.
@ -116,32 +138,63 @@ The project uses the CMake or Meson build system and has been tested with GCC an
* fmt (may be removed later in favor of C++20 std::format)
* SQLite 3
* SQLite 3 and SQLite C++ wrapper
* cxxopts
* doctest (optional; for tests, but still WIP)
* Doxygen (optional; to generate API docs)
After installing all necessary dependencies, build the project::
Arch Linux users can simply install required libs through `pacman` and/or `yay`:
```bash
pacman -S base-devel fmt sqlite rapidjson cmake libzip curl catch2 cxxopts doctest
yay -S sqlitecpp libcurlpp
```
After installing the packages, clone the submodules and link the headers:
```bash
git submodule add https://github.com/p-ranav/argparse modules/argparse
git submodule add https://github.com/p-ranav/tabulate modules/tabulate
git submodule add https://github.com/p-ranav/indicators modules/indicators
git submodule add https://github.com/p-ranav/csv2 modules/csv2
ln -s ../modules/argparse/include/argparse include/argparse
ln -s ../modules/tabulate/include/tabulate include/tabulate
ln -s ../modules/indicators/include/indicators include/indicators
ln -s ../modules/csv2/include/csv2 include/csv2
```
Otherwise, you can just update the modules if they're already there and out-of-date:
```bash
git submodule update --init --recursive
```
And then build the binaries (check the "build" directory):
```bash
# Start by cloning the repo, then...
git clone https://github.com/davidallendj/gdpm
cd gdpm
export project_root=${pwd}
git clone https://github.com/davidallendj/gdpm && cd gdpm
# ... if using CMake with Ninja instead (preferred and tested)...
cmake -B build -S . -D CMAKE_EXPORT_COMPILE_COMMANDS=1 -D CMAKE_BUILD_TYPE=Release -G Ninja
ninja -C build -j$(nproc)
# ...if using Meson with Clang on Linux...
meson build
meson configure build # only needed if reconfiguring build
meson compile -C build -j$(nproc)
CXX=clang++ meson compile -C build -j$(npoc)
CXX=clang++ meson compile -C build -j$(nproc)
# ...if using CMake on Linux (needs work!)...
# ...if using CMake with Make on Linux (needs work!)...
cd build
cmake ..
make -j$(nproc)
# Easy build using predefined `compile` script
# Easy build using predefined `compile` script
${project_root}/bin/compile.sh --all
@ -227,6 +280,19 @@ $ gdpm export path/to/packages.txt
$ gdpm install -f path/to/packages.txt --sync=disable --skip-prompt
```
If you get a "no packages found to install" error message, try doing a `gdpm fetch` to update the local cache database, then try again.
```bash
$ gdpm install "Godot Jolt"
[ERROR 07:18:41 PM; 2024-03-03] package::install(): no packages found to install.
$ gdpm fetch  ✔
[INFO 07:19:19 PM; 2024-03-03] Sychronizing database...Done.
$ gdpm install "Godot Jolt"  ✔
Title Author Category Version Godot Last Modified Installed?
Godot Jolt mihe Misc 16 4.2 2024-01-08 11:10:46 ❌
Do you want to install these packages? (Y/n)
```
If you leave out the `--skip-prompt` flag, hit enter to install by default.
```bash
@ -338,7 +404,9 @@ $ gdpm config set username towk
- [x] Parallel downloading.
- [ ] PKGBUILD for ArchLinux/Manjaro.
- [X] PKGBUILD for ArchLinux/Manjaro.
- [X] Dockerfile to run in sandbox.
- [ ] Proper updating.
@ -350,17 +418,17 @@ $ gdpm config set username towk
- [ ] Adapted to new Asset API.
- [ ] Unit tests.
- [ ] User interface.
- [ ] Experimental dependency management. There is no way of handling dependencies using the Godot Asset API. This is a [hot topic](https://github.com/godotengine/godot-proposals/issues/142) and might change in the near future.
## Known Issues
* The code is currently still changing so API is unstable.
* Logging doesn't write to file.
* Logging doesn't write to file yet.
* Download progress bars are not showing when downloading archives. This is being reworked to display multiple bars dynamically to better show download status.
## License
See the LICENSE.md file.
See the `LICENSE.md` file.

25
SConstruct Normal file
View file

@ -0,0 +1,25 @@
# set up variables and glob files
env = Environment(
CPPPATH = Glob('include/*.hpp'),
CPPDEFINES = [],
LIBS = []
)
base_name = "gdpm"
include_files = Glob('include/*.hpp')
source_files = Glob('src/*.cpp')
test_files = Glob('tests/*.cpp')
compile_flags = ""
# build the main executable and tests
env.Program(f'{base_name}', source_files)
env.Program(f'{base_name}.tests', test_files)
# build the static library
StaticLibrary(f'{base_name}-static')
# build the shared libraries
SharedLibrary(f'{base_name}-shared')
SharedLibrary(f'{base_name}-static')
SharedLibrary(f'{base_name}-http')
SharedLibrary(f'{base_name}-restapi')

View file

@ -46,6 +46,16 @@ function link_all(){
link_exe $script_dir/../build/gdpm.tests $script_dir/../bin/$tests
}
function get_deps() {
#git submodule init -f
#git submodule init -f
# link the include headers
ln -s ../modules/indicators/include/indicators include/indicators
ln -s ../modules/tabulate/include/tabulate include/tabulate
ln -s ../modules/argparse/include/argparse include/argparse
}
function clean(){
rm ${script_dir}/../bin/$exe
@ -53,6 +63,12 @@ function clean(){
rm ${script_dir}/../bin/$tests
}
function checksums(){
sha256sums ${script_dir}/../bin/$exe
sha256sums ${script_dir}/../bin/$static
sha256sums ${script_dir}/../bin/$tests
}
# Run this script at project root
#meson configure build
#CXX=clang++ meson compile -C build -j$(proc)
@ -72,6 +88,7 @@ function build_all(){
function build_exe(){
mkdir -p build
$CMAKE_COMMAND \
--build . \
--target gdpm \
--target gdpm.static
$NINJA_COMMAND
@ -81,6 +98,7 @@ function build_exe(){
function build_libs(){
mkdir -p build
$CMAKE_COMMAND \
--build . \
--target gdpm-static \
--target gdpm-shared \
--target gdpm-http \
@ -90,7 +108,7 @@ function build_libs(){
function build_tests(){
mkdir -p build
$CMAKE_COMMAND --target gdpm.tests
$CMAKE_COMMAND --build . --target gdpm.tests
$NINJA_COMMAND
}
@ -118,6 +136,8 @@ do
--exe) build_exe shift;;
--libs) build_libs shift;;
--tests) build_tests shift;;
--deps) get_deps shift;;
--sums) checksums shift;;
-d|--docs) build_docs shift;;
-c|--clean) clean shift;;
-s|--strip) strip_all shift;;

56
dist/archlinux/PKGBUILD vendored Normal file
View file

@ -0,0 +1,56 @@
# Maintainer: David J. Allen <davidallendj@gmail.com>
pkgname=gdpm-git
pkgver=r94.341f075
pkgrel=1
pkgdesc="CLI tool to automate managing Godot game engine assets from the command-line. This includes a pre-built, static binary."
arch=('x86_64')
url="https://github.com/davidallendj/gdpm"
license=('MIT')
depends=('glibc')
makedepends=('cmake' 'ninja' 'clang' 'gcc')
optdepends=('meson' 'make')
source=("$pkgname-$pkgver::git+https://github.com/davidallendj/gdpm")
sha256sums=('SKIP')
pkgver() {
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "$srcdir/$pkgname-$pkgver"
# remove all links to modules
rm -f include/argparse
rm -f include/tabulate
rm -f include/indicators
rm -f include/csv2
# update and initialize submodules
git submodule update --init modules/argparse
git submodule update --init modules/tabulate
git submodule update --init modules/indicators
git submodule update --init modules/csv2
# link module headers to include/*
ln -s ../modules/argparse/include/argparse include/argparse
ln -s ../modules/tabulate/include/tabulate include/tabulate
ln -s ../modules/indicators/include/indicators include/indicators
ln -s ../modules/csv2/include/csv2 include/csv2
}
build () {
cd "$srcdir/$pkgname-$pkgver"
bin/compile.sh --all
}
package() {
cd "$srcdir/$pkgname-$pkgver"
# install the binary to /usr/bin
mkdir -p "${pkgdir}/usr/bin"
install -m755 build/gdpm.static "${pkgdir}/usr/bin/gdpm"
}
clean() {
rm -rf "$srcdir/$pkgname-$pkgver"
}

1
include/argparse Symbolic link
View file

@ -0,0 +1 @@
../modules/argparse/include/argparse

View file

@ -16,6 +16,7 @@ namespace gdpm::cache {
string table_name = GDPM_PACKAGE_CACHE_TABLENAME;
};
bool exists(const params& = params());
error create_package_database(bool overwrite = false, const params& = params());
error insert_package_info(const package::info_list& packages, const params& = params());
result_t<package::info_list> get_package_info_by_id(const package::id_list& package_ids, const params& = params());

View file

@ -31,6 +31,7 @@ namespace gdpm::config{
bool enable_sync = true;
bool enable_cache = true;
bool skip_prompt = false;
bool ignore_validation = false;
bool enable_file_logging;
bool clean_temporary;

View file

@ -11,7 +11,7 @@
namespace gdpm::constants::error{
enum class ec{
NONE = 0,
IGNORE = 0,
UNKNOWN,
UNKNOWN_COMMAND,
UNKNOWN_ARGUMENT,
@ -93,7 +93,7 @@ namespace gdpm{
namespace ce = constants::error;
class error {
public:
constexpr explicit error(ec code = ec::NONE, const string& message = "{default}"):
constexpr explicit error(ec code = ec::IGNORE, const string& message = "{default}"):
m_code(code),
m_message(utils::replace_all(message, "{default}", ce::get_message(code)))
{}

View file

@ -53,7 +53,7 @@ namespace gdpm::rest_api{
int support;
string user = "";
string cost = "";
string godot_version = "4.0";
string godot_version = "4.3";
int max_results = 500;
int page;
int offset;

View file

@ -8,6 +8,7 @@
#include <variant>
#include <future>
#include <any>
#include <algorithm>
namespace gdpm{
class error;

View file

@ -78,6 +78,11 @@ namespace gdpm::utils {
return a;
}
template <typename...Args>
std::string format(std::string_view fmt, Args&&...args){
return std::vformat(fmt, std::make_format_args(args...));
}
bool to_bool(const std::string& s);
std::vector<std::string> split_lines(const std::string& contents);
std::string readfile(const std::string& path);
@ -97,6 +102,7 @@ namespace gdpm::utils {
std::string join(const std::vector<std::string>& target, const std::string& delimiter = ", ");
std::string join(const std::unordered_map<std::string, std::string>& target, const std::string& prefix = "", const std::string& delimiter = "\n");
std::string convert_size(long size);
// TODO: Add function to get size of decompressed zip
namespace json {

View file

@ -1,14 +1,20 @@
#pragma once
#include "error.hpp"
#include "result.hpp"
#include <string>
namespace gdpm::version{
struct version_context{
int major;
int minor;
int patch;
struct context{
int major = 0;
int minor = 0;
int patch = 0;
string description = "";
};
std::string to_string(const version_context& context);
version_context to_version(const std::string& version);
std::string to_string(const context& context);
result_t<context> to_version(const std::string& version);
bool is_valid_version_string(const std::string& version);
}

@ -1 +0,0 @@
Subproject commit 02783b6782ebedbb2bebc2e6ceda738ee51c7df2

1
modules/indicators Submodule

@ -0,0 +1 @@
Subproject commit 222382c3a6abbce32503792c59826063660ddb56

View file

@ -17,6 +17,10 @@ namespace gdpm::cache{
return utils::replace_all(s, "'", "''");
}
bool exists(const params& params) {
return std::filesystem::exists(params.cache_path);
}
error create_package_database(
bool overwrite,
const params& params

View file

@ -343,7 +343,7 @@ namespace gdpm::config{
error.set_message("Key `remote_sources` is not a JSON object.");
return error;
}
error.set_code(ec::NONE);
error.set_code(ec::IGNORE);
return error;
}

View file

@ -1,10 +1,7 @@
// Godot Package Manager (GPM)
#include "constants.hpp"
#include "log.hpp"
#include "config.hpp"
#include "package_manager.hpp"
#include "result.hpp"
#include <cstdlib>
@ -13,7 +10,13 @@ int main(int argc, char **argv){
using namespace gdpm::package_manager;
error error = initialize(argc, argv);
parse_arguments(argc, argv);
if(error.has_occurred()) {
log::error(error);
}
error = parse_arguments(argc, argv);
if(error.has_occurred()) {
log::error(error);
}
finalize();
return EXIT_SUCCESS;

View file

@ -58,7 +58,7 @@ namespace gdpm::package{
if(p_cache.empty()){
return log::error_rc(
ec::NOT_FOUND, /* TODO: change to PACKAGE_NOT_FOUND */
"package::install(): no packages found to install."
"package::install(): no package(s) found to install."
);
}

View file

@ -147,6 +147,13 @@ namespace gdpm::package_manager{
.help("set verbosity level")
.nargs(nargs_pattern::optional);
program.add_argument("--ignore-validation")
.action([&](const auto&){ config.ignore_validation = true; })
.default_value(false)
.implicit_value(true)
.help("ignore checking if current directory is a Godot project")
.nargs(0);
install_command.add_description("install package(s)");
install_command.add_argument("packages")
.required()
@ -409,6 +416,13 @@ namespace gdpm::package_manager{
return log::error_rc(ec::ARGPARSE_ERROR, e.what());
}
/* Check if we're running in a directory with 'project.godot' file */
if (!config.ignore_validation) {
if(!std::filesystem::exists("project.godot")){
return error(ec::FILE_NOT_FOUND, "no 'project.godot' file found in current directory");
}
}
if(program.is_subcommand_used(install_command)){
action = action_e::install;
// if(install_command.is_used("packages"))

View file

@ -12,10 +12,6 @@
#include <string>
#include <ostream>
#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>
#include <curlpp/Exception.hpp>
namespace gdpm::rest_api{

View file

@ -313,7 +313,7 @@ namespace gdpm::utils{
case 5: return s + " PB";
}
return std::to_string(size);
}
}
namespace json {
string from_array(

View file

@ -1,16 +1,35 @@
#include "version.hpp"
#include <regex>
namespace gdpm::version{
void print(){
}
std::string to_string(const version_context& context){
return std::string();
string to_string(const context& c){
return utils::format("{}.{}.{}", c.major, c.minor, c.patch);
}
version_context to_version(const std::string& version){
version_context v;
result_t<context> to_version(const string& version){
context v;
return v;
// check if string is valid
if(!is_valid_version_string(version)){
return result_t(context(), error(ec::IGNORE, "invalid version string"));
}
// convert string to version context
return result_t(v, error());
}
bool is_valid_version_string(const string &version){
return std::regex_match(version, std::regex("^(\\d+\\.)?(\\d+\\.)?(\\*|\\d+)$"));
}
}

@ -1 +0,0 @@
Subproject commit ef71abd9bc7254f7734fa84d5b1c336be2deb9f7