Пример #1
0
static int test_get_fs_size()
{
    gint64 size;
    const char *commit_id;
    SeafCommit *commit;
    SeafRepo *repo;

    printf ("\n=== test get fs size\n");

    repo = create_repo ("get_fs_size");

    commit_id = first_commit (repo);

    commit = seaf_commit_manager_get_commit (seaf->commit_mgr, commit_id);
    if (!commit) {
        fprintf (stderr, "Failed to get commit\n");
        return -1;
    }

    size = seaf_fs_manager_get_fs_size (seaf->fs_mgr, commit->root_id);
    printf ("size is %"G_GINT64_FORMAT"\n", size);
    seaf_commit_unref (commit);

    printf ("\n=== get fs size succeeded.\n");

    return 0;
}
Пример #2
0
int
main(int argc, char *argv[])
{
	create_repo("repo.git");
	read_repo("repo.git");
	//edit_repo("repo.git");
	//read_repo("repo.git");
	return 0;
}
Пример #3
0
static int
test_commit_compare ()
{
    SeafRepo *repo;
    const char *commit1, *commit2, *commit3;
    GError *error = NULL;

    printf ("\n=== test commit compare\n\n");

    repo = create_repo ("commit-compare");
    commit1 = first_commit (repo);

    sleep (2);
    printf ("*** creating branch \"test\"\n");
    /* create branch "test". */
    if (seafile_branch_add (repo->id, "test", NULL, &error) < 0) {
        fprintf (stderr, "Failed to create branch: %s.\n", error->message);
        return -1;
    }

    printf ("*** creating new commit on local\n");
    commit2 = seaf_repo_index_commit (repo, "commit compare 1.", FALSE, NULL, &error);
    if (!commit2) {
        fprintf (stderr, "Failed to commit on branch test\n");
        return -1;
    }
     
    printf ("*** checking out branch test.\n");
    /* switch to branch "test". */
    if (seafile_checkout (repo->id, "test", &error) < 0) {
        fprintf (stderr, "Failed to checkout branch test\n");
        fprintf (stderr, "Checkout error messages:\n%s", error->message);
        return -1;
    }

    printf ("*** creating new commit on branch test.\n");
    commit3 = seaf_repo_index_commit (repo, "merge test 2.", FALSE, NULL, &error);
    if (!commit3) {
        fprintf (stderr, "Failed to commit on branch test\n");
        return -1;
    }

    printf ("*** compare commit.\n");
    g_assert (seaf_commit_manager_compare_commit (
                  seaf->commit_mgr, commit1, commit2) == -1);
    g_assert (seaf_commit_manager_compare_commit (
                  seaf->commit_mgr, commit2, commit1) == 1);
    g_assert (seaf_commit_manager_compare_commit (
                  seaf->commit_mgr, commit2, commit3) == 0);

    return 0;
}
Пример #4
0
static int test_commit()
{
    SeafRepo *repo;
    SeafCommit *commit;
    const char *commit_id;

    printf ("\n=== test commit\n");

    repo = create_repo ("test-commit");

    commit_id = first_commit (repo);

    printf ("*** print index\n");
    if (print_index (repo) < 0)
        return -1;

    commit = seaf_commit_manager_get_commit (seaf->commit_mgr, commit_id);
    if (!commit) {
        fprintf (stderr, "Failed to get commit\n");
        return -1;
    }

    if (traverse_dir (commit->root_id) < 0)
        return -1;

    /* status */
    char *status = seaf_repo_status (repo);
    printf ("Status\n%s", status);
    g_assert (strcmp(status, "") == 0);
    g_free (status);

    seaf_commit_unref (commit);

    printf ("\n=== test commit succeeded.\n");
    return 0;
}
Пример #5
0
static int test_checkout_error ()
{
    SeafRepo *repo;
    char *file_a, *file_b, *file_c;
    FILE *fp_a, *fp_b, *fp_c;
    GError *error = NULL;

    printf ("\n=== test checkout error\n\n");

    repo = create_repo ("checkout_error");

    first_commit (repo);

    sleep (2);

    printf ("*** creating branch \"test\"\n");
    /* create branch "test". */
    if (seafile_branch_add (repo->id, "test", NULL, &error) < 0) {
        fprintf (stderr, "Failed to create branch: %s.\n", error->message);
        return -1;
    }

    file_a = g_build_path (PATH_SEPERATOR, WORKTREE_DIR, repo->id, "data/test-a", NULL);
    file_b = g_build_path (PATH_SEPERATOR, WORKTREE_DIR, repo->id, "data/a/test-b", NULL);
    file_c = g_build_path (PATH_SEPERATOR, WORKTREE_DIR, repo->id, "data/golden-gate.jpg", NULL);

    printf ("*** modifying worktree.\n");
    /* modify an existing file. */
    fp_a = g_fopen (file_a, "wb");
    if (!fp_a) {
        fprintf (stderr, "Failed to open %s: %s\n", file_a, strerror(errno));
        return -1;
    }
    fprintf (fp_a, "xyzxyz\nxyzxyz");
    fclose (fp_a);

    /* add a new file. */
    fp_b = g_fopen (file_b, "w+b");
    if (!fp_b) {
        fprintf (stderr, "Failed to open %s: %s\n", file_b, strerror(errno));
        return -1;
    }
    fprintf (fp_b, "abcabc\nabcabc");
    fclose (fp_b);

    /* delete a file. */
    (void) g_unlink (file_c);

    sleep (2);

    printf ("*** create new commit on local.\n");
    if (seaf_repo_index_add (repo, "") < 0) {
        fprintf (stderr, "Failed to add\n");
        return -1;
    }

    /* a new commit. */
    if (!seaf_repo_index_commit (repo, "second commit")) {
        fprintf (stderr, "Failed to commit\n");
        return -1;
    }    

    sleep (2);

    /* Test 1: overwrite local changes in worktree file. */
    fp_a = g_fopen (file_a, "wb");
    if (!fp_a) {
        fprintf (stderr, "Failed to open %s: %s\n", file_a, strerror(errno));
        return -1;
    }
    fprintf (fp_a, "123\n");
    fclose (fp_a);

    /* Test 2: overwrite untracked file. */
    fp_b = g_fopen (file_b, "w+b");
    if (!fp_b) {
        fprintf (stderr, "Failed to open %s: %s\n", file_b, strerror(errno));
        return -1;
    }
    fprintf (fp_b, "123\n");
    fclose (fp_b);

    /* Test 3: remove worktree file with local changes. */
    fp_c = g_fopen (file_c, "wb");
    if (!fp_c) {
        fprintf (stderr, "Failed to open %s: %s\n", file_c, strerror(errno));
        return -1;
    }
    fprintf (fp_c, "123\n");
    fclose (fp_c);

    sleep (2);

    if (seafile_checkout (repo->id, "test", &error) == 0) {
        fprintf (stderr, "Checkout should fail!\n");
        return -1;
    }

    printf ("Failed to checkout branch 'test'\n");
    printf ("Checkout error messages:\n%s", error->message);

    printf ("\n=== Successfully handle checkout errors.\n\n");
    return 0;
}
Пример #6
0
static int
test_checkout ()
{
    SeafRepo *repo;
    char *file_a, *file_b, *file_c, *dfc;
    FILE *fp_a, *fp_c, *fp_dfc;
    char cmd[1024];
    GError *error = NULL;

    printf ("\n=== test checkout\n\n");

    repo = create_repo ("checkout");

    first_commit (repo);

    sleep (2);

    printf ("*** creating branch \"test\"\n");
    /* create branch "test". */
    if (seafile_branch_add (repo->id, "test", NULL, &error) < 0) {
        fprintf (stderr, "Failed to create branch: %s.\n", error->message);
        return -1;
    }

    file_a = g_build_path (PATH_SEPERATOR, WORKTREE_DIR, repo->id, "data/test-a", NULL);
    file_b = g_build_path (PATH_SEPERATOR, WORKTREE_DIR, repo->id, "data/golden-gate.jpg", NULL);
    file_c = g_build_path (PATH_SEPERATOR, WORKTREE_DIR, repo->id, "data/a/test-b", NULL);
    dfc = g_build_path (PATH_SEPERATOR, WORKTREE_DIR, repo->id, "data/c", NULL);

    printf ("*** modifying worktree.\n");
    /* modify an existing file. */
    fp_a = g_fopen (file_a, "wb");
    if (!fp_a) {
        fprintf (stderr, "Failed to open %s: %s\n", file_a, strerror(errno));
        return -1;
    }
    fprintf (fp_a, "xyzxyz\nxyzxyz");
    fclose (fp_a);

    /* delete a file. */
    (void) g_unlink (file_b);

    /* add a new file. */
    fp_c = g_fopen (file_c, "w+b");
    if (!fp_c) {
        fprintf (stderr, "Failed to open %s: %s\n", file_c, strerror(errno));
        return -1;
    }
    fprintf (fp_c, "abcabc\nabcabc");
    fclose (fp_c);

    /* create directory-file conflict. */
    snprintf (cmd, 1024, "rm -r %s", dfc);
    int ret = system (cmd);
    if (ret < 0 || WEXITSTATUS(ret) != 0) {
        fprintf (stderr, "Failed to remove %s\n", dfc);
        return -1;
    }

    fp_dfc = g_fopen (dfc, "w+b");
    if (!fp_dfc) {
        fprintf (stderr, "Failed to open %s: %s\n", dfc, strerror(errno));
        return -1;
    }
    fprintf (fp_dfc, "1234\n1234\n");
    fclose (fp_dfc);

    sleep (2);

    printf ("*** create new commit on local.\n");
    if (seaf_repo_index_add (repo, "") < 0) {
        fprintf (stderr, "Failed to add\n");
        return -1;
    }

    /* a new commit. */
    if (!seaf_repo_index_commit (repo, "second commit")) {
        fprintf (stderr, "Failed to commit\n");
        return -1;
    }

    printf ("*** checkout branch test.\n");
    /* check out branch test. */
    if (seafile_checkout (repo->id, "test", &error) < 0) {
        fprintf (stderr, "Failed to checkout branch 'test'.\n");
        fprintf (stderr, "Checkout error messages:\n%s", error->message);
        return -1;
    }

    printf ("*** check result of checkout.\n");

    if (check_file_content (file_a, "abc123\nabc123", 13) < 0) {
        return -1;
    }

    if (g_access (file_b, F_OK) != 0) {
        fprintf (stderr, "Bug: %s should exist.\n", file_b);
        return -1;
    }

    if (g_access (file_c, F_OK) == 0) {
        fprintf (stderr, "Bug: %s should not exist.\n", file_c);
        return -1;
    }

    if (check_dir (dfc) < 0) {
        fprintf (stderr, "Bug: Directory %s should exist.\n", dfc);
        return -1;
    }

    printf ("\n=== Checkout succeeded.\n\n");
    return 0;
}
Пример #7
0
static int
test_merge_conflicts ()
{
    SeafRepo *repo;
    char *head, *remote;
    char *file_a, *file_b, *file_bb, *file_c, *file_d, *file_e, *file_f;
    FILE *fp_a, *fp_b, *fp_c, *fp_d;
    GError *error = NULL;
    char cmd[1024];
    int ret;
    char buf[64];

    printf ("\n=== test merge conflicts\n\n");

    repo = create_repo ("merge-conflicts");

    first_commit (repo);

    sleep (2);

    printf ("*** creating branch \"test\"\n");
    /* create branch "test". */
    if (seafile_branch_add (repo->id, "test", NULL, &error) < 0) {
        fprintf (stderr, "Failed to create branch: %s.\n", error->message);
        return -1;
    }

    /* create a new commit on branch "local". */

    file_a = g_build_filename (repo->worktree, "test-a", NULL);
    file_b = g_build_filename (repo->worktree, "test-b", NULL);
    file_bb = g_build_filename (repo->worktree, "test-b/b", NULL);
    file_c = g_build_filename (repo->worktree, "c/test-c", NULL);
    file_d = g_build_filename (repo->worktree, "a", NULL);
    file_e = g_build_filename (repo->worktree, "golden-gate.jpg", NULL);
    file_f = g_build_filename (repo->worktree, "a/stanford-cs.jpg", NULL);

    /* modify an existing file, to test modify/modify conflict. */
    fp_a = g_fopen (file_a, "wb");
    if (!fp_a) {
        fprintf (stderr, "Failed to open %s: %s\n", file_a, strerror(errno));
        return -1;
    }
    fprintf (fp_a, "xyzxyz\nxyzxyz");
    fclose (fp_a);

    /* delete a file and create a directory with the same name,
     * to test d/f conflict.
     */
    g_unlink (file_b);

    if (g_mkdir (file_b, 0777) < 0) {
        fprintf (stderr, "Failed to create %s: %s\n", file_b, strerror(errno));
        return -1;
    }
    fp_b = g_fopen (file_bb, "w+b");
    if (!fp_b) {
        fprintf (stderr, "Failed to open %s: %s\n", file_bb, strerror(errno));
        return -1;
    }
    fprintf (fp_b, "1234\n1234\n");
    fclose (fp_b);

    /* modify another file, to test modify/delete conflict. */
    fp_c = g_fopen (file_c, "wb");
    if (!fp_c) {
        fprintf (stderr, "Failed to open %s: %s\n", file_c, strerror(errno));
        return -1;
    }
    fprintf (fp_c, "something else.\n");
    fclose (fp_c);

    /* delete a directory and create a file with the same name,
     * to test d/f conflict.
     */
    snprintf (cmd, 1024, "rm -r %s", file_d);
    ret = system (cmd);
    if (ret < 0 || WEXITSTATUS(ret) != 0) {
        fprintf (stderr, "Failed to remove %s\n", file_d);
        return -1;
    }
    fp_d = g_fopen (file_d, "w+b");
    if (!fp_d) {
        fprintf (stderr, "Failed to open %s: %s\n", file_d, strerror(errno));
        return -1;
    }
    fprintf (fp_d, "1234\n1234\n");
    fclose (fp_d);

    sleep (2);

    if (seaf_repo_index_add (repo, "") < 0) {
        fprintf (stderr, "Failed to add on branch local\n");
        return -1;
    }

    printf ("*** creating new commit on local\n");
    head = seaf_repo_index_commit (repo, "merge test 1.", FALSE, NULL, &error);
    if (!head) {
        fprintf (stderr, "Failed to commit on branch test\n");
        return -1;
    }

    printf ("*** checking out branch test.\n");
    /* switch to branch "test". */
    if (seafile_checkout (repo->id, "test", &error) < 0) {
        fprintf (stderr, "Failed to checkout branch test\n");
        fprintf (stderr, "Checkout error messages:\n%s", error->message);
        return -1;
    }

    sleep (2);

    /* create a new commit on branch "test". */

    /* modify/modify conflict. */
    fp_a = g_fopen (file_a, "w+b");
    if (!fp_a) {
        fprintf (stderr, "Failed to open %s: %s\n", file_a, strerror(errno));
        return -1;
    }
    fprintf (fp_a, "abcabc\nabcabc");
    fclose (fp_a);

    /* df conflict occurs only when files are changed. */
    fp_b = g_fopen (file_b, "wb");
    if (!fp_b) {
        fprintf (stderr, "Failed to open %s: %s\n", file_b, strerror(errno));
        return -1;
    }
    fprintf (fp_b, "12345678");
    fclose (fp_b);    

    /* modify/delete conflict. */
    g_unlink (file_c);

    /* df conflict occurs only when files are changed. */
    snprintf (cmd, 1024, "cp %s %s", file_e, file_f);
    ret = system (cmd);
    if (ret < 0 || WEXITSTATUS(ret) != 0) {
        fprintf (stderr, "Failed to cp %s to %s\n", file_e, file_f);
        return -1;
    }

    sleep (2);

    if (seaf_repo_index_add (repo, "") < 0) {
        fprintf (stderr, "Failed to add on branch test\n");
        return -1;
    }

    printf ("*** creating new commit on branch test.\n");
    remote = seaf_repo_index_commit (repo, "merge test 2.", FALSE, NULL, &error);
    if (!remote) {
        fprintf (stderr, "Failed to commit on branch test\n");
        return -1;
    }

    printf ("*** checking out branch local.\n");
    /* switch back to branch "local". */
    if (seafile_checkout (repo->id, "local", &error) < 0) {
        fprintf (stderr, "Failed to checkout branch local\n");
        fprintf (stderr, "Checkout error messages:\n%s", error->message);
        return -1;
    }

    sleep (2);

    printf ("*** merging test to local.\n");
    /* merge branch "test". */
    if (seafile_merge (repo->id, "test", &error) == 0) {
        fprintf (stderr, "This merge is supposed to fail!!\n");
        return -1;
    }
    fprintf (stderr, "Merge error messages:\n%s", error->message);

    printf ("*** check merge conflict results.\n");

    if (g_access (file_f, F_OK) != 0) {
        fprintf (stderr, "Bug: %s should exist.\n", file_a);
        return -1;
    }

    if (g_access (file_c, F_OK) != 0) {
        fprintf (stderr, "Bug: %s should exist.\n", file_c);
        return -1;
    }
	time_t t = time(NULL);
	strftime(buf, 64, "--plt_%Y-%m-%d", localtime(&t));

    char *file_a_local = g_strconcat (file_a, buf, NULL);
    char *file_a_test = g_strconcat (file_a, "", NULL);
    if (check_file_content (file_a_local, "xyzxyz\nxyzxyz", 13) < 0)
        return -1;
    if (check_file_content (file_a_test, "abcabc\nabcabc", 13) < 0)
        return -1;

    char *file_d_local = g_strconcat (file_d, buf, NULL);
    if (check_file_content (file_d_local, "1234\n1234\n", 10) < 0)
        return -1;
    if (check_dir (file_d) < 0) {
        return -1;
    }

    char *dir_b_test = g_strconcat (file_b, buf, NULL);
    if (check_file_content (file_b, "12345678", 8) < 0)
        return -1;
    if (check_dir (dir_b_test) < 0) {
        return -1;
    }

    printf ("\n=== Successfully handle merge conflict.\n\n");
    return 0;
}
Пример #8
0
static int
test_successful_merge ()
{
    SeafRepo *repo;
    char *head, *remote;
    char *file_a, *file_b, *file_c, *file_d;
    FILE *fp_a, *fp_c, *fp_d;
    GError *error = NULL;

    printf ("\n=== test successful merge\n\n");

    repo = create_repo ("successful-merge");

    first_commit (repo);

    sleep (2);

    printf ("*** creating branch \"test\"\n");
    /* create branch "test". */
    if (seafile_branch_add (repo->id, "test", NULL, &error) < 0) {
        fprintf (stderr, "Failed to create branch: %s.\n", error->message);
        return -1;
    }

    /* create a new commit on branch "local". */

    file_a = g_build_filename (repo->worktree, "test-a", NULL);
    file_b = g_build_filename (repo->worktree, "golden-gate.jpg", NULL);
    file_c = g_build_filename (repo->worktree, "new", NULL);
    file_d = g_build_filename (repo->worktree, "c/test-c", NULL);

    /* modify an existing file. */
    fp_a = g_fopen (file_a, "wb");
    if (!fp_a) {
        fprintf (stderr, "Failed to open %s: %s\n", file_a, strerror(errno));
        return -1;
    }
    fprintf (fp_a, "xyzxyz\nxyzxyz");
    fclose (fp_a);

    /* delete a file. */
    (void) g_unlink (file_b);

    /* modify another file. */
    fp_d = g_fopen (file_d, "wb");
    if (!fp_d) {
        fprintf (stderr, "Failed to open %s: %s\n", file_d, strerror(errno));
        return -1;
    }
    fprintf (fp_d, "the same\n");
    fclose (fp_d);

    sleep (2);

    if (seaf_repo_index_add (repo, "") < 0) {
        fprintf (stderr, "Failed to add on branch local\n");
        return -1;
    }

    printf ("*** creating new commit on local\n");
    head = seaf_repo_index_commit (repo, "merge test 1.", FALSE, NULL, &error);
    if (!head) {
        fprintf (stderr, "Failed to commit on branch test\n");
        return -1;
    }

    printf ("*** checking out branchn test.\n");
    /* switch to branch "test". */
    if (seafile_checkout (repo->id, "test", &error) < 0) {
        fprintf (stderr, "Failed to checkout branch test\n");
        fprintf (stderr, "Checkout error messages:\n%s", error->message);
        return -1;
    }

    sleep (2);

    /* create a new commit on branch "test". */

    /* add a new file. */
    fp_c = g_fopen (file_c, "w+b");
    if (!fp_c) {
        fprintf (stderr, "Failed to open %s: %s\n", file_c, strerror(errno));
        return -1;
    }
    fprintf (fp_c, "abcabc\nabcabc");
    fclose (fp_c);

    /* modify another file.
     * The content is the same as "local".
     */
    fp_d = g_fopen (file_d, "wb");
    if (!fp_d) {
        fprintf (stderr, "Failed to open %s: %s\n", file_d, strerror(errno));
        return -1;
    }
    fprintf (fp_d, "the same\n");
    fclose (fp_d);

    sleep (2);

    if (seaf_repo_index_add (repo, "") < 0) {
        fprintf (stderr, "Failed to add on branch test\n");
        return -1;
    }

    printf ("*** creating new commit on branch test.\n");
    remote = seaf_repo_index_commit (repo, "merge test 2.", FALSE, NULL, &error);
    if (!remote) {
        fprintf (stderr, "Failed to commit on branch test\n");
        return -1;
    }

    printf ("*** checking out branch local.\n");
    /* switch back to branch "local". */
    if (seafile_checkout (repo->id, "local", &error) < 0) {
        fprintf (stderr, "Failed to checkout branch local\n");
        fprintf (stderr, "Checkout error messages:\n%s", error->message);
        return -1;
    }

    sleep (2);

    printf ("*** merging test to local.\n");
    /* merge branch "test". */
    if (seafile_merge (repo->id, "test", &error) < 0) {
        fprintf (stderr, "Failed to merge branch test\n");
        fprintf (stderr, "Merge error messages:\n%s", error->message);
        return -1;
    }

    printf ("*** check merge results.\n");

    if (check_file_content (file_a, "xyzxyz\nxyzxyz", 13) < 0) {
        return -1;
    }

    if (g_access (file_b, F_OK) == 0) {
        fprintf (stderr, "Bug in merge: %s should not exist.\n", file_b);
        return -1;
    }

    if (g_access (file_c, F_OK) != 0) {
        fprintf (stderr, "Bug in merge: %s should exist.\n", file_b);
        return -1;
    }

    if (check_file_content (file_d, "the same", 8) < 0) {
        return -1;
    }

    /* list commits */
    seafile_get_commit_list (repo->id, 0, -1, NULL);
    seafile_get_commit_list (repo->id, 0, -1, NULL);

    printf ("\n=== Merge succeeded.\n\n");
    return 0;
}