diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-03 15:16:18 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-03 15:16:18 -0700 |
commit | a31c6d022e2435a514fcc8ca57f9995c4376a986 (patch) | |
tree | 51a882a2dc62e0d3cdc79e0badc61559fb723481 | |
parent | aac17941320f7f73e5d411b152bfd041572e8a66 (diff) | |
download | git-a31c6d022e2435a514fcc8ca57f9995c4376a986.tar.gz |
sha1_file: make the new sha1 object writing be coda-friendly.
Coda doesn't like cross-directory hardlinks. So try to fall back
on a plain rename instead.
-rw-r--r-- | sha1_file.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/sha1_file.c b/sha1_file.c index 8f577985af..e6ce455ae9 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -353,8 +353,21 @@ int write_sha1_file(char *buf, unsigned long len, const char *type, unsigned cha close(fd); ret = link(tmpfile, filename); - if (ret < 0) + if (ret < 0) { ret = errno; + + /* + * Coda hack - coda doesn't like cross-directory links, + * so we fall back to a rename, which will mean that it + * won't be able to check collisions, but that's not a + * big deal. + * + * When this succeeds, we just return 0. We have nothing + * left to unlink. + */ + if (ret == EXDEV && !rename(tmpfile, filename)) + return 0; + } unlink(tmpfile); if (ret) { if (ret != EEXIST) { |