From: Tay Ray Chuan <rctay89@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Cc: Junio C Hamano <gitster@pobox.com>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Mike Hommey <mh@glandium.org>
Subject: [PATCH 04/23] http-push: send out fetch requests on queue
Date: Sat, 6 Jun 2009 00:01:37 +0800 [thread overview]
Message-ID: <20090606000137.ff05ba37.rctay89@gmail.com> (raw)
Previously, requests for remote files were simply added to the queue
(pointed to by request_queue_head) and no transfer actually took
place[1], even though code that followed may rely on these remote files
to be present (eg. the setup_revisions invocation).
The code that sends out the requests on the request queue is refactored
into the method run_request_queue.
After the get_dav_remote_heads invocation (ie. after fetch requests are
added to the queue), the requests on the queue are sent out through an
invocation to run_request_queue.
This invocation to run_request_queue entails adding a fill function
before pushing checks take place, which may lead to accidental,
unwanted pushes previously.
The flag is_running_queue is introduced to prevent this from occurring.
fill_active_slot is made to check the flag is_running_queue before
the sending of the requests proceeds.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
---
http-push.c | 37 ++++++++++++++++++++++++++-----------
t/t5540-http-push.sh | 4 ++--
2 files changed, 28 insertions(+), 13 deletions(-)
diff --git a/http-push.c b/http-push.c
index 0b12ffe..218e263 100644
--- a/http-push.c
+++ b/http-push.c
@@ -846,11 +846,12 @@ static void finish_request(struct transfer_request *request)
}
#ifdef USE_CURL_MULTI
+static int is_running_queue;
static int fill_active_slot(void *unused)
{
struct transfer_request *request;
- if (aborted)
+ if (aborted || !is_running_queue)
return 0;
for (request = request_queue_head; request; request = request->next) {
@@ -2174,6 +2175,25 @@ static int delete_remote_branch(char *pattern, int force)
return 0;
}
+void run_request_queue()
+{
+#ifdef USE_CURL_MULTI
+ is_running_queue = 1;
+ fill_active_slots();
+ add_fill_function(NULL, fill_active_slot);
+#endif
+ do {
+ finish_all_active_slots();
+#ifdef USE_CURL_MULTI
+ fill_active_slots();
+#endif
+ } while (request_queue_head && !aborted);
+
+#ifdef USE_CURL_MULTI
+ is_running_queue = 0;
+#endif
+}
+
int main(int argc, char **argv)
{
struct transfer_request *request;
@@ -2278,6 +2298,8 @@ int main(int argc, char **argv)
repo->url = rewritten_url;
}
+ is_running_queue = 0;
+
/* Verify DAV compliance/lock support */
if (!locking_available()) {
rc = 1;
@@ -2307,6 +2329,7 @@ int main(int argc, char **argv)
local_refs = get_local_heads();
fprintf(stderr, "Fetching remote heads...\n");
get_dav_remote_heads();
+ run_request_queue();
/* Remove a remote branch if -d or -D was specified */
if (delete_branch) {
@@ -2436,16 +2459,8 @@ int main(int argc, char **argv)
if (objects_to_send)
fprintf(stderr, " sending %d objects\n",
objects_to_send);
-#ifdef USE_CURL_MULTI
- fill_active_slots();
- add_fill_function(NULL, fill_active_slot);
-#endif
- do {
- finish_all_active_slots();
-#ifdef USE_CURL_MULTI
- fill_active_slots();
-#endif
- } while (request_queue_head && !aborted);
+
+ run_request_queue();
/* Update the remote branch if all went well */
if (aborted || !update_remote(ref->new_sha1, ref_lock))
diff --git a/t/t5540-http-push.sh b/t/t5540-http-push.sh
index ad0f14b..f4a2cf6 100755
--- a/t/t5540-http-push.sh
+++ b/t/t5540-http-push.sh
@@ -67,7 +67,7 @@ test_expect_success ' push to remote repository with unpacked refs' '
test $HEAD = $(git rev-parse --verify HEAD))
'
-test_expect_failure 'http-push fetches unpacked objects' '
+test_expect_success 'http-push fetches unpacked objects' '
cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \
"$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_unpacked.git &&
@@ -83,7 +83,7 @@ test_expect_failure 'http-push fetches unpacked objects' '
git push -f -v $HTTPD_URL/test_repo_unpacked.git master)
'
-test_expect_failure 'http-push fetches packed objects' '
+test_expect_success 'http-push fetches packed objects' '
cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \
"$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_packed.git &&
--
1.6.3.1
next reply other threads:[~2009-06-05 16:09 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-05 16:01 Tay Ray Chuan [this message]
2009-06-05 20:44 ` [PATCH 04/23] http-push: send out fetch requests on queue Jakub Narebski
2009-06-06 1:14 ` Tay Ray Chuan
[not found] <cover.1244277116.git.rctay89@gmail.com>
2009-06-06 8:43 ` Tay Ray Chuan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090606000137.ff05ba37.rctay89@gmail.com \
--to=rctay89@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mh@glandium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.