Petr Baudis | 92747a9 | 2005-05-09 23:33:02 +0200 | [diff] [blame] | 1 | /* |
Rene Scharfe | ae64bbc | 2006-03-25 23:21:03 +0100 | [diff] [blame] | 2 | * Copyright (c) 2005, 2006 Rene Scharfe |
Petr Baudis | 92747a9 | 2005-05-09 23:33:02 +0200 | [diff] [blame] | 3 | */ |
Rene Scharfe | 731ab9c | 2005-04-28 12:16:43 -0700 | [diff] [blame] | 4 | #include "cache.h" |
Daniel Barkalow | c3f9281 | 2006-01-29 14:05:20 -0500 | [diff] [blame] | 5 | #include "commit.h" |
Rene Scharfe | ae64bbc | 2006-03-25 23:21:03 +0100 | [diff] [blame] | 6 | #include "tar.h" |
Peter Eriksen | 56d1398 | 2006-05-23 14:15:31 +0200 | [diff] [blame] | 7 | #include "builtin.h" |
Junio C Hamano | fd88d9c | 2006-09-24 14:42:01 -0700 | [diff] [blame] | 8 | #include "quote.h" |
Rene Scharfe | 731ab9c | 2005-04-28 12:16:43 -0700 | [diff] [blame] | 9 | |
Junio C Hamano | 2175426 | 2006-05-18 18:46:44 -0700 | [diff] [blame] | 10 | static const char tar_tree_usage[] = |
Junio C Hamano | fd88d9c | 2006-09-24 14:42:01 -0700 | [diff] [blame] | 11 | "git-tar-tree [--remote=<repo>] <tree-ish> [basedir]\n" |
| 12 | "*** Note that this command is now deprecated; use git-archive instead."; |
Junio C Hamano | 2175426 | 2006-05-18 18:46:44 -0700 | [diff] [blame] | 13 | |
Linus Torvalds | a633fca | 2006-07-28 22:44:25 -0700 | [diff] [blame] | 14 | int cmd_tar_tree(int argc, const char **argv, const char *prefix) |
Junio C Hamano | 2175426 | 2006-05-18 18:46:44 -0700 | [diff] [blame] | 15 | { |
Junio C Hamano | fd88d9c | 2006-09-24 14:42:01 -0700 | [diff] [blame] | 16 | /* |
| 17 | * git-tar-tree is now a wrapper around git-archive --format=tar |
| 18 | * |
| 19 | * $0 --remote=<repo> arg... ==> |
| 20 | * git-archive --format=tar --remote=<repo> arg... |
| 21 | * $0 tree-ish ==> |
| 22 | * git-archive --format=tar tree-ish |
| 23 | * $0 tree-ish basedir ==> |
| 24 | * git-archive --format-tar --prefix=basedir tree-ish |
| 25 | */ |
| 26 | int i; |
| 27 | const char **nargv = xcalloc(sizeof(*nargv), argc + 2); |
| 28 | char *basedir_arg; |
| 29 | int nargc = 0; |
| 30 | |
| 31 | nargv[nargc++] = "git-archive"; |
| 32 | nargv[nargc++] = "--format=tar"; |
| 33 | |
Junio C Hamano | 599065a | 2007-02-20 01:54:00 -0800 | [diff] [blame] | 34 | if (2 <= argc && !prefixcmp(argv[1], "--remote=")) { |
Junio C Hamano | fd88d9c | 2006-09-24 14:42:01 -0700 | [diff] [blame] | 35 | nargv[nargc++] = argv[1]; |
| 36 | argv++; |
| 37 | argc--; |
| 38 | } |
| 39 | switch (argc) { |
| 40 | default: |
Junio C Hamano | 2175426 | 2006-05-18 18:46:44 -0700 | [diff] [blame] | 41 | usage(tar_tree_usage); |
Junio C Hamano | fd88d9c | 2006-09-24 14:42:01 -0700 | [diff] [blame] | 42 | break; |
| 43 | case 3: |
| 44 | /* base-path */ |
| 45 | basedir_arg = xmalloc(strlen(argv[2]) + 11); |
| 46 | sprintf(basedir_arg, "--prefix=%s/", argv[2]); |
| 47 | nargv[nargc++] = basedir_arg; |
| 48 | /* fallthru */ |
| 49 | case 2: |
| 50 | /* tree-ish */ |
| 51 | nargv[nargc++] = argv[1]; |
| 52 | } |
| 53 | nargv[nargc] = NULL; |
| 54 | |
| 55 | fprintf(stderr, |
| 56 | "*** git-tar-tree is now deprecated.\n" |
| 57 | "*** Running git-archive instead.\n***"); |
| 58 | for (i = 0; i < nargc; i++) { |
| 59 | fputc(' ', stderr); |
| 60 | sq_quote_print(stderr, nargv[i]); |
| 61 | } |
| 62 | fputc('\n', stderr); |
| 63 | return cmd_archive(nargc, nargv, prefix); |
Junio C Hamano | 2175426 | 2006-05-18 18:46:44 -0700 | [diff] [blame] | 64 | } |
Rene Scharfe | 52ba03c | 2006-06-10 16:13:41 +0200 | [diff] [blame] | 65 | |
| 66 | /* ustar header + extended global header content */ |
Junio C Hamano | fd88d9c | 2006-09-24 14:42:01 -0700 | [diff] [blame] | 67 | #define RECORDSIZE (512) |
Rene Scharfe | 52ba03c | 2006-06-10 16:13:41 +0200 | [diff] [blame] | 68 | #define HEADERSIZE (2 * RECORDSIZE) |
| 69 | |
Linus Torvalds | a633fca | 2006-07-28 22:44:25 -0700 | [diff] [blame] | 70 | int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix) |
Rene Scharfe | 52ba03c | 2006-06-10 16:13:41 +0200 | [diff] [blame] | 71 | { |
| 72 | char buffer[HEADERSIZE]; |
| 73 | struct ustar_header *header = (struct ustar_header *)buffer; |
| 74 | char *content = buffer + RECORDSIZE; |
| 75 | ssize_t n; |
| 76 | |
Andy Whitcroft | 93d26e4 | 2007-01-08 15:58:08 +0000 | [diff] [blame] | 77 | n = read_in_full(0, buffer, HEADERSIZE); |
Rene Scharfe | 52ba03c | 2006-06-10 16:13:41 +0200 | [diff] [blame] | 78 | if (n < HEADERSIZE) |
| 79 | die("git-get-tar-commit-id: read error"); |
| 80 | if (header->typeflag[0] != 'g') |
| 81 | return 1; |
| 82 | if (memcmp(content, "52 comment=", 11)) |
| 83 | return 1; |
| 84 | |
Andy Whitcroft | 93822c2 | 2007-01-08 15:58:23 +0000 | [diff] [blame] | 85 | n = write_in_full(1, content + 11, 41); |
Rene Scharfe | 52ba03c | 2006-06-10 16:13:41 +0200 | [diff] [blame] | 86 | if (n < 41) |
| 87 | die("git-get-tar-commit-id: write error"); |
| 88 | |
| 89 | return 0; |
| 90 | } |