summaryrefslogtreecommitdiff
path: root/copy.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-10-22 08:28:13 (GMT)
committerJunio C Hamano <junkio@cox.net>2005-10-26 19:37:49 (GMT)
commitf3123c4ab3d3698262e59561ac084de45b10365a (patch)
tree5184f41aebc18fdd90c27b76b8fb230fda58fb84 /copy.c
parent7ebb6fcafed2a3d47390e6f47ff20a98fe451409 (diff)
downloadgit-f3123c4ab3d3698262e59561ac084de45b10365a.zip
git-f3123c4ab3d3698262e59561ac084de45b10365a.tar.gz
git-f3123c4ab3d3698262e59561ac084de45b10365a.tar.bz2
pack-objects: Allow use of pre-generated pack.
git-pack-objects can reuse pack files stored in $GIT_DIR/pack-cache directory, when a necessary pack is found. This is hopefully useful when upload-pack (called from git-daemon) is expected to receive requests for the same set of objects many times (e.g full cloning request of any project, or updates from the set of heads previous day to the latest for a slow moving project). Currently git-pack-objects does *not* keep pack files it creates for reusing. It might be useful to add --update-cache option to it, which would allow it store pack files it created in the pack-cache directory, and prune rarely used ones from it. Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'copy.c')
-rw-r--r--copy.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/copy.c b/copy.c
new file mode 100644
index 0000000..2009275
--- /dev/null
+++ b/copy.c
@@ -0,0 +1,37 @@
+#include "cache.h"
+
+int copy_fd(int ifd, int ofd)
+{
+ while (1) {
+ int len;
+ char buffer[8192];
+ char *buf = buffer;
+ len = read(ifd, buffer, sizeof(buffer));
+ if (!len)
+ break;
+ if (len < 0) {
+ if (errno == EAGAIN)
+ continue;
+ return error("copy-fd: read returned %s",
+ strerror(errno));
+ }
+ while (1) {
+ int written = write(ofd, buf, len);
+ if (written > 0) {
+ buf += written;
+ len -= written;
+ if (!len)
+ break;
+ }
+ if (!written)
+ return error("copy-fd: write returned 0");
+ if (errno == EAGAIN || errno == EINTR)
+ continue;
+ return error("copy-fd: write returned %s",
+ strerror(errno));
+ }
+ }
+ close(ifd);
+ return 0;
+}
+