Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add developer docs #3097

Merged
merged 27 commits into from
Aug 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
efe1f59
Create developer docs
veracioux Dec 18, 2022
79fd79e
Remove mike dependency
veracioux Dec 18, 2022
d777606
Update docs
veracioux Dec 18, 2022
800c167
Make docs/dev self-contained
veracioux Dec 18, 2022
a9cfcee
Add incomplete deploy-dev-docs workflow
veracioux Dec 18, 2022
87b7e38
Fix typo
veracioux Dec 18, 2022
50fef3e
Add workflow file to path:
veracioux Dec 18, 2022
c9287fb
Add doxygen as dependency
veracioux Dec 18, 2022
3d4172f
Add remaining deploy steps
veracioux Dec 18, 2022
a3ad144
Add working-directory
veracioux Dec 18, 2022
bca11e4
Fix working-directory error
veracioux Dec 18, 2022
1e25ef8
Add missing Makefile
veracioux Dec 18, 2022
333e646
Change flameshot website repo url
veracioux Dec 18, 2022
ff6a240
Change working-directory for safety step
veracioux Dec 18, 2022
d040654
Add git credentials
veracioux Dec 18, 2022
56df945
Change push credentials
veracioux Dec 18, 2022
a47687a
Use different token secret
veracioux Dec 18, 2022
ce48288
Remove checkpoints
veracioux Dec 18, 2022
9e0c5b0
Add separate branch developer-docs
veracioux Dec 18, 2022
3db13e7
Add || true
veracioux Dec 18, 2022
4a55272
Update docs
veracioux Jan 21, 2023
4121240
Update the 'Maintaining the documentation' docs
veracioux Feb 12, 2023
bd3c77a
Fix error in deploy-dev-docs workflow
veracioux Feb 12, 2023
ff320cd
Remove accidentally committed file DOC.md
veracioux Aug 12, 2023
669ac60
Update PAT expiry date
veracioux Aug 12, 2023
0fe9deb
Rename developer-docs branch to dev-docs-staging
veracioux Aug 12, 2023
85be883
Merge branch 'master' into docs
veracioux Aug 12, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions .github/workflows/deploy-dev-docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
name: Deploy developer docs

on:
push:
branches: [ master, docs ]
paths:
- 'src/**'
- 'docs/dev/**'
- '.github/workflows/deploy-dev-docs.yml'

jobs:
build-and-deploy:
runs-on: ubuntu-22.04
steps:
- name: Install dependencies
run: |
sudo apt-get --yes --quiet update
sudo apt-get --yes --no-install-recommends install doxygen
pip install \
mkdocs \
mkdocs-material \
git+https://github.com/veracioux/mkdoxy@v1.0.0

- name: Checkout flameshot source
uses: actions/checkout@v3
with:
path: 'flameshot'

- name: Build docs
working-directory: ${{github.workspace}}/flameshot/docs/dev
run: |
make build

- name: Checkout flameshot website
uses: actions/checkout@v3
with:
repository: 'flameshot-org/flameshot-org.github.io'
ref: 'gh-pages'
path: 'website'

- name: Configure git credentials for website repo
working-directory: ${{github.workspace}}/website
run: |
git config user.name "GitHub Actions"
git config user.email "github-actions-bot@users.noreply.github.com"
git config http.https://github.com/.extraheader 'AUTHORIZATION basic ${{secrets.TOKEN_PUSH_TO_WEBSITE_REPO}}'
git remote add destination "https://x-access-token:${{secrets.TOKEN_PUSH_TO_WEBSITE_REPO}}@github.com/flameshot-org/flameshot-org.github.io"

- name: Add developer docs to website deployment
working-directory: ${{github.workspace}}/website
run: |
# Create empty dev-docs-staging branch
git checkout --orphan dev-docs-staging
git rm -r --cached .
rm -rf docs/dev
# Copy generated docs over
mkdir -p docs
mv "${{github.workspace}}/flameshot/docs/dev/output" \
"./docs/dev"
# Commit docs/dev to the dev-docs-staging branch
git add docs/dev
HASH="$(git --git-dir="${{github.workspace}}/flameshot/.git" rev-parse HEAD)"
git commit --message "Add developer docs from flameshot@$HASH"
# Apply changes to gh-pages
git checkout --force gh-pages
git checkout dev-docs-staging -- docs/dev
# Commit (we use `|| true` because the commit could be empty and thus fail)
git commit --message "Add developer docs from flameshot@$HASH" || true

- name: Push to website repo
working-directory: ${{github.workspace}}/website
run: |
git push --force destination dev-docs-staging
git push destination gh-pages

3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,6 @@ data/flatpak/.flatpak-builder

#MacOS Crap
.DS_Store

# Miscellaneous
!docs/dev/Makefile
2 changes: 2 additions & 0 deletions docs/dev/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
output
mkdoxy-generated
9 changes: 9 additions & 0 deletions docs/dev/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
serve:
mkdocs serve --dev-addr localhost:8080 --watch ../../src
build:
mkdocs build
@echo "Post-processing..."
@bash post-process.sh
@echo "DONE."
clean:
rm -rf mkdoxy-generated output
47 changes: 47 additions & 0 deletions docs/dev/mkdocs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
site_name: Flameshot Developer Docs
site_url: https://flameshot.org/docs/dev/
repo_url: https://github.com/flameshot-org/flameshot/
edit_uri: tree/master/docs/dev/src
docs_dir: src
site_dir: output
markdown_extensions:
- admonition
- attr_list
- toc:
permalink: "#"
- pymdownx.emoji:
emoji_index: !!python/name:materialx.emoji.twemoji
emoji_generator: !!python/name:materialx.emoji.to_svg

plugins:
- search
- mkdoxy:
projects:
flameshot:
src-dirs: ../../src/
full-doc: True
doxy-cfg:
FILE_PATTERNS: "*.cpp *.h"
# #TODO for some reason this causes an exception
EXCLUDE_PATTERNS: "*/capturetool.h"
FULL_PATH_NAMES: "NO"
SHOW_USED_FILES: "NO"
RECURSIVE: True

save-api: mkdoxy-generated
debug: True
ignore-errors: False

theme:
name: material
logo: https://flameshot.org/flameshot-icon.svg

nav:
- Overview: index.md
- Debugging: debugging.md
- FAQ: faq.md
- 'Maintaining the documentation': docs.md
- API:
- Classes: flameshot/classes.md
- 'Class Hierarchy': flameshot/hierarchy.md
- Files: flameshot/files.md
19 changes: 19 additions & 0 deletions docs/dev/post-process.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Only run this script from the Makefile

shopt -s globstar
cd output

# Classes backlink to the ClassList in their breadcrumbs. We use the ClassIndex
# instead.
rm -rf flameshot/annotated
ln -sf classes flameshot/annotated

# Hide 'Edit this page button' from the auto-generated docs pages
# It would be better to change the button to link to the file on github, but
# it seems like too much work right now.
sed -i 's|title="Edit this page"|& style="display: none !important"|' flameshot/*/*.html

# MkDoxy adds Qt classes into the class hierarchy. We don't want that.
sed -i 's|<li><strong>class</strong> <strong>Q[^<]*</strong> </li>||' flameshot/*/*.html

# vim: filetype=bash
16 changes: 16 additions & 0 deletions docs/dev/src/debugging.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Debugging

## `FLAMESHOT_DEBUG_CAPTURE`

With this cmake variable set to `ON`, the flameshot capture GUI window won't bypass the
window manager. This allows you to manipulate the capture GUI window like any
other window while debugging.

This can be useful if a debugging breakpoint is triggered while flameshot is in
full screen mode. Without this variable, you might have trouble inspecting the
code due to a frozen full-screen window.

Usage:
```shell
cmake -DFLAMESHOT_DEBUG_CAPTURE=ON ...
```
141 changes: 141 additions & 0 deletions docs/dev/src/docs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
# Maintaining the documentation

The narrative documentation is written in markdown and built into HTML using
[MkDocs][mkdocs], particularly the [MkDocs material theme][mkdocs-material]. The
source code documentation is generated using Doxygen and adapted for MkDocs
using [MkDoxy][mkdoxy] (a tweaked custom fork of the original). The source code
of this documentation can be found [here][doc-source].

!!! tip

In order to edit a page from the documentation, click the :material-pencil:
button in the top right corner of the page. Please note that this button
won't work within the API section of the documentation - the button is
removed from there during [post-processing][], but it will still be visible
when [serving the website locally][serving-locally].

## Serving locally
To serve the documentation locally, run the `make serve` target in the
`docs/dev` directory. The server is available at the port designated in the
output of the command.

## Notes and conventions
- When you add new files or rename existing files or section names, be sure to
edit the `nav` property of [mkdocs.yml][mkdocs.yml].
- Always insert links as [reference style
links][markdown:reference-style-links]. This will make the docs source code
more readable and make broken links more easily detectable and replaceable.

### Post-processing
There are some tweaks we make to the generated HTML documentation. We do that in
the `make build` target, by running the [post-process.sh][post-process.sh]
script. To see what post-processing we do, see that file.

For this reason, the version of the documentation served locally using `make
serve` will not match the generated HTML documentation 100%. But those
inconsistencies are few and minor.

## Dependencies
```shell
pip install \
mkdocs \
mkdocs-material \
git+https://github.com/veracioux/mkdoxy@v1.0.0
```

!!! note

We use a forked version of [mkdoxy][mkdoxy-original] that can be found
[here][mkdoxy], that fixes some annoying things from the original.

## Deployment

The developer documentation is served from the official Flameshot website
[flameshot.org][website]. Here's how.

The official website itself is served from this [repo][website-repo]. That repo
contains the user documentation. It's deployed using GitHub pages -- the served
files can be found on the [gh-pages][] branch of that repo. This branch is
automatically created by the [build][website-build] workflow on master.

To make the developer docs available on the official site, we use a custom
GitHub action called [deploy-dev-docs][] in the [flameshot][] repo. This action
will build and deploy this documentation into the `docs/dev` subdirectory of the
[gh-pages][] branch.

### The deploy-dev-docs GitHub workflow

This workflow checks out the flameshot website [repo][website-repo] and does the following:

- Creates a clean [dev-docs-staging][] branch (we'll explain why, below).
- Generates the developer docs under `docs/dev` there and makes a commit
- Checks out the [gh-pages][] branch and makes the same commit there
- Force-pushes the dev-docs-staging branch to the website repo
- Pushes the gh-pages branch to the website repo

Since the [gh-pages][] branch is re-created from scratch by the [website
deployment workflow][website-build], the commit that added the developer
documentation will be lost. That's why we have to re-apply the commit during the
[website deployment workflow][website-build] as well. **That is the reason why
we created the** [**dev-docs-staging**][dev-docs-staging] **branch in the first
place.**

!!! note

The deploy-dev-docs workflow is set to run on the `docs` branch as well as `master`.
This branch is used for debugging the developer docs and its associated
workflows, without polluting the `master` branch with unnecessary commits.

#### Access tokens
In order to make changes to the [website repo][website-repo] from within a
workflow in the [flameshot repo][flameshot], the workflow needs to use an access
token, which it obtains from the `TOKEN_PUSH_TO_WEBSITE_REPO` secret.

The following process was used to set it up:

1. A flameshot organization member with write access must create a personal
access token (PAT) [here][PAT] with write access to the [website repo][website-repo].
2. A secret named `TOKEN_PUSH_TO_WEBSITE_REPO` must be added to the
[flameshot][] repo and its value must be set to the PAT. This can be done
[here][action-secrets].

For best security practice, the token should be set to expire after some time
(currently ~6 months). The token can be regenerated without the need to recreate
it. After regeneration you will need to update the `TOKEN_PUSH_TO_WEBSITE_REPO`
secret, which can be done [here][edit-secret].

!!! tip

The currently active PAT is owned by [veracioux][] and is set to expire on July
31 2024. If you notice the token has expired, ask him to re-generate it.

<!-- Internal links -->
[post-processing]: #post-processing
[serving-locally]: #serving-locally

<!-- Flameshot-related pages -->
[flameshot]: https://github.com/flameshot-org/flameshot
[website]: https://flameshot.org
[doc-source]: https://github.com/flameshot-org/flameshot/tree/master/docs/dev
[website-repo]: https://github.com/flameshot-org/flameshot-org.github.io
[gh-pages]: https://github.com/flameshot-org/flameshot-org.github.io/tree/gh-pages
[dev-docs-staging]: https://github.com/flameshot-org/flameshot-org.github.io/tree/dev-docs-staging
[action-secrets]: https://github.com/flameshot-org/flameshot/settings/secrets/actions
[edit-secret]: https://github.com/flameshot-org/flameshot/settings/secrets/actions/TOKEN_PUSH_TO_WEBSITE_REPO

<!-- Files in flameshot repo -->
[mkdocs.yml]: https://github.com/flameshot-org/flameshot/blob/master/docs/dev/mkdocs.yml
[post-process.sh]: https://github.com/flameshot-org/flameshot/blob/master/docs/dev/post-process.sh
[deploy-dev-docs]: https://github.com/flameshot-org/flameshot/blob/master/.github/workflows/deploy-dev-docs.yml

<!-- Files in flameshot website repo -->
[website-build]: https://github.com/flameshot-org/flameshot-org.github.io/blob/master/.github/workflows/build.yml

<!-- External pages -->
[markdown:reference-style-links]: https://www.markdownguide.org/basic-syntax/#reference-style-links
[mkdocs]: https://www.mkdocs.org/
[mkdocs-material]: https://squidfunk.github.io/mkdocs-material
[mkdoxy-original]: https://github.com/JakubAndrysek/mkdoxy
[mkdoxy]: https://github.com/veracioux/mkdoxy
[PAT]: https://github.com/settings/tokens?type=beta
[veracioux]: https://github.com/veracioux
47 changes: 47 additions & 0 deletions docs/dev/src/faq.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@

# FAQ

!!! todo

Incomplete page.

### How do I create a new subcommand?

### How do I add a new tool?

### How do I add a new config setting?

There are currently two groups of settings: `General` and `Shortcuts`.
The necessary steps are usually the following:

- Determine a name for the setting - for a general setting, it must be a valid
C++ identifier, for a shortcut it must be the name of a tool type from TODO.
- Add a getter and a setter for the setting in [`ConfigHandler`][ConfigHandler].
For most settings you should use the
[`CONFIG_GETTER_SETTER`][CONFIG_GETTER_SETTER] macro. If your setting is
unusual enough you may need to use [`CONFIG_GETTER`][CONFIG_GETTER] or
[`CONFIG_SETTER`][CONFIG_SETTER] individually, or even need to create the
methods manually.
- If you need custom validation or conversion for the value, you must create a
subclass of [`ValueHandler`][ValueHandler]. Otherwise you can use one of the
existing ones in [valuehandler.h][].
- If you want to make your setting available in the configuration GUI (usually
you do), you should add the appropriate widgets into one of the tabs of
[`ConfigWindow`][ConfigWindow]. If your setting doesn't fit into any of the
existing tabs, you can add a new one, but please discuss it with us first.

To get a deeper understanding of how the configuration works, please see
[Configuration][config].

### How do I add a new export action? (@borgmanJeremy @mehrad This is my preferred terminology over final action, need consensus)

[config]: index.md#configuration
[confighandler.h]: flameshot/confighandler_8h
[confighandler.cpp]: flameshot/confighandler_8cpp
[valuehandler.h]: flameshot/valuehandler_8h
[ValueHandler]: flameshot/classValueHandler
[ConfigHandler]: flameshot/classConfigHandler
[ConfigWindow]: flameshot/classConfigWindow
[CONFIG_GETTER_SETTER]: flameshot/confighandler_8h/#define-config_getter_setter
[CONFIG_GETTER]: flameshot/confighandler_8h/#define-config_getter
[CONFIG_SETTER]: flameshot/confighandler_8h/#define-config_setter
Loading
Loading