* feat(downloader): Install cog from specific commit in repo (initial commit)
- Repo and Installable have commit property now
- New class inheriting from Installable -
InstalledCog (old one from converters.py removed)
- New Repo.checkout() method, which is also async ctx manager
ref #2527
* fix(downloader): Keep information about repo's branch in config
- This is needed to make sure that repo can go back from detached state in some rare unexpected
cases
- current branch is determined by `git symbolic-ref` now as this command errors for detached
HEAD
* feat(downloader): Update repo without cogs, update single cog
The most important part of issue #2527 has been added here
- `[p]repo update` command added
- new conf format - nested dictionary repo_name->cog_name->cog_json
installed libraries are now kept in conf too
- `InstalledCog` renamed to `InstalledModule` - installed libraries use this class
- `Downloader.installed_libraries()` and `Downloader.installed_modules()` added
- `Downloader._add_to_installed()` and `Downloader._remove_from_installed()`
now accept list of modules, of both cogs and libraries
- `[p]cog install` tells about fails of copying cog and installing shared libraries
- `[p]cog update` will truly update only chosen cogs (if provided) or cogs that need update
- pinned cogs aren't checked
- before update, repos are updated
- to determine if update is needed `Repo.get_modified_modules()` is used
- `[p]cog pin` and `[p]cog unpin` commands for pinning/unpinning cogs added
- `Repo.checkout()` allows to choose ctx manager exit's checkout revision
- `Repo.install_cog()` returns `InstalledModule` now and raises CopyingError (maybe breaking?)
- `Repo.install_libraries()` returns 2-tuple of installed and failed libraries (maybe breaking?)
- `RepoManager.get_all_cogs()` added, which returns cogs from all repos
- `RepoManager.repos` property added, which contains tuple of `Repo`
* test(downloader): Repo.current_branch() throws an exception, when branch can't be determined
* style(downloader): rename _add_to_installed to _save_to_installed
This method is used for both adding and updating existing modules in Config
* refactor(downloader): add ctx.typing() for few commands
`[p]cog install` is nested hell, can't wait for moving install logic to separate method
* fix(downloader): refactor and fix `set` usage
* perf(downloader): update commits for ALL checked modules to omit diffs next time
This will also disable running git diff for cogs that have the same commit as the latest one
* style(downloader): few style improvements
- use of mutable object in method definition
- make Repo._get_full_sha1() public method
- too long
line
- don't use len to check if sequence is empty
* feat(downloader): add `[p]cog updateallfromrepos` and `[p]cog updatetoversion` commands
- moved cog update logic into `Downloader._cog_update_logic()` (lack of better name)
- splitted
whole cog update process into smaller methods
- might still need some improvements
- added new
methods to `Repo` class:
- `is_on_branch()` to check if repo is currently checked out to branch
- `is_ancestor()` to check if one commit is ancestor of the other
- fix for
`Downloader._available_updates()` behaviour
broken by commit
5755ab08ba67556b3863e907c6f44d80f4f13d88
* feat(downloader): try to find last commit where module is still present
Enhancements:
- `Installable` now has `repo` attribute containing repo object or `None` if repo is
missing
- `Downloader._install_cogs()` and `Downloader._reinstall_libraries()` are able to install
modules from different commits of repo
- `Repo.checkout()` as ctx manager will now exit to commit
which was active before checking out
- unification of `rev` and `hash` terms:
All function
parameters are explicitly called `hash`, if it can only be commit's full sha1 hash or `rev` if it
can be anything that names a commit object, see
[link](https://git-scm.com/docs/git-rev-parse#_specifying_revisions)
- new
`Repo.get_last_module_occurence()` method, which gets module's Installable from last commit in which
it still occurs
* docs(downloader): Add basic description for `InstalledModule`
* fix(downloader): cog ignored during updates if its commit was missing
After config format update, commit string is empty until update and when such cog was checked and it
wasn't available in repo anymore, it was ignored
* refactor(downloader): Installing cogs from specific rev will pin them
* perf(downloader): Don't checkout when current commit equals target hash
- changes to `Repo.checkout()`:
- `exit_to_rev` is now keyword only argument
- added
`force_checkout` to force checkout even if `Repo.commit` value is the same as target hash
* refactor(downloader): Repo._run() stderr is redirected to debug log now
- added two keyword arguments:
- `valid_exit_codes` which specifies valid exit codes, used to
determine if stderr should be sent as debug or error level in logging
- `debug_only` which
specifies if stderr can be sent only as debug level in logging
* style(downloader): stop using `set` as arg name in `_load_repos()`
* feat(downloader): pass multiple cogs to `[p]cog (un)pin`
* refactor(downloader): accept module name instead of instance, fix spelling
* style(downloader): few small style changes
* fix(downloader): add type annotations + fixes based on them
- fix wrong type annotations and add a lot of new ones
- add checks for `Installable.repo` being `None`
- fix wrong return type in `Downloader._install_requirements`
- show repo names correctly when updating all repos
- fix error when some requirement fails to install
BREAKING CHANGE:
- type of `Repo.available_modules` is now consistent (always `tuple`)
* tests: use same event loop policy as in Red's code
* enhance(downloader): fully handle ambiguous revisions
* build(deps): add pytest-mock dependency to tests extra
* fix(downloader): minor fixes
* feat(downloader): add tool for editing Downloader's test repo
This script aims to help update the human-readable version of repo
used for git integration tests in ``redbot/tests/downloader_testrepo.export``
by exporting/importing it in/from provided directory.
Note
----
Editing `downloader_git_test_repo.export` file manually is strongly discouraged,
especially editing any part of commit directives as that causes a change in the commit's hash.
Another problem devs could encounter when trying to manually edit that file
are editors that will use CRLF instead of LF for new line character(s) and therefore break it.
I also used `.gitattributes` to prevent autocrlf from breaking testrepo.
Also, if Git ever changes currently used SHA-1 to SHA-256 we will have to
update old hashes with new ones. But it's a small drawback,
when we can have human-readable version of repo.
Known limitations
-----------------
``git fast-export`` exports commits without GPG signs so this script disables it in repo's config.
This also means devs shouldn't use ``--gpg-sign`` flag in ``git commit`` within the test repo.
* tests(downloader): add git tests and test repo for them
Also added Markdown file that is even more clear than export file
on what the test repo contains.
This is manually created but can be automated on later date.
* test(downloader): add more tests related to RepoManager
These tests use expected output that is already guaranteed by git tests.
* chore(CODEOWNERS): add jack1142 to Downloader's folders
I know this doesn't actually give any benefit to people that don't have
write permission to the repo but I saw other big fella devs doing this,
so I think this might be advisable.
* enhance(downloader): allow easy schema updates in future
* enhance(downloader): more typing fixes, add comments for clarity
* feat(downloader): add python and bot version check to update process
follow-up on #2605, this commit fully fixes#1866
* chore(changelog): add towncrier entries
* fix(downloader): use `*args` instead of `commands.Greedy`
* fix(downloader): hot-reload issue - `InstallableType` now inherits from `IntEnum`
There's desync of `InstallableType` class types due to hot-reload
and `IntEnum` allows for equality check between different types
* enhance(downloader): ensure there's no cog with same name installed
should fix#2927
* fix(downloader): last few changes before marking as ready for review
* I know this needs a changelog entry and docs still
* update tests for new behavior
* update docs, filter; add changelog
* Ready for review
* stop fetching the same Audit logs when the bot is the mod
* I forgot to press save
* fix a comprehension
* Fix AttributeError
* And the other place that happens
* timing fixes
* feat(downloader): add `min_bot_version` and `max_bot_version`
Adds actually working way of specifying minimum and maximum bot version and removes not working
`bot_version`
BREAKING CHANGE: - removal of `bot_version` attribute in `Installable`
* test(downloader): `Installable` tests fix for new bot version attributes
* docs(changelog): added changelog entries for this PR
SHARED_LIBRARY Installable types did not have the requirements as
defined in info.json automatically installed. This change updates the
installation of libraries to also install their requirements.
Resolves#2381
This was thrown when the "default" key existed and Permissions tried to iterate over the list mapping keys as ints.
Also fixed some issues with saving config with keys as `int` instead of `str`.
Signed-off-by: Toby Harradine <tobyharradine@gmail.com>
API changes:
- Cogs must now inherit from `commands.Cog` (see #2151 for discussion and more details)
- All functions which are not decorators in the `redbot.core.checks` module are now deprecated in favour of their counterparts in `redbot.core.utils.mod`. This is to make this module more consistent and end the confusing naming convention.
- `redbot.core.checks.check_overrides` function is now gone, overrideable checks can now be created with the `@commands.permissions_check` decorator
- Command, Group, Cog and Context have some new attributes and methods, but they are for internal use so shouldn't concern cog creators (unless they're making a permissions cog!).
- `__permissions_check_before` and `__permissions_check_after` have been replaced: A cog method named `__permissions_hook` will be evaluated as permissions hooks in the same way `__permissions_check_before` previously was. Permissions hooks can also be added/removed/verified through the new `*_permissions_hook()` methods on the bot object, and they will be verified even when permissions is unloaded.
- New utility method `redbot.core.utils.chat_formatting.humanize_list`
- New dependency [`schema`](https://github.com/keleshev/schema)
User-facing changes:
- When a `@bot_has_permissions` check fails, the bot will respond saying what permissions were actually missing.
- All YAML-related `[p]permissions` subcommands now reside under the `[p]permissions acl` sub-group (tbh I still think the whole cog has too many top-level commands)
- The YAML schema for these commands has been changed
- A rule cannot be set as allow and deny at the same time (previously this would just default to allow)
Documentation:
- New documentation for `redbot.core.commands.requires` and `redbot.core.checks` modules
- Renewed documentation for the permissions cog
- `sphinx.ext.doctest` is now enabled
Note: standard discord.py checks will still behave exactly the same way, in fact they are checked before `Requires` is looked at, so they are not overrideable.
Signed-off-by: Toby Harradine <tobyharradine@gmail.com>
Previously, when downloader was loaded, the RepoManager would spawn a task to load available repos. If one repo failed loading for some reason, the function would raise and the remaining repos would never be loaded, however downloader would still appear to load correctly.
This change handles exceptions better during repo loading, but also, if an unhandled exception is raised, downloader will fail to load as it should.
Also included, as requested in #1968, is the --recurse-submodules flag in cloning/pulling repositories.
This change resolves#1950.
Signed-off-by: Toby Harradine <tobyharradine@gmail.com>
* [Downloader] Parse tree URLs when cloning repos
Signed-off-by: Toby <tobyharradine@gmail.com>
* Only match GitHub and GitLab URLs
Signed-off-by: Toby Harradine <tobyharradine@gmail.com>
* [Trivia] Move trivia lists back home
Removes red-trivia as a dependency.
Signed-off-by: Toby Harradine <tobyharradine@gmail.com>
* Include package data in distribution
Signed-off-by: Toby Harradine <tobyharradine@gmail.com>
* Add test from red-trivia repo, and fix package data setup
* The distribution will now include all files under any data/ sub-directory of a package, as well as all *.po files under any locales/ sub-directory (as it should have been before).
* MANIFEST.in has been simplified to comply with these changes and redbot/cogs/audio/application.yml has been moved to the data/ sub-directory to maintain consistency in how we declare package data.
Signed-off-by: Toby Harradine <tobyharradine@gmail.com>
* [V3 Core] Enhance [p]backup to exclude some files
* Backup the repo list too
* Lol Sinbad's pre-commit hook
* Add option of sending the backup to the owner via DM
* Drop an unnecessary config object in RepoManager
* Move the backup functionality in redbot-setup to the new stuff
* More work on implementation, including backing up the instance data
* [V3 CogManagerUI] implement text-only support in [p]cogs
* Change page length to 1800 + workaround for pages starting with delim
* [V3 Core] text mode support for [p]contact and [p]dm
* Implement text-only support in modlog and fix everything that broke because of it
* Fix modlog stuff in filter too
* Fix tests
* Implement optional embed support in [p]help
* move to .format
* Readd work due to redoing branch
* [modlog] Move to core and start work on separating it from cogs
* More work on modlog separation
* [Core] Finish logic for modlog, do docstrings, async getters
* [Core] Add stuff to dunder all
* [Docs] Add mod log docs
* [Core] Move away from dunder str for Case class
* [Docs] don't need to doc special members in modlog docs
* More on mod log to implement commands
* More work on Mod
* [Mod] compatibility with async getters
* [Tests] start tests for mod
* [Tests] attempted fix
* [Tests] mod tests passing now!
* [ModLog] update for i18n
* modlog.pot -> messages.pot
* [Mod] i18n
* fix getting admin/mod roles
* Fix doc building
* [Mod/Modlog] redo imports
* [Tests] fix imports in mod tests
* [Mod] fix logger problem
* [Mod] cleanup errors
* A couple of bug fixes
Async getters, some old `config.set` syntax
* Filter ignores private channels
* Fix softban
Was still relying on default channels
* Actually ignore private channels
* Add check for ignored channels
* Fix logic for ignore check
* Send confirm messages before making case
* Pass in guild when setting modlog
* Thanks autocomplete
* Maintain all data for case
* Properly ignore softbans in events
* [Mod] bugfixes
* [Mod] more changes
* [ModLog] timestamp change
* [Mod] split filter and cleanup to their own cogs + regen messages.pot
* [Cleanup] change logic
* [Cleanup] increase limit for channel.history
* [Mod] await getter in modset banmentionspam
* [Mod] attempt duplicate modlog message fix
* [Mod] get_user -> get_user_info
* [Modlog] change reason command so the case author can edit their cases (#806)
* [Modlog] make reason command guild only
* [Modlog] clarify the reason command's help
* [Mod] package path changes + numpy style docstrings for modlog
* [Mod] change ban and unban events to need view audit log perms to find/create a case
* [Modlog] refactoring
* [Filter] add autoban feature
* [Mod] update case types + event changes
* [Mod/Modlog] fix tests, fix permissions things
* [Docs] fix up modlog docs
* Regenerate messages.pot
Ya'll are gonna hate me.
* Initial modifications
* Add initial setup.py
* working setup py help
* Modify setup file to package stuff
* Move a bunch of shit and fix imports
* Fix or skip tests
* Must add init files for find_packages to work
* Move main to scripts folder and rename
* Add shebangs
* Copy over translation files
* WORKING PIP INSTALL
* add dependency information
* Hardcoded version for now, will need to figure out a better way to do this
* OKAY ITS FINALLY FUCKING WORKING
* Add this guy
* Fix stuff
* Change readme to rst
* Remove double sentry opt in
* Oopsie
* Fix this thing
* Aaaand fix test
* Aaaand fix test
* Fix core cog importing and default cog install path
* Adjust readme
* change instance name from optional to required
* Ayyy let's do more dependency injection
* Initial commit
* Fix sentry
* Make cog manager install path work relative to the bot's dir
* Fix downloader to save data relative to the defined data folder
* Fix sentry test
* Fix downloader tests
* Change logfile location
* Add another line to codeowners
* Basic tests
* Fix versioning
* Add in FutureWarning for config file changes
* Add reference to issue
* [Economy][Bank] redo branch
* WIP
WIP
* Implement all current bank commands API calls
* Set dunder all and put into bot
* make core change to economy
* Add is_global method to bank
WIP
* Add extra bank API commands
* Update bank UI
Update some imports
Remove bank UI errors file
Typing thing
* Update bank get_global_accounts and touch up economy some more
Do some more economy updates
* Remove bank from bot
* Another passing test
FINALLY
* Fixy type things
Last fixes for now
Fix arg to toggle global
RJM
Invalid bid amount handler
cooldown msg
currency name fix
Fix fun bug
ANother bug
And payday limit
* PEP8 stuff
* Docstring change
* Fix this thing
* [Economy][Bank] redo branch
* [Economy][Bank] modify guild owner or bot owner check, add admin or bot owner check for global vs local bank
* [Economy] apply admin or bot owner check to [p]economyset
* Make some public things private
* [Economy] lots of refactoring for conditional permission checks and guild checks + supporting global economy
* And working stuff
* Fix Kowlin's bug
* Fix slot bugs