mirror of
https://github.com/git/git.git
synced 2024-11-24 18:33:43 +08:00
6eb7ed5403
This patch adds three similar and related programs. http-pull downloads objects from an HTTP server; rpull downloads objects by using ssh and rpush on the other side; and rpush uploads objects by using ssh and rpull on the other side. The algorithm should be sufficient to make the network throughput required depend only on how much content is new, not at all on how much content the repository contains. The combination should enable people to have remote repositories by way of ssh login for authenticated users and HTTP for anonymous access. Signed-Off-By: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
70 lines
1.3 KiB
C
70 lines
1.3 KiB
C
#include "cache.h"
|
|
#include "rsh.h"
|
|
#include <sys/socket.h>
|
|
#include <errno.h>
|
|
|
|
void service(int fd_in, int fd_out) {
|
|
ssize_t size;
|
|
int posn;
|
|
char sha1[20];
|
|
unsigned long objsize;
|
|
void *buf;
|
|
do {
|
|
posn = 0;
|
|
do {
|
|
size = read(fd_in, sha1 + posn, 20 - posn);
|
|
if (size < 0) {
|
|
perror("rpush: read ");
|
|
return;
|
|
}
|
|
if (!size)
|
|
return;
|
|
posn += size;
|
|
} while (posn < 20);
|
|
|
|
/* fprintf(stderr, "Serving %s\n", sha1_to_hex(sha1)); */
|
|
|
|
buf = map_sha1_file(sha1, &objsize);
|
|
if (!buf) {
|
|
fprintf(stderr, "rpush: could not find %s\n",
|
|
sha1_to_hex(sha1));
|
|
return;
|
|
}
|
|
posn = 0;
|
|
do {
|
|
size = write(fd_out, buf + posn, objsize - posn);
|
|
if (size <= 0) {
|
|
if (!size) {
|
|
fprintf(stderr, "rpush: write closed");
|
|
} else {
|
|
perror("rpush: write ");
|
|
}
|
|
return;
|
|
}
|
|
posn += size;
|
|
} while (posn < objsize);
|
|
} while (1);
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int arg = 1;
|
|
char *commit_id;
|
|
char *url;
|
|
int fd_in, fd_out;
|
|
while (arg < argc && argv[arg][0] == '-') {
|
|
arg++;
|
|
}
|
|
if (argc < arg + 2) {
|
|
usage("rpush [-c] [-t] [-a] commit-id url");
|
|
return 1;
|
|
}
|
|
commit_id = argv[arg];
|
|
url = argv[arg + 1];
|
|
if (setup_connection(&fd_in, &fd_out, "rpull", url, arg, argv + 1))
|
|
return 1;
|
|
|
|
service(fd_in, fd_out);
|
|
return 0;
|
|
}
|