diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/deliverable.c | 79 | ||||
| -rw-r--r-- | src/template.c | 64 | 
2 files changed, 94 insertions, 49 deletions
| diff --git a/src/deliverable.c b/src/deliverable.c index ce8972e..a91901a 100644 --- a/src/deliverable.c +++ b/src/deliverable.c @@ -1467,29 +1467,70 @@ int delivery_mission_render_files(struct Delivery *ctx) {          fprintf(stderr, "Mission directory is not configured. Context not initialized?\n");          return -1;      } +    struct Data { +        char *src; +        char *dest; +    } data; +    struct INIFILE *cfg = ctx->rules._handle; +    union INIVal val; -    ctx->deploy.upload_ctx.workaround_parent_only = true; -    ctx->deploy.upload_ctx.build_name = strdup(ctx->info.release_name); -    ctx->deploy.upload_ctx.build_number = ctx->info.time_now; - -    char files[PATH_MAX]; -    int status = 0; - -    if (jfrog_cli_rt_ping(&ctx->deploy.auth_ctx)) { -        msg(OMC_MSG_ERROR | OMC_MSG_L2, "Unable to contact artifactory server: %s\n", ctx->deploy.auth_ctx.url); +    data.src = calloc(PATH_MAX, sizeof(*data.src)); +    if (!data.src) { +        perror("data.src");          return -1;      } -    jfrog_cli_rt_build_collect_env(&ctx->deploy.auth_ctx, ctx->deploy.upload_ctx.build_name, ctx->deploy.upload_ctx.build_number); +    for (size_t i = 0; i < cfg->section_count; i++) { +        char *section_name = cfg->section[i]->key; +        if (!startswith(section_name, "template:")) { +            continue; +        } +        val.as_char_p = strchr(section_name, ':') + 1; +        if (val.as_char_p && isempty(val.as_char_p)) { +            return 1; +        } +        sprintf(data.src, "%s/%s/%s", ctx->storage.mission_dir, ctx->meta.mission, val.as_char_p); +        msg(OMC_MSG_L2, "%s\n", data.src); -    strcpy(files, "omc/sources/**/results.xml"); -    status += jfrog_cli_rt_upload(&ctx->deploy.auth_ctx, &ctx->deploy.upload_ctx, files, "omc/delivery/results"); -    strcpy(files, "omc/output/delivery/*.yml"); -    status += jfrog_cli_rt_upload(&ctx->deploy.auth_ctx, &ctx->deploy.upload_ctx, files, "omc/delivery/"); -    strcpy(files, "omc/output/packages/*"); -    status += jfrog_cli_rt_upload(&ctx->deploy.auth_ctx, &ctx->deploy.upload_ctx, files, "omc/packages/"); +        getter_required(cfg, section_name, "destination", INIVAL_TYPE_STR) +        conv_str_stackvar(data, dest) -    jfrog_cli_rt_build_publish(&ctx->deploy.auth_ctx, ctx->deploy.upload_ctx.build_name, ctx->deploy.upload_ctx.build_number); +        char *contents; +        struct stat st; +        if (lstat(data.src, &st)) { +            perror(data.src); +            continue; +        } -    return status; -} +        contents = calloc(st.st_size + 1, sizeof(*contents)); +        if (!contents) { +            perror("template file contents"); +            continue; +        } + +        FILE *fp; +        fp = fopen(data.src, "rb"); +        if (!fp) { +            perror(data.src); +            free(contents); +            continue; +        } + +        if (fread(contents, st.st_size, sizeof(*contents), fp) < 1) { +            perror("while reading template file"); +            free(contents); +            fclose(fp); +            continue; +        } +        fclose(fp); + +        msg(OMC_MSG_L3, "Writing %s\n", data.dest); +        if (tpl_render_to_file(contents, data.dest)) { +            free(contents); +            continue; +        } +        free(contents); +    } + +    return 0; +}
\ No newline at end of file diff --git a/src/template.c b/src/template.c index fe7ef11..646f5f9 100644 --- a/src/template.c +++ b/src/template.c @@ -56,13 +56,13 @@ char *tpl_getval(char *key) {  }  static int grow(size_t z, size_t *output_bytes, char **output) { -    if (z > *output_bytes) { +    if (z >= *output_bytes) {          size_t new_size = *output_bytes + z + 1;  #ifdef DEBUG          fprintf(stderr, "template output buffer new size: %zu\n", *output_bytes);  #endif          char *tmp = realloc(*output, new_size); -        if (!*tmp) { +        if (!tmp) {              perror("realloc failed");              return -1;          } @@ -77,13 +77,13 @@ char *tpl_render(char *str) {      if (!str) {          return NULL;      } -    size_t output_bytes = strlen(str); +    size_t output_bytes = strlen(str) * 2;      char *output = NULL;      char *b_close = NULL;      char *pos = NULL;      pos = str; -    output = calloc(output_bytes + 1, sizeof(*output)); +    output = calloc(output_bytes, sizeof(*output));      if (!output) {          perror("unable to allocate output buffer");          return NULL; @@ -94,6 +94,7 @@ char *tpl_render(char *str) {          char key[255] = {0};          char *value = NULL; +        memset(key, 0, sizeof(key));          grow(z, &output_bytes, &output);          // At opening brace          if (!strncmp(pos, "{{", 2)) { @@ -105,6 +106,9 @@ char *tpl_render(char *str) {              // Read key name              size_t key_len = 0;              while (isalnum(*pos) || *pos != '}') { +                if (isspace(*pos) || isblank(*pos)) { +                    break; +                }                  key[key_len] = *pos;                  key_len++;                  pos++; @@ -129,7 +133,7 @@ char *tpl_render(char *str) {                  continue;              }              // Jump past closing brace -            pos = b_close + 2; +            pos += (b_close + 2 - pos);              if (do_env) {                  char *k = type_stop + 1; @@ -145,11 +149,11 @@ char *tpl_render(char *str) {          }          if (value) { -            // Append replacement value -            grow(z + strlen(value), &output_bytes, &output); -            strcat(output, value);              // Set output iterator to end of replacement value              z += strlen(value); +            // Append replacement value +            grow(z, &output_bytes, &output); +            strcat(output, value);          }  #ifdef DEBUG @@ -166,26 +170,26 @@ char *tpl_render(char *str) {      return output;  } -/* -const char *TESTDATA = "follow the {{ env:PATH }}\ni have a {{ COLOR}} pencil box\n\nthe cup is full of {{LIQUID }}\n{{GOAT}}, the barn is {{  COLOR  }} too!\n"; -int main() { -    char *name = "couch"; -    char *liquid = "milk"; -    char *color = "brown"; -    char *meh = "MEHHHHHHHH"; - -    tpl_register("THING", name); -    tpl_register("LIQUID", liquid); -    tpl_register("COLOR", color); -    tpl_register("GOAT", meh); - -    puts(TESTDATA); -    puts("----------\n"); - -    char *output = tpl_render(TESTDATA, strlen(TESTDATA) + 1024); -    printf("%s\n", output); -    free(output); -    tpl_free(); +int tpl_render_to_file(char *str, const char *filename) { +    char *result; +    FILE *fp; + +    // Render the input string +    result = tpl_render(str); +    if (!result) { +        return -1; +    } + +    // Open the destination file for writing +    fp = fopen(filename, "w+"); +    if (!fp) { +        return -1; +    } + +    // Write rendered string to file +    fprintf(fp, "%s", result); +    fclose(fp); + +    guard_free(result);      return 0; -} - */ +}
\ No newline at end of file | 
