Bug fix: File update traversal didn't handle trailing slashes correctly.
[idzebra-moved-to-github.git] / index / trav.c
index 78746c4..6894ca5 100644 (file)
@@ -4,7 +4,18 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: trav.c,v $
- * Revision 1.15  1995-12-07 17:38:48  adam
+ * Revision 1.18  1996-03-19 12:43:27  adam
+ * Bug fix: File update traversal didn't handle trailing slashes correctly.
+ * Bug fix: Update of sub directory groups wasn't handled correctly.
+ *
+ * Revision 1.17  1996/02/12  18:45:17  adam
+ * Changed naming of some functions.
+ *
+ * Revision 1.16  1996/02/05  12:30:02  adam
+ * Logging reduced a bit.
+ * The remaining running time is estimated during register merge.
+ *
+ * Revision 1.15  1995/12/07  17:38:48  adam
  * Work locking mechanisms for concurrent updates/commit.
  *
  * Revision 1.14  1995/12/06  12:41:26  adam
@@ -90,6 +101,7 @@ static void repositoryExtractR (int deleteFlag, char *rep,
     e = dir_open (rep);
     if (!e)
         return;
+    logf (LOG_LOG, "Dir: %s", rep);
     if (rep[rep_len-1] != '/')
         rep[rep_len] = '/';
     else
@@ -113,18 +125,18 @@ static void repositoryExtractR (int deleteFlag, char *rep,
 
 static void stdinExtractR (int deleteFlag, struct recordGroup *rGroup)
 {
-    char tmppath[256];
+    char tmppath[1024];
 
     logf (LOG_LOG, "stdinExtractR");
     while (scanf ("%s", tmppath) == 1)
         fileExtract (NULL, tmppath, rGroup, deleteFlag);
 }
 
-static void repositoryDeleteR (struct dirs_info *di, struct dirs_entry *dst,
+static void fileDeleteR (struct dirs_info *di, struct dirs_entry *dst,
                               const char *base, char *src,
                               struct recordGroup *rGroup)
 {
-    char tmppath[256];
+    char tmppath[1024];
     size_t src_len = strlen (src);
 
     while (dst && !repComp (dst->path, src, src_len+1))
@@ -150,19 +162,20 @@ static void repositoryDeleteR (struct dirs_info *di, struct dirs_entry *dst,
     }
 }
 
-static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
+static void fileUpdateR (struct dirs_info *di, struct dirs_entry *dst,
                                const char *base, char *src, 
                                struct recordGroup *rGroup)
 {
     struct dir_entry *e_src;
     int i_src = 0;
-    static char tmppath[256];
+    static char tmppath[1024];
     size_t src_len = strlen (src);
 
     sprintf (tmppath, "%s%s", base, src);
     e_src = dir_open (tmppath);
+    logf (LOG_LOG, "Dir: %s", tmppath);
 
-#if 1
+#if 0
     if (!dst || repComp (dst->path, src, src_len))
 #else
     if (!dst || strcmp (dst->path, src))
@@ -170,27 +183,30 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
     {
         if (!e_src)
             return;
-        if (src_len && src[src_len-1] == '/')
-            --src_len;
-        else
+
+        if (src_len && src[src_len-1] != '/')
+        {
             src[src_len] = '/';
-        src[src_len+1] = '\0';
+            src[++src_len] = '\0';
+        }
         dirs_mkdir (di, src, 0);
+#if 0
         dst = NULL;
+#endif
     }
     else if (!e_src)
     {
         strcpy (src, dst->path);
-        repositoryDeleteR (di, dst, base, src, rGroup);
+        fileDeleteR (di, dst, base, src, rGroup);
         return;
     }
     else
     {
-        if (src_len && src[src_len-1] == '/')
-            --src_len;
-        else
+        if (src_len && src[src_len-1] != '/')
+        {
             src[src_len] = '/';
-        src[src_len+1] = '\0';
+            src[++src_len] = '\0';
+        }
         dst = dirs_read (di); 
     }
     dir_sort (e_src);
@@ -199,13 +215,13 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
     {
         int sd;
 
-        if (dst && !repComp (dst->path, src, src_len+1))
+        if (dst && !repComp (dst->path, src, src_len))
         {
             if (e_src[i_src].name)
             {
-                logf (LOG_DEBUG, "dst=%s src=%s", dst->path + src_len+1, 
+                logf (LOG_DEBUG, "dst=%s src=%s", dst->path + src_len,
                      e_src[i_src].name);
-                sd = strcmp (dst->path + src_len+1, e_src[i_src].name);
+                sd = strcmp (dst->path + src_len, e_src[i_src].name);
             }
             else
                 sd = -1;
@@ -217,7 +233,7 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
         logf (LOG_DEBUG, "trav sd=%d", sd);
         if (sd == 0)
         {
-            strcpy (src + src_len+1, e_src[i_src].name);
+            strcpy (src + src_len, e_src[i_src].name);
             sprintf (tmppath, "%s%s", base, src);
             
             switch (e_src[i_src].kind)
@@ -227,14 +243,13 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
                 {
                     if (fileExtract (&dst->sysno, tmppath, rGroup, 0))
                     {
-                        logf (LOG_LOG, "dirs_add");
                         dirs_add (di, src, dst->sysno, e_src[i_src].ctime);
                     }
                 }
                 dst = dirs_read (di);
                 break;
             case dirs_dir:
-                repositoryUpdateR (di, dst, base, src, rGroup);
+                fileUpdateR (di, dst, base, src, rGroup);
                 dst = dirs_last (di);
                 logf (LOG_DEBUG, "last is %s", dst ? dst->path : "null");
                 break;
@@ -246,7 +261,7 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
         else if (sd > 0)
         {
             SYSNO sysno = 0;
-            strcpy (src + src_len+1, e_src[i_src].name);
+            strcpy (src + src_len, e_src[i_src].name);
             sprintf (tmppath, "%s%s", base, src);
 
             switch (e_src[i_src].kind)
@@ -256,7 +271,7 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
                     dirs_add (di, src, sysno, e_src[i_src].ctime);            
                 break;
             case dirs_dir:
-                repositoryUpdateR (di, dst, base, src, rGroup);
+                fileUpdateR (di, dst, base, src, rGroup);
                 if (dst)
                     dst = dirs_last (di);
                 break;
@@ -276,7 +291,7 @@ static void repositoryUpdateR (struct dirs_info *di, struct dirs_entry *dst,
                 dst = dirs_read (di);
                 break;
             case dirs_dir:
-                repositoryDeleteR (di, dst, base, src, rGroup);
+                fileDeleteR (di, dst, base, src, rGroup);
                 dst = dirs_last (di);
             }
         }
@@ -298,9 +313,44 @@ static void groupRes (struct recordGroup *rGroup)
     rGroup->recordId = res_get (common_resource, resStr);
 }
 
+
+void repositoryShow (struct recordGroup *rGroup)
+{
+    char src[1024];
+    int src_len;
+    struct dirs_entry *dst;
+    Dict dict;
+    struct dirs_info *di;
+    
+    if (!(dict = dict_open (FMATCH_DICT, 50, 1)))
+    {
+        logf (LOG_FATAL, "dict_open fail of %s", FMATCH_DICT);
+        exit (1);
+    }
+    
+    assert (rGroup->path);    
+    strcpy (src, rGroup->path);
+    src_len = strlen (src);
+    
+    if (src_len && src[src_len-1] != '/')
+    {
+        src[src_len] = '/';
+        src[++src_len] = '\0';
+    }
+    
+    di = dirs_open (dict, src);
+    
+    while ( (dst = dirs_read (di)) )
+        logf (LOG_LOG, "%s", dst->path);
+    dirs_free (&di);
+    dict_close (dict);
+}
+
 void repositoryUpdate (struct recordGroup *rGroup)
 {
-    char src[256];
+    char src[1024];
+    char dst[1024];
+    int src_len;
 
     groupRes (rGroup);
     if (rGroup->recordId && !strcmp (rGroup->recordId, "file"))
@@ -314,9 +364,20 @@ void repositoryUpdate (struct recordGroup *rGroup)
             exit (1);
         }
         assert (rGroup->path);
-        di = dirs_open (dict, rGroup->path);
-        strcpy (src, "");
-        repositoryUpdateR (di, dirs_read (di), rGroup->path, src, rGroup);
+
+        strcpy (src, rGroup->path);
+        src_len = strlen (src);
+
+        if (src_len && src[src_len-1] != '/')
+        {
+            src[src_len] = '/';
+            src[++src_len] = '\0';
+        }
+
+        di = dirs_open (dict, src);
+
+        *dst = '\0';
+        fileUpdateR (di, dirs_read (di), src, dst, rGroup);
         dirs_free (&di);
         dict_close (dict);
     }