pull() now takes an array of arguments instead of just one of each kind. Currently, no users use the new capability, but that'll change. Signed-off-by: Petr Baudis <pasky@xxxxxxx> --- fetch.c | 78 +++++++++++++++++++++++++++++++++------------------------ fetch.h | 2 + http-fetch.c | 2 + local-fetch.c | 2 + ssh-fetch.c | 2 + 5 files changed, 49 insertions(+), 37 deletions(-) diff --git a/fetch.c b/fetch.c index 3255cc6..281df61 100644 --- a/fetch.c +++ b/fetch.c @@ -210,55 +210,67 @@ static int mark_complete(const char *pat return 0; } -int pull(char *target, const char *write_ref, +int pull(int targets, char **target, const char **write_ref, const char *write_ref_log_details) { - struct ref_lock *lock = NULL; - unsigned char sha1[20]; + struct ref_lock **lock = xcalloc(targets, sizeof(struct ref_lock *)); + unsigned char *sha1 = xmalloc(targets * 20); char *msg; int ret; + int i; save_commit_buffer = 0; track_object_refs = 0; - if (write_ref) { - lock = lock_ref_sha1(write_ref, NULL, 0); - if (!lock) { - error("Can't lock ref %s", write_ref); - return -1; + + for (i = 0; i < targets; i++) { + if (!write_ref[i]) + continue; + + lock[i] = lock_ref_sha1(write_ref[i], NULL, 0); + if (!lock[i]) { + error("Can't lock ref %s", write_ref[i]); + goto unlock_and_fail; } } if (!get_recover) for_each_ref(mark_complete); - if (interpret_target(target, sha1)) { - error("Could not interpret %s as something to pull", target); - if (lock) - unlock_ref(lock); - return -1; + for (i = 0; i < targets; i++) { + if (interpret_target(target[i], &sha1[20 * i])) { + error("Could not interpret %s as something to pull", target[i]); + goto unlock_and_fail; + } + if (process(lookup_unknown_object(&sha1[20 * i]))) + goto unlock_and_fail; } - if (process(lookup_unknown_object(sha1))) { - if (lock) - unlock_ref(lock); - return -1; + + if (loop()) + goto unlock_and_fail; + + if (write_ref_log_details) { + msg = xmalloc(strlen(write_ref_log_details) + 12); + sprintf(msg, "fetch from %s", write_ref_log_details); + } else { + msg = NULL; } - if (loop()) { - if (lock) - unlock_ref(lock); - return -1; + for (i = 0; i < targets; i++) { + if (!write_ref[i]) + continue; + ret = write_ref_sha1(lock[i], &sha1[20 * i], msg ? msg : "fetch (unknown)"); + lock[i] = NULL; + if (ret) + goto unlock_and_fail; } + if (msg) + free(msg); - if (write_ref) { - if (write_ref_log_details) { - msg = xmalloc(strlen(write_ref_log_details) + 12); - sprintf(msg, "fetch from %s", write_ref_log_details); - } - else - msg = NULL; - ret = write_ref_sha1(lock, sha1, msg ? msg : "fetch (unknown)"); - if (msg) - free(msg); - return ret; - } return 0; + + +unlock_and_fail: + for (i = 0; i < targets; i++) + if (lock[i]) + unlock_ref(lock[i]); + return -1; } diff --git a/fetch.h b/fetch.h index 7bda355..75e48af 100644 --- a/fetch.h +++ b/fetch.h @@ -42,7 +42,7 @@ extern void pull_say(const char *, const /* If write_ref is set, the ref filename to write the target value to. */ /* If write_ref_log_details is set, additional text will appear in the ref log. */ -extern int pull(char *target, const char *write_ref, +extern int pull(int targets, char **target, const char **write_ref, const char *write_ref_log_details); #endif /* PULL_H */ diff --git a/http-fetch.c b/http-fetch.c index 963d439..bc67db1 100644 --- a/http-fetch.c +++ b/http-fetch.c @@ -1268,7 +1268,7 @@ int main(int argc, char **argv) alt->path_len = strlen(path); } - if (pull(commit_id, write_ref, url)) + if (pull(1, &commit_id, &write_ref, url)) rc = 1; http_cleanup(); diff --git a/local-fetch.c b/local-fetch.c index 308ed00..eb19f1a 100644 --- a/local-fetch.c +++ b/local-fetch.c @@ -242,7 +242,7 @@ int main(int argc, char **argv) commit_id = argv[arg]; path = argv[arg + 1]; - if (pull(commit_id, write_ref, path)) + if (pull(1, &commit_id, &write_ref, path)) return 1; return 0; diff --git a/ssh-fetch.c b/ssh-fetch.c index aef3aa4..6e16568 100644 --- a/ssh-fetch.c +++ b/ssh-fetch.c @@ -167,7 +167,7 @@ int main(int argc, char **argv) if (get_version()) return 1; - if (pull(commit_id, write_ref, url)) + if (pull(1, &commit_id, &write_ref, url)) return 1; return 0; - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html