Skip to content

Commit 579dd01

Browse files
feiniksyangheran
andauthored
Update folder mtime when file is changed (#2919)
* Update folder mtime when file is changed * Set parent folder mtime to local time * Adjust code * Adjust code * Delete comment --------- Co-authored-by: yangheran <heran.yang@seafile.com>
1 parent 1099e51 commit 579dd01

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

daemon/change-set.c

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -375,9 +375,9 @@ add_to_tree (ChangeSet *changeset,
375375
int n, i;
376376
ChangeSetDir *dir;
377377
ChangeSetDirent *dent;
378-
ChangeSetDirent *parent_dent = NULL;
379378
SeafDir *seaf_dir;
380-
gboolean changed;
379+
GList *parent_dents = NULL;
380+
gboolean changed = FALSE;
381381

382382
parts = g_strsplit (path, "/", 0);
383383
n = g_strv_length(parts);
@@ -409,15 +409,11 @@ add_to_tree (ChangeSet *changeset,
409409
seaf_dir_free (seaf_dir);
410410
}
411411
dir = dent->subdir;
412-
parent_dent = dent;
412+
parent_dents = g_list_prepend (parent_dents, dent);
413413
} else if (S_ISREG(dent->mode)) {
414414
if (i == (n-1)) {
415415
/* File exists, update it. */
416416
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-
}
421417
break;
422418
}
423419
}
@@ -443,20 +439,25 @@ add_to_tree (ChangeSet *changeset,
443439
#endif
444440

445441
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-
}
453442
create_new_dent (dir, dname, sha1, st, modifier, new_dent);
443+
changed = TRUE;
454444
} else {
455445
dir = create_intermediate_dir (dir, dname, st);
456446
}
457447
}
458448
}
459449

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+
460461
g_strfreev (parts);
461462
}
462463

@@ -471,8 +472,8 @@ delete_from_tree (ChangeSet *changeset,
471472
int n, i;
472473
ChangeSetDir *dir;
473474
ChangeSetDirent *dent, *ret = NULL;
474-
ChangeSetDirent *parent_dent = NULL;
475475
SeafDir *seaf_dir;
476+
GList *parent_dents = NULL;
476477

477478
*parent_empty = FALSE;
478479

@@ -493,10 +494,6 @@ delete_from_tree (ChangeSet *changeset,
493494
if (g_hash_table_size (dir->dents) == 0)
494495
*parent_empty = TRUE;
495496
ret = dent;
496-
// update parent dir mtime when delete dirs locally.
497-
if (parent_dent) {
498-
parent_dent->mtime = time (NULL);
499-
}
500497
break;
501498
}
502499

@@ -514,23 +511,30 @@ delete_from_tree (ChangeSet *changeset,
514511
seaf_dir_free (seaf_dir);
515512
}
516513
dir = dent->subdir;
517-
parent_dent = dent;
514+
parent_dents = g_list_prepend (parent_dents, dent);
518515
} else if (S_ISREG(dent->mode)) {
519516
if (i == (n-1)) {
520517
/* Remove from hash table without freeing dent. */
521518
remove_dent_from_dir (dir, dname);
522519
if (g_hash_table_size (dir->dents) == 0)
523520
*parent_empty = TRUE;
524521
ret = dent;
525-
// update parent dir mtime when delete files locally.
526-
if (parent_dent) {
527-
parent_dent->mtime = time (NULL);
528-
}
529522
break;
530523
}
531524
}
532525
}
533526

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+
534538
g_strfreev (parts);
535539
return ret;
536540
}

0 commit comments

Comments
 (0)