{"app_name":"Debian Janitor","binary_packages":["docx2txt"],"branch_url":"git+ssh://git@salsa.debian.org/debian/docx2txt.git","build_distribution":"sid","build_log_highlight_lines":[],"build_log_line_count":1820,"build_log_name":"build.log","campaign":"control","change_set":"00ee22d8-06a8-415e-bf2a-a481e2a1dad0","codebase":"docx2txt","codemod_log_name":"codemod.log","command":"brz up '--revision=git-v1:2493d51918e8c82212163ed52c624b25d26896ae'","current_year":"2026","description":"","is_admin":false,"lintian_result":{"groups":[{"group_id":"docx2txt_1.4-5~jan+control1","input_files":[{"hints":[{"experimental":false,"note":"","pointer":{"item":{"index":"docx2txt_1.4-5~jan+control1.dsc (patched)","name":"debian/changelog"},"line_position":1},"tag":"no-nmu-in-changelog","visibility":"warning"},{"experimental":false,"note":"1.4-5~jan+control1","pointer":{"item":{"index":"docx2txt_1.4-5~jan+control1.dsc (patched)","name":"debian/changelog"},"line_position":1},"tag":"source-nmu-has-incorrect-version-number","visibility":"warning"}],"path":"docx2txt_1.4-5~jan+control1.dsc"},{"hints":[{"experimental":false,"note":"control != sid","pointer":{"item":{"index":"docx2txt_1.4-5~jan+control1_all.deb (installed)","name":"usr/share/doc/docx2txt/changelog.Debian.gz"},"line_position":1},"tag":"changelog-distribution-does-not-match-changes-file","visibility":"warning"}],"path":"docx2txt_1.4-5~jan+control1_all.deb"},{"hints":[],"path":"docx2txt_1.4-5~jan+control1_amd64.buildinfo"},{"hints":[{"experimental":false,"note":"sid control","tag":"distribution-and-changes-mismatch","visibility":"warning"}],"path":"docx2txt_1.4-5~jan+control1_amd64.changes"}],"source_name":"docx2txt","source_version":"1.4-5~jan+control1"}],"lintian_version":"2.143.0"},"logs":{"build":{"description":"build","name":"build.log","url":"/control/c/docx2txt/00ee22d8-06a8-415e-bf2a-a481e2a1dad0/logs/build.log"},"codemod":{"description":"codemod","name":"codemod.log","url":"/control/c/docx2txt/00ee22d8-06a8-415e-bf2a-a481e2a1dad0/logs/codemod.log"},"worker":{"content":"[2026-11-07T21:39:34Z INFO  janitor_worker] Opening branch at https://salsa.debian.org/debian/docx2txt.git\n[2026-11-07T21:39:37Z INFO  janitor_worker] Cached branch URL http://janitor.debian.net/git/docx2txt missing: http://janitor.debian.net/git/docx2txt/\n[2026-11-07T21:39:37Z DEBUG janitor_worker] Workspace path: /srv/worker/output/1/janitor-worker-bqGFfJ/docx2txt\n[2026-11-07T21:39:37Z DEBUG silver_platter::workspace] Creating sprout from git+ssh://git@salsa.debian.org/debian/docx2txt.git\nTotal 266 (delta 37), reused 53 (delta 33), pack-reused 205 (from 1)\nTotal 12 (delta 2), reused 12 (delta 2), pack-reused 0 (from 0)\n[2026-11-07T21:39:43Z DEBUG silver_platter::utils] Colocated branch vendor not found, skipping\nTotal 0 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)\n[2026-11-07T21:39:46Z DEBUG silver_platter::utils] Colocated branch experimental not found, skipping\nNothing to delete.\n[2026-11-07T21:39:46Z DEBUG silver_platter::workspace] Fetching colocated branches: {\"experimental\": \"experimental\", \"upstream\": \"upstream\", \"pristine-tar\": \"pristine-tar\", \"vendor\": \"vendor\"}\nTotal 0 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)\n[2026-11-07T21:39:49Z DEBUG silver_platter::workspace] Successfully fetched colocated branch upstream -> upstream\nTotal 0 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)\n[2026-11-07T21:39:52Z DEBUG silver_platter::workspace] Successfully fetched colocated branch pristine-tar -> pristine-tar\n[2026-11-07T21:39:52Z INFO  janitor_worker] Workspace ready - starting.\n[2026-11-07T21:39:52Z INFO  janitor_worker::debian] Running [\"brz\", \"up\", \"--revision=git-v1:2493d51918e8c82212163ed52c624b25d26896ae\"]\n[2026-11-07T21:39:52Z DEBUG debian_analyzer::detect_gbp_dch] Branch history analysis: changelog_only: 7, other_only: 11, mixed: 20, dch_references: 0, unreleased_references: 13\nfound 112 deltas to reuse\n[2026-11-07T21:39:54Z INFO  ognibuild::debian::fix_build] Using fixers: [PgBuildExtOutOfDateControlFixer, MissingConfigureFixer, MissingAutomakeInputFixer, MissingConfigStatusInputFixer, MissingPerlFileFixer, DebcargoUnacceptablePredicateFixer, DebcargoUnacceptableComparatorFixer, RetryAptFetchFailure, PackageDependencyFixer]\n[2026-11-07T21:39:54Z DEBUG ognibuild::debian::build] Adding dummy changelog entry 1.4-5~jan+control1 for build\n[2026-11-07T21:39:54Z DEBUG ognibuild::debian::build] Writing build log to /srv/worker/output/1/janitor-worker-bqGFfJ/build.log\n[2026-11-07T21:39:54Z INFO  ognibuild::debian::build] Building debian packages, running sbuild --chroot-mode=unshare --no-clean-source -A -s -v -d sid.\n[2026-11-07T21:45:35Z INFO  ognibuild::debian::build] Build succeeded.\n[2026-11-07T21:45:35Z INFO  janitor_worker::debian::build] Built [\"/srv/worker/output/1/janitor-worker-bqGFfJ/docx2txt_1.4-5~jan+control1_all.deb\", \"/srv/worker/output/1/janitor-worker-bqGFfJ/docx2txt_1.4-5~jan+control1_amd64.changes\", \"/srv/worker/output/1/janitor-worker-bqGFfJ/docx2txt_1.4-5~jan+control1_amd64.buildinfo\"].\n[2026-11-07T21:45:35Z DEBUG janitor_worker::debian::lintian] Running lintian: cd \"/srv/worker/output/1/janitor-worker-bqGFfJ\" && \"lintian\" \"--exp-output=format=json\" \"--allow-root\" \"/srv/worker/output/1/janitor-worker-bqGFfJ/docx2txt_1.4-5~jan+control1_all.deb\" \"/srv/worker/output/1/janitor-worker-bqGFfJ/docx2txt_1.4-5~jan+control1_amd64.changes\" \"/srv/worker/output/1/janitor-worker-bqGFfJ/docx2txt_1.4-5~jan+control1_amd64.buildinfo\"\n[2026-11-07T21:45:38Z INFO  janitor_worker] Pushing result branch to http://janitor.debian.net/git/docx2txt\nfound 0 deltas to reuse\n[2026-11-07T21:45:38Z INFO  janitor_worker::vcs] Pushing packaging branch cache to http://janitor.debian.net/git/docx2txt,branch=debian%2Flatest\nfound 19 deltas to reuse\n[2026-11-07T21:45:38Z INFO  janitor_worker::vcs] Pushed packaging branch cache to http://janitor.debian.net/git/docx2txt,branch=debian%2Flatest\n","description":"worker","name":"worker.log","url":"/control/c/docx2txt/00ee22d8-06a8-415e-bf2a-a481e2a1dad0/logs/worker.log"}},"my_review":null,"other_reviews":[],"primary_log":"worker","publish_history":[],"queue_position":1,"result_code":"success","resume_from":null,"reviews":[],"revision":"git-v1:2493d51918e8c82212163ed52c624b25d26896ae","run":{"branch_url":"git+ssh://git@salsa.debian.org/debian/docx2txt.git","build_version":null,"change_set":"00ee22d8-06a8-415e-bf2a-a481e2a1dad0","codebase":"docx2txt","command":"brz up '--revision=git-v1:2493d51918e8c82212163ed52c624b25d26896ae'","context":null,"debian_build_distribution":"sid","debian_build_version":null,"description":"","duration_seconds":366,"failure_stage":null,"failure_transient":null,"finish_time":"2026-11-07T21:45:39.301462Z","id":"00ee22d8-06a8-415e-bf2a-a481e2a1dad0","logfilenames":["worker.log","codemod.log","build.log"],"main_branch_revision":"git-v1:2a714771729cc218ca437d7ac4d353a0c8a2b4a2","publish_status":"unknown","result_branches":[{"absorbed":false,"base_revision":"git-v1:2a714771729cc218ca437d7ac4d353a0c8a2b4a2","diff":"diff --git a/debian/changelog b/debian/changelog\nindex f2e3ccb..278d919 100644\n--- a/debian/changelog\n+++ b/debian/changelog\n@@ -1,22 +1,3 @@\n-docx2txt (1.4-7) unstable; urgency=medium\n-\n-  * Remove redundant Priority: optional from source stanza.\n-  * Use secure URI in Homepage field.\n-\n- -- Barak A. Pearlmutter <bap@debian.org>  Mon, 02 Nov 2026 09:22:18 +0000\n-\n-docx2txt (1.4-6) unstable; urgency=medium\n-\n-  * Bump to debhelper compat level 14\n-  * Bump standards version to 4.7.4\n-  * Security: run unzip without a shell, use 3-arg open, create the STDIN\n-    temporary file safely, and do not load perl config from the current\n-    directory (closes: #1152844), thanks to Koyo Keiter for the report\n-    and initial patch\n-  * Tolerate insignificant whitespace in docx XML (closes: #907994)\n-\n- -- Barak A. Pearlmutter <bap@debian.org>  Mon, 02 Nov 2026 08:46:20 +0000\n-\n docx2txt (1.4-5) unstable; urgency=medium\n \n   * Address security issue: do not quote %s in mailcap entry (closes: #985594)\ndiff --git a/debian/control b/debian/control\nindex 917f3e9..1a48577 100644\n--- a/debian/control\n+++ b/debian/control\n@@ -1,16 +1,18 @@\n Source: docx2txt\n Section: text\n+Priority: optional\n Maintainer: Barak A. Pearlmutter <bap@debian.org>\n-Build-Depends: debhelper-compat (= 14), dh-sequence-single-binary\n-Standards-Version: 4.7.4\n-Homepage: https://docx2txt.sourceforge.net\n+Build-Depends: debhelper-compat (= 13)\n+Standards-Version: 4.5.0\n+Rules-Requires-Root: no\n+Homepage: http://docx2txt.sourceforge.net\n Vcs-Git: https://salsa.debian.org/debian/docx2txt.git\n Vcs-Browser: https://salsa.debian.org/debian/docx2txt\n \n Package: docx2txt\n Architecture: all\n Multi-Arch: foreign\n-Depends: unzip\n+Depends: ${shlibs:Depends}, ${misc:Depends}, unzip\n Description: Convert Microsoft OOXML files to plain text\n  This tool attempts to generate equivalent plain text files from\n  Microsoft .docx documents, preserving some formatting and document\ndiff --git a/debian/patches/0002-no-shell-injection.patch b/debian/patches/0002-no-shell-injection.patch\ndeleted file mode 100644\nindex 3705210..0000000\n--- a/debian/patches/0002-no-shell-injection.patch\n+++ /dev/null\n@@ -1,163 +0,0 @@\n-From: Koyo Keiter <koyo.keiter@gmail.com>\n-Date: Mon, 2 Nov 2026 09:17:39 +0000\n-Subject: avoid shell and perl code injection\n-\n-Bug-Debian: https://bugs.debian.org/1152844\n-Forwarded: no\n-Last-Update: 2026-11-02\n-\n-docx2txt interpolated the input file name into backtick shell commands\n-inside double quotes, so a file name containing \", $(...) or backticks\n-executed arbitrary commands.  Run unzip via a list-form pipe open\n-instead, and prefix \"./\" to file names starting with \"-\" so they are not\n-taken as unzip options.\n-\n-Use 3-argument open when reading from an extracted directory, where a\n-directory name starting with \"|\" was run as a command, and when opening\n-the output file.\n-\n-Create the temporary file used for STDIN input with File::Temp rather\n-than at a predictable name opened without O_EXCL.\n-\n-Do not load docx2txt.config (which is perl code) from the current\n-directory.\n----\n- docx2txt.pl | 61 +++++++++++++++++++++++++++++++++++++++++++++----------------\n- 1 file changed, 45 insertions(+), 16 deletions(-)\n-\n-diff --git a/docx2txt.pl b/docx2txt.pl\n-index fae6389..3dfd356 100755\n---- a/docx2txt.pl\n-+++ b/docx2txt.pl\n-@@ -103,8 +103,8 @@\n- \n- \n- #\n--# The default settings below can be overridden via docx2txt.config in current\n--# directory/ user configuration directory/ system configuration directory.\n-+# The default settings below can be overridden via docx2txt.config in the\n-+# user configuration directory/ system configuration directory.\n- #\n- \n- our $config_unzip = '/usr/bin/unzip';\t# Windows path like 'C:/path/to/unzip.exe'\n-@@ -278,15 +278,14 @@ die $usage if (@ARGV > 2 || $ARGV[0] eq '-h');\n- \n- \n- #\n--# Look for configuration file in current directory/ user configuration\n--# directory/ system configuration directory - in the given order.\n-+# Look for configuration file in user configuration directory/ system\n-+# configuration directory - in the given order.  (The configuration file is\n-+# perl code, so it is deliberately not read from the current directory.)\n- #\n- \n- my %config;\n- \n--if (-f \"docx2txt.config\") {\n--    %config = do 'docx2txt.config';\n--} elsif (-f \"$userConfigDir/docx2txt.config\") {\n-+if (-f \"$userConfigDir/docx2txt.config\") {\n-     %config = do \"$userConfigDir/docx2txt.config\";\n- } elsif (-f \"$systemConfigDir/docx2txt.config\") {\n-     %config = do \"$systemConfigDir/docx2txt.config\";\n-@@ -321,8 +320,13 @@ if (@ARGV == 0) {\n- }\n- \n- if ($ARGV[0] eq '-') {\n--    $tempFile = \"${config_tempDir}/dx2tTemp_${$}_\" . time() . \".docx\";\n--    open my $fhTemp, \"> $tempFile\" or die \"Can't create temporary file for storing docx file read from STDIN!\\n\";\n-+    require File::Temp;\n-+    my $fhTemp;\n-+    ($fhTemp, $tempFile) = eval {\n-+        File::Temp::tempfile(\"dx2tTempXXXXXXXXXX\", DIR => $config_tempDir,\n-+                             SUFFIX => \".docx\", UNLINK => 0);\n-+    };\n-+    die \"Can't create temporary file for storing docx file read from STDIN!\\n\" if ! $fhTemp;\n- \n-     binmode $fhTemp;\n-     local $/ = undef;\n-@@ -348,7 +352,7 @@ sub check_for_required_file_in_folder {\n- \n- sub readFileInto {\n-     local $/ = undef;\n--    open my $fh, \"$_[0]\" or die \"Couldn't read file <$_[0]>!\\n\";\n-+    open my $fh, '<', $_[0] or die \"Couldn't read file <$_[0]>!\\n\";\n-     binmode $fh;\n-     $_[1] = <$fh>;\n-     close $fh;\n-@@ -360,7 +364,7 @@ sub readOptionalFileInto {\n-     stat(\"$_[0]\");\n-     if (-f _) {\n-         if (-r _ && -T _) {\n--            open my $fh, \"$_[0]\" or die \"Couldn't read file <$_[0]>!\\n\";\n-+            open my $fh, '<', $_[0] or die \"Couldn't read file <$_[0]>!\\n\";\n-             binmode $fh;\n-             $_[1] = <$fh>;\n-             close $fh;\n-@@ -401,12 +405,33 @@ else {\n- # Extract xml document content from argument docx file/directory.\n- #\n- \n--my $unzip_cmd = \"'$config_unzip' $config_unzip_opts\";\n-+#\n-+# Run unzip directly rather than via a shell, so that the docx file name is\n-+# never interpreted as shell code.  A leading \"./\" keeps a file name starting\n-+# with \"-\" from being taken as an option.\n-+#\n-+\n-+my $unzipInput = $ARGV[0];\n-+$unzipInput = \"./$unzipInput\" if $unzipInput =~ /^-/;\n-+\n-+sub unzipMember {\n-+    local $/ = undef;\n-+    open(my $savedErr, '>&', \\*STDERR);\n-+    open(STDERR, '>', $nullDevice);\n-+    my $ok = open(my $fh, '-|', $config_unzip, split(' ', $config_unzip_opts),\n-+                  $unzipInput, $_[0]);\n-+    open(STDERR, '>&', $savedErr);\n-+    return '' if ! $ok;\n-+    binmode $fh;\n-+    my $data = <$fh>;\n-+    close $fh;\n-+    return defined $data ? $data : '';\n-+}\n- \n- if ($inpIsDir eq 'y') {\n-     readFileInto(\"$ARGV[0]/word/document.xml\", $content);\n- } else {\n--    $content = `$unzip_cmd \"$ARGV[0]\" word/document.xml 2>$nullDevice`;\n-+    $content = unzipMember('word/document.xml');\n- }\n- \n- cleandie \"Failed to extract required information from <$inputFileName>!\\n\" if ! $content;\n-@@ -427,7 +452,11 @@ if (@ARGV == 1) {\n- }\n- \n- my $txtfile;\n--open($txtfile, \"> $ARGV[1]\") || cleandie \"Can't create <$ARGV[1]> for output!\\n\";\n-+if ($ARGV[1] eq '-') {\n-+    open($txtfile, '>&', \\*STDOUT) || cleandie \"Can't create <$ARGV[1]> for output!\\n\";\n-+} else {\n-+    open($txtfile, '>', $ARGV[1]) || cleandie \"Can't create <$ARGV[1]> for output!\\n\";\n-+}\n- binmode $txtfile;    # Ensure no auto-conversion of '\\n' to '\\r\\n' on Windows.\n- \n- \n-@@ -438,7 +467,7 @@ binmode $txtfile;    # Ensure no auto-conversion of '\\n' to '\\r\\n' on Windows.\n- if ($inpIsDir eq 'y') {\n-     readFileInto(\"$ARGV[0]/word/_rels/document.xml.rels\", $_);\n- } else {\n--    $_ = `$unzip_cmd \"$ARGV[0]\" word/_rels/document.xml.rels 2>$nullDevice`;\n-+    $_ = unzipMember('word/_rels/document.xml.rels');\n- }\n- \n- my %docurels;\n-@@ -455,7 +484,7 @@ $_ = \"\";\n- if ($inpIsDir eq 'y') {\n-     readOptionalFileInto(\"$ARGV[0]/word/numbering.xml\", $_);\n- } else {\n--    $_ = `$unzip_cmd \"$ARGV[0]\" word/numbering.xml 2>$nullDevice`;\n-+    $_ = unzipMember('word/numbering.xml');\n- }\n- \n- my %abstractNum;\ndiff --git a/debian/patches/0003-xml-whitespace.patch b/debian/patches/0003-xml-whitespace.patch\ndeleted file mode 100644\nindex cec4be4..0000000\n--- a/debian/patches/0003-xml-whitespace.patch\n+++ /dev/null\n@@ -1,71 +0,0 @@\n-From: \"Barak A. Pearlmutter\" <bap@debian.org>\n-Date: Mon, 2 Nov 2026 09:17:39 +0000\n-Subject: tolerate insignificant whitespace in docx XML\n-\n-Bug-Debian: https://bugs.debian.org/907994\n-Forwarded: no\n-Last-Update: 2026-11-02\n-\n-The text extraction is done with regular expressions that assume the\n-compact XML written by most docx generators, so pretty-printed XML (or\n-merely \"<w:i />\" with a space before the slash) was not recognised and\n-raw XML leaked into the output.  Normalise whitespace inside tags and\n-drop whitespace-only text between tags, except directly inside <w:t>\n-runs where it is content.\n----\n- docx2txt.pl | 21 +++++++++++++++++++++\n- 1 file changed, 21 insertions(+)\n-\n-diff --git a/docx2txt.pl b/docx2txt.pl\n-index 3dfd356..b33a973 100755\n---- a/docx2txt.pl\n-+++ b/docx2txt.pl\n-@@ -405,6 +405,24 @@ else {\n- # Extract xml document content from argument docx file/directory.\n- #\n- \n-+#\n-+# Normalise insignificant XML whitespace, as produced by pretty-printers, into\n-+# the compact form the regular expressions below expect: collapse whitespace\n-+# inside tags, and drop whitespace-only text between tags (except directly\n-+# inside a <w:t> text run, where it is content).\n-+#\n-+\n-+sub normalizeXmlSpace {\n-+    $_[0] =~ s{<([^<>]*)>}{\n-+        my $t = $1;\n-+        $t =~ s/\\s+/ /g;\n-+        $t =~ s/^ //;\n-+        $t =~ s/ (\\/?)$/$1/;\n-+        \"<$t>\"\n-+    }ge;\n-+    $_[0] =~ s{(<(?!w:t[ >])[^<>]*>)\\s+(?=<|\\z)}{$1}g;\n-+}\n-+\n- #\n- # Run unzip directly rather than via a shell, so that the docx file name is\n- # never interpreted as shell code.  A leading \"./\" keeps a file name starting\n-@@ -435,6 +453,7 @@ if ($inpIsDir eq 'y') {\n- }\n- \n- cleandie \"Failed to extract required information from <$inputFileName>!\\n\" if ! $content;\n-+normalizeXmlSpace($content);\n- \n- \n- #\n-@@ -469,6 +488,7 @@ if ($inpIsDir eq 'y') {\n- } else {\n-     $_ = unzipMember('word/_rels/document.xml.rels');\n- }\n-+normalizeXmlSpace($_);\n- \n- my %docurels;\n- while (/<Relationship Id=\"(.*?)\" Type=\".*?\\/([^\\/]*?)\" Target=\"(.*?)\"( .*?)?\\/>/g)\n-@@ -486,6 +506,7 @@ if ($inpIsDir eq 'y') {\n- } else {\n-     $_ = unzipMember('word/numbering.xml');\n- }\n-+normalizeXmlSpace($_);\n- \n- my %abstractNum;\n- my @N2ANId = ();\ndiff --git a/debian/patches/series b/debian/patches/series\nindex 450cb67..1863f74 100644\n--- a/debian/patches/series\n+++ b/debian/patches/series\n@@ -1,3 +1 @@\n 0001-shebangs.patch\n-0002-no-shell-injection.patch\n-0003-xml-whitespace.patch\n","remote_name":"master","revision":"git-v1:2493d51918e8c82212163ed52c624b25d26896ae","role":"main"}],"result_code":"success","result_tags":[],"revision":"git-v1:2493d51918e8c82212163ed52c624b25d26896ae","start_time":"2026-11-07T21:39:32.328764Z","subpath":"","suite":"control","target_branch_url":null,"vcs_type":"git","worker":"tyr"},"run_id":"00ee22d8-06a8-415e-bf2a-a481e2a1dad0","success_probability":0.6666666666666666,"suite":"control","total_previous_runs":3,"utcnow":"2026-11-09T03:40:21.779039510+00:00","vcs_type":"git","vcs_url":"git+ssh://git@salsa.debian.org/debian/docx2txt.git","version":"0.0.0","worker_log_name":"worker.log","worker_name":"tyr"}