diff --git a/misc/history2wiki.pl b/misc/history2wiki.pl index c5ef986..ac19bb5 100755 --- a/misc/history2wiki.pl +++ b/misc/history2wiki.pl @@ -27,8 +27,6 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -# $Id$ -# use strict; use warnings; @@ -43,22 +41,26 @@ while (<>) { last if m/^=+$/; $changes .= $_; } - $changes =~ s/^ - ([A-Z]+): / - '''$1''' /gm; - $changes =~ s/([\w.-]+\(\d*\))/`$1`/gs; - $changes =~ s/([^'`])\b([A-Z_]{4,}(?:\s+[A-Z_]{4,})*)\b([^'`])/$1`$2`$3/gs; - $changes =~ s/(CVE-\d{4}-\d+)/[$CVEURL$1 $1]/gs; + $changes =~ s/\r//gs; + $changes =~ s/^ - ([A-Z]+): / - **$1** /gm; + $changes =~ s/([\w.-]+\(\d*\)|\S*[_{}<>#\\\/]\S*)/`$1`/gs; + $changes =~ s/([.,])`/`$1/gs; + $changes =~ s/([^'`*])\b([A-Z_]{4,}(?:\s+[A-Z_]{4,})*)\b([^'`*])/$1`$2`$3/gs; + $changes =~ s/`(PAM|XSSO|\/)`/$1/gs; # false positives above + $changes =~ s/(CVE-\d{4}-\d+)/[$1]($CVEURL$1)/gs; $changes =~ s/([.!?])\n +(\w)/$1 $2/gs; - $changes =~ s/(\S)\n +(\S)/$1 $2/gs; - open(my $fh, ">", "$relname.txt") - or die("$relname.txt: $!\n"); - print($fh "= OpenPAM $relname =\n", - "\n", - "OpenPAM $relname was released on $reldate.\n", + $changes =~ s/(\S)\n +([^ -])/$1 $2/gs; + $changes =~ s/\n/\r\n/gs; + open(my $fh, ">", "Releases-$relname.md") + or die("Releases-$relname.md: $!\n"); + print($fh "# OpenPAM $relname\r\n", + "\r\n", + "OpenPAM $relname was released on $reldate.\r\n", $changes, - "\n", - "[http://sourceforge.net/projects/openpam/files/openpam/$relname/ Download from Sourceforge]\n"); + "\r\n", + "Download from [here](/downloads) or [Sourceforge](http://sourceforge.net/projects/openpam/files/openpam/$relname/)\r\n"); close($fh); - print("|| $reldate || [[Releases/$relname|$relname]] ||\n"); + print("| $reldate | [$relname](Releases-$relname) |\r\n"); } } diff --git a/misc/trac2gitea.pl b/misc/trac2gitea.pl new file mode 100644 index 0000000..9426a5d --- /dev/null +++ b/misc/trac2gitea.pl @@ -0,0 +1,116 @@ +#!/usr/bin/perl -Tw +#- +# Copyright (c) 2021 Dag-Erling Smørgrav +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +use utf8; +use strict; +use warnings; +use open qw(:locale); +use LWP; + +our $TRACBASE = "https://openpam.org/wiki"; + +our %pages; + +sub _p { "trac/$_[0].trac" } + +sub mkparent { + my ($path) = @_; + + return unless $path =~ s@/[^/]+$@@; + return if -d $path; + mkparent($path); + mkdir($path) or die("$path: $!\n"); +} + +sub save { + my ($path, $text) = @_; + + mkparent($path); + open(my $fh, ">", "$path") + or die("$path: $!\n"); + print($fh $text); + close($fh); +} + +sub tracpull { + my ($tracbase, @queue) = @_; + @queue = qw(WikiStart) unless @queue; + my $ua = new LWP::UserAgent(); + $ua->agent("trac2gitea/0.20211020"); + while (@queue) { + my $page = shift(@queue); + next if $pages{$page}; + if (open(my $fh, "<", _p($page))) { + local $/; + $pages{$page} = <$fh>; + close($fh); + } else { + my $req = new HTTP::Request(GET => "$tracbase/wiki/$page?format=txt"); + my $res = $ua->request($req); + if (!$res->is_success) { + warn(sprintf("%s: %s\n", $page, $res->status_line)); + next; + } + $pages{$page} = $res->decoded_content; + save(_p($page), $pages{$page}); + } + foreach my $link ($pages{$page} =~ m@\[\[([\w/-]+)(?:\|[^|]+)?\]\]@g) { + next if $pages{$link}; + push(@queue, $link); + } + } +} + +sub convert { + my ($page, $text) = @_; + + my $path = "$page.md"; + $path =~ s/\bWikiStart\b/Home/; + $path =~ y@/@-@; + $text =~ y/\r//d; + $text =~ s/^= (.*) =$/# $1/gm; + $text =~ s/^== (.*) ==$/## $1/gm; + $text =~ s/^=== (.*) ===$/### $1/gm; + $text .= "\n" unless $text =~ m/\n$/s; + $text =~ s/'''/**/g; + $text =~ s/\n/\r\n/gs; + $text =~ s/\[([^\[\|\]\s]+) ([^\[\|\]\s][^\[\|\]]*)\]/[$2]($1)/gm; + $text =~ s/\[\[([^\[\|\]]+)\|([^\[\|\]]+)\]\]/[$2]($1)/gm; + $text =~ s/\| ([^\|]+) \|/| $1 |/gm; + $text =~ s/\|= ([^\|]+) =\|/| **$1** |/gm; + $text =~ s/\|\|/|/gm; + $text =~ s/!([A-Z]\w+)/$1/gm; + $text =~ s/\]\(([^\)\/]+)\/([^\)\/]+)\)/]($1-$2)/gm; + save($path, $text); +} + +MAIN:{ + tracpull("https://openpam.org"); + while (my ($page, $text) = each %pages) { + convert($page, $text); + } +}