Fossil SCM
More tinkering with the /json/dir?name=xxx handling, so that CLI/HTML modes behave consistently vis-a-vis each other.
Commit
b80432694047006a4dda0b705407832efcfeb765
Parent
116a098610a8e07…
1 file changed
+31
-32
+31
-32
| --- src/json_dir.c | ||
| +++ src/json_dir.c | ||
| @@ -48,18 +48,17 @@ | ||
| 48 | 48 | ** from browse.c::page_dir() |
| 49 | 49 | */ |
| 50 | 50 | static cson_value * json_page_dir_list(){ |
| 51 | 51 | cson_object * zPayload = NULL; |
| 52 | 52 | cson_array * zEntries = NULL; |
| 53 | - cson_array * zFiles = NULL; | |
| 54 | - cson_array * zDirs = NULL; | |
| 55 | 53 | cson_object * zEntry = NULL; |
| 56 | 54 | cson_string * zKeyName = NULL; |
| 57 | 55 | cson_string * zKeyIsDir = NULL; |
| 58 | 56 | cson_string * zKeyUuid = NULL; |
| 59 | 57 | char * zD = NULL; |
| 60 | 58 | char const * zDX = NULL; |
| 59 | + cson_value const * zDV = NULL; | |
| 61 | 60 | int nD; |
| 62 | 61 | char * zUuid = NULL; |
| 63 | 62 | char const * zCI = NULL; |
| 64 | 63 | Manifest * pM = NULL; |
| 65 | 64 | Stmt q = empty_Stmt; |
| @@ -84,16 +83,34 @@ | ||
| 84 | 83 | "Checkin name [%s] is unresolved.", |
| 85 | 84 | zCI); |
| 86 | 85 | return NULL; |
| 87 | 86 | } |
| 88 | 87 | } |
| 89 | - | |
| 90 | - zDX = json_find_option_cstr("name",NULL,"n"); | |
| 91 | - if((!zDX || !*zDX) && !g.isHTTP){ | |
| 92 | - zDX = json_command_arg(g.json.dispatchDepth+1); | |
| 88 | + zDV = json_req_payload_get("name"); | |
| 89 | + if(!zDV){ | |
| 90 | + zDV = cson_object_get( g.json.param.o, "name" ); | |
| 91 | + if(!zDV && !g.isHTTP){ | |
| 92 | + zDX = json_command_arg(g.json.dispatchDepth+1); | |
| 93 | + } | |
| 94 | + } | |
| 95 | + if(!zDX){ | |
| 96 | + zDX = zDV ? cson_value_get_cstr(zDV) : NULL; | |
| 97 | + } | |
| 98 | + if(!zDX && !g.isHTTP){ | |
| 99 | + zDX = json_find_option_cstr("name",NULL,"n"); | |
| 100 | + } | |
| 101 | +#if 1 | |
| 102 | + if(zDX && (!*zDX || (0==strcmp(zDX,"/")))){ | |
| 103 | + zDX = NULL; | |
| 104 | + } | |
| 105 | +#endif | |
| 106 | +#if 0 | |
| 107 | + if(!zDX || !*zDX){ | |
| 108 | + zDX = "/"; | |
| 93 | 109 | } |
| 94 | - zD = (zDX && *zDX) ? fossil_strdup(zDX) : NULL; | |
| 110 | +#endif | |
| 111 | + zD = zDX ? fossil_strdup(zDX) : NULL; | |
| 95 | 112 | nD = zD ? strlen(zD)+1 : 0; |
| 96 | 113 | while( nD>1 && zD[nD-2]=='/' ){ zD[(--nD)-1] = 0; } |
| 97 | 114 | |
| 98 | 115 | sqlite3_create_function(g.db, "pathelement", 2, SQLITE_UTF8, 0, |
| 99 | 116 | pathelementFunc, 0, 0); |
| @@ -121,14 +138,15 @@ | ||
| 121 | 138 | "INSERT OR IGNORE INTO localfiles VALUES(pathelement(:x,0), :u)" |
| 122 | 139 | ); |
| 123 | 140 | manifest_file_rewind(pM); |
| 124 | 141 | while( (pFile = manifest_file_next(pM,0))!=0 ){ |
| 125 | 142 | if( nD>0 |
| 126 | - && (memcmp(pFile->zName, zD, nD-1)!=0 || pFile->zName[nD-1]!='/') | |
| 143 | + && ((pFile->zName[nD-1]!='/') || (0!=memcmp(pFile->zName, zD, nD-1))) | |
| 127 | 144 | ){ |
| 128 | 145 | continue; |
| 129 | 146 | } |
| 147 | + /*printf("zD=%s, nD=%d, pFile->zName=%s\n", zD, nD, pFile->zName);*/ | |
| 130 | 148 | if( pPrev |
| 131 | 149 | && memcmp(&pFile->zName[nD],&pPrev->zName[nD],nPrev)==0 |
| 132 | 150 | && (pFile->zName[nD+nPrev]==0 || pFile->zName[nD+nPrev]=='/') |
| 133 | 151 | ){ |
| 134 | 152 | continue; |
| @@ -140,11 +158,11 @@ | ||
| 140 | 158 | pPrev = pFile; |
| 141 | 159 | for(nPrev=0; (c=pPrev->zName[nD+nPrev]) && c!='/'; nPrev++){} |
| 142 | 160 | if( c=='/' ) nPrev++; |
| 143 | 161 | } |
| 144 | 162 | db_finalize(&ins); |
| 145 | - }else if( zD ){ | |
| 163 | + }else if( zD && *zD ){ | |
| 146 | 164 | if( filenames_are_case_sensitive() ){ |
| 147 | 165 | db_multi_exec( |
| 148 | 166 | "INSERT OR IGNORE INTO localfiles" |
| 149 | 167 | " SELECT pathelement(name,%d), NULL FROM filename" |
| 150 | 168 | " WHERE name GLOB '%q/*'", |
| @@ -177,41 +195,23 @@ | ||
| 177 | 195 | cson_value_add_reference( cson_string_value(zKeyUuid) ); |
| 178 | 196 | zKeyIsDir = cson_new_string("isDir",5); |
| 179 | 197 | cson_value_add_reference( cson_string_value(zKeyIsDir) ); |
| 180 | 198 | |
| 181 | 199 | zPayload = cson_new_object(); |
| 182 | - cson_object_set_s( zPayload, zKeyName, json_new_string(zD ? zD : "/") ); | |
| 200 | + cson_object_set_s( zPayload, zKeyName, json_new_string((zD&&*zD) ? zD : "/") ); | |
| 183 | 201 | if(zUuid){ |
| 184 | 202 | cson_object_set_s( zPayload, zKeyUuid, cson_string_value(cson_new_string(zUuid, strlen(zUuid))) ); |
| 185 | 203 | } |
| 186 | - if( zCI ) cson_object_set( zPayload, "checkin", json_new_string(zCI) ); | |
| 204 | + if( zCI ){ | |
| 205 | + cson_object_set( zPayload, "checkin", json_new_string(zCI) ); | |
| 206 | + } | |
| 187 | 207 | |
| 188 | 208 | while( (SQLITE_ROW==db_step(&q)) ){ |
| 189 | 209 | cson_value * name = NULL; |
| 190 | 210 | char const * n = db_column_text(&q,0); |
| 191 | 211 | char const * u = zCI ? db_column_text(&q,1) : NULL; |
| 192 | 212 | zEntry = cson_new_object(); |
| 193 | -#if 0 | |
| 194 | - if('/'==*n){ | |
| 195 | - if(!zDirs){ | |
| 196 | - zDirs = cson_new_array(); | |
| 197 | - cson_object_set( zPayload, "dirs", cson_array_value(zDirs) ); | |
| 198 | - } | |
| 199 | - cson_array_append(zDirs, cson_object_value(zEntry) ); | |
| 200 | - cson_object_set_s(zEntry, zKeyName, json_new_string( n+1 ) ); | |
| 201 | - }else{ | |
| 202 | - if(!zFiles){ | |
| 203 | - zFiles = cson_new_array(); | |
| 204 | - cson_object_set( zPayload, "files", cson_array_value(zFiles) ); | |
| 205 | - } | |
| 206 | - cson_array_append(zFiles, cson_object_value(zEntry) ); | |
| 207 | - cson_object_set_s(zEntry, zKeyName, json_new_string( n ) ); | |
| 208 | - } | |
| 209 | - if(u && *u){ | |
| 210 | - cson_object_set_s(zEntry, zKeyUuid, json_new_string( u ) ); | |
| 211 | - } | |
| 212 | -#else | |
| 213 | 213 | if(!zEntries){ |
| 214 | 214 | zEntries = cson_new_array(); |
| 215 | 215 | cson_object_set( zPayload, "entries", cson_array_value(zEntries) ); |
| 216 | 216 | } |
| 217 | 217 | if('/'==*n){ |
| @@ -224,11 +224,10 @@ | ||
| 224 | 224 | if(u && *u){ |
| 225 | 225 | cson_object_set_s(zEntry, zKeyUuid, json_new_string( u ) ); |
| 226 | 226 | } |
| 227 | 227 | cson_object_set_s(zEntry, zKeyName, name ); |
| 228 | 228 | cson_array_append(zEntries, cson_object_value(zEntry) ); |
| 229 | -#endif | |
| 230 | 229 | } |
| 231 | 230 | db_finalize(&q); |
| 232 | 231 | if(pM){ |
| 233 | 232 | manifest_destroy(pM); |
| 234 | 233 | } |
| 235 | 234 |
| --- src/json_dir.c | |
| +++ src/json_dir.c | |
| @@ -48,18 +48,17 @@ | |
| 48 | ** from browse.c::page_dir() |
| 49 | */ |
| 50 | static cson_value * json_page_dir_list(){ |
| 51 | cson_object * zPayload = NULL; |
| 52 | cson_array * zEntries = NULL; |
| 53 | cson_array * zFiles = NULL; |
| 54 | cson_array * zDirs = NULL; |
| 55 | cson_object * zEntry = NULL; |
| 56 | cson_string * zKeyName = NULL; |
| 57 | cson_string * zKeyIsDir = NULL; |
| 58 | cson_string * zKeyUuid = NULL; |
| 59 | char * zD = NULL; |
| 60 | char const * zDX = NULL; |
| 61 | int nD; |
| 62 | char * zUuid = NULL; |
| 63 | char const * zCI = NULL; |
| 64 | Manifest * pM = NULL; |
| 65 | Stmt q = empty_Stmt; |
| @@ -84,16 +83,34 @@ | |
| 84 | "Checkin name [%s] is unresolved.", |
| 85 | zCI); |
| 86 | return NULL; |
| 87 | } |
| 88 | } |
| 89 | |
| 90 | zDX = json_find_option_cstr("name",NULL,"n"); |
| 91 | if((!zDX || !*zDX) && !g.isHTTP){ |
| 92 | zDX = json_command_arg(g.json.dispatchDepth+1); |
| 93 | } |
| 94 | zD = (zDX && *zDX) ? fossil_strdup(zDX) : NULL; |
| 95 | nD = zD ? strlen(zD)+1 : 0; |
| 96 | while( nD>1 && zD[nD-2]=='/' ){ zD[(--nD)-1] = 0; } |
| 97 | |
| 98 | sqlite3_create_function(g.db, "pathelement", 2, SQLITE_UTF8, 0, |
| 99 | pathelementFunc, 0, 0); |
| @@ -121,14 +138,15 @@ | |
| 121 | "INSERT OR IGNORE INTO localfiles VALUES(pathelement(:x,0), :u)" |
| 122 | ); |
| 123 | manifest_file_rewind(pM); |
| 124 | while( (pFile = manifest_file_next(pM,0))!=0 ){ |
| 125 | if( nD>0 |
| 126 | && (memcmp(pFile->zName, zD, nD-1)!=0 || pFile->zName[nD-1]!='/') |
| 127 | ){ |
| 128 | continue; |
| 129 | } |
| 130 | if( pPrev |
| 131 | && memcmp(&pFile->zName[nD],&pPrev->zName[nD],nPrev)==0 |
| 132 | && (pFile->zName[nD+nPrev]==0 || pFile->zName[nD+nPrev]=='/') |
| 133 | ){ |
| 134 | continue; |
| @@ -140,11 +158,11 @@ | |
| 140 | pPrev = pFile; |
| 141 | for(nPrev=0; (c=pPrev->zName[nD+nPrev]) && c!='/'; nPrev++){} |
| 142 | if( c=='/' ) nPrev++; |
| 143 | } |
| 144 | db_finalize(&ins); |
| 145 | }else if( zD ){ |
| 146 | if( filenames_are_case_sensitive() ){ |
| 147 | db_multi_exec( |
| 148 | "INSERT OR IGNORE INTO localfiles" |
| 149 | " SELECT pathelement(name,%d), NULL FROM filename" |
| 150 | " WHERE name GLOB '%q/*'", |
| @@ -177,41 +195,23 @@ | |
| 177 | cson_value_add_reference( cson_string_value(zKeyUuid) ); |
| 178 | zKeyIsDir = cson_new_string("isDir",5); |
| 179 | cson_value_add_reference( cson_string_value(zKeyIsDir) ); |
| 180 | |
| 181 | zPayload = cson_new_object(); |
| 182 | cson_object_set_s( zPayload, zKeyName, json_new_string(zD ? zD : "/") ); |
| 183 | if(zUuid){ |
| 184 | cson_object_set_s( zPayload, zKeyUuid, cson_string_value(cson_new_string(zUuid, strlen(zUuid))) ); |
| 185 | } |
| 186 | if( zCI ) cson_object_set( zPayload, "checkin", json_new_string(zCI) ); |
| 187 | |
| 188 | while( (SQLITE_ROW==db_step(&q)) ){ |
| 189 | cson_value * name = NULL; |
| 190 | char const * n = db_column_text(&q,0); |
| 191 | char const * u = zCI ? db_column_text(&q,1) : NULL; |
| 192 | zEntry = cson_new_object(); |
| 193 | #if 0 |
| 194 | if('/'==*n){ |
| 195 | if(!zDirs){ |
| 196 | zDirs = cson_new_array(); |
| 197 | cson_object_set( zPayload, "dirs", cson_array_value(zDirs) ); |
| 198 | } |
| 199 | cson_array_append(zDirs, cson_object_value(zEntry) ); |
| 200 | cson_object_set_s(zEntry, zKeyName, json_new_string( n+1 ) ); |
| 201 | }else{ |
| 202 | if(!zFiles){ |
| 203 | zFiles = cson_new_array(); |
| 204 | cson_object_set( zPayload, "files", cson_array_value(zFiles) ); |
| 205 | } |
| 206 | cson_array_append(zFiles, cson_object_value(zEntry) ); |
| 207 | cson_object_set_s(zEntry, zKeyName, json_new_string( n ) ); |
| 208 | } |
| 209 | if(u && *u){ |
| 210 | cson_object_set_s(zEntry, zKeyUuid, json_new_string( u ) ); |
| 211 | } |
| 212 | #else |
| 213 | if(!zEntries){ |
| 214 | zEntries = cson_new_array(); |
| 215 | cson_object_set( zPayload, "entries", cson_array_value(zEntries) ); |
| 216 | } |
| 217 | if('/'==*n){ |
| @@ -224,11 +224,10 @@ | |
| 224 | if(u && *u){ |
| 225 | cson_object_set_s(zEntry, zKeyUuid, json_new_string( u ) ); |
| 226 | } |
| 227 | cson_object_set_s(zEntry, zKeyName, name ); |
| 228 | cson_array_append(zEntries, cson_object_value(zEntry) ); |
| 229 | #endif |
| 230 | } |
| 231 | db_finalize(&q); |
| 232 | if(pM){ |
| 233 | manifest_destroy(pM); |
| 234 | } |
| 235 |
| --- src/json_dir.c | |
| +++ src/json_dir.c | |
| @@ -48,18 +48,17 @@ | |
| 48 | ** from browse.c::page_dir() |
| 49 | */ |
| 50 | static cson_value * json_page_dir_list(){ |
| 51 | cson_object * zPayload = NULL; |
| 52 | cson_array * zEntries = NULL; |
| 53 | cson_object * zEntry = NULL; |
| 54 | cson_string * zKeyName = NULL; |
| 55 | cson_string * zKeyIsDir = NULL; |
| 56 | cson_string * zKeyUuid = NULL; |
| 57 | char * zD = NULL; |
| 58 | char const * zDX = NULL; |
| 59 | cson_value const * zDV = NULL; |
| 60 | int nD; |
| 61 | char * zUuid = NULL; |
| 62 | char const * zCI = NULL; |
| 63 | Manifest * pM = NULL; |
| 64 | Stmt q = empty_Stmt; |
| @@ -84,16 +83,34 @@ | |
| 83 | "Checkin name [%s] is unresolved.", |
| 84 | zCI); |
| 85 | return NULL; |
| 86 | } |
| 87 | } |
| 88 | zDV = json_req_payload_get("name"); |
| 89 | if(!zDV){ |
| 90 | zDV = cson_object_get( g.json.param.o, "name" ); |
| 91 | if(!zDV && !g.isHTTP){ |
| 92 | zDX = json_command_arg(g.json.dispatchDepth+1); |
| 93 | } |
| 94 | } |
| 95 | if(!zDX){ |
| 96 | zDX = zDV ? cson_value_get_cstr(zDV) : NULL; |
| 97 | } |
| 98 | if(!zDX && !g.isHTTP){ |
| 99 | zDX = json_find_option_cstr("name",NULL,"n"); |
| 100 | } |
| 101 | #if 1 |
| 102 | if(zDX && (!*zDX || (0==strcmp(zDX,"/")))){ |
| 103 | zDX = NULL; |
| 104 | } |
| 105 | #endif |
| 106 | #if 0 |
| 107 | if(!zDX || !*zDX){ |
| 108 | zDX = "/"; |
| 109 | } |
| 110 | #endif |
| 111 | zD = zDX ? fossil_strdup(zDX) : NULL; |
| 112 | nD = zD ? strlen(zD)+1 : 0; |
| 113 | while( nD>1 && zD[nD-2]=='/' ){ zD[(--nD)-1] = 0; } |
| 114 | |
| 115 | sqlite3_create_function(g.db, "pathelement", 2, SQLITE_UTF8, 0, |
| 116 | pathelementFunc, 0, 0); |
| @@ -121,14 +138,15 @@ | |
| 138 | "INSERT OR IGNORE INTO localfiles VALUES(pathelement(:x,0), :u)" |
| 139 | ); |
| 140 | manifest_file_rewind(pM); |
| 141 | while( (pFile = manifest_file_next(pM,0))!=0 ){ |
| 142 | if( nD>0 |
| 143 | && ((pFile->zName[nD-1]!='/') || (0!=memcmp(pFile->zName, zD, nD-1))) |
| 144 | ){ |
| 145 | continue; |
| 146 | } |
| 147 | /*printf("zD=%s, nD=%d, pFile->zName=%s\n", zD, nD, pFile->zName);*/ |
| 148 | if( pPrev |
| 149 | && memcmp(&pFile->zName[nD],&pPrev->zName[nD],nPrev)==0 |
| 150 | && (pFile->zName[nD+nPrev]==0 || pFile->zName[nD+nPrev]=='/') |
| 151 | ){ |
| 152 | continue; |
| @@ -140,11 +158,11 @@ | |
| 158 | pPrev = pFile; |
| 159 | for(nPrev=0; (c=pPrev->zName[nD+nPrev]) && c!='/'; nPrev++){} |
| 160 | if( c=='/' ) nPrev++; |
| 161 | } |
| 162 | db_finalize(&ins); |
| 163 | }else if( zD && *zD ){ |
| 164 | if( filenames_are_case_sensitive() ){ |
| 165 | db_multi_exec( |
| 166 | "INSERT OR IGNORE INTO localfiles" |
| 167 | " SELECT pathelement(name,%d), NULL FROM filename" |
| 168 | " WHERE name GLOB '%q/*'", |
| @@ -177,41 +195,23 @@ | |
| 195 | cson_value_add_reference( cson_string_value(zKeyUuid) ); |
| 196 | zKeyIsDir = cson_new_string("isDir",5); |
| 197 | cson_value_add_reference( cson_string_value(zKeyIsDir) ); |
| 198 | |
| 199 | zPayload = cson_new_object(); |
| 200 | cson_object_set_s( zPayload, zKeyName, json_new_string((zD&&*zD) ? zD : "/") ); |
| 201 | if(zUuid){ |
| 202 | cson_object_set_s( zPayload, zKeyUuid, cson_string_value(cson_new_string(zUuid, strlen(zUuid))) ); |
| 203 | } |
| 204 | if( zCI ){ |
| 205 | cson_object_set( zPayload, "checkin", json_new_string(zCI) ); |
| 206 | } |
| 207 | |
| 208 | while( (SQLITE_ROW==db_step(&q)) ){ |
| 209 | cson_value * name = NULL; |
| 210 | char const * n = db_column_text(&q,0); |
| 211 | char const * u = zCI ? db_column_text(&q,1) : NULL; |
| 212 | zEntry = cson_new_object(); |
| 213 | if(!zEntries){ |
| 214 | zEntries = cson_new_array(); |
| 215 | cson_object_set( zPayload, "entries", cson_array_value(zEntries) ); |
| 216 | } |
| 217 | if('/'==*n){ |
| @@ -224,11 +224,10 @@ | |
| 224 | if(u && *u){ |
| 225 | cson_object_set_s(zEntry, zKeyUuid, json_new_string( u ) ); |
| 226 | } |
| 227 | cson_object_set_s(zEntry, zKeyName, name ); |
| 228 | cson_array_append(zEntries, cson_object_value(zEntry) ); |
| 229 | } |
| 230 | db_finalize(&q); |
| 231 | if(pM){ |
| 232 | manifest_destroy(pM); |
| 233 | } |
| 234 |