|  | @@ -9,7 +9,7 @@ use File::Temp;
 | 
	
		
			
				|  |  |  use Getopt::Long;
 | 
	
		
			
				|  |  |  use Mojo::File;
 | 
	
		
			
				|  |  |  use Mojo::UserAgent;
 | 
	
		
			
				|  |  | -use Mojo::Util qw(b64_encode decode encode trim);
 | 
	
		
			
				|  |  | +use Mojo::Util qw(decode encode trim url_escape);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  use Term::UI;
 | 
	
		
			
				|  |  |  use Term::ReadLine;
 | 
	
	
		
			
				|  | @@ -175,8 +175,7 @@ while (my $repo = shift) { # 'library/hylang', 'tianon/perl', etc
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  |  	my $repoUrl = $dockerHub . '/v2/repositories/' . $repo . '/';
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  | -	if ($logos && $repo =~ m{ ^ library/ }x) {
 | 
	
		
			
				|  |  | -		# the "library" org images include a logo which is displayed in the Hub UI
 | 
	
		
			
				|  |  | +	if ($logos) {
 | 
	
		
			
				|  |  |  		# if we have a logo file, let's update that metadata first
 | 
	
		
			
				|  |  |  		my $repoLogo120 = $repoName . '/logo-120.png';
 | 
	
		
			
				|  |  |  		if (!-f $repoLogo120) {
 | 
	
	
		
			
				|  | @@ -196,9 +195,10 @@ while (my $repo = shift) { # 'library/hylang', 'tianon/perl', etc
 | 
	
		
			
				|  |  |  				) == 0 or die "failed to convert $logoToConvert into $repoLogo120";
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | +		my $logoUrlBase = $dockerHub . '/api/media/repos_logo/v1/' . url_escape($repo);
 | 
	
		
			
				|  |  |  		if (-f $repoLogo120) {
 | 
	
		
			
				|  |  |  			my $proposedLogo = Mojo::File->new($repoLogo120)->slurp;
 | 
	
		
			
				|  |  | -			my $currentLogo = $ua->get('https://d1q6f0aelx0por.cloudfront.net/product-logos/' . join('-', split(m{/}, $repo)) . '-logo.png', { 'Cache-Control' => 'no-cache' });
 | 
	
		
			
				|  |  | +			my $currentLogo = $ua->get($logoUrlBase, { 'Cache-Control' => 'no-cache' });
 | 
	
		
			
				|  |  |  			$currentLogo = ($currentLogo->res->is_success ? $currentLogo->res->body : undef);
 | 
	
		
			
				|  |  |  			
 | 
	
		
			
				|  |  |  			if ($currentLogo && $currentLogo eq $proposedLogo) {
 | 
	
	
		
			
				|  | @@ -206,14 +206,14 @@ while (my $repo = shift) { # 'library/hylang', 'tianon/perl', etc
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  			else {
 | 
	
		
			
				|  |  |  				say 'putting logo ' . $repoLogo120;
 | 
	
		
			
				|  |  | -				my $logoUrl = $repoUrl . 'logo';
 | 
	
		
			
				|  |  | -				my $logoPut = $ua->put($logoUrl => $authorizationHeader => json => {
 | 
	
		
			
				|  |  | -						'image_data' => b64_encode($proposedLogo),
 | 
	
		
			
				|  |  | -						'content_type' => 'image/png',
 | 
	
		
			
				|  |  | -						'file_ext' => 'png',
 | 
	
		
			
				|  |  | -					});
 | 
	
		
			
				|  |  | -				warn 'warning: put to ' . $logoUrl . ' failed: ' . $logoPut->res->text unless $logoPut->res->is_success;
 | 
	
		
			
				|  |  | +				my $logoUpload = $ua->post($logoUrlBase . '/upload' => { %$authorizationHeader, 'Content-Type' => 'image/png' } => $proposedLogo);
 | 
	
		
			
				|  |  | +				die 'POST to ' . $logoUrlBase . '/upload failed: ' . $logoUpload->res->text unless $logoUpload->res->is_success;
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			# if we had no logo file, we should send a DELETE request to the API just to be sure we're synchronizing the repo state appropriately even on complete logo removal
 | 
	
		
			
				|  |  | +			say 'no ' . $repoLogo120 . '; deleting logo';
 | 
	
		
			
				|  |  | +			my $logoDelete = $ua->delete($logoUrlBase => $authorizationHeader);
 | 
	
		
			
				|  |  | +			die 'DELETE to ' . $logoUrlBase . ' failed: ' . $logoDelete->res->text unless $logoDelete->res->is_success or $logoDelete->res->code == 404;
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	
 |