1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 
3 #ifndef SEAF_REPO_MGR_H
4 #define SEAF_REPO_MGR_H
5 
6 #include "seafile-object.h"
7 #include "commit-mgr.h"
8 #include "branch-mgr.h"
9 
10 typedef enum RepoStatus {
11     REPO_STATUS_NORMAL,
12     REPO_STATUS_READ_ONLY,
13     N_REPO_STATUS,
14 } RepoStatus;
15 
16 struct _SeafRepoManager;
17 typedef struct _SeafRepo SeafRepo;
18 
19 typedef struct SeafVirtRepo {
20     char        repo_id[37];
21     char        origin_repo_id[37];
22     char        *path;
23     char        base_commit[41];
24 } SeafVirtRepo;
25 
26 struct _SeafRepo {
27     struct _SeafRepoManager *manager;
28 
29     gchar       id[37];
30     gchar      *name;
31     gchar      *desc;
32     gchar      *last_modifier;
33     gboolean    encrypted;
34     int         enc_version;
35     gchar       magic[65];       /* hash(repo_id + passwd), key stretched. */
36     gchar       random_key[97];
37     gchar       salt[65];
38     gboolean    no_local_history;
39     gint64      last_modify;
40     gint64      size;
41     gint64      file_count;
42 
43     int         status;
44 
45     SeafBranch *head;
46     gchar root_id[41];
47 
48     gboolean    is_corrupted;
49     gboolean    repaired;
50     int         ref_cnt;
51 
52     SeafVirtRepo *virtual_info;
53 
54     int version;
55     /* Used to access fs and block sotre.
56      * This id is different from repo_id when this repo is virtual.
57      * Virtual repos share fs and block store with its origin repo.
58      * However, commit store for each repo is always independent.
59      * So always use repo_id to access commit store.
60      */
61     gchar       store_id[37];
62 };
63 
64 gboolean is_repo_id_valid (const char *id);
65 
66 SeafRepo*
67 seaf_repo_new (const char *id, const char *name, const char *desc);
68 
69 void
70 seaf_repo_free (SeafRepo *repo);
71 
72 void
73 seaf_repo_ref (SeafRepo *repo);
74 
75 void
76 seaf_repo_unref (SeafRepo *repo);
77 
78 int
79 seaf_repo_set_head (SeafRepo *repo, SeafBranch *branch);
80 
81 /* Update repo name, desc, magic etc from commit.
82  */
83 void
84 seaf_repo_from_commit (SeafRepo *repo, SeafCommit *commit);
85 
86 void
87 seaf_fill_repo_obj_from_commit (GList **repos);
88 
89 /* Update repo-related fields to commit.
90  */
91 void
92 seaf_repo_to_commit (SeafRepo *repo, SeafCommit *commit);
93 
94 /*
95  * Returns a list of all commits belongs to the repo.
96  * The commits in the repos are all unique.
97  */
98 GList *
99 seaf_repo_get_commits (SeafRepo *repo);
100 
101 GList *
102 seaf_repo_diff (SeafRepo *repo, const char *arg1, const char *arg2, int fold_dir_results, char **error);
103 
104 typedef struct _SeafRepoManager SeafRepoManager;
105 typedef struct _SeafRepoManagerPriv SeafRepoManagerPriv;
106 
107 struct _SeafRepoManager {
108     struct _SeafileSession *seaf;
109 
110     SeafRepoManagerPriv *priv;
111 };
112 
113 SeafRepoManager*
114 seaf_repo_manager_new (struct _SeafileSession *seaf);
115 
116 int
117 seaf_repo_manager_init (SeafRepoManager *mgr);
118 
119 int
120 seaf_repo_manager_start (SeafRepoManager *mgr);
121 
122 /*
123  * Repo Management functions.
124  */
125 
126 int
127 seaf_repo_manager_add_repo (SeafRepoManager *mgr, SeafRepo *repo);
128 
129 int
130 seaf_repo_manager_del_repo (SeafRepoManager *mgr,
131                             const char *repo_id,
132                             GError **error);
133 
134 int
135 seaf_repo_manager_del_virtual_repo (SeafRepoManager *mgr,
136                                     const char *repo_id);
137 
138 SeafRepo*
139 seaf_repo_manager_get_repo (SeafRepoManager *manager, const gchar *id);
140 
141 /* Return repo object even if it's corrupted. */
142 SeafRepo*
143 seaf_repo_manager_get_repo_ex (SeafRepoManager *manager, const gchar *id);
144 
145 gboolean
146 seaf_repo_manager_repo_exists (SeafRepoManager *manager, const gchar *id);
147 
148 GList*
149 seaf_repo_manager_get_repo_list (SeafRepoManager *mgr, int start, int limit,
150                                  const gchar *order_by);
151 
152 gint64
153 seaf_repo_manager_count_repos (SeafRepoManager *mgr, GError **error);
154 
155 GList*
156 seaf_repo_manager_get_trash_repo_list (SeafRepoManager *mgr,
157                                        int start,
158                                        int limit,
159                                        GError **error);
160 
161 GList *
162 seaf_repo_manager_get_trash_repos_by_owner (SeafRepoManager *mgr,
163                                             const char *owner,
164                                             GError **error);
165 
166 int
167 seaf_repo_manager_del_repo_from_trash (SeafRepoManager *mgr,
168                                        const char *repo_id,
169                                        GError **error);
170 
171 /* Remove all entries in the repo trash. */
172 int
173 seaf_repo_manager_empty_repo_trash (SeafRepoManager *mgr, GError **error);
174 
175 int
176 seaf_repo_manager_empty_repo_trash_by_owner (SeafRepoManager *mgr,
177                                              const char *owner,
178                                              GError **error);
179 
180 int
181 seaf_repo_manager_restore_repo_from_trash (SeafRepoManager *mgr,
182                                            const char *repo_id,
183                                            GError **error);
184 
185 GList *
186 seaf_repo_manager_get_repo_id_list (SeafRepoManager *mgr);
187 
188 int
189 seaf_repo_manager_branch_repo_unmap (SeafRepoManager *manager, SeafBranch *branch);
190 
191 /*
192  * Repo properties functions.
193  */
194 
195 #define MAX_REPO_TOKEN 64
196 #define DEFAULT_REPO_TOKEN "default"
197 
198 char *
199 seaf_repo_manager_get_email_by_token (SeafRepoManager *manager,
200                                       const char *repo_id,
201                                       const char *token);
202 char *
203 seaf_repo_manager_generate_repo_token (SeafRepoManager *mgr,
204                                        const char *repo_id,
205                                        const char *email,
206                                        GError **error);
207 
208 int
209 seaf_repo_manager_add_token_peer_info (SeafRepoManager *mgr,
210                                        const char *token,
211                                        const char *peer_id,
212                                        const char *peer_ip,
213                                        const char *peer_name,
214                                        gint64 sync_time,
215                                        const char *client_ver);
216 
217 int
218 seaf_repo_manager_update_token_peer_info (SeafRepoManager *mgr,
219                                           const char *token,
220                                           const char *peer_ip,
221                                           gint64 sync_time,
222                                           const char *client_ver);
223 
224 gboolean
225 seaf_repo_manager_token_peer_info_exists (SeafRepoManager *mgr,
226                                           const char *token);
227 
228 int
229 seaf_repo_manager_delete_token (SeafRepoManager *mgr,
230                                 const char *repo_id,
231                                 const char *token,
232                                 const char *user,
233                                 GError **error);
234 
235 GList *
236 seaf_repo_manager_list_repo_tokens (SeafRepoManager *mgr,
237                                     const char *repo_id,
238                                     GError **error);
239 GList *
240 seaf_repo_manager_list_repo_tokens_by_email (SeafRepoManager *mgr,
241                                              const char *email,
242                                              GError **error);
243 int
244 seaf_repo_manager_delete_repo_tokens_by_peer_id (SeafRepoManager *mgr,
245                                                  const char *email,
246                                                  const char *peer_id,
247                                                  GList **tokens,
248                                                  GError **error);
249 
250 int
251 seaf_repo_manager_delete_repo_tokens_by_email (SeafRepoManager *mgr,
252                                                const char *email,
253                                                GError **error);
254 
255 gint64
256 seaf_repo_manager_get_repo_size (SeafRepoManager *mgr, const char *repo_id);
257 
258 int
259 seaf_repo_manager_set_repo_history_limit (SeafRepoManager *mgr,
260                                           const char *repo_id,
261                                           int days);
262 
263 /*
264  * > 0: keep a period of history;
265  * = 0: don't keep history;
266  * < 0: keep full history.
267  */
268 int
269 seaf_repo_manager_get_repo_history_limit (SeafRepoManager *mgr,
270                                           const char *repo_id);
271 
272 int
273 seaf_repo_manager_set_repo_valid_since (SeafRepoManager *mgr,
274                                         const char *repo_id,
275                                         gint64 timestamp);
276 
277 gint64
278 seaf_repo_manager_get_repo_valid_since (SeafRepoManager *mgr,
279                                         const char *repo_id);
280 
281 /*
282  * Return the timestamp to stop traversing history.
283  * Returns > 0 if traverse a period of history;
284  * Returns = 0 if only traverse the head commit;
285  * Returns < 0 if traverse full history.
286  */
287 gint64
288 seaf_repo_manager_get_repo_truncate_time (SeafRepoManager *mgr,
289                                           const char *repo_id);
290 
291 /*
292  * Repo Operations.
293  */
294 
295 int
296 seaf_repo_manager_revert_on_server (SeafRepoManager *mgr,
297                                     const char *repo_id,
298                                     const char *commit_id,
299                                     const char *user_name,
300                                     GError **error);
301 
302 /**
303  * Add a new file in a repo.
304  * The content of the file is stored in a temporary file.
305  * @repo_id:        id of the repo
306  * @temp_file_path: path of the temporary file
307  * @parent_dir:     the directory to add this file
308  * @file_name:      the name of the new file
309  * @user:           author of this operation
310  */
311 int
312 seaf_repo_manager_post_file (SeafRepoManager *mgr,
313                              const char *repo_id,
314                              const char *temp_file_path,
315                              const char *parent_dir,
316                              const char *file_name,
317                              const char *user,
318                              GError **error);
319 
320 int
321 seaf_repo_manager_post_multi_files (SeafRepoManager *mgr,
322                                     const char *repo_id,
323                                     const char *parent_dir,
324                                     const char *filenames_json,
325                                     const char *paths_json,
326                                     const char *user,
327                                     int replace_existed,
328                                     char **new_ids,
329                                     char **task_id,
330                                     GError **error);
331 
332 /* int */
333 /* seaf_repo_manager_post_file_blocks (SeafRepoManager *mgr, */
334 /*                                     const char *repo_id, */
335 /*                                     const char *parent_dir, */
336 /*                                     const char *file_name, */
337 /*                                     const char *blockids_json, */
338 /*                                     const char *paths_json, */
339 /*                                     const char *user, */
340 /*                                     gint64 file_size, */
341 /*                                     int replace_existed, */
342 /*                                     char **new_id, */
343 /*                                     GError **error); */
344 
345 int
346 seaf_repo_manager_post_blocks (SeafRepoManager *mgr,
347                                const char *repo_id,
348                                const char *blockids_json,
349                                const char *paths_json,
350                                const char *user,
351                                GError **error);
352 
353 int
354 seaf_repo_manager_commit_file_blocks (SeafRepoManager *mgr,
355                                       const char *repo_id,
356                                       const char *parent_dir,
357                                       const char *file_name,
358                                       const char *blockids_json,
359                                       const char *user,
360                                       gint64 file_size,
361                                       int replace_existed,
362                                       char **new_id,
363                                       GError **error);
364 
365 int
366 seaf_repo_manager_post_empty_file (SeafRepoManager *mgr,
367                                    const char *repo_id,
368                                    const char *parent_dir,
369                                    const char *new_file_name,
370                                    const char *user,
371                                    GError **error);
372 
373 int
374 seaf_repo_manager_post_dir (SeafRepoManager *mgr,
375                             const char *repo_id,
376                             const char *parent_dir,
377                             const char *new_dir_name,
378                             const char *user,
379                             GError **error);
380 
381 int
382 seaf_repo_manager_mkdir_with_parents (SeafRepoManager *mgr,
383                                       const char *repo_id,
384                                       const char *parent_dir,
385                                       const char *new_dir_path,
386                                       const char *user,
387                                       GError **error);
388 
389 /**
390  * Update an existing file in a repo
391  * @params: same as seaf_repo_manager_post_file
392  * @head_id: the commit id for the original file version.
393  *           It's optional. If it's NULL, the current repo head will be used.
394  * @new_file_id: The return location of the new file id
395  */
396 int
397 seaf_repo_manager_put_file (SeafRepoManager *mgr,
398                             const char *repo_id,
399                             const char *temp_file_path,
400                             const char *parent_dir,
401                             const char *file_name,
402                             const char *user,
403                             const char *head_id,
404                             char **new_file_id,
405                             GError **error);
406 
407 /* int */
408 /* seaf_repo_manager_put_file_blocks (SeafRepoManager *mgr, */
409 /*                                    const char *repo_id, */
410 /*                                    const char *parent_dir, */
411 /*                                    const char *file_name, */
412 /*                                    const char *blockids_json, */
413 /*                                    const char *paths_json, */
414 /*                                    const char *user, */
415 /*                                    const char *head_id, */
416 /*                                    gint64 file_size, */
417 /*                                    char **new_file_id, */
418 /*                                    GError **error); */
419 
420 int
421 seaf_repo_manager_del_file (SeafRepoManager *mgr,
422                             const char *repo_id,
423                             const char *parent_dir,
424                             const char *file_name,
425                             const char *user,
426                             GError **error);
427 
428 SeafileCopyResult *
429 seaf_repo_manager_copy_file (SeafRepoManager *mgr,
430                              const char *src_repo_id,
431                              const char *src_dir,
432                              const char *src_filename,
433                              const char *dst_repo_id,
434                              const char *dst_dir,
435                              const char *dst_filename,
436                              const char *user,
437                              int need_progress,
438                              int synchronous,
439                              GError **error);
440 
441 SeafileCopyResult *
442 seaf_repo_manager_copy_multiple_files (SeafRepoManager *mgr,
443                                        const char *src_repo_id,
444                                        const char *src_dir,
445                                        const char *src_filenames,
446                                        const char *dst_repo_id,
447                                        const char *dst_dir,
448                                        const char *dst_filenames,
449                                        const char *user,
450                                        int need_progress,
451                                        int synchronous,
452                                        GError **error);
453 
454 SeafileCopyResult *
455 seaf_repo_manager_move_file (SeafRepoManager *mgr,
456                              const char *src_repo_id,
457                              const char *src_dir,
458                              const char *src_filename,
459                              const char *dst_repo_id,
460                              const char *dst_dir,
461                              const char *dst_filename,
462                              int replace,
463                              const char *user,
464                              int need_progress,
465                              int synchronous,
466                              GError **error);
467 
468 SeafileCopyResult *
469 seaf_repo_manager_move_multiple_files (SeafRepoManager *mgr,
470                                        const char *src_repo_id,
471                                        const char *src_dir,
472                                        const char *src_filenames,
473                                        const char *dst_repo_id,
474                                        const char *dst_dir,
475                                        const char *dst_filenames,
476                                        int replace,
477                                        const char *user,
478                                        int need_progress,
479                                        int synchronous,
480                                        GError **error);
481 
482 int
483 seaf_repo_manager_rename_file (SeafRepoManager *mgr,
484                                const char *repo_id,
485                                const char *parent_dir,
486                                const char *oldname,
487                                const char *newname,
488                                const char *user,
489                                GError **error);
490 
491 int
492 seaf_repo_manager_is_valid_filename (SeafRepoManager *mgr,
493                                      const char *repo_id,
494                                      const char *filename,
495                                      GError **error);
496 
497 char *
498 seaf_repo_manager_create_new_repo (SeafRepoManager *mgr,
499                                    const char *repo_name,
500                                    const char *repo_desc,
501                                    const char *owner_email,
502                                    const char *passwd,
503                                    int enc_version,
504                                    GError **error);
505 
506 char *
507 seaf_repo_manager_create_enc_repo (SeafRepoManager *mgr,
508                                    const char *repo_id,
509                                    const char *repo_name,
510                                    const char *repo_desc,
511                                    const char *owner_email,
512                                    const char *magic,
513                                    const char *random_key,
514                                    const char *salt,
515                                    int enc_version,
516                                    GError **error);
517 
518 /* Give a repo and a path in this repo, returns a list of commits, where every
519  * commit contains a unique version of the file. The commits are sorted in
520  * ascending order of commit time. */
521 GList *
522 seaf_repo_manager_list_file_revisions (SeafRepoManager *mgr,
523                                        const char *repo_id,
524                                        const char *start_commit_id,
525                                        const char *path,
526                                        int limit,
527                                        gboolean got_latest,
528                                        gboolean got_second,
529                                        GError **error);
530 
531 GList *
532 seaf_repo_manager_calc_files_last_modified (SeafRepoManager *mgr,
533                                             const char *repo_id,
534                                             const char *parent_dir,
535                                             int limit,
536                                             GError **error);
537 
538 int
539 seaf_repo_manager_revert_file (SeafRepoManager *mgr,
540                                const char *repo_id,
541                                const char *commit_id,
542                                const char *path,
543                                const char *user,
544                                GError **error);
545 
546 int
547 seaf_repo_manager_revert_dir (SeafRepoManager *mgr,
548                               const char *repo_id,
549                               const char *old_commit_id,
550                               const char *dir_path,
551                               const char *user,
552                               GError **error);
553 
554 /*
555  * Return deleted files/dirs.
556  */
557 GList *
558 seaf_repo_manager_get_deleted_entries (SeafRepoManager *mgr,
559                                        const char *repo_id,
560                                        int show_days,
561                                        const char *path,
562                                        const char *scan_stat,
563                                        int limit,
564                                        GError **error);
565 
566 /*
567  * Set the dir_id of @dir_path to @new_dir_id.
568  * @new_commit_id: The new head commit id after the update.
569  */
570 int
571 seaf_repo_manager_update_dir (SeafRepoManager *mgr,
572                               const char *repo_id,
573                               const char *dir_path,
574                               const char *new_dir_id,
575                               const char *user,
576                               const char *head_id,
577                               char *new_commit_id,
578                               GError **error);
579 
580 /*
581  * Permission related functions.
582  */
583 
584 /* Owner functions. */
585 
586 int
587 seaf_repo_manager_set_repo_owner (SeafRepoManager *mgr,
588                                   const char *repo_id,
589                                   const char *email);
590 
591 char *
592 seaf_repo_manager_get_repo_owner (SeafRepoManager *mgr,
593                                   const char *repo_id);
594 
595 GList *
596 seaf_repo_manager_get_orphan_repo_list (SeafRepoManager *mgr);
597 
598 /* TODO: add start and limit. */
599 /* Get repos owned by this user.
600  */
601 GList *
602 seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr,
603                                       const char *email,
604                                       int ret_corrupted,
605                                       int start,
606                                       int limit,
607                                       gboolean *db_err);
608 GList *
609 seaf_repo_manager_search_repos_by_name (SeafRepoManager *mgr, const char *name);
610 
611 GList *
612 seaf_repo_manager_get_repo_ids_by_owner (SeafRepoManager *mgr,
613                                          const char *email);
614 
615 /* Group repos. */
616 
617 int
618 seaf_repo_manager_add_group_repo (SeafRepoManager *mgr,
619                                   const char *repo_id,
620                                   int group_id,
621                                   const char *owner,
622                                   const char *permission,
623                                   GError **error);
624 int
625 seaf_repo_manager_del_group_repo (SeafRepoManager *mgr,
626                                   const char *repo_id,
627                                   int group_id,
628                                   GError **error);
629 
630 GList *
631 seaf_repo_manager_get_groups_by_repo (SeafRepoManager *mgr,
632                                       const char *repo_id,
633                                       GError **error);
634 
635 typedef struct GroupPerm {
636     int group_id;
637     char permission[16];
638 } GroupPerm;
639 
640 GList *
641 seaf_repo_manager_get_group_perm_by_repo (SeafRepoManager *mgr,
642                                           const char *repo_id,
643                                           GError **error);
644 
645 int
646 seaf_repo_manager_set_group_repo_perm (SeafRepoManager *mgr,
647                                        const char *repo_id,
648                                        int group_id,
649                                        const char *permission,
650                                        GError **error);
651 
652 char *
653 seaf_repo_manager_get_group_repo_owner (SeafRepoManager *mgr,
654                                         const char *repo_id,
655                                         GError **error);
656 
657 GList *
658 seaf_repo_manager_get_group_repoids (SeafRepoManager *mgr,
659                                      int group_id,
660                                      GError **error);
661 
662 GList *
663 seaf_repo_manager_get_repos_by_group (SeafRepoManager *mgr,
664                                       int group_id,
665                                       GError **error);
666 
667 GList *
668 seaf_repo_manager_get_group_repos_by_owner (SeafRepoManager *mgr,
669                                             const char *owner,
670                                             GError **error);
671 
672 int
673 seaf_repo_manager_remove_group_repos (SeafRepoManager *mgr,
674                                       int group_id,
675                                       const char *owner,
676                                       GError **error);
677 
678 /* Inner public repos */
679 
680 int
681 seaf_repo_manager_set_inner_pub_repo (SeafRepoManager *mgr,
682                                       const char *repo_id,
683                                       const char *permission);
684 
685 int
686 seaf_repo_manager_unset_inner_pub_repo (SeafRepoManager *mgr,
687                                         const char *repo_id);
688 
689 gboolean
690 seaf_repo_manager_is_inner_pub_repo (SeafRepoManager *mgr,
691                                      const char *repo_id);
692 
693 GList *
694 seaf_repo_manager_list_inner_pub_repos (SeafRepoManager *mgr, gboolean *db_err);
695 
696 gint64
697 seaf_repo_manager_count_inner_pub_repos (SeafRepoManager *mgr);
698 
699 GList *
700 seaf_repo_manager_list_inner_pub_repos_by_owner (SeafRepoManager *mgr,
701                                                  const char *user);
702 
703 char *
704 seaf_repo_manager_get_inner_pub_repo_perm (SeafRepoManager *mgr,
705                                            const char *repo_id);
706 
707 /*
708  * Comprehensive repo permission checker.
709  * It checks if @user have permission to access @repo_id.
710  */
711 char *
712 seaf_repo_manager_check_permission (SeafRepoManager *mgr,
713                                     const char *repo_id,
714                                     const char *user,
715                                     GError **error);
716 
717 GList *
718 seaf_repo_manager_list_dir_with_perm (SeafRepoManager *mgr,
719                                       const char *repo_id,
720                                       const char *dir_path,
721                                       const char *dir_id,
722                                       const char *user,
723                                       int offset,
724                                       int limit,
725                                       GError **error);
726 
727 /* Web access permission. */
728 
729 int
730 seaf_repo_manager_set_access_property (SeafRepoManager *mgr, const char *repo_id,
731                                        const char *ap);
732 
733 char *
734 seaf_repo_manager_query_access_property (SeafRepoManager *mgr, const char *repo_id);
735 
736 /* Decrypted repo token cache. */
737 
738 void
739 seaf_repo_manager_add_decrypted_token (SeafRepoManager *mgr,
740                                        const char *encrypted_token,
741                                        const char *session_key,
742                                        const char *decrypted_token);
743 
744 char *
745 seaf_repo_manager_get_decrypted_token (SeafRepoManager *mgr,
746                                        const char *encrypted_token,
747                                        const char *session_key);
748 
749 /* Virtual repo related. */
750 
751 char *
752 seaf_repo_manager_create_virtual_repo (SeafRepoManager *mgr,
753                                        const char *origin_repo_id,
754                                        const char *path,
755                                        const char *repo_name,
756                                        const char *repo_desc,
757                                        const char *owner,
758                                        const char *passwd,
759                                        GError **error);
760 
761 SeafVirtRepo *
762 seaf_repo_manager_get_virtual_repo_info (SeafRepoManager *mgr,
763                                          const char *repo_id);
764 
765 GList *
766 seaf_repo_manager_get_virtual_info_by_origin (SeafRepoManager *mgr,
767                                               const char *origin_repo);
768 
769 void
770 seaf_virtual_repo_info_free (SeafVirtRepo *vinfo);
771 
772 gboolean
773 seaf_repo_manager_is_virtual_repo (SeafRepoManager *mgr, const char *repo_id);
774 
775 char *
776 seaf_repo_manager_get_virtual_repo_id (SeafRepoManager *mgr,
777                                        const char *origin_repo,
778                                        const char *path,
779                                        const char *owner);
780 
781 GList *
782 seaf_repo_manager_get_virtual_repos_by_owner (SeafRepoManager *mgr,
783                                               const char *owner,
784                                               GError **error);
785 
786 GList *
787 seaf_repo_manager_get_virtual_repo_ids_by_origin (SeafRepoManager *mgr,
788                                                   const char *origin_repo);
789 
790 /*
791  * if @repo_id is a virtual repo, try to merge with origin;
792  * if not, try to merge with its virtual repos.
793  */
794 int
795 seaf_repo_manager_merge_virtual_repo (SeafRepoManager *mgr,
796                                       const char *repo_id,
797                                       const char *exclude_repo);
798 
799 /*
800  * Check each virtual repo of @origin_repo_id, if the path corresponds to it
801  * doesn't exist, delete the virtual repo.
802  */
803 void
804 seaf_repo_manager_cleanup_virtual_repos (SeafRepoManager *mgr,
805                                          const char *origin_repo_id);
806 
807 int
808 seaf_repo_manager_init_merge_scheduler ();
809 
810 GList *
811 seaf_repo_manager_get_shared_users_for_subdir (SeafRepoManager *mgr,
812                                                const char *repo_id,
813                                                const char *path,
814                                                const char *from_user,
815                                                GError **error);
816 
817 GList *
818 seaf_repo_manager_get_shared_groups_for_subdir (SeafRepoManager *mgr,
819                                                 const char *repo_id,
820                                                 const char *path,
821                                                 const char *from_user,
822                                                 GError **error);
823 int
824 seaf_repo_manager_edit_repo (const char *repo_id,
825                 const char *name,
826                 const char *description,
827                 const char *user,
828                 GError **error);
829 
830 gint64
831 seaf_get_total_file_number (GError **error);
832 
833 gint64
834 seaf_get_total_storage (GError **error);
835 
836 int
837 seaf_repo_manager_add_upload_tmp_file (SeafRepoManager *mgr,
838                                        const char *repo_id,
839                                        const char *file_path,
840                                        const char *tmp_file,
841                                        GError **error);
842 
843 int
844 seaf_repo_manager_del_upload_tmp_file (SeafRepoManager *mgr,
845                                        const char *repo_id,
846                                        const char *file_path,
847                                        GError **error);
848 
849 char *
850 seaf_repo_manager_get_upload_tmp_file (SeafRepoManager *mgr,
851                                        const char *repo_id,
852                                        const char *file_path,
853                                        GError **error);
854 
855 gint64
856 seaf_repo_manager_get_upload_tmp_file_offset (SeafRepoManager *mgr,
857                                               const char *repo_id,
858                                               const char *file_path,
859                                               GError **error);
860 
861 void
862 seaf_repo_manager_update_repo_info (SeafRepoManager *mgr,
863                                     const char *repo_id,
864                                     const char *head_commit_id);
865 
866 int
867 set_repo_commit_to_db (const char *repo_id, const char *repo_name, gint64 update_time,
868                        int version, gboolean is_encrypted, const char *last_modifier);
869 char *
870 seaf_get_trash_repo_owner (const char *repo_id);
871 
872 GObject *
873 seaf_get_group_shared_repo_by_path (SeafRepoManager *mgr,
874                                     const char *repo_id,
875                                     const char *path,
876                                     int group_id,
877                                     gboolean is_org,
878                                     GError **error);
879 
880 GList *
881 seaf_get_group_repos_by_user (SeafRepoManager *mgr,
882                               const char *user,
883                               int org_id,
884                               GError **error);
885 
886 int
887 seaf_repo_manager_set_subdir_group_perm_by_path (SeafRepoManager *mgr,
888                                                  const char *repo_id,
889                                                  const char *username,
890                                                  int group_id,
891                                                  const char *permission,
892                                                  const char *path);
893 
894 int
895 post_files_and_gen_commit (GList *filenames,
896                           SeafRepo *repo,
897                           const char *user,
898                           char **ret_json,
899                           int replace_existed,
900                           const char *canon_path,
901                           GList *id_list,
902                           GList *size_list,
903                           GError **error);
904 
905 char *
906 seaf_repo_manager_convert_repo_path (SeafRepoManager *mgr,
907                                      const char *repo_id,
908                                      const char *path,
909                                      const char *user,
910                                      gboolean is_org,
911                                      GError **error);
912 int
913 seaf_repo_manager_set_repo_status(SeafRepoManager *mgr,
914                                   const char *repo_id, RepoStatus status);
915 
916 int
917 seaf_repo_manager_get_repo_status(SeafRepoManager *mgr,
918                                   const char *repo_id);
919 #endif
920