index be3dc0a9f8a2cbe8d73dccf09a6d5940df8d4e58..73bde07aeaeea67e44aef7aec1b79d5806e80a1b 100644 (file)
--- a/fetch.c
+++ b/fetch.c
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)
struct tree_entry_list *next = entry->next;
if (process(entry->item.any))
return -1;
struct tree_entry_list *next = entry->next;
if (process(entry->item.any))
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;
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;
static int process(struct object *obj)
{
static int process(struct object *obj)
{
+ if (obj->flags & SEEN)
+ return 0;
+ obj->flags |= SEEN;
+
if (has_sha1_file(obj->sha1)) {
if (has_sha1_file(obj->sha1)) {
- parse_object(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(obj->sha1);
-
return 0;
}
return 0;
}
* the queue because we needed to fetch it first.
*/
if (! (obj->flags & TO_SCAN)) {
* the queue because we needed to fetch it first.
*/
if (! (obj->flags & TO_SCAN)) {
- if (!has_sha1_file(obj->sha1) && fetch(obj->sha1)) {
+ if (fetch(obj->sha1)) {
report_missing(obj->type
? obj->type
: "object", obj->sha1);
report_missing(obj->type
? obj->type
: "object", obj->sha1);
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",
if (interpret_target(target, sha1))
return error("Could not interpret %s as something to pull",