Reorganize "push.pl" to put the "vimdiff" logic in one place for cool dispatch-conf-alike behavior
This commit is contained in:
parent
b1bbd39a36
commit
2633e18b55
|
|
@ -1,5 +1,7 @@
|
||||||
FROM perl:5.20
|
FROM perl:5.20
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y git vim --no-install-recommends && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# secure by default ♥ (thanks to sri!)
|
# secure by default ♥ (thanks to sri!)
|
||||||
ENV PERL_CPANM_OPT --verbose --mirror https://cpan.metacpan.org
|
ENV PERL_CPANM_OPT --verbose --mirror https://cpan.metacpan.org
|
||||||
# TODO find a way to make --mirror-only / SSL work with backpan too :(
|
# TODO find a way to make --mirror-only / SSL work with backpan too :(
|
||||||
|
|
@ -17,9 +19,7 @@ RUN cpanm IO::Socket::IP
|
||||||
RUN cpanm --notest IO::Socket::SSL
|
RUN cpanm --notest IO::Socket::SSL
|
||||||
# the tests for IO::Socket::SSL like to hang... :(
|
# the tests for IO::Socket::SSL like to hang... :(
|
||||||
|
|
||||||
RUN cpanm Term::ReadKey
|
RUN cpanm Term::UI
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y git vim --no-install-recommends && rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
ENV LANG C.UTF-8
|
ENV LANG C.UTF-8
|
||||||
|
|
||||||
|
|
|
||||||
83
push.pl
83
push.pl
|
|
@ -4,19 +4,20 @@ use warnings;
|
||||||
use 5.010;
|
use 5.010;
|
||||||
use open ':encoding(utf8)';
|
use open ':encoding(utf8)';
|
||||||
|
|
||||||
|
use File::Basename qw(fileparse);
|
||||||
use File::Temp;
|
use File::Temp;
|
||||||
use Getopt::Long;
|
use Getopt::Long;
|
||||||
use Mojo::UserAgent;
|
use Mojo::UserAgent;
|
||||||
use Mojo::Util qw(decode encode slurp spurt trim);
|
use Mojo::Util qw(decode encode slurp spurt trim);
|
||||||
use Term::ReadKey;
|
|
||||||
|
use Term::UI;
|
||||||
|
use Term::ReadLine;
|
||||||
|
|
||||||
my $username;
|
my $username;
|
||||||
my $password;
|
my $password;
|
||||||
my $all;
|
|
||||||
GetOptions(
|
GetOptions(
|
||||||
'u|username=s' => \$username,
|
'u|username=s' => \$username,
|
||||||
'p|password=s' => \$password,
|
'p|password=s' => \$password,
|
||||||
'a|all' => \$all,
|
|
||||||
) or die 'bad args';
|
) or die 'bad args';
|
||||||
|
|
||||||
die 'no repos specified' unless @ARGV;
|
die 'no repos specified' unless @ARGV;
|
||||||
|
|
@ -88,6 +89,41 @@ sub get_form_bits {
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $term = Term::ReadLine->new('docker-library-docs-push');
|
||||||
|
|
||||||
|
sub prompt_for_edit {
|
||||||
|
my ($currentText, $proposedFile) = @_;
|
||||||
|
|
||||||
|
my $proposedText = slurp $proposedFile or warn 'missing ' . $proposedFile;
|
||||||
|
$proposedText = trim(decode('UTF-8', $proposedText));
|
||||||
|
|
||||||
|
return $currentText if $currentText eq $proposedText;
|
||||||
|
|
||||||
|
my @proposedFileBits = fileparse($proposedFile, qr!\.[^.]*!);
|
||||||
|
my $file = File::Temp->new(SUFFIX => $proposedFileBits[2]);
|
||||||
|
my $filename = $file->filename;
|
||||||
|
spurt encode('UTF-8', $currentText . "\n"), $filename;
|
||||||
|
|
||||||
|
system(qw(git --no-pager diff --no-index), $filename, $proposedFile);
|
||||||
|
|
||||||
|
my $reply = $term->get_reply(
|
||||||
|
prompt => 'Apply changes?',
|
||||||
|
choices => [ qw( yes vimdiff no ) ],
|
||||||
|
default => 'yes',
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($reply eq 'yes') {
|
||||||
|
return $proposedText;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($reply eq 'vimdiff') {
|
||||||
|
system('vimdiff', $filename, $proposedFile) == 0 or die "vimdiff on $filename and $proposedFile failed";
|
||||||
|
return trim(decode('UTF-8', slurp($filename)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $currentText;
|
||||||
|
}
|
||||||
|
|
||||||
my $login = $ua->get('https://registry.hub.docker.com/account/login/');
|
my $login = $ua->get('https://registry.hub.docker.com/account/login/');
|
||||||
die 'login failed' unless $login->success;
|
die 'login failed' unless $login->success;
|
||||||
|
|
||||||
|
|
@ -95,19 +131,12 @@ my $loginForm = $login->res->dom('#form-login')->first;
|
||||||
my $loginBits = get_form_bits($loginForm);
|
my $loginBits = get_form_bits($loginForm);
|
||||||
|
|
||||||
unless (defined $username) {
|
unless (defined $username) {
|
||||||
print 'Hub Username: ';
|
$username = $term->get_reply(prompt => 'Hub Username');
|
||||||
$username = ReadLine 0;
|
|
||||||
chomp $username;
|
|
||||||
}
|
}
|
||||||
$loginBits->{username} = $username;
|
$loginBits->{username} = $username;
|
||||||
|
|
||||||
unless (defined $password) {
|
unless (defined $password) {
|
||||||
print 'Hub Password: ';
|
$password = $term->get_reply(prompt => 'Hub Password'); # TODO hide the input? O:)
|
||||||
ReadMode 2;
|
|
||||||
$password = ReadLine 0;
|
|
||||||
chomp $password;
|
|
||||||
ReadMode 0;
|
|
||||||
print "\n";
|
|
||||||
}
|
}
|
||||||
$loginBits->{password} = $password;
|
$loginBits->{password} = $password;
|
||||||
|
|
||||||
|
|
@ -128,14 +157,6 @@ while (my $repo = shift) { # '/_/hylang', '/u/tianon/perl', etc
|
||||||
my $repoName = $repo;
|
my $repoName = $repo;
|
||||||
$repoName =~ s!^.*/!!; # 'hylang', 'perl', etc
|
$repoName =~ s!^.*/!!; # 'hylang', 'perl', etc
|
||||||
|
|
||||||
my $shortFile = $repoName . '/README-short.txt';
|
|
||||||
my $short = slurp $shortFile or warn 'missing ' . $shortFile;
|
|
||||||
$short = trim(decode('UTF-8', $short));
|
|
||||||
|
|
||||||
my $longFile = $repoName . '/README.md';
|
|
||||||
my $long = slurp $longFile or warn 'missing ' . $longFile;
|
|
||||||
$long = trim(decode('UTF-8', $long));
|
|
||||||
|
|
||||||
my $repoUrl = 'https://registry.hub.docker.com' . $repo . '/settings/';
|
my $repoUrl = 'https://registry.hub.docker.com' . $repo . '/settings/';
|
||||||
my $repoTx = $ua->get($repoUrl);
|
my $repoTx = $ua->get($repoUrl);
|
||||||
die 'failed to get: ' . $repoUrl unless $repoTx->success;
|
die 'failed to get: ' . $repoUrl unless $repoTx->success;
|
||||||
|
|
@ -144,30 +165,16 @@ while (my $repo = shift) { # '/_/hylang', '/u/tianon/perl', etc
|
||||||
die 'failed to find form on ' . $repoUrl unless $settingsForm;
|
die 'failed to find form on ' . $repoUrl unless $settingsForm;
|
||||||
my $settingsBits = get_form_bits($settingsForm);
|
my $settingsBits = get_form_bits($settingsForm);
|
||||||
|
|
||||||
my $hubShort = $settingsBits->{description};
|
my $hubShort = prompt_for_edit($settingsBits->{description}, $repoName . '/README-short.txt');
|
||||||
my $hubLong = $settingsBits->{full_description};
|
my $hubLong = prompt_for_edit($settingsBits->{full_description}, $repoName . '/README.md');
|
||||||
|
|
||||||
if ($hubShort ne $short) {
|
|
||||||
my $file = File::Temp->new(SUFFIX => '.txt');
|
|
||||||
my $filename = $file->filename;
|
|
||||||
spurt encode('UTF-8', $hubShort . "\n"), $filename;
|
|
||||||
system('vimdiff', $filename, $shortFile) == 0 or die "vimdiff on $filename and $shortFile failed";
|
|
||||||
$hubShort = trim(decode('UTF-8', slurp($filename)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($hubLong ne $long) {
|
|
||||||
my $file = File::Temp->new(SUFFIX => '.md');
|
|
||||||
my $filename = $file->filename;
|
|
||||||
spurt encode('UTF-8', $hubLong . "\n"), $filename;
|
|
||||||
system('vimdiff', $filename, $longFile) == 0 or die "vimdiff on $filename and $longFile failed";
|
|
||||||
$hubLong = trim(decode('UTF-8', slurp($filename)));
|
|
||||||
}
|
|
||||||
|
|
||||||
say 'no change to ' . $repoName . '; skipping' and next if $settingsBits->{description} eq $hubShort and $settingsBits->{full_description} eq $hubLong;
|
say 'no change to ' . $repoName . '; skipping' and next if $settingsBits->{description} eq $hubShort and $settingsBits->{full_description} eq $hubLong;
|
||||||
|
|
||||||
$settingsBits->{description} = $hubShort;
|
$settingsBits->{description} = $hubShort;
|
||||||
$settingsBits->{full_description} = $hubLong;
|
$settingsBits->{full_description} = $hubLong;
|
||||||
|
|
||||||
|
say 'updating ' . $repoName;
|
||||||
|
|
||||||
$repoTx = $ua->post($repoUrl => { Referer => $repoUrl } => form => $settingsBits);
|
$repoTx = $ua->post($repoUrl => { Referer => $repoUrl } => form => $settingsBits);
|
||||||
die 'post to ' . $repoUrl . ' failed' unless $repoTx->success;
|
die 'post to ' . $repoUrl . ' failed' unless $repoTx->success;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue