Linus Torvalds | 8bc9a0c | 2005-04-07 15:16:10 -0700 | [diff] [blame] | 1 | /* |
| 2 | * GIT - The information manager from hell |
| 3 | * |
| 4 | * Copyright (C) Linus Torvalds, 2005 |
| 5 | */ |
Junio C Hamano | 4d3fe0c | 2005-09-06 12:53:56 -0700 | [diff] [blame] | 6 | |
Nguyễn Thái Ngọc Duy | f8adbec | 2019-01-24 15:29:12 +0700 | [diff] [blame] | 7 | #define USE_THE_INDEX_COMPATIBILITY_MACROS |
Linus Torvalds | e83c516 | 2005-04-07 15:13:13 -0700 | [diff] [blame] | 8 | #include "cache.h" |
Brandon Williams | b2141fc | 2017-06-14 11:07:36 -0700 | [diff] [blame] | 9 | #include "config.h" |
Michael Haggerty | 697cc8e | 2014-10-01 12:28:42 +0200 | [diff] [blame] | 10 | #include "lockfile.h" |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 11 | #include "object.h" |
| 12 | #include "tree.h" |
Linus Torvalds | 1ccf5a3 | 2006-05-29 12:18:00 -0700 | [diff] [blame] | 13 | #include "tree-walk.h" |
Junio C Hamano | bad68ec | 2006-04-24 21:18:58 -0700 | [diff] [blame] | 14 | #include "cache-tree.h" |
Johannes Schindelin | 16da134 | 2006-07-30 20:25:18 +0200 | [diff] [blame] | 15 | #include "unpack-trees.h" |
Junio C Hamano | f8a9d42 | 2006-12-04 16:00:46 -0800 | [diff] [blame] | 16 | #include "dir.h" |
Peter Eriksen | d147e50 | 2006-05-23 14:15:32 +0200 | [diff] [blame] | 17 | #include "builtin.h" |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 18 | #include "parse-options.h" |
Junio C Hamano | cfc5789 | 2009-12-25 00:30:51 -0800 | [diff] [blame] | 19 | #include "resolve-undo.h" |
Stefan Beller | 2580491 | 2017-03-14 14:46:42 -0700 | [diff] [blame] | 20 | #include "submodule.h" |
| 21 | #include "submodule-config.h" |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 22 | |
Linus Torvalds | 933bf40 | 2007-08-09 22:21:29 -0700 | [diff] [blame] | 23 | static int nr_trees; |
Jan Krüger | fb1bb96 | 2010-09-10 15:28:59 +0200 | [diff] [blame] | 24 | static int read_empty; |
Junio C Hamano | ca885a4 | 2008-03-13 22:07:18 -0700 | [diff] [blame] | 25 | static struct tree *trees[MAX_UNPACK_TREES]; |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 26 | |
brian m. carlson | 4939e2c | 2017-05-06 22:10:30 +0000 | [diff] [blame] | 27 | static int list_tree(struct object_id *oid) |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 28 | { |
Linus Torvalds | 933bf40 | 2007-08-09 22:21:29 -0700 | [diff] [blame] | 29 | struct tree *tree; |
| 30 | |
Junio C Hamano | ca885a4 | 2008-03-13 22:07:18 -0700 | [diff] [blame] | 31 | if (nr_trees >= MAX_UNPACK_TREES) |
| 32 | die("I cannot read more than %d trees", MAX_UNPACK_TREES); |
brian m. carlson | a9dbc17 | 2017-05-06 22:10:37 +0000 | [diff] [blame] | 33 | tree = parse_tree_indirect(oid); |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 34 | if (!tree) |
| 35 | return -1; |
Linus Torvalds | 933bf40 | 2007-08-09 22:21:29 -0700 | [diff] [blame] | 36 | trees[nr_trees++] = tree; |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 37 | return 0; |
| 38 | } |
| 39 | |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 40 | static const char * const read_tree_usage[] = { |
Alex Henrie | 9476c2c | 2015-08-26 22:27:06 -0600 | [diff] [blame] | 41 | N_("git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"), |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 42 | NULL |
| 43 | }; |
| 44 | |
| 45 | static int index_output_cb(const struct option *opt, const char *arg, |
| 46 | int unset) |
| 47 | { |
Jeff King | 517fe80 | 2018-11-05 01:45:42 -0500 | [diff] [blame] | 48 | BUG_ON_OPT_NEG(unset); |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 49 | set_alternate_index_output(arg); |
| 50 | return 0; |
| 51 | } |
| 52 | |
| 53 | static int exclude_per_directory_cb(const struct option *opt, const char *arg, |
| 54 | int unset) |
| 55 | { |
| 56 | struct dir_struct *dir; |
| 57 | struct unpack_trees_options *opts; |
| 58 | |
Jeff King | 517fe80 | 2018-11-05 01:45:42 -0500 | [diff] [blame] | 59 | BUG_ON_OPT_NEG(unset); |
| 60 | |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 61 | opts = (struct unpack_trees_options *)opt->value; |
| 62 | |
| 63 | if (opts->dir) |
| 64 | die("more than one --exclude-per-directory given."); |
| 65 | |
| 66 | dir = xcalloc(1, sizeof(*opts->dir)); |
| 67 | dir->flags |= DIR_SHOW_IGNORED; |
| 68 | dir->exclude_per_dir = arg; |
| 69 | opts->dir = dir; |
| 70 | /* We do not need to nor want to do read-directory |
| 71 | * here; we are merely interested in reusing the |
| 72 | * per directory ignore stack mechanism. |
| 73 | */ |
| 74 | return 0; |
| 75 | } |
Junio C Hamano | c5bac17 | 2005-04-20 19:49:16 -0700 | [diff] [blame] | 76 | |
René Scharfe | eb9ae4b | 2013-06-02 17:46:55 +0200 | [diff] [blame] | 77 | static void debug_stage(const char *label, const struct cache_entry *ce, |
Junio C Hamano | ba655da | 2009-09-14 02:22:00 -0700 | [diff] [blame] | 78 | struct unpack_trees_options *o) |
| 79 | { |
| 80 | printf("%s ", label); |
| 81 | if (!ce) |
| 82 | printf("(missing)\n"); |
| 83 | else if (ce == o->df_conflict_entry) |
| 84 | printf("(conflict)\n"); |
| 85 | else |
| 86 | printf("%06o #%d %s %.8s\n", |
| 87 | ce->ce_mode, ce_stage(ce), ce->name, |
brian m. carlson | 99d1a98 | 2016-09-05 20:07:52 +0000 | [diff] [blame] | 88 | oid_to_hex(&ce->oid)); |
Junio C Hamano | ba655da | 2009-09-14 02:22:00 -0700 | [diff] [blame] | 89 | } |
| 90 | |
René Scharfe | 5828e83 | 2013-06-02 17:46:56 +0200 | [diff] [blame] | 91 | static int debug_merge(const struct cache_entry * const *stages, |
| 92 | struct unpack_trees_options *o) |
Junio C Hamano | ba655da | 2009-09-14 02:22:00 -0700 | [diff] [blame] | 93 | { |
| 94 | int i; |
| 95 | |
| 96 | printf("* %d-way merge\n", o->merge_size); |
| 97 | debug_stage("index", stages[0], o); |
| 98 | for (i = 1; i <= o->merge_size; i++) { |
| 99 | char buf[24]; |
Jeff King | 5096d49 | 2015-09-24 17:06:08 -0400 | [diff] [blame] | 100 | xsnprintf(buf, sizeof(buf), "ent#%d", i); |
Junio C Hamano | ba655da | 2009-09-14 02:22:00 -0700 | [diff] [blame] | 101 | debug_stage(buf, stages[i], o); |
| 102 | } |
| 103 | return 0; |
| 104 | } |
| 105 | |
Stefan Beller | 046b482 | 2017-05-31 17:30:47 -0700 | [diff] [blame] | 106 | static int git_read_tree_config(const char *var, const char *value, void *cb) |
Stefan Beller | 2580491 | 2017-03-14 14:46:42 -0700 | [diff] [blame] | 107 | { |
Stefan Beller | 046b482 | 2017-05-31 17:30:47 -0700 | [diff] [blame] | 108 | if (!strcmp(var, "submodule.recurse")) |
| 109 | return git_default_submodule_config(var, value, cb); |
Stefan Beller | 2580491 | 2017-03-14 14:46:42 -0700 | [diff] [blame] | 110 | |
Stefan Beller | 046b482 | 2017-05-31 17:30:47 -0700 | [diff] [blame] | 111 | return git_default_config(var, value, cb); |
Stefan Beller | 2580491 | 2017-03-14 14:46:42 -0700 | [diff] [blame] | 112 | } |
| 113 | |
Jeff King | 76a7bc0 | 2019-05-09 17:27:24 -0400 | [diff] [blame] | 114 | int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix) |
Linus Torvalds | e83c516 | 2005-04-07 15:13:13 -0700 | [diff] [blame] | 115 | { |
Nguyễn Thái Ngọc Duy | 03b8664 | 2014-06-13 19:19:23 +0700 | [diff] [blame] | 116 | int i, stage = 0; |
brian m. carlson | 4939e2c | 2017-05-06 22:10:30 +0000 | [diff] [blame] | 117 | struct object_id oid; |
Junio C Hamano | ca885a4 | 2008-03-13 22:07:18 -0700 | [diff] [blame] | 118 | struct tree_desc t[MAX_UNPACK_TREES]; |
Johannes Schindelin | 16da134 | 2006-07-30 20:25:18 +0200 | [diff] [blame] | 119 | struct unpack_trees_options opts; |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 120 | int prefix_set = 0; |
Martin Ågren | 0fa5a2e | 2018-05-09 22:55:39 +0200 | [diff] [blame] | 121 | struct lock_file lock_file = LOCK_INIT; |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 122 | const struct option read_tree_options[] = { |
Nguyễn Thái Ngọc Duy | 230c6cd | 2012-08-20 19:32:34 +0700 | [diff] [blame] | 123 | { OPTION_CALLBACK, 0, "index-output", NULL, N_("file"), |
| 124 | N_("write resulting index to <file>"), |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 125 | PARSE_OPT_NONEG, index_output_cb }, |
Stefan Beller | 84a7f09 | 2017-01-09 17:45:39 -0800 | [diff] [blame] | 126 | OPT_BOOL(0, "empty", &read_empty, |
| 127 | N_("only empty the index")), |
Nguyễn Thái Ngọc Duy | 230c6cd | 2012-08-20 19:32:34 +0700 | [diff] [blame] | 128 | OPT__VERBOSE(&opts.verbose_update, N_("be verbose")), |
| 129 | OPT_GROUP(N_("Merging")), |
Stefan Beller | 84a7f09 | 2017-01-09 17:45:39 -0800 | [diff] [blame] | 130 | OPT_BOOL('m', NULL, &opts.merge, |
| 131 | N_("perform a merge in addition to a read")), |
| 132 | OPT_BOOL(0, "trivial", &opts.trivial_merges_only, |
| 133 | N_("3-way merge if no file level merging required")), |
| 134 | OPT_BOOL(0, "aggressive", &opts.aggressive, |
| 135 | N_("3-way merge in presence of adds and removes")), |
| 136 | OPT_BOOL(0, "reset", &opts.reset, |
| 137 | N_("same as -m, but discard unmerged entries")), |
Nguyễn Thái Ngọc Duy | 230c6cd | 2012-08-20 19:32:34 +0700 | [diff] [blame] | 138 | { OPTION_STRING, 0, "prefix", &opts.prefix, N_("<subdirectory>/"), |
| 139 | N_("read the tree into the index under <subdirectory>/"), |
René Scharfe | 5f0df44 | 2018-08-02 21:18:14 +0200 | [diff] [blame] | 140 | PARSE_OPT_NONEG }, |
Stefan Beller | 84a7f09 | 2017-01-09 17:45:39 -0800 | [diff] [blame] | 141 | OPT_BOOL('u', NULL, &opts.update, |
| 142 | N_("update working tree with merge result")), |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 143 | { OPTION_CALLBACK, 0, "exclude-per-directory", &opts, |
Nguyễn Thái Ngọc Duy | 230c6cd | 2012-08-20 19:32:34 +0700 | [diff] [blame] | 144 | N_("gitignore"), |
| 145 | N_("allow explicitly ignored files to be overwritten"), |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 146 | PARSE_OPT_NONEG, exclude_per_directory_cb }, |
Stefan Beller | 84a7f09 | 2017-01-09 17:45:39 -0800 | [diff] [blame] | 147 | OPT_BOOL('i', NULL, &opts.index_only, |
| 148 | N_("don't check the working tree after merging")), |
Nguyễn Thái Ngọc Duy | 230c6cd | 2012-08-20 19:32:34 +0700 | [diff] [blame] | 149 | OPT__DRY_RUN(&opts.dry_run, N_("don't update the index or the work tree")), |
Stefan Beller | 84a7f09 | 2017-01-09 17:45:39 -0800 | [diff] [blame] | 150 | OPT_BOOL(0, "no-sparse-checkout", &opts.skip_sparse_checkout, |
| 151 | N_("skip applying sparse checkout filter")), |
| 152 | OPT_BOOL(0, "debug-unpack", &opts.debug_unpack, |
| 153 | N_("debug unpack-trees")), |
Stefan Beller | 58b75bd | 2017-05-26 12:10:10 -0700 | [diff] [blame] | 154 | { OPTION_CALLBACK, 0, "recurse-submodules", NULL, |
Stefan Beller | 2580491 | 2017-03-14 14:46:42 -0700 | [diff] [blame] | 155 | "checkout", "control recursive updating of submodules", |
Stefan Beller | d7a3803 | 2017-05-26 12:10:12 -0700 | [diff] [blame] | 156 | PARSE_OPT_OPTARG, option_parse_recurse_submodules_worktree_updater }, |
Nguyễn Thái Ngọc Duy | 3e41485 | 2019-03-22 16:31:37 +0700 | [diff] [blame] | 157 | OPT__QUIET(&opts.quiet, N_("suppress feedback messages")), |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 158 | OPT_END() |
| 159 | }; |
Linus Torvalds | e83c516 | 2005-04-07 15:13:13 -0700 | [diff] [blame] | 160 | |
Johannes Schindelin | 16da134 | 2006-07-30 20:25:18 +0200 | [diff] [blame] | 161 | memset(&opts, 0, sizeof(opts)); |
| 162 | opts.head_idx = -1; |
Linus Torvalds | 34110cd | 2008-03-06 18:12:28 -0800 | [diff] [blame] | 163 | opts.src_index = &the_index; |
| 164 | opts.dst_index = &the_index; |
Shawn Pearce | 344c52a | 2006-07-08 14:34:02 -0400 | [diff] [blame] | 165 | |
Stefan Beller | 046b482 | 2017-05-31 17:30:47 -0700 | [diff] [blame] | 166 | git_config(git_read_tree_config, NULL); |
Junio C Hamano | 53228a5 | 2005-11-26 00:50:02 -0800 | [diff] [blame] | 167 | |
Jeff King | 76a7bc0 | 2019-05-09 17:27:24 -0400 | [diff] [blame] | 168 | argc = parse_options(argc, argv, cmd_prefix, read_tree_options, |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 169 | read_tree_usage, 0); |
| 170 | |
Stefan Beller | d7a3803 | 2017-05-26 12:10:12 -0700 | [diff] [blame] | 171 | hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR); |
Stefan Beller | 2580491 | 2017-03-14 14:46:42 -0700 | [diff] [blame] | 172 | |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 173 | prefix_set = opts.prefix ? 1 : 0; |
| 174 | if (1 < opts.merge + opts.reset + prefix_set) |
| 175 | die("Which one? -m, --reset, or --prefix?"); |
Alexandre Julliard | db137fe | 2009-08-17 17:35:44 +0200 | [diff] [blame] | 176 | |
Nguyễn Thái Ngọc Duy | 5a092ce | 2014-06-13 19:19:48 +0700 | [diff] [blame] | 177 | /* |
| 178 | * NEEDSWORK |
| 179 | * |
| 180 | * The old index should be read anyway even if we're going to |
| 181 | * destroy all index entries because we still need to preserve |
| 182 | * certain information such as index version or split-index |
| 183 | * mode. |
| 184 | */ |
| 185 | |
Alexandre Julliard | db137fe | 2009-08-17 17:35:44 +0200 | [diff] [blame] | 186 | if (opts.reset || opts.merge || opts.prefix) { |
| 187 | if (read_cache_unmerged() && (opts.prefix || opts.merge)) |
| 188 | die("You need to resolve your current index first"); |
| 189 | stage = opts.merge = 1; |
| 190 | } |
Junio C Hamano | cfc5789 | 2009-12-25 00:30:51 -0800 | [diff] [blame] | 191 | resolve_undo_clear(); |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 192 | |
| 193 | for (i = 0; i < argc; i++) { |
Linus Torvalds | 83adac3 | 2005-04-09 12:11:25 -0700 | [diff] [blame] | 194 | const char *arg = argv[i]; |
| 195 | |
brian m. carlson | 4939e2c | 2017-05-06 22:10:30 +0000 | [diff] [blame] | 196 | if (get_oid(arg, &oid)) |
Dmitry V. Levin | 31fff30 | 2006-05-09 01:43:38 +0400 | [diff] [blame] | 197 | die("Not a valid object name %s", arg); |
brian m. carlson | 4939e2c | 2017-05-06 22:10:30 +0000 | [diff] [blame] | 198 | if (list_tree(&oid) < 0) |
Petr Baudis | 2de381f | 2005-04-13 02:28:48 -0700 | [diff] [blame] | 199 | die("failed to unpack tree object %s", arg); |
Linus Torvalds | d99082e | 2005-04-15 22:53:45 -0700 | [diff] [blame] | 200 | stage++; |
Linus Torvalds | 83adac3 | 2005-04-09 12:11:25 -0700 | [diff] [blame] | 201 | } |
Junio C Hamano | b9b10d3 | 2017-05-10 21:31:54 -0700 | [diff] [blame] | 202 | if (!nr_trees && !read_empty && !opts.merge) |
Jan Krüger | fb1bb96 | 2010-09-10 15:28:59 +0200 | [diff] [blame] | 203 | warning("read-tree: emptying the index with no arguments is deprecated; use --empty"); |
| 204 | else if (nr_trees > 0 && read_empty) |
| 205 | die("passing trees as arguments contradicts --empty"); |
| 206 | |
Stephen Boyd | 5a56da5 | 2009-06-25 22:14:10 -0700 | [diff] [blame] | 207 | if (1 < opts.index_only + opts.update) |
| 208 | die("-u and -i at the same time makes no sense"); |
Junio C Hamano | c01499e | 2013-10-16 10:26:39 -0700 | [diff] [blame] | 209 | if ((opts.update || opts.index_only) && !opts.merge) |
Stephen Boyd | a429d2d | 2009-06-25 22:14:09 -0700 | [diff] [blame] | 210 | die("%s is meaningless without -m, --reset, or --prefix", |
| 211 | opts.update ? "-u" : "-i"); |
Junio C Hamano | f8a9d42 | 2006-12-04 16:00:46 -0800 | [diff] [blame] | 212 | if ((opts.dir && !opts.update)) |
| 213 | die("--exclude-per-directory is meaningless unless -u"); |
Nguyễn Thái Ngọc Duy | b6469a8 | 2008-08-28 20:03:22 +0700 | [diff] [blame] | 214 | if (opts.merge && !opts.index_only) |
| 215 | setup_work_tree(); |
Junio C Hamano | 7dd4357 | 2005-10-02 00:50:16 -0700 | [diff] [blame] | 216 | |
Johannes Schindelin | 16da134 | 2006-07-30 20:25:18 +0200 | [diff] [blame] | 217 | if (opts.merge) { |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 218 | switch (stage - 1) { |
Jean-Noel Avila | 9932242 | 2017-05-11 14:06:33 +0200 | [diff] [blame] | 219 | case 0: |
| 220 | die("you must specify at least one tree to merge"); |
| 221 | break; |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 222 | case 1: |
Johannes Schindelin | 16da134 | 2006-07-30 20:25:18 +0200 | [diff] [blame] | 223 | opts.fn = opts.prefix ? bind_merge : oneway_merge; |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 224 | break; |
| 225 | case 2: |
Johannes Schindelin | 16da134 | 2006-07-30 20:25:18 +0200 | [diff] [blame] | 226 | opts.fn = twoway_merge; |
Junio C Hamano | fa7b3c2 | 2008-11-12 11:52:35 -0800 | [diff] [blame] | 227 | opts.initial_checkout = is_cache_unborn(); |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 228 | break; |
| 229 | case 3: |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 230 | default: |
Johannes Schindelin | 16da134 | 2006-07-30 20:25:18 +0200 | [diff] [blame] | 231 | opts.fn = threeway_merge; |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 232 | break; |
Junio C Hamano | 03efa6d | 2005-06-10 18:36:08 -0700 | [diff] [blame] | 233 | } |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 234 | |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 235 | if (stage - 1 >= 3) |
Johannes Schindelin | 16da134 | 2006-07-30 20:25:18 +0200 | [diff] [blame] | 236 | opts.head_idx = stage - 2; |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 237 | else |
Johannes Schindelin | 16da134 | 2006-07-30 20:25:18 +0200 | [diff] [blame] | 238 | opts.head_idx = 1; |
Daniel Barkalow | ee6566e | 2005-09-05 02:04:48 -0400 | [diff] [blame] | 239 | } |
| 240 | |
Junio C Hamano | ba655da | 2009-09-14 02:22:00 -0700 | [diff] [blame] | 241 | if (opts.debug_unpack) |
| 242 | opts.fn = debug_merge; |
| 243 | |
Junio C Hamano | 8cc21ce | 2009-04-20 03:58:17 -0700 | [diff] [blame] | 244 | cache_tree_free(&active_cache_tree); |
Linus Torvalds | 933bf40 | 2007-08-09 22:21:29 -0700 | [diff] [blame] | 245 | for (i = 0; i < nr_trees; i++) { |
| 246 | struct tree *tree = trees[i]; |
| 247 | parse_tree(tree); |
| 248 | init_tree_desc(t+i, tree->buffer, tree->size); |
| 249 | } |
Daniel Barkalow | 203a2fe | 2008-02-07 11:39:48 -0500 | [diff] [blame] | 250 | if (unpack_trees(nr_trees, t, &opts)) |
| 251 | return 128; |
Junio C Hamano | 7927a55 | 2006-04-27 01:33:07 -0700 | [diff] [blame] | 252 | |
Jens Lehmann | ea5070c | 2011-05-25 22:10:41 +0200 | [diff] [blame] | 253 | if (opts.debug_unpack || opts.dry_run) |
Junio C Hamano | ba655da | 2009-09-14 02:22:00 -0700 | [diff] [blame] | 254 | return 0; /* do not write the index out */ |
| 255 | |
Junio C Hamano | 7927a55 | 2006-04-27 01:33:07 -0700 | [diff] [blame] | 256 | /* |
| 257 | * When reading only one tree (either the most basic form, |
| 258 | * "-m ent" or "--reset ent" form), we can obtain a fully |
| 259 | * valid cache-tree because the index must match exactly |
| 260 | * what came from the tree. |
| 261 | */ |
Junio C Hamano | 8cc21ce | 2009-04-20 03:58:17 -0700 | [diff] [blame] | 262 | if (nr_trees == 1 && !opts.prefix) |
Nguyễn Thái Ngọc Duy | c207e9e | 2018-11-10 06:49:02 +0100 | [diff] [blame] | 263 | prime_cache_tree(the_repository, |
| 264 | the_repository->index, |
| 265 | trees[0]); |
Junio C Hamano | 7927a55 | 2006-04-27 01:33:07 -0700 | [diff] [blame] | 266 | |
Nguyễn Thái Ngọc Duy | 03b8664 | 2014-06-13 19:19:23 +0700 | [diff] [blame] | 267 | if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK)) |
Petr Baudis | 2de381f | 2005-04-13 02:28:48 -0700 | [diff] [blame] | 268 | die("unable to write new index file"); |
Linus Torvalds | 9614b8d | 2005-04-11 15:39:26 -0700 | [diff] [blame] | 269 | return 0; |
Linus Torvalds | e83c516 | 2005-04-07 15:13:13 -0700 | [diff] [blame] | 270 | } |