@@ -375,9 +375,9 @@ add_to_tree (ChangeSet *changeset,
375
375
int n , i ;
376
376
ChangeSetDir * dir ;
377
377
ChangeSetDirent * dent ;
378
- ChangeSetDirent * parent_dent = NULL ;
379
378
SeafDir * seaf_dir ;
380
- gboolean changed ;
379
+ GList * parent_dents = NULL ;
380
+ gboolean changed = FALSE;
381
381
382
382
parts = g_strsplit (path , "/" , 0 );
383
383
n = g_strv_length (parts );
@@ -409,15 +409,11 @@ add_to_tree (ChangeSet *changeset,
409
409
seaf_dir_free (seaf_dir );
410
410
}
411
411
dir = dent -> subdir ;
412
- parent_dent = dent ;
412
+ parent_dents = g_list_prepend ( parent_dents , dent ) ;
413
413
} else if (S_ISREG (dent -> mode )) {
414
414
if (i == (n - 1 )) {
415
415
/* File exists, update it. */
416
416
changed = update_file (dent , sha1 , st , modifier );
417
- // update parent dir mtime when modify files locally.
418
- if (parent_dent && changed ) {
419
- parent_dent -> mtime = st -> st_mtime ;
420
- }
421
417
break ;
422
418
}
423
419
}
@@ -443,20 +439,25 @@ add_to_tree (ChangeSet *changeset,
443
439
#endif
444
440
445
441
if (i == (n - 1 )) {
446
- if (parent_dent && new_dent ) {
447
- // update parent dir mtime when rename files locally.
448
- parent_dent -> mtime = time (NULL );
449
- } else if (parent_dent && st ) {
450
- // update parent dir mtime when add files locally.
451
- parent_dent -> mtime = st -> st_mtime ;
452
- }
453
442
create_new_dent (dir , dname , sha1 , st , modifier , new_dent );
443
+ changed = TRUE;
454
444
} else {
455
445
dir = create_intermediate_dir (dir , dname , st );
456
446
}
457
447
}
458
448
}
459
449
450
+ if (changed ) {
451
+ GList * ptr ;
452
+ time_t now = time (NULL );
453
+ for (ptr = parent_dents ; ptr ; ptr = ptr -> next ) {
454
+ dent = ptr -> data ;
455
+ // update parent dir mtime when add or modify or rename files locally.
456
+ dent -> mtime = now ;
457
+ }
458
+ }
459
+ g_list_free (parent_dents );
460
+
460
461
g_strfreev (parts );
461
462
}
462
463
@@ -471,8 +472,8 @@ delete_from_tree (ChangeSet *changeset,
471
472
int n , i ;
472
473
ChangeSetDir * dir ;
473
474
ChangeSetDirent * dent , * ret = NULL ;
474
- ChangeSetDirent * parent_dent = NULL ;
475
475
SeafDir * seaf_dir ;
476
+ GList * parent_dents = NULL ;
476
477
477
478
* parent_empty = FALSE;
478
479
@@ -493,10 +494,6 @@ delete_from_tree (ChangeSet *changeset,
493
494
if (g_hash_table_size (dir -> dents ) == 0 )
494
495
* parent_empty = TRUE;
495
496
ret = dent ;
496
- // update parent dir mtime when delete dirs locally.
497
- if (parent_dent ) {
498
- parent_dent -> mtime = time (NULL );
499
- }
500
497
break ;
501
498
}
502
499
@@ -514,23 +511,30 @@ delete_from_tree (ChangeSet *changeset,
514
511
seaf_dir_free (seaf_dir );
515
512
}
516
513
dir = dent -> subdir ;
517
- parent_dent = dent ;
514
+ parent_dents = g_list_prepend ( parent_dents , dent ) ;
518
515
} else if (S_ISREG (dent -> mode )) {
519
516
if (i == (n - 1 )) {
520
517
/* Remove from hash table without freeing dent. */
521
518
remove_dent_from_dir (dir , dname );
522
519
if (g_hash_table_size (dir -> dents ) == 0 )
523
520
* parent_empty = TRUE;
524
521
ret = dent ;
525
- // update parent dir mtime when delete files locally.
526
- if (parent_dent ) {
527
- parent_dent -> mtime = time (NULL );
528
- }
529
522
break ;
530
523
}
531
524
}
532
525
}
533
526
527
+ if (ret ) {
528
+ GList * ptr ;
529
+ time_t now = time (NULL );
530
+ for (ptr = parent_dents ; ptr ; ptr = ptr -> next ) {
531
+ dent = ptr -> data ;
532
+ // update parent dir mtime when delete dirs or files locally.
533
+ dent -> mtime = now ;
534
+ }
535
+ }
536
+ g_list_free (parent_dents );
537
+
534
538
g_strfreev (parts );
535
539
return ret ;
536
540
}
0 commit comments