* git-set-file-times: Import from rsync.
This commit is contained in:
parent
76ac37d8d5
commit
81dfcfb18b
36
git-set-file-times
Executable file
36
git-set-file-times
Executable file
@ -0,0 +1,36 @@
|
||||
#!/usr/bin/perl -w
|
||||
use strict;
|
||||
|
||||
# Sets mtime and atime of files to the latest commit time in git.
|
||||
#
|
||||
# This is useful after the first clone of the rsync repository BEFORE you
|
||||
# do any building. It is also safe if you have done a "make distclean".
|
||||
|
||||
my %ls;
|
||||
my $commit_time;
|
||||
my $prefix = @ARGV && $ARGV[0] =~ s/^--prefix=// ? shift : '';
|
||||
|
||||
$/ = "\0";
|
||||
open FH, 'git ls-files -z|' or die $!;
|
||||
while (<FH>) {
|
||||
chomp;
|
||||
$ls{$_} = $_;
|
||||
}
|
||||
close FH;
|
||||
|
||||
$/ = "\n";
|
||||
open FH, "git log -r --name-only --no-color --pretty=raw -z @ARGV |" or die $!;
|
||||
while (<FH>) {
|
||||
chomp;
|
||||
if (/^committer .*? (\d+) (?:[\-\+]\d+)$/) {
|
||||
$commit_time = $1;
|
||||
} elsif (s/\0\0commit [a-f0-9]{40}$// or s/\0$//) {
|
||||
my @files = delete @ls{split(/\0/, $_)};
|
||||
@files = grep { defined $_ } @files;
|
||||
next unless @files;
|
||||
map { s/^/$prefix/ } @files;
|
||||
utime $commit_time, $commit_time, @files;
|
||||
}
|
||||
last unless %ls;
|
||||
}
|
||||
close FH;
|
Loading…
Reference in New Issue
Block a user