commit hxtools for openSUSE:Factory
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 <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 <jengelh@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 <jengelh@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-----
participants (1)
-
root@hilbertn.suse.de