[Pkg-owncloud-commits] [owncloud-client] 228/333: Collect data from the "other" tree for the treewalk functions.

Sandro Knauß hefee-guest at moszumanska.debian.org
Thu Apr 17 23:16:57 UTC 2014


This is an automated email from the git hooks/post-receive script.

hefee-guest pushed a commit to branch master
in repository owncloud-client.

commit c5100a789b1f7b98167357a826fad9a1058cc142
Author: Klaas Freitag <freitag at owncloud.com>
Date:   Mon Mar 24 11:35:19 2014 +0100

    Collect data from the "other" tree for the treewalk functions.
    
    This enables us to log all relevant information that were used
    to decide on sync activity.
---
 csync/src/csync.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 csync/src/csync.h |  8 ++++++++
 2 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/csync/src/csync.c b/csync/src/csync.c
index 6e85e51..329818f 100644
--- a/csync/src/csync.c
+++ b/csync/src/csync.c
@@ -56,6 +56,8 @@
 
 #include "csync_log.h"
 #include "csync_rename.h"
+#include "c_jhash.h"
+
 
 // Breaking the abstraction for fun and profit.
 #include "csync_owncloud.h"
@@ -341,7 +343,7 @@ int csync_reconcile(CSYNC *ctx) {
       return -1;
   }
 
-  /* Reconciliation for local replica */
+  /* Reconciliation for remote replica */
   csync_gettime(&start);
 
   ctx->current = REMOTE_REPLICA;
@@ -377,6 +379,8 @@ static int _csync_treewalk_visitor(void *obj, void *data) {
     c_rbtree_visit_func *visitor   = NULL;
     _csync_treewalk_context *twctx = NULL;
     TREE_WALK_FILE trav;
+    c_rbtree_t *other_tree = NULL;
+    c_rbnode_t *other_node = NULL;
 
     cur = (csync_file_stat_t *) obj;
     ctx = (CSYNC *) data;
@@ -385,6 +389,34 @@ static int _csync_treewalk_visitor(void *obj, void *data) {
       return -1;
     }
 
+    /* we need the opposite tree! */
+    switch (ctx->current) {
+    case LOCAL_REPLICA:
+        other_tree = ctx->remote.tree;
+        break;
+    case REMOTE_REPLICA:
+        other_tree = ctx->local.tree;
+        break;
+    default:
+        break;
+    }
+
+    other_node = c_rbtree_find(other_tree, &cur->phash);
+
+    if (!other_node) {
+        /* Check the renamed path as well. */
+        int len;
+        uint64_t h = 0;
+        char *renamed_path = csync_rename_adjust_path(ctx, cur->path);
+
+        if (!c_streq(renamed_path, cur->path)) {
+            len = strlen( renamed_path );
+            h = c_jhash64((uint8_t *) renamed_path, len, 0);
+            other_node = c_rbtree_find(other_tree, &h);
+        }
+        SAFE_FREE(renamed_path);
+    }
+
     if (obj == NULL || data == NULL) {
       ctx->status_code = CSYNC_STATUS_PARAM_ERROR;
       return -1;
@@ -419,12 +451,28 @@ static int _csync_treewalk_visitor(void *obj, void *data) {
       trav.error_status = cur->error_status;
       trav.should_update_etag = cur->should_update_etag;
 
+      if( other_node ) {
+          csync_file_stat_t *other_stat = (csync_file_stat_t*)other_node->data;
+          trav.other.etag = c_strdup(other_stat->etag);
+          trav.other.file_id = c_strdup(other_stat->file_id);
+          trav.other.instruction = other_stat->instruction;
+          trav.other.modtime = other_stat->modtime;
+          trav.other.size = other_stat->size;
+      } else {
+          trav.other.etag = 0;
+          trav.other.file_id = 0;
+          trav.other.instruction = CSYNC_INSTRUCTION_NONE;
+          trav.other.modtime = 0;
+          trav.other.size = 0;
+      }
+
       rc = (*visitor)(&trav, twctx->userdata);
       cur->instruction = trav.instruction;
       if (trav.etag != cur->etag) {
           SAFE_FREE(cur->etag);
           cur->etag = c_strdup(trav.etag);
       }
+
       return rc;
     }
     ctx->status_code = CSYNC_STATUS_PARAM_ERROR;
@@ -480,6 +528,7 @@ int csync_walk_remote_tree(CSYNC *ctx,  csync_treewalk_visit_func *visitor, int
 
     if(ctx != NULL) {
         ctx->status_code = CSYNC_STATUS_OK;
+        ctx->current = REMOTE_REPLICA;
         tree = ctx->remote.tree;
     }
 
@@ -498,6 +547,7 @@ int csync_walk_local_tree(CSYNC *ctx, csync_treewalk_visit_func *visitor, int fi
 
     if (ctx != NULL) {
         ctx->status_code = CSYNC_STATUS_OK;
+        ctx->current = LOCAL_REPLICA;
         tree = ctx->local.tree;
     }
 
diff --git a/csync/src/csync.h b/csync/src/csync.h
index 2cc24ad..403e293 100644
--- a/csync/src/csync.h
+++ b/csync/src/csync.h
@@ -207,6 +207,14 @@ struct csync_tree_walk_file_s {
     const char *rename_path;
     const char *etag;
     const char *file_id;
+    struct {
+        int64_t     size;
+        time_t      modtime;
+        const char *etag;
+        const char *file_id;
+        enum csync_instructions_e instruction;
+    } other;
+
     CSYNC_STATUS error_status;
 };
 typedef struct csync_tree_walk_file_s TREE_WALK_FILE;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git



More information about the Pkg-owncloud-commits mailing list