summaryrefslogtreecommitdiff
path: root/checkout-cache.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-17 05:26:31 (GMT)
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-17 05:26:31 (GMT)
commite44794706eeb57f2ee38ed1604821aa38b8ad9d2 (patch)
treec49cd3e4f1dfe4ccbf2b8d00188beaa251fee028 /checkout-cache.c
parent9fec8b26eff58e1f595e8619abf1e42c07645ff8 (diff)
downloadgit-e44794706eeb57f2ee38ed1604821aa38b8ad9d2.zip
git-e44794706eeb57f2ee38ed1604821aa38b8ad9d2.tar.gz
git-e44794706eeb57f2ee38ed1604821aa38b8ad9d2.tar.bz2
Be much more liberal about the file mode bits.
We only really care about the difference between a file being executable or not (by its owner). Everything else we leave for the user umask to decide.
Diffstat (limited to 'checkout-cache.c')
-rw-r--r--checkout-cache.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/checkout-cache.c b/checkout-cache.c
index 8d5e4cd..09b36b9 100644
--- a/checkout-cache.c
+++ b/checkout-cache.c
@@ -52,11 +52,14 @@ static void create_directories(const char *path)
static int create_file(const char *path, unsigned int mode)
{
- int fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0600);
+ int fd;
+
+ mode = (mode & 0100) ? 777 : 666;
+ fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
if (fd < 0) {
if (errno == ENOENT) {
create_directories(path);
- fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0600);
+ fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
}
}
if (fd >= 0)
@@ -104,6 +107,14 @@ static int checkout_entry(struct cache_entry *ce)
fprintf(stderr, "checkout-cache: %s already exists\n", ce->name);
return 0;
}
+
+ /*
+ * We unlink the old file, to get the new one with the
+ * right permissions (including umask, which is nasty
+ * to emulate by hand - much easier to let the system
+ * just do the right thing)
+ */
+ unlink(ce->name);
}
return write_entry(ce);
}