Permit symlinks (which have mode 120000 in git) to make their way
through for more detailed checks.
No functional change except to error messages, because:
* If neither thing was a symlink, then the existing regexps
still match and the new "modified symlink" clause will not,
so the flow is unchanged.
* Otherwise, if both $oldmode and $newmode match [^0], ie,
this is a modification rather than deletion or removal,
we insist that $oldmode=$newmode, and then, fail the
new "modified symlink" check.
* Otherwise, we fail the check for default mode.
So in the case we are allowing to proceed further, we fail as before.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
if ($unrepres) {
eval {
- die "not a plain file\n"
- unless $newmode =~ m/^10\d{4}$/ ||
- $oldmode =~ m/^10\d{4}$/;
+ die "not a plain file or symlink\n"
+ unless $newmode =~ m/^(?:10|12)\d{4}$/ ||
+ $oldmode =~ m/^(?:10|12)\d{4}$/;
if ($oldmode =~ m/[^0]/ &&
$newmode =~ m/[^0]/) {
- die "mode changed\n" if $oldmode ne $newmode;
+ die "mode or type changed\n" if $oldmode ne $newmode;
+ die "modified symlink\n" unless $newmode =~ m/^10/;
} else {
- die "non-default mode\n"
+ die "non-default mode or type\n"
unless $newmode =~ m/^100644$/ ||
$oldmode =~ m/^100644$/;
}
attempt
}
-badly-1 orig-symlink 'not a plain file'
+badly-1 orig-symlink 'modified symlink'
ln -sf NEWTARGET orig-symlink
git add orig-symlink
badly-2
-badly-1 orig-symlink 'not a plain file'
+badly-1 orig-symlink 'non-default mode or type'
git rm -f orig-symlink
badly-2
git commit -m deleted
attempt
-badly-1 src.c 'mode changed'
+badly-1 src.c 'mode or type changed'
chmod +x src.c
git add src.c
badly-2