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 - jengelh@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
+
+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) {
- 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
-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
+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-----