From b360a7c765492e0f93172a12855e5ca9bd8186a3 Mon Sep 17 00:00:00 2001 From: Ori Bernstein Date: Sun, 15 May 2022 16:29:48 +0000 Subject: [PATCH] git/merge: correctly preserve permissions when merging when doing a 3 way merge of a file, we also need to do a merge of the permission bits to avoid clobberign them. --- sys/lib/git/common.rc | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/sys/lib/git/common.rc b/sys/lib/git/common.rc index 320439ab0..43ea17895 100644 --- a/sys/lib/git/common.rc +++ b/sys/lib/git/common.rc @@ -29,13 +29,23 @@ fn drop { ' $* } -fn present { +fn mergeperm { if(~ $1 /dev/null && cmp $2 $3>/dev/null) status=gone if not if (~ $3 /dev/null && cmp $1 $2>/dev/null) status=gone - if not + if not { + mergedperms='-x' + if(test -x $2){ + if(test -x $1 -a -x $3) + mergedperms='+x' + } + if not{ + if(test -x $1 -o -x $3) + mergedperms='+x' + } status=() + } } fn whoami{ @@ -73,13 +83,13 @@ fn merge1 {@{ base=/dev/null if(! test -f $theirs) theirs=/dev/null - mkdir -p `{basename -d $tmp} if(! ape/diff3 -3 -m $ours $base $theirs > $tmp) echo merge needed: $out >[1=2] - if(present $ours $base $theirs){ + if(mergeperm $ours $base $theirs){ mv $tmp $out git/add $out + chmod $mergedperms $out } if not { rm -f $tmp $out