Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 1 | /* ui-clone.c: functions for http cloning, based on |
| 2 | * git's http-backend.c by Shawn O. Pearce |
| 3 | * |
Lukas Fleischer | f7f26f8 | 2014-01-08 15:10:49 +0100 | [diff] [blame] | 4 | * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com> |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 5 | * |
| 6 | * Licensed under GNU General Public License v2 |
| 7 | * (see COPYING for full license text) |
| 8 | */ |
| 9 | |
| 10 | #include "cgit.h" |
John Keeping | 8f20879 | 2013-04-06 11:37:59 +0100 | [diff] [blame] | 11 | #include "ui-clone.h" |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 12 | #include "html.h" |
| 13 | #include "ui-shared.h" |
| 14 | |
| 15 | static int print_ref_info(const char *refname, const unsigned char *sha1, |
| 16 | int flags, void *cb_data) |
| 17 | { |
| 18 | struct object *obj; |
| 19 | |
| 20 | if (!(obj = parse_object(sha1))) |
| 21 | return 0; |
| 22 | |
Jason A. Donenfeld | 05da4c2 | 2013-02-01 21:08:51 +0100 | [diff] [blame] | 23 | htmlf("%s\t%s\n", sha1_to_hex(sha1), refname); |
| 24 | if (obj->type == OBJ_TAG) { |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 25 | if (!(obj = deref_tag(obj, refname, 0))) |
| 26 | return 0; |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 27 | htmlf("%s\t%s^{}\n", sha1_to_hex(obj->sha1), refname); |
| 28 | } |
| 29 | return 0; |
| 30 | } |
| 31 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 32 | static void print_pack_info(void) |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 33 | { |
| 34 | struct packed_git *pack; |
| 35 | int ofs; |
| 36 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 37 | ctx.page.mimetype = "text/plain"; |
| 38 | ctx.page.filename = "objects/info/packs"; |
| 39 | cgit_print_http_headers(); |
| 40 | ofs = strlen(ctx.repo->path) + strlen("/objects/pack/"); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 41 | prepare_packed_git(); |
| 42 | for (pack = packed_git; pack; pack = pack->next) |
| 43 | if (pack->pack_local) |
| 44 | htmlf("P %s\n", pack->pack_name + ofs); |
| 45 | } |
| 46 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 47 | static void send_file(char *path) |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 48 | { |
| 49 | struct stat st; |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 50 | |
| 51 | if (stat(path, &st)) { |
| 52 | switch (errno) { |
| 53 | case ENOENT: |
Lars Hjemli | 885096c | 2008-08-06 22:57:44 +0200 | [diff] [blame] | 54 | html_status(404, "Not found", 0); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 55 | break; |
| 56 | case EACCES: |
Lars Hjemli | 885096c | 2008-08-06 22:57:44 +0200 | [diff] [blame] | 57 | html_status(403, "Forbidden", 0); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 58 | break; |
| 59 | default: |
Lars Hjemli | 885096c | 2008-08-06 22:57:44 +0200 | [diff] [blame] | 60 | html_status(400, "Bad request", 0); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 61 | } |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 62 | return; |
| 63 | } |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 64 | ctx.page.mimetype = "application/octet-stream"; |
| 65 | ctx.page.filename = path; |
Lukas Fleischer | b66b16e | 2015-02-09 07:25:00 +0100 | [diff] [blame^] | 66 | skip_prefix(path, ctx.repo->path, &ctx.page.filename); |
| 67 | skip_prefix(ctx.page.filename, "/", &ctx.page.filename); |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 68 | cgit_print_http_headers(); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 69 | html_include(path); |
| 70 | } |
| 71 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 72 | void cgit_clone_info(void) |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 73 | { |
Lukas Fleischer | ed7e3bc | 2015-01-15 19:47:42 +0100 | [diff] [blame] | 74 | if (!ctx.qry.path || strcmp(ctx.qry.path, "refs")) { |
| 75 | html_status(400, "Bad request", 0); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 76 | return; |
Lukas Fleischer | ed7e3bc | 2015-01-15 19:47:42 +0100 | [diff] [blame] | 77 | } |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 78 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 79 | ctx.page.mimetype = "text/plain"; |
| 80 | ctx.page.filename = "info/refs"; |
| 81 | cgit_print_http_headers(); |
| 82 | for_each_ref(print_ref_info, NULL); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 83 | } |
| 84 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 85 | void cgit_clone_objects(void) |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 86 | { |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 87 | if (!ctx.qry.path) { |
Lars Hjemli | 885096c | 2008-08-06 22:57:44 +0200 | [diff] [blame] | 88 | html_status(400, "Bad request", 0); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 89 | return; |
| 90 | } |
| 91 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 92 | if (!strcmp(ctx.qry.path, "info/packs")) { |
| 93 | print_pack_info(); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 94 | return; |
| 95 | } |
| 96 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 97 | send_file(git_path("objects/%s", ctx.qry.path)); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 98 | } |
| 99 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 100 | void cgit_clone_head(void) |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 101 | { |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 102 | send_file(git_path("%s", "HEAD")); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 103 | } |