Add "git-set-dir-times" and "git-set-file-times" (whoops)
This commit is contained in:
parent
540129c13e
commit
1cd92b1d66
|
|
@ -0,0 +1,19 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
"$(dirname "$(readlink -f "$BASH_SOURCE")")/git-set-file-times"
|
||||||
|
|
||||||
|
IFS=$'\n'
|
||||||
|
topLevelDirs=( $(find -mindepth 1 -maxdepth 1 -type d -not -name .git) )
|
||||||
|
unset IFS
|
||||||
|
|
||||||
|
IFS=$'\n'
|
||||||
|
allDirs=( $(find "${topLevelDirs[@]}" -depth -type d) . )
|
||||||
|
unset IFS
|
||||||
|
|
||||||
|
for dir in "${allDirs[@]}"; do
|
||||||
|
ref="$(ls -At "$dir" | grep -v '^.git$' | head -1)"
|
||||||
|
if [ "$ref" ]; then
|
||||||
|
touch --reference "$dir/$ref" "$dir"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
# https://git.wiki.kernel.org/index.php/ExampleScripts#Setting_the_timestamps_of_the_files_to_the_commit_timestamp_of_the_commit_which_last_touched_them
|
||||||
|
|
||||||
|
# sets mtime and atime of files to the latest commit time in git
|
||||||
|
#
|
||||||
|
# This is useful for serving static content (managed by git)
|
||||||
|
# from a cluster of identically configured HTTP servers. HTTP
|
||||||
|
# clients and content delivery networks can get consistent
|
||||||
|
# Last-Modified headers no matter which HTTP server in the
|
||||||
|
# cluster they hit. This should improve caching behavior.
|
||||||
|
#
|
||||||
|
# This does not take into account merges, but if you're updating
|
||||||
|
# every machine in the cluster from the same commit (A) to the
|
||||||
|
# same commit (B), the mtimes will be _consistent_ across all
|
||||||
|
# machines if not necessarily accurate.
|
||||||
|
#
|
||||||
|
# THIS IS NOT INTENDED TO OPTIMIZE BUILD SYSTEMS SUCH AS 'make'
|
||||||
|
# YOU HAVE BEEN WARNED!
|
||||||
|
|
||||||
|
my %ls = ();
|
||||||
|
my $commit_time;
|
||||||
|
|
||||||
|
if ($ENV{GIT_DIR}) {
|
||||||
|
chdir($ENV{GIT_DIR}) or die $!;
|
||||||
|
}
|
||||||
|
|
||||||
|
$/ = "\0";
|
||||||
|
open FH, 'git ls-files -z|' or die $!;
|
||||||
|
while (<FH>) {
|
||||||
|
chomp;
|
||||||
|
$ls{$_} = $_;
|
||||||
|
}
|
||||||
|
close FH;
|
||||||
|
|
||||||
|
|
||||||
|
$/ = "\n";
|
||||||
|
open FH, "git log -m -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}( \(from [a-f0-9]{40}\))?$// or s/\0$//) {
|
||||||
|
my @files = delete @ls{split(/\0/, $_)};
|
||||||
|
@files = grep { defined $_ } @files;
|
||||||
|
next unless @files;
|
||||||
|
utime $commit_time, $commit_time, @files;
|
||||||
|
}
|
||||||
|
last unless %ls;
|
||||||
|
|
||||||
|
}
|
||||||
|
close FH;
|
||||||
Loading…
Reference in New Issue