- Added the minor version to all dependencies because
cargo install
doesn't use the lockfile - Update to Libium 1.14.1
- The CurseForge API key is now written in source, no more environment variable! This is allowed as explained in the source code
- Added
--dont-add-dependencies
flag to add commands (#63) - Tweak progress bar style colours
- Changed the way the progress bar status is updated so that the spinner is smooth
- Added coloured formatting to profile listing too
add-github
now accepts thetheRookieCoder/ferium
format (only one argument)- This makes it easier to copy paste the name from the URL
- Fixed a bug when adding dependencies
- Improved the non-verbose list command by showing the source and identifier
- Added a progress bar that looks very cool when upgrading
- Not that you can see it for that long anyways :P
- Added project id to list verbose and some other small tweaks
- Upgrading now deletes old files if moving the file failed (e.g. if it's already in
.old
)- This fixes #60
- Update to Libium 1.14
- This fixes #53
- Update Releases description
- Update the way the GitHub PAT is applied to the API
- This fixes #52
- Significantly improved verbose listing to be more colourful, consistent, and informative
- Update to Libium 1.12
- Improved upgrade code to be faster and more clean
- Immediately fail if rate limit error occured
- Somewhat fixes #51
- Show the file size when downloading files
- Adding github mods now checks tried to get the latest compatible version
- Fixed #47 by using Libium 1.11.4
Upgrading and verbose listing of mods is now SUPER fast compared to before (14-20 times) due to multi threading
- Added multi threading for getting latest mod versions and downloading mods
- Added
--threads
options to limit the maximum number of additional threads - Used
Arc
in many locations to use the APIs without having to actually clone them - Added
mutex_ext
to (somewhat unsafely) recover from a poison error and lock a mutex - If a CurseForge request fails during version determination with a status code, then the request is tried again
- Requests are sent so fast the CF API gives 500 internal server errors sometimes
- Added a
.old
directory in the output directory to store 'deleted' mods - Update the output directory checking code so that the backup is only requested when there are files (because directories will not be deleted)
- Added support for user installed mods
- These are read from
<output_dir>/user
- These are read from
- There are now download and install messages when upgrading
- The
remove
command now uses arguments instead of flags- Mod names with spaces have to be given in quotes (
ferium remove "ok zoomer"
) or the spaces should be escaped (ferium remove ok\ zoomer
)
- Mod names with spaces have to be given in quotes (
- Extracted minecraft version picking in
configure
andcreate
intomod.rs
- Removed checking of Minecraft version when creating profile using arguments
- Also removed the related
--force_game_version
flag and integration test
- Also removed the related
- Added an
--import
flag toprofile create
- If only
--import
is provided, then the profile to import mods from will be asked - If
--import "Profile Name"
is provided, the mods from theProfile Name
profile will be imported
- If only
- Only check internet connection for subcommands which need it
- Extract internet connection check function
- Created a
check_output_directory()
that uhhh.. checks the output directory- If it's not called
mods
, it will output a warning - If it contains stuff, it will ask if you want to create a backup
- So that you don't lose the stuff in there when you upgrade
- Along with the original relative directory check
- If it's not called
- Made sort command convert to lowercase when sorting
- Updated Libium and Ferinth, to fix 2 issues
- CurseForge mods that have no logo no longer cause errors
- The default mods directory now uses
Application Support
rather than a shortcut to it,ApplicationSupport
(thanks douira!)
- Added
--dont_check_game_version
and--dont_check_mod_loader
flags to add commands- The check overrides are follow when checking for dependencies
- These check overrides will be added to the config automatically
- Added Quilt->Fabric backwards compatibility to the add commands' dependency checking
- Updated to Libium
1.11
- Quilt -> Fabric backwards compatibility is now handled by Ferium rather than Libium
- Updated the integration tests to use Incendium rather than Terralith because the CF API currently has some problems with Terralith
- Calls to
libium::upgrade
functions no longer provide aProfile
, the game version and mod loader to check are given instead - Getting the primary file of a Modrinth
Version
has been moved to the conversion function- A workaround with vectors is being used to avoid a possible borrow checker bug
- Ferium will now only rely on Fabric backwards compatibility if it can't find a native Quilt version. This fixes #30
- All crates have their minor version specified in
Crates.toml
- The workflow will now publish to crates.io too
- Update README
- Move upgrading code in
main.rs
tosubcommands::upgrade
- Added dependency handling to
subcommands::add
- Required dependencies will automatically be added
- Optional dependencies will be added after the user approves
Make GitHub Release downloads actually work
- Add a GitHub personal access token option to the root command
- The integration tests will use the
GITHUB_TOKEN
environment variable if it is available (e.g. during actions workflows)
- Update to Libium 1.9
- Added static variables for a yellow tick and the dialoguer colourful theme
- Extracted the pick mod loader code to
profile/mod.rs
- Added a yellow tick if the mod was compatible due to backwards compatibility
- Removed
no_patch_check
flag for the upgrade command - There are now overrides for game version and mod loader checks. For now there is no UI, you have to edit the config file manually
When picking a file from a version, Ferium will get the primary file rather than the first file
- Added a
Downloadable
struct that represents (and be converted from) a mod file from Modrinth, GitHub Releases, or CurseForge - There is now also a constant for the cross too ("×")
- Big changes to upgrading:
- Does not empty the output directory
- Checks if the latest compatible version is already downloaded, if so it does not download it again
- If there are files that are not the latest compatible version of a mod, then they are deleted. So effectively the output directory is emptied
- Added a sort command that sorts mods in alphabetical order
- Edited the
mod.rs
files to make accessing functions better - Updated some user facing output such as command help pages, and errors
- Reverted to the old output style in the add command
WARNING!
The config format has changed, your previous (pre-3.19) configs will not work! Use Frigate to update your old config to the new format
- Updated to Libium 1.6
- Improved the upgrading code in
main.rs
, taking advantage of the improved config format - Updated
remove.rs
to support the new libium version - Updated the test configs to the new format
- Improved readme
- Made commands
ferium
andferium profile
show the help page when not given any subcommands
Update to libium 1.5.1
to remove OpenSSL
- Removed
upgrade.rs
and usedlibium::upgrade
- Made errors print out red and bold
- Made ticks green using a const
- Significantly improved the output during upgrades
Removed error handling
- Removed
error.rs
- Replaced
thiserror
withanyhow
return Err(Error::Quit("Error message))
has been replaced withbail!("Error message)
from anyhow- Made upgrade command return an erraneous exit code if downloading failed
- Moved
add.rs
to libium - Small edits to accomodate changes in libium 1.4
- Massively simplified error handling, planning to replace with
anyhow
soon as it useless
Small tweaks to accomodate the changes in ferinth
and libium
- Added
gui
feature. This changes the file dialogue from a text input to a gui file dialogue - Tweaked formatting of profile list command
- Added hidden
config-file
argument - Massively improved integration tests. They are now independant from each other and can run in parallel
Switched from make to just
- Added back the verbose flag to the list command. The verbose version is the same as before, and the non-verbose version lists out all mod names only
- Small edits to the add command to support the new config format
- The list command now uses a more concise method to display lists of developers/categories (hence the new dependency
itertools
) - Many commands have been converted to work on one project at a time so there are less loops in functions and more in main.rs
- The remove command has been significantly improved and is now much faster due to the new name storing format
- The remove command now also requires argument provided names to be exactly the same
- Simplified delete profile command
- All print statements in add and upgrade functions have been removed, this means
- Errors now only have the error and no formatting
- Add GitHub repo function now accepts a
RepoHandler
rather than the repo name - All add functions now return the added item
- Adding Modrinth mods now checks if the project is a mod
- Writing to mod files has been extracted to
write_mod_file()
- All upgrade commands only download a single mod
- Downloading GitHub mods no longer picks from multiple mods
- The output directory is now emptied before mods are downloaded
- Moved all the subcommand functions in
main.rs
to seperate files - Updated the settings in
cli.rs
Functionality should not have been changed
Refactor 'mod' to 'project'
Migrated to Libium!
- Removed unneeded dependencies
- Removed the following which were replaced by libium:
json.rs
launchermeta.rs
wrappers.rs
src/util
- Moved
util/cli.rs
andutil/ferium_error.rs
tosrc/cli.rs
andsrc/error.rs
- Changed errors to the more typical style,
Error
andResult
in asrc/error.rs
- Removed
InvalidDeviceError
, libium just panics instead as it should've never been compiled on an incompatible platform - Move the
Profile::create_ui()
function to themain.rs
file - Upgrade to Ferinth v2
- Add
clean
target to makefile - Add
URLParseError
from Ferinth - Switch to an asynchronous std using tokio
- Removed verbose flag for list
- Simplify switch profile
- Use libium from crates.io
Windows MSVC support!
- The makefile target
build-win
now builds for Windows MSVC - The makefile target
build-linux
now builds for GNU Linux and GNU Windows - The makefile targets
install
andinstall-dev
now install to Cargo'sbin
directory install-dev
is now the default goal in the makefilesave_config.py
andrestore_config.py
have been updated to use pathlib so that paths are cross platform and no long *NIX paths- Added handing for Ferinth's new error
- The integration tests also don't use hardcoded *NIX paths anymore
check_empty_config()
checks for curse_project now, this was a bug fixed by SolidTux in PR #2- Move Python scripts for testing to
tests/scripts/
- Renamed
mod_ids
andrepos
tomodrinth_mods
andgithub_repos
inProfile
- Added
curse_projects
toProfile
- Added
add-curseforge
command - An API key is required to compile the application. Without this, the program will not compile. You can a provide blank value for this and the program will compile but anything using the CurseForge API will not work
- Upgrading mods now uses the downloaded file's actual filename rather than the mod name
- The remove command no long tries to remove the mod file (to be reintroduced later)
- Added 2 flags to the upgrade command
no_picker
When upgrading GitHub mods, if multiple assets are compatible a picker is normally shown. This option disables this and uses the first oneno_patch_check
Normally, upgrading curse and modrinth mods will check for the full game version, but sometimes mods works between patch versions, so this option skips checking for the patch version. This doesn't affect upgrading GitHub mods
- Made a test for the upgrade command. Will have to implement checking of the mods downloaded later
- Some integration tests have been edited to test curse mods too
- Upgrading GitHub mods now checks the releases' names for the game version too
Unreleased
- Upgrading Modrinth mods now correctly check the mod loader by converting the mod loader name to lowercase
HUGE UPDATE
- Upgraded to Clap 3.0
- Removed unit tests
- Added every single sub(sub)command to the integration tests
- The integration tests are now fully automatic because we can now pass options without the interactive UI
- Getting the config file no longer exits the program early when creating a new config file
- A more helpful error message for when decoding the config file fails
- The
profile create
subcommand now runs seperately before the current profile is read - Multiple new command have been created such as
list_profiles()
, anddelete()
- Many commands have been revamped to allow the arguments to be passed through the CLI rather than through a UI
- The
profile configure
command's UI now has an option to change the profile's name
- Removed
cli.yaml
and switched from the deprecated yaml parsing to #[derive] based arg parsing - Renamed
add
,add-repo
, andconfig
commands toadd-modrinth
,add-github
, andconfigure
- The
create
andconfig
commands are now under a new subcommandprofile
profile delete
andprofile list
subsubcommands have been added- The following commands have had options added to them so now using the interactive UI is optional. This also allows for fully automatic tests
- Remove
- Switch
- Configure
- Create
- Delete
- There are now 2 errors for quitting
- The
Quit
error stores its error message as a tuple&'static str
so that raw strings can be used - The
QuitFormatted
error stores its error message as a tupleString
so thatformat!()
can be used for more informative error messages
- The
- The
mod_loader
field inProfile
is now an enum - The
Profile::new()
is nowProfile::create_ui()
create_ui()
now checks that the name provided does not already exist, if so it will ask for a new name- Getting the path to the config file has been extracted to
get_config_file_path()
- If
get_config_file()
does not find a config file, it now just creates an empty config, writes to it, and continues to return the config file
Merry Christmas and a Happy New Year!
- The previous
Config
is now aProfile
. TheProfile
has a new field,name
- The new
Config
contains a list of profiles and the index of the active profile - Added a
create
command to create a new profile - Added a
switch
command to switch between profiles - A remove command for profiles will be added in the next update
- Switch back to Clap v2 because I'm rewriting the command system in the next update
- Edited makefile to run clippy in
make test
and builds - Many code changes based on Clippy suggestions
- Added
rustfmt.toml
and formatted code according to that - Upgraded dependencies
- Some code has been modified to support the many more nullable fields in Octocrab (WHY ARE ALL OF THEM
Option
S!?)
- Switched to
octocrab
and removedoctorok
- Lots of code has been refactored and many comments and docs have been edited and improved
- The name of config file fields have been edited so that they more accurately represent the data they hold. This breaks previous configs and requires editing field names to fix
- In the config file, repos are now stored as tuples rather than structs
- Added verbose option to the list command. So now the non-verbose list command gives less information, but is faster
- Improved error handling
- Tweaked semver patch remove function so that it works on semvers other than Minecraft's
- Switched from
fancy-regex
toonig
- Added integration tests (check the readme on how to properly run these) and some unit tests too. These tests run before makefile builds
- Switched to
thiserror
for error handling
- Ferium now compiles successfully on Linux
add_mod()
now adds the mod_id to the config rather than the provided mod ID/slug
- Migrated to Ferinth
- Fixed a bug where GitHub API requests are using HTTP rather than HTTPS
- Added developers field to
ferium list
- Tweaked
ferium list
formatting - Made internet connection check come after clap subcommand parsing so that
ferium help
andferium version
can be run without an internet connection - Tweaked
upgrade_modrinth()
version compatibility checking
- Switched to Clap's GitHub repo to get Clap v3
- Added starting directory argument to
pick_folder()
- Some wording changes in
cli.yaml
- Some small tweaks in
cli.rs
to support Clap v3 - In
json.rs
, the first time config has been moved toConfig::new()
- Previously when using a
dialouger
picker, the message was printed usingprintln!()
then the picker was rendered. Now that message has been moved to thewith_prompt()
modifier configure()
now loops until Quit is selected- Some other small improvements to
ferium config
- Tweaked
list()
's output
- Added a check for mod loader compatibility in
upgrade_modrinth()
andupgrade_github()
- Improved the GitHub Releases version and mod loader checking algorithm
download_release()
anddownload_version()
are nowdownload_asset()
anddownload_version_file()
repectively- If multiple compatible assets were found, a selector is shown to let the user pick the latest version
- The progress indicators updates now show the name of the asset being downloaded rather than the name of the
Version
orRelease
- Added function
remove_minor_version()
which is extracted fromget_latest_mc_versions()
- Migrated from
native-dialog
torfd
- Removed
NativeDialogError
as its no longer required - Removed
wrappers::print()
and replaced it witheprint!
- Removed GitHub Actions workflow
FError
now prints error messages in its custom implementation ofstd::fmt::Debug
- Made the main function also return an
FResult<()>
which on error, prints the error message fromFError
'sDebug
and exits with code1
- Build and release workflow
config
command
- Internet connection timeout
- Improved
remove
command by showing mods and repos at once ferium list
formattingget_config_file
returnsNone
, rather than erroring out, after first time setupSelect
andMultiSelect
use the colorful theme- Switched to Mozilla Public License 2.0
- Functions which change
config
values now don't write to theconfig_file
. The main function does so with those functions receiving a&mut Config
instead - All the Todo list items have been moved to a GitHub Project and
README.md
's todo list section has been removed
- Mod files for Github Releases now use the correct names
- Repositories which do not release anything no longer crash the program
- Creation of output directory before
upgrade
ing
- Upgraded to 2021 edition
- Added
make install
to compile and installferium
- Added proper error checking! (no more
unwrap()
s andpanic!()
s, only?
s) - Added check for an internet connection
- Improved check for empty config file
- Added
remove
command to remove to remove mods or repositories from config - Improved checking of releases for
.jar
assets - Removed
does_exist
for mod versions, usematch get_mod(...)
instead - Added checking of releases and versions for mc version and mod loader compatibility
- Converted using
format!()
s for path manipulation to usingpathbuf.join()
- Made
clap
use version fromcrate_version
rather than hardcoding it - Added
FError
andFResult
for error checking support - Added first time setup where user selects mod loader, mc version, and mods directory
- Added abstractions for Mojang's launcher_meta API
- Added function to get
n
of the latest versions of Minecraft (using launcher_meta)
- Some metadata in
cargo.toml
- Improved CLI to use Clap's built in
version
andhelp
subcommands
- Renamed
funcs.rs
tocalls.rs
in Labrinth and Octorok - Removed glob imports where possible
- Switched deserialisation of the file to Serde's built in
from_reader
- The relative flag in
request
has been replace with arelative_request
function - Improved file manipulation in
main.rs
andwrappers.rs
to use.join()
s instead offormat!()
- Removed all
match
andexit()
pairs to improve error handling in the future. For now these have been replaced withunwrap()
s - Made
print()
acceptimpl Display
to decreaseString
copies
- Support for GitHub Releases
Octorok
, a Github API for Rust- Made the help page a 'copy' of the README file with suitable formatting
- Version command for checking the version
- Repositories to the configuration
- Made HTTP calls non-blocking and asynchronous
- Made all HTTP calls reuse a predefined client
- Added more documentation
- Made
make
builds timed
- Added a makefile for building this project
- Added full documentation for Labrinth structs
- Updated
cli.yaml
's documentation to match the help page - Moved around Labrinth struct definitions to match its documentation
- Made the
License
struct'surl
field nullable
- This changelog
- Command line interface and corresponding code (under
cli.rs
andcli.yaml
) - Help page and command, add mod command, list mods command
Users
struct for Labrinth- JSON file write
does_exist()
function for checking if a mod exists- Error codes (see changed)
- Moved utilities to
util
folder - Made all panics into
println!
s and exits (with descriptive error codes) - Commented code better