Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Allow to set env per repo (useful for fetch specific)
Baptiste Daroussin committed 9 years ago
commit 097c35b40ab39a2bfa339411c4b98ad29746d7d1
parent b0d576b
3 files changed +67 -1
modified libpkg/fetch.c
@@ -460,6 +460,10 @@ pkg_fetch_file_to_fd(struct pkg_repo *repo, const char *url, int dest,
	FILE		*remote = NULL;
	struct url	*u = NULL;
	struct url_stat	 st;
+
	struct keyval	*kv, *kvtmp;
+
	struct keyval	*envtorestore = NULL;
+
	struct keyval	*envtounset = NULL;
+
	char		*tmp;
	off_t		 done = 0;
	off_t		 r;
	int64_t		 max_retry, retry;
@@ -511,6 +515,18 @@ pkg_fetch_file_to_fd(struct pkg_repo *repo, const char *url, int dest,

		url += strlen(URL_SCHEME_PREFIX);
		pkg_url_scheme = true;
+

+
		LL_FOREACH(repo->env, kv) {
+
			kvtmp = calloc(1, sizeof(*kvtmp));
+
			kvtmp->key = strdup(kv->key);
+
			if ((tmp = getenv(kv->key)) != NULL) {
+
				kvtmp->val = strdup(tmp);
+
				LL_APPEND(envtorestore, kvtmp);
+
			} else {
+
				LL_APPEND(envtounset, kvtmp);
+
			}
+
			setenv(kv->key, kv->val, 1);
+
		}
	}

	u = fetchParseURL(url);
@@ -680,6 +696,22 @@ pkg_fetch_file_to_fd(struct pkg_repo *repo, const char *url, int dest,
	}

cleanup:
+
	if (repo != NULL) {
+
		LL_FOREACH_SAFE(envtorestore, kv, kvtmp) {
+
			setenv(kv->key, kv->val, 1);
+
			LL_DELETE(envtorestore, kv);
+
			free(kv->key);
+
			free(kv->val);
+
			free(kv);
+
		}
+
		LL_FOREACH_SAFE(envtounset, kv, kvtmp) {
+
			unsetenv(kv->key);
+
			free(kv->key);
+
			free(kv->val);
+
			free(kv);
+
		}
+
	}
+

	if (u != NULL) {
		if (remote != NULL &&  repo != NULL && remote != repo->ssh)
			fclose(remote);
modified libpkg/pkg_config.c
@@ -507,8 +507,9 @@ disable_plugins_if_static(void)
static void
add_repo(const ucl_object_t *obj, struct pkg_repo *r, const char *rname, pkg_init_flags flags)
{
-
	const ucl_object_t *cur, *enabled;
+
	const ucl_object_t *cur, *enabled, *env;
	ucl_object_iter_t it = NULL;
+
	struct keyval *kv;
	bool enable = true;
	const char *url = NULL, *pubkey = NULL, *mirror_type = NULL;
	const char *signature_type = NULL, *fingerprints = NULL;
@@ -519,6 +520,7 @@ add_repo(const ucl_object_t *obj, struct pkg_repo *r, const char *rname, pkg_ini

	pkg_debug(1, "PkgConfig: parsing repository object %s", rname);

+
	env = NULL;
	enabled = ucl_object_find_key(obj, "enabled");
	if (enabled == NULL)
		enabled = ucl_object_find_key(obj, "ENABLED");
@@ -611,6 +613,13 @@ add_repo(const ucl_object_t *obj, struct pkg_repo *r, const char *rname, pkg_ini
				return;
			}
			priority = ucl_object_toint(cur);
+
		} else if (strcasecmp(key, "env") == 0) {
+
			if (cur->type != UCL_OBJECT) {
+
				pkg_emit_error("Expecting an object for the "
+
					"'%s' key of the '%s' repo",
+
					key, rname);
+
			}
+
			env = cur;
		}
	}

@@ -668,6 +677,16 @@ add_repo(const ucl_object_t *obj, struct pkg_repo *r, const char *rname, pkg_ini
		r->flags = REPO_FLAGS_USE_IPV4;
	else if (use_ipvx == 6)
		r->flags = REPO_FLAGS_USE_IPV6;
+

+
	if (env != NULL) {
+
		it = NULL;
+
		while ((cur = ucl_iterate_object(env, &it, true))) {
+
			kv = calloc(1, sizeof(*kv));
+
			kv->key = strdup(ucl_object_key(cur));
+
			kv->val = strdup(ucl_object_tostring_forced(cur));
+
			LL_APPEND(r->env, kv);
+
		}
+
	}
}

static void
@@ -1267,6 +1286,8 @@ pkg_repo_overwrite(struct pkg_repo *r, const char *name, const char *url,
static void
pkg_repo_free(struct pkg_repo *r)
{
+
	struct keyval *kv, *tmp;
+

	free(r->url);
	free(r->name);
	free(r->pubkey);
@@ -1275,6 +1296,12 @@ pkg_repo_free(struct pkg_repo *r)
		fprintf(r->ssh, "quit\n");
		pclose(r->ssh);
	}
+
	LL_FOREACH_SAFE(r->env, kv, tmp) {
+
		LL_DELETE(r->env, kv);
+
		free(kv->val);
+
		free(kv->key);
+
		free(kv);
+
	}
	free(r);
}

modified libpkg/private/pkg.h
@@ -496,6 +496,12 @@ typedef enum _pkg_repo_flags {
	REPO_FLAGS_USE_IPV6 = (1U << 1)
} pkg_repo_flags;

+
struct keyval {
+
	char *key;
+
	char *val;
+
	struct keyval *next;
+
};
+

struct pkg_repo {
	struct pkg_repo_ops *ops;

@@ -528,6 +534,7 @@ struct pkg_repo {
	unsigned int priority;

	pkg_repo_flags flags;
+
	struct keyval *env;

	/* Opaque repository data */
	void *priv;