Fossil SCM
Added tools/fossil-diff-log script, emulating "git log -p", the feature having been requested twice now on the forum.
Commit
836d6b4f2110a41df3bd8d304faaa434b2474dff5a1e6e19420c49ba5d1fb06d
Parent
0a59a8234907421…
1 file changed
+59
+59
| --- a/tools/fossil-diff-log | ||
| +++ b/tools/fossil-diff-log | ||
| @@ -0,0 +1,59 @@ | ||
| 1 | +#!/usr/bin/env perl | |
| 2 | +nteractive | |
| 3 | +# ...etc... | |
| 4 | + | |
| 5 | +use strict; | |
| 6 | +use warnings; | |
| 7 | + | |
| 8 | +use Carp; | |
| 9 | +use File::Which; | |
| 10 | +use IO::Interactive qw(is_interactive); | |
| 11 | + | |
| 12 | +die "usage: $0 <files...>\n\n" unless @ARGV; | |
| 13 | + | |
| 14 | +my $out; | |
| 15 | +if (is_interactive()) { | |
| 16 | + my $pager = $ENV{PAGER} || which('less') || which('more'); | |
| 17 | + open $out, '|-', $pager or croak "Cannot pipe to $pager: $!"; | |
| 18 | +} | |
| 19 | +else { | |
| 20 | + $out = *STDOUT; | |
| 21 | +} | |
| 22 | + | |
| 23 | +open my $bcmd, '-|', 'fossil branch current' | |
| 24 | + or die "Cannot get branch: $!\n"; | |
| 25 | +my $cbranch = <$bcmd>; | |
| 26 | +chomp $cbranch; | |
| 27 | +close $bcmd; | |
| 28 | + | |
| 29 | +for my $file (@ARGV) { | |
| 30 | + my $lastckid; | |
| 31 | + open my $finfo, '-|', "fossil finfo --brief --limit 0 '$file'" | |
| 32 | + or die "Failed to get file info: $!\n"; | |
| 33 | + my @filines = <$finfo>; | |
| 34 | + close $finfo; | |
| 35 | + | |
| 36 | + for my $line (@filines) { | |
| 37 | + my ($currckid, $date, $user, $branch, @cwords) = split ' ', $line; | |
| 38 | + next unless $branch eq $cbranch; | |
| 39 | + if (defined $lastckid and defined $branch) { | |
| 40 | + my $comment = join ' ', @cwords; | |
| 41 | + open my $diff, ' | |
| 42 | + '--to', $lastckid, | |
| 43 | + or die "Failed to diff $currckid -> $lastckid: $!\n"; | |
| 44 | + my @dl = <$diff>; | |
| 45 | + close $diff; | |
| 46 | + my $patch = join '', @dl; | |
| 47 | + | |
| 48 | + print $out <<"OUT" | |
| 49 | +Checkin ID $currckid to $branch by $user on $date | |
| 50 | +Comment: $comment | |
| 51 | + | |
| 52 | +$patch | |
| 53 | + | |
| 54 | +OUT | |
| 55 | + } | |
| 56 | + | |
| 57 | + $lastckid = $currckid; | |
| 58 | + } | |
| 59 | +} |
| --- a/tools/fossil-diff-log | |
| +++ b/tools/fossil-diff-log | |
| @@ -0,0 +1,59 @@ | |
| --- a/tools/fossil-diff-log | |
| +++ b/tools/fossil-diff-log | |
| @@ -0,0 +1,59 @@ | |
| 1 | #!/usr/bin/env perl |
| 2 | nteractive |
| 3 | # ...etc... |
| 4 | |
| 5 | use strict; |
| 6 | use warnings; |
| 7 | |
| 8 | use Carp; |
| 9 | use File::Which; |
| 10 | use IO::Interactive qw(is_interactive); |
| 11 | |
| 12 | die "usage: $0 <files...>\n\n" unless @ARGV; |
| 13 | |
| 14 | my $out; |
| 15 | if (is_interactive()) { |
| 16 | my $pager = $ENV{PAGER} || which('less') || which('more'); |
| 17 | open $out, '|-', $pager or croak "Cannot pipe to $pager: $!"; |
| 18 | } |
| 19 | else { |
| 20 | $out = *STDOUT; |
| 21 | } |
| 22 | |
| 23 | open my $bcmd, '-|', 'fossil branch current' |
| 24 | or die "Cannot get branch: $!\n"; |
| 25 | my $cbranch = <$bcmd>; |
| 26 | chomp $cbranch; |
| 27 | close $bcmd; |
| 28 | |
| 29 | for my $file (@ARGV) { |
| 30 | my $lastckid; |
| 31 | open my $finfo, '-|', "fossil finfo --brief --limit 0 '$file'" |
| 32 | or die "Failed to get file info: $!\n"; |
| 33 | my @filines = <$finfo>; |
| 34 | close $finfo; |
| 35 | |
| 36 | for my $line (@filines) { |
| 37 | my ($currckid, $date, $user, $branch, @cwords) = split ' ', $line; |
| 38 | next unless $branch eq $cbranch; |
| 39 | if (defined $lastckid and defined $branch) { |
| 40 | my $comment = join ' ', @cwords; |
| 41 | open my $diff, ' |
| 42 | '--to', $lastckid, |
| 43 | or die "Failed to diff $currckid -> $lastckid: $!\n"; |
| 44 | my @dl = <$diff>; |
| 45 | close $diff; |
| 46 | my $patch = join '', @dl; |
| 47 | |
| 48 | print $out <<"OUT" |
| 49 | Checkin ID $currckid to $branch by $user on $date |
| 50 | Comment: $comment |
| 51 | |
| 52 | $patch |
| 53 | |
| 54 | OUT |
| 55 | } |
| 56 | |
| 57 | $lastckid = $currckid; |
| 58 | } |
| 59 | } |