static struct exclude_struct **local_exclude_list;
+static void clean_flist(struct file_list *flist, int strip_root);
+
int link_stat(const char *Path, STRUCT_STAT *Buffer)
{
#if SUPPORT_LINKS
static char *flist_dir;
-void send_file_entry(struct file_struct *file,int f,unsigned base_flags)
+static void send_file_entry(struct file_struct *file,int f,unsigned base_flags)
{
unsigned char flags;
static time_t last_time;
clean_fname(thisname);
- if (relative_paths && thisname[0] == '/') {
- /* strip / off absolute paths in destination */
- memmove(thisname, thisname+1, strlen(thisname));
- if (!thisname[0]) strcpy(thisname,".");
- }
-
if ((p = strrchr(thisname,'/'))) {
static char *lastdir;
*p = 0;
}
p = fname + strlen(fname);
+ local_exclude_list = NULL;
+
if (cvs_exclude) {
if (strlen(fname) + strlen(".cvsignore") <= MAXPATHLEN-1) {
strcpy(p,".cvsignore");
send_file_name(f,flist,fname,recurse,0);
}
+ if (local_exclude_list) {
+ add_exclude_list("!", &local_exclude_list, 0);
+ }
+
closedir(d);
}
if (verbose && recurse && !am_server && f != -1)
rprintf(FINFO,"done\n");
- clean_flist(flist);
+ clean_flist(flist, 0);
/* now send the uid/gid list. This was introduced in protocol
version 15 */
if (verbose > 2)
rprintf(FINFO,"received %d names\n",flist->count);
- clean_flist(flist);
+ clean_flist(flist, relative_paths);
if (verbose && recurse && !am_server) {
rprintf(FINFO,"done\n");
* This routine ensures we don't have any duplicate names in our file list.
* duplicate names can cause corruption because of the pipelining
*/
-void clean_flist(struct file_list *flist)
+static void clean_flist(struct file_list *flist, int strip_root)
{
int i;
free_file(flist->files[i]);
}
}
+
+ if (strip_root) {
+ /* we need to strip off the root directory in the case
+ of relative paths, but this must be done _after_
+ the sorting phase */
+ for (i=0;i<flist->count;i++) {
+ if (flist->files[i]->dirname &&
+ flist->files[i]->dirname[0] == '/') {
+ memmove(&flist->files[i]->dirname[0],
+ &flist->files[i]->dirname[1],
+ strlen(flist->files[i]->dirname));
+ }
+
+ if (flist->files[i]->dirname &&
+ !flist->files[i]->dirname[0]) {
+ flist->files[i]->dirname = NULL;
+ }
+ }
+ }
+
+
+ if (verbose <= 3) return;
+
+ for (i=0;i<flist->count;i++) {
+ rprintf(FINFO,"[%d] i=%d %s %s mode=0%o len=%d\n",
+ getpid(), i,
+ flist->files[i]->dirname,
+ flist->files[i]->basename,
+ flist->files[i]->mode,
+ flist->files[i]->length);
+ }
}