Skip to content

Commit

Permalink
Merge branch 'jc/maint-rerere-in-workdir'
Browse files Browse the repository at this point in the history
* jc/maint-rerere-in-workdir:
  rerere: make sure it works even in a workdir attached to a young repository
  • Loading branch information
Junio C Hamano committed Mar 27, 2011
2 parents 54f6a8d + 90a6464 commit ad7bb2f
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 2 deletions.
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -726,6 +726,7 @@ int set_shared_perm(const char *path, int mode);
#define adjust_shared_perm(path) set_shared_perm((path), 0)
int safe_create_leading_directories(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);
char *enter_repo(char *path, int strict);
static inline int is_absolute_path(const char *path)
Expand Down
3 changes: 1 addition & 2 deletions rerere.c
Original file line number Diff line number Diff line change
Expand Up @@ -590,8 +590,7 @@ static int is_rerere_enabled(void)
if (rerere_enabled < 0)
return rr_cache_exists;

if (!rr_cache_exists &&
(mkdir(rr_cache, 0777) || adjust_shared_perm(rr_cache)))
if (!rr_cache_exists && mkdir_in_gitdir(rr_cache))
die("Could not create directory %s", rr_cache);
return 1;
}
Expand Down
29 changes: 29 additions & 0 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,35 @@ static struct cached_object *find_cached_object(const unsigned char *sha1)
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)
{
char *pos = path + offset_1st_component(path);
Expand Down
55 changes: 55 additions & 0 deletions t/t1021-rerere-in-workdir.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit ad7bb2f

Please sign in to comment.