Login Logout

Howto GitIt

Gitit est un wiki basé sur Git et écrit en Haskell. Il permet l’édition de pages en utilisant la syntaxe Markdown, directement via Git ou via une interface web. Au niveau rendu, il génère des pages HTML avec un style personnalisable via des templates, et permet aussi l’export en TXT/ODT/etc ; il intègre également un moteur de recherche (regardez en haut à droite !). https://wiki.evolix.org utilise fièrement Gitit !

Installation

Paquet Debian

# apt install gitit

$ gitit --version
gitit version 0.10.4 +plugins
Copyright (C) 2008 John MacFarlane
This is free software; see the source for copying conditions.  There is no
warranty, not even for merchantability or fitness for a particular purpose.

Compilation classique

Attention, la compilation est assez longue.

# apt install cabal-install ghc zlib1g-dev
# adduser --disabled-password gitit
# sudo -u gitit -i

Note : /tmp doit être en EXEC pour l’installation

$ cabal update
$ cabal --reorder-goals install gitit
$ echo PATH="$HOME/.cabal/bin:$PATH" > ~/.profile

$ gitit --version
gitit version 0.12.3 -plugins

Compilation avec patch pour la recherche de mots partiels

Par défaut, Gitit ne recherche que les mots entiers.

Voici un patch pour pouvoir rechercher aussi les mots partiels.

Attention, la compilation est assez longue.

# adduser --disabled-password gitit
# sudo -u gitit -i

Note : /tmp doit être en EXEC pour l’installation

$ git clone https://github.com/jgm/gitit.git src/gitit
$ cd src/gitit

Mettre le patch suivant dans un fichier patch :

--- src/Network/Gitit/Handlers.hs→  2024-10-10 17:38:54.599750889 +0200
+++ src/Network/Gitit/Handlers.hs→  2024-10-10 17:21:30.964162724 +0200
@@ -274,5 +274,5 @@
                    else liftIO $ E.catch (search fs SearchQuery{
                                                   queryPatterns = patterns
-                                                , queryWholeWords = True
+                                                , queryWholeWords = False
                                                 , queryMatchAll = True
                                                 , queryIgnoreCase = True })
--- data/static/js/search.js→   2024-10-10 17:38:54.599750889 +0200
+++ data/static/js/search.js→   2024-10-10 17:21:30.960162606 +0200
@@ -1,14 +1,4 @@
 jQuery.fn.highlightPattern = function (patt, className)
 {
-    // check if patt starts or ends with non-word character
-    // and set regex boundary accordingly.
-    var start = '\\b(';
-    var end = ')\\b';
-    if (/\W/.test(patt.charAt(0))) {
-       var start = '\(?=\\W\)(';
-    };
-    if (/\W/.test(patt.charAt(patt.length - 1))) {
-       var end = ')\(?!\\w\)';
-    }
     // escape regex metacharacters that may be in the patt
     var epatt = patt.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1")
@@ -16,5 +6,5 @@
     // patt is a space separated list of strings - we want to highlight
     // an occurrence of any of these strings as a separate word.
-    var regex = new RegExp(start + epatt.replace(/ /g, '| ') + end, 'gi');
+    var regex = new RegExp('(' + epatt.replace(/ /g, '| ') + ')', 'gi');

     return this.each(function ()

Et appliquer le patch :

$ patch -p0 < patch
patching file src/Network/Gitit/Handlers.hs
patching file data/static/js/search.js

Puis compiler GitIt :

$ nice -n19 cabal install exe:gitit
$ ~/.cabal/bin/gitit  --version

Faire le ménage :

$ cd ~
$ rm -r src

Configuration

Configuration de Gitit

$ gitit --print-default-config > gitit.conf

Exemple de configuration pour gitit.conf :

address: 127.0.0.1
repository-type: Git
repository-path: git
session-timeout: 36000
default-extension: md
default-page-type: Markdown
front-page: index
no-delete: index, Help
use-cache: yes

Pour voir la liste des langages supportés pour le highlighting :

$ pandoc -v

Configuration du reverse proxy Nginx

Exemple de configuration Nginx /etc/nginx/sites-available/gitit.conf :

server {
    server_name     gitit.example.com;
    listen          0.0.0.0:80;
    listen          [::]:80;
    location /_register {
        allow 192.0.2.42;
        deny all;
        proxy_pass        http://127.0.0.1:5001/_register;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_redirect off;
    }
    location / {
        proxy_pass        http://127.0.0.1:5001/;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_redirect off;
    }
    access_log      /var/log/nginx/gitit/access.log;
    error_log       /var/log/nginx/gitit/error.log;
}

Lancement

On peut lancer manuellement :

$ gitit -f gitit.conf

Exemple d’unité systemd mono-instance

/etc/systemd/system/gitit.service avec gitit installé manuellement dans $HOME/.cabal :

[Unit]
Description=Wiki gitit
After=network.target

[Service]
User=gitit
Group=gitit
UMask=0027

WorkingDirectory=/home/gitit
PrivateTmp=true

ExecStart=/home/gitit/.cabal/bin/gitit -f /home/gitit/gitit.conf
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=wiki.service

Exemple d’unité systemd multi-instances

Installer Gitit manuellement comme indiqué ci-dessus pour l’utilisateur USER (nommé gitit dans la section mono-instance).

/etc/systemd/system/gitit@.service avec gitit installé manuellement dans /home/USER/.cabal :

[Unit]
Description=Gitit %i
After=network.target

[Service]
WorkingDirectory=/home/%i/
ExecStart=/home/%i/.cabal/bin/gitit -f /home/%i/gitit.conf
Type=simple
User=%i
Group=%i
UMask=0027
PrivateTmp=true
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

Pour activer et démarrer l’instance de USER :

# systemctl enable gitit@USER.service
# systemctl start gitit@USER.service

Mise-à-jour

Pour la mise-à-jour d’une installation manuelle, on fera simplement :

$ cabal update
$ cabal install gitit
# systemctl restart gitit

Troubleshooting

Page en markdown non interprétée

Si Gitit affiche certaines pages en markdown sans l’interpréter, il faut supprimer le contenu du répertoire cache dans son répertoire racine :

# rm -rf <GITIT_ROOT>/cache/*

Hooks Git non exécutés

Attentions, les hooks ./.git/hooks/ du dépôt doivent être exécutables.