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 | |
Christian Hesse | de83de2 | 2015-07-28 10:42:01 +0200 | [diff] [blame] | 15 | static int print_ref_info(const char *refname, const struct object_id *oid, |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 16 | int flags, void *cb_data) |
| 17 | { |
| 18 | struct object *obj; |
| 19 | |
Jeff Smith | 86a6d35 | 2017-08-09 19:02:56 -0500 | [diff] [blame^] | 20 | if (!(obj = parse_object(oid))) |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 21 | return 0; |
| 22 | |
Christian Hesse | de83de2 | 2015-07-28 10:42:01 +0200 | [diff] [blame] | 23 | htmlf("%s\t%s\n", oid_to_hex(oid), refname); |
Jason A. Donenfeld | 05da4c2 | 2013-02-01 21:08:51 +0100 | [diff] [blame] | 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; |
Christian Hesse | 559ab5e | 2016-01-05 07:38:53 +0100 | [diff] [blame] | 27 | htmlf("%s\t%s^{}\n", oid_to_hex(&obj->oid), refname); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 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; |
Jason A. Donenfeld | 6e498de | 2015-02-09 12:27:44 +0100 | [diff] [blame] | 35 | char *offset; |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 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(); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 40 | prepare_packed_git(); |
Jason A. Donenfeld | 6e498de | 2015-02-09 12:27:44 +0100 | [diff] [blame] | 41 | for (pack = packed_git; pack; pack = pack->next) { |
| 42 | if (pack->pack_local) { |
| 43 | offset = strrchr(pack->pack_name, '/'); |
| 44 | if (offset && offset[1] != '\0') |
| 45 | ++offset; |
| 46 | else |
| 47 | offset = pack->pack_name; |
| 48 | htmlf("P %s\n", offset); |
| 49 | } |
| 50 | } |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 51 | } |
| 52 | |
Christian Hesse | de83de2 | 2015-07-28 10:42:01 +0200 | [diff] [blame] | 53 | static void send_file(const char *path) |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 54 | { |
| 55 | struct stat st; |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 56 | |
| 57 | if (stat(path, &st)) { |
| 58 | switch (errno) { |
| 59 | case ENOENT: |
John Keeping | 329381d | 2015-08-14 12:47:03 +0100 | [diff] [blame] | 60 | cgit_print_error_page(404, "Not found", "Not found"); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 61 | break; |
| 62 | case EACCES: |
John Keeping | 329381d | 2015-08-14 12:47:03 +0100 | [diff] [blame] | 63 | cgit_print_error_page(403, "Forbidden", "Forbidden"); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 64 | break; |
| 65 | default: |
John Keeping | 329381d | 2015-08-14 12:47:03 +0100 | [diff] [blame] | 66 | cgit_print_error_page(400, "Bad request", "Bad request"); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 67 | } |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 68 | return; |
| 69 | } |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 70 | ctx.page.mimetype = "application/octet-stream"; |
| 71 | ctx.page.filename = path; |
Lukas Fleischer | b66b16e | 2015-02-09 07:25:00 +0100 | [diff] [blame] | 72 | skip_prefix(path, ctx.repo->path, &ctx.page.filename); |
| 73 | skip_prefix(ctx.page.filename, "/", &ctx.page.filename); |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 74 | cgit_print_http_headers(); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 75 | html_include(path); |
| 76 | } |
| 77 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 78 | void cgit_clone_info(void) |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 79 | { |
Lukas Fleischer | ed7e3bc | 2015-01-15 19:47:42 +0100 | [diff] [blame] | 80 | if (!ctx.qry.path || strcmp(ctx.qry.path, "refs")) { |
John Keeping | 329381d | 2015-08-14 12:47:03 +0100 | [diff] [blame] | 81 | cgit_print_error_page(400, "Bad request", "Bad request"); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 82 | return; |
Lukas Fleischer | ed7e3bc | 2015-01-15 19:47:42 +0100 | [diff] [blame] | 83 | } |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 84 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 85 | ctx.page.mimetype = "text/plain"; |
| 86 | ctx.page.filename = "info/refs"; |
| 87 | cgit_print_http_headers(); |
| 88 | for_each_ref(print_ref_info, NULL); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 89 | } |
| 90 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 91 | void cgit_clone_objects(void) |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 92 | { |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 93 | if (!ctx.qry.path) { |
John Keeping | 329381d | 2015-08-14 12:47:03 +0100 | [diff] [blame] | 94 | cgit_print_error_page(400, "Bad request", "Bad request"); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 95 | return; |
| 96 | } |
| 97 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 98 | if (!strcmp(ctx.qry.path, "info/packs")) { |
| 99 | print_pack_info(); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 100 | return; |
| 101 | } |
| 102 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 103 | send_file(git_path("objects/%s", ctx.qry.path)); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 104 | } |
| 105 | |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 106 | void cgit_clone_head(void) |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 107 | { |
Lukas Fleischer | f60ffa1 | 2014-01-15 21:53:15 +0100 | [diff] [blame] | 108 | send_file(git_path("%s", "HEAD")); |
Lars Hjemli | 02a545e | 2008-08-06 01:20:24 +0200 | [diff] [blame] | 109 | } |