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