projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Makefile: many programs now depend on xdiff/lib.a having been built.
[git.git]
/
fetch.c
diff --git
a/fetch.c
b/fetch.c
index
1d95ce0
..
73bde07
100644
(file)
--- a/
fetch.c
+++ b/
fetch.c
@@
-15,6
+15,7
@@
int get_tree = 0;
int get_history = 0;
int get_all = 0;
int get_verbosely = 0;
int get_history = 0;
int get_all = 0;
int get_verbosely = 0;
+int get_recover = 0;
static unsigned char current_commit_sha1[20];
void pull_say(const char *fmt, const char *hex)
static unsigned char current_commit_sha1[20];
void pull_say(const char *fmt, const char *hex)
@@
-33,7
+34,7
@@
static void report_missing(const char *what, const unsigned char *missing)
what, missing_hex, sha1_to_hex(current_commit_sha1));
}
what, missing_hex, sha1_to_hex(current_commit_sha1));
}
-static int process(
unsigned char *sha1, const char *type
);
+static int process(
struct object *obj
);
static int process_tree(struct tree *tree)
{
static int process_tree(struct tree *tree)
{
@@
-46,19
+47,18
@@
static int process_tree(struct tree *tree)
tree->entries = NULL;
while (entry) {
struct tree_entry_list *next = entry->next;
tree->entries = NULL;
while (entry) {
struct tree_entry_list *next = entry->next;
- if (process(entry->item.any->sha1,
- entry->directory ? tree_type : blob_type))
+ if (process(entry->item.any))
return -1;
return -1;
+ free(entry->name);
free(entry);
entry = next;
}
return 0;
}
free(entry);
entry = next;
}
return 0;
}
-#define COMPLETE 1U
-#define TO_FETCH 2U
-#define TO_SCAN 4U
-#define SCANNED 8U
+#define COMPLETE (1U << 0)
+#define SEEN (1U << 1)
+#define TO_SCAN (1U << 2)
static struct commit_list *complete = NULL;
static struct commit_list *complete = NULL;
@@
-79,7
+79,7
@@
static int process_commit(struct commit *commit)
pull_say("walk %s\n", sha1_to_hex(commit->object.sha1));
if (get_tree) {
pull_say("walk %s\n", sha1_to_hex(commit->object.sha1));
if (get_tree) {
- if (process(
commit->tree->object.sha1, tree_type
))
+ if (process(
&commit->tree->object
))
return -1;
if (!get_all)
get_tree = 0;
return -1;
if (!get_all)
get_tree = 0;
@@
-87,7
+87,7
@@
static int process_commit(struct commit *commit)
if (get_history) {
struct commit_list *parents = commit->parents;
for (; parents; parents = parents->next) {
if (get_history) {
struct commit_list *parents = commit->parents;
for (; parents; parents = parents->next) {
- if (process(
parents->item->object.sha1, commit_type
))
+ if (process(
&parents->item->object
))
return -1;
}
}
return -1;
}
}
@@
-98,7
+98,7
@@
static int process_tag(struct tag *tag)
{
if (parse_tag(tag))
return -1;
{
if (parse_tag(tag))
return -1;
- return process(tag->tagged
->sha1, NULL
);
+ return process(tag->tagged);
}
static struct object_list *process_queue = NULL;
}
static struct object_list *process_queue = NULL;
@@
-106,10
+106,6
@@
static struct object_list **process_queue_end = &process_queue;
static int process_object(struct object *obj)
{
static int process_object(struct object *obj)
{
- if (obj->flags & SCANNED)
- return 0;
- obj->flags |= SCANNED;
-
if (obj->type == commit_type) {
if (process_commit((struct commit *)obj))
return -1;
if (obj->type == commit_type) {
if (process_commit((struct commit *)obj))
return -1;
@@
-133,28
+129,23
@@
static int process_object(struct object *obj)
obj->type, sha1_to_hex(obj->sha1));
}
obj->type, sha1_to_hex(obj->sha1));
}
-static int process(
unsigned char *sha1, const char *type
)
+static int process(
struct object *obj
)
{
{
- struct object *obj = lookup_object_type(sha1, type);
+ if (obj->flags & SEEN)
+ return 0;
+ obj->flags |= SEEN;
- if (has_sha1_file(sha1)) {
- parse_object(sha1);
+ if (has_sha1_file(obj->sha1)) {
/* We already have it, so we should scan it now. */
/* We already have it, so we should scan it now. */
- if (obj->flags & (SCANNED | TO_SCAN))
- return 0;
- object_list_insert(obj, process_queue_end);
- process_queue_end = &(*process_queue_end)->next;
obj->flags |= TO_SCAN;
obj->flags |= TO_SCAN;
- return 0;
+ } else {
+ if (obj->flags & COMPLETE)
+ return 0;
+ prefetch(obj->sha1);
}
}
- if (obj->flags & (COMPLETE | TO_FETCH))
- return 0;
+
object_list_insert(obj, process_queue_end);
process_queue_end = &(*process_queue_end)->next;
object_list_insert(obj, process_queue_end);
process_queue_end = &(*process_queue_end)->next;
- obj->flags |= TO_FETCH;
-
- prefetch(sha1);
-
return 0;
}
return 0;
}
@@
-217,18
+208,21
@@
int pull(char *target)
int fd = -1;
save_commit_buffer = 0;
int fd = -1;
save_commit_buffer = 0;
+ track_object_refs = 0;
if (write_ref && current_ref) {
fd = lock_ref_sha1(write_ref, current_ref);
if (fd < 0)
return -1;
}
if (write_ref && current_ref) {
fd = lock_ref_sha1(write_ref, current_ref);
if (fd < 0)
return -1;
}
- for_each_ref(mark_complete);
+ if (!get_recover) {
+ for_each_ref(mark_complete);
+ }
if (interpret_target(target, sha1))
return error("Could not interpret %s as something to pull",
target);
if (interpret_target(target, sha1))
return error("Could not interpret %s as something to pull",
target);
- if (process(
sha1, NULL
))
+ if (process(
lookup_unknown_object(sha1)
))
return -1;
if (loop())
return -1;
return -1;
if (loop())
return -1;