Compare commits

..

No commits in common. "main" and "v0.0.2" have entirely different histories.
main ... v0.0.2

22 changed files with 71 additions and 217 deletions

2
.gitignore vendored
View file

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

3
.gitmodules vendored
View file

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

View file

@ -2,14 +2,8 @@ FROM cgr.dev/chainguard/wolfi-base
RUN apk add --no-cache tini RUN apk add --no-cache tini
# run as nobody
USER 65534:65534 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 COPY build/gdpm.static /gdpm
CMD ["/gdpm"] CMD ["/gdpm"]

22
PKGBUILD Normal file
View file

@ -0,0 +1,22 @@
# Maintainer: David J. Allen <davidallendj@gmail.com>
pkgname=gdpm
pkgver=0.0.1
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')
#groups=
depends=('glibc')
makedepends=('cmake', 'make', 'clang')
source=("https://github.com/davidallendj/gdpm/releases/download/v$pkgver/$pkgname.static.$arch.linux.static")
sha256sums=('012e3c32511d6d762ac070808e8bcae7f68dd261bf1cad3dbf4607c97aa1bb3d')
build () {
# shouldn't need to build anything with static binary...
}
package() {
cd "$srcdir/$pkgname-$pkgver"
make DESTDIR="$pkgdir/" install
}

113
README.md
View file

@ -7,26 +7,24 @@ GDPM is an attempt to make a simple, front-end, command-line, package manager de
\*GDPM has not been tested for Windows or Mac. \*GDPM has not been tested for Windows or Mac.
- [Godot Package Manager (GDPM)](#godot-package-manager-gdpm) - [Quick Start](#quick-start)
- [Quick Start](#quick-start) - [Rational](#rationale)
- [Rationale](#rationale) - [How It Works](#how-it-works)
- [How It Works](#how-it-works) - [Features](#features)
- [Features](#features) - [Building from Source](#building-from-source)
- [Installing with Package Managers](#installing-with-package-managers) - [Prerequisites](#prerequisites)
- [Building from Source](#building-from-source) - [Macro Definitions](#macro-definitions)
- [Prerequisites](#prerequisites) - [API Documentation](#api-documentation)
- [Macro Definitions](#macro-definitions) - [How to use the CLI](#how-to-use-the-cli)
- [API Documentation](#api-documentation) - [Installing, Removing, Updating, and Listing](#installing-removing-updating-and-listing)
- [How to use the CLI](#how-to-use-the-cli) - [Searching](#searching)
- [Installing, Removing, Updating, and Listing](#installing-removing-updating-and-listing) - [Linking and Cloning](#linking-and-cloning)
- [Searching](#searching) - [Cleaning Temporary Files](#cleaning-temporary-files)
- [Linking and Cloning](#linking-and-cloning) - [Managing Remote Sources](#managing-remote-sources)
- [Cleaning Temporary Files](#cleaning-temporary-files) - [Managing Configuration Properties](#managing-configuration-properties)
- [Managing Remote Sources](#managing-remote-sources) - [Planned Features](#planned-features)
- [Managing Configuration Properties](#managing-configuration-properties) - [Known Issues](#known-issues)
- [Planned Features](#planned-features) - [License](#license)
- [Known Issues](#known-issues)
- [License](#license)
@ -35,16 +33,10 @@ GDPM is an attempt to make a simple, front-end, command-line, package manager de
Common commands for searching, installing, listing, and removing assets. Common commands for searching, installing, listing, and removing assets.
```bash ```bash
# fetch updates local database if "no packages to install" error gdpm search demo
gdpm fetch gdpm install "Third Person Controller" --skip-prompt
# 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 list --style=table
gdpm remove "Godot Jolt" --clean gdpm remove "Third Person Controller" --clean
``` ```
Use `gdpm help` to see full list of commands. Use `gdpm help` to see full list of commands.
@ -108,18 +100,6 @@ The local database stores all the information sent by the Asset API with additio
* Parallel downloads using `libcurl`. * 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 ## 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. 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.
@ -138,58 +118,33 @@ 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) * fmt (may be removed later in favor of C++20 std::format)
* SQLite 3 and SQLite C++ wrapper * SQLite 3
* cxxopts
* doctest (optional; for tests, but still WIP) * doctest (optional; for tests, but still WIP)
* Doxygen (optional; to generate API docs) * Doxygen (optional; to generate API docs)
Arch Linux users can simply install required libs through `pacman` and/or `yay`: Arch Linux users can simply install required libs through pacman:
```bash ```bash
pacman -S base-devel fmt sqlite rapidjson cmake libzip curl catch2 cxxopts doctest pacman -S base-devel fmt sqlite3 rapidjson cmake libzip curl
yay -S sqlitecpp libcurlpp
``` ```
After installing the packages, clone the submodules and link the headers: After installing all necessary dependencies, build the project::
```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 ```bash
# Start by cloning the repo, then... # Start by cloning the repo, then...
git clone https://github.com/davidallendj/gdpm && cd gdpm git clone https://github.com/davidallendj/gdpm
cd gdpm
# ... if using CMake with Ninja instead (preferred and tested)... export project_root=${pwd}
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... # ...if using Meson with Clang on Linux...
meson build meson build
meson configure build # only needed if reconfiguring build meson configure build # only needed if reconfiguring build
meson compile -C build -j$(nproc) meson compile -C build -j$(nproc)
CXX=clang++ meson compile -C build -j$(nproc) CXX=clang++ meson compile -C build -j$(npoc)
# ...if using CMake with Make on Linux (needs work!)... # ...if using CMake on Linux (needs work!)...
cd build cd build
cmake .. cmake ..
make -j$(nproc) make -j$(nproc)
@ -418,17 +373,17 @@ $ gdpm config set username towk
- [ ] Adapted to new Asset API. - [ ] Adapted to new Asset API.
- [ ] Unit tests.
- [ ] User interface. - [ ] 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. - [ ] 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 ## Known Issues
* Logging doesn't write to file yet. * The code is currently still changing so API is unstable.
* Logging doesn't write to file.
* Download progress bars are not showing when downloading archives. This is being reworked to display multiple bars dynamically to better show download status. * Download progress bars are not showing when downloading archives. This is being reworked to display multiple bars dynamically to better show download status.
## License ## License
See the `LICENSE.md` file. See the LICENSE.md file.

View file

@ -1,25 +0,0 @@
# 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,16 +46,6 @@ function link_all(){
link_exe $script_dir/../build/gdpm.tests $script_dir/../bin/$tests 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(){ function clean(){
rm ${script_dir}/../bin/$exe rm ${script_dir}/../bin/$exe
@ -136,7 +126,6 @@ do
--exe) build_exe shift;; --exe) build_exe shift;;
--libs) build_libs shift;; --libs) build_libs shift;;
--tests) build_tests shift;; --tests) build_tests shift;;
--deps) get_deps shift;;
--sums) checksums shift;; --sums) checksums shift;;
-d|--docs) build_docs shift;; -d|--docs) build_docs shift;;
-c|--clean) clean shift;; -c|--clean) clean shift;;

View file

@ -1,56 +0,0 @@
# 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"
}

View file

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

View file

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

View file

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

View file

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

View file

@ -11,7 +11,7 @@ namespace gdpm::version{
int major = 0; int major = 0;
int minor = 0; int minor = 0;
int patch = 0; int patch = 0;
string description = ""; string commit = "";
}; };
std::string to_string(const context& context); std::string to_string(const context& context);

1
modules/clipp Submodule

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

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

View file

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

View file

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

View file

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

View file

@ -147,13 +147,6 @@ namespace gdpm::package_manager{
.help("set verbosity level") .help("set verbosity level")
.nargs(nargs_pattern::optional); .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_description("install package(s)");
install_command.add_argument("packages") install_command.add_argument("packages")
.required() .required()
@ -416,13 +409,6 @@ namespace gdpm::package_manager{
return log::error_rc(ec::ARGPARSE_ERROR, e.what()); 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)){ if(program.is_subcommand_used(install_command)){
action = action_e::install; action = action_e::install;
// if(install_command.is_used("packages")) // if(install_command.is_used("packages"))

View file

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

1
submodules/indicators Submodule

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