Hello community,

here is the log from the commit of package hxtools for openSUSE:Factory checked 
in at 2017-01-17 14:34:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/hxtools (Old)
 and      /work/SRC/openSUSE:Factory/.hxtools.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "hxtools"

Changes:
--------
--- /work/SRC/openSUSE:Factory/hxtools/hxtools.changes  2015-03-25 
10:01:15.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.hxtools.new/hxtools.changes     2017-01-17 
14:34:54.785777025 +0100
@@ -1,0 +2,18 @@
+Mon Jan  9 21:39:42 UTC 2017 - jeng...@inai.de
+
+- Update to new upstream release 20170109
+* A new utility "gxxdm" was added which explains libstdc++v3
+  mangled names in detail. (Not feature-complete.)
+* New utility "ldif-duplicate-attrs": counts multiple occurrences
+  of an attribute within one DN leaf and reports them.
+* New utility "ldif-leading-spaces": reports if LDAP attribute
+  values start or end with whitespaces. (Spaces have implications
+  for sorting addressbook entries, for example.)
+* New utilities: pegrep (a multiline pcregrep), qpdecode
+  (quoted-printable filter), settime.pl (set filetime according
+  to oldest archive member)
+* move_moov was renamed to aumeta
+* Removed utilities: git-new-root (git implements this itself
+  easily now)
+
+-------------------------------------------------------------------

Old:
----
  hxtools-20150304.tar.asc
  hxtools-20150304.tar.xz

New:
----
  hxtools-20170109.tar.asc
  hxtools-20170109.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ hxtools.spec ++++++
--- /var/tmp/diff_new_pack.ghiWHA/_old  2017-01-17 14:34:55.297704451 +0100
+++ /var/tmp/diff_new_pack.ghiWHA/_new  2017-01-17 14:34:55.301703884 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           hxtools
-Version:        20150304
+Version:        20170109
 Release:        0
 Summary:        Collection of day-to-day tools (binaries)
 License:        GPL-2.0+ and WTFPL
@@ -31,6 +31,7 @@
 # See https://en.opensuse.org/openSUSE:Packaging_Patches_guidelines
 BuildRequires:  bdftopcf
 BuildRequires:  fdupes
+BuildRequires:  gcc-c++
 BuildRequires:  libcap-devel >= 2
 BuildRequires:  xz
 BuildRequires:  pkgconfig >= 0.21
@@ -56,7 +57,6 @@
 * declone(1) — break hardlinks
 * fd0ssh(1) — pipe for password-over-stdin support to ssh
 * ofl(1) — open file lister (replaces fuser and lsof -m)
-* sysinfo(1) — system configuration summary
 * tailhex(1) — hex dumper with tail-following support
 * utmp_register(1) — make entries in the utmp/wtmp database
 * vfontas(1) — VGA font file assembler
@@ -86,11 +86,11 @@
 * git-author-stat(1) — show commit author statistics of a git repository
 * git-export-patch(1) — produce perfect patch from git comits for mail 
submission
 * git-forest(1) — display the commit history forest
-* git-new-root(1) — start a new root in the git history
 * git-revert-stats(1) — show reverting statistics of a git repository
 * git-track(1) — set up branch for tracking a remote
 * man2html(1) — convert nroff manpages to HTML
-* pesubst(1) — perl-regexp stream substitution (replaces sed for sub‐ 
stitutions)
+* pegrep(1) — perl-regexp-based multi-line grep
+* pesubst(1) — perl-regexp-based stream substitution (replaces sed for 
substitutions)
 * recursive_lower(1) — recursively lowercase all filenames
 * spec-beautifier(1) — program to clean up RPM .spec files
 * vcsaview(8) — display a screen dump in VCSA format
@@ -127,8 +127,8 @@
 
 %description profile
 Bash environment settings from hxtools. Particularly, this provides
-the SUSE 6.x ls color scheme, and an uncluttered PS1 that shows
-only important parts of a path.
+the SUSE 6.x ls color scheme, and a reduced PS1 that shows only the
+rightmost parts of a path.
 
 %package -n sysinfo
 Summary:        System diagnosis tools from hxtools
@@ -196,6 +196,7 @@
 %_bindir/bin2c
 %_bindir/clt2bdf
 %_bindir/declone
+%_bindir/gxxdm
 %_bindir/hcdplay
 %_bindir/omixer
 %_bindir/oplay
@@ -219,6 +220,7 @@
 
 %files scripts
 %defattr(-,root,root)
+%_bindir/aumeta
 %_bindir/checkbrack
 %_bindir/cwdiff
 %_bindir/fxterm
@@ -226,8 +228,10 @@
 %_bindir/googtts
 %_bindir/gpsh
 %_bindir/man2html
-%_bindir/move_moov
+%_bindir/mkvappend
+%_bindir/pegrep
 %_bindir/pesubst
+%_bindir/qpdecode
 %_bindir/qtar
 %_bindir/spec-beautifier
 %_bindir/ssa2srt
@@ -239,6 +243,8 @@
 %hldir/extract_*
 %hldir/fnt2bdf
 %hldir/git-*
+%hldir/ldif-duplicate-attrs
+%hldir/ldif-leading-spaces
 %hldir/logontime
 %hldir/mailsplit
 %hldir/mod2ogg

++++++ hxtools-20150304.tar.xz -> hxtools-20170109.tar.xz ++++++
++++ 1767 lines of diff (skipped)
++++    retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/LICENSES.txt new/hxtools-20170109/LICENSES.txt
--- old/hxtools-20150304/LICENSES.txt   2015-03-04 17:24:01.000000000 +0100
+++ new/hxtools-20170109/LICENSES.txt   2017-01-09 22:38:54.000000000 +0100
@@ -5,7 +5,6 @@
 sadmin/netload                 WTFPL-2.0+
 sadmin/newns                   WTFPL-2.0+
 sadmin/ofl                     WTFPL-2.0+
-sadmin/parkverbot              GPL-2.0+
 sadmin/pmap_dirty              WTFPL-2.0+
 sadmin/printcaps               WTFPL-2.0+
 sadmin/proc_iomem_count                WTFPL-2.0+
@@ -26,7 +25,6 @@
 sdevel/git-author-stats                WTFPL-2.0+
 sdevel/git-blame-stats         WTFPL-2.0+
 sdevel/git-forest              GPL-2.0+
-sdevel/git-new-root            WTFPL-2.0+
 sdevel/git-revert-stats                WTFPL-2.0+
 sdevel/git-track               WTFPL-2.0+
 sdevel/man2html                        WTFPL-2.0+
@@ -59,6 +57,7 @@
 suser/fxterm                   WTFPL-2.0+
 suser/mailsplit                        WTFPL-2.0+
 suser/pesubst                  WTFPL-2.0+
+suser/qpdecoder                        WTFPL-2.0+
 suser/qtar                     WTFPL-2.0+
 suser/rezip                    WTFPL-2.0+
 suser/rot13                    WTFPL-2.0+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/configure.ac new/hxtools-20170109/configure.ac
--- old/hxtools-20150304/configure.ac   2015-03-04 17:24:01.000000000 +0100
+++ new/hxtools-20170109/configure.ac   2017-01-09 22:38:54.000000000 +0100
@@ -1,4 +1,4 @@
-AC_INIT([hxtools], [20150304])
+AC_INIT([hxtools], [20170109])
 AC_CONFIG_AUX_DIR([build-aux])
 AC_CONFIG_HEADERS([config.h])
 AC_PROG_INSTALL
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/data/gitconfig new/hxtools-20170109/data/gitconfig
--- old/hxtools-20150304/data/gitconfig 2015-03-04 17:24:01.000000000 +0100
+++ new/hxtools-20170109/data/gitconfig 2017-01-09 22:38:54.000000000 +0100
@@ -44,3 +44,9 @@
 
 [grep]
        patternType = perl
+
+[merge]
+       conflictstyle = diff3
+
+[diff]
+       algorithm = histogram
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/data/hxtools_dircolors 
new/hxtools-20170109/data/hxtools_dircolors
--- old/hxtools-20150304/data/hxtools_dircolors 2015-03-04 17:24:01.000000000 
+0100
+++ new/hxtools-20170109/data/hxtools_dircolors 2017-01-09 22:38:54.000000000 
+0100
@@ -155,6 +155,7 @@
 .jpeg  0;36
 .JPG   0;36    # JPEG
 .jpg   0;36    # JPEG
+.m4a   0:36    # MPEG4 container with just audio
 .mid   0;36    # MIDI file
 .mka   0;36    # Matroska container (used for audio-only)
 .mkv   0;36    # Matroska container (used for video)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/doc/Makefile.am new/hxtools-20170109/doc/Makefile.am
--- old/hxtools-20150304/doc/Makefile.am        2015-03-04 17:24:01.000000000 
+0100
+++ new/hxtools-20170109/doc/Makefile.am        2017-01-09 22:38:54.000000000 
+0100
@@ -25,6 +25,7 @@
        git-track.1 \
        hcdplay.1 \
        hxtools.7 \
+       ldif-duplicate-attrs.1 \
        logontime.8 \
        mailsplit.1 \
        man2html.1 \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/doc/gpsh.1 new/hxtools-20170109/doc/gpsh.1
--- old/hxtools-20150304/doc/gpsh.1     2015-03-04 17:24:01.000000000 +0100
+++ new/hxtools-20170109/doc/gpsh.1     2017-01-09 22:38:54.000000000 +0100
@@ -1,18 +1,22 @@
-.TH gpsh 1 "2010-11-30" "hxtools" "hxtools"
+.TH gpsh 1 "2015-03-11" "hxtools" "hxtools"
 .SH Name
 .PP
-gpsh \(em grep and play my audio files from shell
+gpsh \(em select audio files by name and play them
 .SH Syntax
 .PP
 \fBgpsh\fP [\fB\-F\fP \fIindex.m9u\fP] [\fB-OM,\fP\fIopt\fP]
 [\fB\-blvxz\fP] \fIpatterns\fP...
 .SH Description
 .PP
-Greps the master index file by the specified patterns and plays back any
-matching entries (using external programs: mplayer, timidity). It expressly
-supports jumping into subtracks in mixes.
-.PP
-When no pattern is given, all files are selected.
+gpsh is a utility that will search the current directory for audio/video files
+by matching their path and filename with regular expression patterns presented
+on the command line, and feeding them to a multimedia player. gpsh is capable
+of reading special tracklist files which contain subtrack names and their
+associated time positions.
+.PP
+When no pattern is given, all entries are selected. By default, all entries
+which matched a particular pattern are played back in random order, but order
+between patterns is retained.
 .SH Options
 .TP
 \fB\-F\fP \fIindex.m9u\fP
@@ -36,7 +40,11 @@
 Ignore subtracks in a mix, and also avoid reindexing of VBR files.
 .TP
 \fB\-z\fP
-Do not shuffle the play queue.
+Do not shuffle the play queue / play back in lexicographic order.
+.TP
+\fB\-\-loop\fP \fIn\fP
+Passes the -loop option to mplayer. Note that the option has \fBtwo\fP
+dashes for gpsh.
 .SH Index
 .PP
 gpsh keeps an index cache, and refreshes it in the background when it is older
@@ -45,29 +53,24 @@
 will be skipped.
 .SH Tracklists for mixes
 .PP
-gpsh scans all .txt files for the following pattern used to denote a subtrack
+gpsh scans all .tls files for the following pattern used to denote a subtrack
 in a big mix of the same basename:
 .PP
 /^\[(?:(\d+):)?(\d+):(\d+)\](.*)/
 .PP
 Example: Audio file: "DJ Doboy - Trancequility volume 01.mp3",
-Tracklist: "DJ Doboy - Trancequility volume 01.txt",
+Tracklist: "DJ Doboy - Trancequility volume 01.tls",
 TL content: "[48:29] Paul van Dyk - For an angel".
 .SH Regex search
 .PP
 gpsh uses a Perl regular expression search across file name (mix name, if any)
 and subtrack name.
 .PP
-Example: gpsh 'dj.doboy.*trancequility.*paul.van.dyk'
+Example: gpsh 'doboy.*trancequility.*paul.van.dyk'
 .PP
 Would cause gpsh to search for all PVD tracks in Doboy's Trancequility
 mixes. mplayer will be invoked on "DJ Doboy - Trancequility volume 01.mp3"
-with automatic seeking to position 48:29, for example. Of course, just
-specifying
-.PP
-gpsh 'dj.doboy.*trancequility'
-.PP
-Would select the grand mix and start at 00:00.
+with automatic seeking to position 48:29, for example.
 .SH Extra options
 .PP
 gpsh \-OM,\-af\-clr chillout
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/doc/hxtools.7 new/hxtools-20170109/doc/hxtools.7
--- old/hxtools-20150304/doc/hxtools.7  2015-03-04 17:24:01.000000000 +0100
+++ new/hxtools-20170109/doc/hxtools.7  2017-01-09 22:38:54.000000000 +0100
@@ -82,6 +82,9 @@
 .PP
 \fBman2html\fP(1) \(en convert nroff manpages to HTML
 .PP
+\fBmkvappend\fP(1) \(en concatenate multiple files into one Matroska container
+file
+.PP
 \fBmod2ogg\fP(1) \(en wrapper for module to OggVorbis transcoding
 .PP
 \fBnetload\fP(8) \(en show utilization of network interface
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/doc/ldif-duplicate-attrs.1 
new/hxtools-20170109/doc/ldif-duplicate-attrs.1
--- old/hxtools-20150304/doc/ldif-duplicate-attrs.1     1970-01-01 
01:00:00.000000000 +0100
+++ new/hxtools-20170109/doc/ldif-duplicate-attrs.1     2017-01-09 
22:38:54.000000000 +0100
@@ -0,0 +1,42 @@
+.TH ldif-duplicate-attrs 1 "2015-04-01" "hxtools" "hxtools"
+.SH Name
+.PP
+ldif-duplicate-attrs \(em check for multi-value attributes in LDIF file
+.SH Usage
+.PP
+\fBprocalldiff\fP [\fB\-C\fP] \fB<\fP\fIfoo.ldif\fP \fB>\fP\fIreport.txt\fP
+.PP
+Input must not contain linewraps. Do use with
+.PP
+{\fBslapcat\fB|\fBldapsearch\fP} \fB-o ldif-wrap=no\fP ...
+.SH Description
+.PP
+Reads an LDIF file from standard input and checks for the presence
+of multivalued attributes of all DNs. Whitelisted attribute names
+are excluded from the problem report. Outputs a statistic sorted by
+severity to standard output.
+.SH Options
+.TP
+\fB\-C\fP
+Force color output. Useful when piping into `less -R`.
+(By default, color is only emitted when stdout is a tty.)
+.SH Example output
+.PP
+.nf
+       11      cn=67eoG,ou=Muenchen,o=Deutschland
+               uid(3) cn(2) fullName(2) mail(2) sn(2)
+       10      cn=Hoff,ou=Muenchen,o=Deutschland
+               homeCity(2) homePostalAddress(2) homeZipCode(2) l(2)
+               telephoneNumber(2)
+.fi
+.PP
+The DN cn=67eoG has had three values for the "uid" attribute, two for "cn",
+and so on, for a total badness score of 11.
+The entire output is sorted by:
+.IP 1. 4
+Overall, DNs are sorted by descending score.
+.IP 2. 4
+For a particular DN, attributes are sorted by descending score.
+.IP 3. 4
+If two attributes have the same score, sort occurs
+lexicographically ascending.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/sadmin/Makefile.am new/hxtools-20170109/sadmin/Makefile.am
--- old/hxtools-20150304/sadmin/Makefile.am     2015-03-04 17:24:01.000000000 
+0100
+++ new/hxtools-20170109/sadmin/Makefile.am     2017-01-09 22:38:54.000000000 
+0100
@@ -23,6 +23,8 @@
 
 dist_pkglibexec_SCRIPTS = \
        logontime \
+       ldif-duplicate-attrs \
+       ldif-leading-spaces \
        netload \
        recursive_lower \
        vcsaview
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/sadmin/ldif-duplicate-attrs 
new/hxtools-20170109/sadmin/ldif-duplicate-attrs
--- old/hxtools-20150304/sadmin/ldif-duplicate-attrs    1970-01-01 
01:00:00.000000000 +0100
+++ new/hxtools-20170109/sadmin/ldif-duplicate-attrs    2017-01-09 
22:38:54.000000000 +0100
@@ -0,0 +1,130 @@
+#!/usr/bin/perl
+#
+#      Check for multi-value attributes in LDIF file
+#      written by Jan Engelhardt, 2015
+#
+#      This program is free software; you can redistribute it and/or
+#      modify it under the terms of the WTF Public License version 2 or
+#      (at your option) any later version.
+#
+use strict;
+use warnings;
+use Getopt::Long;
+
+our @wl = qw(
+       ACL objectClass member equivalentToMe DirXML-Associations
+       groupMembership securityEquals DirXML-PasswordSyncStatus
+       zarafaSendAsPrivilege zarafaAliases
+       departmentNumber
+);
+our $do_color = -t 1;
+
+&main();
+
+sub main
+{
+       &Getopt::Long::Configure(qw(bundling));
+       &GetOptions(
+               "C" => \$do_color,
+       );
+
+       my $attrcount = &parse_ldif();
+       &print_stats($attrcount);
+}
+
+sub parse_ldif
+{
+       my $dn;
+       my $attrcount = {};
+
+       while (defined(my $line = <STDIN>)) {
+               chomp($line);
+               if (substr($line, 0, 1) eq "#") {
+                       next;
+               }
+               if ($line =~ /^dn:\s*/) {
+                       $dn = $';
+                       $attrcount->{$dn} = {};
+               }
+               my($key, $value) = &parse_line($line);
+               if (!defined($key) || &whitelisted($key)) {
+                       # Blank lines and other unparsable lines get filtered
+                       # here.
+                       next;
+               }
+               ++$attrcount->{$dn}->{$key};
+       }
+       close(STDIN);
+       return $attrcount;
+}
+
+sub parse_line
+{
+       return (shift(@_) =~ /^([^:]+):+(?:\s*)?(.*)/);
+}
+
+sub whitelisted
+{
+       my $needle = shift @_;
+       return scalar grep { $_ eq $needle } @wl;
+}
+
+sub print_stats
+{
+       my $attrcount = shift @_;
+       my $dncount = {};
+       my $crapdn;
+       my $globattr = {};
+
+       foreach my $dn (keys %$attrcount) {
+               my $count = 0;
+               my $dh = $attrcount->{$dn};
+
+               foreach my $key (keys %$dh) {
+                       if ($dh->{$key} < 2) {
+                               next;
+                       }
+                       $count += $dh->{$key};
+               }
+               $dncount->{$dn} = $count;
+       }
+
+       foreach my $dn (sort { $dncount->{$b} <=> $dncount->{$a} }
+                       keys %$dncount)
+       {
+               my $dh = $attrcount->{$dn};
+
+               if ($dncount->{$dn} == 0) {
+                       next;
+               }
+
+               if ($do_color) {
+                       print "\e[1;31m";
+               }
+               print $dncount->{$dn};
+               if ($do_color) {
+                       print "\e[0;31m";
+               }
+               print "\t$dn\n";
+               print "\t";
+               foreach my $key (sort {
+                               $dh->{$b} <=> $dh->{$a} || $a cmp $b }
+                       keys %$dh)
+               {
+                       if ($dh->{$key} < 2) {
+                               next;
+                       }
+                       if ($do_color) {
+                               print "\e[32m", substr($key, 0, 1), "\e[0m",
+                               substr($key, 1);
+                       } else {
+                               print $key;
+                       }
+                       print "(", $attrcount->{$dn}->{$key}, ") ";
+                       $globattr->{$dn} += $dh->{$key};
+               }
+               print "\n\n";
+               ++$crapdn;
+       }
+       print $crapdn, " DNs\n";
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/sadmin/ldif-leading-spaces 
new/hxtools-20170109/sadmin/ldif-leading-spaces
--- old/hxtools-20150304/sadmin/ldif-leading-spaces     1970-01-01 
01:00:00.000000000 +0100
+++ new/hxtools-20170109/sadmin/ldif-leading-spaces     2017-01-09 
22:38:54.000000000 +0100
@@ -0,0 +1,72 @@
+#!/usr/bin/perl
+#
+#      Detect questionable values for LDAP attributes
+#      written by Jan Engelhardt, 2015
+#
+#      This program is free software; you can redistribute it and/or
+#      modify it under the terms of the WTF Public License version 2 or
+#      (at your option) any later version.
+#
+use strict;
+use warnings;
+use Encode;
+use Getopt::Long;
+use MIME::Base64;
+
+our @wl = qw(
+       zarafaUniqueID
+);
+our $check_for_spaces = 1;
+
+&main();
+
+sub main
+{
+       my $dn;
+       my $dn_printed = 0;
+       my $dncount = 0;
+
+       while (defined(my $line = <STDIN>)) {
+               chomp($line);
+               if (substr($line, 0, 1) eq "#") {
+                       next;
+               }
+               if ($line =~ /^dn:\s*/) {
+                       $dn = $';
+                       $dn_printed = 0;
+                       next;
+               }
+               my($key, $is_encoded, $value) = &parse_line($line);
+               if (!defined($key) || &whitelisted($key)) {
+                       next;
+               }
+               if ($is_encoded) {
+                       $value = decode_base64($value);
+               }
+               if ($check_for_spaces && $value =~ /^\s|\s$/) {
+                       if (!$dn_printed) {
+                               print "\ndn: $dn\n";
+                               $dn_printed = 1;
+                               ++$dncount;
+                       }
+                       print "$key(", length($key), "): $value\n";
+               }
+       }
+       close(STDIN);
+       print "\n$dncount DNs total\n";
+}
+
+sub parse_line
+{
+       my @r = (shift(@_) =~ /^([^:]+)(:+)(?:\s*)?(.*)/);
+       if (defined($r[1])) {
+               $r[1] = length($r[1]) >= 2 ? 1 : 0;
+       }
+       return @r;
+}
+
+sub whitelisted
+{
+       my $needle = shift @_;
+       return scalar grep { $_ eq $needle } @wl;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/sdevel/.gitignore new/hxtools-20170109/sdevel/.gitignore
--- old/hxtools-20150304/sdevel/.gitignore      2015-03-04 17:24:01.000000000 
+0100
+++ new/hxtools-20170109/sdevel/.gitignore      2017-01-09 22:38:54.000000000 
+0100
@@ -1,3 +1,4 @@
 /bin2c
 /cctypeinfo
+/gxxdm
 /peicon
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/sdevel/Makefile.am new/hxtools-20170109/sdevel/Makefile.am
--- old/hxtools-20150304/sdevel/Makefile.am     2015-03-04 17:24:01.000000000 
+0100
+++ new/hxtools-20170109/sdevel/Makefile.am     2017-01-09 22:38:54.000000000 
+0100
@@ -2,9 +2,10 @@
 
 AM_CPPFLAGS = ${regular_CPPFLAGS} ${libHX_CFLAGS}
 AM_CFLAGS   = ${regular_CFLAGS}
+AM_CXXFLAGS = ${regular_CXXFLAGS}
 
 bin_PROGRAMS = \
-       bin2c
+       bin2c gxxdm
 
 dist_bin_SCRIPTS = \
        checkbrack \
@@ -24,11 +25,12 @@
        diff2php \
        doxygen-kerneldoc-filter \
        git-blame-stats \
-       git-new-root \
        git-revert-stats \
        paddrspacesize \
        proc_stat_signal_decode \
        sourcefuncsize
 
 bin2c_LDADD = ${libHX_LIBS}
+gxxdm_SOURCES = gxxdm.cpp
+gxxdm_LDADD = ${libHX_LIBS}
 peicon_LDADD = ${libHX_LIBS}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/sdevel/git-forest new/hxtools-20170109/sdevel/git-forest
--- old/hxtools-20150304/sdevel/git-forest      2015-03-04 17:24:01.000000000 
+0100
+++ new/hxtools-20170109/sdevel/git-forest      2017-01-09 22:38:54.000000000 
+0100
@@ -110,7 +110,7 @@
                chomp $line;
                my($sha, $mini_sha, $parents, $msg) =
                        ($line =~ /^<(.*?)><(.*?)><(.*?)>(.*)/s);
-               my @next_sha = map { ($_) = /^<(.*?)>/ } @next_sha;
+               my @next_sha = map { ($_) = m{^<(.*?)>} } @next_sha;
                my @parents = split(" ", $parents);
 
                &vine_branch(\@vine, $sha);
@@ -135,6 +135,20 @@
        $Repo->command_close_pipe($fh, $fhc);
 }
 
+sub get_next_pick
+{
+       my $fh = shift @_;
+       while (defined(my $line = <$fh>)) {
+               if ($line =~ /^\s*#/) {
+                       next;
+               }
+               if ($line =~ /^\S+\s+(\S+)/) {
+                       return $2;
+               }
+       }
+       return undef;
+}
+
 sub get_refs
 {
        my($fh, $c) = $Repo->command_output_pipe("show-ref");
@@ -169,9 +183,12 @@
                if (open(my $act_fh, $Repo->repo_path().
                    "/rebase-merge/git-rebase-todo")) {
                        my($curr) = (<$act_fh> =~ /^\S+\s+(\S+)/);
-                       $curr = $Repo->command("rev-parse", $curr);
-                       chomp $curr;
-                       unshift(@{$ret->{$curr}}, "rebase/next");
+                       $curr = &get_next_pick($act_fh);
+                       if (defined($curr)) {
+                               $curr = $Repo->command("rev-parse", $curr);
+                               chomp $curr;
+                               unshift(@{$ret->{$curr}}, "rebase/next");
+                       }
                        close $act_fh;
                }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/sdevel/git-new-root 
new/hxtools-20170109/sdevel/git-new-root
--- old/hxtools-20150304/sdevel/git-new-root    2015-03-04 17:24:01.000000000 
+0100
+++ new/hxtools-20170109/sdevel/git-new-root    1970-01-01 01:00:00.000000000 
+0100
@@ -1,16 +0,0 @@
-#!/bin/bash
-#
-#      Start a new root commit (without a parent)
-#      written up by Jan Engelhardt, 2008
-#
-#      This program is free software; you can redistribute it and/or
-#      modify it under the terms of the WTF Public License version 2 or
-#      (at your option) any later version.
-
-if [[ -z "$1" ]]; then
-       echo "Need a branch name";
-       exit 1;
-fi;
-git symbolic-ref HEAD "refs/heads/$1";
-rm -f .git/index;
-git clean -df;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/sdevel/gxxdm.cpp new/hxtools-20170109/sdevel/gxxdm.cpp
--- old/hxtools-20150304/sdevel/gxxdm.cpp       1970-01-01 01:00:00.000000000 
+0100
+++ new/hxtools-20170109/sdevel/gxxdm.cpp       2017-01-09 22:38:54.000000000 
+0100
@@ -0,0 +1,341 @@
+/*
+ *     An educational piece-by-piece G++ symbol name demangler
+ *     in the style of wireshark's bytewise highlighting
+ *     Copyright by Jan Engelhardt, 2016
+ *
+ *     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
+ *     2 of the License, or (at your option) any later version.
+ *     For details, see the file named "LICENSE.GPL2".
+ */
+#include <list>
+#include <sstream>
+#include <string>
+#include <cctype>
+#include <cstdio>
+#include <libHX/string.h>
+
+struct seg {
+       size_t start, end;
+       std::string desc;
+       std::list<seg> sub;
+};
+
+static const char c_hi[] = "\e\1331;37;42m";
+static const char c_normal[] = "\e\1330m";
+
+static ssize_t dparse_type(std::list<seg> &, const char *, size_t);
+static ssize_t dparse_paramlist(std::list<seg> &, const char *, size_t, char = 
'\0');
+
+static ssize_t dparse_digitname(std::list<seg> &ast, const char *sym, size_t 
idx)
+{
+       size_t ndigit = strspn(sym + idx, "0123456789");
+       size_t nchar = 0;
+       size_t i = ndigit;
+
+       for (const char *p = sym + idx; i-- > 0; ++p) {
+               nchar *= 10;
+               nchar += *p - '0';
+       }
+       ast.push_back({idx, idx + ndigit, "length of name"});
+       if (strnlen(sym + idx, ndigit + nchar) < ndigit + nchar) {
+               /* not enough chars before end of string */
+               ast.push_back({idx + ndigit, idx + ndigit + nchar, "name 
(incomplete)"});
+               return -1;
+       }
+       ast.push_back({idx + ndigit, idx + ndigit + nchar, "name"});
+       return ast.rbegin()->end;
+}
+
+static ssize_t dparse_qual_mf(std::list<seg> &ast, const char *sym, size_t idx)
+{
+       for (; strchr("KORV", sym[idx]) != nullptr; ++idx) {
+               if (sym[idx] == 'K')
+                       ast.push_back({idx, idx + 1, "const qualifier for 
member function"});
+               else if (sym[idx] == 'O')
+                       ast.push_back({idx, idx + 1, "uref qualifier for member 
function"});
+               else if (sym[idx] == 'R')
+                       ast.push_back({idx, idx + 1, "ref qualifier for member 
function"});
+               else if (sym[idx] == 'O')
+                       ast.push_back({idx, idx + 1, "volatile qualifier for 
member function"});
+               else if (sym[idx] == 'r')
+                       ast.push_back({idx, idx + 1, "restrict qualifier for 
member function"});
+       }
+       return idx;
+}
+
+static ssize_t dparse_nspace(std::list<seg> &ast, const char *sym, size_t idx)
+{
+       ast.push_back({idx, idx, "nspace"});
+       if (sym[idx] != 'N')
+               return -1;
+       ++idx;
+       auto &tl = *ast.rbegin();
+       int ret = dparse_qual_mf(tl.sub, sym, idx);
+       if (ret < 0)
+               return ret;
+       idx = ret;
+       while (isdigit(sym[idx])) {
+               ret = dparse_digitname(tl.sub, sym, idx);
+               if (ret < 0)
+                       return ret;
+               idx = ret;
+       }
+       tl.end = idx;
+       if (sym[idx] != 'E')
+               return -1;
+       tl.end = ++idx;
+       return idx;
+}
+
+static ssize_t dparse_array(std::list<seg> &ast, const char *sym, size_t idx)
+{
+       if (sym[idx] != 'A')
+               return -1;
+       ast.push_back({idx, idx + 1, "array"});
+       auto &e_array = *ast.rbegin();
+       ++idx;
+       e_array.sub.push_back({idx, idx, "array size"});
+       auto &e_asize = *e_array.sub.rbegin();
+       size_t arsize = 0;
+       for (; isdigit(sym[idx]); ++idx) {
+               arsize *= 10;
+               arsize += sym[idx] - '0';
+       }
+       e_asize.end = idx;
+       e_array.end = idx;
+       if (sym[idx] != '_')
+               return -1;
+       e_array.end = ++idx;
+       return dparse_type(e_array.sub, sym, idx);
+}
+
+static ssize_t dparse_functype(std::list<seg> &ast, const char *sym, size_t 
idx)
+{
+       ast.push_back({idx, idx, "return type"});
+       auto &rt_type = *ast.rbegin();
+       int ret = dparse_type(rt_type.sub, sym, idx);
+       if (ret < 0)
+               return -1;
+       rt_type.end = idx = ret;
+
+       ret = dparse_paramlist(ast, sym, idx, 'E');
+       if (ret < 0)
+               return -1;
+       ast.rbegin()->end = idx = ret;
+       return idx;
+}
+
+static ssize_t dparse_type(std::list<seg> &ast, const char *sym, size_t idx)
+{
+       if (sym[idx] == 'r') ast.push_back({idx, idx + 1, "restrict"});
+       else if (sym[idx] == 'K') ast.push_back({idx, idx + 1, "const"});
+       else if (sym[idx] == 'P') ast.push_back({idx, idx + 1, "pointer to"});
+       else if (sym[idx] == 'R') ast.push_back({idx, idx + 1, "reference to"});
+       else if (sym[idx] == 'O') ast.push_back({idx, idx + 1, "uref to"});
+       else if (sym[idx] == 'V') ast.push_back({idx, idx + 1, "volatile"});
+       if (strchr("KOPRVr", sym[idx]) != NULL) {
+               auto &ptr = *ast.rbegin();
+               if (sym[idx+1] == '\0')
+                       return -1;
+               int ret = dparse_type(ptr.sub, sym, idx + 1);
+               if (ret < 0)
+                       return ret;
+               idx = ret;
+               return idx;
+       }
+       else if (sym[idx] == 'A') {
+               int ret = dparse_array(ast, sym, idx);
+               if (ret < 0)
+                       return ret;
+               idx = ret;
+               return idx;
+       }
+       else if (sym[idx] == 'F') {
+               ast.push_back({idx, idx + 1, "function"});
+               auto &ptr = *ast.rbegin();
+               if (sym[idx+1] == '\0')
+                       return -1;
+               int ret = dparse_functype(ptr.sub, sym, idx + 1);
+               if (ret < 0)
+                       return ret;
+               if (sym[ret] == 'E')
+                       ++ret;
+               ptr.end = ret;
+               return ret;
+       }
+       else if (isdigit(sym[idx])) {
+               int ret = dparse_digitname(ast, sym, idx);
+               if (ret < 0)
+                       return ret;
+               idx = ret;
+               return idx;
+       }
+       else if (sym[idx] == 'N') {
+               int ret = dparse_nspace(ast, sym, idx);
+               if (ret < 0)
+                       return ret;
+               idx = ret;
+               return idx;
+       }
+       else if (sym[idx] == 'D' && sym[idx+1] == 'a') { ast.push_back({idx, 
idx + 1, "auto"}); }
+       else if (sym[idx] == 'D' && sym[idx+1] == 'd') { ast.push_back({idx, 
idx + 1, "decimal64"}); }
+       else if (sym[idx] == 'D' && sym[idx+1] == 'e') { ast.push_back({idx, 
idx + 1, "decimal128"}); }
+       else if (sym[idx] == 'D' && sym[idx+1] == 'f') { ast.push_back({idx, 
idx + 1, "decimal32"}); }
+       else if (sym[idx] == 'D' && sym[idx+1] == 'h') { ast.push_back({idx, 
idx + 1, "half"}); }
+       else if (sym[idx] == 'D' && sym[idx+1] == 'i') { ast.push_back({idx, 
idx + 1, "char32_t"}); }
+       else if (sym[idx] == 'D' && sym[idx+1] == 'n') { ast.push_back({idx, 
idx + 1, "decltype(nullptr)"}); }
+       else if (sym[idx] == 'D' && sym[idx+1] == 's') { ast.push_back({idx, 
idx + 1, "char16_t"}); }
+       else if (sym[idx] == 'a') { ast.push_back({idx, idx + 1, "signed 
char"}); }
+       else if (sym[idx] == 'b') { ast.push_back({idx, idx + 1, "bool"}); }
+       else if (sym[idx] == 'c') { ast.push_back({idx, idx + 1, "char"}); }
+       else if (sym[idx] == 'd') { ast.push_back({idx, idx + 1, "double"}); }
+       else if (sym[idx] == 'e') { ast.push_back({idx, idx + 1, "long 
double"}); }
+       else if (sym[idx] == 'f') { ast.push_back({idx, idx + 1, "float"}); }
+       else if (sym[idx] == 'g') { ast.push_back({idx, idx + 1, 
"__float128"}); }
+       else if (sym[idx] == 'h') { ast.push_back({idx, idx + 1, "unsigned 
char"}); }
+       else if (sym[idx] == 'i') { ast.push_back({idx, idx + 1, "int"}); }
+       else if (sym[idx] == 'j') { ast.push_back({idx, idx + 1, "unsigned 
int"}); }
+       else if (sym[idx] == 'l') { ast.push_back({idx, idx + 1, "long"}); }
+       else if (sym[idx] == 'm') { ast.push_back({idx, idx + 1, "unsigned 
long"}); }
+       else if (sym[idx] == 'n') { ast.push_back({idx, idx + 1, "__int128"}); }
+       else if (sym[idx] == 'o') { ast.push_back({idx, idx + 1, "unsigned 
__int128"}); }
+       else if (sym[idx] == 's') { ast.push_back({idx, idx + 1, "short"}); }
+       else if (sym[idx] == 't') { ast.push_back({idx, idx + 1, "unsigned 
short"}); }
+       else if (sym[idx] == 'u') { ast.push_back({idx, idx + 1, "special: 
vendor type (unimplemented)"}); return -1; }
+       else if (sym[idx] == 'v') { ast.push_back({idx, idx + 1, "void"}); }
+       else if (sym[idx] == 'w') { ast.push_back({idx, idx + 1, "wchar_t"}); }
+       else if (sym[idx] == 'x') { ast.push_back({idx, idx + 1, "long long"}); 
}
+       else if (sym[idx] == 'y') { ast.push_back({idx, idx + 1, "unsigned long 
long"}); }
+       else if (sym[idx] == 'z') { ast.push_back({idx, idx + 1, "..."}); }
+       else {
+               return -1;
+       }
+       return ++idx;
+}
+
+static ssize_t dparse_paramlist(std::list<seg> &ast, const char *sym, size_t 
idx,
+    char endchar)
+{
+       ast.push_back({idx, idx, "parameter type list"});
+       auto &plist = *ast.rbegin();
+       while (sym[idx] != endchar && sym[idx] != '\0') {
+               int ret = dparse_type(plist.sub, sym, idx);
+               if (ret < 0)
+                       return ret;
+               idx = ret;
+       }
+       plist.end = idx;
+       return idx;
+}
+
+static ssize_t dparse_template1(std::list<seg> &ast, const char *sym, size_t 
idx)
+{
+       ast.push_back({idx, idx, "template"});
+       if (sym[idx] != 'I')
+               return -1;
+       auto &tl = *ast.rbegin();
+       tl.sub.push_back({idx, idx + 1, "template parameter list start 
marker"});
+       ++idx;
+       if (sym[idx] == '\0')
+               return -1;
+       ssize_t ret = dparse_paramlist(tl.sub, sym, idx, 'E');
+       if (ret < 0)
+               return ret;
+       idx = ret;
+       if (sym[idx] != 'E')
+               return -1;
+       tl.sub.push_back({idx, idx + 1, "template parameter list end marker"});
+       ++idx;
+
+       tl.sub.push_back({idx, idx, "return type"});
+       auto &rt_type = *tl.sub.rbegin();
+       ret = dparse_type(rt_type.sub, sym, idx);
+       if (ret < 0)
+               return ret;
+       idx = ret;
+       tl.end = rt_type.end = idx;
+
+       /* template means it's a function and MUST take params */
+       if (sym[idx] == '\0')
+               return -1;
+       return dparse_paramlist(ast, sym, idx);
+}
+
+static ssize_t dparse_z(std::list<seg> &ast, const char *sym, size_t idx)
+{
+       if (sym[idx] == 'N') {
+               int ret = dparse_nspace(ast, sym, idx);
+               if (ret < 0)
+                       return ret;
+               idx = ret;
+       } else if (isdigit(sym[idx])) {
+               int ret = dparse_digitname(ast, sym, idx);
+               if (ret < 0)
+                       return ret;
+               idx = ret;
+       } else {
+               return -1;
+       }
+       if (sym[idx] == 'I') {
+               int ret = dparse_template1(ast, sym, idx);
+               if (ret < 0)
+                       return ret;
+               idx = ret;
+       } else if (sym[idx] != '\0') {
+               int ret = dparse_paramlist(ast, sym, idx);
+               if (ret < 0)
+                       return ret;
+               idx = ret;
+       }
+       return idx;
+}
+
+static ssize_t dparse_start(std::list<seg> &ast, const char *sym, size_t idx)
+{
+       if (sym[idx] == '_' && sym[idx+1] == 'Z') {
+               ast.push_back({idx, idx + 2, "normal name marker"});
+               int ret = dparse_z(ast, sym, idx + 2);
+               if (ret < 0)
+                       return ret;
+       }
+       return 0;
+}
+
+static void dprint(const std::list<seg> &list, const char *sym, size_t depth = 
0)
+{
+       for (const auto &seg : list) {
+               printf("%.*s%s%.*s%s%s: %-*s%s\n",
+                       static_cast<int>(seg.start), sym,
+                       c_hi, static_cast<int>(seg.end - seg.start), sym + 
seg.start, c_normal,
+                       sym + seg.end,
+                       static_cast<int>(depth * 2), "", seg.desc.c_str());
+               if (seg.sub.size() > 0)
+                       dprint(seg.sub, sym, depth + 1);
+       }
+}
+
+static void demangle(const char *sym)
+{
+       printf("==== %s ====\n", sym);
+       std::list<seg> ast;
+       int ret = dparse_start(ast, sym, 0);
+       if (ret < 0)
+               printf("Demangle failed along the way\n");
+       dprint(ast, sym);
+}
+int main(int argc, const char **argv)
+{
+       if (argc == 1) {
+               hxmc_t *line = NULL;
+               while (HX_getl(&line, stdin) != NULL) {
+                       HX_chomp(line);
+                       demangle(line);
+               }
+       } else {
+               while (*++argv != NULL)
+                       demangle(*argv);
+       }
+       return EXIT_SUCCESS;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/sdevel/sourcefuncsize 
new/hxtools-20170109/sdevel/sourcefuncsize
--- old/hxtools-20150304/sdevel/sourcefuncsize  2015-03-04 17:24:01.000000000 
+0100
+++ new/hxtools-20170109/sdevel/sourcefuncsize  2017-01-09 22:38:54.000000000 
+0100
@@ -61,8 +61,9 @@
                \s*\*+\s* |             # returns pointer
                \s+                     # returns type
        )
-       (\w+)                           # function name
+       (\w+(?:::\w+)*)                           # function name
        \s*\(\s*.*?\s*\)                # function args
+       (?:\s*const)?
        \s*\{
 /xs;
 
@@ -98,6 +99,17 @@
                        if ($ln =~ m[^\s*#]so) {
                                push(@saved_seg, $cur_seg);
                                $cur_seg = "^pre";
+                       } elsif ($ln =~ m[^\s*/\*.*?\*/\s*$]so) {
+                               #
+                               # one-line /* */ comment, with no code
+                               #
+                               push(@saved_seg, $cur_seg);
+                               $cur_seg = "^cm";
+                       } elsif ($ln =~ m[/\*.*?\*/]so) {
+                               #
+                               # one-line /* */ comment, with possibly code in
+                               # the same line thus, do nothing here
+                               #
                        } elsif ($ln =~ m[^\s*//]so) {
                                push(@saved_seg, $cur_seg);
                                $cur_seg = "^cm";
@@ -108,11 +120,6 @@
                                push(@saved_seg, $cur_seg);
                                $cur_seg = "^lcm";
                                ++$seg_lcomm;
-                       } elsif ($ln =~ m[/\*.*?\*/]so) {
-                               #
-                               # one-line /* */ comment, with possibly code in
-                               # the same line thus, do nothing here
-                               #
                        } elsif ($ln =~ m[\*/]so) {
                                $seg_lcomm = 0;
                        } elsif ($Empty) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/sdevel/spec-beautifier 
new/hxtools-20170109/sdevel/spec-beautifier
--- old/hxtools-20150304/sdevel/spec-beautifier 2015-03-04 17:24:01.000000000 
+0100
+++ new/hxtools-20170109/sdevel/spec-beautifier 2017-01-09 22:38:54.000000000 
+0100
@@ -61,13 +61,13 @@
                print STDERR "$s->{pos}: Seen \"/usr/lib\". Consider replacing 
with \%_libdir or \%_libexecdir as appropriate.\n";
        }
        if (m</usr/lib64$PSTOP>) {
-               print STDERR "$s->{pos}: Seen \"/usr/lib64\". Consider fixing 
it.";
+               print STDERR "$s->{pos}: Seen \"/usr/lib64\". Consider fixing 
it.\n";
        }
        if (m{(?:^|\s)/lib$PSTOP}) {
                print STDERR "$s->{pos}: Seen \"/lib\". Consider replacing with 
\%_lib as appropriate.\n";
        }
        if (m{(?:^|\s)/lib64$PSTOP}) {
-               print STDERR "$s->{pos}: Seen \"/lib64\". Consider fixing it.";
+               print STDERR "$s->{pos}: Seen \"/lib64\". Consider fixing 
it.\n";
        }
 
        # Temporarily add {} to reduce following regexes
@@ -202,7 +202,7 @@
                        $s->{section} = $1;
                }
                &process_generic($s);
-               if ($s->{sectype} == "package") {
+               if ($s->{sectype} eq "package") {
                        &process_package();
                }
                if ($opt_diff_mode) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/smm/Makefile.am new/hxtools-20170109/smm/Makefile.am
--- old/hxtools-20150304/smm/Makefile.am        2015-03-04 17:24:01.000000000 
+0100
+++ new/hxtools-20170109/smm/Makefile.am        2017-01-09 22:38:54.000000000 
+0100
@@ -12,7 +12,7 @@
 endif
 
 dist_bin_SCRIPTS = \
-       googtts gpsh move_moov ssa2srt
+       aumeta googtts gpsh mkvappend ssa2srt
 
 pkglibexec_PROGRAMS = \
        bsvplay \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/smm/aumeta new/hxtools-20170109/smm/aumeta
--- old/hxtools-20150304/smm/aumeta     1970-01-01 01:00:00.000000000 +0100
+++ new/hxtools-20170109/smm/aumeta     2017-01-09 22:38:54.000000000 +0100
@@ -0,0 +1,98 @@
+#!/usr/bin/perl
+
+use Getopt::Long;
+use IPC::Open3;
+our $strip_video = 0;
+our %meta;
+&Getopt::Long::Configure(qw(bundling));
+&GetOptions(
+       "n" => \$strip_video,
+       "t=s" => \$meta{title},
+       "a=s" => \$meta{artist},
+       "l=s" => \$meta{album},
+       "G=s" => \$meta{genre},
+       "N=s" => \$meta{track},
+       "d=s" => \$meta{date},
+       "m=s" => \%meta,
+);
+&main();
+
+sub main
+{
+       foreach my $file (@ARGV) {
+               &moov_one_file($file);
+       }
+}
+
+sub moov_one_file
+{
+       my $input = shift @_;
+       local(*CIN, *COUT);
+       my @args = ("ffmpeg", "-i", $input, "-acodec", "copy");
+       push(@args, $strip_video ? "-vn" : ("-vcodec", "copy"));
+       foreach my $key (keys %meta) {
+               if (defined($meta{$key})) {
+                       push(@args, "-metadata", "$key=$meta{$key}");
+               }
+       }
+
+       my $tmpfile = "~\$~$$.moov.mp4";
+       # must be in same filesystem for rename() to succeed, so don't use /tmp
+       my @targs = ("-moov_size", 4, "-y", $tmpfile);
+       print STDERR "*** Running ", join(" ", @args, @targs), "\n";
+       my $pid = open3(\*CIN, \*COUT, \*COUT, @args, @targs);
+       close CIN;
+
+       my $moov_size = 4 + &moov_get_extra(\*COUT);
+       waitpid($pid, 0);
+       my $status = $? >> 8;
+       close COUT;
+
+       # Run with exact moov_size
+       print "$input: moov_size=$moov_size\n";
+       my @targs = ("-moov_size", $moov_size, "-y", $tmpfile);
+       print STDERR "*** Running ", join(" ", @args, @targs), "\n";
+       $pid = open3(\*CIN, \*COUT, \*COUT,
+              @args, "-moov_size", $moov_size, "-y", $tmpfile);
+       close CIN;
+       while (defined(my $line = <COUT>)) {
+       }
+       close COUT;
+       waitpid($pid, 0);
+       $status = $? >> 8;
+       if ($status != 0) {
+               print STDERR "$input: 2nd stage error\n";
+               return;
+       }
+
+       # Set filetimes to original
+       my @stat = stat($input);
+       if (!utime($stat[8], $stat[9], $tmpfile)) {
+               print STDERR "$input: could not set utimes on temporary file 
$tmpfile: $!\n";
+               return;
+       }
+       if (!rename($tmpfile, $input)) {
+               print STDERR "$input: could not move temporary file $tmpfile 
back: $!\n";
+               return;
+       }
+       return 1;
+}
+
+sub moov_get_extra
+{
+       local *FH = shift @_;
+       my $extra = 0;
+       my $seen = undef;
+
+       while (defined(my $line = <FH>)) {
+               if ($line =~ /reserved_moov_size is too small, needed (\d+) 
additional/) {
+                       $seen = 1;
+                       $extra = $1;
+                       last;
+               }
+       }
+       if (!$seen) {
+               return undef;
+       }
+       return $extra;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/smm/gpsh new/hxtools-20170109/smm/gpsh
--- old/hxtools-20150304/smm/gpsh       2015-03-04 17:24:01.000000000 +0100
+++ new/hxtools-20170109/smm/gpsh       2017-01-09 22:38:54.000000000 +0100
@@ -115,8 +115,8 @@
 
        print "[$$] Index has ", scalar(keys %$index), " entries\n";
        foreach my $arg (@$argv) {
-               push(@$queue, grep {
-                       $_ =~ /$arg/i &&
+               push(@$queue, sort grep {
+                       ($_ =~ /$arg/i || $arg eq $index->{$_}->{file}) &&
                        (!$opt_nomixes || !exists($index->{$_}->{"ofs"}))
                } keys %$index);
        }
@@ -169,7 +169,7 @@
 {
        my $ext = lc shift @_;
 
-       foreach my $t (qw(.it .s3m .xm .mod .xm2 .j2b)) {
+       foreach my $t (qw(.it .s3m .xm .mod .xm2 .j2b .psm)) {
                if ($ext eq $t) {
                        return 1;
                }
@@ -197,12 +197,7 @@
                my $ext = &filename_ext($file);
                $ext = lc $ext;
 
-               # A lyr file for a version may be available in a basename
-               my $title2 = $title;
-               $title2 =~ s{\s+\(.*?\)$}{};
-               if (-e "$title.lyr" || -e "$title2.lyr") {
-                       print STDERR "\e[1;32m[lyr]\e[0m "; # ]]
-               }
+               &print_lyr($title);
                print STDERR "\e[1;31m$title\e[0m\n"; # ]]
                if (&filename_timidity($ext)) {
                        # my $t = $opt_verbose ? "t" : "";
@@ -226,16 +221,44 @@
        }
 }
 
+sub print_lyr
+{
+       # A lyr file for a version may be available in a basename.
+       # If so, print a line notifying about its existence.
+       my $title = shift @_;
+       my $title2 = $title;
+       do {
+               if (-e "$title2.lyr") {
+                       print STDERR "\e[1;32m[lyr]\e[0m "; # ]]
+                       return;
+               }
+       } while ($title2 =~ s{\s*(?:\([^\)]+\)|\[[^\]]+\])$}{});
+       if (-e "$title.lyr") {
+               print STDERR "\e[1;32m[lyr]\e[0m "; # ]]
+       }
+}
+
 sub workaround_mp3vbr
 {
-       # MPlayer cannot properly seek in MP3 VBR streams.
-       # Create an index file...
+       # MP3 ABR/VBR files have no seek index. Players fall back to computing
+       # the position using CBR semantics. (That is faster than reindexing it
+       # *everytime*, and thus a reasonable default.) However, accessing mixes
+       # requires a functional seek index, so reindex the audio file *and
+       # keep it* (which players doing on-the-fly-reindex don't - which would
+       # make it even more costly).
        my $ifile = shift @_;
        my $ofile = $ifile;
        my $tmpdir = "/tmp/psh.$>";
+       my @stat = stat($ifile);
 
-       $ofile =~ s{/}{__}gs;
-       $ofile = "$tmpdir/$ofile";
+       if (!defined($stat[0])) {
+               return $ifile;
+       }
+       #
+       # Use a path-independent name, so that gpsh can be run from
+       # subdirectories and not cause remuxing a file.
+       #
+       $ofile = "$tmpdir/$stat[0].$stat[1]";
        if (-e $ofile) {
                return $ofile;
        }
@@ -325,8 +348,8 @@
                if (&filename_meta($ext)) {
                        next;
                }
-               my $title = $file;
-               #my $title = &filename_nonext($file);
+               my $title = &filename_nonext($file);
+               # Collect with extension to enable tabbing on the shell
                $track_list->{$title} = {"file" => $file};
        }
 
@@ -337,8 +360,10 @@
                        next;
                }
 
-               # Mark this title as being a mix and/or part of a mix
-               my $parent_title = $af; #&filename_nonext($af);
+               # Mark this title as being a mix and/or part of a mix.
+               # In this case, we do not want the extension,
+               # to facilitate grepping for e.g. "mix 01,02".
+               my $parent_title = &filename_nonext($af);
                $track_list->{$parent_title}->{"ofs"} = 0;
 
                if (!open(FH, "< $file")) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/smm/mkvappend new/hxtools-20170109/smm/mkvappend
--- old/hxtools-20150304/smm/mkvappend  1970-01-01 01:00:00.000000000 +0100
+++ new/hxtools-20170109/smm/mkvappend  2017-01-09 22:38:54.000000000 +0100
@@ -0,0 +1,11 @@
+#!/bin/bash -e
+outfile="$1"
+shift
+a=("$1")
+shift
+j=0
+for i in "$@"; do
+       j=$[$j+1]
+       a[j]="+$i"
+done
+exec mkvmerge -o "$outfile" "${a[@]}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/smm/move_moov new/hxtools-20170109/smm/move_moov
--- old/hxtools-20150304/smm/move_moov  2015-03-04 17:24:01.000000000 +0100
+++ new/hxtools-20170109/smm/move_moov  1970-01-01 01:00:00.000000000 +0100
@@ -1,79 +0,0 @@
-#!/usr/bin/perl
-
-use Getopt::Long;
-use IPC::Open3;
-our $novideo = 0;
-&Getopt::Long::Configure(qw(bundling));
-&GetOptions("n" => \$novideo);
-&main();
-
-sub main
-{
-       foreach my $file (@ARGV) {
-               &moov_one_file($file);
-       }
-}
-
-sub moov_one_file
-{
-       my $input = shift @_;
-       local(*CIN, *COUT);
-       my $pid = open3(\*CIN, \*COUT, \*COUT,
-               "ffmpeg", "-i", $input, "-acodec", "copy",
-               $novideo ? ("-vn") : ("-vcodec", "copy"),
-               "-moov_size", "4", "-y", ".moov.mp4");
-       close CIN;
-
-       my $moov_size = 4 + &moov_get_extra(\*COUT);
-       waitpid($pid, 0);
-       my $status = $? >> 8;
-       close COUT;
-
-       # Run with exact moov_size
-       print "$input: moov_size=$moov_size\n";
-       $pid = open3(\*CIN, \*COUT, \*COUT,
-               "ffmpeg", "-i", $input, "-acodec", "copy",
-               $novideo ? ("-vn") : ("-vcodec", "copy"),
-               "-moov_size", $moov_size, "-y", ".moov.mp4");
-       close CIN;
-       while (defined(my $line = <COUT>)) {
-       }
-       close COUT;
-       waitpid($pid, 0);
-       my $status = $? >> 8;
-       if ($status != 0) {
-               print STDERR "$input: 2nd stage error\n";
-               return;
-       }
-
-       # Set filetimes to original
-       my @stat = stat($input);
-       if (!utime($stat[8], $stat[9], ".moov.mp4")) {
-               print STDERR "$input: could not set utimes on temporary file: 
$!\n";
-               return;
-       }
-       if (!rename(".moov.mp4", $input)) {
-               print STDERR "$input: could not move temporary file back: $!\n";
-               return;
-       }
-       return 1;
-}
-
-sub moov_get_extra
-{
-       local *FH = shift @_;
-       my $extra = 0;
-       my $seen = undef;
-
-       while (defined(my $line = <FH>)) {
-               if ($line =~ /reserved_moov_size is too small, needed (\d+) 
additional/) {
-                       $seen = 1;
-                       $extra = $1;
-                       last;
-               }
-       }
-       if (!$seen) {
-               return undef;
-       }
-       return $extra;
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/smm/qplay.c new/hxtools-20170109/smm/qplay.c
--- old/hxtools-20150304/smm/qplay.c    2015-03-04 17:24:01.000000000 +0100
+++ new/hxtools-20170109/smm/qplay.c    2017-01-09 22:38:54.000000000 +0100
@@ -136,6 +136,7 @@
 
 /**
  * parse_arg_n - play a note value
+ * (The values 0..85 are related to MIDI notes.)
  */
 static unsigned int parse_arg_n(const char *origptr)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/suser/Makefile.am new/hxtools-20170109/suser/Makefile.am
--- old/hxtools-20150304/suser/Makefile.am      2015-03-04 17:24:01.000000000 
+0100
+++ new/hxtools-20170109/suser/Makefile.am      2017-01-09 22:38:54.000000000 
+0100
@@ -12,7 +12,7 @@
 
 dist_bin_SCRIPTS = \
        fxterm \
-       pesubst \
+       pegrep pesubst qpdecode \
        rot13 \
        qtar \
        wktimer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/suser/pegrep new/hxtools-20170109/suser/pegrep
--- old/hxtools-20150304/suser/pegrep   1970-01-01 01:00:00.000000000 +0100
+++ new/hxtools-20170109/suser/pegrep   2017-01-09 22:38:54.000000000 +0100
@@ -0,0 +1,90 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+our($grepcolor, $filecolor, $coloncolor, $linenocolor, $stopcolor) = 
($ENV{"GREP_COLOR"});
+
+&main();
+
+sub goback
+{
+       my($s, $start) = @_;
+       if ($start == 0) {
+               return 0;
+       }
+       my $of = rindex($$s, "\n", $start - 1);
+       if ($of <= 0) {
+               return 0;
+       }
+       $of = rindex($$s, "\n", $of - 1);
+       return ($of <= 0) ? 0 : $of;
+}
+
+sub gofwd
+{
+       my($s, $start) = @_;
+       my $max = length($$s);
+       if ($start >= $max) {
+               return $max;
+       }
+       my $of = index($$s, "\n", $start);
+       if ($of < 0 || $of >= $max) {
+               return $max;
+       }
+       $of = index($$s, "\n", $of + 1);
+       return ($of < 0 || $of >= $max) ? $max : $of;
+}
+
+sub nlcount
+{
+       my $tmp = shift @_;
+       return $tmp =~ tr/\n//;
+}
+
+sub main
+{
+       my $pattern = shift @ARGV;
+       if (length($grepcolor) > 0) {
+               $grepcolor = "\x1b\x5b${grepcolor}m";
+               $filecolor = "\x1b\x5b35m";
+               $coloncolor = "\x1b\x5b1;30m";
+               $linenocolor = "\x1b\x5b36m";
+               $stopcolor = "\x1b\x5b0m";
+       }
+       foreach my $file (@ARGV) {
+               &dofile($file, $pattern);
+       }
+}
+
+sub dofile
+{
+       my($file, $pattern) = @_;
+       local *FH;
+
+       open(FH, "< $file");
+       my @lines = <FH>;
+       close FH;
+       my $data = join("", @lines);
+       while ($data =~ m{$pattern}gs) {
+               my $mainofs   = $-[0];
+               my $postofs   = $+[0];
+               my $mainlen   = $postofs - $mainofs;
+               my $leadofs   = &goback(\$data, $mainofs);
+               my $endofs    = &gofwd(\$data, $postofs);
+               my $linestart = 1 + &nlcount(substr($data, 0, $mainofs));
+               my $lineend   = $linestart + &nlcount(substr($data, $mainofs, 
$mainlen));
+               print "$filecolor$file$stopcolor";
+               print "$coloncolor:$stopcolor";
+               print "$linenocolor$linestart$stopcolor";
+               print "$coloncolor→$stopcolor";
+               print "$linenocolor$lineend$stopcolor";
+               print "$coloncolor:$stopcolor";
+               print substr($data, $leadofs, $mainofs - $leadofs);
+               # because less -R does not support color across \n
+               my $main = substr($data, $mainofs, $mainlen);
+               $main =~ s{\n}{$stopcolor\n$grepcolor}g;
+               print $grepcolor, $main, $stopcolor;
+               print substr($data, $postofs, $endofs - $postofs);
+               print "\n";
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/suser/qpdecode new/hxtools-20170109/suser/qpdecode
--- old/hxtools-20150304/suser/qpdecode 1970-01-01 01:00:00.000000000 +0100
+++ new/hxtools-20170109/suser/qpdecode 2017-01-09 22:38:54.000000000 +0100
@@ -0,0 +1,2 @@
+#!/usr/bin/perl -lp
+s{=(..)}{pack("H*",$1)}egs;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/hxtools-20150304/suser/settime.pl new/hxtools-20170109/suser/settime.pl
--- old/hxtools-20150304/suser/settime.pl       1970-01-01 01:00:00.000000000 
+0100
+++ new/hxtools-20170109/suser/settime.pl       2017-01-09 22:38:54.000000000 
+0100
@@ -0,0 +1,85 @@
+#!/usr/bin/perl
+
+use strict;
+
+&main();
+
+sub oldest_among
+{
+       my $age = 0;
+       my @sb;
+
+       foreach $_ (@_) {
+               @sb = stat($_);
+               if ($sb[9] > $age) {
+                       $age = $sb[9];
+               }
+       }
+
+       return $age;
+}
+
+sub set_arc_time
+{
+       my $file = shift @_;
+
+       system "rm", "-Rf", "tmp";
+       mkdir("tmp") || die "mkdir tmp: $!";
+       chdir("tmp") || die "chdir tmp: $!";
+
+       my $ret = 0;
+       if ($file =~ /\.zip$/i) {
+               $ret = system("unzip", "-q", "../$file");
+       } elsif ($file =~ /\.7z$/i) {
+               $ret = system("7z", "x", "../$file");
+       } elsif ($file =~ /\.rar$/i) {
+               $ret = system("unrar", "x", "-inul", "../$file");
+       } elsif ($file =~ /\.tar.gz$/i) {
+               $ret = system("tar", "-xzf", "../$file");
+       } elsif ($file =~ /\.cab$/i) {
+               $ret = system("cabextract", "-q", "../$file");
+       } else {
+               print "\e[31m", "Unknown archive format", "\e[0m\n"; # ]]
+       }
+
+       if ($ret != 0) {
+               print "\e[31m", "Unpack $file failed", "\e[0m\n"; # ]]
+       }
+
+       chomp(@_ = `find -type f`);
+       my $age = &oldest_among(@_);
+
+       chdir("..") || die "chdir ..: $!";
+       system "rm", "-Rf", "tmp";
+
+       if ($age > 0) {
+               print "\e[36m", "Setting $file to ", scalar(localtime($age)), 
"\e[0m\n"; # ]]
+               utime(time(), $age, $file);
+       } else {
+               print "\e[33m", "age = 0", "\e[0m\n"; # ]]
+       }
+}
+
+sub main
+{
+       foreach my $version (grep { -d $_ } glob("*"))
+       {
+               chdir($version) || die "chdir $version: $!";
+               print "\e[1m", $version, "\e[0m\n"; # ]]
+
+               my @list = grep { -f $_ && $_ !~ /\.(rpm|bz2)$/ } glob("*");
+               foreach my $file (@list) {
+                       print "\e[32m", "$file", "\e[0m\n"; # ]]
+                       &set_arc_time($file);
+               }
+
+               my $age = &oldest_among(@list);
+               if ($age > 0) {
+                       print "\e[36m", "Setting $version to ", 
scalar(localtime($age)), "\e[0m\n"; # ]]
+                       utime(time(), $age, ".");
+               } else {
+                       print "\e[33m", "age = 0", "\e[0m\n"; # ]]
+               }
+               chdir("..") || die "chdir ..: $!";
+       }
+}

++++++ hxtools.keyring ++++++
--- /var/tmp/diff_new_pack.ghiWHA/_old  2017-01-17 14:34:55.521672699 +0100
+++ /var/tmp/diff_new_pack.ghiWHA/_new  2017-01-17 14:34:55.521672699 +0100
@@ -1,129 +1,91 @@
-pub   4096R/19FC338D 2011-05-09 [expires: 2016-05-07]
-uid                  Jan Engelhardt <jeng...@gmx.de>
-sub   4096R/C66DD881 2011-05-09 [expires: 2016-05-07]
-sub   4096g/34C483D3 2011-05-09 [expires: 2016-05-07]
-sub   3072D/68A20E45 2011-05-09 [expires: 2016-05-07]
+pub   4096R/0xA28BDFEEB5A2B2FF 2015-05-07 [expires: 2020-08-08]
+      Key fingerprint = 2F8B FE96 D14F 8B56 0FBC  1F1D A28B DFEE B5A2 B2FF
+uid                 [ unknown] Jan Engelhardt <jeng...@inai.de>
+sub   4096R/0xB927458717B4ECED 2015-05-07 [expires: 2020-08-08]
+sub   4096R/0x6A3933DA297DFB7D 2015-05-07 [expires: 2020-08-08]
 
 -----BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v2.0.19 (GNU/Linux)
 
-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
-=ZosZ
+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
+cCAy
+=ePMx
 -----END PGP PUBLIC KEY BLOCK-----


Reply via email to