From: Junio C Hamano <junkio@cox.net>
To: Linus Torvalds <torvalds@osdl.org>
Cc: git@vger.kernel.org
Subject: [PATCH] Really fix git-merge-one-file-script this time.
Date: Sun, 01 May 2005 02:29:49 -0700 [thread overview]
Message-ID: <7vd5sbz436.fsf@assigned-by-dhcp.cox.net> (raw)
The merge-cache program was updated to pass executable bits when
calling git-merge-one-file-script, but the called script
supplied as an example were not using them carefully.
This patch fixes the following problems in the script:
* When a new file is created in a directory, which is a file in
the work tree, it tried to create leading directory but did
not check for failure from the "mkdir -p" command.
* The script did not check the exit status from the
git-update-cache command at all.
* The parameter "$4" to the script is a file name that can
contain almost any characters, so it must be quoted with
double quotes and also needs to be preceded with -- to mark
it as a non-option when passed to certain commands.
* The chmod command was used with parameter "$6" or "$7" to set
the mode bits. This contradicts with the strategy taken by
checkout-cache, where we honor user's umask and force only
the executable bits. With this patch, it creates a new file
by redirecting into it (thus honoring user's default umask),
and then uses "chmod +x" if we want the resulting file
executable. Without this fix, the merge result becomes 0644
or 0755 for users whose umask is 002 for whom it should
become 0664 or 0775.
* When "$1 -> $2 -> $3" case was not handled, the script did
not say which path it was working on, which was not so useful
when used with the -a option of git-merge-cache.
Signed-off-by: Junio C Hamano <junkio@cox.net>
---
git-merge-one-file-script | 41 ++++++++++++++++++-----------------------
1 files changed, 18 insertions(+), 23 deletions(-)
# - [PATCH] Resurrect diff-tree-helper -R
# + [PATCH] Really fix git-merge-one-file-script this time.
--- k/git-merge-one-file-script
+++ l/git-merge-one-file-script
@@ -16,7 +16,7 @@
# if the directory is newly added in a branch, it might not exist
# in the current tree
dir=$(dirname "$4")
-mkdir -p "$dir"
+mkdir -p "$dir" || exit
case "${1:-.}${2:-.}${3:-.}" in
#
@@ -30,22 +30,18 @@ case "${1:-.}${2:-.}${3:-.}" in
# deleted in one and unchanged in the other
#
"$1.." | "$1.$1" | "$1$1.")
- rm -f -- "$4"
echo "Removing $4"
- git-update-cache --remove -- "$4"
- exit 0
- ;;
-
+ rm -f -- "$4" && exec git-update-cache --remove -- "$4" ;;
#
# added in one
#
".$2." | "..$3" )
- echo "Adding $4 with perm $6$7"
- mv $(git-unpack-file "$2$3") $4
- chmod "$6$7" $4
- git-update-cache --add -- $4
- exit 0
- ;;
+ case "$6$7" in *7??) mode=+x;; *) mode=-x;; esac
+ echo "Adding $4 with perm $mode"
+ rm -f -- "$4" &&
+ git-cat-file blob "$2$3" >"$4" &&
+ chmod "$mode" -- "$4" &&
+ exec git-update-cache --add -- "$4" ;;
#
# Added in both (check for same permissions)
#
@@ -54,11 +50,12 @@ case "${1:-.}${2:-.}${3:-.}" in
echo "ERROR: File $4 added in both branches, permissions conflict $6->$7"
exit 1
fi
- echo "Adding $4 with perm $6"
- mv $(git-unpack-file "$2") $4
- chmod "$6" $4
- git-update-cache --add -- $4
- exit 0;;
+ case "$6" in *7??) mode=+x;; *) mode=-x;; esac
+ echo "Adding $4 with perm $mode"
+ rm -f -- "$4" &&
+ git-cat-file blob "$2" >"$4" &&
+ chmod "$mode" -- "$4" &&
+ exec git-update-cache --add -- "$4" ;;
#
# Modified in both, but differently ;(
#
@@ -76,16 +73,14 @@ case "${1:-.}${2:-.}${3:-.}" in
fi
exit 1
fi
- chmod -- "$6" "$src2"
if [ $ret -ne 0 ]; then
echo "ERROR: Leaving conflict merge in $src2"
exit 1
fi
- cp -- "$src2" "$4" && chmod -- "$6" "$4" && git-update-cache --add -- "$4" && exit 0
- ;;
-
+ case "$6" in *7??) mode=+x;; *) mode=-x;; esac
+ rm -f -- "$4" && cat "$src2" >"$4" && chmod "$mode" -- "$4" &&
+ exec git-update-cache --add -- "$4" ;;
*)
- echo "Not handling case $1 -> $2 -> $3"
- ;;
+ echo "Not handling case $4: $1 -> $2 -> $3" ;;
esac
exit 1
next reply other threads:[~2005-05-01 9:24 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-05-01 9:29 Junio C Hamano [this message]
2005-05-01 18:38 ` [PATCH] Really fix git-merge-one-file-script this time Junio C Hamano
2005-05-01 20:29 ` Linus Torvalds
2005-05-01 21:18 ` Junio C Hamano
2005-05-01 21:42 ` Linus Torvalds
2005-05-01 21:32 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7vd5sbz436.fsf@assigned-by-dhcp.cox.net \
--to=junkio@cox.net \
--cc=git@vger.kernel.org \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox