@@ -169,6 +169,40 @@ find_repo(const char *name, Pool *pool, struct repoinfo *repoinfos, int nrepoinf
169169 return 0 ;
170170}
171171
172+ static int
173+ selection_alldeps (Pool * pool , Queue * selection , const char * name , int flags , int keyname , int marker )
174+ {
175+ int i , j , r ;
176+ Queue pkgs , q ;
177+
178+ queue_empty (selection );
179+ queue_init (& q );
180+ r = selection_make (pool , & q , name , flags );
181+ if (!q .count )
182+ {
183+ queue_free (& q );
184+ return 0 ;
185+ }
186+ queue_init (& pkgs );
187+ selection_solvables (pool , & q , & pkgs );
188+ for (i = 0 ; i < pkgs .count ; i ++ )
189+ {
190+ queue_empty (& q );
191+ pool_whatmatchessolvable (pool , keyname , pkgs .elements [i ], & q , marker );
192+ for (j = 0 ; j < q .count ; j ++ )
193+ if (q .elements [j ] != pkgs .elements [i ])
194+ queue_pushunique (selection , q .elements [j ]);
195+ }
196+ queue_free (& q );
197+ j = selection -> count ;
198+ queue_insertn (selection , 0 , j , 0 );
199+ for (i = 0 ; i < j ; i ++ )
200+ {
201+ selection -> elements [2 * i ] = SOLVER_SOLVABLE | SOLVER_NOAUTOSET ;
202+ selection -> elements [2 * i + 1 ] = selection -> elements [i + j ];
203+ }
204+ return j ? r : 0 ;
205+ }
172206
173207#define MODE_LIST 0
174208#define MODE_INSTALL 1
@@ -227,6 +261,7 @@ main(int argc, char **argv)
227261 char * rootdir = 0 ;
228262 char * keyname = 0 ;
229263 int keyname_depstr = 0 ;
264+ int keyname_alldeps = 0 ; /* dnf repoquesy --alldeps */
230265 int debuglevel = 0 ;
231266 int answer , acnt = 0 ;
232267 char * testcase = 0 ;
@@ -316,9 +351,15 @@ main(int argc, char **argv)
316351 argc -- ;
317352 argv ++ ;
318353 }
354+ else if (argc > 1 && !strcmp (argv [1 ], "--alldeps" ))
355+ {
356+ keyname_alldeps = 1 ; /* dnf repoquesy --alldeps */
357+ argc -- ;
358+ argv ++ ;
359+ }
319360 else if (argc > 1 && !strcmp (argv [1 ], "--depstr" ))
320361 {
321- keyname_depstr = 1 ;
362+ keyname_depstr = 1 ; /* do literal matching instead of dep intersection */
322363 argc -- ;
323364 argv ++ ;
324365 }
@@ -541,6 +582,8 @@ main(int argc, char **argv)
541582 flags |= SELECTION_MATCH_DEPSTR ;
542583 if (!keyname )
543584 rflags = selection_make (pool , & job2 , argv [i ], flags );
585+ else if (keyname_alldeps )
586+ rflags = selection_alldeps (pool , & job2 , argv [i ], flags , pool_str2id (pool , keyname , 1 ), 0 );
544587 else
545588 rflags = selection_make_matchdeps (pool , & job2 , argv [i ], flags , pool_str2id (pool , keyname , 1 ), 0 );
546589 if (repofilter .count )
@@ -554,6 +597,8 @@ main(int argc, char **argv)
554597 flags |= SELECTION_NOCASE ;
555598 if (!keyname )
556599 rflags = selection_make (pool , & job2 , argv [i ], flags );
600+ else if (keyname_alldeps )
601+ rflags = selection_alldeps (pool , & job2 , argv [i ], flags , pool_str2id (pool , keyname , 1 ), 0 );
557602 else
558603 rflags = selection_make_matchdeps (pool , & job2 , argv [i ], flags , pool_str2id (pool , keyname , 1 ), 0 );
559604 if (repofilter .count )
0 commit comments