diff --git a/.cirrus.yml b/.cirrus.yml index 7581783ea6..2becfec057 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -4,7 +4,6 @@ env: components/compiler-families/intel-compilers-devel/SPECS/intel-compilers-devel.spec components/mpi-families/impi-devel/SPECS/intel-mpi.spec components/parallel-libs/trilinos/SPECS/trilinos.spec - components/admin/docs/SPECS/docs.spec task: name: RHEL/Rocky on aarch64 diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index fc35ce3382..73d0d7082c 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -12,7 +12,6 @@ env: SKIP_CI_SPECS: | components/fs/lustre-client/SPECS/lustre.spec components/parallel-libs/trilinos/SPECS/trilinos.spec - components/admin/docs/SPECS/docs.spec jobs: check_spec: diff --git a/components/admin/docs/SPECS/docs.spec b/components/admin/docs/SPECS/docs.spec index 4b356320f5..b14276abdb 100644 --- a/components/admin/docs/SPECS/docs.spec +++ b/components/admin/docs/SPECS/docs.spec @@ -32,6 +32,7 @@ BuildRequires: texlive-tcolorbox BuildRequires: texlive-environ BuildRequires: texlive-trimspaces BuildRequires: texlive-amsmath +BuildRequires: texlive-xetex %if 0%{?suse_version} BuildRequires: libstdc++6 @@ -39,6 +40,7 @@ BuildRequires: texlive-latexmk BuildRequires: texlive-epstopdf-pkg BuildRequires: texlive-listings BuildRequires: texlive-geometry +BuildRequires: texlive-ctex %endif %if 0%{?rhel} || 0%{?openEuler} @@ -63,6 +65,9 @@ BuildRequires: tex BuildRequires: texlive-pdftex BuildRequires: texlive-epstopdf BuildRequires: texlive-collection-basic +BuildRequires: texlive-ctex +BuildRequires: texlive-xecjk +BuildRequires: texlive-fandol %endif %description @@ -155,7 +160,13 @@ make ; %{parser} steps.tex > recipe.sh ; popd pushd docs/recipes/install/openeuler22.03/aarch64/warewulf/slurm make ; %{parser} steps.tex > recipe.sh ; popd -pushd docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs +pushd docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english +%define parser ../../../../../parse_doc.pl +make ; %{parser} steps.tex > recipe.sh ; +popd + +pushd docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified +%define parser ../../../../../parse_doc.pl make ; %{parser} steps.tex > recipe.sh ; popd %install @@ -248,8 +259,10 @@ install -m 0644 -p -D docs/recipes/install/%{lpath}/steps.pdf %{buildroot}/%{OHP install -m 0755 -p -D docs/recipes/install/%{lpath}/recipe.sh %{buildroot}/%{OHPC_PUB}/doc/recipes/%{lpath}/recipe.sh %define lpath openeuler22.03/aarch64/warewulf/openpbs -install -m 0644 -p -D docs/recipes/install/%{lpath}/steps.pdf %{buildroot}/%{OHPC_PUB}/doc/recipes/%{lpath}/Install_guide.pdf -install -m 0755 -p -D docs/recipes/install/%{lpath}/recipe.sh %{buildroot}/%{OHPC_PUB}/doc/recipes/%{lpath}/recipe.sh +install -m 0644 -p -D docs/recipes/install/%{lpath}/english/steps.pdf %{buildroot}/%{OHPC_PUB}/doc/recipes/%{lpath}/english/Install_guide.pdf +install -m 0755 -p -D docs/recipes/install/%{lpath}/english/recipe.sh %{buildroot}/%{OHPC_PUB}/doc/recipes/%{lpath}/english/recipe.sh +install -m 0644 -p -D docs/recipes/install/%{lpath}/chinese-simplified/steps.pdf %{buildroot}/%{OHPC_PUB}/doc/recipes/%{lpath}/chinese-simplified/Install_guide.pdf +install -m 0755 -p -D docs/recipes/install/%{lpath}/chinese-simplified/recipe.sh %{buildroot}/%{OHPC_PUB}/doc/recipes/%{lpath}/chinese-simplified/recipe.sh # input file templates #install -m 0644 -p docs/recipes/install/centos8/input.local.template %{buildroot}/%{OHPC_PUB}/doc/recipes/centos8/input.local diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/Makefile b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/Makefile deleted file mode 120000 index fe2bef7738..0000000000 --- a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/Makefile +++ /dev/null @@ -1 +0,0 @@ -../slurm/Makefile \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/Makefile b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/Makefile new file mode 120000 index 0000000000..6883fcccba --- /dev/null +++ b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/Makefile @@ -0,0 +1 @@ +../../slurm/Makefile \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/common b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/common new file mode 120000 index 0000000000..7d820d8195 --- /dev/null +++ b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/common @@ -0,0 +1 @@ +../../../../../common \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/manifest b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/manifest new file mode 120000 index 0000000000..1a03fa87bd --- /dev/null +++ b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/manifest @@ -0,0 +1 @@ +../../slurm/manifest \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/manifest.tex b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/manifest.tex new file mode 120000 index 0000000000..dbcf21012c --- /dev/null +++ b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/manifest.tex @@ -0,0 +1 @@ +../../slurm/manifest.tex \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/steps.tex b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/steps.tex new file mode 100644 index 0000000000..c423a35e3b --- /dev/null +++ b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/steps.tex @@ -0,0 +1,290 @@ +\documentclass[letterpaper]{article} +\usepackage[UTF8]{ctex} +\usepackage{common/ohpc-doc} +\setcounter{secnumdepth}{5} +\setcounter{tocdepth}{5} + +% Include git variables +\input{vc.tex} + +% Define Base OS and other local macros +\newcommand{\baseOS}{openEuler 22.03} +\newcommand{\OSRepo}{openEuler\_22.03} +\newcommand{\OSTree}{openEuler\_22.03} +\newcommand{\OSTag}{oe2203} +\newcommand{\baseos}{openeuler22.03} +\newcommand{\baseosshort}{openeuler22.03} +\newcommand{\provisioner}{Warewulf} +\newcommand{\provheader}{\provisioner{}} +\newcommand{\rms}{OpenPBS} +\newcommand{\rmsshort}{OpenPBS} +\newcommand{\arch}{aarch64} + +% Define package manager commands +\newcommand{\pkgmgr}{yum} +\newcommand{\addrepo}{wget -P /etc/yum.repos.d} +\newcommand{\chrootaddrepo}{wget -P \$CHROOT/etc/yum.repos.d} +\newcommand{\clean}{yum clean expire-cache} +\newcommand{\chrootclean}{yum --installroot=\$CHROOT clean expire-cache} +\newcommand{\install}{yum -y install} +\newcommand{\chrootinstall}{yum -y --installroot=\$CHROOT install} +\newcommand{\groupinstall}{yum -y groupinstall} +\newcommand{\groupchrootinstall}{yum -y --installroot=\$CHROOT groupinstall} +\newcommand{\remove}{yum -y remove} +\newcommand{\upgrade}{yum -y upgrade} +\newcommand{\chrootupgrade}{yum -y --installroot=\$CHROOT upgrade} +\newcommand{\tftppkg}{syslinux-tftpboot} + +% boolean for os-specific formatting +\toggletrue{isaarch} +\toggletrue{isCentOS} +\toggletrue{isCentOS_ww_pbs_aarch} +\toggletrue{ispbs} +\toggletrue{isWarewulf} + +\begin{document} + +简体中文,简体中文;简体中文。 + +繁體中文,繁體中文;繁體中文。 + +\graphicspath{{common/figures/}} +\thispagestyle{empty} + +% Title Page -------------------------------------------------------- +\input{common/title} +% Disclaimer +\input{common/legal} + +\newpage +\tableofcontents +\newpage + +% Introduction ---------------------------------------------------- + + +\section{Introduction} \label{sec:introduction} +\input{common/install_header} +\input{common/intro} \\ + +\input{common/base_edition/edition} +\input{common/audience} +\input{common/requirements} +\input{common/inputs} + +% begin_ohpc_run +% ohpc_validation_newline +% ohpc_validation_comment Verify OpenHPC repository has been enabled before proceeding +% ohpc_validation_newline +% ohpc_command yum repolist | grep -q OpenHPC +% ohpc_command if [ $? -ne 0 ];then +% ohpc_command echo "Error: OpenHPC repository must be enabled locally" +% ohpc_command exit 1 +% ohpc_command fi +% end_ohpc_run + +% Base Operating System -------------------------------------------- + +\section{Install Base Operating System (BOS)} +\input{common/bos} + +% begin_ohpc_run +% ohpc_validation_newline +% ohpc_validation_comment Disable firewall +\begin{lstlisting}[language=bash,keywords={}] +[sms](*\#*) systemctl disable firewalld +[sms](*\#*) systemctl stop firewalld +\end{lstlisting} +% end_ohpc_run + +% ------------------------------------------------------------------ + +\section{Install \OHPC{} Components} \label{sec:basic_install} +\input{common/install_ohpc_components_intro.tex} + +\subsection{Enable \OHPC{} repository for local use} \label{sec:enable_repo} +\input{common/enable_ohpc_repo} +\input{common/openeuler_repos} +\input{common/automation} + +\subsection{Add provisioning services on {\em master} node} \label{sec:add_provisioning} +\input{common/install_provisioning_intro} +\input{common/enable_pxe} +\input{common/time} + +\subsection{Add resource management services on {\em master} node} \label{sec:add_rm} +\input{common/install_openpbs} + +%% Add if/when IB is available for testing +%% \subsection{Optionally add \InfiniBand{} support services on {\em master} node} \label{sec:add_ofed} +%% \input{common/ibsupport_sms_centos} + +%\vspace*{-0.15cm} +\subsection{Complete basic Warewulf setup for {\em master} node} \label{sec:setup_ww} +\input{common/warewulf_setup} +\input{common/warewulf_setup_centos} + +\subsection{Define {\em compute} image for provisioning} +\input{common/warewulf_mkchroot_openeuler} + +\subsubsection{Add \OHPC{} components} \label{sec:add_components} +\input{common/add_to_compute_chroot_intro} + +% begin_ohpc_run +% ohpc_validation_comment Add OpenHPC components to compute instance +\begin{lstlisting}[language=bash,literate={-}{-}1,keywords={},upquote=true] +# Add OpenPBS client support +[sms](*\#*) (*\chrootinstall*) openpbs-execution-ohpc +[sms](*\#*) perl -pi -e "s/PBS_SERVER=\S+/PBS_SERVER=${sms_name}/" $CHROOT/etc/pbs.conf +[sms](*\#*) echo "PBS_LEAF_NAME=${sms_name}" >> /etc/pbs.conf +[sms](*\#*) chroot $CHROOT opt/pbs/libexec/pbs_habitat +[sms](*\#*) perl -pi -e "s/\$clienthost \S+/\$clienthost ${sms_name}/" $CHROOT/var/spool/pbs/mom_priv/config +[sms](*\#*) echo "\$usecp *:/home /home" >> $CHROOT/var/spool/pbs/mom_priv/config +[sms](*\#*) chroot $CHROOT systemctl enable pbs + +# Add Network Time Protocol (NTP) support +[sms](*\#*) (*\chrootinstall*) chrony +[sms](*\#*) echo "server ${sms_ip} iburst" >> $CHROOT/etc/chrony.conf + +# Add kernel drivers (matching kernel version on SMS node) +[sms](*\#*) (*\chrootinstall*) kernel-`uname -r` + +# Include modules user environment +[sms](*\#*) (*\chrootinstall*) lmod-ohpc +\end{lstlisting} +% end_ohpc_run + +\subsubsection{Customize system configuration} \label{sec:master_customization} +\input{common/warewulf_chroot_customize_centos} +\input{common/restart_nfs} + +%\clearpage +\subsubsection{Additional Customization ({\em optional})} \label{sec:addl_customizations} +\input{common/compute_customizations_intro} + +%% Add if/when IB is available for testing +%% \paragraph{Increase locked memory limits} +%% \input{common/memlimits} + +%%\paragraph{Add \Lustre{} client} \label{sec:lustre_client} +%%\input{common/lustre-client} +%%\input{common/lustre-client-centos} +%%\vspace*{0.5cm} +%%\input{common/lustre-client-post} + +%\clearpage +\vspace*{-.2cm} +\paragraph{Enable forwarding of system logs} \label{sec:add_syslog} +\input{common/syslog} + +%\vspace*{-.2cm} +\clearpage +\paragraph{Add \Nagios{} monitoring} \label{sec:add_nagios} +\input{common/nagios} + +\clearpage +%\vspace*{-0.32cm} +\paragraph{Add \clustershell{}} +\input{common/clustershell} + +%\clearpage +%\paragraph{Add \mrsh{}} +%\input{common/mrsh} + +\paragraph{Add \genders{}} +\input{common/genders} + +\vspace*{-.1cm} +\paragraph{Add Magpie} +\input{common/magpie} + +\vspace*{-.1cm} +\paragraph{Add \conman{}} \label{sec:add_conman} +\input{common/conman} + +\vspace*{-.1cm} +\paragraph{Add \nhc{}} \label{sec:add_nhc} +\input{common/nhc} + +\subsubsection{Import files} \label{sec:file_import} +\input{common/import_ww_files} +%% \input{common/import_ww_files_ib_centos} +\input{common/finalize_provisioning} +\vspace*{0.2cm} +\input{common/add_ww_hosts_intro} +\input{common/add_ww_hosts_pbs} +\input{common/add_ww_hosts_finalize} + +\vspace*{-0.2cm} +\subsubsection{Optional kernel arguments} \label{sec:optional_kargs} +\input{common/conman_post} +\input{common/kargs_post} + +\vspace*{-0.2cm} +\subsubsection{Optionally configure stateful provisioning} +\input{common/stateful} + +\vspace*{-0.1cm} +\subsection{Boot compute nodes} \label{sec:boot_computes} +\input{common/reset_computes} + +\vspace*{-0.50cm} +\section{Install \OHPC{} Development Components} \label{sec:install_dev} +\input{common/dev_intro.tex} + +\vspace*{-0.15cm} +\subsection{Development Tools} \label{sec:install_dev_tools} +\input{common/dev_tools} + +\vspace*{-0.15cm} +\subsection{Compilers} \label{sec:install_compilers} +\input{common/compilers} + +%\clearpage +\vspace*{0.5cm} +\subsection{MPI Stacks} \label{sec:mpi} +\input{common/mpi_aarch_openpbs} + +\subsection{Performance Tools} \label{sec:install_perf_tools} +\input{common/perf_tools} + +\subsection{Setup default development environment} +\input{common/default_dev} + +%\clearpage +\subsection{3rd Party Libraries and Tools} \label{sec:3rdparty} +\input{common/third_party_libs_intro} +\input{common/third_party_libs_petsc_centos} +\vspace*{.4cm} +\input{common/third_party_libs} +\input{common/third_party_mpi_libs_aarch} + +\subsection{Optional Development Tool Builds} \label{sec:3rdparty_arm} +\input{common/armhpc_enabled_builds} + +\clearpage +\section{Resource Manager Startup} \label{sec:rms_startup} +\input{common/openpbs_startup} + +\section{Run a Test Job} \label{sec:test_job} +\input{common/openpbs_test_job} + +\clearpage +\appendix +{\bf \LARGE \centerline{Appendices}} \vspace*{0.2cm} + +\addcontentsline{toc}{section}{Appendices} +\renewcommand{\thesubsection}{\Alph{subsection}} + +\input{common/automation_appendix} +\input{common/upgrade} +\input{common/test_suite} +\input{common/customization_appendix_centos} +\input{manifest} +\input{common/signature} + +\section{TESTING PR 1878} +THIS IS A TEMPORARY CHANGE TO TEST THE BUILD OF DOCS WHEN A .TEX FILE IS MODIFIED + +\end{document} + diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/steps.xdv b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/steps.xdv new file mode 100644 index 0000000000..406627341c Binary files /dev/null and b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/chinese-simplified/steps.xdv differ diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/common b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/common deleted file mode 120000 index 3f6330a4b5..0000000000 --- a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/common +++ /dev/null @@ -1 +0,0 @@ -../../../../common/ \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/Makefile b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/Makefile new file mode 120000 index 0000000000..6883fcccba --- /dev/null +++ b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/Makefile @@ -0,0 +1 @@ +../../slurm/Makefile \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/common b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/common new file mode 120000 index 0000000000..7d820d8195 --- /dev/null +++ b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/common @@ -0,0 +1 @@ +../../../../../common \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/manifest b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/manifest new file mode 120000 index 0000000000..1a03fa87bd --- /dev/null +++ b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/manifest @@ -0,0 +1 @@ +../../slurm/manifest \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/manifest.tex b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/manifest.tex new file mode 120000 index 0000000000..dbcf21012c --- /dev/null +++ b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/manifest.tex @@ -0,0 +1 @@ +../../slurm/manifest.tex \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/steps.tex b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/steps.tex similarity index 98% rename from docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/steps.tex rename to docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/steps.tex index 0b8351cd09..a86b705d3f 100644 --- a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/steps.tex +++ b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/english/steps.tex @@ -277,6 +277,8 @@ \section{Run a Test Job} \label{sec:test_job} \input{manifest} \input{common/signature} +\section{TESTING PR 1878} +THIS IS A TEMPORARY CHANGE TO TEST THE BUILD OF DOCS WHEN A .TEX FILE IS MODIFIED \end{document} diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/manifest b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/manifest deleted file mode 120000 index 8c326646f9..0000000000 --- a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/manifest +++ /dev/null @@ -1 +0,0 @@ -../slurm/manifest \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/manifest.tex b/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/manifest.tex deleted file mode 120000 index ee7eaa76b2..0000000000 --- a/docs/recipes/install/openeuler22.03/aarch64/warewulf/openpbs/manifest.tex +++ /dev/null @@ -1 +0,0 @@ -../slurm/manifest.tex \ No newline at end of file diff --git a/docs/recipes/install/openeuler22.03/aarch64/warewulf/slurm/Makefile b/docs/recipes/install/openeuler22.03/aarch64/warewulf/slurm/Makefile index b8bc9fcb21..301d475cfc 100644 --- a/docs/recipes/install/openeuler22.03/aarch64/warewulf/slurm/Makefile +++ b/docs/recipes/install/openeuler22.03/aarch64/warewulf/slurm/Makefile @@ -11,7 +11,7 @@ ifdef GITID else test -s vc.tex || { echo "vc.tex file does not exist (and this is not a git repo)!"; exit 1; } endif - latexmk -pdf $< + latexmk -xelatex $< all: $(PAPER) diff --git a/misc/get_source.sh b/misc/get_source.sh index 7cfaac7dc4..f8f4ec8585 100755 --- a/misc/get_source.sh +++ b/misc/get_source.sh @@ -14,6 +14,23 @@ fi PATTERN=${1} +prepare_docs_ohpc_tar() { + rm -rf docs-ohpc /tmp/ohpc-for-docs + mkdir -p docs-ohpc + # Fetch the full Git history so that `git describe` works later + git clone https://github.com/openhpc/ohpc /tmp/ohpc-for-docs + cp -r /tmp/ohpc-for-docs/.git docs-ohpc/ + # Copy the local docs/ + cp -r docs docs-ohpc/ + + tar cf components/admin/docs/SOURCES/docs-ohpc.tar docs-ohpc + rm -rf docs-ohpc +} + +if [[ "${PATTERN}" == "docs.spec" ]]; then + prepare_docs_ohpc_tar +fi + IFS=$'\n' find . -name "${PATTERN}" -print0 | while IFS= read -r -d '' file diff --git a/tests/ci/run_build.py b/tests/ci/run_build.py index 40f0ed7a32..61dc9a1702 100755 --- a/tests/ci/run_build.py +++ b/tests/ci/run_build.py @@ -237,9 +237,17 @@ def build_srpm_and_rpm( failed = [] rebuild_success = [] total = 0 +docs_spec_executed = False for spec in args.specfiles: - if not spec.endswith('.spec'): + if 'components/admin/docs/SPECS/docs.spec' == spec: + if docs_spec_executed: + continue + docs_spec_executed = True + elif not docs_spec_executed and 'docs/recipes/install/' in spec: + docs_spec_executed = True + spec = 'components/admin/docs/SPECS/docs.spec' + elif not spec.endswith('.spec'): continue just_spec = os.path.basename(spec) total += 1