From 03d827e2fbc409ef97829f25b8eeca5204f81a3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Mon, 12 Jul 2021 13:24:49 +0200 Subject: Re-organize files --- git/git-bdiff | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ git/git-orig | 20 ++++++++++++++++++++ git/git-s | 20 ++++++++++++++++++++ git/git-st | 31 +++++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100755 git/git-bdiff create mode 100755 git/git-orig create mode 100755 git/git-s create mode 100755 git/git-st (limited to 'git') diff --git a/git/git-bdiff b/git/git-bdiff new file mode 100755 index 0000000..9b39ad4 --- /dev/null +++ b/git/git-bdiff @@ -0,0 +1,51 @@ +#!/usr/bin/perl + +# git-bdiff -- fake compare binary files + +use strict; +use warnings; + +my $i; + +if (@ARGV == 1) { + $i = 0; +} elsif (@ARGV == 7) { + $i = 4; +} else { + die <) { + # explicit + if (/^\Q$target\E:\s*(.*)/) { + push @deps, "$repo/$path$_" for split /\s/, $1; + last; + } + # implicit + if (/^\.([^ .]+)\.\Q$ext\E\s*:\s*(.*)/) { + push @deps, "$repo/$path$basename.$1"; + push @deps, "$repo/$path$_" for split /\s/, $2; + last; + } +} +close $f; +die "no dependencies found, cannot compare\n" if not @deps; + +$i = 0; +for (`git diff HEAD -- @deps`) { + print if @ARGV == 7; + $i = 1; +} +exit $i if @ARGV == 1; diff --git a/git/git-orig b/git/git-orig new file mode 100755 index 0000000..a792390 --- /dev/null +++ b/git/git-orig @@ -0,0 +1,20 @@ +#!/bin/sh + +# git-orig -- checkout original file + +[ $# -lt 2 ] && { echo "usage: $0 head file [...]" 1>&2; exit 1; } + +h=$1 +shift +set -e + +for f in "$@"; do + mv -i "$f" "$f".new +done + +git checkout "$h" -- "$@" + +for f in "$@"; do + mv -i "$f" "$f".orig + mv "$f".new "$f" +done diff --git a/git/git-s b/git/git-s new file mode 100755 index 0000000..faf55ff --- /dev/null +++ b/git/git-s @@ -0,0 +1,20 @@ +#!/bin/sh + +# git-s -- selection-friendly git-status + +git status -s | perl -ne ' + push @{$x{$1}}, $2 if /^(.). (.*)/; + push @{$y{$1}}, $2 if /^.(.) (.*)/; + END { + delete $x{"?"}; delete $x{" "}; delete $y{" "}; + for (["index" => \%x], ["tree" => \%y]) { + ($n, $h) = @$_; + print "$n:" if values %$h; + for (sort keys %$h) { + print " $_ "; + print " $_" for @{$h->{$_}}; + print "\n"; + } + } + } +' diff --git a/git/git-st b/git/git-st new file mode 100755 index 0000000..8edae3f --- /dev/null +++ b/git/git-st @@ -0,0 +1,31 @@ +#!/usr/bin/perl + +# git-st -- show git status (but handle binary files correctly) + +open $p, '-|', 'git', '-c', 'color.status=always', 'status', @ARGV + or die "$!\n"; +chomp($g = `git rev-parse --show-toplevel`); + +while (<$p>) { + if (/^Changes not staged for commit:$/ .. /^$/) { + if (/modified:\s+(.*\.pdf)/) { + $f = "$ENV{PWD}/$1"; + $f =~ s,^\Q$g\E/?,,; + $f =~ s/'/'"'"'/g; + `git-bdiff '$f'`; + if ($?) { + $mbuf .= $_; + $mod = 1; + } + } else { + $mod = 1 if not $mod and /[^t]:\s+/; + $mbuf .= $_; + } + $buf .= $mbuf if /^$/ and $mod; + } else { + $buf .= $_; + } +} + +close $p; +print $buf; -- cgit v1.2.3