poldek: poldek/install3/conflicts.c, poldek/install3/ictx.c, polde...
mis
mis at pld-linux.org
Wed Jan 30 22:29:40 CET 2008
Author: mis Date: Wed Jan 30 21:29:40 2008 GMT
Module: poldek Tag: HEAD
---- Log message:
- prevent upgrading packages already beeing removed
- just give up on non-upgradable orphan with unmet deps
- iset cleanups
---- Files affected:
poldek/poldek/install3:
conflicts.c (1.2 -> 1.3) , ictx.c (1.1 -> 1.2) , ictx.h (1.1 -> 1.2) , install.c (1.1 -> 1.2) , iset.c (1.2 -> 1.3) , iset.h (1.1 -> 1.2) , mark.c (1.2 -> 1.3) , obsoletes.c (1.2 -> 1.3) , process.c (1.2 -> 1.3) , requirements.c (1.2 -> 1.3)
---- Diffs:
================================================================
Index: poldek/poldek/install3/conflicts.c
diff -u poldek/poldek/install3/conflicts.c:1.2 poldek/poldek/install3/conflicts.c:1.3
--- poldek/poldek/install3/conflicts.c:1.2 Fri Jan 25 15:24:00 2008
+++ poldek/poldek/install3/conflicts.c Wed Jan 30 22:29:34 2008
@@ -148,7 +148,7 @@
tn_array *dbpkgs = NULL;
pkgdb_search(ictx->ts->db, &dbpkgs, PMTAG_CAP, capreq_name(cnfl),
- iset_packages(ictx->unset), PKG_LDWHOLE_FLDEPDIRS);
+ iset_packages_by_recno(ictx->unset), PKG_LDWHOLE_FLDEPDIRS);
if (dbpkgs == NULL)
return 0;
@@ -217,7 +217,7 @@
tn_array *dbpkgs = NULL;
pkgdb_search(ictx->ts->db, &dbpkgs, PMTAG_CNFL, capreq_name(cap),
- iset_packages(ictx->unset), PKG_LDWHOLE_FLDEPDIRS);
+ iset_packages_by_recno(ictx->unset), PKG_LDWHOLE_FLDEPDIRS);
if (dbpkgs == NULL)
return 0;
================================================================
Index: poldek/poldek/install3/ictx.c
diff -u poldek/poldek/install3/ictx.c:1.1 poldek/poldek/install3/ictx.c:1.2
--- poldek/poldek/install3/ictx.c:1.1 Wed Jan 23 23:56:19 2008
+++ poldek/poldek/install3/ictx.c Wed Jan 30 22:29:35 2008
@@ -227,3 +227,10 @@
ictx->abort = 0;
}
+
+int i3_stop_processing(struct i3ctx *ictx, int stop)
+{
+ ictx->abort = stop;
+ return ictx->abort;
+}
+
================================================================
Index: poldek/poldek/install3/ictx.h
diff -u poldek/poldek/install3/ictx.h:1.1 poldek/poldek/install3/ictx.h:1.2
--- poldek/poldek/install3/ictx.h:1.1 Wed Jan 23 23:56:19 2008
+++ poldek/poldek/install3/ictx.h Wed Jan 30 22:29:35 2008
@@ -28,19 +28,6 @@
#include "pkgfl.h"
#include "iset.h"
-#define capreq_stra(c, dp) \
- do { \
- const struct capreq *cc = (c); \
- char **dptr = (dp); \
- if (!capreq_versioned(cc)) \
- *dptr = (char*)capreq_name(cc); \
- else { \
- *dptr = alloca(256); \
- capreq_snprintf(*dptr, 256, cc); \
- } \
- } while (0)
-
-
struct poldek_ts;
struct pkgmark_set;
struct poldek_iinf;
@@ -117,6 +104,14 @@
extern int poldek_conf_MULTILIB;
+/* set stop flag */
+int i3_stop_processing(struct i3ctx *ictx, int stop);
+
+#define i3_return_zero_if_stoppped(i3ctx) \
+ do { if (sigint_reached() || i3ctx->abort) \
+ return 0; \
+ } while(0)
+
/* mark.c */
int i3_mark_package(struct i3ctx *ictx, struct pkg *pkg, uint32_t mark);
int i3_unmark_package(struct i3ctx *ictx, struct pkg *pkg);
================================================================
Index: poldek/poldek/install3/install.c
diff -u poldek/poldek/install3/install.c:1.1 poldek/poldek/install3/install.c:1.2
--- poldek/poldek/install3/install.c:1.1 Wed Jan 23 23:56:19 2008
+++ poldek/poldek/install3/install.c Wed Jan 30 22:29:35 2008
@@ -196,9 +196,8 @@
break;
}
n_array_free(toinstall);
-
- if (ictx->abort || sigint_reached())
- return 0;
+
+ i3_return_zero_if_stoppped(ictx);
install_summary(ictx);
pkgdb_close(ts->db); /* release db as soon as possible */
================================================================
Index: poldek/poldek/install3/iset.c
diff -u poldek/poldek/install3/iset.c:1.2 poldek/poldek/install3/iset.c:1.3
--- poldek/poldek/install3/iset.c:1.2 Sun Jan 27 19:28:19 2008
+++ poldek/poldek/install3/iset.c Wed Jan 30 22:29:35 2008
@@ -36,7 +36,8 @@
#define PKGMARK_ISET (1 << 20)
struct iset {
- tn_array *pkgs;
+ tn_array *pkgs;
+ tn_array *pkgs_by_recno;
tn_hash *capcache; /* cache of resolved packages caps */
struct pkgmark_set *pms;
};
@@ -58,18 +59,18 @@
return iset->pkgs;
}
+const tn_array *iset_packages_by_recno(struct iset *iset)
+{
+ return iset->pkgs_by_recno;
+}
+
tn_array *iset_packages_in_install_order(struct iset *iset)
{
tn_array *pkgs = NULL;
- void *cmpfn;
-
- cmpfn = n_array_ctl_set_cmpfn(iset->pkgs, (tn_fn_cmp)pkg_cmp_name_evr_rev);
packages_order(iset->pkgs, &pkgs, PKGORDER_INSTALL);
n_assert(pkgs);
n_assert(n_array_size(pkgs) == n_array_size(iset->pkgs));
-
- n_array_ctl_set_cmpfn(iset->pkgs, cmpfn);
return pkgs;
}
@@ -83,7 +84,8 @@
struct iset *iset;
iset = n_malloc(sizeof(*iset));
- iset->pkgs = pkgs_array_new_ex(128, pkg_cmp_recno);
+ iset->pkgs = pkgs_array_new(128);
+ iset->pkgs_by_recno = pkgs_array_new_ex(128, pkg_cmp_recno);
iset->capcache = n_hash_new(128, NULL);
iset->pms = pkgmark_set_new(0, 0);
return iset;
@@ -92,6 +94,7 @@
void iset_free(struct iset *iset)
{
n_array_free(iset->pkgs);
+ n_array_free(iset->pkgs_by_recno);
n_hash_free(iset->capcache);
pkgmark_set_free(iset->pms);
free(iset);
@@ -101,7 +104,7 @@
{
DBGF("add %s\n", pkg_id(pkg));
n_array_push(iset->pkgs, pkg_link(pkg));
-
+ n_array_push(iset->pkgs_by_recno, pkg_link(pkg));
mflag |= PKGMARK_ISET;
iset_markf(iset, pkg, mflag);
}
@@ -115,49 +118,52 @@
n_hash_clean(iset->capcache); /* flush all, TODO: remove pkg caps only */
pkg_clr_mf(iset->pms, pkg, PKGMARK_ISET);
-
- for (i=0; i < n_array_size(iset->pkgs); i++) {
+
+ i = n_array_bsearch_idx(iset->pkgs, pkg);
+ if (i >= 0) {
struct pkg *p = n_array_nth(iset->pkgs, i);
- if (pkg_cmp_name_evr(p, pkg) == 0) {
- if (!poldek_conf_MULTILIB)
- break;
-
- if (pkg_cmp_arch(p, pkg) == 0)
- break;
- }
- }
+
+ n_assert(pkg_cmp_name_evr(p, pkg) == 0);
+
+ if (poldek_conf_MULTILIB)
+ n_assert(pkg_cmp_arch(p, pkg) == 0);
- if (i < n_array_size(iset->pkgs)) /* found */
n_array_remove_nth(iset->pkgs, i);
+ /* recreate pkgs_by_recno (cheaper than manually find item to remove) */
+ n_array_free(iset->pkgs_by_recno);
+ iset->pkgs_by_recno = n_array_dup(iset->pkgs, (tn_fn_dup)pkg_link);
+ n_array_ctl_set_cmpfn(iset->pkgs_by_recno, (tn_fn_cmp)pkg_cmp_recno);
+ }
+
n_assert(!iset_has_pkg(iset, pkg));
return 1;
}
-int iset_has_pkg_recno(struct iset *iset, int recno)
+int iset_has_pkg(struct iset *iset, const struct pkg *pkg)
{
- struct pkg tmpkg;
- tmpkg.recno = recno;
- return n_array_bsearch(iset->pkgs, &tmpkg) != NULL;
+ return iset_ismarkedf(iset, pkg, PKGMARK_ISET);
}
-int iset_has_pkg(struct iset *iset, const struct pkg *pkg)
+struct pkg *iset_has_kind_of_pkg(struct iset *iset, const struct pkg *pkg)
{
int i;
+
+ i = n_array_bsearch_idx_ex(iset->pkgs, pkg, (tn_fn_cmp)pkg_cmp_name);
+ if (i < 0)
+ return NULL;
- return iset_ismarkedf(iset, pkg, PKGMARK_ISET);
-
- for (i=0; i<n_array_size(iset->pkgs); i++) {
+ for (; i < n_array_size(iset->pkgs); i++) {
struct pkg *p = n_array_nth(iset->pkgs, i);
- if (pkg_cmp_name_evr(p, pkg) == 0) {
- if (poldek_conf_MULTILIB)
- return pkg_cmp_arch(p, pkg) == 0;
- else
- return 1;
- }
+
+ if (pkg_is_kind_of(p, pkg))
+ return p;
+
+ if (n_str_ne(p->name, pkg->name))
+ return NULL;
}
- return 0;
+ return NULL;
}
int iset_provides(struct iset *iset, const struct capreq *cap)
@@ -237,7 +243,6 @@
int i;
printf("iset dump %p: ", iset);
-
for (i=0; i<n_array_size(iset->pkgs); i++) {
struct pkg *pkg = n_array_nth(iset->pkgs, i);
================================================================
Index: poldek/poldek/install3/iset.h
diff -u poldek/poldek/install3/iset.h:1.1 poldek/poldek/install3/iset.h:1.2
--- poldek/poldek/install3/iset.h:1.1 Wed Jan 23 23:56:19 2008
+++ poldek/poldek/install3/iset.h Wed Jan 30 22:29:35 2008
@@ -22,6 +22,9 @@
const struct pkgmark_set *iset_pms(struct iset *iset);
const tn_array *iset_packages(struct iset *iset);
+
+/* return array sorted by package recno */
+const tn_array *iset_packages_by_recno(struct iset *iset);
tn_array *iset_packages_in_install_order(struct iset *iset);
@@ -30,5 +33,6 @@
int iset_provides(struct iset *iset, const struct capreq *cap);
int iset_has_pkg(struct iset *iset, const struct pkg *pkg);
+struct pkg *iset_has_kind_of_pkg(struct iset *iset, const struct pkg *pkg);
#endif
================================================================
Index: poldek/poldek/install3/mark.c
diff -u poldek/poldek/install3/mark.c:1.2 poldek/poldek/install3/mark.c:1.3
--- poldek/poldek/install3/mark.c:1.2 Sun Jan 27 19:30:15 2008
+++ poldek/poldek/install3/mark.c Wed Jan 30 22:29:35 2008
@@ -69,7 +69,7 @@
rc = i3_is_pkg_installable(ictx->ts, pkg,
pkg_is_marked_i(ictx->ts->pms, pkg));
if (rc <= 0) {
- ictx->abort = 1;
+ i3_stop_processing(ictx, 1);
return 0;
}
================================================================
Index: poldek/poldek/install3/obsoletes.c
diff -u poldek/poldek/install3/obsoletes.c:1.2 poldek/poldek/install3/obsoletes.c:1.3
--- poldek/poldek/install3/obsoletes.c:1.2 Sun Jan 27 19:36:06 2008
+++ poldek/poldek/install3/obsoletes.c Wed Jan 30 22:29:35 2008
@@ -87,7 +87,7 @@
}
#endif
n = pkgdb_q_what_requires(db, orphaned, cap,
- iset_packages(ictx->unset),
+ iset_packages_by_recno(ictx->unset),
ldflags, ma_flags);
norphaned += n;
trace(indent + 1, "%s: %d package(s) orphaned", capreq_snprintf_s(cap), n);
@@ -217,7 +217,7 @@
getflags |= PKGDB_GETF_OBSOLETEDBY_REV;
- obsoleted = get_obsoletedby_pkg(db, iset_packages(unset), pkg,
+ obsoleted = get_obsoletedby_pkg(db, iset_packages_by_recno(unset), pkg,
getflags, PKG_LDWHOLE_FLDEPDIRS);
n = obsoleted ? n_array_size(obsoleted) : 0;
@@ -306,7 +306,7 @@
for (i=0; i < n_array_size(orphans); i++) {
struct orphan *o = n_array_nth(orphans, i);
- i3_process_orphan(indent, ictx, o);
+ i3_process_orphan(indent + 2, ictx, o);
}
}
================================================================
Index: poldek/poldek/install3/process.c
diff -u poldek/poldek/install3/process.c:1.2 poldek/poldek/install3/process.c:1.3
--- poldek/poldek/install3/process.c:1.2 Sun Jan 27 19:33:34 2008
+++ poldek/poldek/install3/process.c Wed Jan 30 22:29:35 2008
@@ -88,7 +88,7 @@
{
int rc = 1;
- trace(indent, "PROCESS %s as NEW", pkg_id(i3pkg->pkg));
+ trace(indent, "DOPROCESS %s as NEW", pkg_id(i3pkg->pkg));
n_assert(!pkg_isset_mf(ictx->processed, i3pkg->pkg, PKGMARK_GRAY));
pkg_set_mf(ictx->processed, i3pkg->pkg, PKGMARK_GRAY);
@@ -131,8 +131,7 @@
{
struct i3pkg *i3pkg = i3pkg_new(pkg, 0, NULL, NULL, I3PKGBY_HAND);
- if (ictx->abort || sigint_reached())
- return 0;
+ i3_return_zero_if_stoppped(ictx);
if (pkg_isset_mf(ictx->processed, pkg, PKGMARK_GRAY))
return 1;
@@ -148,13 +147,14 @@
unsigned markflag = PKGMARK_DEP;
struct pkg *pkg = i3pkg->pkg;
int rc;
-
- if (ictx->abort || sigint_reached())
- return 0;
- if (pkg_isset_mf(ictx->processed, pkg, PKGMARK_GRAY))
- return 1;
+ i3_return_zero_if_stoppped(ictx);
+ if (pkg_isset_mf(ictx->processed, pkg, PKGMARK_GRAY)) {
+ tracef(indent, "DONOT PROCESSING %s as NEW", pkg_id(pkg));
+ return 1;
+ }
+
trace(indent, "PROCESS %s as NEW", pkg_id(pkg));
n_assert(!pkg_isset_mf(ictx->processed, pkg, PKGMARK_GRAY));
@@ -184,8 +184,7 @@
int i3_process_orphan(int indent, struct i3ctx *ictx, struct orphan *o)
{
- if (ictx->abort || sigint_reached())
- return 0;
+ i3_return_zero_if_stoppped(ictx);
indent += 2;
trace(indent, "PROCESS %s as ORPHAN", pkg_id(o->pkg));
================================================================
Index: poldek/poldek/install3/requirements.c
diff -u poldek/poldek/install3/requirements.c:1.2 poldek/poldek/install3/requirements.c:1.3
--- poldek/poldek/install3/requirements.c:1.2 Sun Jan 27 19:33:34 2008
+++ poldek/poldek/install3/requirements.c Wed Jan 30 22:29:35 2008
@@ -144,10 +144,10 @@
if (ictx->ts->getop(ictx->ts, POLDEK_OP_OBSOLETES)) {
/* anybody provides, or obsoletes me? */
p = find_successor_by(indent, ictx, pkg, PS_SEARCH_CAP);
- if (p == NULL)
+ if (p == NULL) {
p = find_successor_by(indent, ictx, pkg, PS_SEARCH_OBSL);
-
- by_obsoletes = 1;
+ by_obsoletes = 1;
+ }
}
}
@@ -171,31 +171,56 @@
static int try_to_upgrade_orphan(int indent, struct i3ctx *ictx,
- struct pkg *pkg, struct capreq *req)
+ struct pkg *pkg, struct capreq *req,
+ const struct pkg *req_satisfier)
{
struct successor succ;
- struct pkg *p;
+ struct pkg *sucpkg;
+ char *message = NULL;
int install = 0;
-
- tracef(indent, "%s req: %s\n", pkg_id(pkg), capreq_snprintf_s(req));
-
- if ((p = find_successor(indent, ictx, pkg, &succ)) == NULL)
- return 0;
- /* already in inset or will be there soon */
- if (i3_is_marked(ictx, p) || pkg_is_marked_i(ictx->ts->pms, p))
- install = 1;
+ tracef(indent, "%s req: %s (satisfied=%s)", pkg_id(pkg),
+ capreq_stra(req), req_satisfier ? "yes": "no");
- else if (succ.by_obsoletes && !i3_is_marked(ictx, p))
+ if ((sucpkg = find_successor(indent + 2, ictx, pkg, &succ)) == NULL) {
+ if (!req_satisfier) {
+ /* no successor and unmet req => pkg is candidate to be removed */
+ ;
+ }
+ return 0;
+ }
+
+ /* already in inset or will be there soon */
+ if (i3_is_marked(ictx, sucpkg) || pkg_is_marked_i(ictx->ts->pms, sucpkg)) {
+ message = "already marked";
install = 1;
-
- else if (ictx->ts->getop(ictx->ts, POLDEK_OP_GREEDY)) {
- n_assert(!i3_is_marked(ictx, p));
+ goto l_end;
+ }
+
+ if (pkg_requires_cap(sucpkg, req)) {
+ message = "successor requires req too";
+ install = 0;
+
+ } else {
+ if (succ.by_obsoletes)
+ message = "by Obsoletes tag";
+
+ else if (ictx->ts->getop(ictx->ts, POLDEK_OP_GREEDY))
+ message = "upgrade resolves req";
+
install = 1;
}
- if (install) {
- struct i3pkg *i3tomark = i3pkg_new(p, 0, pkg, req, I3PKGBY_GREEDY);
+l_end:
+ if (!install) {
+ tracef(indent, "- %s: do not upgrading orphan%s%s%s", pkg_id(sucpkg),
+ message ? " (":"", message ? message:"", message ? ")":"");
+
+ } else {
+ struct i3pkg *i3tomark = i3pkg_new(sucpkg, 0, pkg, req, I3PKGBY_GREEDY);
+
+ n_assert(message);
+ tracef(indent, "- %s: upgrading orphan (%s)", pkg_id(sucpkg), message);
i3_process_package(indent, ictx, i3tomark);
}
@@ -204,16 +229,17 @@
static int process_orphan_req(int indent, struct i3ctx *ictx,
- struct pkg *pkg, struct capreq *req)
+ struct pkg *pkg, struct capreq *req)
+
{
struct poldek_ts *ts = ictx->ts; /* just for short */
- struct pkg *tomark = NULL;
+ struct pkg *tomark = NULL, *toremove = NULL;
tn_array *candidates = NULL;
- char *strreq;
- int rc = 1, indentt = indent + 1;
+ const char *strreq;
+ int rc = 1, giveup = 0, indentt = indent + 1;
- capreq_stra(req, &strreq);
- tracef(indent, "%s, req: %s", pkg_id(pkg), strreq);
+ strreq = capreq_stra(req);
+ tracef(indent, "%s, req: %s (%s)", pkg_id(pkg), capreq_snprintf_s(req), strreq);
/* skip foreign (not provided by uninstalled) dependencies */
if (!iset_provides(ictx->unset, req)) {
@@ -239,23 +265,31 @@
msgn_i(3, indent, "%s: satisfied by db", strreq);
goto l_end;
}
-
+
/* try upgrade orphan */
if (ts->getop(ts, POLDEK_OP_GREEDY)) {
- if (try_to_upgrade_orphan(indentt, ictx, pkg, req))
+ if (try_to_upgrade_orphan(indentt + 1, ictx, pkg, req, tomark))
goto l_end;
}
+ if (tomark && (toremove = iset_has_kind_of_pkg(ictx->unset, tomark))) {
+ tracef(indent, "%s is marked for removal (%s)", pkg_id(tomark),
+ pkg_id(toremove));
+ giveup = 1;
+ i3_stop_processing(ictx, 1); /* loop, stop processing */
+ }
+
if (n_array_size(candidates) == 0)
n_array_cfree(&candidates);
else /* if they exists, must be more than one */
n_assert(n_array_size(candidates) > 1);
- trace(indentt, "- %s: %s candidate is %s", pkg_id(pkg), strreq,
- tomark ? pkg_id(tomark) : "(null)");
+ trace(indentt, "- %s: %s candidate is %s (installable=%s)", pkg_id(pkg),
+ strreq, tomark ? pkg_id(tomark) : "none",
+ toremove ? "no" : tomark ? "yes" : "-");
/* to-mark candidates */
- if (tomark && ts->getop(ts, POLDEK_OP_FOLLOW)) {
+ if (tomark && toremove == NULL && ts->getop(ts, POLDEK_OP_FOLLOW)) {
struct pkg *real_tomark = tomark;
struct i3pkg *i3tomark;
@@ -263,7 +297,7 @@
real_tomark = i3_choose_equiv(ts, req, candidates, tomark);
if (real_tomark == NULL) { /* user abort */
- ictx->abort = 1;
+ i3_stop_processing(ictx, 1);
rc = 0;
goto l_end;
}
@@ -273,10 +307,14 @@
i3_process_package(indent, ictx, i3tomark);
goto l_end;
}
-
+
/* unresolved req */
- i3_error(ictx, pkg, I3ERR_REQUIREDBY,
- _("%s is required by %s"), strreq, pkg_id(pkg));
+ if (giveup)
+ i3_error(ictx, pkg, I3ERR_REQUIREDBY,
+ _("%s is required by %s, give up"), strreq, pkg_id(pkg));
+ else
+ i3_error(ictx, pkg, I3ERR_REQUIREDBY, _("%s is required by %s"),
+ strreq, pkg_id(pkg));
l_end:
n_array_cfree(&candidates);
@@ -315,6 +353,7 @@
}
process_orphan_req(indent, ictx, pkg, req);
+ i3_return_zero_if_stoppped(ictx);
}
return 1;
@@ -340,11 +379,11 @@
struct poldek_ts *ts = ictx->ts; /* just for short */
struct pkg *pkg, *tomark = NULL;
tn_array *candidates = NULL;
- char *strreq, *errfmt;
+ const char *strreq, *errfmt;
int rc = 1, indentt = indent + 1;
pkg = i3pkg->pkg;
- capreq_stra(req, &strreq);
+ strreq = capreq_stra(req);
tracef(indent, "%s, req: %s", pkg_id(pkg), strreq);
================================================================
---- CVS-web:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/install3/conflicts.c?r1=1.2&r2=1.3&f=u
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/install3/ictx.c?r1=1.1&r2=1.2&f=u
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/install3/ictx.h?r1=1.1&r2=1.2&f=u
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/install3/install.c?r1=1.1&r2=1.2&f=u
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/install3/iset.c?r1=1.2&r2=1.3&f=u
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/install3/iset.h?r1=1.1&r2=1.2&f=u
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/install3/mark.c?r1=1.2&r2=1.3&f=u
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/install3/obsoletes.c?r1=1.2&r2=1.3&f=u
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/install3/process.c?r1=1.2&r2=1.3&f=u
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/install3/requirements.c?r1=1.2&r2=1.3&f=u
More information about the pld-cvs-commit
mailing list