@ -61,10 +61,12 @@ func (s *StepDownload) Run(state multistep.StateBag) multistep.StepAction {
ui . Say ( fmt . Sprintf ( "Downloading or copying %s" , s . Description ) )
var finalPath string
for _ , url := range s . Url {
ui . Message ( fmt . Sprintf ( "Downloading or copying: %s" , url ) )
// First try to use any already downloaded file
// If it fails, proceed to regualar download logic
var downloadConfigs = make ( [ ] * DownloadConfig , len ( s . Url ) )
var finalPath string
for i , url := range s . Url {
targetPath := s . TargetPath
if targetPath == "" {
// Determine a cache key. This is normally just the URL but
@ -90,19 +92,34 @@ func (s *StepDownload) Run(state multistep.StateBag) multistep.StepAction {
Checksum : checksum ,
UserAgent : "Packer" ,
}
downloadConfigs [ i ] = config
path , err , retry := s . download ( config , state )
if err != nil {
ui . Message ( fmt . Sprintf ( "Error downloading: %s" , err ) )
if match , _ := NewDownloadClient ( config ) . VerifyChecksum ( config . TargetPath ) ; match {
ui . Message ( fmt . Sprintf ( "Found already downloaded, initial checksum matched, no download needed: %s" , url ) )
finalPath = config . TargetPath
break
}
}
if ! retry {
return multistep . ActionHalt
}
if finalPath == "" {
for i , url := range s . Url {
ui . Message ( fmt . Sprintf ( "Downloading or copying: %s" , url ) )
if err == nil {
finalPath = path
break
config := downloadConfigs [ i ]
path , err , retry := s . download ( config , state )
if err != nil {
ui . Message ( fmt . Sprintf ( "Error downloading: %s" , err ) )
}
if ! retry {
return multistep . ActionHalt
}
if err == nil {
finalPath = path
break
}
}
}