Merge branch 'lt/tree' into jc/lt-tree-n-cache-tree
[git.git] / fetch.c
1 #include "fetch.h"
2
3 #include "cache.h"
4 #include "commit.h"
5 #include "tree.h"
6 #include "tag.h"
7 #include "blob.h"
8 #include "refs.h"
9
10 const char *write_ref = NULL;
11
12 int get_tree = 0;
13 int get_history = 0;
14 int get_all = 0;
15 int get_verbosely = 0;
16 int get_recover = 0;
17 static unsigned char current_commit_sha1[20];
18
19 void pull_say(const char *fmt, const char *hex) 
20 {
21         if (get_verbosely)
22                 fprintf(stderr, fmt, hex);
23 }
24
25 static void report_missing(const char *what, const unsigned char *missing)
26 {
27         char missing_hex[41];
28
29         strcpy(missing_hex, sha1_to_hex(missing));;
30         fprintf(stderr,
31                 "Cannot obtain needed %s %s\nwhile processing commit %s.\n",
32                 what, missing_hex, sha1_to_hex(current_commit_sha1));
33 }
34
35 static int process(struct object *obj);
36
37 static int process_tree(struct tree *tree)
38 {
39         struct tree_entry_list *entry;
40
41         if (parse_tree(tree))
42                 return -1;
43
44         entry = create_tree_entry_list(tree);
45         while (entry) {
46                 struct tree_entry_list *next = entry->next;
47
48                 if (entry->directory) {
49                         struct tree *tree = lookup_tree(entry->sha1);
50                         process_tree(tree);
51                 } else {
52                         struct blob *blob = lookup_blob(entry->sha1);
53                         process(&blob->object);
54                 }
55                 free(entry);
56                 entry = next;
57         }
58         free(tree->buffer);
59         tree->buffer = NULL;
60         return 0;
61 }
62
63 #define COMPLETE        (1U << 0)
64 #define SEEN            (1U << 1)
65 #define TO_SCAN         (1U << 2)
66
67 static struct commit_list *complete = NULL;
68
69 static int process_commit(struct commit *commit)
70 {
71         if (parse_commit(commit))
72                 return -1;
73
74         while (complete && complete->item->date >= commit->date) {
75                 pop_most_recent_commit(&complete, COMPLETE);
76         }
77
78         if (commit->object.flags & COMPLETE)
79                 return 0;
80
81         memcpy(current_commit_sha1, commit->object.sha1, 20);
82
83         pull_say("walk %s\n", sha1_to_hex(commit->object.sha1));
84
85         if (get_tree) {
86                 if (process(&commit->tree->object))
87                         return -1;
88                 if (!get_all)
89                         get_tree = 0;
90         }
91         if (get_history) {
92                 struct commit_list *parents = commit->parents;
93                 for (; parents; parents = parents->next) {
94                         if (process(&parents->item->object))
95                                 return -1;
96                 }
97         }
98         return 0;
99 }
100
101 static int process_tag(struct tag *tag)
102 {
103         if (parse_tag(tag))
104                 return -1;
105         return process(tag->tagged);
106 }
107
108 static struct object_list *process_queue = NULL;
109 static struct object_list **process_queue_end = &process_queue;
110
111 static int process_object(struct object *obj)
112 {
113         if (obj->type == commit_type) {
114                 if (process_commit((struct commit *)obj))
115                         return -1;
116                 return 0;
117         }
118         if (obj->type == tree_type) {
119                 if (process_tree((struct tree *)obj))
120                         return -1;
121                 return 0;
122         }
123         if (obj->type == blob_type) {
124                 return 0;
125         }
126         if (obj->type == tag_type) {
127                 if (process_tag((struct tag *)obj))
128                         return -1;
129                 return 0;
130         }
131         return error("Unable to determine requirements "
132                      "of type %s for %s",
133                      obj->type, sha1_to_hex(obj->sha1));
134 }
135
136 static int process(struct object *obj)
137 {
138         if (obj->flags & SEEN)
139                 return 0;
140         obj->flags |= SEEN;
141
142         if (has_sha1_file(obj->sha1)) {
143                 /* We already have it, so we should scan it now. */
144                 obj->flags |= TO_SCAN;
145         } else {
146                 if (obj->flags & COMPLETE)
147                         return 0;
148                 prefetch(obj->sha1);
149         }
150                 
151         object_list_insert(obj, process_queue_end);
152         process_queue_end = &(*process_queue_end)->next;
153         return 0;
154 }
155
156 static int loop(void)
157 {
158         struct object_list *elem;
159
160         while (process_queue) {
161                 struct object *obj = process_queue->item;
162                 elem = process_queue;
163                 process_queue = elem->next;
164                 free(elem);
165                 if (!process_queue)
166                         process_queue_end = &process_queue;
167
168                 /* If we are not scanning this object, we placed it in
169                  * the queue because we needed to fetch it first.
170                  */
171                 if (! (obj->flags & TO_SCAN)) {
172                         if (fetch(obj->sha1)) {
173                                 report_missing(obj->type
174                                                ? obj->type
175                                                : "object", obj->sha1);
176                                 return -1;
177                         }
178                 }
179                 if (!obj->type)
180                         parse_object(obj->sha1);
181                 if (process_object(obj))
182                         return -1;
183         }
184         return 0;
185 }
186
187 static int interpret_target(char *target, unsigned char *sha1)
188 {
189         if (!get_sha1_hex(target, sha1))
190                 return 0;
191         if (!check_ref_format(target)) {
192                 if (!fetch_ref(target, sha1)) {
193                         return 0;
194                 }
195         }
196         return -1;
197 }
198
199 static int mark_complete(const char *path, const unsigned char *sha1)
200 {
201         struct commit *commit = lookup_commit_reference_gently(sha1, 1);
202         if (commit) {
203                 commit->object.flags |= COMPLETE;
204                 insert_by_date(commit, &complete);
205         }
206         return 0;
207 }
208
209 int pull(char *target)
210 {
211         unsigned char sha1[20];
212
213         save_commit_buffer = 0;
214         track_object_refs = 0;
215
216         if (!get_recover)
217                 for_each_ref(mark_complete);
218
219         if (interpret_target(target, sha1))
220                 return error("Could not interpret %s as something to pull",
221                              target);
222         if (process(lookup_unknown_object(sha1)))
223                 return -1;
224         if (loop())
225                 return -1;
226         
227         if (write_ref)
228                 write_ref_sha1_unlocked(write_ref, sha1);
229         return 0;
230 }