aboutsummaryrefslogtreecommitdiff
path: root/tools/update-deps-releases.pl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/update-deps-releases.pl')
-rwxr-xr-xtools/update-deps-releases.pl175
1 files changed, 123 insertions, 52 deletions
diff --git a/tools/update-deps-releases.pl b/tools/update-deps-releases.pl
index aa8f178e6..3536ed101 100755
--- a/tools/update-deps-releases.pl
+++ b/tools/update-deps-releases.pl
@@ -33,10 +33,13 @@ sub get_deps {
return \%deps;
}
my (%info_updates, %top_deps_updates, %sub_deps_updates, @operations);
+my $epoch = 1;
sub top_deps {
state %deps;
- if (not %deps) {
+ state $my_epoch = $epoch;
+ if (not %deps or $my_epoch != $epoch) {
+ $my_epoch = $epoch;
my $config = slurp "rebar.config";
croak "Unable to extract floating_deps" unless $config =~ /\{floating_deps, \[(.*?)\]/s;
@@ -49,7 +52,9 @@ sub top_deps {
}
sub update_deps_repos {
+ my ($force) = @_;
my $deps = top_deps();
+ $epoch++;
mkdir(".deps-update") unless -d ".deps-update";
for my $dep (keys %{$deps}) {
my $dd = ".deps-update/$dep";
@@ -58,7 +63,7 @@ sub update_deps_repos {
my $repo = $deps->{$dep}->{repo};
$repo =~ s!^https?://github.com/!git\@github.com:!;
system("git", "-C", ".deps-update", "clone", $repo);
- } elsif (time() - stat($dd)->mtime > 24 * 60 * 60) {
+ } elsif (time() - stat($dd)->mtime > 24 * 60 * 60 or $force) {
say "Updating $dep...";
system("git", "-C", $dd, "pull");
touch($dd)
@@ -68,7 +73,9 @@ sub update_deps_repos {
sub sub_deps {
state %sub_deps;
- if (not %sub_deps) {
+ state $my_epoch = $epoch;
+ if (not %sub_deps or $my_epoch != $epoch) {
+ $my_epoch = $epoch;
my $deps = top_deps();
for my $dep (keys %{$deps}) {
my $rc = ".deps-update/$dep/rebar.config";
@@ -94,7 +101,9 @@ sub rev_deps_helper {
sub rev_deps {
state %rev_deps;
- if (not %rev_deps) {
+ state $deps_epoch = $epoch;
+ if (not %rev_deps or $deps_epoch != $epoch) {
+ $deps_epoch = $epoch;
my $sub_deps = sub_deps();
for my $dep (keys %$sub_deps) {
$rev_deps{$_}->{direct}->{$dep} = 1 for keys %{$sub_deps->{$dep}};
@@ -113,13 +122,46 @@ sub update_changelog {
my $reason = join "\n", map {"* $_"} @reasons;
my $content = slurp($cl);
if (not $content =~ /^# Version $version/) {
- $content = "# Version $version\n\n$reason\n\n$content"
+ $content = "# Version $version\n\n$reason\n\n$content";
} else {
$content =~ s/(# Version $version\n\n)/$1$reason\n/;
}
write_file($cl, $content);
}
+sub edit_changelog {
+ my ($dep, $version) = @_;
+ my $cl = ".deps-update/$dep/CHANGELOG.md";
+
+ return if not -f $cl;
+
+ my $top_deps = top_deps();
+ my $git_info = deps_git_info();
+
+ say color("red"), "$dep", color("reset"), " ($top_deps->{$dep}->{commit}):";
+ say " $_" for @{$git_info->{$dep}->{new_commits}};
+ say "";
+
+ my $content = slurp($cl);
+ my $old_content = $content;
+
+ if (not $content =~ /^# Version $version/) {
+ $content = "# Version $version\n\n* \n\n$content";
+ } else {
+ $content =~ s/(# Version $version\n\n)/$1* \n/;
+ }
+ write_file($cl, $content);
+
+ system("$ENV{EDITOR} $cl");
+
+ my $new_content = slurp($cl);
+ if ($new_content eq $content) {
+ write_file($cl, $old_content);
+ } else {
+ system("git", "-C", ".deps-update/$dep", "commit", "-a", "-m", "Update changelog");
+ }
+}
+
sub update_app_src {
my ($dep, $version) = @_;
my $app = ".deps-update/$dep/src/$dep.app.src";
@@ -177,7 +219,9 @@ sub cmp_ver {
sub deps_git_info {
state %info;
- if (not %info) {
+ state $my_epoch = $epoch;
+ if (not %info or $my_epoch != $epoch) {
+ $my_epoch = $epoch;
my $deps = top_deps();
for my $dep (keys %{$deps}) {
my $dir = ".deps-update/$dep";
@@ -281,6 +325,7 @@ sub git_push {
update_deps_repos();
+MAIN:
while (1) {
my $top_deps = top_deps();
my $git_info = deps_git_info();
@@ -308,6 +353,7 @@ while (1) {
my $cmd = show_commands($old_deps ? (U => "Update dependency") : (),
$changed_deps ? (T => "Tag new release") : (),
@operations ? (A => "Apply changes") : (),
+ R => "Refresh repositiories",
E => "Exit");
last if $cmd eq "E";
@@ -333,6 +379,9 @@ while (1) {
}
}
+ if ($cmd eq "R") {
+ update_deps_repos(1);
+ }
if ($cmd eq "T") {
while (1) {
my @deps_to_tag;
@@ -356,63 +405,85 @@ while (1) {
}
}
- if ($cmd eq "A") {
- $top_deps = top_deps();
- $git_info = deps_git_info();
- my $sub_deps = sub_deps();
+ my $changelog_updated = 0;
- for my $dep (keys %$top_deps) {
- for my $sdep (keys %{$sub_deps->{$dep}}) {
- next if not defined $top_deps->{$sdep} or
- $sub_deps->{$dep}->{$sdep}->{commit} eq $top_deps->{$sdep}->{commit};
- say "$dep $sdep ",$sub_deps->{$dep}->{$sdep}->{commit}," <=> $sdep ",$top_deps->{$sdep}->{commit};
- schedule_operation("update", $dep, $git_info->{$dep}->{new_tag},
- "Updating $sdep to version $top_deps->{$sdep}->{commit}.", [$sdep, $top_deps->{$sdep}->{commit}]);
+ if ($cmd eq "A") {
+ APPLY: {
+ $top_deps = top_deps();
+ $git_info = deps_git_info();
+ my $sub_deps = sub_deps();
+
+ for my $dep (keys %$top_deps) {
+ for my $sdep (keys %{$sub_deps->{$dep}}) {
+ next if not defined $top_deps->{$sdep} or
+ $sub_deps->{$dep}->{$sdep}->{commit} eq $top_deps->{$sdep}->{commit};
+ say "$dep $sdep ", $sub_deps->{$dep}->{$sdep}->{commit}, " <=> $sdep ",
+ $top_deps->{$sdep}->{commit};
+ schedule_operation("update", $dep, $git_info->{$dep}->{new_tag},
+ "Updating $sdep to version $top_deps->{$sdep}->{commit}.",
+ [ $sdep, $top_deps->{$sdep}->{commit} ]);
+ }
}
- }
-
- %info_updates = ();
- %top_deps_updates = ();
- %sub_deps_updates = ();
- $top_deps = top_deps();
- $git_info = deps_git_info();
- $sub_deps = sub_deps();
+ %info_updates = ();
+ %top_deps_updates = ();
+ %sub_deps_updates = ();
- print color("bold blue"), "List of operations:\n", color("reset");
- for my $op (@operations) {
- print color("red"), $op->{dep}, color("reset"), " ($top_deps->{$op->{dep}}->{commit} -> $op->{version})";
- if (@{$op->{operations}}) {
- say ":";
- say " $_->[0] -> $_->[1]" for @{$op->{operations}};
- } else {
- say "";
- }
- }
+ $top_deps = top_deps();
+ $git_info = deps_git_info();
+ $sub_deps = sub_deps();
- say "";
- my $cmd = show_commands(A => "Apply", E => "Exit");
- if ($cmd eq "A") {
- my %top_changes;
+ print color("bold blue"), "List of operations:\n", color("reset");
for my $op (@operations) {
- update_changelog($op->{dep}, $op->{version}, @{$op->{reasons}})
- if @{$op->{reasons}};
- update_deps_versions(".deps-update/$op->{dep}/rebar.config", unpairs(@{$op->{operations}}))
- if @{$op->{operations}};
- if ($git_info->{$op->{dep}}->{last_tag} ne $op->{version}) {
- update_app_src($op->{dep}, $op->{version});
- git_tag($op->{dep}, $op->{version}, "Release $op->{version}");
+ print color("red"), $op->{dep}, color("reset"),
+ " ($top_deps->{$op->{dep}}->{commit} -> $op->{version})";
+ if (@{$op->{operations}}) {
+ say ":";
+ say " $_->[0] -> $_->[1]" for @{$op->{operations}};
}
+ else {
+ say "";
+ }
+ }
- $top_changes{$op->{dep}} = $op->{version};
+ say "";
+ my %to_tag;
+ if (not $changelog_updated) {
+ for my $op (@operations) {
+ if ($git_info->{$op->{dep}}->{last_tag} ne $op->{version}) {
+ $to_tag{$op->{dep}} = $op->{version};
+ }
+ }
}
- update_deps_versions("rebar.config", %top_changes);
- for my $op (@operations) {
- if ($git_info->{$op->{dep}}->{last_tag} ne $op->{version}) {
- git_push($op->{dep});
+ my $cmd = show_commands(A => "Apply", (%to_tag ? (U => "Update Changelogs") : ()), E => "Exit");
+ if ($cmd eq "U") {
+ for my $dep (keys %to_tag) {
+ edit_changelog($dep, $to_tag{$dep});
+ }
+ redo APPLY;
+ }
+ elsif ($cmd eq "A") {
+ my %top_changes;
+ for my $op (@operations) {
+ update_changelog($op->{dep}, $op->{version}, @{$op->{reasons}})
+ if @{$op->{reasons}};
+ update_deps_versions(".deps-update/$op->{dep}/rebar.config", unpairs(@{$op->{operations}}))
+ if @{$op->{operations}};
+ if ($git_info->{$op->{dep}}->{last_tag} ne $op->{version}) {
+ update_app_src($op->{dep}, $op->{version});
+ git_tag($op->{dep}, $op->{version}, "Release $op->{version}");
+ }
+
+ $top_changes{$op->{dep}} = $op->{version};
+ }
+ update_deps_versions("rebar.config", %top_changes);
+ for my $op (@operations) {
+ if ($git_info->{$op->{dep}}->{last_tag} ne $op->{version}) {
+ git_push($op->{dep});
+ }
}
+ last MAIN;
}
- last;
}
}
}