Merge branch 'rc/http-push'
authorJunio C Hamano <gitster@pobox.com>
Sun, 15 Feb 2009 09:43:57 +0000 (01:43 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 15 Feb 2009 09:43:57 +0000 (01:43 -0800)
* rc/http-push:
use a hash of the lock token as the suffix for PUT/MOVE

1  2 
http-push.c
diff --combined http-push.c
index a8ae545dfb952b9108ef679a176d57eb2216d622,55ad808023f00acb76f2bfd198b0ec204c7d3592..30d2d340418f7f40b77823b1b58b307985347bdf
@@@ -10,7 -10,6 +10,7 @@@
  #include "exec_cmd.h"
  #include "remote.h"
  #include "list-objects.h"
 +#include "sigchain.h"
  
  #include <expat.h>
  
@@@ -153,6 -152,7 +153,7 @@@ struct remote_loc
        char *url;
        char *owner;
        char *token;
+       char tmpfile_suffix[41];
        time_t start_time;
        long timeout;
        int refreshing;
@@@ -557,8 -557,7 +558,7 @@@ static void start_put(struct transfer_r
        request->dest = strbuf_detach(&buf, NULL);
  
        append_remote_object_url(&buf, remote->url, hex, 0);
-       strbuf_addstr(&buf, "_");
-       strbuf_addstr(&buf, request->lock->token);
+       strbuf_add(&buf, request->lock->tmpfile_suffix, 41);
        request->url = strbuf_detach(&buf, NULL);
  
        slot = get_active_slot();
@@@ -1130,6 -1129,8 +1130,8 @@@ static void handle_lockprop_ctx(struct 
  static void handle_new_lock_ctx(struct xml_ctx *ctx, int tag_closed)
  {
        struct remote_lock *lock = (struct remote_lock *)ctx->userData;
+       git_SHA_CTX sha_ctx;
+       unsigned char lock_token_sha1[20];
  
        if (tag_closed && ctx->cdata) {
                if (!strcmp(ctx->name, DAV_ACTIVELOCK_OWNER)) {
                } else if (!strcmp(ctx->name, DAV_ACTIVELOCK_TOKEN)) {
                        lock->token = xmalloc(strlen(ctx->cdata) + 1);
                        strcpy(lock->token, ctx->cdata);
+                       git_SHA1_Init(&sha_ctx);
+                       git_SHA1_Update(&sha_ctx, lock->token, strlen(lock->token));
+                       git_SHA1_Final(lock_token_sha1, &sha_ctx);
+                       lock->tmpfile_suffix[0] = '_';
+                       memcpy(lock->tmpfile_suffix + 1, sha1_to_hex(lock_token_sha1), 40);
                }
        }
  }
@@@ -1378,7 -1386,7 +1387,7 @@@ static void remove_locks(void
  static void remove_locks_on_signal(int signo)
  {
        remove_locks();
 -      signal(signo, SIG_DFL);
 +      sigchain_pop(signo);
        raise(signo);
  }
  
@@@ -2189,8 -2197,6 +2198,8 @@@ int main(int argc, char **argv
        struct ref *ref;
        char *rewritten_url = NULL;
  
 +      git_extract_argv0_path(argv[0]);
 +
        setup_git_directory();
  
        remote = xcalloc(sizeof(*remote), 1);
                goto cleanup;
        }
  
 -      signal(SIGINT, remove_locks_on_signal);
 -      signal(SIGHUP, remove_locks_on_signal);
 -      signal(SIGQUIT, remove_locks_on_signal);
 -      signal(SIGTERM, remove_locks_on_signal);
 +      sigchain_push_common(remove_locks_on_signal);
  
        /* Check whether the remote has server info files */
        remote->can_update_info_refs = 0;