aboutsummaryrefslogtreecommitdiff
path: root/bpkg/pkg-disfigure.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-10-06 08:43:01 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-10-06 08:43:01 +0200
commitfd2c0dc9707714d82580dc61854efc06335e6091 (patch)
tree2ad76b0dad17b244c183405b02fa9138d0407e8d /bpkg/pkg-disfigure.cxx
parenta23e8ac5de6170a4a82a2ac475aff707d5accbf6 (diff)
Track prerequisite packages, handle in pkg-{con,dis}figure
Diffstat (limited to 'bpkg/pkg-disfigure.cxx')
-rw-r--r--bpkg/pkg-disfigure.cxx31
1 files changed, 30 insertions, 1 deletions
diff --git a/bpkg/pkg-disfigure.cxx b/bpkg/pkg-disfigure.cxx
index 6c357f4..a3d0336 100644
--- a/bpkg/pkg-disfigure.cxx
+++ b/bpkg/pkg-disfigure.cxx
@@ -21,11 +21,40 @@ namespace bpkg
transaction& t,
const shared_ptr<package>& p)
{
+ assert (p->state == state::configured || p->state == state::broken);
+
tracer trace ("pkg_disfigure");
database& db (t.database ());
tracer_guard tg (db, trace);
+ // Check that we have no dependents.
+ //
+ if (p->state == state::configured)
+ {
+ using query = query<package_dependents>;
+
+ auto r (db.query<package_dependents> (query::name == p->name));
+
+ if (!r.empty ())
+ {
+ diag_record dr;
+ dr << fail << "package " << p->name << " still has dependencies:";
+
+ for (const package_dependents& pd: r)
+ {
+ dr << info << "package " << pd.name;
+
+ if (pd.constraint)
+ dr << " on " << p->name << " " << *pd.constraint;
+ }
+ }
+ }
+
+ // Since we are no longer configured, clear the prerequisites list.
+ //
+ p->prerequisites.clear ();
+
// Calculate package's src_root and out_root.
//
assert (p->src_root); // Must be set since unpacked.
@@ -43,7 +72,7 @@ namespace bpkg
//
string bspec;
- if (p->state != state::broken)
+ if (p->state == state::configured)
{
bspec = "clean(" + out_root.string () + "/) "
"disfigure(" + out_root.string () + "/)";