Fossil SCM
Add -p short-form flag of --pretty to test-artifact-to-json. Restore the part of [8af0d05c66e6] which removes extraneous whitespace from artifact_to_json().
Commit
3e0d7b0613789a70daa6995cd0dfa861c7aaee933221b67a9d6df2c2b290e7aa
Parent
d2db37a75296f5b…
2 files changed
+25
-5
+10
-10
+25
-5
| --- src/content.c | ||
| +++ src/content.c | ||
| @@ -325,25 +325,45 @@ | ||
| 325 | 325 | ** standard output, or if the optional second argument is given, in |
| 326 | 326 | ** the named output file. |
| 327 | 327 | ** |
| 328 | 328 | ** Options: |
| 329 | 329 | ** -R|--repository REPO Extract artifacts from repository REPO |
| 330 | +** -j|--json Emit the result as JSON | |
| 331 | +** -p|--pretty Pretty-print JSON | |
| 330 | 332 | ** |
| 331 | 333 | ** See also: [[finfo]] |
| 332 | 334 | */ |
| 333 | 335 | void artifact_cmd(void){ |
| 334 | 336 | int rid; |
| 335 | - Blob content; | |
| 337 | + Blob content = empty_blob; | |
| 336 | 338 | const char *zFile; |
| 339 | + const int bJson = find_option("json", "j", 0)!=0; | |
| 340 | + const int bPretty = find_option("pretty", "p", 0)!=0; | |
| 341 | + | |
| 342 | + verify_all_options(); | |
| 337 | 343 | db_find_and_open_repository(OPEN_ANY_SCHEMA, 0); |
| 338 | - if( g.argc!=4 && g.argc!=3 ) usage("ARTIFACT-ID ?FILENAME? ?OPTIONS?"); | |
| 344 | + if( g.argc!=4 && g.argc!=3 ){ | |
| 345 | + usage("?-json? ARTIFACT-ID ?FILENAME? ?OPTIONS?"); | |
| 346 | + } | |
| 339 | 347 | zFile = g.argc==4 ? g.argv[3] : "-"; |
| 340 | 348 | rid = name_to_rid(g.argv[2]); |
| 341 | - if( rid==0 ){ | |
| 342 | - fossil_fatal("%s",g.zErrMsg); | |
| 349 | + assert( rid>0 && "name_to_rid() fails fatally on resolution error" ); | |
| 350 | + if( bJson || bPretty ){ | |
| 351 | + artifact_to_json_by_rid(rid, &content); | |
| 352 | + if( bPretty ){ | |
| 353 | + Stmt q; | |
| 354 | + db_prepare(&q, "select json_pretty(:json)"); | |
| 355 | + db_bind_blob(&q, ":json", &content); | |
| 356 | + db_step(&q); | |
| 357 | + content.nUsed = 0; | |
| 358 | + db_column_blob(&q, 0, &content); | |
| 359 | + db_finalize(&q); | |
| 360 | + } | |
| 361 | + blob_append_char(&content, '\n'); | |
| 362 | + }else{ | |
| 363 | + content_get(rid, &content); | |
| 343 | 364 | } |
| 344 | - content_get(rid, &content); | |
| 345 | 365 | blob_write_to_file(&content, zFile); |
| 346 | 366 | } |
| 347 | 367 | |
| 348 | 368 | /* |
| 349 | 369 | ** COMMAND: test-content-rawget |
| 350 | 370 |
| --- src/content.c | |
| +++ src/content.c | |
| @@ -325,25 +325,45 @@ | |
| 325 | ** standard output, or if the optional second argument is given, in |
| 326 | ** the named output file. |
| 327 | ** |
| 328 | ** Options: |
| 329 | ** -R|--repository REPO Extract artifacts from repository REPO |
| 330 | ** |
| 331 | ** See also: [[finfo]] |
| 332 | */ |
| 333 | void artifact_cmd(void){ |
| 334 | int rid; |
| 335 | Blob content; |
| 336 | const char *zFile; |
| 337 | db_find_and_open_repository(OPEN_ANY_SCHEMA, 0); |
| 338 | if( g.argc!=4 && g.argc!=3 ) usage("ARTIFACT-ID ?FILENAME? ?OPTIONS?"); |
| 339 | zFile = g.argc==4 ? g.argv[3] : "-"; |
| 340 | rid = name_to_rid(g.argv[2]); |
| 341 | if( rid==0 ){ |
| 342 | fossil_fatal("%s",g.zErrMsg); |
| 343 | } |
| 344 | content_get(rid, &content); |
| 345 | blob_write_to_file(&content, zFile); |
| 346 | } |
| 347 | |
| 348 | /* |
| 349 | ** COMMAND: test-content-rawget |
| 350 |
| --- src/content.c | |
| +++ src/content.c | |
| @@ -325,25 +325,45 @@ | |
| 325 | ** standard output, or if the optional second argument is given, in |
| 326 | ** the named output file. |
| 327 | ** |
| 328 | ** Options: |
| 329 | ** -R|--repository REPO Extract artifacts from repository REPO |
| 330 | ** -j|--json Emit the result as JSON |
| 331 | ** -p|--pretty Pretty-print JSON |
| 332 | ** |
| 333 | ** See also: [[finfo]] |
| 334 | */ |
| 335 | void artifact_cmd(void){ |
| 336 | int rid; |
| 337 | Blob content = empty_blob; |
| 338 | const char *zFile; |
| 339 | const int bJson = find_option("json", "j", 0)!=0; |
| 340 | const int bPretty = find_option("pretty", "p", 0)!=0; |
| 341 | |
| 342 | verify_all_options(); |
| 343 | db_find_and_open_repository(OPEN_ANY_SCHEMA, 0); |
| 344 | if( g.argc!=4 && g.argc!=3 ){ |
| 345 | usage("?-json? ARTIFACT-ID ?FILENAME? ?OPTIONS?"); |
| 346 | } |
| 347 | zFile = g.argc==4 ? g.argv[3] : "-"; |
| 348 | rid = name_to_rid(g.argv[2]); |
| 349 | assert( rid>0 && "name_to_rid() fails fatally on resolution error" ); |
| 350 | if( bJson || bPretty ){ |
| 351 | artifact_to_json_by_rid(rid, &content); |
| 352 | if( bPretty ){ |
| 353 | Stmt q; |
| 354 | db_prepare(&q, "select json_pretty(:json)"); |
| 355 | db_bind_blob(&q, ":json", &content); |
| 356 | db_step(&q); |
| 357 | content.nUsed = 0; |
| 358 | db_column_blob(&q, 0, &content); |
| 359 | db_finalize(&q); |
| 360 | } |
| 361 | blob_append_char(&content, '\n'); |
| 362 | }else{ |
| 363 | content_get(rid, &content); |
| 364 | } |
| 365 | blob_write_to_file(&content, zFile); |
| 366 | } |
| 367 | |
| 368 | /* |
| 369 | ** COMMAND: test-content-rawget |
| 370 |
+10
-10
| --- src/manifest.c | ||
| +++ src/manifest.c | ||
| @@ -2948,26 +2948,26 @@ | ||
| 2948 | 2948 | */ |
| 2949 | 2949 | void artifact_to_json(Manifest const *p, Blob *b){ |
| 2950 | 2950 | int i; |
| 2951 | 2951 | |
| 2952 | 2952 | blob_append_literal(b, "{"); |
| 2953 | - blob_appendf(b, "\"uuid\": \"%z\"", rid_to_uuid(p->rid)); | |
| 2953 | + blob_appendf(b, "\"uuid\":\"%z\"", rid_to_uuid(p->rid)); | |
| 2954 | 2954 | /*blob_appendf(b, ", \"rid\": %d", p->rid); not portable across repos*/ |
| 2955 | - blob_appendf(b, ", \"type\": %!j", artifact_type_to_name(p->type)); | |
| 2955 | + blob_appendf(b, ",\"type\":%!j", artifact_type_to_name(p->type)); | |
| 2956 | 2956 | #define ISA(TYPE) if( p->type==TYPE ) |
| 2957 | 2957 | #define CARD_LETTER(LETTER) \ |
| 2958 | - blob_append_literal(b, ",\"" #LETTER "\": ") | |
| 2958 | + blob_append_literal(b, ",\"" #LETTER "\":") | |
| 2959 | 2959 | #define CARD_STR(LETTER, VAL) \ |
| 2960 | 2960 | assert( VAL ); CARD_LETTER(LETTER); blob_appendf(b, "%!j", VAL) |
| 2961 | 2961 | #define CARD_STR2(LETTER, VAL) \ |
| 2962 | 2962 | if( VAL ) { CARD_STR(LETTER, VAL); } (void)0 |
| 2963 | 2963 | #define STR_OR_NULL(VAL) \ |
| 2964 | 2964 | if( VAL ) blob_appendf(b, "%!j", VAL); \ |
| 2965 | 2965 | else blob_append(b, "null", 4) |
| 2966 | 2966 | #define KVP_STR(ADDCOMMA, KEY,VAL) \ |
| 2967 | 2967 | if(ADDCOMMA) blob_append_char(b, ','); \ |
| 2968 | - blob_appendf(b, "%!j: ", #KEY); \ | |
| 2968 | + blob_appendf(b, "%!j:", #KEY); \ | |
| 2969 | 2969 | STR_OR_NULL(VAL) |
| 2970 | 2970 | |
| 2971 | 2971 | ISA( CFTYPE_ATTACHMENT ){ |
| 2972 | 2972 | CARD_LETTER(A); |
| 2973 | 2973 | blob_append_char(b, '{'); |
| @@ -2978,11 +2978,11 @@ | ||
| 2978 | 2978 | } |
| 2979 | 2979 | CARD_STR2(B, p->zBaseline); |
| 2980 | 2980 | CARD_STR2(C, p->zComment); |
| 2981 | 2981 | CARD_LETTER(D); blob_appendf(b, "%f", p->rDate); |
| 2982 | 2982 | ISA( CFTYPE_EVENT ){ |
| 2983 | - blob_appendf(b, ", \"E\": {\"time\": %f, \"id\": %!j}", | |
| 2983 | + blob_appendf(b, ", \"E\":{\"time\":%f,\"id\":%!j}", | |
| 2984 | 2984 | p->rEventDate, p->zEventId); |
| 2985 | 2985 | } |
| 2986 | 2986 | ISA( CFTYPE_MANIFEST ){ |
| 2987 | 2987 | CARD_LETTER(F); |
| 2988 | 2988 | blob_append_char(b, '['); |
| @@ -3014,11 +3014,11 @@ | ||
| 3014 | 3014 | const char * zName = p->aField[i].zName; |
| 3015 | 3015 | if( i>0 ) blob_append_char(b, ','); |
| 3016 | 3016 | blob_append_char(b, '{'); |
| 3017 | 3017 | KVP_STR(0, name, '+'==*zName ? &zName[1] : zName); |
| 3018 | 3018 | KVP_STR(1, value, p->aField[i].zValue); |
| 3019 | - blob_appendf(b, ", \"append\": %s", '+'==*zName ? "true" : "false"); | |
| 3019 | + blob_appendf(b, ",\"append\":%s", '+'==*zName ? "true" : "false"); | |
| 3020 | 3020 | blob_append_char(b, '}'); |
| 3021 | 3021 | } |
| 3022 | 3022 | blob_append_char(b, ']'); |
| 3023 | 3023 | } |
| 3024 | 3024 | CARD_STR2(K, p->zTicketUuid); |
| @@ -3048,11 +3048,11 @@ | ||
| 3048 | 3048 | CARD_LETTER(Q); |
| 3049 | 3049 | blob_append_char(b, '['); |
| 3050 | 3050 | for( i = 0; i < p->nCherrypick; ++i ){ |
| 3051 | 3051 | if( i>0 ) blob_append_char(b, ','); |
| 3052 | 3052 | blob_append_char(b, '{'); |
| 3053 | - blob_appendf(b, "\"type\": \"%c\"", p->aCherrypick[i].zCPTarget[0]); | |
| 3053 | + blob_appendf(b, "\"type\":\"%c\"", p->aCherrypick[i].zCPTarget[0]); | |
| 3054 | 3054 | KVP_STR(1, target, &p->aCherrypick[i].zCPTarget[1]); |
| 3055 | 3055 | KVP_STR(1, base, p->aCherrypick[i].zCPBase); |
| 3056 | 3056 | blob_append_char(b, '}'); |
| 3057 | 3057 | } |
| 3058 | 3058 | blob_append_char(b, ']'); |
| @@ -3063,11 +3063,11 @@ | ||
| 3063 | 3063 | blob_append_char(b, '['); |
| 3064 | 3064 | for( int i = 0; i < p->nTag; ++i ){ |
| 3065 | 3065 | const char *zName = p->aTag[i].zName; |
| 3066 | 3066 | if( i>0 ) blob_append_char(b, ','); |
| 3067 | 3067 | blob_append_char(b, '{'); |
| 3068 | - blob_appendf(b, "\"type\": \"%c\"", *zName); | |
| 3068 | + blob_appendf(b, "\"type\":\"%c\"", *zName); | |
| 3069 | 3069 | KVP_STR(1, name, &zName[1]); |
| 3070 | 3070 | KVP_STR(1, target, p->aTag[i].zUuid ? p->aTag[i].zUuid : "*") |
| 3071 | 3071 | /* We could arguably resolve the "*" as null or p's uuid. */; |
| 3072 | 3072 | KVP_STR(1, value, p->aTag[i].zValue); |
| 3073 | 3073 | blob_append_char(b, '}'); |
| @@ -3170,19 +3170,19 @@ | ||
| 3170 | 3170 | |
| 3171 | 3171 | |
| 3172 | 3172 | /* |
| 3173 | 3173 | ** COMMAND: test-artifact-to-json |
| 3174 | 3174 | ** |
| 3175 | -** Usage: %fossil test-artifact-to-json ?-pretty? symbolic-name [...names] | |
| 3175 | +** Usage: %fossil test-artifact-to-json ?-pretty|-p? symbolic-name [...names] | |
| 3176 | 3176 | ** |
| 3177 | 3177 | ** Tests the artifact_to_json() and artifact_to_json_by_name() APIs. |
| 3178 | 3178 | */ |
| 3179 | 3179 | void test_manifest_to_json(void){ |
| 3180 | 3180 | int i; |
| 3181 | 3181 | Blob b = empty_blob; |
| 3182 | 3182 | Stmt q; |
| 3183 | - const int bPretty = find_option("pretty",0,0)!=0; | |
| 3183 | + const int bPretty = find_option("pretty","p",0)!=0; | |
| 3184 | 3184 | int nErr = 0; |
| 3185 | 3185 | |
| 3186 | 3186 | db_find_and_open_repository(0,0); |
| 3187 | 3187 | db_prepare(&q, "select json_pretty(:json)"); |
| 3188 | 3188 | for( i=2; i<g.argc; ++i ){ |
| 3189 | 3189 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -2948,26 +2948,26 @@ | |
| 2948 | */ |
| 2949 | void artifact_to_json(Manifest const *p, Blob *b){ |
| 2950 | int i; |
| 2951 | |
| 2952 | blob_append_literal(b, "{"); |
| 2953 | blob_appendf(b, "\"uuid\": \"%z\"", rid_to_uuid(p->rid)); |
| 2954 | /*blob_appendf(b, ", \"rid\": %d", p->rid); not portable across repos*/ |
| 2955 | blob_appendf(b, ", \"type\": %!j", artifact_type_to_name(p->type)); |
| 2956 | #define ISA(TYPE) if( p->type==TYPE ) |
| 2957 | #define CARD_LETTER(LETTER) \ |
| 2958 | blob_append_literal(b, ",\"" #LETTER "\": ") |
| 2959 | #define CARD_STR(LETTER, VAL) \ |
| 2960 | assert( VAL ); CARD_LETTER(LETTER); blob_appendf(b, "%!j", VAL) |
| 2961 | #define CARD_STR2(LETTER, VAL) \ |
| 2962 | if( VAL ) { CARD_STR(LETTER, VAL); } (void)0 |
| 2963 | #define STR_OR_NULL(VAL) \ |
| 2964 | if( VAL ) blob_appendf(b, "%!j", VAL); \ |
| 2965 | else blob_append(b, "null", 4) |
| 2966 | #define KVP_STR(ADDCOMMA, KEY,VAL) \ |
| 2967 | if(ADDCOMMA) blob_append_char(b, ','); \ |
| 2968 | blob_appendf(b, "%!j: ", #KEY); \ |
| 2969 | STR_OR_NULL(VAL) |
| 2970 | |
| 2971 | ISA( CFTYPE_ATTACHMENT ){ |
| 2972 | CARD_LETTER(A); |
| 2973 | blob_append_char(b, '{'); |
| @@ -2978,11 +2978,11 @@ | |
| 2978 | } |
| 2979 | CARD_STR2(B, p->zBaseline); |
| 2980 | CARD_STR2(C, p->zComment); |
| 2981 | CARD_LETTER(D); blob_appendf(b, "%f", p->rDate); |
| 2982 | ISA( CFTYPE_EVENT ){ |
| 2983 | blob_appendf(b, ", \"E\": {\"time\": %f, \"id\": %!j}", |
| 2984 | p->rEventDate, p->zEventId); |
| 2985 | } |
| 2986 | ISA( CFTYPE_MANIFEST ){ |
| 2987 | CARD_LETTER(F); |
| 2988 | blob_append_char(b, '['); |
| @@ -3014,11 +3014,11 @@ | |
| 3014 | const char * zName = p->aField[i].zName; |
| 3015 | if( i>0 ) blob_append_char(b, ','); |
| 3016 | blob_append_char(b, '{'); |
| 3017 | KVP_STR(0, name, '+'==*zName ? &zName[1] : zName); |
| 3018 | KVP_STR(1, value, p->aField[i].zValue); |
| 3019 | blob_appendf(b, ", \"append\": %s", '+'==*zName ? "true" : "false"); |
| 3020 | blob_append_char(b, '}'); |
| 3021 | } |
| 3022 | blob_append_char(b, ']'); |
| 3023 | } |
| 3024 | CARD_STR2(K, p->zTicketUuid); |
| @@ -3048,11 +3048,11 @@ | |
| 3048 | CARD_LETTER(Q); |
| 3049 | blob_append_char(b, '['); |
| 3050 | for( i = 0; i < p->nCherrypick; ++i ){ |
| 3051 | if( i>0 ) blob_append_char(b, ','); |
| 3052 | blob_append_char(b, '{'); |
| 3053 | blob_appendf(b, "\"type\": \"%c\"", p->aCherrypick[i].zCPTarget[0]); |
| 3054 | KVP_STR(1, target, &p->aCherrypick[i].zCPTarget[1]); |
| 3055 | KVP_STR(1, base, p->aCherrypick[i].zCPBase); |
| 3056 | blob_append_char(b, '}'); |
| 3057 | } |
| 3058 | blob_append_char(b, ']'); |
| @@ -3063,11 +3063,11 @@ | |
| 3063 | blob_append_char(b, '['); |
| 3064 | for( int i = 0; i < p->nTag; ++i ){ |
| 3065 | const char *zName = p->aTag[i].zName; |
| 3066 | if( i>0 ) blob_append_char(b, ','); |
| 3067 | blob_append_char(b, '{'); |
| 3068 | blob_appendf(b, "\"type\": \"%c\"", *zName); |
| 3069 | KVP_STR(1, name, &zName[1]); |
| 3070 | KVP_STR(1, target, p->aTag[i].zUuid ? p->aTag[i].zUuid : "*") |
| 3071 | /* We could arguably resolve the "*" as null or p's uuid. */; |
| 3072 | KVP_STR(1, value, p->aTag[i].zValue); |
| 3073 | blob_append_char(b, '}'); |
| @@ -3170,19 +3170,19 @@ | |
| 3170 | |
| 3171 | |
| 3172 | /* |
| 3173 | ** COMMAND: test-artifact-to-json |
| 3174 | ** |
| 3175 | ** Usage: %fossil test-artifact-to-json ?-pretty? symbolic-name [...names] |
| 3176 | ** |
| 3177 | ** Tests the artifact_to_json() and artifact_to_json_by_name() APIs. |
| 3178 | */ |
| 3179 | void test_manifest_to_json(void){ |
| 3180 | int i; |
| 3181 | Blob b = empty_blob; |
| 3182 | Stmt q; |
| 3183 | const int bPretty = find_option("pretty",0,0)!=0; |
| 3184 | int nErr = 0; |
| 3185 | |
| 3186 | db_find_and_open_repository(0,0); |
| 3187 | db_prepare(&q, "select json_pretty(:json)"); |
| 3188 | for( i=2; i<g.argc; ++i ){ |
| 3189 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -2948,26 +2948,26 @@ | |
| 2948 | */ |
| 2949 | void artifact_to_json(Manifest const *p, Blob *b){ |
| 2950 | int i; |
| 2951 | |
| 2952 | blob_append_literal(b, "{"); |
| 2953 | blob_appendf(b, "\"uuid\":\"%z\"", rid_to_uuid(p->rid)); |
| 2954 | /*blob_appendf(b, ", \"rid\": %d", p->rid); not portable across repos*/ |
| 2955 | blob_appendf(b, ",\"type\":%!j", artifact_type_to_name(p->type)); |
| 2956 | #define ISA(TYPE) if( p->type==TYPE ) |
| 2957 | #define CARD_LETTER(LETTER) \ |
| 2958 | blob_append_literal(b, ",\"" #LETTER "\":") |
| 2959 | #define CARD_STR(LETTER, VAL) \ |
| 2960 | assert( VAL ); CARD_LETTER(LETTER); blob_appendf(b, "%!j", VAL) |
| 2961 | #define CARD_STR2(LETTER, VAL) \ |
| 2962 | if( VAL ) { CARD_STR(LETTER, VAL); } (void)0 |
| 2963 | #define STR_OR_NULL(VAL) \ |
| 2964 | if( VAL ) blob_appendf(b, "%!j", VAL); \ |
| 2965 | else blob_append(b, "null", 4) |
| 2966 | #define KVP_STR(ADDCOMMA, KEY,VAL) \ |
| 2967 | if(ADDCOMMA) blob_append_char(b, ','); \ |
| 2968 | blob_appendf(b, "%!j:", #KEY); \ |
| 2969 | STR_OR_NULL(VAL) |
| 2970 | |
| 2971 | ISA( CFTYPE_ATTACHMENT ){ |
| 2972 | CARD_LETTER(A); |
| 2973 | blob_append_char(b, '{'); |
| @@ -2978,11 +2978,11 @@ | |
| 2978 | } |
| 2979 | CARD_STR2(B, p->zBaseline); |
| 2980 | CARD_STR2(C, p->zComment); |
| 2981 | CARD_LETTER(D); blob_appendf(b, "%f", p->rDate); |
| 2982 | ISA( CFTYPE_EVENT ){ |
| 2983 | blob_appendf(b, ", \"E\":{\"time\":%f,\"id\":%!j}", |
| 2984 | p->rEventDate, p->zEventId); |
| 2985 | } |
| 2986 | ISA( CFTYPE_MANIFEST ){ |
| 2987 | CARD_LETTER(F); |
| 2988 | blob_append_char(b, '['); |
| @@ -3014,11 +3014,11 @@ | |
| 3014 | const char * zName = p->aField[i].zName; |
| 3015 | if( i>0 ) blob_append_char(b, ','); |
| 3016 | blob_append_char(b, '{'); |
| 3017 | KVP_STR(0, name, '+'==*zName ? &zName[1] : zName); |
| 3018 | KVP_STR(1, value, p->aField[i].zValue); |
| 3019 | blob_appendf(b, ",\"append\":%s", '+'==*zName ? "true" : "false"); |
| 3020 | blob_append_char(b, '}'); |
| 3021 | } |
| 3022 | blob_append_char(b, ']'); |
| 3023 | } |
| 3024 | CARD_STR2(K, p->zTicketUuid); |
| @@ -3048,11 +3048,11 @@ | |
| 3048 | CARD_LETTER(Q); |
| 3049 | blob_append_char(b, '['); |
| 3050 | for( i = 0; i < p->nCherrypick; ++i ){ |
| 3051 | if( i>0 ) blob_append_char(b, ','); |
| 3052 | blob_append_char(b, '{'); |
| 3053 | blob_appendf(b, "\"type\":\"%c\"", p->aCherrypick[i].zCPTarget[0]); |
| 3054 | KVP_STR(1, target, &p->aCherrypick[i].zCPTarget[1]); |
| 3055 | KVP_STR(1, base, p->aCherrypick[i].zCPBase); |
| 3056 | blob_append_char(b, '}'); |
| 3057 | } |
| 3058 | blob_append_char(b, ']'); |
| @@ -3063,11 +3063,11 @@ | |
| 3063 | blob_append_char(b, '['); |
| 3064 | for( int i = 0; i < p->nTag; ++i ){ |
| 3065 | const char *zName = p->aTag[i].zName; |
| 3066 | if( i>0 ) blob_append_char(b, ','); |
| 3067 | blob_append_char(b, '{'); |
| 3068 | blob_appendf(b, "\"type\":\"%c\"", *zName); |
| 3069 | KVP_STR(1, name, &zName[1]); |
| 3070 | KVP_STR(1, target, p->aTag[i].zUuid ? p->aTag[i].zUuid : "*") |
| 3071 | /* We could arguably resolve the "*" as null or p's uuid. */; |
| 3072 | KVP_STR(1, value, p->aTag[i].zValue); |
| 3073 | blob_append_char(b, '}'); |
| @@ -3170,19 +3170,19 @@ | |
| 3170 | |
| 3171 | |
| 3172 | /* |
| 3173 | ** COMMAND: test-artifact-to-json |
| 3174 | ** |
| 3175 | ** Usage: %fossil test-artifact-to-json ?-pretty|-p? symbolic-name [...names] |
| 3176 | ** |
| 3177 | ** Tests the artifact_to_json() and artifact_to_json_by_name() APIs. |
| 3178 | */ |
| 3179 | void test_manifest_to_json(void){ |
| 3180 | int i; |
| 3181 | Blob b = empty_blob; |
| 3182 | Stmt q; |
| 3183 | const int bPretty = find_option("pretty","p",0)!=0; |
| 3184 | int nErr = 0; |
| 3185 | |
| 3186 | db_find_and_open_repository(0,0); |
| 3187 | db_prepare(&q, "select json_pretty(:json)"); |
| 3188 | for( i=2; i<g.argc; ++i ){ |
| 3189 |