Fossil SCM
In artifact_to_json() add a W-card with a null value instead of eliding the W-card for empty (deleted) wiki pages and forum posts. Similarly, treat an empty H-card as JSON null instead of an empty string.
Commit
87bdf7d1b82d0dec3aa8d3dfd9ecdcfc6ae3686befd1eed207b71f2ab707d0fa
Parent
98396f476942f0f…
1 file changed
+12
-8
+12
-8
| --- src/manifest.c | ||
| +++ src/manifest.c | ||
| @@ -3000,12 +3000,15 @@ | ||
| 3000 | 3000 | ** array, rather than no F-cards, to hypothetically simplify |
| 3001 | 3001 | ** handling in JSON queries. */ |
| 3002 | 3002 | blob_append_char(b, ']'); |
| 3003 | 3003 | } |
| 3004 | 3004 | CARD_STR2(G, p->zThreadRoot); |
| 3005 | - CARD_STR2(H, p->zThreadTitle); | |
| 3006 | - CARD_STR2(I, p->zInReplyTo); | |
| 3005 | + if( CFTYPE_FORUM==p->type ){ | |
| 3006 | + CARD_LETTER(H); | |
| 3007 | + STR_OR_NULL( (p->zThreadTitle && *p->zThreadTitle) ? p->zThreadTitle : NULL); | |
| 3008 | + CARD_STR2(I, p->zInReplyTo); | |
| 3009 | + } | |
| 3007 | 3010 | if( p->nField ){ |
| 3008 | 3011 | CARD_LETTER(J); |
| 3009 | 3012 | blob_append_char(b, '['); |
| 3010 | 3013 | for( i = 0; i < p->nField; ++i ){ |
| 3011 | 3014 | const char * zName = p->aField[i].zName; |
| @@ -3031,15 +3034,13 @@ | ||
| 3031 | 3034 | } |
| 3032 | 3035 | CARD_STR2(N, p->zMimetype); |
| 3033 | 3036 | ISA( CFTYPE_MANIFEST ){ |
| 3034 | 3037 | CARD_LETTER(P); |
| 3035 | 3038 | blob_append_char(b, '['); |
| 3036 | - if( p->nParent ){ | |
| 3037 | - for( i = 0; i < p->nParent; ++i ){ | |
| 3038 | - if( i>0 ) blob_append_char(b, ','); | |
| 3039 | - blob_appendf(b, "%!j", p->azParent[i]); | |
| 3040 | - } | |
| 3039 | + for( i = 0; i < p->nParent; ++i ){ | |
| 3040 | + if( i>0 ) blob_append_char(b, ','); | |
| 3041 | + blob_appendf(b, "%!j", p->azParent[i]); | |
| 3041 | 3042 | } |
| 3042 | 3043 | /* Special case: model checkins with no P-card as having an empty |
| 3043 | 3044 | ** array, as per F-cards. */ |
| 3044 | 3045 | blob_append_char(b, ']'); |
| 3045 | 3046 | } |
| @@ -3072,11 +3073,14 @@ | ||
| 3072 | 3073 | blob_append_char(b, '}'); |
| 3073 | 3074 | } |
| 3074 | 3075 | blob_append_char(b, ']'); |
| 3075 | 3076 | } |
| 3076 | 3077 | CARD_STR2(U, p->zUser); |
| 3077 | - CARD_STR2(W, p->zWiki); | |
| 3078 | + if( CFTYPE_WIKI==p->type || CFTYPE_FORUM==p->type ){ | |
| 3079 | + CARD_LETTER(W); | |
| 3080 | + STR_OR_NULL((p->zWiki && *p->zWiki) ? p->zWiki : NULL); | |
| 3081 | + } | |
| 3078 | 3082 | blob_append_literal(b, "}"); |
| 3079 | 3083 | #undef CARD_FMT |
| 3080 | 3084 | #undef CARD_LETTER |
| 3081 | 3085 | #undef CARD_STR |
| 3082 | 3086 | #undef CARD_STR2 |
| 3083 | 3087 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -3000,12 +3000,15 @@ | |
| 3000 | ** array, rather than no F-cards, to hypothetically simplify |
| 3001 | ** handling in JSON queries. */ |
| 3002 | blob_append_char(b, ']'); |
| 3003 | } |
| 3004 | CARD_STR2(G, p->zThreadRoot); |
| 3005 | CARD_STR2(H, p->zThreadTitle); |
| 3006 | CARD_STR2(I, p->zInReplyTo); |
| 3007 | if( p->nField ){ |
| 3008 | CARD_LETTER(J); |
| 3009 | blob_append_char(b, '['); |
| 3010 | for( i = 0; i < p->nField; ++i ){ |
| 3011 | const char * zName = p->aField[i].zName; |
| @@ -3031,15 +3034,13 @@ | |
| 3031 | } |
| 3032 | CARD_STR2(N, p->zMimetype); |
| 3033 | ISA( CFTYPE_MANIFEST ){ |
| 3034 | CARD_LETTER(P); |
| 3035 | blob_append_char(b, '['); |
| 3036 | if( p->nParent ){ |
| 3037 | for( i = 0; i < p->nParent; ++i ){ |
| 3038 | if( i>0 ) blob_append_char(b, ','); |
| 3039 | blob_appendf(b, "%!j", p->azParent[i]); |
| 3040 | } |
| 3041 | } |
| 3042 | /* Special case: model checkins with no P-card as having an empty |
| 3043 | ** array, as per F-cards. */ |
| 3044 | blob_append_char(b, ']'); |
| 3045 | } |
| @@ -3072,11 +3073,14 @@ | |
| 3072 | blob_append_char(b, '}'); |
| 3073 | } |
| 3074 | blob_append_char(b, ']'); |
| 3075 | } |
| 3076 | CARD_STR2(U, p->zUser); |
| 3077 | CARD_STR2(W, p->zWiki); |
| 3078 | blob_append_literal(b, "}"); |
| 3079 | #undef CARD_FMT |
| 3080 | #undef CARD_LETTER |
| 3081 | #undef CARD_STR |
| 3082 | #undef CARD_STR2 |
| 3083 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -3000,12 +3000,15 @@ | |
| 3000 | ** array, rather than no F-cards, to hypothetically simplify |
| 3001 | ** handling in JSON queries. */ |
| 3002 | blob_append_char(b, ']'); |
| 3003 | } |
| 3004 | CARD_STR2(G, p->zThreadRoot); |
| 3005 | if( CFTYPE_FORUM==p->type ){ |
| 3006 | CARD_LETTER(H); |
| 3007 | STR_OR_NULL( (p->zThreadTitle && *p->zThreadTitle) ? p->zThreadTitle : NULL); |
| 3008 | CARD_STR2(I, p->zInReplyTo); |
| 3009 | } |
| 3010 | if( p->nField ){ |
| 3011 | CARD_LETTER(J); |
| 3012 | blob_append_char(b, '['); |
| 3013 | for( i = 0; i < p->nField; ++i ){ |
| 3014 | const char * zName = p->aField[i].zName; |
| @@ -3031,15 +3034,13 @@ | |
| 3034 | } |
| 3035 | CARD_STR2(N, p->zMimetype); |
| 3036 | ISA( CFTYPE_MANIFEST ){ |
| 3037 | CARD_LETTER(P); |
| 3038 | blob_append_char(b, '['); |
| 3039 | for( i = 0; i < p->nParent; ++i ){ |
| 3040 | if( i>0 ) blob_append_char(b, ','); |
| 3041 | blob_appendf(b, "%!j", p->azParent[i]); |
| 3042 | } |
| 3043 | /* Special case: model checkins with no P-card as having an empty |
| 3044 | ** array, as per F-cards. */ |
| 3045 | blob_append_char(b, ']'); |
| 3046 | } |
| @@ -3072,11 +3073,14 @@ | |
| 3073 | blob_append_char(b, '}'); |
| 3074 | } |
| 3075 | blob_append_char(b, ']'); |
| 3076 | } |
| 3077 | CARD_STR2(U, p->zUser); |
| 3078 | if( CFTYPE_WIKI==p->type || CFTYPE_FORUM==p->type ){ |
| 3079 | CARD_LETTER(W); |
| 3080 | STR_OR_NULL((p->zWiki && *p->zWiki) ? p->zWiki : NULL); |
| 3081 | } |
| 3082 | blob_append_literal(b, "}"); |
| 3083 | #undef CARD_FMT |
| 3084 | #undef CARD_LETTER |
| 3085 | #undef CARD_STR |
| 3086 | #undef CARD_STR2 |
| 3087 |