From b239baff4c1413f7098fe5cc38b8305266cdc4df Mon Sep 17 00:00:00 2001 From: Tianon Gravi Date: Fri, 14 Apr 2023 15:31:55 -0700 Subject: [PATCH 1/3] Update to use the new repo logos API --- push.pl | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/push.pl b/push.pl index 6449690cb..2092c8d6c 100755 --- a/push.pl +++ b/push.pl @@ -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(b64_encode 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,19 @@ 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->get($logoUrlBase . '/upload' => $authorizationHeader); + die 'GET to ' . $logoUrlBase . '/upload failed: ' . $logoUpload->res->text unless $logoUpload->res->is_success; + my $logoUploadUrl = $logoUpload->res->json->{url}; + my $logoPut = $ua->put($logoUploadUrl => { 'Content-Type' => 'image/png' } => $proposedLogo); + die 'PUT to ' . $logoUrlBase . ' (via "/upload" secure URL) failed: ' . $logoPut->res->text unless $logoPut->res->is_success; + my $logoComplete = $ua->post($logoUrlBase . '/upload/complete' => $authorizationHeader); + die 'POST to ' . $logoUrlBase . '/upload/complete failed: ' . $logoComplete->res->text unless $logoComplete->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; } } From 04418385005935e529f3b6ab23e8d372a4e39312 Mon Sep 17 00:00:00 2001 From: Joseph Ferguson Date: Thu, 28 Sep 2023 10:05:48 -0700 Subject: [PATCH 2/3] Update logo upload to simpler single API reguest flow --- push.pl | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/push.pl b/push.pl index 2092c8d6c..bd3331acd 100755 --- a/push.pl +++ b/push.pl @@ -206,13 +206,8 @@ while (my $repo = shift) { # 'library/hylang', 'tianon/perl', etc } else { say 'putting logo ' . $repoLogo120; - my $logoUpload = $ua->get($logoUrlBase . '/upload' => $authorizationHeader); - die 'GET to ' . $logoUrlBase . '/upload failed: ' . $logoUpload->res->text unless $logoUpload->res->is_success; - my $logoUploadUrl = $logoUpload->res->json->{url}; - my $logoPut = $ua->put($logoUploadUrl => { 'Content-Type' => 'image/png' } => $proposedLogo); - die 'PUT to ' . $logoUrlBase . ' (via "/upload" secure URL) failed: ' . $logoPut->res->text unless $logoPut->res->is_success; - my $logoComplete = $ua->post($logoUrlBase . '/upload/complete' => $authorizationHeader); - die 'POST to ' . $logoUrlBase . '/upload/complete failed: ' . $logoComplete->res->text unless $logoComplete->res->is_success; + my $logoUpload = $ua->post($logoUrlBase . '/upload' => { %$authorizationHeader, 'Content-Type' => 'image/png' } => b64_encode $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 From 231b5858d76bfc7384fa100b3b52b8ab86be9c86 Mon Sep 17 00:00:00 2001 From: Tianon Gravi Date: Thu, 28 Sep 2023 10:30:22 -0700 Subject: [PATCH 3/3] Ditch b64_encode, which does not appear to be required --- push.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/push.pl b/push.pl index bd3331acd..e3282370f 100755 --- a/push.pl +++ b/push.pl @@ -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 url_escape); +use Mojo::Util qw(decode encode trim url_escape); use Term::UI; use Term::ReadLine; @@ -206,7 +206,7 @@ while (my $repo = shift) { # 'library/hylang', 'tianon/perl', etc } else { say 'putting logo ' . $repoLogo120; - my $logoUpload = $ua->post($logoUrlBase . '/upload' => { %$authorizationHeader, 'Content-Type' => 'image/png' } => b64_encode $proposedLogo); + 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 {