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); |
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); |