@@ -669,6 +669,7 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
669669 queue_init (& iq );
670670 queue_init (& xsuppq );
671671
672+ /* setup userinstalled map and search for special namespace cleandeps erases */
672673 for (i = 0 ; i < job -> count ; i += 2 )
673674 {
674675 how = job -> elements [i ];
@@ -874,46 +875,52 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
874875 }
875876 queue_init_clone (& iqcopy , & iq );
876877
877- if (!unneeded )
878- {
879- if (solv -> cleandeps_updatepkgs )
880- for (i = 0 ; i < solv -> cleandeps_updatepkgs -> count ; i ++ )
881- queue_push (& iq , solv -> cleandeps_updatepkgs -> elements [i ]);
882- }
883-
884878 if (unneeded )
885879 queue_empty (& iq ); /* just in case... */
886880
887- /* clear userinstalled bit for the packages we really want to delete/update */
881+ /* clear userinstalled bits for the packages we really want to delete */
888882 for (i = 0 ; i < iq .count ; i ++ )
889883 {
890884 p = iq .elements [i ];
891- if (pool -> solvables [p ].repo != installed )
892- continue ;
893- MAPCLR (& userinstalled , p - installed -> start );
885+ if (pool -> solvables [p ].repo == installed )
886+ MAPCLR (& userinstalled , p - installed -> start );
887+ }
888+ /* set userinstalled bits for all packages not in the considered map */
889+ if (pool -> considered )
890+ {
891+ for (p = installed -> start ; p < installed -> end ; p ++ )
892+ if (!MAPTST (pool -> considered , p ))
893+ MAPSET (& userinstalled , p - installed -> start ); /* we may not remove those */
894+ }
895+ if (!unneeded && solv -> cleandeps_updatepkgs )
896+ {
897+ /* find update seeds */
898+ queue_init (& updatepkgs_filtered );
899+ find_update_seeds (solv , & updatepkgs_filtered , & userinstalled );
900+ /* clear userinstalled bit for the packages we want to update */
901+ /* also add them to the erase list */
902+ for (i = 0 ; i < solv -> cleandeps_updatepkgs -> count ; i ++ )
903+ {
904+ p = solv -> cleandeps_updatepkgs -> elements [i ];
905+ if (pool -> considered && !MAPTST (pool -> considered , p ))
906+ continue ;
907+ queue_push (& iq , p );
908+ MAPCLR (& userinstalled , p - installed -> start );
909+ }
894910 }
895911
896912 for (p = installed -> start ; p < installed -> end ; p ++ )
897913 {
898914 if (pool -> solvables [p ].repo != installed )
899915 continue ;
900916 MAPSET (& installedm , p );
901- if (pool -> considered && !MAPTST (pool -> considered , p ))
902- MAPSET (& userinstalled , p - installed -> start ); /* we may not remove those */
903917 if (unneeded && !MAPTST (& userinstalled , p - installed -> start ))
904918 continue ;
905919 MAPSET (& im , p );
906920 }
907921 MAPSET (& installedm , SYSTEMSOLVABLE );
908922 MAPSET (& im , SYSTEMSOLVABLE );
909923
910- if (!unneeded && solv -> cleandeps_updatepkgs )
911- {
912- /* find update "seeds" */
913- queue_init (& updatepkgs_filtered );
914- find_update_seeds (solv , & updatepkgs_filtered , & userinstalled );
915- }
916-
917924#ifdef CLEANDEPSDEBUG
918925 printf ("REMOVE PASS\n" );
919926#endif
0 commit comments