38
38
class InstallRequirement (object ):
39
39
40
40
def __init__ (self , req , comes_from , source_dir = None , editable = False ,
41
- url = None , as_egg = False , update = True ):
41
+ url = None , as_egg = False , update = True , upgrade = False ):
42
42
self .extras = ()
43
43
if isinstance (req , string_types ):
44
44
req = pkg_resources .Requirement .parse (req )
@@ -60,29 +60,32 @@ def __init__(self, req, comes_from, source_dir=None, editable=False,
60
60
self ._is_bundle = None
61
61
# True if the editable should be updated:
62
62
self .update = update
63
+ # True if the requirement should be upgraded to the latest version
64
+ self .upgrade = upgrade
63
65
# Set to True after successful installation
64
66
self .install_succeeded = None
65
67
# UninstallPathSet of uninstalled distribution (for possible rollback)
66
68
self .uninstalled = None
67
69
self .use_user_site = False
68
70
69
71
@classmethod
70
- def from_editable (cls , editable_req , comes_from = None , default_vcs = None ):
72
+ def from_editable (cls , editable_req , comes_from = None , default_vcs = None , upgrade = False ):
71
73
name , url , extras_override = parse_editable (editable_req , default_vcs )
72
74
if url .startswith ('file:' ):
73
75
source_dir = url_to_path (url )
74
76
else :
75
77
source_dir = None
76
78
77
- res = cls (name , comes_from , source_dir = source_dir , editable = True , url = url )
79
+ res = cls (name , comes_from , source_dir = source_dir , editable = True ,
80
+ url = url , upgrade = upgrade )
78
81
79
82
if extras_override is not None :
80
83
res .extras = extras_override
81
84
82
85
return res
83
86
84
87
@classmethod
85
- def from_line (cls , name , comes_from = None ):
88
+ def from_line (cls , name , comes_from = None , upgrade = False ):
86
89
"""Creates an InstallRequirement from a name, which might be a
87
90
requirement, directory containing 'setup.py', filename, or URL.
88
91
"""
@@ -116,7 +119,7 @@ def from_line(cls, name, comes_from=None):
116
119
else :
117
120
req = name
118
121
119
- return cls (req , comes_from , url = url )
122
+ return cls (req , comes_from , url = url , upgrade = upgrade )
120
123
121
124
def __str__ (self ):
122
125
if self .req :
@@ -710,7 +713,7 @@ def is_bundle(self):
710
713
or os .path .exists (os .path .join (base , 'pyinstall-manifest.txt' )))
711
714
return self ._is_bundle
712
715
713
- def bundle_requirements (self ):
716
+ def bundle_requirements (self , upgrade = False ):
714
717
for dest_dir in self ._bundle_editable_dirs :
715
718
package = os .path .basename (dest_dir )
716
719
## FIXME: svnism:
@@ -730,13 +733,11 @@ def bundle_requirements(self):
730
733
else :
731
734
url = None
732
735
yield InstallRequirement (
733
- package , self , editable = True , url = url ,
734
- update = False , source_dir = dest_dir )
736
+ package , self , editable = True , url = url , update = False ,
737
+ source_dir = dest_dir , upgrade = upgrade )
735
738
for dest_dir in self ._bundle_build_dirs :
736
739
package = os .path .basename (dest_dir )
737
- yield InstallRequirement (
738
- package , self ,
739
- source_dir = dest_dir )
740
+ yield InstallRequirement (package , self , source_dir = dest_dir , upgrade = upgrade )
740
741
741
742
def move_bundle_files (self , dest_build_dir , dest_src_dir ):
742
743
base = self ._temp_build_dir
@@ -812,13 +813,15 @@ def __repr__(self):
812
813
class RequirementSet (object ):
813
814
814
815
def __init__ (self , build_dir , src_dir , download_dir , download_cache = None ,
815
- upgrade = False , ignore_installed = False , as_egg = False ,
816
- ignore_dependencies = False , force_reinstall = False , use_user_site = False ):
816
+ ignore_installed = False , as_egg = False , force_reinstall = False ,
817
+ ignore_dependencies = False , use_user_site = False , upgrade = False ,
818
+ upgrade_recursive = False ):
817
819
self .build_dir = build_dir
818
820
self .src_dir = src_dir
819
821
self .download_dir = download_dir
820
822
self .download_cache = download_cache
821
823
self .upgrade = upgrade
824
+ self .upgrade_recursive = upgrade_recursive
822
825
self .ignore_installed = ignore_installed
823
826
self .force_reinstall = force_reinstall
824
827
self .requirements = Requirements ()
@@ -921,9 +924,13 @@ def locate_files(self):
921
924
else :
922
925
install_needed = False
923
926
if req_to_install .satisfied_by :
927
+ if self .upgrade and not self .upgrade_recursive :
928
+ upgrade_cmd = '--upgrade-recursive'
929
+ else :
930
+ upgrade_cmd = '--upgrade'
924
931
logger .notify ('Requirement already satisfied '
925
- '(use --upgrade to upgrade): %s'
926
- % req_to_install )
932
+ '(use %s to upgrade): %s'
933
+ % ( upgrade_cmd , req_to_install ) )
927
934
928
935
if req_to_install .editable :
929
936
if req_to_install .source_dir is None :
@@ -953,11 +960,11 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
953
960
if not self .ignore_installed and not req_to_install .editable :
954
961
req_to_install .check_if_exists ()
955
962
if req_to_install .satisfied_by :
956
- if self .upgrade :
963
+ if req_to_install .upgrade :
957
964
if not self .force_reinstall and not req_to_install .url :
958
965
try :
959
966
url = finder .find_requirement (
960
- req_to_install , self . upgrade )
967
+ req_to_install , upgrade = True )
961
968
except BestVersionAlreadyInstalled :
962
969
best_installed = True
963
970
install = False
@@ -979,9 +986,13 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
979
986
logger .notify ('Requirement already up-to-date: %s'
980
987
% req_to_install )
981
988
else :
989
+ if self .upgrade and not self .upgrade_recursive :
990
+ upgrade_cmd = '--upgrade-recursive'
991
+ else :
992
+ upgrade_cmd = '--upgrade'
982
993
logger .notify ('Requirement already satisfied '
983
- '(use --upgrade to upgrade): %s'
984
- % req_to_install )
994
+ '(use %s to upgrade): %s'
995
+ % ( upgrade_cmd , req_to_install ) )
985
996
if req_to_install .editable :
986
997
logger .notify ('Obtaining %s' % req_to_install )
987
998
elif install :
@@ -1023,7 +1034,7 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
1023
1034
if req_to_install .url is None :
1024
1035
if not_found :
1025
1036
raise not_found
1026
- url = finder .find_requirement (req_to_install , upgrade = self .upgrade )
1037
+ url = finder .find_requirement (req_to_install , upgrade = req_to_install .upgrade )
1027
1038
else :
1028
1039
## FIXME: should req_to_install.url already be a link?
1029
1040
url = Link (req_to_install .url )
@@ -1044,7 +1055,7 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
1044
1055
is_bundle = req_to_install .is_bundle
1045
1056
if is_bundle :
1046
1057
req_to_install .move_bundle_files (self .build_dir , self .src_dir )
1047
- for subreq in req_to_install .bundle_requirements ():
1058
+ for subreq in req_to_install .bundle_requirements (upgrade = self . upgrade_recursive ):
1048
1059
reqs .append (subreq )
1049
1060
self .add_requirement (subreq )
1050
1061
elif self .is_download :
@@ -1068,7 +1079,7 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
1068
1079
# repeat check_if_exists to uninstall-on-upgrade (#14)
1069
1080
req_to_install .check_if_exists ()
1070
1081
if req_to_install .satisfied_by :
1071
- if self .upgrade or self .ignore_installed :
1082
+ if req_to_install .upgrade or self .ignore_installed :
1072
1083
#don't uninstall conflict if user install and and conflict is not user install
1073
1084
if not (self .use_user_site and not dist_in_usersite (req_to_install .satisfied_by )):
1074
1085
req_to_install .conflicts_with = req_to_install .satisfied_by
@@ -1092,7 +1103,7 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
1092
1103
if self .has_requirement (name ):
1093
1104
## FIXME: check for conflict
1094
1105
continue
1095
- subreq = InstallRequirement (req , req_to_install )
1106
+ subreq = InstallRequirement (req , req_to_install , upgrade = self . upgrade_recursive )
1096
1107
reqs .append (subreq )
1097
1108
self .add_requirement (subreq )
1098
1109
if not self .has_requirement (req_to_install .name ):
@@ -1344,16 +1355,21 @@ def parse_requirements(filename, finder=None, comes_from=None, options=None):
1344
1355
elif line .startswith ('--no-index' ):
1345
1356
finder .index_urls = []
1346
1357
else :
1358
+ # Use getattr since uninstall doesn't set these options
1359
+ upgrade = (getattr (options , 'upgrade' , False )
1360
+ or getattr (options , 'upgrade_recursive' , False ))
1347
1361
comes_from = '-r %s (line %s)' % (filename , line_number )
1348
1362
if line .startswith ('-e' ) or line .startswith ('--editable' ):
1349
1363
if line .startswith ('-e' ):
1350
1364
line = line [2 :].strip ()
1351
1365
else :
1352
1366
line = line [len ('--editable' ):].strip ().lstrip ('=' )
1353
- req = InstallRequirement .from_editable (
1354
- line , comes_from = comes_from , default_vcs = options .default_vcs )
1367
+ req = InstallRequirement .from_editable (line ,
1368
+ comes_from = comes_from ,
1369
+ default_vcs = options .default_vcs ,
1370
+ upgrade = upgrade )
1355
1371
else :
1356
- req = InstallRequirement .from_line (line , comes_from )
1372
+ req = InstallRequirement .from_line (line , comes_from , upgrade = upgrade )
1357
1373
yield req
1358
1374
1359
1375
0 commit comments