aboutsummaryrefslogtreecommitdiff
path: root/fetch.c
diff options
context:
space:
mode:
authorShawn Pearce <spearce@spearce.org>2006-05-17 05:55:02 -0400
committerJunio C Hamano <junkio@cox.net>2006-05-17 17:36:36 -0700
commit4bd18c43d9a8a8fc1aa598926100f6999953ba48 (patch)
treee9ebbfdd14be75763a8d2492680a94c518c27a01 /fetch.c
parent70e1a880a3dc3648fbed463044358a4a83116743 (diff)
downloadgit-4bd18c43d9a8a8fc1aa598926100f6999953ba48.tar.gz
git-4bd18c43d9a8a8fc1aa598926100f6999953ba48.tar.xz
Improve abstraction of ref lock/write.
Created 'struct ref_lock' to contain the data necessary to perform a ref update. This change improves writing a ref as the file names are generated only once (rather than twice) and supports following symrefs (up to the maximum depth). Further the ref_lock structure provides room to extend the update API with ref logging. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'fetch.c')
-rw-r--r--fetch.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/fetch.c b/fetch.c
index 73bde07ae..8bdaacb8e 100644
--- a/fetch.c
+++ b/fetch.c
@@ -204,14 +204,14 @@ static int mark_complete(const char *path, const unsigned char *sha1)
int pull(char *target)
{
+ struct ref_lock *lock;
unsigned char sha1[20];
- 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)
+ if (write_ref) {
+ lock = lock_ref_sha1(write_ref, current_ref, 1);
+ if (!lock)
return -1;
}
@@ -219,20 +219,22 @@ int pull(char *target)
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;
}