зеркало из https://github.com/microsoft/git.git
When locking in a symlinked repository, try to lock the original.
In a working tree prepared in new-workdir (in contrib/), some files in .git/ directory are symbolic links to the original repository. The usual sequence of lock-write-rename would break the symbolic link. Ideally we should resolve relative symbolic link with maxdepth, but I do not want to risk too elaborate patch before 1.5.3 release, so this is a minimum and trivially obvious fix. new-workdir creates its symbolic links absolute, and does not link from a symlinked workdir, so this fix should suffice for now. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
1a44be9a0f
Коммит
d58e8d34b0
13
lockfile.c
13
lockfile.c
|
@ -28,6 +28,19 @@ static void remove_lock_file_on_signal(int signo)
|
||||||
static int lock_file(struct lock_file *lk, const char *path)
|
static int lock_file(struct lock_file *lk, const char *path)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if ((!lstat(path, &st)) && S_ISLNK(st.st_mode)) {
|
||||||
|
ssize_t sz;
|
||||||
|
static char target[PATH_MAX];
|
||||||
|
sz = readlink(path, target, sizeof(target));
|
||||||
|
if (sz < 0)
|
||||||
|
warning("Cannot readlink %s", path);
|
||||||
|
else if (target[0] != '/')
|
||||||
|
warning("Cannot lock target of relative symlink %s", path);
|
||||||
|
else
|
||||||
|
path = target;
|
||||||
|
}
|
||||||
sprintf(lk->filename, "%s.lock", path);
|
sprintf(lk->filename, "%s.lock", path);
|
||||||
fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
|
fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
|
||||||
if (0 <= fd) {
|
if (0 <= fd) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче