pkgsrc-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[pkgsrc/trunk]: pkgsrc/pkgtools/url2pkg/files pkgtools/url2pkg: migrate from ...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/fe7ca59b0c70
branches:  trunk
changeset: 399903:fe7ca59b0c70
user:      rillig <rillig%pkgsrc.org@localhost>
date:      Sun Aug 18 16:09:01 2019 +0000

description:
pkgtools/url2pkg: migrate from GitHub to PyPI if necessary

Suggested by gdt@ via private mail.

diffstat:

 pkgtools/url2pkg/files/url2pkg.pl |  153 +++++++++++++++++++++++++++++++++----
 1 files changed, 133 insertions(+), 20 deletions(-)

diffs (249 lines):

diff -r 376513829988 -r fe7ca59b0c70 pkgtools/url2pkg/files/url2pkg.pl
--- a/pkgtools/url2pkg/files/url2pkg.pl Sun Aug 18 16:07:34 2019 +0000
+++ b/pkgtools/url2pkg/files/url2pkg.pl Sun Aug 18 16:09:01 2019 +0000
@@ -1,5 +1,5 @@
 #! @PERL5@
-# $NetBSD: url2pkg.pl,v 1.58 2019/08/18 13:49:13 rillig Exp $
+# $NetBSD: url2pkg.pl,v 1.59 2019/08/18 16:09:01 rillig Exp $
 #
 
 # Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -94,14 +94,28 @@
        push(@$lines, "");
 }
 
+sub read_lines($) {
+       my ($filename) = @_;
+
+       my @lines;
+       open(F, "<", $filename) or return @lines;
+       while (defined(my $line = <F>)) {
+               chomp($line);
+               push(@lines, $line);
+       }
+       close(F) or die;
+       return @lines;
+}
+
 sub write_lines($@) {
        my ($filename, @lines) = @_;
 
-       open(F, ">", $filename) or die;
+       open(F, ">", "$filename.tmp") or die;
        foreach my $line (@lines) {
                print F "$line\n";
        }
        close(F) or die;
+       rename("$filename.tmp", $filename) or die;
 }
 
 sub find_package($) {
@@ -111,6 +125,23 @@
        return scalar(@candidates) == 1 ? $candidates[0] : "";
 }
 
+sub update_var_set($$$) {
+       my ($lines, $varname, $new_value) = @_;
+
+       my $i = 0;
+       foreach my $line (@$lines) {
+               if ($line =~ qr"^\Q$varname\E(\+?=)([ \t]+)([^#\\]*?)(\s*)(#.*|)$") {
+                       my ($op, $indent, $old_value, $space_after_value, $comment) = ($1, $2, $3, $4, $5);
+
+                       $lines->[$i] = "$varname$op$indent$new_value$space_after_value$comment";
+                       return true;
+               }
+               $i++;
+       }
+
+       return false;
+}
+
 # appends the given value to the variable assignment.
 sub update_var_append($$$) {
        my ($lines, $varname, $value) = @_;
@@ -125,10 +156,52 @@
                        my $before = $old_value =~ qr"\S$" ? " " : "";
                        my $after = $comment eq "" ? "" : " ";
                        $lines->[$i] = "$varname$op$indent$old_value$before$value$after$comment";
-                       return;
+                       return true;
+               }
+               $i++;
+       }
+
+       return false;
+}
+
+sub update_var_remove($$) {
+       my ($lines, $varname) = @_;
+
+       my $i = 0;
+       foreach my $line (@$lines) {
+               if ($line =~ qr"^\Q$varname\E(\+?=)") {
+                       splice(@$lines, $i, 1);
+                       return true;
                }
                $i++;
        }
+
+       return false;
+}
+
+sub update_var_remove_if($$$) {
+       my ($lines, $varname, $expected_value) = @_;
+
+       my $i = 0;
+       foreach my $line (@$lines) {
+               if ($line =~ qr"^\Q$varname\E(\+?=)([ \t]+)([^#\\]*?)(\s*)(#.*|)$") {
+                       my ($op, $indent, $old_value, $space_after_value, $comment) = ($1, $2, $3, $4, $5);
+
+                       if ($old_value eq $expected_value) {
+                               splice(@$lines, $i, 1);
+                               return true;
+                       }
+               }
+               $i++;
+       }
+
+       return false;
+}
+
+sub make(@) {
+       my @args = @_;
+
+       (system { $make } ($make, @args)) == 0 or die;
 }
 
 # The following adjust_* subroutines are called after the distfiles have
@@ -192,6 +265,8 @@
 # the package name, in case it differs from $distname.
 my $pkgname = "";
 
+my $regenerate_distinfo = false;
+
 # Example:
 # add_dependency("DEPENDS", "package", ">=1", "../../category/package");
 #
@@ -337,6 +412,7 @@
        }
 
        push(@categories, "python");
+       push(@includes, "../../lang/python/egg.mk");
 }
 
 sub adjust_cargo() {
@@ -530,23 +606,57 @@
 
        rename("Makefile", "Makefile-url2pkg.bak") or do {};
        write_lines("Makefile", generate_initial_package_Makefile_lines($url));
-
        write_lines("PLIST", "\@comment \$" . "NetBSD\$");
-
        write_lines("DESCR", ());
-
        run_editor("Makefile", 5);
 
-       print ("url2pkg> Running \"make distinfo\" ...\n");
-       (system { $make } ($make, "distinfo")) == 0 or die;
-
-       print ("url2pkg> Running \"make extract\" ...\n");
-       (system { $make } ($make, "extract")) == 0 or die;
+       make("distinfo");
+       make("extract");
 }
 
-sub adjust_package_from_extracted_distfiles()
+sub adjust_lines_python_module($$) {
+       my ($lines, $url) = @_;
+
+       my @initial_lines = generate_initial_package_Makefile_lines($url);
+       my @current_lines = read_lines("Makefile");
+
+       # don't risk to overwrite any changes by the package developer.
+       if (join('\n', @current_lines) ne join('\n', @initial_lines)) {
+               splice(@$lines, -2, 0, "# TODO: Migrate MASTER_SITES to PYPI");
+               return;
+       }
+
+       my %old;
+       foreach my $line (@initial_lines) {
+               if ($line =~ qr"^(\w+)(\+?=)([ \t]+)([^#\\]*?)(\s*)(#.*|)$") {
+                       my ($varname, $op, $indent, $value, $space_after_value, $comment) = ($1, $2, $3, $4, $5, $6);
+
+                       if ($op eq "=") {
+                               $old{$varname} = $value;
+                       }
+               }
+       }
+
+       my $pkgbase = $old{"GITHUB_PROJECT"};
+       my $pkgbase1 = substr($pkgbase, 0, 1);
+       my $pkgversion_norev = $old{"DISTNAME"} =~ s/^v//r;
+
+       my @tx_lines = @$lines;
+       if (update_var_remove(\@tx_lines, "GITHUB_PROJECT")
+               && update_var_set(\@tx_lines, "DISTNAME", "$pkgbase-$pkgversion_norev")
+               && update_var_set(\@tx_lines, "PKGNAME", "\${PYPKGPREFIX}-\${DISTNAME}")
+               && update_var_set(\@tx_lines, "MASTER_SITES", "\${MASTER_SITE_PYPI:=$pkgbase1/$pkgbase/}")
+               && update_var_remove(\@tx_lines, "DIST_SUBDIR")
+               && (update_var_remove_if(\@tx_lines, "EXTRACT_SUFX", ".zip") || true)) {
+
+               @$lines = @tx_lines;
+               $regenerate_distinfo = true
+       }
+}
+
+sub adjust_package_from_extracted_distfiles($)
 {
-       my ($seen_marker);
+       my ($url) = @_;
 
        chomp($abs_wrkdir = `$make show-var VARNAME=WRKDIR`);
 
@@ -594,6 +704,7 @@
 
        print("url2pkg> Adjusting the Makefile\n");
 
+       my $seen_marker = false;
        my @lines;
 
        open(MF1, "<", "Makefile") or die;
@@ -612,6 +723,9 @@
                        push(@lines, "PKGNAME=$1$pkgname");
                }
        }
+       if (!$seen_marker) {
+               die("$0: ERROR: didn't find the url2pkg marker in the file.\n");
+       }
 
        if (@todos) {
                foreach my $todo (@todos) {
@@ -642,13 +756,12 @@
 
        update_var_append(\@lines, "CATEGORIES", join(" ", @categories));
 
-       write_lines("Makefile-url2pkg.new", @lines);
+       adjust_lines_python_module(\@lines, $url);
 
-       if ($seen_marker) {
-               rename("Makefile-url2pkg.new", "Makefile") or die;
-       } else {
-               unlink("Makefile-url2pkg.new");
-               die("$0: ERROR: didn't find the url2pkg marker in the file.\n");
+       write_lines("Makefile", @lines);
+
+       if ($regenerate_distinfo) {
+               make("distinfo");
        }
 }
 
@@ -677,7 +790,7 @@
                chomp($distname = `$make show-var VARNAME=DISTNAME`);
        }
 
-       adjust_package_from_extracted_distfiles();
+       adjust_package_from_extracted_distfiles($url);
 
        print("\n");
        print("Remember to run pkglint when you're done.\n");



Home | Main Index | Thread Index | Old Index