diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2009-10-09 23:07:12 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2009-10-09 23:07:28 +0000 |
commit | 81dfcfb18b0b481e868d449184bb403dcc8498da (patch) | |
tree | 96da23fae678aaf91aba8afa092d70fe0704eda8 /git-set-file-times | |
parent | 76ac37d8d57c17ec00612f50532a2b275c8c50da (diff) | |
download | strace-81dfcfb18b0b481e868d449184bb403dcc8498da.tar.gz |
* git-set-file-times: Import from rsync.
Diffstat (limited to 'git-set-file-times')
-rwxr-xr-x | git-set-file-times | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/git-set-file-times b/git-set-file-times new file mode 100755 index 000000000..85d854e88 --- /dev/null +++ b/git-set-file-times @@ -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; |