@@ -83,6 +83,9 @@ def parse_args():
8383 parser .add_argument (
8484 '--continue-on-fail' , '-C' , action = 'store_true' , default = False ,
8585 help = 'Continue with other installs when one fails' )
86+ parser .add_argument (
87+ '--freeze-outdated-packages' , action = 'store_true' , default = False ,
88+ help = 'Freeze all outdated packages to "requirements.txt" before upgrading them' )
8689 return parser .parse_known_args ()
8790
8891
@@ -166,8 +169,14 @@ def ask(self, prompt):
166169ask_to_install = partial (InteractiveAsker ().ask , prompt = 'Upgrade now?' )
167170
168171
169- def update_packages (packages , forwarded , continue_on_fail ):
172+ def update_packages (packages , forwarded , continue_on_fail , freeze_outdated_packages ):
170173 upgrade_cmd = pip_cmd () + ['install' , '-U' ] + forwarded
174+
175+ if freeze_outdated_packages :
176+ with open ('requirements.txt' , 'w' ) as f :
177+ for pkg in packages :
178+ f .write ('{0}=={1}\n ' .format (pkg ['name' ], pkg ['version' ]))
179+
171180 if not continue_on_fail :
172181 upgrade_cmd += ['{0}' .format (pkg ['name' ]) for pkg in packages ]
173182 subprocess .call (upgrade_cmd , stdout = sys .stdout , stderr = sys .stderr )
@@ -232,7 +241,7 @@ def main():
232241 if not outdated and not args .raw :
233242 logger .info ('Everything up-to-date' )
234243 elif args .auto :
235- update_packages (outdated , install_args , args .continue_on_fail )
244+ update_packages (outdated , install_args , args .continue_on_fail , args . freeze_outdated_packages )
236245 elif args .raw :
237246 for pkg in outdated :
238247 logger .info ('{0}=={1}' .format (pkg ['name' ], pkg ['latest_version' ]))
@@ -247,7 +256,7 @@ def main():
247256 if answer in ['y' , 'a' ]:
248257 selected .append (pkg )
249258 if selected :
250- update_packages (selected , install_args , args .continue_on_fail )
259+ update_packages (selected , install_args , args .continue_on_fail , args . freeze_outdated_packages )
251260
252261
253262if __name__ == '__main__' :
0 commit comments