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)
struct tree_entry_list *next = entry->next;
if (process(entry->item.any))
return -1;
+ free(entry->name);
free(entry);
entry = next;
}
return 0;
}
-#define COMPLETE 1U
-#define TO_FETCH 2U
-#define TO_SCAN 4U
-#define SEEN 16U
+#define COMPLETE (1U << 0)
+#define SEEN (1U << 1)
+#define TO_SCAN (1U << 2)
static struct commit_list *complete = NULL;
obj->flags |= SEEN;
if (has_sha1_file(obj->sha1)) {
- parse_object(obj->sha1);
/* We already have it, so we should scan it now. */
- if (obj->flags & TO_SCAN)
- return 0;
- object_list_insert(obj, process_queue_end);
- process_queue_end = &(*process_queue_end)->next;
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;
- obj->flags |= TO_FETCH;
-
- prefetch(obj->sha1);
-
return 0;
}
* 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);
int pull(char *target)
{
+ struct ref_lock *lock;
unsigned char sha1[20];
- int fd = -1;
save_commit_buffer = 0;
- if (write_ref && current_ref) {
- fd = lock_ref_sha1(write_ref, current_ref);
- if (fd < 0)
+ track_object_refs = 0;
+ if (write_ref) {
+ lock = lock_ref_sha1(write_ref, current_ref, 1);
+ if (!lock)
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 (process(lookup_unknown_object(sha1)))
+ if (interpret_target(target, sha1)) {
+ error("Could not interpret %s as something to pull", target);
+ unlock_ref(lock);
+ return -1;
+ }
+ if (process(lookup_unknown_object(sha1))) {
+ unlock_ref(lock);
return -1;
- if (loop())
+ }
+ if (loop()) {
+ unlock_ref(lock);
return -1;
-
+ }
+
if (write_ref) {
- if (current_ref) {
- write_ref_sha1(write_ref, fd, sha1);
- } else {
- write_ref_sha1_unlocked(write_ref, sha1);
- }
+ return write_ref_sha1(lock, sha1, "git fetch");
}
return 0;
}