* [PATCH 1/4] git-init-db should error out with a message @ 2005-10-25 23:39 Johannes Schindelin 2005-10-26 19:45 ` Alex Riesen 0 siblings, 1 reply; 5+ messages in thread From: Johannes Schindelin @ 2005-10-25 23:39 UTC (permalink / raw) To: git, junkio When the HEAD symref could not be created, it is helpful for the user to know that. Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> --- init-db.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) applies-to: 51f96562f1ef47cd9a09731e3f27445efaddbbe7 159c632ef3cc7371aaa495c41afd5fd41e2d3f3f diff --git a/init-db.c b/init-db.c index aabc09f..2c27e18 100644 --- a/init-db.c +++ b/init-db.c @@ -192,7 +192,7 @@ static void create_default_files(const c strcpy(path + len, "HEAD"); if (read_ref(path, sha1) < 0) { if (create_symref(path, "refs/heads/master") < 0) - exit(1); + die("Could not create HEAD symref!"); } path[len] = 0; copy_templates(path, len, template_path); --- 0.99.8.GIT ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/4] git-init-db should error out with a message 2005-10-25 23:39 [PATCH 1/4] git-init-db should error out with a message Johannes Schindelin @ 2005-10-26 19:45 ` Alex Riesen 2005-10-26 20:27 ` Junio C Hamano 0 siblings, 1 reply; 5+ messages in thread From: Alex Riesen @ 2005-10-26 19:45 UTC (permalink / raw) To: Johannes Schindelin; +Cc: git, junkio Johannes Schindelin, Wed, Oct 26, 2005 01:39:24 +0200: > When the HEAD symref could not be created, it is helpful for the user to > know that. > Not just that. It would be interesting to give the user an option to use the file references ("ref: refs/heads/master"). Something like that: Add --no-symref (make init-db use file references) --- cache.h | 1 + init-db.c | 11 +++++++++-- refs.c | 7 ++++++- 3 files changed, 16 insertions(+), 3 deletions(-) applies-to: dba443573167bb9b0023613428e6d1a69477fac6 097ca1bf9b21d19d425e8151986eb36f82cbeff3 diff --git a/cache.h b/cache.h index d776016..e410ce2 100644 --- a/cache.h +++ b/cache.h @@ -239,6 +239,7 @@ extern char *sha1_to_hex(const unsigned extern int read_ref(const char *filename, unsigned char *sha1); extern const char *resolve_ref(const char *path, unsigned char *sha1, int); extern int create_symref(const char *git_HEAD, const char *refs_heads_master); +extern int create_file_symref(const char *git_HEAD, const char *refs_heads_master); extern int validate_symref(const char *git_HEAD); /* General helper functions */ diff --git a/init-db.c b/init-db.c index aabc09f..2d2b705 100644 --- a/init-db.c +++ b/init-db.c @@ -161,6 +161,8 @@ static void copy_templates(const char *g closedir(dir); } +static int try_symref = 1; + static void create_default_files(const char *git_dir, char *template_path) { @@ -191,8 +193,11 @@ static void create_default_files(const c */ strcpy(path + len, "HEAD"); if (read_ref(path, sha1) < 0) { - if (create_symref(path, "refs/heads/master") < 0) - exit(1); + int err = 0; + if ( try_symref ) + err = create_symref(path, "refs/heads/master"); + if ( !err && create_file_symref(path, "refs/heads/master") < 0 ) + die("cannot create %s", path); } path[len] = 0; copy_templates(path, len, template_path); @@ -220,6 +225,8 @@ int main(int argc, char **argv) break; else if (!strncmp(arg, "--template=", 11)) template_dir = arg+11; + else if (!strcmp(arg, "--no-symref")) + try_symref = 0; else die(init_db_usage); } diff --git a/refs.c b/refs.c index 97506a4..8029667 100644 --- a/refs.c +++ b/refs.c @@ -120,6 +120,12 @@ int create_symref(const char *git_HEAD, unlink(git_HEAD); return symlink(refs_heads_master, git_HEAD); #else + return create_file_symref(git_HEAD, refs_heads_master); +#endif +} + +int create_file_symref(const char *git_HEAD, const char *refs_heads_master) +{ const char *lockpath; char ref[1000]; int fd, len, written; @@ -144,7 +150,6 @@ int create_symref(const char *git_HEAD, return -3; } return 0; -#endif } int read_ref(const char *filename, unsigned char *sha1) --- 0.99.8.GIT ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/4] git-init-db should error out with a message 2005-10-26 19:45 ` Alex Riesen @ 2005-10-26 20:27 ` Junio C Hamano 2005-10-26 20:47 ` Alex Riesen 0 siblings, 1 reply; 5+ messages in thread From: Junio C Hamano @ 2005-10-26 20:27 UTC (permalink / raw) To: Alex Riesen; +Cc: git Alex Riesen <fork0@users.sourceforge.net> writes: > Not just that. It would be interesting to give the user an option to > use the file references ("ref: refs/heads/master"). Actually, the users should not have to care how HEAD reference is implemented. It might make sense to use regular file symref regardless of platforms (i.e. never define USE_SYMLINK_HEAD on any platform). We support reading from either kind of symref, so if we did that, the only case that *could* matter form compatibility point of view is that repositories touched by the updated git is unusable for an ancient git that does not understand regular file symref. From performance and simplicity point of view, however, using symlink when possible is better, and that is what Johannes' patch does. HOWEVER, I think "falling back" (both in Johannes' patch which is in the "master" branch, and your version) has a funny failure mode. What happens when two processes try redirecting .git/HEAD simultaneously, possibly to different branch heads? Both of them unlink(), one successfully does symlink(), and the other gets EEXIST and falls back to create regular file symref. Which is probably not so wrong; if this race matters, then you have bigger problem -- the user is doing 'git checkout' of different branches at the same time, or something silly like that. But it does not feel quite right, either. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/4] git-init-db should error out with a message 2005-10-26 20:27 ` Junio C Hamano @ 2005-10-26 20:47 ` Alex Riesen 2005-10-26 23:18 ` Junio C Hamano 0 siblings, 1 reply; 5+ messages in thread From: Alex Riesen @ 2005-10-26 20:47 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano, Wed, Oct 26, 2005 22:27:00 +0200: > > Not just that. It would be interesting to give the user an option to > > use the file references ("ref: refs/heads/master"). > > Actually, the users should not have to care how HEAD reference > is implemented. It might make sense to use regular file symref > regardless of platforms (i.e. never define USE_SYMLINK_HEAD on > any platform). This my idea too. All the time I was doing that patch :) > HOWEVER, I think "falling back" (both in Johannes' patch which > is in the "master" branch, and your version) has a funny failure > mode. What happens when two processes try redirecting .git/HEAD > simultaneously, possibly to different branch heads? Both of > them unlink(), one successfully does symlink(), and the other > gets EEXIST and falls back to create regular file symref. I think the file ref version uses rename of HEAD.lock into HEAD, doesn't it? Rename(2) should just remove the symlink, right? ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/4] git-init-db should error out with a message 2005-10-26 20:47 ` Alex Riesen @ 2005-10-26 23:18 ` Junio C Hamano 0 siblings, 0 replies; 5+ messages in thread From: Junio C Hamano @ 2005-10-26 23:18 UTC (permalink / raw) To: Alex Riesen; +Cc: git Alex Riesen <fork0@users.sourceforge.net> writes: > I think the file ref version uses rename of HEAD.lock into HEAD, doesn't it? > Rename(2) should just remove the symlink, right? If everybody used symlink or if everybody used regular file symref, we would catch this race and the second one will be stopped. My point was that by falling back we are introducing this unnecessary race, which might be unimportant but still it is a new race. To avoid that, I think symlink version needs to honor the HEAD.lock convention, which would slow down normal cases. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2005-10-26 23:18 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2005-10-25 23:39 [PATCH 1/4] git-init-db should error out with a message Johannes Schindelin 2005-10-26 19:45 ` Alex Riesen 2005-10-26 20:27 ` Junio C Hamano 2005-10-26 20:47 ` Alex Riesen 2005-10-26 23:18 ` Junio C Hamano
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).