View | Details | Raw Unified | Return to bug 57789
Collapse All | Expand All

(-)a/apt-pkg/cachefile.cc (-16 / +120 lines)
Lines 1295-1300 void Stats(std::ostream &out, std::ostream &l_c3out, pkgDepCache &Dep, pkgDepCac Link Here
1295
   }
1295
   }
1296
}
1296
}
1297
									/*}}}*/
1297
									/*}}}*/
1298
// IsVirtualPackage - Check if package is virtual (no versions, has providers)	/*{{{*/
1299
// ---------------------------------------------------------------------
1300
/* Virtual packages have no actual versions but are provided by other packages */
1301
static inline bool IsVirtualPackage(pkgCache::PkgIterator const &Pkg)
1302
{
1303
   return (Pkg->VersionList == 0) && (Pkg->ProvidesList != 0);
1304
}
1305
									/*}}}*/
1306
// GetInstalledProviders - Get installed providers of a virtual package	/*{{{*/
1307
// ---------------------------------------------------------------------
1308
/* Returns list of all installed packages that provide the given virtual pkg */
1309
static std::vector<pkgCache::PkgIterator> GetInstalledProviders(
1310
   pkgCache::PkgIterator const &VirtualPkg,
1311
   pkgDepCache &Dep)
1312
{
1313
   std::vector<pkgCache::PkgIterator> Providers;
1314
1315
   for (pkgCache::PrvIterator Prv = VirtualPkg.ProvidesList();
1316
        not Prv.end(); ++Prv)
1317
   {
1318
      pkgCache::PkgIterator Provider = Prv.OwnerPkg();
1319
      if ((Provider->CurrentState == pkgCache::State::Installed) ||
1320
          Dep[Provider].Install())
1321
      {
1322
         Providers.push_back(Provider);
1323
      }
1324
   }
1325
1326
   return Providers;
1327
}
1298
1328
1299
bool pkgDoAuto(std::ostream &c1out, const CommandLine &CmdL, int &auto_mark_changed, pkgDepCache &Dep)
1329
bool pkgDoAuto(std::ostream &c1out, const CommandLine &CmdL, int &auto_mark_changed, pkgDepCache &Dep)
1300
{
1330
{
Lines 1309-1348 bool pkgDoAuto(std::ostream &c1out, const CommandLine &CmdL, int &auto_mark_chan Link Here
1309
   for (const char **I = CmdL.FileList + 1; *I != 0; ++I)
1339
   for (const char **I = CmdL.FileList + 1; *I != 0; ++I)
1310
   {
1340
   {
1311
      auto pkgiter = Dep.FindPkg(*I);
1341
      auto pkgiter = Dep.FindPkg(*I);
1312
      if (!pkgiter.end())
1342
      if (pkgiter.end())
1343
      {
1344
         continue;
1345
      }
1346
1347
      // Handle virtual packages: apply to all installed providers
1348
      if (IsVirtualPackage(pkgiter))
1313
      {
1349
      {
1314
         if ((pkgiter->CurrentState == pkgCache::State::NotInstalled) && (!Dep[pkgiter].NewInstall()))
1350
         std::vector<pkgCache::PkgIterator> Providers = GetInstalledProviders(pkgiter, Dep);
1351
1352
         if (Providers.empty())
1315
         {
1353
         {
1316
            ioprintf(c1out, _("%s can not be marked as it is not installed.\n"), pkgiter.Name());
1354
            ioprintf(c1out, _("%s is a virtual package with no installed providers.\n"), pkgiter.Name());
1317
            continue;
1355
            continue;
1318
         }
1356
         }
1319
1357
1320
         else if (((Dep[pkgiter].Flags & pkgCache::Flag::Auto) == pkgCache::Flag::Auto) == MarkAuto)
1358
         // Apply to each installed provider
1359
         for (auto const &Provider : Providers)
1321
         {
1360
         {
1361
            if (((Dep[Provider].Flags & pkgCache::Flag::Auto) == pkgCache::Flag::Auto) == MarkAuto)
1362
            {
1363
               if (!MarkAuto)
1364
               {
1365
                  ioprintf(c1out, _("%s (provider of %s) was already set to manually installed.\n"),
1366
                           Provider.Name(), pkgiter.Name());
1367
               }
1368
               else
1369
               {
1370
                  ioprintf(c1out, _("%s (provider of %s) was already set to automatically installed.\n"),
1371
                           Provider.Name(), pkgiter.Name());
1372
               }
1373
               continue;
1374
            }
1375
1322
            if (!MarkAuto)
1376
            if (!MarkAuto)
1323
            {
1377
            {
1324
               ioprintf(c1out,_("%s was already set to manually installed.\n"), pkgiter.Name());
1378
               ioprintf(c1out, _("%s (provider of %s) set to manually installed.\n"),
1379
                        Provider.Name(), pkgiter.Name());
1325
            }
1380
            }
1326
            else
1381
            else
1327
            {
1382
            {
1328
               ioprintf(c1out,_("%s was already set to automatically installed.\n"), pkgiter.Name());
1383
               ioprintf(c1out, _("%s (provider of %s) set to automatically installed.\n"),
1384
                        Provider.Name(), pkgiter.Name());
1329
            }
1385
            }
1330
1386
1331
            continue;
1387
            Dep.MarkAuto(Provider, MarkAuto ? pkgDepCache::AutoMarkFlag::Auto : pkgDepCache::AutoMarkFlag::Manual);
1388
            ++AutoMarkChanged;
1332
         }
1389
         }
1390
         continue;
1391
      }
1333
1392
1393
      // Handle real packages (existing logic)
1394
      if ((pkgiter->CurrentState == pkgCache::State::NotInstalled) && (!Dep[pkgiter].NewInstall()))
1395
      {
1396
         ioprintf(c1out, _("%s can not be marked as it is not installed.\n"), pkgiter.Name());
1397
         continue;
1398
      }
1399
1400
      if (((Dep[pkgiter].Flags & pkgCache::Flag::Auto) == pkgCache::Flag::Auto) == MarkAuto)
1401
      {
1334
         if (!MarkAuto)
1402
         if (!MarkAuto)
1335
         {
1403
         {
1336
            ioprintf(c1out,_("%s set to manually installed.\n"), pkgiter.Name());
1404
            ioprintf(c1out,_("%s was already set to manually installed.\n"), pkgiter.Name());
1337
         }
1405
         }
1338
         else
1406
         else
1339
         {
1407
         {
1340
            ioprintf(c1out,_("%s set to automatically installed.\n"), pkgiter.Name());
1408
            ioprintf(c1out,_("%s was already set to automatically installed.\n"), pkgiter.Name());
1341
         }
1409
         }
1342
1410
1343
         Dep.MarkAuto(pkgiter, MarkAuto ? pkgDepCache::AutoMarkFlag::Auto : pkgDepCache::AutoMarkFlag::Manual);
1411
         continue;
1344
         ++AutoMarkChanged;
1345
      }
1412
      }
1413
1414
      if (!MarkAuto)
1415
      {
1416
         ioprintf(c1out,_("%s set to manually installed.\n"), pkgiter.Name());
1417
      }
1418
      else
1419
      {
1420
         ioprintf(c1out,_("%s set to automatically installed.\n"), pkgiter.Name());
1421
      }
1422
1423
      Dep.MarkAuto(pkgiter, MarkAuto ? pkgDepCache::AutoMarkFlag::Auto : pkgDepCache::AutoMarkFlag::Manual);
1424
      ++AutoMarkChanged;
1346
   }
1425
   }
1347
1426
1348
   auto_mark_changed = AutoMarkChanged;
1427
   auto_mark_changed = AutoMarkChanged;
Lines 1394-1415 bool pkgDoShowAuto(std::ostream &cout, const CommandLine &CmdL, pkgDepCache &Dep Link Here
1394
      for (const char **I = CmdL.FileList + 1; *I != 0; ++I)
1473
      for (const char **I = CmdL.FileList + 1; *I != 0; ++I)
1395
      {
1474
      {
1396
         auto pkgiter = Dep.FindPkg(*I);
1475
         auto pkgiter = Dep.FindPkg(*I);
1397
         if (!pkgiter.end())
1476
         if (pkgiter.end())
1477
         {
1478
            continue;
1479
         }
1480
1481
         // Handle virtual packages: show state of all installed providers
1482
         if (IsVirtualPackage(pkgiter))
1398
         {
1483
         {
1399
            if ((pkgiter->CurrentState == pkgCache::State::Installed) || (Dep[pkgiter].Install()))
1484
            std::vector<pkgCache::PkgIterator> Providers = GetInstalledProviders(pkgiter, Dep);
1485
1486
            for (auto const &Provider : Providers)
1400
            {
1487
            {
1401
               bool current_state_is_auto = ((Dep[pkgiter].Flags & pkgCache::Flag::Auto) == pkgCache::Flag::Auto);
1488
               bool current_state_is_auto = ((Dep[Provider].Flags & pkgCache::Flag::Auto) == pkgCache::Flag::Auto);
1402
               if (ShowState)
1489
               if (ShowState)
1403
               {
1490
               {
1404
                  std::stringstream str;
1491
                  std::stringstream str;
1405
                  str << pkgiter.Name() << " " << (current_state_is_auto ? "auto" : "manual");
1492
                  str << Provider.Name() << " " << (current_state_is_auto ? "auto" : "manual");
1406
                  packages.push_back(str.str());
1493
                  packages.push_back(str.str());
1407
               }
1494
               }
1408
               else if (current_state_is_auto == ShowAuto)
1495
               else if (current_state_is_auto == ShowAuto)
1409
               {
1496
               {
1410
                  packages.push_back(pkgiter.Name());
1497
                  packages.push_back(Provider.Name());
1411
               }
1498
               }
1412
            }
1499
            }
1500
            continue;
1501
         }
1502
1503
         // Handle real packages (existing logic)
1504
         if ((pkgiter->CurrentState == pkgCache::State::Installed) || (Dep[pkgiter].Install()))
1505
         {
1506
            bool current_state_is_auto = ((Dep[pkgiter].Flags & pkgCache::Flag::Auto) == pkgCache::Flag::Auto);
1507
            if (ShowState)
1508
            {
1509
               std::stringstream str;
1510
               str << pkgiter.Name() << " " << (current_state_is_auto ? "auto" : "manual");
1511
               packages.push_back(str.str());
1512
            }
1513
            else if (current_state_is_auto == ShowAuto)
1514
            {
1515
               packages.push_back(pkgiter.Name());
1516
            }
1413
         }
1517
         }
1414
      }
1518
      }
1415
   }
1519
   }

Return to bug 57789