Allow $repo expansion in 'Server' config lines
Small change (addition of a 'strreplace' function) which replaces any $repo tokens found in a server line with the name of the repo or section being processed. While this is more simplistic than suggestions on flyspray, it works and I think it is cleaner. Merits can be discussed further. Ref: FS#6389 Signed-off-by: Aaron Griffin <aaronmgriffin@gmail.com>
This commit is contained in:
parent
1381b58ceb
commit
ebad199614
3 changed files with 72 additions and 22 deletions
|
@ -224,7 +224,7 @@ int alpm_db_setserver(pmdb_t *db, const char *url)
|
||||||
}
|
}
|
||||||
db->servers = alpm_list_add(db->servers, server);
|
db->servers = alpm_list_add(db->servers, server);
|
||||||
_alpm_log(PM_LOG_DEBUG, _("adding new server to database '%s': protocol '%s', server '%s', path '%s'"),
|
_alpm_log(PM_LOG_DEBUG, _("adding new server to database '%s': protocol '%s', server '%s', path '%s'"),
|
||||||
db->treename, server->s_url->scheme, server->s_url->host, server->s_url->doc);
|
db->treename, server->s_url->scheme, server->s_url->host, server->s_url->doc);
|
||||||
} else {
|
} else {
|
||||||
FREELIST(db->servers);
|
FREELIST(db->servers);
|
||||||
_alpm_log(PM_LOG_DEBUG, _("serverlist flushed for '%s'"), db->treename);
|
_alpm_log(PM_LOG_DEBUG, _("serverlist flushed for '%s'"), db->treename);
|
||||||
|
@ -467,8 +467,8 @@ int alpm_pkg_checksha1sum(pmpkg_t *pkg)
|
||||||
ASSERT(pkg->data != handle->db_local, RET_ERR(PM_ERR_PKG_INVALID, -1));
|
ASSERT(pkg->data != handle->db_local, RET_ERR(PM_ERR_PKG_INVALID, -1));
|
||||||
|
|
||||||
snprintf(path, PATH_MAX, "%s%s/%s-%s" PM_EXT_PKG,
|
snprintf(path, PATH_MAX, "%s%s/%s-%s" PM_EXT_PKG,
|
||||||
handle->root, handle->cachedir,
|
handle->root, handle->cachedir,
|
||||||
alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
|
alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
|
||||||
|
|
||||||
sha1sum = _alpm_SHAFile(path);
|
sha1sum = _alpm_SHAFile(path);
|
||||||
if(sha1sum == NULL) {
|
if(sha1sum == NULL) {
|
||||||
|
@ -511,8 +511,8 @@ int alpm_pkg_checkmd5sum(pmpkg_t *pkg)
|
||||||
ASSERT(pkg->data != handle->db_local, RET_ERR(PM_ERR_PKG_INVALID, -1));
|
ASSERT(pkg->data != handle->db_local, RET_ERR(PM_ERR_PKG_INVALID, -1));
|
||||||
|
|
||||||
snprintf(path, PATH_MAX, "%s%s/%s-%s" PM_EXT_PKG,
|
snprintf(path, PATH_MAX, "%s%s/%s-%s" PM_EXT_PKG,
|
||||||
handle->root, handle->cachedir,
|
handle->root, handle->cachedir,
|
||||||
alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
|
alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
|
||||||
|
|
||||||
md5sum = _alpm_MDFile(path);
|
md5sum = _alpm_MDFile(path);
|
||||||
if(md5sum == NULL) {
|
if(md5sum == NULL) {
|
||||||
|
@ -545,7 +545,7 @@ int alpm_pkg_checkmd5sum(pmpkg_t *pkg)
|
||||||
*/
|
*/
|
||||||
int SYMEXPORT alpm_pkg_vercmp(const char *ver1, const char *ver2)
|
int SYMEXPORT alpm_pkg_vercmp(const char *ver1, const char *ver2)
|
||||||
{
|
{
|
||||||
ALPM_LOG_FUNC;
|
ALPM_LOG_FUNC;
|
||||||
|
|
||||||
return(_alpm_versioncmp(ver1, ver2));
|
return(_alpm_versioncmp(ver1, ver2));
|
||||||
}
|
}
|
||||||
|
@ -636,8 +636,8 @@ alpm_list_t SYMEXPORT *alpm_db_search(pmdb_t *db, alpm_list_t* needles)
|
||||||
* @return 0 on success, -1 on error (pm_errno is set accordingly)
|
* @return 0 on success, -1 on error (pm_errno is set accordingly)
|
||||||
*/
|
*/
|
||||||
int SYMEXPORT alpm_trans_init(pmtranstype_t type, pmtransflag_t flags,
|
int SYMEXPORT alpm_trans_init(pmtranstype_t type, pmtransflag_t flags,
|
||||||
alpm_trans_cb_event event, alpm_trans_cb_conv conv,
|
alpm_trans_cb_event event, alpm_trans_cb_conv conv,
|
||||||
alpm_trans_cb_progress progress)
|
alpm_trans_cb_progress progress)
|
||||||
{
|
{
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
|
|
||||||
|
@ -1059,11 +1059,15 @@ int SYMEXPORT alpm_parse_config(char *file, alpm_cb_db_register callback, const
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(strcmp(origkey, "Server") == 0 || strcmp(key, "SERVER") == 0) {
|
if(strcmp(origkey, "Server") == 0 || strcmp(key, "SERVER") == 0) {
|
||||||
/* add to the list */
|
/* let's attempt a replacement for the current repo */
|
||||||
if(alpm_db_setserver(db, ptr) != 0) {
|
char *server = _alpm_strreplace(ptr, "$repo", section);
|
||||||
|
|
||||||
|
if(alpm_db_setserver(db, server) != 0) {
|
||||||
/* pm_errno is set by alpm_db_setserver */
|
/* pm_errno is set by alpm_db_setserver */
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(server);
|
||||||
} else {
|
} else {
|
||||||
RET_ERR(PM_ERR_CONF_BAD_SYNTAX, -1);
|
RET_ERR(PM_ERR_CONF_BAD_SYNTAX, -1);
|
||||||
}
|
}
|
||||||
|
@ -1100,7 +1104,7 @@ alpm_list_t SYMEXPORT *alpm_get_upgrades()
|
||||||
|
|
||||||
for(m = _alpm_db_get_pkgcache(handle->db_local); m; m = m->next) {
|
for(m = _alpm_db_get_pkgcache(handle->db_local); m; m = m->next) {
|
||||||
pmpkg_t *lpkg = m->data;
|
pmpkg_t *lpkg = m->data;
|
||||||
|
|
||||||
if(strcmp(k->data, alpm_pkg_get_name(lpkg)) == 0) {
|
if(strcmp(k->data, alpm_pkg_get_name(lpkg)) == 0) {
|
||||||
_alpm_log(PM_LOG_DEBUG, _("checking replacement '%s' for package '%s'"), k->data,
|
_alpm_log(PM_LOG_DEBUG, _("checking replacement '%s' for package '%s'"), k->data,
|
||||||
alpm_pkg_get_name(spkg));
|
alpm_pkg_get_name(spkg));
|
||||||
|
|
|
@ -161,7 +161,7 @@ int _alpm_copyfile(const char *src, const char *dest)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert a string to uppercase
|
/* Convert a string to uppercase
|
||||||
*/
|
*/
|
||||||
char *_alpm_strtoupper(char *str)
|
char *_alpm_strtoupper(char *str)
|
||||||
{
|
{
|
||||||
char *ptr = str;
|
char *ptr = str;
|
||||||
|
@ -174,7 +174,7 @@ char *_alpm_strtoupper(char *str)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Trim whitespace and newlines from a string
|
/* Trim whitespace and newlines from a string
|
||||||
*/
|
*/
|
||||||
char *_alpm_strtrim(char *str)
|
char *_alpm_strtrim(char *str)
|
||||||
{
|
{
|
||||||
char *pch = str;
|
char *pch = str;
|
||||||
|
@ -205,8 +205,53 @@ char *_alpm_strtrim(char *str)
|
||||||
return(str);
|
return(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Helper function for _alpm_strreplace */
|
||||||
|
static void _strnadd(char **str, const char *append, unsigned int count)
|
||||||
|
{
|
||||||
|
if(*str) {
|
||||||
|
*str = realloc(*str, strlen(*str) + count + 1);
|
||||||
|
} else {
|
||||||
|
*str = calloc(sizeof(char), count + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
strncat(*str, append, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Replace all occurances of 'needle' with 'replace' in 'str', returning
|
||||||
|
* a new string (must be free'd) */
|
||||||
|
char *_alpm_strreplace(const char *str, const char *needle, const char *replace)
|
||||||
|
{
|
||||||
|
const char *p, *q;
|
||||||
|
p = q = str;
|
||||||
|
|
||||||
|
char *newstr = NULL;
|
||||||
|
unsigned int needlesz = strlen(needle),
|
||||||
|
replacesz = strlen(replace);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
q = strstr(p, needle);
|
||||||
|
if(!q) { /* not found */
|
||||||
|
if(*p) {
|
||||||
|
/* add the rest of 'p' */
|
||||||
|
_strnadd(&newstr, p, strlen(p));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else { /* found match */
|
||||||
|
if(q > p){
|
||||||
|
/* add chars between this occurance and last occurance, if any */
|
||||||
|
_strnadd(&newstr, p, q - p);
|
||||||
|
}
|
||||||
|
_strnadd(&newstr, replace, replacesz);
|
||||||
|
p = q + needlesz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Create a lock file
|
/* Create a lock file
|
||||||
*/
|
*/
|
||||||
int _alpm_lckmk(const char *file)
|
int _alpm_lckmk(const char *file)
|
||||||
{
|
{
|
||||||
int fd, count = 0;
|
int fd, count = 0;
|
||||||
|
@ -234,7 +279,7 @@ int _alpm_lckmk(const char *file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove a lock file
|
/* Remove a lock file
|
||||||
*/
|
*/
|
||||||
int _alpm_lckrm(const char *file)
|
int _alpm_lckrm(const char *file)
|
||||||
{
|
{
|
||||||
if(unlink(file) == -1 && errno != ENOENT) {
|
if(unlink(file) == -1 && errno != ENOENT) {
|
||||||
|
@ -244,7 +289,7 @@ int _alpm_lckrm(const char *file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compression functions
|
/* Compression functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int _alpm_unpack(const char *archive, const char *prefix, const char *fn)
|
int _alpm_unpack(const char *archive, const char *prefix, const char *fn)
|
||||||
{
|
{
|
||||||
|
@ -252,8 +297,8 @@ int _alpm_unpack(const char *archive, const char *prefix, const char *fn)
|
||||||
struct archive_entry *entry;
|
struct archive_entry *entry;
|
||||||
char expath[PATH_MAX];
|
char expath[PATH_MAX];
|
||||||
const int archive_flags = ARCHIVE_EXTRACT_OWNER |
|
const int archive_flags = ARCHIVE_EXTRACT_OWNER |
|
||||||
ARCHIVE_EXTRACT_PERM |
|
ARCHIVE_EXTRACT_PERM |
|
||||||
ARCHIVE_EXTRACT_TIME;
|
ARCHIVE_EXTRACT_TIME;
|
||||||
|
|
||||||
ALPM_LOG_FUNC;
|
ALPM_LOG_FUNC;
|
||||||
|
|
||||||
|
@ -278,14 +323,14 @@ int _alpm_unpack(const char *archive, const char *prefix, const char *fn)
|
||||||
archive_entry_set_pathname(entry, expath);
|
archive_entry_set_pathname(entry, expath);
|
||||||
if(archive_read_extract(_archive, entry, archive_flags) != ARCHIVE_OK) {
|
if(archive_read_extract(_archive, entry, archive_flags) != ARCHIVE_OK) {
|
||||||
_alpm_log(PM_LOG_ERROR, _("could not extract %s: %s\n"), archive_entry_pathname(entry), archive_error_string(_archive));
|
_alpm_log(PM_LOG_ERROR, _("could not extract %s: %s\n"), archive_entry_pathname(entry), archive_error_string(_archive));
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fn) {
|
if(fn) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
archive_read_finish(_archive);
|
archive_read_finish(_archive);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
@ -349,8 +394,8 @@ int _alpm_logaction(unsigned short usesyslog, FILE *f, const char *str)
|
||||||
|
|
||||||
/* Use ISO-8601 date format */
|
/* Use ISO-8601 date format */
|
||||||
fprintf(f, "[%04d-%02d-%02d %02d:%02d] %s\n",
|
fprintf(f, "[%04d-%02d-%02d %02d:%02d] %s\n",
|
||||||
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
|
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
|
||||||
tm->tm_hour, tm->tm_min, str);
|
tm->tm_hour, tm->tm_min, str);
|
||||||
|
|
||||||
fflush(f);
|
fflush(f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ int _alpm_makepath(const char *path);
|
||||||
int _alpm_copyfile(const char *src, const char *dest);
|
int _alpm_copyfile(const char *src, const char *dest);
|
||||||
char *_alpm_strtoupper(char *str);
|
char *_alpm_strtoupper(char *str);
|
||||||
char *_alpm_strtrim(char *str);
|
char *_alpm_strtrim(char *str);
|
||||||
|
char *_alpm_strreplace(const char *str, const char *needle, const char *replace);
|
||||||
int _alpm_lckmk(const char *file);
|
int _alpm_lckmk(const char *file);
|
||||||
int _alpm_lckrm(const char *file);
|
int _alpm_lckrm(const char *file);
|
||||||
int _alpm_unpack(const char *archive, const char *prefix, const char *fn);
|
int _alpm_unpack(const char *archive, const char *prefix, const char *fn);
|
||||||
|
|
Loading…
Add table
Reference in a new issue