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