[Error Logging](#error-logging)
[GPL header](#gpl-header)
[Git change log](#git-change-log)
-[Sources](#sources)
-[Software Tools](#software-tools)
+[Source Code Style](#source-code-style)
+[Shell Script Style](#shell-script-style)
+[External Software Tools](#external-software-tools)
+[Geeqie Software Tools](#geeqie-software-tools)
[Documentation](#documentation)
+[Documentation - C code](#c-code)
+[Documentation - Script files](#script-files)
+[Documentation - Markdown](#markdown)
+[Doxygen](#doxygen)
---
Sample command line call:
`GTK_DEBUG=interactive src/geeqie`
+### DEBUG_BT()
+
+Prints a backtrace.
+Use only for temporary debugging i.e. not in code in the repository
+
+### DEBUG_FD()
+
+Prints a dump of the FileData hash list as a ref. count followed by the full path of the item.
+Use only for temporary debugging i.e. not in code in the repository
+
+### Log Window
+
+When the Log Window has focus, the F1 key executes the action specified in `Edit/Preferences/Behavior/Log Window F1 Command` with the selected text as a parameter.
+If no text is selected, the entire line is passed to the command.
+This feature may be used to open an editor at a file location in the text string.
+
---
## GPL header
Use whole sentences beginning with Capital letter. For each modification use a new line. Or you can write the theme, colon and then every change on new line, begin with "- ".
-See also [A Note About Git Commit Messages](http://www.tpope.net/node/106)
+See also [A Note About Git Commit Messages](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
Example:
---
-## Sources
+## Source Code Style
Indentation: tabs at 4 spaces
```c
if (<cond>)
- {
- <command>;
- ...
- <command>;
- }
+ {
+ <command>;
+ ...
+ <command>;
+ }
else
- {
- <command>;
- ...
- <command>;
- }
+ {
+ <command>;
+ ...
+ <command>;
+ }
if (<cond_very_very_very_very_very_very_very_very_very_long> &&
<cond2very_very_very_very_very_very_very_very_very_long>)
<the_only_command>;
switch (<var>)
- {
- case 0:
- <command>;
- <command>;
- break;
- case 1:
- <command>; break;
- }
+ {
+ case 0:
+ <command>;
+ <command>;
+ break;
+ case 1:
+ <command>; break;
+ }
for (i = 0; i <= 10; i++)
- {
- <command>;
- ...
- <command>;
- }
+ {
+ <command>;
+ ...
+ <command>;
+ }
```
Functions:
```c
gint bar(<var_def>, <var_def>, <var_def>)
{
- <command>;
- ...
- <command>;
+ <command>;
+ ...
+ <command>;
- return 0; // i.e. SUCCESS; if error, you must return minus <err_no> @FIXME
+ return 0; // i.e. SUCCESS; if error, you must return minus <err_no> @FIXME
}
void bar2(void)
{
- <command>;
- ...
- <command>;
+ <command>;
+ ...
+ <command>;
}
```
#ifndef _FILENAME_H
```
+Use [Names and Order of Includes](https://google.github.io/styleguide/cppguide.html#Names_and_Order_of_Includes) for headers include order.
+
Use spaces around every operator (except `.`, `->`, `++` and `--`).
Unary operator `*` and `&` are missing the space from right, (and also unary `-`).
Use glib types when possible (ie. gint and gchar instead of int and char).
Use glib functions when possible (i.e. `g_ascii_isspace()` instead of `isspace()`).
-Check if used functions are not deprecated.
+Check if used functions are not deprecated.
+
+---
+
+## Shell Script Style
+
+Use `/bin/sh` as the interpreter directive.
+Ensure the script is POSIX compliant.
+Use `printf` rather than `echo` except for plain text.
+There are several versions of `mktemp`. Using the following definition helps portability (note that `template` is not optional):
+
+```sh
+mktemp [-d] [-q] template ...
+```
+
+and use for example this style:
+
+```sh
+mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX"
+```
---
-## Software Tools
+
+## External Software Tools
### astyle
align-reference=name
```
-### check-compiles.sh
-
-This shell script is part of the Geeqie project and will compile Geeqie with various options.
-
### cppcheck
A lint-style program may be used, e.g.
```sh
-cppcheck --language=c --library=gtk --enable=all --force -USA_SIGINFO -UZD_EXPORT -Ugettext_noop -DG_KEY_FILE_DESKTOP_GROUP --template=gcc -I. --quiet --suppressions-list=<suppressions file>
+cppcheck --language=c --library=gtk --enable=all --force -USA_SIGINFO -UZD_EXPORT -Ugettext_noop -DG_KEY_FILE_DESKTOP_GROUP --template=gcc -I .. --quiet --suppressions-list=<suppressions file>
```
Where the suppressions file might contain:
unmatchedSuppression
```
-### generate-man-page.sh
+### markdownlint
-This script is part of the Geeqie project and should be used to generate the Geeqie man page from Geeqie's command line
-help output and also update the Command Line Options section of the Help files.
-The programs help2man and doclifter are required - both are available as .deb packages.
+Markdown documents may be validated with e.g. [markdownlint](https://github.com/markdownlint/markdownlint).
```sh
-./scripts/generate-man-page.sh
+mdl --style <style file>`
```
-### markdownlint
-
-Markdown documents may be validated with e.g. [markdownlint](https://github.com/markdownlint/markdownlint).
-`mdl --style <style file>`
-
-Where the style file might be:
+Where the style file might contain:
```text
all
+rule 'MD007', :indent => 4
rule 'MD009', :br_spaces => 2
rule 'MD010', :code_blocks => true
exclude_rule 'MD013'
shellcheck --enable=add-default-case,avoid-nullary-conditions,check-unassigned-uppercase,deprecate-which,quote-safe-variables
```
+### shfmt
+
+Shell scripts may formatted to some extent with [shfmt](https://github.com/mvdan/sh). At the time of writing it does not format `if`, `for` or `while` statements in the style used by Geeqie.
+However the following script can be used to achieve that:
+
+```sh
+#!/bin/sh
+
+shfmt -s -p -ci -sr -fn | awk '
+ {if ($0 ~ /; then/)
+ {
+ match($0, /^\t*/);
+ printf('%s\n', substr($0, 0, length($0) - 6));
+ printf('%s, substr("\t\t\t\t\t\t\t\t\t\t", 1, RLENGTH))
+ print("then")
+ }
+ else if ($0 ~ /; do/)
+ {
+ match($0, /^\t*/);
+ printf('%s\n', substr($0, 0, length($0) - 4));
+ printf('%s', substr("\t\t\t\t\t\t\t\t\t\t", 1, RLENGTH))
+ print("do")
+ }
+ else
+ {
+ print
+ }
+ }'
+```
+
### xmllint
The .xml Help files may be validated with e.g. `xmllint`.
---
+## Geeqie Software Tools
+
+See the shell scripts section in the Doxygen documentation (`File List`, `detail level 3`, except the `src` sublist).
+
+---
+
## Documentation
Use American, rather than British English, spelling. This will facilitate consistent
text searches. User text may be translated via the en_GB.po file.
+To avoid confusion between American and British date formats, use ISO format (YYYY-MM-DD) where possible.
+
To document the code use the following rules to allow extraction with Doxygen.
Not all comments have to be Doxygen comments.
+### C code
+
- Use C comments in plain C files and use C++ comments in C++ files for one line comments.
- Use `/**` (note the two asterisks) to start comments to be extracted by Doxygen and start every following line with ` *` as shown below.
- Use `@` to indicate Doxygen keywords/commands (see below).
* @FIXME
```
+### Script files
+
+Script files such as .sh, .pl, and .awk should have the file relevant file extension or be symlinked as so.
+
+Doxygen comments should start each line with `##`, and each file should contain:
+
+```sh
+## @file
+## @brief <one line description>
+## <contents description>
+##
+```
+
+### Markdown
+
+For a newline use two spaces (a backslash is not interpreted correctly by Doxygen).
+
+## Doxygen
+
For further documentation about Doxygen see the [Doxygen Manual](https://www.doxygen.nl/index.html).
For the possible commands you may use, see [Doxygen Special Commands](https://www.doxygen.nl/manual/commands.html).
The file `./scripts/doxygen-help.sh` may be used to integrate access to the Doxygen files into a code editor.
-The following environment variables may be set to personalize the Doxygen output:
-`DOCDIR=<output folder>`
-`SRCDIR=<the folder above ./src>`
-`PROJECT=`
-`VERSION=`
-`PLANTUML_JAR_PATH=`
-`INLINE_SOURCES=<YES|NO>`
-`STRIP_CODE_COMMENTS=<YES|NO>`
+The following environment variables may be set to personalize the Doxygen output:
+
+```sh
+DOCDIR=<output folder>
+SRCDIR=<the top level directory of the project>
+PROJECT=
+VERSION=
+PLANTUML_JAR_PATH=
+INLINE_SOURCES=<YES|NO>
+STRIP_CODE_COMMENTS=<YES|NO>
+```
Ref: [INLINE\_SOURCES](https://www.doxygen.nl/manual/config.html#cfg_inline_sources)
Ref: [STRIP\_CODE\_COMMENTS](https://www.doxygen.nl/manual/config.html#cfg_strip_code_comments)
-To include diagrams in the Doxygen output, the following are required to be installed. The installation process will vary between distributions:
-[The PlantUML jar](https://plantuml.com/download)
-`sudo apt install default-jre`
-`sudo apt install texlive-font-utils`
+For shell scripts to be documented, the file `doxygen-bash.sed` must be in the `$PATH` environment variable.
+It can be download from here:
+
+```sh
+wget https://raw.githubusercontent.com/Anvil/bash-doxygen/master/doxygen-bash.sed
+chmod +x doxygen-bash.sed
+```
+
+To include diagrams in the Doxygen output, the following are required to be installed. The installation process will vary between distributions:
+
+[The PlantUML jar](https://plantuml.com/download)
+
+```sh
+sudo apt install default-jre
+sudo apt install texlive-font-utils
+```
---