# -*- mode: org -*- * v0.6.0 2025-09-09 - Switched to the new low-level functions, provided by Ghub v5.0.0, for making REST and GraphQL requests. These new functions address shortcomings of the older implementations and take learned lessons into account. The required refactoring in both packages was quite extensive. This fixes many bugs and other shortcomings, but those are not all explicitly listed below. Implemented more API functions in the new ~forge-client.el~ library. Deprecated high-level functions from Ghub, such as ~ghub-fetch-repositories~, are no longer being used; Forge now implements such functions itself. The deprecated libraries ~buck~, ~glab~, ~gtea~ and ~gogs~, which are now deprecated and were moved out of Ghub into dedicated packages, are no longer being used. - For Github use GraphQL more, instead of REST. It is not possible to use just one of these APIs, because they both miss different features. The GraphQL API isn't necessarily better or at least a better match than the REST API, but this is where Github is moving, so we now use GraphQL whenever possible. Also prepared for using GraphQL for Gitlab, but without actually taking the leep just yet. - Add entry for ~ssh.github.com~ to ~forge-alist~. #708 - Added new command ~forge-visit-topic-from-url~. #555 - Added support for bookmarking topic buffers. #555 - Sped up fetching after replying to a topic or editing a post. #786 - ~forge-edit-post-hook~ is now define as an option. b1e16d248 - Added new function ~forge-create-pullreq-insert-branch-description~, suitable for being added to ~forge-edit-post-hook~. ac8ba91ac - The text initially inserted into buffers used to create or edit posts has been improved, removing unnecessary and/or duplicated noise, which was previously inserted. 13c046500, 443172cfe - When the user cancels creating or editing a post, they are given the choice to discard the draft, and they are now shown the post in question, while being asked to decide its fate. 98062b13f, d6162bc8a - While creating a pull-request, the user is now shown the diff of the included changes. e605525be - Slightly extended the still very limited support for Forgejo. I still plan to add proper support eventually. ee44f2cfd - The menus are now being refreshed in more situations. be4435d5a - Added new command ~forge-push-to-unnamed-pullreq~. #789 Bug fixes: - 1a792e7ac Call forge--pull directly instead of going through forge-pull - fa105ca50 forge--topic-parse-template: Discard more invalid template data - 443c74258 forge--setup-post-buffer: Format the filename - d30d5ef6d forge-edit-post-hook: Run all functions in correct buffer #790 - ca41d9dd3 * forge-discussion-set-answer: Make inapt if category is not answerable - 11c931b36 * forge-get-topic(repo number-or-id): Actually support both number and id - f162b9404 * forge--fork-repository: Pass apihost to ghub-wait - f5f6b764d * forge--fork-repository: Compare against correct username - 1f65bf8d7 * Use intended face for outdated discussions - 984c00607 * forge--fork-repository: Use forge--format-resource for formatting - 18b1e59d6 * forge--fork-repository(gitlab): Escape fork destination in ghub-wait #795 - b531c7de7 * forge--topic-parse-template: Deal incomplete yaml frontmatter - 12a99cd3d * forge--topic-parse-template: Deal missing yaml frontmatter - 8bacf2836 * forge--select-discussion-reply-target: Fix when on opening message - 2774ac242 * forge--fontify-markdown: Replace face with font-lock-face * v0.5.3 2025-06-04 - Fixed a regression in v0.5.1, which prevented labeling topics with labels that were created before Github changed the format of label IDs. #784 * v0.5.2 2025-06-03 - Fixed a regression in v0.5.1, which prevented the creation of a pull-request for a branch on a fork. * v0.5.1 2025-06-01 - During topic creation users can now set metadata using a transient menu, instead of having to blindly edit embedded yaml. Topic creation also saw numerous other improvements, refactorings and fixes. 49c8a78cc et al. - ~forge-post-submit-callback-hook~ is now also run when a post is submitted using a GraphQL mutation. 76c9d001e - Fixed updating local state after merging a pull-request using the API. 3aee91da1 - ~forge-pullreq-state-set-merged~ is no longer a no-op and offers to merge using either Git or the API. 64d02997d - GraphQL mutations used the ghub token instead of the forge token. #782 Contains additional code cleanups and fixes. * v0.5.0 2025-04-01 - Added support for Github discussions. This is a large addition and there are still sharp edges in need of sanding. 3aa6d2a60 - Added support for more of Github's topic states, i.e., reasons why a topic is closed. a140b92db - Somewhat reluctantly started using GraphQL for mutations. For those the old REST API was more consistent and pleasant to use, but it does not support newer features. fe133a75f - Added new command ~forge-mark-completed-topics-as-done~. 514d4e31b Contains additional code cleanups and fixes. * v0.4.8 2025-03-02 - At least Git 2.25.0 is required now. Same as for Magit. - The type of ~forge--topics-spec~ slot was wrong. 6eac2c3ee - Improved bindings added to ~magit-remote~. de4c964cb - Added ~forge-fork~ to ~magit-remote~ menu. 3a2739f35 - ~forge-remove-topic-locally~ can now remove all marked topics. #734 * v0.4.7 2025-02-04 - Added new hook ~forge-topic-wash-title-hook~. #735 - ~forge-rename-default-branch~ now also updates the local symref, which tracks the remote's HEAD. b7ca5e76f - Added new command ~forge-set-default-branch~. bdbf43f36 - Added new class ~forge-forgejo-repository~ and changed the ~forge-alist~ for ~codeberg.org~ to use that. 0c81b44fb - Added support for visiting blobs using a browser. #91 - Added support for creating issues and commenting on existing issues and pull-requests for repositories, that are tracked in Forge's database, but which have not been cloned to the local machine. #722 - It is now possible to request a review from a team. #304 - Addressed an incompatibility between some legacy behavior in Ghub and ~auth-source-pass~. You will have to change your configuration for this to be effective. See the [[https://magit.vc/manual/forge/Setup-for-Gitlabcom.html][updated documentation]]. #720 - Added new commands ~forge-approve-pullreq~ and ~forge-request-changes~. #377 - Started using the ~##~ macro and the ~partial~ shorthand from the ~llama~ package. 247330105, b17be58bc - Stopped depending on the ~dash~ package. 5c4a1afc8 - Sorting topics by when they were updated was not possible because the shown key bindings were incorrect, and if if the user figured out what the secret bindings were, then it would have errored. #745 - When an unknown label, assignee or review request was encountered, then all entities of that type were ignored. Now only the unknown entity is ignored. 2e040c1d2 * v0.4.6 2025-01-01 - ~forge-read-topic-labels~ and ~forge-read-topic-marks~ failed to use the existing labels/marks as initial input. #731 - The repository at point is now recognized in ~magit-repolist-mode~ buffers. bb4d2038f - ~forge-dispatch~ is now bound in ~magit-repolist-mode-map~. 8bace81bc * v0.4.5 2024-12-08 - At least Emacs 29.1 is required now. - Started cashing calls to ~git~ during transient menu refreshes, similar to how such calls are cached when refreshing a Magit buffer. #712 - Fixed parent keymap of ~forge-issues-mode-map~ and ~forge-pullreqs-mode-map~. 9ac2afbbb - Fixed a regression in ~forge-topics-setup-buffer~. #725 - By default only draft pull-requests are shown in italic now. The new ~forge-pullreq-draft~ face can be used to control how such pull-requests are shown. Previously all topics that are marked as done were shown in italic. #726 - Fixed infinite recursion in ~forge-get-issue~ and ~forge-get-pullreq~. #704 - Fixed visiting commit in a browser. 8f9e94949 - Added new variable ~forge-bug-reference-remote-files~. #703 * v0.4.4 2024-10-01 Thoughts and whitespace. * v0.4.3 2024-09-04 - Fixed tracking a new repository using ~forge-pull~. a839eaeaa - Fixed type of ~forge--topics-spec~'s ~state~ slot. 5ee14bfbd - Fixed several issues with ~forge--topics-list-command~. 1b4eaaedb, e94f6a37d - When pulling API data outside a Git repository, do not try pull Git data, and make sure the buffer is refreshed regardless. #695 * v0.4.2 2024-09-01 - Updated tooling. * v0.4.1 2024-08-14 - ~forge-add-repository~ now guides the user to set ~forge.remote~ and provides pointers to the relevant documentation, when additional configuration is required, before a repository can be added to the database. 834c81492 et al. - ~forge-add-repository~ and ~forge-pull~ used to error for repository not hosted on a known host or when called outside any Git repository. - Ssh host aliases did not get resolved as intended. #689 - In ~forge-notifications-mode~ buffers ~C-c C-c~ used to error. 7bcdffc75 - The "dwim" value displayed for ~forge.remote~ was inaccurate. 6ec5ad186 - Added new "Setup a Partially Supported Host" section to manual and fixed various typos. 4f6e58b4c - Fixed inaccurate information and typos in the manual and usage messages. aa72a4d13 et al. * v0.4.0 2024-08-08 This is the biggest Forge release so far, consisting of more than 650 commits created over the course of more than two years. I am not able to load all that into working memory, and many parts of the code have received several rounds of improvements, so this changelog entry uses broader strokes than usual. - This release pays off a large amount of technical debt. Many of the changes and additions below were only possible thanks to that effort, as are upcoming additions. - Which topics are displayed in the current buffer can now be changed, using the new prefix command ~forge-topics-menu~, available on ~N m f~. This command is available in any buffer that lists topics, including Magit status buffers. Previously topic filtering relied on dedicated commands (which listed a hard-coded subset in a separate buffer) and functions (which inserted a hard-coded subset in a separate section in the status buffer). Most of these commands and functions have been removed. The default filters can be customized using the new ~forge-list-buffer-default-topic-filters~ and ~forge-status-buffer-default-topic-filters~ options. If you really want to insert additional hard-coded sets of topics in dedicated sections in the status buffer, you can still define them yourself, with the help of the new helper function ~forge-insert-topics~. - Dedicated buffers used to list topics now use a major mode derived from ~magit-mode~, instead of from ~tabulated-list-mode~. This makes it possible to remove a lot of duplication (because these buffers now use the same code as the topic list sections, displayed in the status buffer), and makes adding new features more feasible. - ~forge-dispatch~ and the newly added menu commands (such as the already mentioned ~transient-topics-menu~) now provide bindings to switch to any of the other menus. Similarly they provide bindings to switch to list buffers. This should make it easy to discover the new commands, and reduces the need to memorize new key bindings. It is sufficient to remember that ~N~ invokes ~forge-dispach~, and to then browse the other menus from there. That being said, more efficient, but harder to remember, bindings are also available, such as: - The new prefix command ~forge-topic-menu~, now provides the most convenient way to edit an existing topic. When point is on a topic, it can be invoked using ~C-~. As is always the case in Magit, ~RET~ visits the thing at point in a separate buffer. In the case of topics, ~C-u RET~ does both; it displays the buffer and the menu. - The parts of the Github API, that one has to use when syncing the private topic status, are truly abysmal. When I first created Forge, I figured that something so fundamentally broken would surely be fixed within a few months, and decided to wait until that was done. I was wrong, five years later nothing has changed, and I had no choice but to put in a lot of effort to implement workarounds, to achieve something that is worse than what could be trivially achieved, if the API were merely bad. Most frustratingly the ternary unread/pending/done is represented in API responses using a boolean. That obviously puts limits on the accuracy one can achieve in a third-party client. While that is the worst defect, it is just the tip of the iceberg. - All the possible values for the public "state" and the private "status" of topics are now supported. The public state basically answers the question whether a topic has been closed yet, and if so, for what reason. The state can be one of ~open~, ~completed~ and ~unplanned~ for issues, and ~open~, ~merged~ and ~rejected~ for pull-requests. The private status answers the questions whether /you/ have seen the latest changes yet, that someone else made to it, and when that is the case, whether you have additionally decided that you are "done" with that topic. Due to the defects of the Github API mentioned above, the distinction between the ~pending~ and ~done~ statuses of a topic cannot be synchronized with Github. So if you use both Forge and the web interface, you will sadly have to perform the "mark as done" action twice. - By default Forge now lists "active" topics, i.e., topics whose public state is ~open~ and/or whose private status is ~unread~ or ~pending~. In other words ~active~ topics are those that likely still require your attention. - At least Emacs 27.1 is required now. Several dependencies have bumped their respective minimal requirement, so I had no choice in the matter, but to be honest, I am not unhappy about it. - EmacSQL 4.0.0 is required now, which automatically uses the best available SQL backend. The new backend, which utilizes the built-in support (added in Emacs 29.1) is preferred. When using an older Emacs version, or when Emacs unwisely was compiled without SQLite support, then a different new backend is used. That backend uses the C module provided by the ~sqlite3~ package, which you have to install explicitly. If the module also isn't available, the legacy backend is used as a last resort. That backend is less reliable and much slower than the newer alternatives, and is going to be removed from EmacSQL in a not so distant future. - It is now possible to add repositories to the local database, without first cloning the respective Git repositories, using the same command used to add the current Git repository. That command, ~forge-add-repository~, now also offers to fetch only individual topics, or all topics that were modified since a cut-off date of the user's choosing, instead of all topics. - A project's topics can now be listed, visited and modified even if no local clone of the respective Git repository exists. One way to navigate to such a project's topics is to list all repositories using ~N l r~ and then press ~RET~, while point is on the repository in question. - Added new transient menu commands ~forge-topic-menu~, ~forge-topics-menu~, ~forge-topic-state-menu~, ~forge-topic-status-menu~, ~forge-repositories-menu~, ~forge-configure~, ~forge-post-dispatch~ and ~forge-notifications-menu~, and converted ~forge-add-repository~ to a menu command. - Added new commands ~forge-add-some-repository~, ~forge-browse~, ~forge-browse-this-repository~, ~forge-browse-this-topic~, ~forge-checkout-this-pullreq~, ~forge-forge.graphqlItemLimit~, ~forge-issue-state-set-completed~, ~forge-issue-state-set-unplanned~, ~forge-list-global-issues~, ~forge-list-global-pullreqs~, ~forge-list-global-topics~, ~forge-menu-quit-list~, ~forge-notifications-display-all~, ~forge-notifications-display-done~, ~forge-notifications-display-inbox~, ~forge-notifications-display-saved~, ~forge-notifications-style-flat~, ~forge-notifications-style-nested~, ~forge-post-toggle-draft~, ~forge-pull-this-topic~, ~forge-pullreq-state-set-merged~, ~forge-pullreq-state-set-rejected~, ~forge-read-topic-lift-limit~, ~forge-refresh-buffer~, ~forge-rename-default-branch~, ~forge-toggle-topic-legend~, ~forge-edit-topic-state~, ~forge-topic-state-set-open~, ~forge-topic-status-set-done~, ~forge-topic-status-set-pending~, ~forge-topic-status-set-unread~, ~forge-topic-toggle-draft~, ~forge-topic-toggle-saved~, ~forge-topics-all-types~, ~forge-topics-filter-active~, ~forge-topics-filter-assignee~, ~forge-topics-filter-author~, ~forge-topics-filter-issues~, ~forge-topics-filter-labels~, ~forge-topics-filter-marks~, ~forge-topics-filter-milestone~, ~forge-topics-filter-pullreqs~, ~forge-topics-filter-reviewer~, ~forge-topics-filter-saved~, ~forge-topics-filter-state-completed~, ~forge-topics-filter-state-open~, ~forge-topics-filter-state-unplanned~, ~forge-topics-filter-status-done~, ~forge-topics-filter-status-inbox~, ~forge-topics-filter-status-pending~, ~forge-topics-filter-status-unread~, ~forge-topics-group~, ~forge-topics-set-limit~, ~forge-topics-set-order~, ~forge-topics-ungroup~, ~forge-visit-this-repository~ and ~forge-visit-this-topic~. - Added new options ~forge-buffer-draft-p~, ~forge-limit-topic-choices~, ~forge-list-buffer-default-topic-filters~, ~forge-repository-list-columns~, ~forge-repository-list-mode-hook~, ~forge-status-buffer-default-topic-filters~ and ~forge-topic-repository-slug-width~; and remove old options ~forge-database-connector~, ~forge-topic-list-mode-hook~, ~forge-topic-list-order~, ~forge-topic-list-limit~ and forge-pull-notifications. - Added new faces ~forge-dimmed~, ~forge-issue-completed~, ~forge-issue-open~, ~forge-issue-unplanned~, ~forge-pullreq-merged~, ~forge-pullreq-open~, ~forge-suffix-active-and-implied~, ~forge-suffix-active~, ~forge-suffix-implied~, ~forge-topic-done~, ~forge-topic-header-line~, ~forge-topic-pending~, ~forge-topic-slug-completed~, ~forge-topic-slug-open~, ~forge-topic-slug-saved~, ~forge-topic-slug-unplanned~, ~forge-topic-slug-unread~ and ~forge-pullreq-rejected~. Some of them are approximate replacements for the removed faces ~forge-topic-closed~, ~forge-topic-merged~, ~forge-topic-open~ and ~forge-topic-unmerged~. - Added new Git variable ~forge.graphqlItemLimit~. Ghub now fetches fewer items at once by default, but if you repeatedly get ~HTTP Error 502, "Bad gateway"~, when pulling API data for some repository, then limiting this to below 50 is likely to help (but results in more requests and slows down pulling.) - If Forge cannot access its database, it disables itself, to keep Magit usable. - The essential function ~forge-get-repository~ has undergone several rounds of improvements and now much better serves the diverse needs of its callers. - When the user has to select a topic using completion, they are initially only offered open topics to select from, but by pressing ~+~ the choices can be extended to include all topics. Also included are many other new features, improvements and bugfixes. * v0.3.2 2022-03-07 - The command ~forge-toggle-display-in-status-buffer~ now affects all relevant sections. #470 - It is possible to create a pull-request from an existing issue again. #473 * v0.3.1 2022-02-16 - Added several existing commands to ~forge-dispatch~. - Added new option ~forge-add-default-sections~, which can be set to ~nil~ to prevent Forge from adding bindings to Magit keymaps and transient prefix commands. - Added new command ~forge-browse-repository~. #443 - Added new variable ~forge-format-avatar-function~. #447 - Added support for the ~sqlite-builtin~ and ~sqlite-module~ backends. See https://github.com/skeeto/emacsql/pull/86. - Added new option ~forge-checkout-worktree-read-directory-function~. #463 - Also included are many other improvements, updated documentation and bugfixes. * v0.3.0 2021-10-14 - Many actions that were surprisingly slow are much faster now, because an embarrassing bottleneck was removed in Closql v1.2.0. - Added new option ~forge-database-connector~ allowing the use of other database connector libraries beside ~emacsql-sqlite~ (currently only ~emacsql-libsqlite3~ (experimental) and ~emacsql-sqlite3~ (discouraged)). bae6a527, 21720580 - Commands that take a topic or repository as argument now expect an object/row ID instead of an object or a number. Objects are not suitable as interactive arguments because their printed representation would be presented to the user when using ~repeat-complex-command~, and because they might not reflect the current state when used like that. Numbers would be more readable and actually meaningful to humans, but additionally they would be ambiguous. Non-interactive functions continue to expect objects as arguments. #368 - Some essential key bindings that were somewhat randomly selected during initial development have now been changed for consistency, which I always intended to do, but did not get around to do until now. ~forge-dispatch~ is now bound to ~N~ instead of ~'~ and Forge's bindings in ~magit-fetch~ and ~magit-pull~ now use ~N~ and ~n~ instead of ~Y~ and ~y~. ~N~ was chosen because it was one of the last alphabetic keys available at the top-level in Magit. 8c9614e3 et al. - Added new command ~forge-merge~ for merging pull-requests using the forge's API, which I recommend you only use if someone forces you to do use the API. 3112aded - Added support for following the links that some projects on Github display alongside issue templates. 46d5f253 - Setting the new Git variable ~forge.autoPull~ to false disables pulling Git data whenever API data is fetched. This may be useful in active mono-repos where there is always something new (but likely irrelevant) to pull. #362 - Added new commands ~forge-list-labeled-pullreqs~ and ~forge-list-labeled-issues~. a3e6f8aa - Starting with Emacs 28 ~bug-references~ is automatically configure for repositories cloned from many Git forges, so Forge no longer has to do it. #283, #412 - It is possible to fetch only select topics of a repository, which is useful if that happens to be large and/or if you are only interested in a select few topics (such as the one you are about to open). ~forge-pull~ learned to fetch information about the repository itself even when configured to only fetch certain topics. #382 - Added the ~forge-browse-*~ commands to ~forge-dispatch~. #422 - Also included are several other improvements, updated documentation and bugfixes. * v0.2.1 2021-06-17 - Adjusted to breaking changes in EIEIO in Emacs 28. * v0.2.0 2021-05-25 - Second release. - Features and bugfixes. - I haven't been keeping this list updated and don't feel like going through hundreds of commits now. Sorry, maybe next time. * v0.1.0 2018-12-19 - Initial beta release.