36
36
class InstallRequirement (object ):
37
37
38
38
def __init__ (self , req , comes_from , source_dir = None , editable = False ,
39
- url = None , as_egg = False , update = True ):
39
+ url = None , as_egg = False , update = True , upgrade = False ):
40
40
self .extras = ()
41
41
if isinstance (req , string_types ):
42
42
req = pkg_resources .Requirement .parse (req )
@@ -58,29 +58,32 @@ def __init__(self, req, comes_from, source_dir=None, editable=False,
58
58
self ._is_bundle = None
59
59
# True if the editable should be updated:
60
60
self .update = update
61
+ # True if the requirement should be upgraded to the latest version
62
+ self .upgrade = upgrade
61
63
# Set to True after successful installation
62
64
self .install_succeeded = None
63
65
# UninstallPathSet of uninstalled distribution (for possible rollback)
64
66
self .uninstalled = None
65
67
self .use_user_site = False
66
68
67
69
@classmethod
68
- def from_editable (cls , editable_req , comes_from = None , default_vcs = None ):
70
+ def from_editable (cls , editable_req , comes_from = None , default_vcs = None , upgrade = False ):
69
71
name , url , extras_override = parse_editable (editable_req , default_vcs )
70
72
if url .startswith ('file:' ):
71
73
source_dir = url_to_path (url )
72
74
else :
73
75
source_dir = None
74
76
75
- res = cls (name , comes_from , source_dir = source_dir , editable = True , url = url )
77
+ res = cls (name , comes_from , source_dir = source_dir , editable = True ,
78
+ url = url , upgrade = upgrade )
76
79
77
80
if extras_override is not None :
78
81
res .extras = extras_override
79
82
80
83
return res
81
84
82
85
@classmethod
83
- def from_line (cls , name , comes_from = None ):
86
+ def from_line (cls , name , comes_from = None , upgrade = False ):
84
87
"""Creates an InstallRequirement from a name, which might be a
85
88
requirement, directory containing 'setup.py', filename, or URL.
86
89
"""
@@ -114,7 +117,7 @@ def from_line(cls, name, comes_from=None):
114
117
else :
115
118
req = name
116
119
117
- return cls (req , comes_from , url = url )
120
+ return cls (req , comes_from , url = url , upgrade = upgrade )
118
121
119
122
def __str__ (self ):
120
123
if self .req :
@@ -706,7 +709,7 @@ def is_bundle(self):
706
709
or os .path .exists (os .path .join (base , 'pyinstall-manifest.txt' )))
707
710
return self ._is_bundle
708
711
709
- def bundle_requirements (self ):
712
+ def bundle_requirements (self , upgrade = False ):
710
713
for dest_dir in self ._bundle_editable_dirs :
711
714
package = os .path .basename (dest_dir )
712
715
## FIXME: svnism:
@@ -726,13 +729,11 @@ def bundle_requirements(self):
726
729
else :
727
730
url = None
728
731
yield InstallRequirement (
729
- package , self , editable = True , url = url ,
730
- update = False , source_dir = dest_dir )
732
+ package , self , editable = True , url = url , update = False ,
733
+ source_dir = dest_dir , upgrade = upgrade )
731
734
for dest_dir in self ._bundle_build_dirs :
732
735
package = os .path .basename (dest_dir )
733
- yield InstallRequirement (
734
- package , self ,
735
- source_dir = dest_dir )
736
+ yield InstallRequirement (package , self , source_dir = dest_dir , upgrade = upgrade )
736
737
737
738
def move_bundle_files (self , dest_build_dir , dest_src_dir ):
738
739
base = self ._temp_build_dir
@@ -808,13 +809,15 @@ def __repr__(self):
808
809
class RequirementSet (object ):
809
810
810
811
def __init__ (self , build_dir , src_dir , download_dir , download_cache = None ,
811
- upgrade = False , ignore_installed = False , as_egg = False ,
812
- ignore_dependencies = False , force_reinstall = False , use_user_site = False ):
812
+ ignore_installed = False , as_egg = False , force_reinstall = False ,
813
+ ignore_dependencies = False , use_user_site = False , upgrade = False ,
814
+ upgrade_recursive = False ):
813
815
self .build_dir = build_dir
814
816
self .src_dir = src_dir
815
817
self .download_dir = download_dir
816
818
self .download_cache = download_cache
817
- self .upgrade = upgrade
819
+ self .upgrade = upgrade or upgrade_recursive
820
+ self .upgrade_recursive = upgrade_recursive
818
821
self .ignore_installed = ignore_installed
819
822
self .force_reinstall = force_reinstall
820
823
self .requirements = Requirements ()
@@ -908,15 +911,19 @@ def locate_files(self):
908
911
if not self .ignore_installed and not req_to_install .editable :
909
912
req_to_install .check_if_exists ()
910
913
if req_to_install .satisfied_by :
911
- if self .upgrade :
914
+ if req_to_install .upgrade :
912
915
req_to_install .conflicts_with = req_to_install .satisfied_by
913
916
req_to_install .satisfied_by = None
914
917
else :
915
918
install_needed = False
916
919
if req_to_install .satisfied_by :
920
+ if self .upgrade and not self .upgrade_recursive :
921
+ upgrade_cmd = '--upgrade-recursive'
922
+ else :
923
+ upgrade_cmd = '--upgrade'
917
924
logger .notify ('Requirement already satisfied '
918
- '(use --upgrade to upgrade): %s'
919
- % req_to_install )
925
+ '(use %s to upgrade): %s'
926
+ % ( upgrade_cmd , req_to_install ) )
920
927
921
928
if req_to_install .editable :
922
929
if req_to_install .source_dir is None :
@@ -946,11 +953,11 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
946
953
if not self .ignore_installed and not req_to_install .editable :
947
954
req_to_install .check_if_exists ()
948
955
if req_to_install .satisfied_by :
949
- if self .upgrade :
956
+ if req_to_install .upgrade :
950
957
if not self .force_reinstall and not req_to_install .url :
951
958
try :
952
959
url = finder .find_requirement (
953
- req_to_install , self . upgrade )
960
+ req_to_install , upgrade = True )
954
961
except BestVersionAlreadyInstalled :
955
962
best_installed = True
956
963
install = False
@@ -970,9 +977,13 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
970
977
logger .notify ('Requirement already up-to-date: %s'
971
978
% req_to_install )
972
979
else :
980
+ if self .upgrade and not self .upgrade_recursive :
981
+ upgrade_cmd = '--upgrade-recursive'
982
+ else :
983
+ upgrade_cmd = '--upgrade'
973
984
logger .notify ('Requirement already satisfied '
974
- '(use --upgrade to upgrade): %s'
975
- % req_to_install )
985
+ '(use %s to upgrade): %s'
986
+ % ( upgrade_cmd , req_to_install ) )
976
987
if req_to_install .editable :
977
988
logger .notify ('Obtaining %s' % req_to_install )
978
989
elif install :
@@ -1012,7 +1023,7 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
1012
1023
if req_to_install .url is None :
1013
1024
if not_found :
1014
1025
raise not_found
1015
- url = finder .find_requirement (req_to_install , upgrade = self .upgrade )
1026
+ url = finder .find_requirement (req_to_install , upgrade = req_to_install .upgrade )
1016
1027
else :
1017
1028
## FIXME: should req_to_install.url already be a link?
1018
1029
url = Link (req_to_install .url )
@@ -1033,7 +1044,7 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
1033
1044
is_bundle = req_to_install .is_bundle
1034
1045
if is_bundle :
1035
1046
req_to_install .move_bundle_files (self .build_dir , self .src_dir )
1036
- for subreq in req_to_install .bundle_requirements ():
1047
+ for subreq in req_to_install .bundle_requirements (upgrade = self . upgrade_recursive ):
1037
1048
reqs .append (subreq )
1038
1049
self .add_requirement (subreq )
1039
1050
elif self .is_download :
@@ -1057,7 +1068,7 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
1057
1068
# repeat check_if_exists to uninstall-on-upgrade (#14)
1058
1069
req_to_install .check_if_exists ()
1059
1070
if req_to_install .satisfied_by :
1060
- if self .upgrade or self .ignore_installed :
1071
+ if req_to_install .upgrade or self .ignore_installed :
1061
1072
req_to_install .conflicts_with = req_to_install .satisfied_by
1062
1073
req_to_install .satisfied_by = None
1063
1074
else :
@@ -1079,7 +1090,7 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
1079
1090
if self .has_requirement (name ):
1080
1091
## FIXME: check for conflict
1081
1092
continue
1082
- subreq = InstallRequirement (req , req_to_install )
1093
+ subreq = InstallRequirement (req , req_to_install , upgrade = self . upgrade_recursive )
1083
1094
reqs .append (subreq )
1084
1095
self .add_requirement (subreq )
1085
1096
if req_to_install .name not in self .requirements :
@@ -1322,16 +1333,21 @@ def parse_requirements(filename, finder=None, comes_from=None, options=None):
1322
1333
if finder :
1323
1334
finder .index_urls .append (line )
1324
1335
else :
1336
+ # Use getattr since uninstall doesn't set these options
1337
+ upgrade = (getattr (options , 'upgrade' , False )
1338
+ or getattr (options , 'upgrade_recursive' , False ))
1325
1339
comes_from = '-r %s (line %s)' % (filename , line_number )
1326
1340
if line .startswith ('-e' ) or line .startswith ('--editable' ):
1327
1341
if line .startswith ('-e' ):
1328
1342
line = line [2 :].strip ()
1329
1343
else :
1330
1344
line = line [len ('--editable' ):].strip ().lstrip ('=' )
1331
- req = InstallRequirement .from_editable (
1332
- line , comes_from = comes_from , default_vcs = options .default_vcs )
1345
+ req = InstallRequirement .from_editable (line ,
1346
+ comes_from = comes_from ,
1347
+ default_vcs = options .default_vcs ,
1348
+ upgrade = upgrade )
1333
1349
else :
1334
- req = InstallRequirement .from_line (line , comes_from )
1350
+ req = InstallRequirement .from_line (line , comes_from , upgrade = upgrade )
1335
1351
yield req
1336
1352
1337
1353
0 commit comments