tangetools/gitdiffdir/gitdiffdir
2024-08-17 22:54:26 +02:00

120 lines
2.5 KiB
Bash
Executable file

#!/bin/bash
: <<=cut
=pod
=head1 NAME
gitdiffdir - git diff, but between two dirs in different repositories
=head1 SYNOPSIS
B<gitdiffdir> [I<diff options>] I<dir1> [I<dir2>]
=head1 DESCRIPTION
B<git diff> only looks at tracked files. B<git diff> I<dir1 dir2>
includes all untracked files.
B<gitdiffdir> tries to simulate B<git diff> by only looking at tracked
files but on two dirs in different repositories.
=head1 OPTIONS
B<gitdiffdir> passes options to B<diff>. Default: B<-Naur>
I<dir2> defaults to .
=head1 EXAMPLES
Diff dirs with the same name:
gitdiffdir myproject/mydir1 myoldproject/mydir1
Diff dirs with the different names:
gitdiffdir myproject/mydir1 myoldproject/mydir2
Ignore new files:
gitdiffdir -aur 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
diff_options=()
others=()
# Loop through all arguments
while [[ $# -gt 0 ]]; do
case $1 in
-*) diff_options+=("$1") ;; # Add to options array if it starts with -
*) others+=("$1") ;; # Add to others array if it doesn't start with -
esac
shift # Shift to the next argument
done
if [ ${#diff_options[@]} -eq 0 ]; then
# Default: diff -Naur
diff_options+=("-Naur")
fi
dirA="${others[0]}"
dirB="${others[1]:-.}"
# Remove all trailing slashes
while [[ "$dirA" == */ ]]; do
dirA="${dirA%/}"
done
while [[ "$dirB" == */ ]]; do
dirB="${dirB%/}"
done
less_or_cat() {
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 "${diff_options[@]}" "$dirA"/{} "$dirB"/{} | less_or_cat