entry.c: create submodules when interesting
When a submodule is introduced with a new revision we need to create the submodule in the worktree as well. As 'submodule_move_head' handles edge cases, all we have to do is call it from within the function that creates new files in the working tree for workingtree operations. Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
a7bc845a9a
commit
6d14eac3ec
30
entry.c
30
entry.c
@ -2,6 +2,7 @@
|
||||
#include "blob.h"
|
||||
#include "dir.h"
|
||||
#include "streaming.h"
|
||||
#include "submodule.h"
|
||||
|
||||
static void create_directories(const char *path, int path_len,
|
||||
const struct checkout *state)
|
||||
@ -146,6 +147,7 @@ static int write_entry(struct cache_entry *ce,
|
||||
unsigned long size;
|
||||
size_t wrote, newsize = 0;
|
||||
struct stat st;
|
||||
const struct submodule *sub;
|
||||
|
||||
if (ce_mode_s_ifmt == S_IFREG) {
|
||||
struct stream_filter *filter = get_stream_filter(ce->name,
|
||||
@ -203,6 +205,10 @@ static int write_entry(struct cache_entry *ce,
|
||||
return error("cannot create temporary submodule %s", path);
|
||||
if (mkdir(path, 0777) < 0)
|
||||
return error("cannot create submodule directory %s", path);
|
||||
sub = submodule_from_ce(ce);
|
||||
if (sub)
|
||||
return submodule_move_head(ce->name,
|
||||
NULL, oid_to_hex(&ce->oid), SUBMODULE_MOVE_HEAD_FORCE);
|
||||
break;
|
||||
default:
|
||||
return error("unknown file mode for %s in index", path);
|
||||
@ -259,7 +265,31 @@ int checkout_entry(struct cache_entry *ce,
|
||||
strbuf_add(&path, ce->name, ce_namelen(ce));
|
||||
|
||||
if (!check_path(path.buf, path.len, &st, state->base_dir_len)) {
|
||||
const struct submodule *sub;
|
||||
unsigned changed = ce_match_stat(ce, &st, CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE);
|
||||
/*
|
||||
* Needs to be checked before !changed returns early,
|
||||
* as the possibly empty directory was not changed
|
||||
*/
|
||||
sub = submodule_from_ce(ce);
|
||||
if (sub) {
|
||||
int err;
|
||||
if (!is_submodule_populated_gently(ce->name, &err)) {
|
||||
struct stat sb;
|
||||
if (lstat(ce->name, &sb))
|
||||
die(_("could not stat file '%s'"), ce->name);
|
||||
if (!(st.st_mode & S_IFDIR))
|
||||
unlink_or_warn(ce->name);
|
||||
|
||||
return submodule_move_head(ce->name,
|
||||
NULL, oid_to_hex(&ce->oid),
|
||||
SUBMODULE_MOVE_HEAD_FORCE);
|
||||
} else
|
||||
return submodule_move_head(ce->name,
|
||||
"HEAD", oid_to_hex(&ce->oid),
|
||||
SUBMODULE_MOVE_HEAD_FORCE);
|
||||
}
|
||||
|
||||
if (!changed)
|
||||
return 0;
|
||||
if (!state->force) {
|
||||
|
Loading…
Reference in New Issue
Block a user