Fossil SCM

More tinkering with the /json/dir?name=xxx handling, so that CLI/HTML modes behave consistently vis-a-vis each other.

stephan 2012-03-16 19:17 trunk
Commit b80432694047006a4dda0b705407832efcfeb765
1 file changed +31 -32
+31 -32
--- src/json_dir.c
+++ src/json_dir.c
@@ -48,18 +48,17 @@
4848
** from browse.c::page_dir()
4949
*/
5050
static cson_value * json_page_dir_list(){
5151
cson_object * zPayload = NULL;
5252
cson_array * zEntries = NULL;
53
- cson_array * zFiles = NULL;
54
- cson_array * zDirs = NULL;
5553
cson_object * zEntry = NULL;
5654
cson_string * zKeyName = NULL;
5755
cson_string * zKeyIsDir = NULL;
5856
cson_string * zKeyUuid = NULL;
5957
char * zD = NULL;
6058
char const * zDX = NULL;
59
+ cson_value const * zDV = NULL;
6160
int nD;
6261
char * zUuid = NULL;
6362
char const * zCI = NULL;
6463
Manifest * pM = NULL;
6564
Stmt q = empty_Stmt;
@@ -84,16 +83,34 @@
8483
"Checkin name [%s] is unresolved.",
8584
zCI);
8685
return NULL;
8786
}
8887
}
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 = "/";
93109
}
94
- zD = (zDX && *zDX) ? fossil_strdup(zDX) : NULL;
110
+#endif
111
+ zD = zDX ? fossil_strdup(zDX) : NULL;
95112
nD = zD ? strlen(zD)+1 : 0;
96113
while( nD>1 && zD[nD-2]=='/' ){ zD[(--nD)-1] = 0; }
97114
98115
sqlite3_create_function(g.db, "pathelement", 2, SQLITE_UTF8, 0,
99116
pathelementFunc, 0, 0);
@@ -121,14 +138,15 @@
121138
"INSERT OR IGNORE INTO localfiles VALUES(pathelement(:x,0), :u)"
122139
);
123140
manifest_file_rewind(pM);
124141
while( (pFile = manifest_file_next(pM,0))!=0 ){
125142
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)))
127144
){
128145
continue;
129146
}
147
+ /*printf("zD=%s, nD=%d, pFile->zName=%s\n", zD, nD, pFile->zName);*/
130148
if( pPrev
131149
&& memcmp(&pFile->zName[nD],&pPrev->zName[nD],nPrev)==0
132150
&& (pFile->zName[nD+nPrev]==0 || pFile->zName[nD+nPrev]=='/')
133151
){
134152
continue;
@@ -140,11 +158,11 @@
140158
pPrev = pFile;
141159
for(nPrev=0; (c=pPrev->zName[nD+nPrev]) && c!='/'; nPrev++){}
142160
if( c=='/' ) nPrev++;
143161
}
144162
db_finalize(&ins);
145
- }else if( zD ){
163
+ }else if( zD && *zD ){
146164
if( filenames_are_case_sensitive() ){
147165
db_multi_exec(
148166
"INSERT OR IGNORE INTO localfiles"
149167
" SELECT pathelement(name,%d), NULL FROM filename"
150168
" WHERE name GLOB '%q/*'",
@@ -177,41 +195,23 @@
177195
cson_value_add_reference( cson_string_value(zKeyUuid) );
178196
zKeyIsDir = cson_new_string("isDir",5);
179197
cson_value_add_reference( cson_string_value(zKeyIsDir) );
180198
181199
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 : "/") );
183201
if(zUuid){
184202
cson_object_set_s( zPayload, zKeyUuid, cson_string_value(cson_new_string(zUuid, strlen(zUuid))) );
185203
}
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
+ }
187207
188208
while( (SQLITE_ROW==db_step(&q)) ){
189209
cson_value * name = NULL;
190210
char const * n = db_column_text(&q,0);
191211
char const * u = zCI ? db_column_text(&q,1) : NULL;
192212
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
213213
if(!zEntries){
214214
zEntries = cson_new_array();
215215
cson_object_set( zPayload, "entries", cson_array_value(zEntries) );
216216
}
217217
if('/'==*n){
@@ -224,11 +224,10 @@
224224
if(u && *u){
225225
cson_object_set_s(zEntry, zKeyUuid, json_new_string( u ) );
226226
}
227227
cson_object_set_s(zEntry, zKeyName, name );
228228
cson_array_append(zEntries, cson_object_value(zEntry) );
229
-#endif
230229
}
231230
db_finalize(&q);
232231
if(pM){
233232
manifest_destroy(pM);
234233
}
235234
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button