diff options
Diffstat (limited to 'src/utils.c')
-rw-r--r-- | src/utils.c | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/src/utils.c b/src/utils.c index 047a266..85a3b56 100644 --- a/src/utils.c +++ b/src/utils.c @@ -590,4 +590,60 @@ int xml_pretty_print_in_place(const char *filename, const char *pretty_print_pro guard_free(tempfile); guard_free(result); return -1; -}
\ No newline at end of file +} + +int fix_tox_conf(const char *filename, char **result) { + struct INIFILE *toxini; + FILE *fptemp; + char *tempfile; + const char *with_posargs = " \\\n {posargs}\n"; + + tempfile = xmkstemp(&fptemp, "w+"); + if (!tempfile) { + return -1; + } + + if (!*result) { + *result = calloc(PATH_MAX, sizeof(*result)); + if (!*result) { + return -1; + } + } + + toxini = ini_open(filename); + if (!toxini) { + if (fptemp) { + guard_free(tempfile); + fclose(fptemp); + } + guard_free(*result); + return -1; + } + + for (size_t i = 0; i < toxini->section_count; i++) { + struct INISection *section = toxini->section[i]; + if (section) { + if (startswith(section->key, "testenv")) { + for (size_t k = 0; k < section->data_count; k++) { + struct INIData *data = section->data[k]; + if (data) { + if (!strcmp(data->key, "commands") && (startswith(data->value, "pytest") && !strstr(data->value, "{posargs}"))) { + strip(data->value); + data->value = realloc(data->value, strlen(data->value) + strlen(with_posargs) + 1); + strcat(data->value, with_posargs); + } + } + } + } + } + } + + if (ini_write(toxini, &fptemp)) { + guard_free(tempfile); + } + fclose(fptemp); + + *result = tempfile; + ini_free(&toxini); + return 0; +} |