+void repository_del_tree (int cmd, char *dst, char *src)
+{
+ log (LOG_DEBUG, "rmdir of %s", dst);
+}
+
+void repository_update_r (int cmd, char *dst, char *src)
+{
+ struct dir_entry *e_dst, *e_src;
+ int i_dst = 0, i_src = 0;
+ struct stat fs_dst, fs_src;
+ size_t dst_len = strlen (dst);
+ size_t src_len = strlen (src);
+
+ e_dst = dir_open (dst);
+ e_src = dir_open (src);
+
+ if (!e_dst && !e_src)
+ return;
+ if (!e_dst)
+ repository_add_tree (cmd, dst, src);
+ else if (!e_src)
+ repository_del_tree (cmd, dst, src);
+
+ dir_sort (e_src);
+ dir_sort (e_dst);
+
+ if (src[src_len-1] != '/')
+ src[src_len] = '/';
+ else
+ --src_len;
+ if (dst[dst_len-1] != '/')
+ dst[dst_len] = '/';
+ else
+ --dst_len;
+ while (e_dst[i_dst].name && e_src[i_src].name)
+ {
+ int sd = strcmp (e_dst[i_dst].name, e_src[i_src].name);
+
+ strcpy (dst +dst_len+1, e_dst[i_dst].name);
+ strcpy (src +src_len+1, e_src[i_src].name);
+
+ if (sd == 0)
+ {
+ /* check type, date, length */
+
+ stat (dst, &fs_dst);
+ stat (src, &fs_src);
+
+ switch (fs_dst.st_mode & S_IFMT)
+ {
+ case S_IFREG:
+ if (fs_src.st_mtime != fs_dst.st_mtime)
+ {
+ file_extract ('a', &fs_src, src);
+ file_extract ('d', &fs_dst, dst);
+ }
+ break;
+ case S_IFDIR:
+ repository_update_r (cmd, dst, src);
+ break;
+ }
+ i_src++;
+ i_dst++;
+ }
+ else if (sd > 0)
+ {
+ stat (src, &fs_src);
+ switch (fs_src.st_mode & S_IFMT)
+ {
+ case S_IFREG:
+ file_extract ('a', &fs_src, src);
+ break;
+ case S_IFDIR:
+ repository_add_tree (cmd, dst, src);
+ break;
+ }
+ i_src++;
+ }
+ else
+ {
+ stat (dst, &fs_dst);
+ switch (fs_dst.st_mode & S_IFMT)
+ {
+ case S_IFREG:
+ file_extract ('d', &fs_dst, dst);
+ break;
+ case S_IFDIR:
+ repository_del_tree (cmd, dst, src);
+ break;
+ }
+ i_dst++;
+ }
+ }
+ dir_free (&e_dst);
+ dir_free (&e_src);