]> granicus.if.org Git - ejabberd/commitdiff
Add tool for checking which dependences need update
authorPaweł Chmielowski <pchmielowski@process-one.net>
Mon, 23 Jan 2017 11:24:15 +0000 (12:24 +0100)
committerPaweł Chmielowski <pchmielowski@process-one.net>
Mon, 23 Jan 2017 11:24:25 +0000 (12:24 +0100)
tools/find-outdated-deps.pl [new file with mode: 0755]

diff --git a/tools/find-outdated-deps.pl b/tools/find-outdated-deps.pl
new file mode 100755 (executable)
index 0000000..61fccb0
--- /dev/null
@@ -0,0 +1,127 @@
+#!/usr/bin/perl
+
+
+### Remmber to call `rebar update-deps` before calling this script
+
+use strict;
+use File::Slurp qw(slurp);
+use feature qw(say);
+
+sub cmp_ver {
+    my @a = split /(\d+)/, $a;
+    my @b = split /(\d+)/, $b;
+    my $is_num = 1;
+
+    while (1) {
+        my $ap = shift @a;
+        my $bp = shift @b;
+        $is_num = 1 - $is_num;
+
+        if (defined $ap) {
+            if (defined $bp) {
+                if ($is_num) {
+                    next if $ap == $bp;
+                    return 1 if $ap > $bp;
+                    return -1;
+                } else {
+                    next if $ap eq $bp;
+                    return 1 if $ap gt $bp;
+                    return -1;
+                }
+            } else {
+                return 1;
+            }
+        } elsif (defined $bp) {
+            return -1;
+        } else {
+            return 0;
+        }
+    }
+}
+
+sub get_deps {
+    my ($dir) = @_;
+    my (%deps, %floating_deps);
+
+    return (\%deps, \%floating_deps) unless -f "$dir/rebar.config";
+
+    my $config = slurp("$dir/rebar.config");
+
+    while ($config =~ /{\s*([^{]*?)\s*,[^{]*?{\s*git\s*[^{]*?{\s*tag\s*,\s*"(.*?)"\s*}/gs) {
+        $deps{$1} = $2;
+    }
+
+    if ($config =~ /{floating_deps\s*,\s*\[\s*([^\]]+)\s*\]}/s) {
+        my $fd = $1;
+        while ($fd =~ /(\w+)/g) {
+            $floating_deps{$1} = 1;
+        }
+    }
+    return (\%deps, \%floating_deps);
+}
+
+my $base_dir = ".";
+
+while (not -f "$base_dir/rebar.config") {
+    $base_dir = "../$base_dir";
+}
+
+my (%deps, %floating_deps);
+{
+    my ($deps, $floating_deps) = get_deps($base_dir);
+    %deps = %$deps;
+    %floating_deps = %$floating_deps
+}
+
+my $all = $ARGV[0] eq "--all";
+
+my %cross_deps;
+
+$cross_deps{$_}->{$deps{$_}} = ["ejabberd"] for keys %deps;
+
+for (sort keys %deps) {
+    my $dep = $_;
+    my $dep_dir = "$base_dir/deps/$dep";
+    next unless -d $dep_dir;
+    next unless $all or exists $floating_deps{$dep};
+
+    my @tags0 = `git -C $dep_dir tag`;
+    chomp(@tags0);
+    my @tags = grep { /^v?\d+(?:\.\d+)*$/ } @tags0;
+    @tags = sort cmp_ver @tags;
+
+    #say "versions: ", join ", ", @tags;
+
+    my $last_tag = $tags[$#tags];
+    my @new = `git -C $dep_dir log --oneline $last_tag..origin/master`;
+    chomp(@new);
+
+    my ($cdeps, $fdeps) = get_deps($dep_dir);
+
+    for (keys %$cdeps) {
+        push @{$cross_deps{$_}->{$cdeps->{$_}}}, $dep;
+    }
+
+    if ($deps{$dep} ne $last_tag) {
+        if (@new) {
+            say $dep," can be updated: ", $deps{$dep}, " -> ", $last_tag, " and has ",
+            scalar(@new), " commits after last tag:";
+            say "   $_" for @new;
+        } else {
+            say $dep," can be updated: ", $deps{$dep}, " -> ", $last_tag;
+        }
+    } elsif (@new) {
+        say $dep, " has ", scalar(@new), " commits after last tag:";
+        say "   $_" for @new;
+    }
+}
+
+say "";
+for (sort keys %cross_deps) {
+    my $dep = $_;
+
+    if ((scalar keys %{$cross_deps{$dep}}) > 1) {
+        say "Dependency $dep is requested in different versions:";
+        say "   $_ -> ", join(", ", @{$cross_deps{$dep}->{$_}}) for sort cmp_ver keys %{$cross_deps{$dep}};
+    }
+}