From: Joey Hess <joeyh@joeyh.name>
To: git@vger.kernel.org
Cc: Joey Hess <joeyh@joeyh.name>
Subject: [PATCH v4 8/8] use smudgeToFile filter in recursive merge
Date: Wed, 22 Jun 2016 17:09:18 -0400 [thread overview]
Message-ID: <1466629758-8035-9-git-send-email-joeyh@joeyh.name> (raw)
In-Reply-To: <1466629758-8035-1-git-send-email-joeyh@joeyh.name>
Recursive merge updates the work tree and so should use the smudgeToFile
filter.
At this point, smudgeToFile is run by everything that updates work
tree files.
Signed-off-by: Joey Hess <joeyh@joeyh.name>
---
merge-recursive.c | 42 ++++++++++++++++++++++++++++++++----------
t/t0021-conversion.sh | 16 +++++++++++++++-
2 files changed, 47 insertions(+), 11 deletions(-)
diff --git a/merge-recursive.c b/merge-recursive.c
index 48fe7e7..7d38cf8 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -765,14 +765,6 @@ static void update_file_flags(struct merge_options *o,
die(_("cannot read object %s '%s'"), oid_to_hex(oid), path);
if (type != OBJ_BLOB)
die(_("blob expected for %s '%s'"), oid_to_hex(oid), path);
- if (S_ISREG(mode)) {
- struct strbuf strbuf = STRBUF_INIT;
- if (convert_to_working_tree(path, buf, size, &strbuf)) {
- free(buf);
- size = strbuf.len;
- buf = strbuf_detach(&strbuf, NULL);
- }
- }
if (make_room_for_path(o, path) < 0) {
update_wd = 0;
@@ -781,6 +773,7 @@ static void update_file_flags(struct merge_options *o,
}
if (S_ISREG(mode) || (!has_symlinks && S_ISLNK(mode))) {
int fd;
+ int isreg = S_ISREG(mode);
if (mode & 0100)
mode = 0777;
else
@@ -788,8 +781,37 @@ static void update_file_flags(struct merge_options *o,
fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
if (fd < 0)
die_errno(_("failed to open '%s'"), path);
- write_in_full(fd, buf, size);
- close(fd);
+
+ int smudge_to_file = can_smudge_to_file(path);
+ if (smudge_to_file) {
+ close(fd);
+ fd = convert_to_working_tree_filter_to_file(path, path, buf, size);
+ if (fd < 0) {
+ /* smudgeToFile filter failed;
+ * continue with regular file
+ * creation. */
+ smudge_to_file = 0;
+ fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
+ if (fd < 0)
+ die_errno(_("failed to open '%s'"), path);
+ }
+ else {
+ close(fd);
+ }
+ }
+
+ if (! smudge_to_file) {
+ if (isreg) {
+ struct strbuf strbuf = STRBUF_INIT;
+ if (convert_to_working_tree(path, buf, size, &strbuf)) {
+ free(buf);
+ size = strbuf.len;
+ buf = strbuf_detach(&strbuf, NULL);
+ }
+ }
+ write_in_full(fd, buf, size);
+ close(fd);
+ }
} else if (S_ISLNK(mode)) {
char *lnk = xmemdupz(buf, size);
safe_create_leading_directories_const(path);
diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh
index fd07bd6..2722013 100755
--- a/t/t0021-conversion.sh
+++ b/t/t0021-conversion.sh
@@ -334,10 +334,24 @@ test_expect_success 'recovery from failure of smudgeToFile filter that deletes t
cmp test fstest.t
'
+test_expect_success 'smudgeToFile filter is used in merge' '
+ test_config filter.rot13.smudgeToFile ./rot13-to-file.sh &&
+
+ git commit -m "added fstest.t" fstest.t &&
+ git checkout -b old &&
+ git reset --hard HEAD^ &&
+ git merge master &&
+
+ test -e rot13-to-file.ran &&
+ rm -f rot13-to-file.ran &&
+
+ cmp test fstest.t &&
+ git checkout master
+'
+
test_expect_success 'smudgeToFile filter is used by git am' '
test_config filter.rot13.smudgeToFile ./rot13-to-file.sh &&
- git commit fstest.t -m "added fstest.t" &&
git format-patch HEAD^ --stdout > fstest.patch &&
git reset --hard HEAD^ &&
git am < fstest.patch &&
--
2.9.0.587.ga3bedf2
next prev parent reply other threads:[~2016-06-22 21:09 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-22 21:09 [PATCH v4 0/8] extend smudge/clean filters with direct file access (for pu) Joey Hess
2016-06-22 21:09 ` [PATCH v4 1/8] clarify %f documentation Joey Hess
2016-06-22 21:09 ` [PATCH v4 2/8] add smudgeToFile and cleanFromFile filter configs Joey Hess
2016-06-22 21:09 ` [PATCH v4 3/8] use cleanFromFile in git add Joey Hess
2016-06-22 21:09 ` [PATCH v4 4/8] use smudgeToFile in git checkout etc Joey Hess
2016-06-22 21:09 ` [PATCH v4 5/8] warn on unusable smudgeToFile/cleanFromFile config Joey Hess
2016-06-22 21:09 ` [PATCH v4 6/8] better recovery from failure of smudgeToFile filter Joey Hess
2016-06-22 21:09 ` [PATCH v4 7/8] use smudgeToFile filter in git am Joey Hess
2016-06-22 21:09 ` Joey Hess [this message]
2016-06-22 21:39 ` [PATCH v4 8/8] use smudgeToFile filter in recursive merge Junio C Hamano
2016-06-22 22:45 ` Junio C Hamano
2016-06-22 21:23 ` [PATCH v4 0/8] extend smudge/clean filters with direct file access (for pu) 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=1466629758-8035-9-git-send-email-joeyh@joeyh.name \
--to=joeyh@joeyh.name \
--cc=git@vger.kernel.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;
as well as URLs for NNTP newsgroup(s).