Compare commits

..

30 commits
v0.0.2 ... 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
22 changed files with 217 additions and 71 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

View file

@ -2,8 +2,14 @@ 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"]

View file

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

115
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.
@ -100,6 +108,18 @@ The local database stores all the information sent by the Asset API with additio
* 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.
@ -118,38 +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)
Arch Linux users can simply install required libs through pacman:
Arch Linux users can simply install required libs through `pacman` and/or `yay`:
```bash
pacman -S base-devel fmt sqlite3 rapidjson cmake libzip curl
pacman -S base-devel fmt sqlite rapidjson cmake libzip curl catch2 cxxopts doctest
yay -S sqlitecpp libcurlpp
```
After installing all necessary dependencies, build the project::
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
@ -373,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
@ -126,6 +136,7 @@ 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;;

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

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

View file

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

@ -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

@ -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(

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