gitdiffdir: git diff between two dirs.

This commit is contained in:
Ole Tange 2024-08-06 01:06:11 +02:00
parent 3be8b564cb
commit ab5791e738
5 changed files with 115 additions and 17 deletions

13
G/G
View file

@ -99,6 +99,7 @@ B<grep>
my $i = 0; my $i = 0;
my @add_X; my @add_X;
# Make groups of grep options: -v foo -v -i bar => [-v foo] [-v -i bar]
for(@ARGV) { for(@ARGV) {
if($_ eq "-g") { if($_ eq "-g") {
# -g = recursive-and file grep # -g = recursive-and file grep
@ -122,6 +123,7 @@ for(@ARGV) {
} }
if($opt::g and @cmd) { if($opt::g and @cmd) {
# -g => search files
sub gitdir { sub gitdir {
# Find .git dir somewhere in parent # Find .git dir somewhere in parent
my $dir = shift; my $dir = shift;
@ -140,23 +142,28 @@ if($opt::g and @cmd) {
`find "$dir" -type f -print0 | xargs -0 cat >/dev/null`; `find "$dir" -type f -print0 | xargs -0 cat >/dev/null`;
} }
my $a = shift @cmd; my $a = shift @cmd;
# -v => Use -L instead of -l
my $l_or_L = (grep /^-v$/, @$a) ? "L" : "l";
@$a = (grep { not /^-v$/ } @$a);
my $gitdir = gitdir("."); my $gitdir = gitdir(".");
if($gitdir) { if($gitdir) {
cache_gitdir($gitdir); cache_gitdir($gitdir);
$run = 'git grep --threads 30 -l '.shell_quote(@$a); $run = "git grep --threads 30 -$l_or_L ".shell_quote(@$a);
} else { } else {
$run = 'find . -type f | parallel --lb -Xq grep -l '.shell_quote(@$a); $run = "find . -type f | parallel --lb -Xq grep -$l_or_L ".shell_quote(@$a);
} }
if(@cmd) { if(@cmd) {
$run .= '|' . $run .= '|' .
join"|", map { 'xargs -d"\n" grep -l '. join"|", map { 'xargs -d"\n" grep -'.$l_or_L.' '.
join(" ", shell_quote(@$_)) } @cmd; join(" ", shell_quote(@$_)) } @cmd;
} }
exec $run; exec $run;
} elsif(@cmd) { } elsif(@cmd) {
# => search stdin
exec join"|", map { "grep ".join(" ", shell_quote(@$_)) } @cmd; exec join"|", map { "grep ".join(" ", shell_quote(@$_)) } @cmd;
} else { } else {
# no options => cat
exec 'cat'; exec 'cat';
} }

View file

@ -1,23 +1,25 @@
CMD = 2grep 2search audioping blink burncpu bwlimit clipboard drac \ CMD = 2grep 2search audioping blink burncpu bwlimit clipboard drac \
duplicate-packets em emoticons encdir fanspeed field \ duplicate-packets em emoticons encdir fanspeed field \
find-first-fail find-optimal forever ft-udvalg fxkill G \ find-first-fail find-optimal forever ft-udvalg fxkill G \
gitnext gitundo goodpasswd histogram Loffice mtrr mirrorpdf \ gitdiffdir gitedit gitnext gitundo goodpasswd histogram \
neno not off pdfman pidcmd pidtree plotpipe puniq ramusage \ Loffice mtrr mirrorpdf neno not off pdfman pidcmd pidtree \
rand rclean rina rn rrm seekmaniac shython sound-reload \ plotpipe puniq ramusage rand rclean rina rn rrm seekmaniac \
splitvideo stdout swapout T teetime timestamp tracefile \ shython sound-reload splitvideo stdout swapout T teetime \
transpose upsidedown vid w4it-for-port-open whitehash \ timestamp tracefile transpose upsidedown vid \
wifi-reload wssh youtube-lbry ytv yyyymmdd w4it-for-port-open whitehash wifi-reload wssh youtube-lbry \
ytv yyyymmdd
all: 2search/2grep.1 2search/2search.1 blink/blink.1 \ all: 2search/2grep.1 2search/2search.1 blink/blink.1 \
burncpu/burncpu.1 bwlimit/bwlimit.1 clipboard/clipboard.1 \ burncpu/burncpu.1 bwlimit/bwlimit.1 clipboard/clipboard.1 \
drac/drac.1 encdir/encdir.1 fanspeed/fanspeed.1 field/field.1 \ drac/drac.1 encdir/encdir.1 fanspeed/fanspeed.1 field/field.1 \
find-first-fail/find-first-fail.1 find-optimal/find-optimal.1 \ find-first-fail/find-first-fail.1 find-optimal/find-optimal.1 \
ft-udvalg/ft-udvalg.1 G/G.1 gitnext/gitnext.1 \ ft-udvalg/ft-udvalg.1 G/G.1 gitdiffdir/gitdiffdir.1 \
gitundo/gitundo.1 goodpasswd/goodpasswd.1 \ gitedit/gitedit.1 gitnext/gitnext.1 gitundo/gitundo.1 \
histogram/histogram.1 mirrorpdf/mirrorpdf.1 neno/neno.1 \ goodpasswd/goodpasswd.1 histogram/histogram.1 \
off/off.1 pdfman/pdfman.1 pidcmd/pidcmd.1 pidtree/pidtree.1 \ mirrorpdf/mirrorpdf.1 neno/neno.1 off/off.1 pdfman/pdfman.1 \
plotpipe/plotpipe.1 puniq/puniq.1 rand/rand.1 rina/rina.1 \ pidcmd/pidcmd.1 pidtree/pidtree.1 plotpipe/plotpipe.1 \
rn/rn.1 rrm/rrm.1 seekmaniac/seekmaniac.1 shython/shython.1 \ puniq/puniq.1 rand/rand.1 rina/rina.1 rn/rn.1 rrm/rrm.1 \
seekmaniac/seekmaniac.1 shython/shython.1 \
sound-reload/sound-reload.1 splitvideo/splitvideo.1 \ sound-reload/sound-reload.1 splitvideo/splitvideo.1 \
stdout/stdout.1 teetime/teetime.1 timestamp/timestamp.1 \ stdout/stdout.1 teetime/teetime.1 timestamp/timestamp.1 \
tracefile/tracefile.1 transpose/transpose.1 T/T.1 \ tracefile/tracefile.1 transpose/transpose.1 T/T.1 \

2
README
View file

@ -28,6 +28,8 @@ ft-udvalg - Download udvalgsmembers from folketing.dk as ODS.
G - shorthand for multi level grep. G - shorthand for multi level grep.
gitdiffdir - git diff between two dirs.
gitedit - edit last 10 commits. gitedit - edit last 10 commits.
gitnext - checkout next revision. Opposite of 'checkout HEAD^'. gitnext - checkout next revision. Opposite of 'checkout HEAD^'.

View file

@ -174,7 +174,7 @@ for udv, member_list in udv_members.items():
for member in member_list: for member in member_list:
if member["biopage"] not in members: if member["biopage"] not in members:
members[member["biopage"]] = {"biopage": member["biopage"]} members[member["biopage"]] = {"biopage": member["biopage"]}
members[member["biopage"]][udv.upper()] = "X" # Mark membership members[member["biopage"]][udv.upper()] = 1 # Mark membership
# Extract additional data for each unique member # Extract additional data for each unique member
for member in members.values(): for member in members.values():

87
gitdiffdir/gitdiffdir Executable file
View file

@ -0,0 +1,87 @@
#!/bin/bash
: <<=cut
=pod
=head1 NAME
gitdiffdir - git diff, but between two dirs in different repositories
=head1 SYNOPSIS
gitdiffdir dir1 dir2
=head1 DESCRIPTION
B<git diff> only looks at tracked files. B<git diff dir1 dir2>
includes all untracked files.
B<gitdiffdir> tries to simulate B<git diff> but on two dirs in
different repositories.
=head1 EXAMPLES
Diff dirs with the same name:
gitdiffdir myproject/mydir1 myoldproject/mydir1
Diff dirs with the different names:
gitdiffdir myproject/mydir1 myoldproject/mydir2
=head1 AUTHOR
Copyright (C) 2024 Ole Tange,
http://ole.tange.dk and Free Software Foundation, Inc.
=head1 LICENSE
Copyright (C) 2012 Free Software Foundation, Inc.
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 3 of the License, or
at your option any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
=head1 DEPENDENCIES
B<gitdiffdir> uses B<git>, B<parallel>, B<sort>.
=head1 SEE ALSO
B<git>
=cut
dirA="$1"
dirB="$2"
stdout() {
if [ -t 1 ] ; then
# STDOUT = terminal
# use less
less
else
cat
fi
}
parallel -0 'cd {} && git ls-files' ::: "$dirA" "$dirB" | sort -u |
parallel -q diff -Naur "$dirA"/{} "$dirB"/{} | stdout