% !TEX root = BuildWithGBP.nw% ===> this file was generated automatically by noweave --- better not edit it
\part{Plugins und Skripte}

\chapter{Java-Plugin}

\nwfilename{Part6.nw}\nwbegincode{1}\sublabel{NW4NcYAq-1Vt6yy-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-1Vt6yy-1}}}\moddef{build-gbp-java-plugin.sh~{\nwtagstyle{}\subpageref{NW4NcYAq-1Vt6yy-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
#!/usr/bin/bash

# Copyright 2019-2025 Mechtilde and Michael Stehmann <mechtilde@debian.org>
# version 0.9.0

# java plugin for build-gbp.sh

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.

\LA{}Rules4Java~{\nwtagstyle{}\subpageref{NW4NcYAq-15sQn8-1}}\RA{}
\nwnotused{build-gbp-java-plugin.sh}\nwendcode{}\nwbegindocs{2}\nwdocspar

\section{Anpassungen für \texttt{Java}-Pakete}
\label{sec:JavaAdaption}

In der Datei \textit{debian/rules} (Kapitel~\ref{subsec:rules}, 
Seite~\pageref{subsec:rules}) werden für das Kompilieren mit \texttt{Java} 
folgende Zeilen hinzugefügt:

\nwenddocs{}\nwbegincode{3}\sublabel{NW4NcYAq-15sQn8-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-15sQn8-1}}}\moddef{Rules4Java~{\nwtagstyle{}\subpageref{NW4NcYAq-15sQn8-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-1Vt6yy-1}}\nwenddeflinemarkup
function Rules4Java \{
    echo "export JAVA_TOOL_OPTIONS := -Dfile.encoding=UTF8" >>\\
     $\{GitPath\}/debian/rules
    echo -e "export JAVA_HOME := /usr/lib/jvm/default-java\\n" >>\\
     $\{GitPath\}/debian/rules
\}
\LA{}build-gbp-java-plugin~{\nwtagstyle{}\subpageref{NW4NcYAq-2UVuFb-1}}\RA{}
\nwused{\\{NW4NcYAq-1Vt6yy-1}}\nwendcode{}\nwbegindocs{4}\nwdocspar

Dies bedeutet, dass:
\begin{enumerate}
 \item{Immer das UTF-8 encoding genutzt wird}  
 \item{die Variable \textit{JAVA\_HOME} gesetzt ist.} 
\end{enumerate}
% Todo mit oder ohne export beschreiben

Vom Skript wird lediglich eine Minimalkonfiguration der Datei 
\textit{rules} bereitgestellt. Diese muss oft noch sinnvoll ergänzt werden. 
Für das Bauen der JAVA-Pakete werden häufig folgende Optionen benötigt.

\begin{verbatim}
    JMODS := /usr/lib/jvm/default-java/jmods
    JAVACMD="\$JAVA\_HOME/bin/java"
\end{verbatim}

Es kommt auch vor, dass \textit{JDK\_HOME} statt \textit{JAVA\_HOME} 
verwendet wird. 
%Es muss ausprobiert werden, ob noch jeweils ein "export" davor gesetzt 
%werden muss

% Der folgende Abschnitt muss noch dazu überprüft werden, was davon im 
%Maven-Plugin untergebracht werden muss.

Diese Ergänzungen werden für die mit dem \textit{maven}-Build-System 
erstellten Pakete vom \textit{Maven-Plugin} (Kapitel~\ref{chap:MavenPlugin}, 
Seite~\pageref{chap:MavenPlugin}) bereitgestellt.

In der Zeile mit \textit{dh \$@} können Optionen eingefügt werden.

\begin{description}
    \item[-{}-with javahelper]
    \item[-{}-buildsystem=maven]
    \item[-{}-buildsystem=ant]
    \item[-{}-buildsystem=gradle]
\end{description}

\nwenddocs{}\nwbegincode{5}\sublabel{NW4NcYAq-2UVuFb-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2UVuFb-1}}}\moddef{build-gbp-java-plugin~{\nwtagstyle{}\subpageref{NW4NcYAq-2UVuFb-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-15sQn8-1}}\nwenddeflinemarkup

whiptail --title "Java plugin found" \\
--msgbox "build-gbp-java-plugin.sh was loaded." 15 60

echo "build-gbp-java-plugin.sh was loaded." >> $\{log\}
\nwused{\\{NW4NcYAq-15sQn8-1}}\nwendcode{}\nwbegindocs{6}\nwdocspar

\chapter{Maven-Plugin}
\label{chap:MavenPlugin}

Das \texttt{Maven}-Plugin unterstützt das Bauen von \texttt{Java}-Paketen 
mit dem \texttt{Java}-Build-System \textit{maven} 
(Kapitel~\ref{subsec:JavaPaketMaven}, 
Seite~\pageref{subsec:JavaPaketMaven}).

\section{Kopf des Maven-Plugins}

Der Kopfteil des Plugins enthält Angaben zu den Urhebern und der Lizenz.

Außerdem ist vermerkt, welche \texttt{Debian}-Pakete für den Ablauf des 
Programmskriptes installiert sein müssen.

\nwenddocs{}\nwbegincode{7}\sublabel{NW4NcYAq-3bFwd5-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-3bFwd5-1}}}\moddef{build-gbp-maven-plugin.sh~{\nwtagstyle{}\subpageref{NW4NcYAq-3bFwd5-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
#!/usr/bin/bash

# Copyright 2019-2025 Mechtilde and Michael Stehmann <mechtilde@debian.org>
# version 0.9.0

# maven plugin for build-gbp.sh

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.

# Dependencies: maven-debian-helper licensecheck apt-file

\LA{}Rules4MavenDH~{\nwtagstyle{}\subpageref{NW4NcYAq-1X9Cb6-1}}\RA{}
\nwnotused{build-gbp-maven-plugin.sh}\nwendcode{}\nwbegindocs{8}\nwdocspar

\section{Mitteilung}

Das Plugin-Skript teilt mit, dass es geladen wurde. Damit ist der Code 
des Plugins Teil des (Haupt-)Programmskriptes.

\nwenddocs{}\nwbegincode{9}\sublabel{NW4NcYAq-47i6FT-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-47i6FT-1}}}\moddef{MavenPlugin~{\nwtagstyle{}\subpageref{NW4NcYAq-47i6FT-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-SN6sE-1}}\nwenddeflinemarkup
whiptail --title "maven plugin found" \\
--msgbox "build-gbp-maven-plugin.sh was loaded." 15 60

echo "build-gbp-maven-plugin.sh was loaded." >> $\{log\}
# Next the function MakeMaven is executed by the main script.
# This is the end, my friend
\nwused{\\{NW4NcYAq-SN6sE-1}}\nwendcode{}\nwbegindocs{10}\nwdocspar

\begin{figure}[!h]
\centering
\includegraphics[width=25em,height=30ex]{Pictures/MavenPluginLoaded.png} 
\caption{Maven Plugin geladen}
\end{figure}

\section{Bauen mit \textit{Maven}}
\label{sec:BuildWithMaven}

Diese Funktion wird nach dem Laden des Plugins beim Bauen einer neuen 
Revision von der Funktion \textit{BuildNewVersion} des 
(Haupt-)Programmskriptes aufgerufen 
(Kapitel~\ref{sec:RequestBuildWithMaven}, 
Seite~\pageref{sec:RequestBuildWithMaven}).

Die Ausführung von \textit{mh\_make} erfolgt in einer
\textit{Chroot}-Umgebung. Wenn die \textit{chroot} noch nicht existiert,
ist sie zunächst als \textit{/srv/maven-chroot} anzulegen wie in 
Kapitel~\ref{sec:MoreChrootSystems}
(Seite~\pageref{sec:MoreChrootSystems}) beschrieben.

\nwenddocs{}\nwbegincode{11}\sublabel{NW4NcYAq-ZOhlV-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-ZOhlV-1}}}\moddef{MakeMaven~{\nwtagstyle{}\subpageref{NW4NcYAq-ZOhlV-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-28IS2D-1}}\nwenddeflinemarkup
function MakeMaven \{
    # Called by BuildNewRevision

    cd $\{GitPath\}
    IdentifyMavenChrootPath

\LA{}MakeMaven1~{\nwtagstyle{}\subpageref{NW4NcYAq-gqeVW-1}}\RA{}
\nwused{\\{NW4NcYAq-28IS2D-1}}\nwendcode{}\nwbegindocs{12}\nwdocspar

\nwenddocs{}\nwbegincode{13}\sublabel{NW4NcYAq-3UsGlp-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-3UsGlp-1}}}\moddef{IdentifyMavenChrootPath~{\nwtagstyle{}\subpageref{NW4NcYAq-3UsGlp-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-2JSWnR-1}}\nwenddeflinemarkup
function IdentifyMavenChrootPath \{
    # Called by MakeMaven and itself
    
    if [ -n "$\{ChrootPath\}" ]
    then
        if ! whiptail --title "Maven chroot path " \\
        --yesno "Is $\{ChrootPath\}\\nthe right path to\\n\\
        maven chroot directory on the host?" \\
        --yes-button "Yes" \\
        --no-button "No" 15 60
\LA{}IdentifyMavenChrootPath1~{\nwtagstyle{}\subpageref{NW4NcYAq-wD95N-1}}\RA{}
\nwused{\\{NW4NcYAq-2JSWnR-1}}\nwendcode{}\nwbegindocs{14}\nwdocspar

\begin{figure}[!h]
\centering
\includegraphics[width=25em,height=30ex]{Pictures/IdentifyMavenChrootPath.png} 
\caption{Pfad zur Maven-Chroot ermitteln}
\end{figure}

\nwenddocs{}\nwbegincode{15}\sublabel{NW4NcYAq-wD95N-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-wD95N-1}}}\moddef{IdentifyMavenChrootPath1~{\nwtagstyle{}\subpageref{NW4NcYAq-wD95N-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-3UsGlp-1}}\nwenddeflinemarkup
        then
            OldCP=$\{ChrootPath\}
            AskChrootPath
        fi
    else
        AskChrootPath
    fi

\LA{}IdentifyMavenChrootPath2~{\nwtagstyle{}\subpageref{NW4NcYAq-3SKWcr-1}}\RA{}
\nwused{\\{NW4NcYAq-3UsGlp-1}}\nwendcode{}\nwbegindocs{16}\nwdocspar

\nwenddocs{}\nwbegincode{17}\sublabel{NW4NcYAq-2yU147-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2yU147-1}}}\moddef{AskChrootPath~{\nwtagstyle{}\subpageref{NW4NcYAq-2yU147-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-TDih7-1}}\nwenddeflinemarkup
function AskChrootPath \{
    # Called by IdentifyMavenChrootPath
    
    # This is the way from GitPath to /srv/maven-chroot
    ChrootPath=$(whiptail --title "Maven chroot path" \\
    --inputbox "Please insert the path\\nto the maven chroot directory\\n\\
    on the host:" \\
    --nocancel 15 60 3>&2 2>&1 1>&3)
\LA{}AskChrootPath1~{\nwtagstyle{}\subpageref{NW4NcYAq-2HDZQq-1}}\RA{}
\nwused{\\{NW4NcYAq-TDih7-1}}\nwendcode{}\nwbegindocs{18}\nwdocspar

\begin{figure}[!h]
\centering
\includegraphics[width=25em,height=30ex]{Pictures/MavenChrootPath.png} 
\caption{Pfad zur Maven-Chroot angeben}
\end{figure}

\nwenddocs{}\nwbegincode{19}\sublabel{NW4NcYAq-2HDZQq-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2HDZQq-1}}}\moddef{AskChrootPath1~{\nwtagstyle{}\subpageref{NW4NcYAq-2HDZQq-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-2yU147-1}}\nwenddeflinemarkup

    if [ -n "$\{OldCP\}" ]
    then
        ReplaceConfigLines "ChrootPath" $\{ChrootPath\}
    else
        echo "### Maven chroot path"
        echo "ChrootPath="$\{ChrootPath\} >> $\{ConfigPath\}$\{OrigName\}
    fi
    OldCP=""
\}

\LA{}AskWorkspacePath~{\nwtagstyle{}\subpageref{NW4NcYAq-32GbAG-1}}\RA{}
\nwused{\\{NW4NcYAq-2yU147-1}}\nwendcode{}\nwbegindocs{20}\nwdocspar

\nwenddocs{}\nwbegincode{21}\sublabel{NW4NcYAq-3SKWcr-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-3SKWcr-1}}}\moddef{IdentifyMavenChrootPath2~{\nwtagstyle{}\subpageref{NW4NcYAq-3SKWcr-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-wD95N-1}}\nwenddeflinemarkup
    # Create Maven-Chroot if not exists
    if ! [ -d $\{ChrootPath\} ]
    then
        echo "Please enter your SUDO password!"
        sudo mkdir --parents $\{ChrootPath\}
    fi
    
    if ! [ -d $\{ChrootPath\}/usr ]
    then
        echo "Please enter your SUDO password!"
        sudo /usr/sbin/debootstrap --arch amd64 sid \\
        $\{ChrootPath\} http://ftp.de.debian.org/debian
        echo "The maven chroot has been created." >> $\{log\}
    fi

\LA{}IdentifyMavenChrootPath3~{\nwtagstyle{}\subpageref{NW4NcYAq-1Ll2nB-1}}\RA{}
\nwused{\\{NW4NcYAq-wD95N-1}}\nwendcode{}\nwbegindocs{22}\nwdocspar

\nwenddocs{}\nwbegincode{23}\sublabel{NW4NcYAq-1Ll2nB-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-1Ll2nB-1}}}\moddef{IdentifyMavenChrootPath3~{\nwtagstyle{}\subpageref{NW4NcYAq-1Ll2nB-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-3SKWcr-1}}\nwenddeflinemarkup
    # The workspace is /home/user
    if [ -n "$\{Path2Workspace\}" ]
    then
        if ! whiptail --title "Maven chroot path " \\
        --yesno "Is $\{Path2Workspace\}\\nthe workspace in the maven chroot?" \\
        --yes-button "Yes" \\
        --no-button "No" 15 60 # test
\LA{}IdentifyMavenChrootPath4~{\nwtagstyle{}\subpageref{NW4NcYAq-4b0e0v-1}}\RA{}
\nwused{\\{NW4NcYAq-3SKWcr-1}}\nwendcode{}\nwbegindocs{24}\nwdocspar

\begin{figure}[!h]
\centering
\includegraphics[width=25em,height=30ex]{Pictures/WorkspaceMavenChroot.png} 
\caption{Arbeitsverzeichnis in der Maven-Chroot ermitteln}
\end{figure}

\nwenddocs{}\nwbegincode{25}\sublabel{NW4NcYAq-4b0e0v-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-4b0e0v-1}}}\moddef{IdentifyMavenChrootPath4~{\nwtagstyle{}\subpageref{NW4NcYAq-4b0e0v-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-1Ll2nB-1}}\nwenddeflinemarkup
        then
            OldP2W=$\{Path2Workspace\}
            AskWorkspacePath
        fi
    else
        AskWorkspacePath
    fi
\LA{}IdentifyMavenChrootPath5~{\nwtagstyle{}\subpageref{NW4NcYAq-Fuuhl-1}}\RA{}
\nwused{\\{NW4NcYAq-1Ll2nB-1}}\nwendcode{}\nwbegindocs{26}\nwdocspar

\nwenddocs{}\nwbegincode{27}\sublabel{NW4NcYAq-32GbAG-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-32GbAG-1}}}\moddef{AskWorkspacePath~{\nwtagstyle{}\subpageref{NW4NcYAq-32GbAG-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-2HDZQq-1}}\nwenddeflinemarkup
function AskWorkspacePath \{
    # Called by IdentifyMavenChrootPath

    # This is the way to /home/user/
    Path2Workspace=$(whiptail --title "Maven chroot path" \\
    --inputbox "Please insert the path\\nto the workspace directory:" \\
    --nocancel 15 60 3>&2 2>&1 1>&3)
\LA{}AskWorkspacePath2~{\nwtagstyle{}\subpageref{NW4NcYAq-2JSWnR-1}}\RA{}
\nwused{\\{NW4NcYAq-2HDZQq-1}}\nwendcode{}\nwbegindocs{28}\nwdocspar

\begin{figure}[!h]
\centering
\includegraphics[width=25em,height=30ex]{Pictures/InsertMavenChrootWorkspace.png} 
\caption{Arbeitsverzeichnis in der Maven-Chroot angeben}
\end{figure}

\nwenddocs{}\nwbegincode{29}\sublabel{NW4NcYAq-2JSWnR-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2JSWnR-1}}}\moddef{AskWorkspacePath2~{\nwtagstyle{}\subpageref{NW4NcYAq-2JSWnR-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-32GbAG-1}}\nwenddeflinemarkup

    if [ -n "$\{OldP2W\}" ]
    then
        ReplaceConfigLines "Path2Workspace" $\{Path2Workspace\}
    else
        echo "Path2Workspace="$\{Path2Workspace\} >> $\{ConfigPath\}$\{OrigName\}
    fi
    OldP2W=""
\}

\LA{}IdentifyMavenChrootPath~{\nwtagstyle{}\subpageref{NW4NcYAq-3UsGlp-1}}\RA{}

\nwused{\\{NW4NcYAq-32GbAG-1}}\nwendcode{}\nwbegindocs{30}\nwdocspar

\nwenddocs{}\nwbegincode{31}\sublabel{NW4NcYAq-Fuuhl-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-Fuuhl-1}}}\moddef{IdentifyMavenChrootPath5~{\nwtagstyle{}\subpageref{NW4NcYAq-Fuuhl-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-4b0e0v-1}}\nwenddeflinemarkup
    # Replace / at the end
    Path2Workspace=$(echo $\{Path2Workspace\} | sed --expression="s/\\/$//")
    MavenChrootPath=$\{ChrootPath\}$\{Path2Workspace\}
    if ! [ -d $\{MavenChrootPath\} ]
    then
        whiptail --title "Error!" \\
        --msgbox "$\{MavenChrootPath\} does not exist.\\n\\
        It will be created now." 15 60
\LA{}IdentifyMavenChrootPath7~{\nwtagstyle{}\subpageref{NW4NcYAq-28IS2D-1}}\RA{}
\nwused{\\{NW4NcYAq-4b0e0v-1}}\nwendcode{}\nwbegindocs{32}\nwdocspar

\begin{figure}[!h]
\centering
\includegraphics[width=25em,height=30ex]{Pictures/NonExistingMavenChroot.png} 
\caption{Maven-Chroot existiert nicht}
\end{figure}

Existiert die \textit{chroot} nicht, ist sie anzulegen wie in 
Kapitel~\ref{sec:MoreChrootSystems}, Seite~\pageref{sec:MoreChrootSystems} 
beschrieben.

\nwenddocs{}\nwbegincode{33}\sublabel{NW4NcYAq-28IS2D-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-28IS2D-1}}}\moddef{IdentifyMavenChrootPath7~{\nwtagstyle{}\subpageref{NW4NcYAq-28IS2D-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-Fuuhl-1}}\nwenddeflinemarkup
        echo "Please enter your SUDO password!"
        sudo mkdir --parents $\{MavenChrootPath\}
        echo "The maven work space has been created." >> $\{log\}
    fi
\}

\LA{}MakeMaven~{\nwtagstyle{}\subpageref{NW4NcYAq-ZOhlV-1}}\RA{}
\nwused{\\{NW4NcYAq-Fuuhl-1}}\nwendcode{}\nwbegindocs{34}\nwdocspar

\paragraph*{}
% Anchor for Label
\label{par:MavenChrootWork}

Das Arbeitsverzeichnis des Projektes wird in den Arbeitsbereich
der \textit{maven-chroot} kopiert. Hierzu werden \textit{Root}-Rechte
benötigt.

\nwenddocs{}\nwbegincode{35}\sublabel{NW4NcYAq-gqeVW-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-gqeVW-1}}}\moddef{MakeMaven1~{\nwtagstyle{}\subpageref{NW4NcYAq-gqeVW-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-ZOhlV-1}}\nwenddeflinemarkup
    # Copy workspace to maven chroot
    echo "To copy the sources into maven-chroot you need sudo rights"
    sudo cp --archive $\{GitPath\} $\{MavenChrootPath\}

    # Because mh_make has to run in the directory, where pom.xml is
    echo "pom.xml is here:"
    find . -name 'pom.xml' -print
    echo "Please switch to the Maven chroot in another terminal."
    echo
    echo "Use these commands:"
    echo
    echo "# sudo mount -o bind /proc "$\{ChrootPath\}"/proc"
    echo "# sudo mount devpts /dev/pts -t devpts"
    echo
    echo "sudo LANG=C chroot "$\{ChrootPath\}" /usr/bin/bash"
    echo "cd "$\{Path2Workspace\}"/"$\{SourceName\}
    echo "try: apt install maven-debian-helper"
    echo "apt update && apt upgrade"
    echo "mh_make --verbose "$\{SourceName\}
    echo
    echo "Then follow the questions of mh_make"
    echo
    echo "You can leave the chroot with 'exit'."
    echo
    echo "After finishing press return to go on!"
    read a

    #--run-tests=true --javadoc=true --verbose
    #mh_make --package=$\{SourceName\} --bin-package=$\{PackName\} \\
    #--run-tests=false --javadoc=false --verbose
    #if [ $? -ne 0 ]
    #then
    #    echo "mh_make failed!"
    #    exit
    #else    
    #    echo "mh_make has been executed for "$\{PackName\} >> $\{log\}
    #fi
    
    cp --recursive --update $\{MavenChrootPath\}/$\{SourceName\}/debian \\
    $\{GitPath\}    

\LA{}MakeMaven5~{\nwtagstyle{}\subpageref{NW4NcYAq-SN6sE-1}}\RA{}
\nwused{\\{NW4NcYAq-ZOhlV-1}}\nwendcode{}\nwbegindocs{36}\nwdocspar

Beim Ablauf des Programmes \textit{mh\_make} sind folgende Fragen zu 
beantworten. Dieses Programm selber in auch ein Shell-Skript.

\begin{description}
    \item[Environment variable DEBLICENSE not set, using Apache-2.0 by default] 
    Die Umge\-bungsvariable \textit{DEBLICENSE} ist 
    nicht gesetzt, verwendet wird dann standardmäßig die Lizenz 
    Apache-2.0. In der Variablen \textit{DEBLICENSE} wird die Lizenz für 
    die Dateien in \textit{debian/} hinterlegt.
    % ToDo: Beschreiben, wo diese Umgebungsvariablen definiert werden. 
    %(eventuell) vor der Ausführung abfragen.

    \item[Checking that apt-file is installed and has been configured\dots
    {$[$ ok $]$}] Prüfung, ob das Paket \textit{apt-file} installiert ist. 
    Dieses Paket ist nur als \emph{empfohlen} markiert.
    \item[Checking that licensecheck is installed\dots {$[$ ok $]$}] 
    Prüfung, ob das Paket \textit{licensecheck} installiert ist. 
    Dieses Paket ist ebenfalls nur als \emph{empfohlen} markiert.
    \item[Solving dependencies for package <PaketName>]
    \item[Analysing pom.xml\dots] 
    \item[Resolving com.jcabi:jcabi:pom:1.21 of scope runtime\dots]
    % ToDo: Angaben zum speziellen Paket verallgemeinern
    \item[\protect{\parbox[t]{15cm}{In pom.xml: The parent POM cannot
    be found in the Maven repository for De\-bian. Ignore it? com.jcabi:jcabi:pom:1.21 
    {$[$ Y/n $]$}}}]
    % ToDo: Angaben zum speziellen Paket verallgemeinern
    Dass die Abhängigkeit für das Elternelement nicht gefunden wird, ist 
    der Regelfall. Daher wird die Frage bejaht, dass dies ignoriert werden 
    kann. Diese Information wird dann als als \textit{--no-parent} in die 
    Datei \textit{<PaketName>.poms} geschrieben.
    \item[Enter the upstream version for the package.] Hier wird die zu 
    bauende Versionsnummer des Upstream-codes abgefragt und in der Regel 
    mit \textit{Enter} bestätigt. Andernfalls wird die korrekte 
    Versionsnummer eingegeben.
    \item[Version of com.jcabi:jcabi-aspects is 0.22.6]
    % ToDo: Angaben zum speziellen Paket verallgemeinern
    Es wird nochmal die Versionsnummer angezeigt.
    \item[Choose how the version will be transformed:] Nun wird eine 
    Auswahl angezeigt, wie diese Versionsnummer umgewandelt werden soll.

    \begin{description}
        \item[0 - Replace all versions starting by 0. with 0.x] Ersetze 
        alle Versionsbezeichnungen
        \item[(1) - Change the version to the symbolic 'debian' version] 
        Die Standardangabe wird mit eckigen Klammern (Hier sind es aus 
        satztechnischen Gründen runde Klammern) gekennzeichnet. Diese 
        kann mit \textit{Enter} bestätigt werden.
        \item[2 - Keep the version]
        \item[3 - Custom rule]
    \end{description}

    Andernfalls wird nun die gewünschte Ziffer eingegeben.
    \item[\protect{\parbox[t]{15cm}{com.jcabi:jcabi-aspects is a bundle.
     - Inform mh\_make that 
    dependencies of type jar which may match this library should be 
    transformed into bundles automatically? 
    {$[$ Y/n $]$}}}]
    % ToDo: Angaben zum speziellen Paket verallgemeinern
    Soll \textit{mh\_make} mitgeteilt 
    werden, dass die passenden Abhängigkeiten vom Typ \textit{jar} 
    in Bundles umgewandelt werden. Standardmäßig wird diese Frage bejaht.
    \item[\protect{\parbox[t]{15cm}{Resolving com.jcabi:jcabi-log:jar:0.17
     of scope runtime\dots 
    {$[$ check dependency with bundle type $]$}}}]
    % ToDo: Angaben zum speziellen Paket verallgemeinern
    \item[\protect{\parbox[t]{15cm}{In pom.xml: This dependency cannot
    be found in the Debian Maven 
    repository. Ignore this dependency?  com.jcabi:jcabi-log:jar:0.17
    {$[$ y/N $]$}}}] Diese Meldung kommt, wenn die benötigte Abhängigkeit
     nicht auf der Arbeitsmaschine installiert ist.
\begin{itemize}
    \item \textgreater dpkg --search /usr/share/maven-repo/com/jcabi/jcabi-log/*/* 
    dpkg failed to execute successfully
    \item \textgreater apt-file search /usr/share/maven-repo/com/jcabi/jcabi-log
    \footnotesize
    \begin{verbatim}
Found /usr/share/maven-repo/com/jcabi/jcabi-log/0.18.1/jcabi-log-0.18.1.pom
    in libjcabi-log-java
Found /usr/share/maven-repo/com/jcabi/jcabi-log/0.19.0/jcabi-log-0.19.0.pom
    in libjcabi-log-java
Found /usr/share/maven-repo/com/jcabi/jcabi-log/debian/jcabi-log-debian.pom
    in libjcabi-log-java
    \end{verbatim}
    \normalsize
\item \textgreater dpkg --search /usr/share/java/jcabi-log.jar 
dpkg failed to execute successfully
\item \textgreater apt-file search /usr/share/java/jcabi-log.jar 
Found libjcabi-log-java
[error] Package libjcabi-log-java does not contain Maven dependency 
com.jcabi:jcabi-log:jar:0.17 but there seem to be a match
If the package contains already Maven artifacts but the names don't match, 
try to enter a substitution rule of the form 
s/groupId/newGroupId/ s/artifactId/newArtifactId/ jar s/version/newVersion/ here:
> 
\end{itemize}

Nach der Installation des fehlenden Paketes auf der Arbeitsmaschine kann 
die Suche wiederholt werden.

\end{description}

\nwenddocs{}\nwbegincode{37}\sublabel{NW4NcYAq-SN6sE-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-SN6sE-1}}}\moddef{MakeMaven5~{\nwtagstyle{}\subpageref{NW4NcYAq-SN6sE-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-gqeVW-1}}\nwenddeflinemarkup
    if [ -w debian/maven.rules ]
    then
        echo "#[groupId] [artifactId] [type] [version] [classifier] [scope]" \\
        >> debian/maven.rules
    fi

    ShowMaven

    # Patch for mh_make bug
    str4standardsversion="4.5.1"
    cd $\{GitPath\}/debian/
    less --LINE-NUMBERS control

    sed --in-place --expression=\\
    "s/Standards-Version: 4.4.1/Standards-Version: $\{str4standardsversion\}/" \\
    control
    # 'a' means append. The string after the 'a' will be appended 
    # to the sting before the 'a'.
    sed --in-place \\
    --expression="/Standards-Version: $\{str4standardsversion\}/ \\
    a Rules-Requires-Root: no" \\
    control
    sed --in-place --expression=\\
    "s/debhelper-compat (=12)/debhelper-compat $\{str4versiondebhelpers\}/"  \\
    control

    cd $\{GitPath\}
    whiptail --title "Check debian/control" \\
    --msgbox "Please check the control file another time!" 15 60
    less --LINE-NUMBERS $\{GitPath\}/debian/control
\}

\LA{}MavenPlugin~{\nwtagstyle{}\subpageref{NW4NcYAq-47i6FT-1}}\RA{}
\nwused{\\{NW4NcYAq-gqeVW-1}}\nwendcode{}\nwbegindocs{38}\nwdocspar

\section{Maven-Dateien bearbeiten}
\label{sec:MavenDateienBearbeiten}

Pakete, die mit \textit{Maven (mvn)} gebaut werden, benötigen dazu 
weitere Dateien im Verzeichnis \textit{debian/}. 
Diese werden im Folgenden aufgelistet.

\nwenddocs{}\nwbegincode{39}\sublabel{NW4NcYAq-3IwFze-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-3IwFze-1}}}\moddef{ShowMaven~{\nwtagstyle{}\subpageref{NW4NcYAq-3IwFze-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-1X9Cb6-1}}\nwenddeflinemarkup
function ShowMaven \{
    # Called by DisplayDebianFiles MakeMaven

    nano --linenumbers --mouse --softwrap debian/$\{PackName\}.poms

\LA{}ShowMaven2~{\nwtagstyle{}\subpageref{NW4NcYAq-TDih7-1}}\RA{}
\nwused{\\{NW4NcYAq-1X9Cb6-1}}\nwendcode{}\nwbegindocs{40}\nwdocspar

\begin{itemize}
    \item{maven.cleanIgnoreRules}
    \item{maven.properties}
    \item{maven.rules}
    \item{maven.ignoreRules}
    \item{maven.publishedRules}
\end{itemize}

Nun können diese Dateien auch editiert werden.

\nwenddocs{}\nwbegincode{41}\sublabel{NW4NcYAq-TDih7-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-TDih7-1}}}\moddef{ShowMaven2~{\nwtagstyle{}\subpageref{NW4NcYAq-TDih7-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-3IwFze-1}}\nwenddeflinemarkup
    mavenl=$(ls $\{GitPath\}/debian/ | grep 'maven')
    for element in $\{mavenl[*]\}
    do
        nano --linenumbers --mouse --softwrap debian/$\{element\}
    done
    
    pomsl=$(ls $\{GitPath\}/debian/ | grep $\{PackName\})
    for element in $\{pomsl[*]\}
    do
        nano --linenumbers --mouse --softwrap debian/$\{element\}
    done
\}

\LA{}AskChrootPath~{\nwtagstyle{}\subpageref{NW4NcYAq-2yU147-1}}\RA{}
\nwused{\\{NW4NcYAq-3IwFze-1}}\nwendcode{}\nwbegindocs{42}\nwdocspar

\subsection{maven.rules}

Diese Datei ist wie folgt aufgebaut:

\nwenddocs{}\nwbegincode{43}\sublabel{NW4NcYAq-1qUWrs-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-1qUWrs-1}}}\moddef{maven-rules.header~{\nwtagstyle{}\subpageref{NW4NcYAq-1qUWrs-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
#[groupID] [artifactID] [type] [version] [classifier] [scope]
\nwnotused{maven-rules.header}\nwendcode{}\nwbegindocs{44}\nwdocspar

\subsection{maven.ignoreRules}

Diese Datei ist wie die Datei \textit{maven.rules} aufgebaut.

\nwenddocs{}\nwbegincode{45}\sublabel{NW4NcYAq-1pIKSs-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-1pIKSs-1}}}\moddef{maven-ignoreRules.header~{\nwtagstyle{}\subpageref{NW4NcYAq-1pIKSs-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
#[groupID] [artifactID] [type] [version] [classifier] [scope]
\nwnotused{maven-ignoreRules.header}\nwendcode{}\nwbegindocs{46}\nwdocspar

Artefakte, die in der Datei \textit{maven.rules} aufgenommen werden, 
sind hier gegebenenfalls zu löschen

\subsection{maven.properties}
\label{subsec:MavenProperties}

Die Datei \textit{maven.properties} kann verwendet werden, um Werte von 
Variablen innerhalb der \textit{pom.xml}-Dateien zu überschreiben. Der
häufigste Anwendungsfall ist die Deaktivierung oder Aktivierung der Tests 
mit \textit{maven.test.skip=true}

Weitere Optionen sind die Änderung der Quell- (\textit{maven.compiler.source=8}) 
bzw. Zielebene (\textit{maven.compiler.target=8}). Dabei bezieht sich der 
Wert (hier: \textit{8}) auf die java-Mindestversion. Dieser Eintrag wird 
besonders dann benötigt, wenn beim Kompilieren eine Meldung wie die 
folgende ausgegeben wird: \textit{use -source 8 or higher to enable \dots}.

Außerdem kann hier die verwendete Dateikodierung 
(\textit{project.build.sourceEncoding\-=UTF-8}) eingestellt werden. 

\nwenddocs{}\nwbegincode{47}\sublabel{NW4NcYAq-2BLUST-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2BLUST-1}}}\moddef{maven.properties~{\nwtagstyle{}\subpageref{NW4NcYAq-2BLUST-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
# Include here properties to pass to Maven during the build.
# For example:
# maven.test.skip=true
# project.build.sourceEncoding=UTF-8
# maven.compiler.source=8
# maven.compiler.target=8
# To skip test - missing dependencies
maven.test.skip=true
\nwnotused{maven.properties}\nwendcode{}\nwbegindocs{48}\nwdocspar

Häufig werden die Tests deaktiviert, um nicht zusätzliche Abhängigkeiten
paketieren zu müssen. In diesen Fällen sind diese Abhängigkeiten auch in
der Datei \textit{pom.xml} mit einem Kommentarzeichen zu versehen oder zu
entfernen.

Solche Änderungen am Upstream-Code können mit dem Programmskript
vorgenommen werden (Kapitel~\ref{chap:Aenderungen_am_Upstream_Code_vornehmen},
Seite~\pageref{chap:Aenderungen_am_Upstream_Code_vornehmen}).

\subsection{Paketname.poms}

In der Datei \textit{<Paketname>.poms} werden die Optionen zu den jeweiligen 
\textit{pom.xml}-Dateien hinterlegt. 

Die Datei enthält dann 2 Spalten. In der ersten Spalte steht die pom.xml 
mit dem dazugehörigen Pfad und in der zweiten Spalte die dazugehörigen 
Optionen, wie z.B. 

\begin{verbatim}
# List of POM files for the package
# Format of this file is:
# <path to pom file> [option]*
# where option can be:
#   --ignore: ignore this POM and its artifact if any
#   --ignore-pom: don't install the POM. To use on POM files that are 
#     created temporarily for certain artifacts such as Javadoc jars. 
#     [mh_install, mh_installpoms]
#   --no-parent: remove the <parent> tag from the POM
#   --package=<package>: an alternative package to use when installing 
#     this POM and its artifact
#   --has-package-version: to indicate that the original version of
#     the POM is the same as the upstream part of the version for the
#     package.
#   --keep-elements=<elem1,elem2>: a list of XML elements to keep in the 
#     POM during a clean operation with mh_cleanpom or mh_installpom
#   --artifact=<path>: path to the build artifact associated with this 
#     POM, it will be installed when using the command mh_install.
#     [mh_install]
#   --java-lib: install the jar into /usr/share/java to comply with
#      Debian packaging guidelines
#   --usj-name=<name>: name to use when installing the library in
#      /usr/share/java
#   --usj-version=<version>: version to use when installing the library
#     in /usr/share/java
#   --no-usj-versionless: don't install the versionless link in
#     /usr/share/java
#   --dest-jar=<path>: the destination for the real jar.
#     It will be installed with mh_install. [mh_install]
#   --classifier=<classifier>: Optional, the classifier for the jar. 
#     Empty by default.
#   --site-xml=<location>: Optional, the location for site.xml if it 
#     needsto be installed.
#     Empty by default. [mh_install]
#
pom.xml --no-parent --has-package-version
\end{verbatim}

Dies bedeutet, dass das <parent>-Tag beim Bauen aus der POM entfernt 
wird. Die Option \textit{--has-package-version} gibt an, dass die 
Originalversion der POM dieselbe sei, wie der Upstream-Teil der 
Paketversion.

\subsection{README.source}
\label{subsec:MavenReadmeSource}

\begin{verbatim}
    
Information about jcabi-aspects
------------------------------

This package was debianized using the mh_make command
from the maven-debian-helper package.

The build system uses Maven but prevents it from downloading
anything from the Internet, making the build compliant with
the Debian policy.
\end{verbatim}

\section{\textit{debian/rules} - Ergänzungen für \texttt{Java}-Pakete mit 
\textit{Maven}}
\label{sec:Rules4MavenDH}

In der Funktion \textit{Rules4MavenDH} wird die Datei \textit{debian/rules} 
um die Angabe des Build-Systems ergänzt. 

\nwenddocs{}\nwbegincode{49}\sublabel{NW4NcYAq-1X9Cb6-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-1X9Cb6-1}}}\moddef{Rules4MavenDH~{\nwtagstyle{}\subpageref{NW4NcYAq-1X9Cb6-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-3bFwd5-1}}\nwenddeflinemarkup
function Rules4MavenDH \{
    # Called by DebianRulesTemplates

    sed --in-place \\
    --expression="s/dh $@/dh $@ --buildsystem=maven" \\
    $\{GitPath\}/debian/rules

\}
\LA{}ShowMaven~{\nwtagstyle{}\subpageref{NW4NcYAq-3IwFze-1}}\RA{}
\nwused{\\{NW4NcYAq-3bFwd5-1}}\nwendcode{}\nwbegindocs{50}\nwdocspar

\chapter{Web-Extension-Plugin}
\label{chap:WebextPlugin}

Das nachstehend dargestellte Plugin erfüllt die besonderen Anforderungen 
beim Bauen von \texttt{Mozilla}-Erweiterungen als \texttt{Debian}-Pakete 
(Kapitel~\ref{chap:WebextBauen}, Seite~\pageref{chap:WebextBauen}).

\section{Kopf des Webext-Plugins}
Der Kopfteil des Plugins enthält angaben zu den Urhebern und der Lizenz.

Außerdem ist vermerkt, welche \texttt{Debian}-Pakete für den Ablauf des 
Programmskriptes installiert sein müssen.

\nwenddocs{}\nwbegincode{51}\sublabel{NW4NcYAq-B2EGb-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-B2EGb-1}}}\moddef{build-gbp-webext-plugin.sh~{\nwtagstyle{}\subpageref{NW4NcYAq-B2EGb-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
#!/usr/bin/bash

# Copyright 2020-2025 Mechtilde and Michael Stehmann <mechtilde@debian.org>
# version 0.9.0

# webext plugin for build-gbp.sh

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.

\LA{}IdentifyWebextId~{\nwtagstyle{}\subpageref{NW4NcYAq-2j9FLK-1}}\RA{}
\nwnotused{build-gbp-webext-plugin.sh}\nwendcode{}\nwbegindocs{52}\nwdocspar

\section{Erstellen der \textit{webext*.*}-Dateien in \textit{debian/}}

\subsection{Ermittlung des Namens der \textit{*.xpi}-Datei}

Die zu paketierende Erweiterung muss unter dem Namen der sich aus der Bezeichnung (id) in 
der Datei \textit{manifest.json} und der Endung \textit{.xpi} zusammensetzt, 
abgelegt werden.

Die Bezeichnung wird daher wie folgt ermittelt. 

\nwenddocs{}\nwbegincode{53}\sublabel{NW4NcYAq-2j9FLK-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2j9FLK-1}}}\moddef{IdentifyWebextId~{\nwtagstyle{}\subpageref{NW4NcYAq-2j9FLK-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-B2EGb-1}}\nwenddeflinemarkup
function IdentifyWebextId \{
    # Called by WebextRulesDH WebextInstall

    if [ -z $\{webextID\} ] && [ -f $\{GitPath\}/manifest.json ]
    then
        webextID=$(grep '"id":' $\{GitPath\}/manifest.json)
        webextID=$(echo $\{webextID\} | sed --expression='s/^\\"id\\": \\"//')
        webextID=$(echo $\{webextID\} | sed --expression='s/\\",\\s*//')

        echo -e "Notice from Webext-Plugin: WebextID = "$\{webextID\} >> $\{log\}
    fi

    if [ -z $\{webextID\} ]
    then
        webextID="PLEASE_REPLACE_WITH_ID"
        whiptail --title "ID not found" \\
        --msgbox "Didn't find ID or manifest.json in $\{GitPath\}" 15 60
    fi
\}

\LA{}webext-rules~{\nwtagstyle{}\subpageref{NW4NcYAq-2o891Q-1}}\RA{}
\nwused{\\{NW4NcYAq-B2EGb-1}}\nwendcode{}\nwbegindocs{54}\nwdocspar

\subsection{\textit{debian/rules} - Ergänzungen für \texttt{Mozilla}-AddOns}
\label{subsec:webextrules}

Bei der \textit{debian/rules}-Datei für die Webextension ist es sinnvoll, 
die zu installierenden Verzeichnisse bzw. Dateien dort aufzuführen und 
einer Variablen zuzuweisen.Dies erfolgt nach dem Muster 
\textit{<Package>\_FILES = <List of files to include>}

Die Liste \textit{<Package>\_FILES} wird vom Plugin-Skript automatisch 
erstellt. Sie ist auf Vollständigkeit und Richtigkeit zu überrpüfen. Die 
auszuschließenden Dateien sind manuell einzupflegen.

Da die Anlage der Datei \textit{debian/rules} einmalig erfolgt, sind beim 
Paketieren neuer Versionen die beiden Listen sorgfältig zu prüfen und 
gegebenenfalls zu anzupassen. 

\nwenddocs{}\nwbegincode{55}\sublabel{NW4NcYAq-2o891Q-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2o891Q-1}}}\moddef{webext-rules~{\nwtagstyle{}\subpageref{NW4NcYAq-2o891Q-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-2j9FLK-1}}\nwenddeflinemarkup
function WebextRules \{
    # Called by DebianRulesTemplate

    # These strings will be added to str4rules

    Package=$(echo $\{SourceName\} | tr "a-z" "A-Z")
    echo -e $\{Package\}"_FILES =  \\\\" >> $\{GitPath\}/debian/rules

    PackageL=$(ls $\{GitPath\})
    PackageA=($\{PackageL\})

    for element in $\{PackageA[*]\}
    do
        if [ "$\{element\}" != "debian" ]
        then
            echo -e $\{element\}" \\\\" >> $\{GitPath\}/debian/rules
        fi
    done
    echo "\\$(NULL)" >> $\{GitPath\}/debian/rules

\LA{}webext-rules5~{\nwtagstyle{}\subpageref{NW4NcYAq-4KbJ5W-1}}\RA{}
\nwused{\\{NW4NcYAq-2j9FLK-1}}\nwendcode{}\nwbegindocs{56}\nwdocspar

\nwenddocs{}\nwbegincode{57}\sublabel{NW4NcYAq-4KbJ5W-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-4KbJ5W-1}}}\moddef{webext-rules5~{\nwtagstyle{}\subpageref{NW4NcYAq-4KbJ5W-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-2o891Q-1}}\nwenddeflinemarkup
    echo -e "\\n Uncomment the following lines \\n"
    echo "if there are files to exclude and add them."
    echo -e "\\n# "$\{Package\}"_FILES_EXCLUDE =  \\\\" \\
    >> $\{GitPath\}/debian/rules
    echo -e "# \\$(NULL)\\n" >> $\{GitPath\}/debian/rules
\}

\LA{}webext-rules-dh~{\nwtagstyle{}\subpageref{NW4NcYAq-3X38Az-1}}\RA{}
\nwused{\\{NW4NcYAq-2o891Q-1}}\nwendcode{}\nwbegindocs{58}\nwdocspar

Die folgenden Zeilen werden vom Programmskript der Variablen 
\textit{str4rulesdh} hinzugefügt.

\nwenddocs{}\nwbegincode{59}\sublabel{NW4NcYAq-3X38Az-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-3X38Az-1}}}\moddef{webext-rules-dh~{\nwtagstyle{}\subpageref{NW4NcYAq-3X38Az-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-4KbJ5W-1}}\nwenddeflinemarkup
function WebextRulesDH \{
    # Called by DebianRulesTemplate

    IdentifyWebextId

    DHCleanStr="override_dh_clean:\\n\\tdh_clean\\n\\trm -rf debian/build\\n"

    DHAutoBuildIndepStr1="override_dh_auto_build-indep:"
    DHAutoBuildIndepStr2="\\tmkdir \\$(CURDIR)/debian/build && \\\\"
    Str3B="\\tzip --recurse-paths "
    DHAutoBuildIndepStr3=$\{Str3B\}"\\$(CURDIR)/debian/build/"$\{webextID\}".xpi \\\\"
    DHAutoBuildIndepStr4="\\t    \\$($\{Package\}_FILES) \\\\"
    DHAutoBuildIndepStr5="# \\t    --exclude \\$($\{Package\}_FILES_EXCLUDE)"
    DHAutoBuildIndepStr6="\\tdh_auto_build\\n"

    echo -e $\{DHCleanStr\} >> $\{GitPath\}/debian/rules
    echo -e $\{DHAutoBuildIndepStr1\} >> $\{GitPath\}/debian/rules
    echo -e $\{DHAutoBuildIndepStr2\} >> $\{GitPath\}/debian/rules
    echo -e $\{DHAutoBuildIndepStr3\} >> $\{GitPath\}/debian/rules
    echo -e "$\{DHAutoBuildIndepStr4\}" >> $\{GitPath\}/debian/rules
    echo -e "$\{DHAutoBuildIndepStr5\}" >> $\{GitPath\}/debian/rules
    echo -e $\{DHAutoBuildIndepStr6\} >> $\{GitPath\}/debian/rules
\}

\LA{}WebextControl~{\nwtagstyle{}\subpageref{NW4NcYAq-3uWAEF-1}}\RA{}
\nwused{\\{NW4NcYAq-4KbJ5W-1}}\nwendcode{}\nwbegindocs{60}\nwdocspar

\subsection{\textit{debian/control} - Ergänzungen für \texttt{Mozilla}-AddOns}
\label{subsec:WebextControl}

\nwenddocs{}\nwbegincode{61}\sublabel{NW4NcYAq-3uWAEF-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-3uWAEF-1}}}\moddef{WebextControl~{\nwtagstyle{}\subpageref{NW4NcYAq-3uWAEF-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-3X38Az-1}}\nwenddeflinemarkup
function WebextControl \{
    # Called by DebianControlTemplate
    # TB specific, for FF 'web'
    sed --in-place \\
    --expression="s/Section: /Section: mail/" $\{GitPath\}/debian/control

    # 'a' means append. The string after the 'a' will be appended 
    # to the sting before the 'a'.
    # @X escapes the space at the beginning of the appended line.
    # It will be removed later.
    sed --in-place \\
    --expression="/Build-Depends: debhelper-compat $\{str4versiondebhelpers\}/ \\
    a @X , zip" \\
    $\{GitPath\}/debian/control
    # TB specific, for FF 'firefox-esr (>= 91.4)'
    sed --in-place \\
    --expression="/Depends: \\$\{misc:Depends\}/ \\
    a @X , thunderbird (>= 1:128.3)" \\
    $\{GitPath\}/debian/control
    sed --in-place --expression="s/^@X//g" $\{GitPath\}/debian/control
\}

\LA{}WebextInstall~{\nwtagstyle{}\subpageref{NW4NcYAq-ntEeG-1}}\RA{}
\nwused{\\{NW4NcYAq-3X38Az-1}}\nwendcode{}\nwbegindocs{62}\nwdocspar

\subsection{\textit{debian/webext-*.install}}
\label{subsec:webext.install}

Für \texttt{Mozilla}-Erweiterungen ist zwingend der folgede Eintrag 
erforderlich:

\begin{verbatim}
 debian/build/<manifest-id>.xpi /usr/share/webext   
\end{verbatim}

\nwenddocs{}\nwbegincode{63}\sublabel{NW4NcYAq-ntEeG-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-ntEeG-1}}}\moddef{WebextInstall~{\nwtagstyle{}\subpageref{NW4NcYAq-ntEeG-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-3uWAEF-1}}\nwenddeflinemarkup
function WebextInstall \{
    # Called by DisplayDebianFiles
    IdentifyWebextId
    InstallStr="debian/build/"$\{webextID\}".xpi\\tusr/share/webext"
    echo -e $\{InstallStr\} >> $\{GitPath\}/debian/$\{PackName\}.install
\}

\LA{}WebextDocs~{\nwtagstyle{}\subpageref{NW4NcYAq-3O5mFU-1}}\RA{}
\nwused{\\{NW4NcYAq-3uWAEF-1}}\nwendcode{}\nwbegindocs{64}\nwdocspar

\subsection{\textit{debian/webext-*.docs}}
\label{subsec:webext.docs}

\nwenddocs{}\nwbegincode{65}\sublabel{NW4NcYAq-3O5mFU-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-3O5mFU-1}}}\moddef{WebextDocs~{\nwtagstyle{}\subpageref{NW4NcYAq-3O5mFU-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-ntEeG-1}}\nwenddeflinemarkup
function WebextDocs \{
    # Called by
    echo "Still empty"
\}

\LA{}WebextLinks~{\nwtagstyle{}\subpageref{NW4NcYAq-3cFE1f-1}}\RA{}
\nwused{\\{NW4NcYAq-ntEeG-1}}\nwendcode{}\nwbegindocs{66}\nwdocspar

\subsection{\textit{debian/webext-links-tb}}
\label{subsec:webext.links-tb}

\scriptsize
\begin{verbatim}
 \#       Source                                           Target     
  /usr/share/webext/<manifest.id>.xpi     /usr/lib/thunderbird/extensions/<manifest.id>.xpi
\end{verbatim}
\normalsize

\nwenddocs{}\nwbegincode{67}\sublabel{NW4NcYAq-3cFE1f-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-3cFE1f-1}}}\moddef{WebextLinks~{\nwtagstyle{}\subpageref{NW4NcYAq-3cFE1f-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-3O5mFU-1}}\nwenddeflinemarkup
function WebextLinksTB \{
    # Called by DisplayDebianFiles
    IdentifyWebextId
    SourceStr="/usr/share/webext/"$\{webextID\}".xpi\\t"
    TargetStr="/usr/lib/thunderbird/extensions/"$\{webextID\}".xpi"
    echo -e $\{SourceStr\}$\{TargetStr\} >> \\
    $\{GitPath\}/debian/$\{PackName\}.links
\}

\LA{}webext-plugin-end~{\nwtagstyle{}\subpageref{NW4NcYAq-44zweJ-1}}\RA{}
\nwused{\\{NW4NcYAq-3O5mFU-1}}\nwendcode{}\nwbegindocs{68}\nwdocspar

\subsection{Meldung: Webext-Plugin geladen}
\label{subsec:WebextPluginLoaded}

Nun kommt der Schluss dieses Webext-Plugins.

\nwenddocs{}\nwbegincode{69}\sublabel{NW4NcYAq-44zweJ-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-44zweJ-1}}}\moddef{webext-plugin-end~{\nwtagstyle{}\subpageref{NW4NcYAq-44zweJ-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-3cFE1f-1}}\nwenddeflinemarkup
whiptail --title "webext plugin found" \\
--msgbox "build-gbp-webext-plugin.sh was loaded." 15 60
# This is the end, my friend
\nwused{\\{NW4NcYAq-3cFE1f-1}}\nwendcode{}\nwbegindocs{70}\nwdocspar

\begin{figure}[!h]
\centering
\includegraphics[width=25em,height=30ex]{Pictures/WebextPluginFound.png} 
\caption{Webext-Plugin wurde geladen}
\end{figure}

\chapter{\texttt{Python}-Plugin}
\label{chap:PythonPlugin}

Das nachstehend dargestellte Plugin erfüllt die besonderen Anforderungen 
beim Bauen von \texttt{Paketen}, die in der Programmiersprache 
\texttt{Python} geschreiben sind. 
(Kapitel~\ref{chap:PythonBauen}, Seite~\pageref{chap:PythonBauen}).

\nwenddocs{}\nwbegincode{71}\sublabel{NW4NcYAq-3NlQ8l-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-3NlQ8l-1}}}\moddef{build-gbp-python-plugin.sh~{\nwtagstyle{}\subpageref{NW4NcYAq-3NlQ8l-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
#!/usr/bin/bash

# Copyright 2020-2025 Mechtilde and Michael Stehmann <mechtilde@debian.org>
# version 0.1.1

# python plugin for build-gbp.sh

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.

\LA{}python-rulesDH~{\nwtagstyle{}\subpageref{NW4NcYAq-2O9mNx-1}}\RA{}
\nwnotused{build-gbp-python-plugin.sh}\nwendcode{}\nwbegindocs{72}\nwdocspar

\subsection{Meldung: Python-Plugin geladen}
\label{subsec:PythonPluginLoaded}

Nun kommt der Schluss dieses Plugin-Plugins. Es gibt bekannt, dass es 
geladen wurde.

\nwenddocs{}\nwbegincode{73}\sublabel{NW4NcYAq-394VUR-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-394VUR-1}}}\moddef{IdentifyPythonId~{\nwtagstyle{}\subpageref{NW4NcYAq-394VUR-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-Zy1bA-1}}\nwenddeflinemarkup
whiptail --title "python plugin found" \\
--msgbox "build-gbp-python-plugin.sh was loaded." 15 60

echo "build-gbp-python-plugin.sh was loaded." >> $\{log\}

\LA{}python-plugin-end~{\nwtagstyle{}\subpageref{NW4NcYAq-33SGli-1}}\RA{}
\nwused{\\{NW4NcYAq-Zy1bA-1}}\nwendcode{}\nwbegindocs{74}\nwdocspar

\begin{figure}[!h]
\centering
\includegraphics[width=25em,height=30ex]{Pictures/PythonPluginFound.png} 
\caption{Python-Plugin geladen}
\end{figure}

\section{Anpassungen für \texttt{Python}-Pakete}
\label{sec:PythonRules}

Hier werden die Besonderheiten für die \texttt{Python}-Paketierung in der 
Datei \textit{debian/rules} abgebildet.

\nwenddocs{}\nwbegincode{75}\sublabel{NW4NcYAq-GUH79-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-GUH79-1}}}\moddef{python-rules~{\nwtagstyle{}\subpageref{NW4NcYAq-GUH79-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-2O9mNx-1}}\nwenddeflinemarkup
function PythonRules \{
    # Called by DebianRulesTemplate

    # These strings will be added to str4rules
    echo -e "export PYBUILD_NAME="$\{SourceName\}"\\n" >> $\{GitPath\}/Debian/rules
    echo -e "export PYBUILD_SYSTEM=distutils\\n" >> $\{GitPath\}/Debian/rules
\}

\LA{}python-control~{\nwtagstyle{}\subpageref{NW4NcYAq-4F4wdF-1}}\RA{}
\nwused{\\{NW4NcYAq-2O9mNx-1}}\nwendcode{}\nwbegindocs{76}\nwdocspar

\nwenddocs{}\nwbegincode{77}\sublabel{NW4NcYAq-2O9mNx-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2O9mNx-1}}}\moddef{python-rulesDH~{\nwtagstyle{}\subpageref{NW4NcYAq-2O9mNx-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-3NlQ8l-1}}\nwenddeflinemarkup
function PythonRulesDH \{
    # Called by DebianRulesTemplate

    sed --in-place \\
    --expression="s/dh $@/dh $@ --with python3 --buildsystem=pybuild/" \\
    $\{GitPath\}/debian/rules

\}
\LA{}python-rules~{\nwtagstyle{}\subpageref{NW4NcYAq-GUH79-1}}\RA{}
\nwused{\\{NW4NcYAq-3NlQ8l-1}}\nwendcode{}\nwbegindocs{78}\nwdocspar

\section{\textit{debian/control} - Ergänzung für \texttt{Python}-Pakete}
\label{sec:PythonControl}

Hier werden die Besonderheiten für die \texttt{Python}-Paketierung in der 
Datei \textit{debian/control} abgebildet.

\nwenddocs{}\nwbegincode{79}\sublabel{NW4NcYAq-4F4wdF-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-4F4wdF-1}}}\moddef{python-control~{\nwtagstyle{}\subpageref{NW4NcYAq-4F4wdF-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-GUH79-1}}\nwenddeflinemarkup
function PythonControl \{
    # Called by DebianControlTemplate

    # Recent Python version
    PythonVersion=$(py3versions --installed)

    sed --in-place \\
    --expression="s/Section:/Section: python/" $\{GitPath\}/debian/control

    sed --in-place \\
    --expression="/Build-Depends: debhelper-compat $\{str4versiondebhelpers\}/ \\
    a , dh-python@X , python3-all@X , python3-setuptools@X\\
    #X-Python3-Version: >=$\{PythonVersion\}" $\{GitPath\}/debian/control

\LA{}python-control1~{\nwtagstyle{}\subpageref{NW4NcYAq-Zy1bA-1}}\RA{}
\nwused{\\{NW4NcYAq-GUH79-1}}\nwendcode{}\nwbegindocs{80}\nwdocspar

Für Tests werden auch die Pakete \textit{python3-distutils} und 
\textit{python3-distutils-extra} als Build-Abhängigkeit benötigt.

\nwenddocs{}\nwbegincode{81}\sublabel{NW4NcYAq-Zy1bA-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-Zy1bA-1}}}\moddef{python-control1~{\nwtagstyle{}\subpageref{NW4NcYAq-Zy1bA-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-4F4wdF-1}}\nwenddeflinemarkup
    
    sed --in-place \\
    --expression="/Depends: \\$\{misc:Depends\}/ \\
    a @X , \\$\{python3:Depends\}" \\
    $\{GitPath\}/debian/control

    sed --in-place --expression="s/@X/\\n/g" $\{GitPath\}/debian/control
\}

\LA{}IdentifyPythonId~{\nwtagstyle{}\subpageref{NW4NcYAq-394VUR-1}}\RA{}
\nwused{\\{NW4NcYAq-4F4wdF-1}}\nwendcode{}\nwbegindocs{82}\nwdocspar

\nwenddocs{}\nwbegincode{83}\sublabel{NW4NcYAq-33SGli-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-33SGli-1}}}\moddef{python-plugin-end~{\nwtagstyle{}\subpageref{NW4NcYAq-33SGli-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-394VUR-1}}\nwenddeflinemarkup

# This is the end, my friend
\nwused{\\{NW4NcYAq-394VUR-1}}\nwendcode{}\nwbegindocs{84}\nwdocspar

\chapter{Skripte}
\section{Anlage eines Projektes im Java-Team}
\label{sec:CreateJavaTeam}

Die Anlage eines Projektes im Java-Team, einschließlich der Erlangung 
eines Zugangstokens\index{Zugangstoken}, welches der Variablen 
\textit{SALSA\_TOKEN} im nachfolgenden Skript zuzuweisen ist, wird in 
Kapitel~\ref{sec:JavaTeam} (Seite~\pageref{sec:JavaTeam}) beschrieben.

\nwenddocs{}\nwbegincode{85}\sublabel{NW4NcYAq-1mpj3x-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-1mpj3x-1}}}\moddef{setup-salsa-repository~{\nwtagstyle{}\subpageref{NW4NcYAq-1mpj3x-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
#!/usr/bin/bash
#
# Setup a new Git repository on Salsa
#
# This script uses the GitLab REST API and requires an access token.
# The token is obtained from the GitLab profile page -> Access Tokens
# (https://salsa.debian.org/profile/personal_access_tokens).
# The token is in the environment variable SALSA_TOKEN
# or has to be sourced from the ~/.salsarc file and assigned
# to the SALSA_TOKEN variable:
#
# This is the Token for jollyday-java
#  SALSA_TOKEN="KyuZRyWTTxfddcGcyphN"
#

set -eu
\LA{}setup-salsa-repository3~{\nwtagstyle{}\subpageref{NW4NcYAq-2DEwqI-1}}\RA{}
\nwnotused{setup-salsa-repository}\nwendcode{}\nwbegindocs{86}\nwdocspar

Das Paket \textit{jq} muss auf der lokalen Maschine installiert werden.

\nwenddocs{}\nwbegincode{87}\sublabel{NW4NcYAq-2DEwqI-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2DEwqI-1}}}\moddef{setup-salsa-repository3~{\nwtagstyle{}\subpageref{NW4NcYAq-2DEwqI-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-1mpj3x-1}}\nwenddeflinemarkup

if ! which jq >/dev/null
then
    echo "You need to apt install jq" >&2
    exit 1
fi

\LA{}setup-salsa-repository5~{\nwtagstyle{}\subpageref{NW4NcYAq-19fbnO-1}}\RA{}
\nwused{\\{NW4NcYAq-1mpj3x-1}}\nwendcode{}\nwbegindocs{88}\nwdocspar

Der Aufruf erfolgt mit der Angabe des \textit{SourceName}.

\nwenddocs{}\nwbegincode{89}\sublabel{NW4NcYAq-19fbnO-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-19fbnO-1}}}\moddef{setup-salsa-repository5~{\nwtagstyle{}\subpageref{NW4NcYAq-19fbnO-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-2DEwqI-1}}\nwenddeflinemarkup
if [ -z "$1" ]; then
    echo "Usage: ./setup-salsa-repository <packagename>"
    exit 1;
fi

check_return_code() \{
    if [ $? -ne 0 ]; then
        echo
        echo "Something went wrong!"
        exit 1
    fi
\}

test -n "$SALSA_TOKEN" || . ~/.salsarc

PACKAGE=$1

SALSA_URL="https://salsa.debian.org/api/v4"
SALSA_GROUP=java-team
SALSA_GROUP_ID=2588

\LA{}setup-salsa-repository8~{\nwtagstyle{}\subpageref{NW4NcYAq-4HgRCU-1}}\RA{}
\nwused{\\{NW4NcYAq-2DEwqI-1}}\nwendcode{}\nwbegindocs{90}\nwdocspar

Nun wird das Repositorium auf \textit{salsa.debian.org} angelegt.

\nwenddocs{}\nwbegincode{91}\sublabel{NW4NcYAq-4HgRCU-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-4HgRCU-1}}}\moddef{setup-salsa-repository8~{\nwtagstyle{}\subpageref{NW4NcYAq-4HgRCU-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-19fbnO-1}}\nwenddeflinemarkup
# ----------------------------------------------------------------------

echo "Creating the $\{PACKAGE\} repository..."

RESPONSE=$(curl -s "$SALSA_URL/projects?private_token=$SALSA_TOKEN" \\
  --data "path=$PACKAGE&namespace_id=\\
  $SALSA_GROUP_ID&visibility=public&issues_enabled=false&snippets_enabled=false&wiki_enable\\
  d=false&jobs_enabled=false&printing_merge_request_link_enabled=false")

echo $RESPONSE | jq --exit-status .id > /dev/null
check_return_code

PROJECT_ID=$(echo $RESPONSE | jq '.id')
\LA{}setup-salsa-repository10~{\nwtagstyle{}\subpageref{NW4NcYAq-2G7LRt-1}}\RA{}
\nwused{\\{NW4NcYAq-19fbnO-1}}\nwendcode{}\nwbegindocs{92}\nwdocspar

Nun wird das ausstehende BTS-Tag-Hook konfiguriert.

\nwenddocs{}\nwbegincode{93}\sublabel{NW4NcYAq-2G7LRt-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2G7LRt-1}}}\moddef{setup-salsa-repository10~{\nwtagstyle{}\subpageref{NW4NcYAq-2G7LRt-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-4HgRCU-1}}\nwenddeflinemarkup
# ----------------------------------------------------------------------

echo "Configuring the BTS tag pending hook..."

TAGPENDING_URL="https://webhook.salsa.debian.org/tagpending/$PACKAGE"
curl --silent --output /dev/null -XPOST --header "PRIVATE-TOKEN: $SALSA_TOKEN" \\
$SALSA_URL/projects/$PROJECT_ID/hooks \\
     --data "url=$TAGPENDING_URL&push_events=1&enable_ssl_verification=1"
check_return_code

# ----------------------------------------------------------------------

echo "Configuring the KGB hook..."

KGB_URL="http://kgb.debian.net:9418/webhook/?channel=debian-java\\
%26network=oftc%26private=1%26use_color=1%26use_irc_notices=1%26squash_threshold=20"
curl --silent --output /dev/null -XPOST --header "PRIVATE-TOKEN: $SALSA_TOKEN" \\
$SALSA_URL/projects/$PROJECT_ID/hooks \\
     --data "url=\\
     $KGB_URL&push_events=yes&issues_events=yes&\\
     merge_requests_events=yes&tag_push_events=\\
     yes&note_events=yes&job_events=yes&pipeline_events=yes&\\
     wiki_events=yes&enable_ssl_verification=yes"
check_return_code

# ----------------------------------------------------------------------

echo "Configuring email notification on push..."

curl --silent --output /dev/null -XPUT --header "PRIVATE-TOKEN: $SALSA_TOKEN" \\
$SALSA_URL/projects/$PROJECT_ID/services/emails-on-push \\
     --data "recipients=pkg-java-commits@lists.alioth.debian.org \\
     dispatch@tracker.debian.org"
check_return_code

# ----------------------------------------------------------------------

echo
echo "Done! The repository is located at $\{SALSA_URL%/api*\}/$SALSA_GROUP/$PACKAGE"
\nwused{\\{NW4NcYAq-4HgRCU-1}}\nwendcode{}\nwbegindocs{94}\nwdocspar

\section{Skript zum Extrahieren der Dokumentation im PDF- und Epub-Format}
\label{sec:CreateBook}

Dieses Skript dient dazu, lesbare Dokumente zu erstellen.

\subsection{Abhängigkeiten}
\label{subsec:BookDependencies}

Folgende Pakete müssen installiert sein, damit das Skript lauffähig ist.

\begin{itemize}
    \item noweb
    \item texlive
    \item texlive-latex-extra
    \item texlive-extra-utils
    \item biber
    \item texlive-lang-japanese (für die Datei ifptex.sty)
    \item tidy (für das EBook)
    \item texlive-lang-german - für die deutschsprachige Dokumentation
    \item texlive-lang-english - für die englische Übersetzung
    \item texlive-lang-french - für die französische Übersetzung
\end{itemize}

\subsection{Ablauf}

Zunächst werden mit dem Skript aus den *.nw-Dokumenten *.tex-Dokumen\-te 
erzeugt.

Das folgende Skript kann mit

\begin{verbatim}
    notangle -Rcreate-book.sh Part6.nw > create-book.sh &&
    t=$(date +%c)
    echo "#generated on $t" >> create-book.sh
    chmod ugo+x create-book.sh
\end{verbatim}

aus der Datei \textit{Part6.nw} extrahiert werden.

\nwenddocs{}\nwbegincode{95}\sublabel{NW4NcYAq-m3SNi-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-m3SNi-1}}}\moddef{create-book.sh~{\nwtagstyle{}\subpageref{NW4NcYAq-m3SNi-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
#!/usr/bin/bash

#set -e

BasePath=$(pwd)

LANGS="en_US"

noweave -index -delay BuildWithGBP.nw > BuildWithGBP.tex # contains preamble
noweave -index -delay Title.nw > GBP-Title.tex
noweave -index -delay Part1.nw > GBP-Part1.tex
noweave -index -delay Part2.nw > GBP-Part2.tex
noweave -index -delay Part3.nw > GBP-Part3.tex
noweave -index -delay Part4.nw > GBP-Part4.tex
noweave -index -delay Part5.nw > GBP-Part5.tex
noweave -index -delay Part6.nw > GBP-Part6.tex

#noweave -filter l2h -index -html BuildWithGBP.nw | htmltoc > BuildWithGBP.html

\LA{}create-book.sh1~{\nwtagstyle{}\subpageref{NW4NcYAq-3Jnovu-1}}\RA{}
\nwnotused{create-book.sh}\nwendcode{}\nwbegindocs{96}\nwdocspar

Diese wird dann zu *.pdf- und *.epub-Dokumente umgewandelt. Das 
Stichwortverzeichnis darf nur einmal erstellt werden und zwar nach der
ersten Ausführung von \textit{pdflatex}. Mehrfache Ausführung erzeugt
zu hohe Seitenzahlen.

\nwenddocs{}\nwbegincode{97}\sublabel{NW4NcYAq-3Jnovu-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-3Jnovu-1}}}\moddef{create-book.sh1~{\nwtagstyle{}\subpageref{NW4NcYAq-3Jnovu-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-m3SNi-1}}\nwenddeflinemarkup
#if [ -f BuildWithGBP.aux ]
#then
   #rm BuildWithGBP.aux
#fi

for ((i=4; i>0; i--))
do
    echo $i
    pdflatex -shell-escape BuildWithGBP.tex

    # Create Index only one time
    # Otherwise you get wrong page numbers
    if [ i=4 ]
    then
        makeindex BuildWithGBP
    fi

    # Create Bibliography
    biber BuildWithGBP
done

\LA{}create-book.sh5~{\nwtagstyle{}\subpageref{NW4NcYAq-2UQQOE-1}}\RA{}
\nwused{\\{NW4NcYAq-m3SNi-1}}\nwendcode{}\nwbegindocs{98}\nwdocspar

Das EPUB-Format ist ein gezipptes XHTML, angereichtert mit Metadaten.

\nwenddocs{}\nwbegincode{99}\sublabel{NW4NcYAq-2UQQOE-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2UQQOE-1}}}\moddef{create-book.sh5~{\nwtagstyle{}\subpageref{NW4NcYAq-2UQQOE-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-3Jnovu-1}}\nwenddeflinemarkup
# tex4ebook -f mobi BuildWithGBP.tex
# tex4ebook -f epub BuildWithGBP.tex ../

if ls | grep --quiet '\\.html'
then
    rm *.html
fi

\LA{}create-book.sh6~{\nwtagstyle{}\subpageref{NW4NcYAq-8WbX4-1}}\RA{}
\nwused{\\{NW4NcYAq-3Jnovu-1}}\nwendcode{}\nwbegindocs{100}\nwdocspar

\nwenddocs{}\nwbegincode{101}\sublabel{NW4NcYAq-8WbX4-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-8WbX4-1}}}\moddef{create-book.sh6~{\nwtagstyle{}\subpageref{NW4NcYAq-8WbX4-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-2UQQOE-1}}\nwenddeflinemarkup

# For the first translation

for lang in $\{LANGS\}
do
    cd translation/$\{lang\}/target

    #sed --in-place --expression 's/^%+-.*//' GBP-Part3.tex
    sed --in-place --expression ':a;N;$!ba;s/_ \\n\\n%/_%/' GBP-Part3.tex

\LA{}create-book.sh7~{\nwtagstyle{}\subpageref{NW4NcYAq-4RLXni-1}}\RA{}
\nwused{\\{NW4NcYAq-2UQQOE-1}}\nwendcode{}\nwbegindocs{102}\nwdocspar

Mit dem regülären Ausdruck werden folgende Anpassungen in der Datei
\textit{GBP-Part3.tex} vorgenommen.


% Es ist zu prüfen, wie VOR einer einmal oder mehrfach vorkommende Gruppe
% von Leerzeichen ein einfacher, gegebenenfalls weicher Zeilenumruch
% eingefügt werden kann.

% Es ist auch zu prüfen, wie dies in die Segmentierungsregen eingefügt
% werden kann

% vielleicht kann ja auch ein Script darüber laufen, dass für die
% Code-Chunks ein Absatzende Zeichen einfügt, damit \textit{OmegaT} dies 
% selber korekt setzen kann.

Das \textit{\$-Zeichen} steht für das Zeilenende.

\nwenddocs{}\nwbegincode{103}\sublabel{NW4NcYAq-4RLXni-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-4RLXni-1}}}\moddef{create-book.sh7~{\nwtagstyle{}\subpageref{NW4NcYAq-4RLXni-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-8WbX4-1}}\nwenddeflinemarkup

    if [ -f BuildWithGBP.aux ]
    then
        rm BuildWithGBP.aux
    fi

    for ((i=4; i>0; i--))
    do
        pdflatex -shell-escape ./BuildWithGBP.tex
        if [ i=4 ]
        then
            makeindex BuildWithGBP
        fi

        # Create Bibliography
        biber BuildWithGBP
    done
    cd $\{BasePath\}
done

# Remove auxillary *.html files which are needed for epub
#if ls | grep --quiet '\\.html'
#then
#    rm *.html
#fi

\nwused{\\{NW4NcYAq-8WbX4-1}}\nwendcode{}\nwbegindocs{104}\nwdocspar

\section{Skript zum Extrahieren der Skripte}
\label{sec:CreateBuildscript}

Das folgende Skript kann mit

\begin{verbatim}
    notangle -Rcreate-buildscript.sh Part6.nw > create-buildscript.sh &&
    t=$(date +%c)
    echo "#generated on $t" >> create-buildscript.sh
    chmod ugo+x create-buildscript.sh
\end{verbatim}

aus der Datei \textit{Part6.nw} extrahiert werden.

\nwenddocs{}\nwbegincode{105}\sublabel{NW4NcYAq-wYoEi-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-wYoEi-1}}}\moddef{build-script~{\nwtagstyle{}\subpageref{NW4NcYAq-wYoEi-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
#!/bin/bash

set -e

scripts="
  build-gbp.sh
  build-gbp-java-plugin.sh
  build-gbp-maven-plugin.sh
  build-gbp-webext-plugin.sh
  build-gbp-python-plugin.sh
"
cat Title.nw Part1.nw Part2.nw Part3.nw Part4.nw Part5.nw Part6.nw > BuildWithGBPg.nw  
notangle -Rbuild-gbp.sh BuildWithGBPg.nw > build-gbp.sh &&
#t=$(date +%c)
# For building reproducible
t=$(date --utc --date="@$\{SOURCE_DATE_EPOCH:-$(date +%s)\}" -R)

function build_script()
\{
  notangle -R"$script" BuildWithGBPg.nw > "$script"
  sed --in-place \\
  --expression='s/This is the end, my friend[[:cntrl:]]*/This is the end, my friend/' \\
  "$1"
  echo "#generated on $t" >> "$1"
  chmod ugo+x "$1"
  bash -n "$1"
\}

for script in $scripts; do
   build_script "$script"
done

# Remove auxillary file BuildWithGBPg.nw
rm BuildWithGBPg.nw

\nwnotused{build-script}\nwendcode{}\nwbegindocs{106}\nwdocspar

Mittels des Befehls \textit{noweave}\index{noweave} werden die 
deutschsprachigen \textit{*.nw}-Dateien in 
\textit{*.tex}-Dateien\index{\TeX{}-Dateien} umgewandelt. 

\nwenddocs{}\nwbegincode{107}\sublabel{NW4NcYAq-XCxZd-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-XCxZd-1}}}\moddef{CreateTexFromNW~{\nwtagstyle{}\subpageref{NW4NcYAq-XCxZd-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
function CreateTexFromNW \{
    # Called by TaskSelect
    # Create *.tex files from *.nw files

    cd $\{SRCDIR\}

    noweave -index -delay BuildWithGBP.nw > BuildWithGBP.tex # contains preamble
    noweave -index -delay Title.nw > GBP-Title.tex
    noweave -index -delay Part1.nw > GBP-Part1.tex
    noweave -index -delay Part2.nw > GBP-Part2.tex
    noweave -index -delay Part3.nw > GBP-Part3.tex
    noweave -index -delay Part4.nw > GBP-Part4.tex
    noweave -index -delay Part5.nw > GBP-Part5.tex
    noweave -index -delay Part6.nw > GBP-Part6.tex
\LA{}CreateTexFromNW1~{\nwtagstyle{}\subpageref{NW4NcYAq-erToq-1}}\RA{}
\nwnotused{CreateTexFromNW}\nwendcode{}\nwbegindocs{108}\nwdocspar

Eine eventuell vorhandene Datei \textit{BuildWithGBP\_html.tex} wird 
entfernt.

\nwenddocs{}\nwbegincode{109}\sublabel{NW4NcYAq-erToq-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-erToq-1}}}\moddef{CreateTexFromNW1~{\nwtagstyle{}\subpageref{NW4NcYAq-erToq-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW4NcYAq-XCxZd-1}}\nwenddeflinemarkup

    if [ -f BuildWithGBP_html.tex ]
    then
        rm BuildWithGBP_html.tex
    fi
\}
\nwused{\\{NW4NcYAq-XCxZd-1}}\nwendcode{}\nwbegindocs{110}\nwdocspar

\section{\textit{gitlab-ci.yml} für die Salsa-CI}
\label{sec:gitlab-ci.yml}

\nwenddocs{}\nwbegincode{111}\sublabel{NW4NcYAq-2VvVJL-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW4NcYAq-2VvVJL-1}}}\moddef{gitlab-ci.yml~{\nwtagstyle{}\subpageref{NW4NcYAq-2VvVJL-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
variables:
  DEPS: file make texlive noweb texlive-bibtex-extra texlive-lang-german
        texlive-lang-japanese texlive-latex-extra texlive-binaries
        texlive-extra-utils biber tidy texlive-lang-english

stages:
  - build
  - deploy

build:
  stage: build
  image: debian:sid
  before_script:
    - apt -y update
    - apt -y install $DEPS
  script:
    - make
  artifacts:
    paths:
      - '*.pdf'
      - '*.epub'
      - 'build-gbp-python-plugin.sh'
      - 'build-gbp-maven-plugin.sh'
      - 'build-gbp-webext-plugin.sh'
      - 'build-gbp.sh'
      - 'build-gbp-java-plugin.sh'
      - 'translation/en_US/target/*.pdf'

pages:
  stage: deploy
  image: debian:sid
  needs:
    - build
  script:
    - mkdir -p public/de
    - mkdir -p public/en_US
    - cp *.pdf *.epub build-gbp*.sh public/
    - cp *.tex public/de/
    - cp translation/en_US/target/*.pdf public/en_US/

  artifacts:
    paths:
      - public
  only:
    - master
\nwnotused{gitlab-ci.yml}\nwendcode{}

\nwixlogsorted{c}{{AskChrootPath}{NW4NcYAq-2yU147-1}{\nwixd{NW4NcYAq-2yU147-1}\nwixu{NW4NcYAq-TDih7-1}}}%
\nwixlogsorted{c}{{AskChrootPath1}{NW4NcYAq-2HDZQq-1}{\nwixu{NW4NcYAq-2yU147-1}\nwixd{NW4NcYAq-2HDZQq-1}}}%
\nwixlogsorted{c}{{AskWorkspacePath}{NW4NcYAq-32GbAG-1}{\nwixu{NW4NcYAq-2HDZQq-1}\nwixd{NW4NcYAq-32GbAG-1}}}%
\nwixlogsorted{c}{{AskWorkspacePath2}{NW4NcYAq-2JSWnR-1}{\nwixu{NW4NcYAq-32GbAG-1}\nwixd{NW4NcYAq-2JSWnR-1}}}%
\nwixlogsorted{c}{{build-gbp-java-plugin}{NW4NcYAq-2UVuFb-1}{\nwixu{NW4NcYAq-15sQn8-1}\nwixd{NW4NcYAq-2UVuFb-1}}}%
\nwixlogsorted{c}{{build-gbp-java-plugin.sh}{NW4NcYAq-1Vt6yy-1}{\nwixd{NW4NcYAq-1Vt6yy-1}}}%
\nwixlogsorted{c}{{build-gbp-maven-plugin.sh}{NW4NcYAq-3bFwd5-1}{\nwixd{NW4NcYAq-3bFwd5-1}}}%
\nwixlogsorted{c}{{build-gbp-python-plugin.sh}{NW4NcYAq-3NlQ8l-1}{\nwixd{NW4NcYAq-3NlQ8l-1}}}%
\nwixlogsorted{c}{{build-gbp-webext-plugin.sh}{NW4NcYAq-B2EGb-1}{\nwixd{NW4NcYAq-B2EGb-1}}}%
\nwixlogsorted{c}{{build-script}{NW4NcYAq-wYoEi-1}{\nwixd{NW4NcYAq-wYoEi-1}}}%
\nwixlogsorted{c}{{create-book.sh}{NW4NcYAq-m3SNi-1}{\nwixd{NW4NcYAq-m3SNi-1}}}%
\nwixlogsorted{c}{{create-book.sh1}{NW4NcYAq-3Jnovu-1}{\nwixu{NW4NcYAq-m3SNi-1}\nwixd{NW4NcYAq-3Jnovu-1}}}%
\nwixlogsorted{c}{{create-book.sh5}{NW4NcYAq-2UQQOE-1}{\nwixu{NW4NcYAq-3Jnovu-1}\nwixd{NW4NcYAq-2UQQOE-1}}}%
\nwixlogsorted{c}{{create-book.sh6}{NW4NcYAq-8WbX4-1}{\nwixu{NW4NcYAq-2UQQOE-1}\nwixd{NW4NcYAq-8WbX4-1}}}%
\nwixlogsorted{c}{{create-book.sh7}{NW4NcYAq-4RLXni-1}{\nwixu{NW4NcYAq-8WbX4-1}\nwixd{NW4NcYAq-4RLXni-1}}}%
\nwixlogsorted{c}{{CreateTexFromNW}{NW4NcYAq-XCxZd-1}{\nwixd{NW4NcYAq-XCxZd-1}}}%
\nwixlogsorted{c}{{CreateTexFromNW1}{NW4NcYAq-erToq-1}{\nwixu{NW4NcYAq-XCxZd-1}\nwixd{NW4NcYAq-erToq-1}}}%
\nwixlogsorted{c}{{gitlab-ci.yml}{NW4NcYAq-2VvVJL-1}{\nwixd{NW4NcYAq-2VvVJL-1}}}%
\nwixlogsorted{c}{{IdentifyMavenChrootPath}{NW4NcYAq-3UsGlp-1}{\nwixd{NW4NcYAq-3UsGlp-1}\nwixu{NW4NcYAq-2JSWnR-1}}}%
\nwixlogsorted{c}{{IdentifyMavenChrootPath1}{NW4NcYAq-wD95N-1}{\nwixu{NW4NcYAq-3UsGlp-1}\nwixd{NW4NcYAq-wD95N-1}}}%
\nwixlogsorted{c}{{IdentifyMavenChrootPath2}{NW4NcYAq-3SKWcr-1}{\nwixu{NW4NcYAq-wD95N-1}\nwixd{NW4NcYAq-3SKWcr-1}}}%
\nwixlogsorted{c}{{IdentifyMavenChrootPath3}{NW4NcYAq-1Ll2nB-1}{\nwixu{NW4NcYAq-3SKWcr-1}\nwixd{NW4NcYAq-1Ll2nB-1}}}%
\nwixlogsorted{c}{{IdentifyMavenChrootPath4}{NW4NcYAq-4b0e0v-1}{\nwixu{NW4NcYAq-1Ll2nB-1}\nwixd{NW4NcYAq-4b0e0v-1}}}%
\nwixlogsorted{c}{{IdentifyMavenChrootPath5}{NW4NcYAq-Fuuhl-1}{\nwixu{NW4NcYAq-4b0e0v-1}\nwixd{NW4NcYAq-Fuuhl-1}}}%
\nwixlogsorted{c}{{IdentifyMavenChrootPath7}{NW4NcYAq-28IS2D-1}{\nwixu{NW4NcYAq-Fuuhl-1}\nwixd{NW4NcYAq-28IS2D-1}}}%
\nwixlogsorted{c}{{IdentifyPythonId}{NW4NcYAq-394VUR-1}{\nwixd{NW4NcYAq-394VUR-1}\nwixu{NW4NcYAq-Zy1bA-1}}}%
\nwixlogsorted{c}{{IdentifyWebextId}{NW4NcYAq-2j9FLK-1}{\nwixu{NW4NcYAq-B2EGb-1}\nwixd{NW4NcYAq-2j9FLK-1}}}%
\nwixlogsorted{c}{{MakeMaven}{NW4NcYAq-ZOhlV-1}{\nwixd{NW4NcYAq-ZOhlV-1}\nwixu{NW4NcYAq-28IS2D-1}}}%
\nwixlogsorted{c}{{MakeMaven1}{NW4NcYAq-gqeVW-1}{\nwixu{NW4NcYAq-ZOhlV-1}\nwixd{NW4NcYAq-gqeVW-1}}}%
\nwixlogsorted{c}{{MakeMaven5}{NW4NcYAq-SN6sE-1}{\nwixu{NW4NcYAq-gqeVW-1}\nwixd{NW4NcYAq-SN6sE-1}}}%
\nwixlogsorted{c}{{maven-ignoreRules.header}{NW4NcYAq-1pIKSs-1}{\nwixd{NW4NcYAq-1pIKSs-1}}}%
\nwixlogsorted{c}{{maven-rules.header}{NW4NcYAq-1qUWrs-1}{\nwixd{NW4NcYAq-1qUWrs-1}}}%
\nwixlogsorted{c}{{maven.properties}{NW4NcYAq-2BLUST-1}{\nwixd{NW4NcYAq-2BLUST-1}}}%
\nwixlogsorted{c}{{MavenPlugin}{NW4NcYAq-47i6FT-1}{\nwixd{NW4NcYAq-47i6FT-1}\nwixu{NW4NcYAq-SN6sE-1}}}%
\nwixlogsorted{c}{{python-control}{NW4NcYAq-4F4wdF-1}{\nwixu{NW4NcYAq-GUH79-1}\nwixd{NW4NcYAq-4F4wdF-1}}}%
\nwixlogsorted{c}{{python-control1}{NW4NcYAq-Zy1bA-1}{\nwixu{NW4NcYAq-4F4wdF-1}\nwixd{NW4NcYAq-Zy1bA-1}}}%
\nwixlogsorted{c}{{python-plugin-end}{NW4NcYAq-33SGli-1}{\nwixu{NW4NcYAq-394VUR-1}\nwixd{NW4NcYAq-33SGli-1}}}%
\nwixlogsorted{c}{{python-rules}{NW4NcYAq-GUH79-1}{\nwixd{NW4NcYAq-GUH79-1}\nwixu{NW4NcYAq-2O9mNx-1}}}%
\nwixlogsorted{c}{{python-rulesDH}{NW4NcYAq-2O9mNx-1}{\nwixu{NW4NcYAq-3NlQ8l-1}\nwixd{NW4NcYAq-2O9mNx-1}}}%
\nwixlogsorted{c}{{Rules4Java}{NW4NcYAq-15sQn8-1}{\nwixu{NW4NcYAq-1Vt6yy-1}\nwixd{NW4NcYAq-15sQn8-1}}}%
\nwixlogsorted{c}{{Rules4MavenDH}{NW4NcYAq-1X9Cb6-1}{\nwixu{NW4NcYAq-3bFwd5-1}\nwixd{NW4NcYAq-1X9Cb6-1}}}%
\nwixlogsorted{c}{{setup-salsa-repository}{NW4NcYAq-1mpj3x-1}{\nwixd{NW4NcYAq-1mpj3x-1}}}%
\nwixlogsorted{c}{{setup-salsa-repository10}{NW4NcYAq-2G7LRt-1}{\nwixu{NW4NcYAq-4HgRCU-1}\nwixd{NW4NcYAq-2G7LRt-1}}}%
\nwixlogsorted{c}{{setup-salsa-repository3}{NW4NcYAq-2DEwqI-1}{\nwixu{NW4NcYAq-1mpj3x-1}\nwixd{NW4NcYAq-2DEwqI-1}}}%
\nwixlogsorted{c}{{setup-salsa-repository5}{NW4NcYAq-19fbnO-1}{\nwixu{NW4NcYAq-2DEwqI-1}\nwixd{NW4NcYAq-19fbnO-1}}}%
\nwixlogsorted{c}{{setup-salsa-repository8}{NW4NcYAq-4HgRCU-1}{\nwixu{NW4NcYAq-19fbnO-1}\nwixd{NW4NcYAq-4HgRCU-1}}}%
\nwixlogsorted{c}{{ShowMaven}{NW4NcYAq-3IwFze-1}{\nwixd{NW4NcYAq-3IwFze-1}\nwixu{NW4NcYAq-1X9Cb6-1}}}%
\nwixlogsorted{c}{{ShowMaven2}{NW4NcYAq-TDih7-1}{\nwixu{NW4NcYAq-3IwFze-1}\nwixd{NW4NcYAq-TDih7-1}}}%
\nwixlogsorted{c}{{webext-plugin-end}{NW4NcYAq-44zweJ-1}{\nwixu{NW4NcYAq-3cFE1f-1}\nwixd{NW4NcYAq-44zweJ-1}}}%
\nwixlogsorted{c}{{webext-rules}{NW4NcYAq-2o891Q-1}{\nwixu{NW4NcYAq-2j9FLK-1}\nwixd{NW4NcYAq-2o891Q-1}}}%
\nwixlogsorted{c}{{webext-rules-dh}{NW4NcYAq-3X38Az-1}{\nwixu{NW4NcYAq-4KbJ5W-1}\nwixd{NW4NcYAq-3X38Az-1}}}%
\nwixlogsorted{c}{{webext-rules5}{NW4NcYAq-4KbJ5W-1}{\nwixu{NW4NcYAq-2o891Q-1}\nwixd{NW4NcYAq-4KbJ5W-1}}}%
\nwixlogsorted{c}{{WebextControl}{NW4NcYAq-3uWAEF-1}{\nwixu{NW4NcYAq-3X38Az-1}\nwixd{NW4NcYAq-3uWAEF-1}}}%
\nwixlogsorted{c}{{WebextDocs}{NW4NcYAq-3O5mFU-1}{\nwixu{NW4NcYAq-ntEeG-1}\nwixd{NW4NcYAq-3O5mFU-1}}}%
\nwixlogsorted{c}{{WebextInstall}{NW4NcYAq-ntEeG-1}{\nwixu{NW4NcYAq-3uWAEF-1}\nwixd{NW4NcYAq-ntEeG-1}}}%
\nwixlogsorted{c}{{WebextLinks}{NW4NcYAq-3cFE1f-1}{\nwixu{NW4NcYAq-3O5mFU-1}\nwixd{NW4NcYAq-3cFE1f-1}}}%
\nwbegindocs{112}\nwdocspar
\nwenddocs{}
