--- ../trunk/csync2.c 2008-06-20 13:52:03.000000000 +0200 +++ trunk/csync2.c 2008-10-21 17:56:47.000000000 +0200 @@ -648,8 +648,10 @@ found_a_group:; case MODE_MARK: for (i=optind; i < argc; i++) { char *realname = getrealfn(argv[i]); + char *pfname; csync_check_usefullness(realname, recursive); - csync_mark(realname, 0, 0); + pfname=strdup(prefixencode(realname)); + csync_mark(pfname, 0, 0); if ( recursive ) { char *where_rec = ""; @@ -657,19 +659,20 @@ found_a_group:; if ( !strcmp(realname, "/") ) asprintf(&where_rec, "or 1"); else - asprintf(&where_rec, "or (filename > '%s/' " - "and filename < '%s0')", - url_encode(realname), url_encode(realname)); + asprintf(&where_rec, "UNION ALL SELECT filename from file where filename > '%s/' " + "and filename < '%s0'", + url_encode(pfname), url_encode(pfname)); SQL_BEGIN("Adding dirty entries recursively", "SELECT filename FROM file WHERE filename = '%s' %s", - url_encode(realname), where_rec) + url_encode(pfname), where_rec) { - char *filename = strdup(url_encode(SQL_V(0))); + char *filename = strdup(url_decode(SQL_V(0))); csync_mark(filename, 0, 0); free(filename); } SQL_END; } + free(pfname); } break; --- ../trunk/csync2.h 2008-06-20 13:52:03.000000000 +0200 +++ trunk/csync2.h 2008-10-21 14:14:19.000000000 +0200 @@ -196,6 +196,7 @@ const char *url_decode(const char *in); /* another ringbuffer here. so use it with care!! */ const char *prefixsubst(const char *in); +const char *prefixencode(const char *filename); /* textlist implementation */ --- ../trunk/prefixsubst.c 2008-06-20 13:52:03.000000000 +0200 +++ trunk/prefixsubst.c 2008-10-21 14:19:23.000000000 +0200 @@ -56,3 +56,35 @@ const char *prefixsubst(const char *in) return 0; } +const char *prefixencode(const char *filename) { +#if __CYGWIN__ + if (!strcmp(filename, "/")) { + filename = "/cygdrive"; + } +#endif + struct csync_prefix *p = csync_prefix; + + /* + * Canonicalized paths will always contain / + * Prefixsubsted paths will probably contain % + */ + if (*filename == '/') + while (p) { + if (p->path) { + int p_len = strlen(p->path); + int f_len = strlen(filename); + + if (p_len <= f_len && !strncmp(p->path, filename, p_len) && + (filename[p_len] == '/' || !filename[p_len])) { + ringbuff_counter = (ringbuff_counter+1) % RINGBUFF_LEN; + if (ringbuff[ringbuff_counter]) + free(ringbuff[ringbuff_counter]); + asprintf(&ringbuff[ringbuff_counter], "%%%s%%%s", p->name, filename+p_len); + return ringbuff[ringbuff_counter]; + } + } + p = p->next; + } + return filename; +} +