Merge branch 'jc/maint-rerere-in-workdir'
* jc/maint-rerere-in-workdir: rerere: make sure it works even in a workdir attached to a young repository
This commit is contained in:
commit
ad7bb2f68c
1
cache.h
1
cache.h
@ -726,6 +726,7 @@ int set_shared_perm(const char *path, int mode);
|
|||||||
#define adjust_shared_perm(path) set_shared_perm((path), 0)
|
#define adjust_shared_perm(path) set_shared_perm((path), 0)
|
||||||
int safe_create_leading_directories(char *path);
|
int safe_create_leading_directories(char *path);
|
||||||
int safe_create_leading_directories_const(const char *path);
|
int safe_create_leading_directories_const(const char *path);
|
||||||
|
int mkdir_in_gitdir(const char *path);
|
||||||
extern char *expand_user_path(const char *path);
|
extern char *expand_user_path(const char *path);
|
||||||
char *enter_repo(char *path, int strict);
|
char *enter_repo(char *path, int strict);
|
||||||
static inline int is_absolute_path(const char *path)
|
static inline int is_absolute_path(const char *path)
|
||||||
|
3
rerere.c
3
rerere.c
@ -590,8 +590,7 @@ static int is_rerere_enabled(void)
|
|||||||
if (rerere_enabled < 0)
|
if (rerere_enabled < 0)
|
||||||
return rr_cache_exists;
|
return rr_cache_exists;
|
||||||
|
|
||||||
if (!rr_cache_exists &&
|
if (!rr_cache_exists && mkdir_in_gitdir(rr_cache))
|
||||||
(mkdir(rr_cache, 0777) || adjust_shared_perm(rr_cache)))
|
|
||||||
die("Could not create directory %s", rr_cache);
|
die("Could not create directory %s", rr_cache);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
29
sha1_file.c
29
sha1_file.c
@ -68,6 +68,35 @@ static struct cached_object *find_cached_object(const unsigned char *sha1)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mkdir_in_gitdir(const char *path)
|
||||||
|
{
|
||||||
|
if (mkdir(path, 0777)) {
|
||||||
|
int saved_errno = errno;
|
||||||
|
struct stat st;
|
||||||
|
struct strbuf sb = STRBUF_INIT;
|
||||||
|
|
||||||
|
if (errno != EEXIST)
|
||||||
|
return -1;
|
||||||
|
/*
|
||||||
|
* Are we looking at a path in a symlinked worktree
|
||||||
|
* whose original repository does not yet have it?
|
||||||
|
* e.g. .git/rr-cache pointing at its original
|
||||||
|
* repository in which the user hasn't performed any
|
||||||
|
* conflict resolution yet?
|
||||||
|
*/
|
||||||
|
if (lstat(path, &st) || !S_ISLNK(st.st_mode) ||
|
||||||
|
strbuf_readlink(&sb, path, st.st_size) ||
|
||||||
|
!is_absolute_path(sb.buf) ||
|
||||||
|
mkdir(sb.buf, 0777)) {
|
||||||
|
strbuf_release(&sb);
|
||||||
|
errno = saved_errno;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
strbuf_release(&sb);
|
||||||
|
}
|
||||||
|
return adjust_shared_perm(path);
|
||||||
|
}
|
||||||
|
|
||||||
int safe_create_leading_directories(char *path)
|
int safe_create_leading_directories(char *path)
|
||||||
{
|
{
|
||||||
char *pos = path + offset_1st_component(path);
|
char *pos = path + offset_1st_component(path);
|
||||||
|
55
t/t1021-rerere-in-workdir.sh
Executable file
55
t/t1021-rerere-in-workdir.sh
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='rerere run in a workdir'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_expect_success SYMLINKS setup '
|
||||||
|
git config rerere.enabled true &&
|
||||||
|
>world &&
|
||||||
|
git add world &&
|
||||||
|
test_tick &&
|
||||||
|
git commit -m initial &&
|
||||||
|
|
||||||
|
echo hello >world &&
|
||||||
|
test_tick &&
|
||||||
|
git commit -a -m hello &&
|
||||||
|
|
||||||
|
git checkout -b side HEAD^ &&
|
||||||
|
echo goodbye >world &&
|
||||||
|
test_tick &&
|
||||||
|
git commit -a -m goodbye &&
|
||||||
|
|
||||||
|
git checkout master
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success SYMLINKS 'rerere in workdir' '
|
||||||
|
rm -rf .git/rr-cache &&
|
||||||
|
"$SHELL_PATH" "$TEST_DIRECTORY/../contrib/workdir/git-new-workdir" . work &&
|
||||||
|
(
|
||||||
|
cd work &&
|
||||||
|
test_must_fail git merge side &&
|
||||||
|
git rerere status >actual &&
|
||||||
|
echo world >expect &&
|
||||||
|
test_cmp expect actual
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
# This fails because we don't resolve relative symlink in mkdir_in_gitdir()
|
||||||
|
# For the purpose of helping contrib/workdir/git-new-workdir users, we do not
|
||||||
|
# have to support relative symlinks, but it might be nicer to make this work
|
||||||
|
# with a relative symbolic link someday.
|
||||||
|
test_expect_failure SYMLINKS 'rerere in workdir (relative)' '
|
||||||
|
rm -rf .git/rr-cache &&
|
||||||
|
"$SHELL_PATH" "$TEST_DIRECTORY/../contrib/workdir/git-new-workdir" . krow &&
|
||||||
|
(
|
||||||
|
cd krow &&
|
||||||
|
rm -f .git/rr-cache &&
|
||||||
|
ln -s ../.git/rr-cache .git/rr-cache &&
|
||||||
|
test_must_fail git merge side &&
|
||||||
|
git rerere status >actual &&
|
||||||
|
echo world >expect &&
|
||||||
|
test_cmp expect actual
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
Loading…
x
Reference in New Issue
Block a user