From: Sven Verdoolaege <skimo@kotnet.org>
To: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Cc: Steffen Prohaska <prohaska@zib.de>, Johannes.Schindelin@gmx.de
Subject: [PATCH resend] git-apply: apply submodule changes
Date: Fri, 10 Aug 2007 15:57:44 +0200 [thread overview]
Message-ID: <20070810135744.GA29243MdfPADPa@greensroom.kotnet.org> (raw)
In-Reply-To: <20070810093049.GA868MdfPADPa@greensroom.kotnet.org>
Apply "Subproject commit HEX" changes produced by git-diff.
As usual in the current git, only the superproject itself is actually
modified (possibly creating empty directories for new submodules).
Any checked-out submodule is left untouched and is not required to
be up-to-date.
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
---
This second version has a test and an extra sanity check.
I seem to be experiencing some problems receiving emails,
so I'll reply to a message from Dscho here.
Johannes Schindelin <Johannes.Schindelin <at> gmx.de> writes:
> For rebase and cherry-pick, it would be nice if git just ignored the
> changes in the submodules, provided that the submodule commit was not
> affected by the to-be-applied patches.
I have no idea what you mean.
The checked out copies of the submodules are ignored completely
(if that is what you were talking about, then I hope this issue
is clarified by the updated commit message). In the superproject,
the change to the submodule is obviously not ignored, since it's
an integral part of the patch. However, git-apply will fail if
the original submodule commit does not correspond exactly to the
"from-file" submodule commit.
I don't think there is anything else we can do without a true
recursive git-diff/git-apply.
skimo
builtin-apply.c | 50 ++++++++++++++++++++++++++++++++++---------
t/t7400-submodule-basic.sh | 8 +++++++
2 files changed, 47 insertions(+), 11 deletions(-)
diff --git a/builtin-apply.c b/builtin-apply.c
index da27075..a38dbf1 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -1984,6 +1984,26 @@ static int apply_fragments(struct buffer_desc *desc, struct patch *patch)
return 0;
}
+static int read_file_or_gitlink(struct cache_entry *ce, char **buf_p,
+ unsigned long *size_p)
+{
+ if (!ce)
+ return 0;
+
+ if (S_ISGITLINK(ntohl(ce->ce_mode))) {
+ *buf_p = xmalloc(100);
+ *size_p = snprintf(*buf_p, 100,
+ "Subproject commit %s\n", sha1_to_hex(ce->sha1));
+ } else {
+ enum object_type type;
+ *buf_p = read_sha1_file(ce->sha1, &type, size_p);
+ if (!*buf_p)
+ return -1;
+ }
+
+ return 0;
+}
+
static int apply_data(struct patch *patch, struct stat *st, struct cache_entry *ce)
{
char *buf;
@@ -1994,20 +2014,18 @@ static int apply_data(struct patch *patch, struct stat *st, struct cache_entry *
alloc = 0;
buf = NULL;
if (cached) {
- if (ce) {
- enum object_type type;
- buf = read_sha1_file(ce->sha1, &type, &size);
- if (!buf)
- return error("read of %s failed",
- patch->old_name);
- alloc = size;
- }
+ if (read_file_or_gitlink(ce, &buf, &size))
+ return error("read of %s failed", patch->old_name);
+ alloc = size;
}
else if (patch->old_name) {
size = xsize_t(st->st_size);
alloc = size + 8192;
buf = xmalloc(alloc);
- if (read_old_data(st, patch->old_name, &buf, &alloc, &size))
+ if (S_ISGITLINK(patch->old_mode))
+ size = snprintf(buf, alloc,
+ "Subproject commit %s\n", sha1_to_hex(ce->sha1));
+ else if (read_old_data(st, patch->old_name, &buf, &alloc, &size))
return error("read of %s failed", patch->old_name);
}
@@ -2098,7 +2116,7 @@ static int check_patch(struct patch *patch, struct patch *prev_patch)
}
if (!cached)
changed = ce_match_stat(ce, &st, 1);
- if (changed)
+ if (changed && !S_ISGITLINK(patch->old_mode))
return error("%s: does not match index",
old_name);
if (cached)
@@ -2387,7 +2405,10 @@ static void add_index_file(const char *path, unsigned mode, void *buf, unsigned
die("unable to stat newly created file %s", path);
fill_stat_cache_info(ce, &st);
}
- if (write_sha1_file(buf, size, blob_type, ce->sha1) < 0)
+ if (S_ISGITLINK(mode)) {
+ if (get_sha1_hex(buf + strlen("Subproject commit "), ce->sha1))
+ die("corrupt patch for subproject %s", path);
+ } else if (write_sha1_file(buf, size, blob_type, ce->sha1) < 0)
die("unable to create backing store for newly created file %s", path);
if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) < 0)
die("unable to add cache entry for %s", path);
@@ -2398,6 +2419,13 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
int fd;
char *nbuf;
+ if (S_ISGITLINK(mode)) {
+ struct stat st;
+ if (!lstat(path, &st) && S_ISDIR(st.st_mode))
+ return 0;
+ return mkdir(path, 0777);
+ }
+
if (has_symlinks && S_ISLNK(mode))
/* Although buf:size is counted string, it also is NUL
* terminated.
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index e8ce7cd..cede2e7 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -175,4 +175,12 @@ test_expect_success 'checkout superproject with subproject already present' '
git-checkout master
'
+test_expect_success 'rebase with subproject changes' '
+ git-checkout initial &&
+ echo t > t &&
+ git add t &&
+ git-commit -m "change t" &&
+ git-rebase HEAD master
+'
+
test_done
--
1.5.3.rc4.29.g74276-dirty
next prev parent reply other threads:[~2007-08-10 13:57 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-10 9:30 [PATCH] git-apply: apply submodule changes Sven Verdoolaege
2007-08-10 12:34 ` Johannes Schindelin
2007-08-10 12:39 ` Johannes Schindelin
2007-08-10 13:57 ` Sven Verdoolaege [this message]
2007-08-11 5:43 ` [PATCH resend] " Junio C Hamano
2007-08-11 6:45 ` Sven Verdoolaege
2007-08-11 7:00 ` Junio C Hamano
2007-08-12 14:23 ` [PATCH v3] " Sven Verdoolaege
2007-08-12 18:16 ` Junio C Hamano
2007-08-12 18:50 ` Sven Verdoolaege
2007-08-12 19:24 ` Junio C Hamano
2007-08-13 9:37 ` Sven Verdoolaege
2007-08-13 17:13 ` [PATCH v4] " Sven Verdoolaege
2007-08-13 20:26 ` Junio C Hamano
[not found] ` <7vd4xqeilh.fsf@assigned-by-dhcp.cox.net>
2007-08-14 8:39 ` Sven Verdoolaege
2007-08-14 9:09 ` Junio C Hamano
2007-08-15 17:22 ` [PATCH v6] " Sven Verdoolaege
2007-08-16 0:02 ` Junio C Hamano
2007-08-14 20:00 ` [PATCH v4] " 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=20070810135744.GA29243MdfPADPa@greensroom.kotnet.org \
--to=skimo@kotnet.org \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=prohaska@zib.de \
--cc=skimo@liacs.nl \
/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).