dav/sync.c

changeset 585
41368a355222
parent 584
7fb81fd429b2
child 599
508cbc4d30ea
equal deleted inserted replaced
584:7fb81fd429b2 585:41368a355222
1739 UcxList *ls_conflict = NULL; 1739 UcxList *ls_conflict = NULL;
1740 UcxList *ls_update = NULL; 1740 UcxList *ls_update = NULL;
1741 UcxList *ls_delete = NULL; 1741 UcxList *ls_delete = NULL;
1742 UcxList *ls_move = NULL; 1742 UcxList *ls_move = NULL;
1743 UcxList *ls_copy = NULL; 1743 UcxList *ls_copy = NULL;
1744 UcxList *ls_mkcol = NULL;
1744 1745
1745 // upload all changed files 1746 // upload all changed files
1746 //UcxList *resources = cmd_getoption(a, "read") ? 1747 //UcxList *resources = cmd_getoption(a, "read") ?
1747 // read_changes(dir, db) : local_scan(dir, db); 1748 // read_changes(dir, db) : local_scan(dir, db);
1748 UcxList *resources = local_scan(dir, db); 1749 UcxList *resources = local_scan(dir, db);
1793 local_res, 1794 local_res,
1794 svrres, 1795 svrres,
1795 restore_removed, 1796 restore_removed,
1796 restore_modified); 1797 restore_modified);
1797 if(is_changed) { 1798 if(is_changed) {
1798 if(local_res->isnew) { 1799 if(local_res->isdirectory) {
1800 ls_mkcol = ucx_list_append(ls_mkcol, local_res);
1801 } else if(local_res->isnew) {
1799 ls_new = ucx_list_append(ls_new, local_res); 1802 ls_new = ucx_list_append(ls_new, local_res);
1800 } else { 1803 } else {
1801 ls_modified = ucx_list_append(ls_modified, local_res); 1804 ls_modified = ucx_list_append(ls_modified, local_res);
1802 } 1805 }
1803 } else if(local_res->metadata_updated) { 1806 } else if(local_res->metadata_updated) {
1890 // BEGIN PUSH 1893 // BEGIN PUSH
1891 // 1894 //
1892 1895
1893 int ret = 0; 1896 int ret = 0;
1894 int error = 0; 1897 int error = 0;
1898
1899 // create collections
1900 for(UcxList *elm=ls_mkcol;elm && !sync_shutdown;elm=elm->next) {
1901 LocalResource *local_res = elm->data;
1902
1903 DavResource *res = dav_resource_new(sn, local_res->path);
1904 if(!res) {
1905 print_resource_error(sn, local_res->path);
1906 ret = -1;
1907 sync_error++;
1908 }
1909
1910 int abort = 0;
1911
1912 dav_exists(res);
1913 if(sn->error == DAV_NOT_FOUND) {
1914 // create collection
1915 // TODO: show 405
1916 printf("mkcol: %s\n", local_res->path);
1917 if(sync_mkdir(dir, res, local_res) && sn->error != DAV_METHOD_NOT_ALLOWED) {
1918 print_resource_error(sn, res->path);
1919 ret = -1;
1920 sync_error++;
1921 error = 1;
1922 abort = 1;
1923 }
1924 } else if(sn->error != DAV_OK) {
1925 // dav_exists() failed
1926 print_resource_error(sn, local_res->path);
1927 ret = -1;
1928 sync_error++;
1929 error = 1;
1930 abort = 1;
1931 }
1932
1933 if(local_res->metadata_updated && !abort) {
1934 sync_update_metadata(dir, sn, res, local_res);
1935 }
1936
1937 dav_resource_free(res);
1938
1939 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path);
1940 ucx_map_cstr_put(db->resources, local_res->path, local_res);
1941 }
1895 1942
1896 // copy/move files 1943 // copy/move files
1897 DavBool copy = TRUE; 1944 DavBool copy = TRUE;
1898 if(!ls_copy) { 1945 if(!ls_copy) {
1899 copy = FALSE; 1946 copy = FALSE;
1964 print_resource_error(sn, local_res->path); 2011 print_resource_error(sn, local_res->path);
1965 ret = -1; 2012 ret = -1;
1966 sync_error++; 2013 sync_error++;
1967 } 2014 }
1968 2015
1969 if(local_res->isdirectory) { 2016 int changed = remote_resource_is_changed(sn, dir, db, res, local_res);
1970 dav_exists(res); 2017 if(cdt && changed) {
1971 if(sn->error == DAV_NOT_FOUND) { 2018 printf("conflict: %s\n", local_res->path);
1972 int abort = 0; 2019 local_res->last_modified = 0;
1973 // make sure to store tags for newly created cols 2020 nullfree(local_res->etag);
1974 local_res->tags_updated = 1; 2021 local_res->etag = NULL;
1975 // create collection 2022 nullfree(local_res->hash);
1976 // TODO: show 405 2023 local_res->hash = NULL;
1977 printf("mkcol: %s\n", local_res->path); 2024 local_res->skipped = TRUE;
1978 if(sync_mkdir(dir, res, local_res) && sn->error != DAV_METHOD_NOT_ALLOWED) { 2025 sync_conflict++;
1979 print_resource_error(sn, res->path); 2026 } else {
1980 ret = -1; 2027 if(local_res->link_target) {
1981 sync_error++; 2028 printf(
1982 error = 1; 2029 "link: %s -> %s\n",
1983 abort = 1; 2030 local_res->path,
1984 } 2031 local_res->link_target);
1985 2032 } else {
1986 if(local_res->metadata_updated && !abort) { 2033 printf("put: %s\n", local_res->path);
1987 sync_update_metadata(dir, sn, res, local_res); 2034 }
1988 } 2035 if(sync_put_resource(dir, res, local_res, &sync_success)) {
1989 } else if(sn->error != DAV_OK) { 2036 sync_error++;
1990 // dav_exists() failed 2037 print_resource_error(sn, res->path);
1991 print_resource_error(sn, local_res->path);
1992 ret = -1; 2038 ret = -1;
1993 sync_error++;
1994 error = 1; 2039 error = 1;
1995 } 2040 }
1996 } else { 2041 }
1997 int changed = remote_resource_is_changed(sn, dir, db, res, local_res); 2042
1998 if(cdt && changed) {
1999 printf("conflict: %s\n", local_res->path);
2000 local_res->last_modified = 0;
2001 nullfree(local_res->etag);
2002 local_res->etag = NULL;
2003 nullfree(local_res->hash);
2004 local_res->hash = NULL;
2005 local_res->skipped = TRUE;
2006 sync_conflict++;
2007 } else {
2008 if(local_res->link_target) {
2009 printf(
2010 "link: %s -> %s\n",
2011 local_res->path,
2012 local_res->link_target);
2013 } else {
2014 printf("put: %s\n", local_res->path);
2015 }
2016 if(sync_put_resource(dir, res, local_res, &sync_success)) {
2017 sync_error++;
2018 print_resource_error(sn, res->path);
2019 ret = -1;
2020 error = 1;
2021 }
2022 }
2023 }
2024 dav_resource_free(res); 2043 dav_resource_free(res);
2025 2044
2026 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path); 2045 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path);
2027 ucx_map_cstr_put(db->resources, local_res->path, local_res); 2046 ucx_map_cstr_put(db->resources, local_res->path, local_res);
2028 //if(dbres) local_resource_free(dbres); 2047 //if(dbres) local_resource_free(dbres);
2032 for(UcxList *elm=ls_update;elm && !sync_shutdown;elm=elm->next) { 2051 for(UcxList *elm=ls_update;elm && !sync_shutdown;elm=elm->next) {
2033 LocalResource *local_res = elm->data; 2052 LocalResource *local_res = elm->data;
2034 2053
2035 DavResource *res = dav_resource_new(sn, local_res->path); 2054 DavResource *res = dav_resource_new(sn, local_res->path);
2036 if(local_res->metadata_updated) { 2055 if(local_res->metadata_updated) {
2056 printf("update: %s\n", local_res->path);
2037 if(!sync_update_metadata(dir, sn, res, local_res)) { 2057 if(!sync_update_metadata(dir, sn, res, local_res)) {
2038 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path); 2058 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path);
2039 ucx_map_cstr_put(db->resources, local_res->path, local_res); 2059 ucx_map_cstr_put(db->resources, local_res->path, local_res);
2040 } 2060 }
2041 } 2061 }
3942 LocalResource *local) 3962 LocalResource *local)
3943 { 3963 {
3944 MetadataHashes hashes = sync_set_metadata_properties(dir, sn, res, local); 3964 MetadataHashes hashes = sync_set_metadata_properties(dir, sn, res, local);
3945 3965
3946 int err = 0; 3966 int err = 0;
3947 printf("update: %s\n", local->path);
3948 if(dav_store(res)) { 3967 if(dav_store(res)) {
3949 print_resource_error(sn, local->path); 3968 print_resource_error(sn, local->path);
3950 err = 1; 3969 err = 1;
3951 } else { 3970 } else {
3952 update_metadata_hashes(local, hashes); 3971 update_metadata_hashes(local, hashes);

mercurial