~ubuntu-branches/ubuntu/intrepid/git-core/intrepid-security

« back to all changes in this revision

Viewing changes to builtin-read-tree.c

  • Committer: Package Import Robot
  • Author(s): Gerrit Pape
  • Date: 2007-10-04 08:27:01 UTC
  • mfrom: (1.1.23)
  • Revision ID: package-import@ubuntu.com-20071004082701-rsd058ontoqz4i30
Tags: 1:1.5.3.4-1
new upstream point release (closes: #445188).

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
#include "dir.h"
14
14
#include "builtin.h"
15
15
 
16
 
static struct object_list *trees;
 
16
#define MAX_TREES 8
 
17
static int nr_trees;
 
18
static struct tree *trees[MAX_TREES];
17
19
 
18
20
static int list_tree(unsigned char *sha1)
19
21
{
20
 
        struct tree *tree = parse_tree_indirect(sha1);
 
22
        struct tree *tree;
 
23
 
 
24
        if (nr_trees >= MAX_TREES)
 
25
                die("I cannot read more than %d trees", MAX_TREES);
 
26
        tree = parse_tree_indirect(sha1);
21
27
        if (!tree)
22
28
                return -1;
23
 
        object_list_append(&tree->object, &trees);
 
29
        trees[nr_trees++] = tree;
24
30
        return 0;
25
31
}
26
32
 
76
82
 
77
83
static void prime_cache_tree(void)
78
84
{
79
 
        struct tree *tree = (struct tree *)trees->item;
80
 
        if (!tree)
 
85
        if (!nr_trees)
81
86
                return;
82
87
        active_cache_tree = cache_tree();
83
 
        prime_cache_tree_rec(active_cache_tree, tree);
 
88
        prime_cache_tree_rec(active_cache_tree, trees[0]);
84
89
 
85
90
}
86
91
 
87
 
static const char read_tree_usage[] = "git-read-tree (<sha> | [[-m [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] [--index-output=<file>] <sha1> [<sha2> [<sha3>]])";
 
92
static const char read_tree_usage[] = "git-read-tree (<sha> | [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] [--index-output=<file>] <sha1> [<sha2> [<sha3>]])";
88
93
 
89
94
static struct lock_file lock_file;
90
95
 
92
97
{
93
98
        int i, newfd, stage = 0;
94
99
        unsigned char sha1[20];
 
100
        struct tree_desc t[MAX_TREES];
95
101
        struct unpack_trees_options opts;
96
102
 
97
103
        memset(&opts, 0, sizeof(opts));
98
104
        opts.head_idx = -1;
99
105
 
100
 
        setup_git_directory();
101
106
        git_config(git_default_config);
102
107
 
103
108
        newfd = hold_locked_index(&lock_file, 1);
259
264
                        opts.head_idx = 1;
260
265
        }
261
266
 
262
 
        unpack_trees(trees, &opts);
 
267
        for (i = 0; i < nr_trees; i++) {
 
268
                struct tree *tree = trees[i];
 
269
                parse_tree(tree);
 
270
                init_tree_desc(t+i, tree->buffer, tree->size);
 
271
        }
 
272
        unpack_trees(nr_trees, t, &opts);
263
273
 
264
274
        /*
265
275
         * When reading only one tree (either the most basic form,
267
277
         * valid cache-tree because the index must match exactly
268
278
         * what came from the tree.
269
279
         */
270
 
        if (trees && trees->item && !opts.prefix && (!opts.merge || (stage == 2))) {
 
280
        if (nr_trees && !opts.prefix && (!opts.merge || (stage == 2))) {
271
281
                cache_tree_free(&active_cache_tree);
272
282
                prime_cache_tree();
273
283
        }