create_symref: if symlink fails, fall back to writing a "symbolic ref"

There are filesystems out there which do not understand symlinks, even if
the OS is perfectly capable of writing them. So, do not fail right away,
but try to write a symbolic ref first. If that fails, you can die().

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Johannes Schindelin 2005-10-26 01:40:31 +02:00 committed by Junio C Hamano
parent f89ad67fb0
commit 303958dc42
1 changed files with 7 additions and 5 deletions

12
refs.c
View File

@ -116,14 +116,17 @@ const char *resolve_ref(const char *path, unsigned char *sha1, int reading)


int create_symref(const char *git_HEAD, const char *refs_heads_master) int create_symref(const char *git_HEAD, const char *refs_heads_master)
{ {
#if USE_SYMLINK_HEAD
unlink(git_HEAD);
return symlink(refs_heads_master, git_HEAD);
#else
const char *lockpath; const char *lockpath;
char ref[1000]; char ref[1000];
int fd, len, written; int fd, len, written;


#if USE_SYMLINK_HEAD
unlink(git_HEAD);
if (!symlink(refs_heads_master, git_HEAD))
return 0;
fprintf(stderr, "no symlink - falling back to symbolic ref\n");
#endif

len = snprintf(ref, sizeof(ref), "ref: %s\n", refs_heads_master); len = snprintf(ref, sizeof(ref), "ref: %s\n", refs_heads_master);
if (sizeof(ref) <= len) { if (sizeof(ref) <= len) {
error("refname too long: %s", refs_heads_master); error("refname too long: %s", refs_heads_master);
@ -144,7 +147,6 @@ int create_symref(const char *git_HEAD, const char *refs_heads_master)
return -3; return -3;
} }
return 0; return 0;
#endif
} }


int read_ref(const char *filename, unsigned char *sha1) int read_ref(const char *filename, unsigned char *sha1)