Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package rpm2docserv for openSUSE:Factory checked in at 2022-11-21 16:35:16 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rpm2docserv (Old) and /work/SRC/openSUSE:Factory/.rpm2docserv.new.1597 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rpm2docserv" Mon Nov 21 16:35:16 2022 rev:7 rq:1037133 version:20221121.c1d43dd Changes: -------- --- /work/SRC/openSUSE:Factory/rpm2docserv/rpm2docserv.changes 2022-11-10 14:22:22.470380259 +0100 +++ /work/SRC/openSUSE:Factory/.rpm2docserv.new.1597/rpm2docserv.changes 2022-11-21 16:35:17.333052900 +0100 @@ -1,0 +2,8 @@ +Mon Nov 21 14:41:46 UTC 2022 - ku...@suse.com + +- Update to version 20221121.c1d43dd: + * Update dependencies + * Add docserv-sitemap to generate sitemap xml files + * Use docserv instead of debiman for temporary files + +------------------------------------------------------------------- Old: ---- rpm2docserv-20221108.e2b9545.tar.xz New: ---- rpm2docserv-20221121.c1d43dd.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rpm2docserv.spec ++++++ --- /var/tmp/diff_new_pack.bNLjqI/_old 2022-11-21 16:35:18.057056726 +0100 +++ /var/tmp/diff_new_pack.bNLjqI/_new 2022-11-21 16:35:18.065056769 +0100 @@ -17,7 +17,7 @@ Name: rpm2docserv -Version: 20221108.e2b9545 +Version: 20221121.c1d43dd Release: 0 Summary: Make manpages from RPMs accessible in a web browser License: Apache-2.0 @@ -48,6 +48,12 @@ %description -n docserv-minisrv Simple docserv webserver with integrated auxserver for development and test purposes. Not for production. +%package -n docserv-sitemap +Summary: Generate sitemap xml files for rpm2docserv + +%description -n docserv-sitemap +This tool generates sitemap xml files from a rpm2docserv generated docserv directory for search engines. + %package -n docserv-config-nginx Summary: Configuration files for nginx to serve docserv directory BuildArch: noarch @@ -78,6 +84,7 @@ install -m 755 bin/docserv-auxserver %{buildroot}%{_sbindir}/ install -m 755 bin/docserv-minisrv %{buildroot}%{_sbindir}/ install -m 755 bin/docserv-idx2rwmap %{buildroot}%{_bindir}/ +install -m 755 bin/docserv-sitemap %{buildroot}%{_bindir}/ mkdir -p %{buildroot}%{_datadir}/%{name} cp -r assets %{buildroot}%{_datadir}/%{name} @@ -141,6 +148,10 @@ %{_sysusersdir}/system-user-docserv-srv.conf %{_distconfdir}/default/docserv-minisrv +%files -n docserv-sitemap +%license LICENSE +%{_bindir}/docserv-sitemap + %files -n docserv-config-nginx %dir %{_datadir}/docserv %{_datadir}/docserv/nginx ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.bNLjqI/_old 2022-11-21 16:35:18.113057022 +0100 +++ /var/tmp/diff_new_pack.bNLjqI/_new 2022-11-21 16:35:18.117057043 +0100 @@ -1,7 +1,7 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/thkukuk/rpm2docserv.git</param> - <param name="changesrevision">e2b95452b73aee34da07b7fce7859f3dc904a218</param></service> + <param name="changesrevision">c1d43dd5f511041930af449d08a1c7e62baf8a29</param></service> </servicedata> (No newline at EOF) ++++++ rpm2docserv-20221108.e2b9545.tar.xz -> rpm2docserv-20221121.c1d43dd.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rpm2docserv-20221108.e2b9545/cmd/docserv-sitemap/sitemap.go new/rpm2docserv-20221121.c1d43dd/cmd/docserv-sitemap/sitemap.go --- old/rpm2docserv-20221108.e2b9545/cmd/docserv-sitemap/sitemap.go 1970-01-01 01:00:00.000000000 +0100 +++ new/rpm2docserv-20221121.c1d43dd/cmd/docserv-sitemap/sitemap.go 2022-11-21 15:41:21.000000000 +0100 @@ -0,0 +1,143 @@ +// generate sitemap for docserv directroy used by search engines +package main + +import ( + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net/url" + "os" + "path/filepath" + "time" + + "github.com/thkukuk/rpm2docserv/pkg/sitemap" + "github.com/thkukuk/rpm2docserv/pkg/write" +) + +var ( + baseURL = flag.String("base-url", + "", + "Base URL (without trailing slash) to the site.") + + servingDir = flag.String("serving-dir", + "/srv/docserv", + "Directory in which to place the manpages which should be served") + + verbose = flag.Bool("verbose", + false, + "Print additional status messages") + + showVersion = flag.Bool("version", + false, + "Show version and exit") +) + +// use go build -ldflags "-X main.rpm2docservVersion=<version>" to set the version +var rpm2docservVersion = "HEAD" + +func main() { + flag.Parse() + + if *showVersion { + fmt.Printf("docserv-sitemap %s\n", rpm2docservVersion) + return + } + + if len(*baseURL) == 0 { + log.Fatal("Usage: docserv-sitemap --base-url=<URL> [--serving-dir=<dir>]") + } + + log.Printf("docserv sitemap generation for %q", *servingDir) + + err := walkDirs(*servingDir, *baseURL) + if err != nil { + log.Fatal(err) + } +} + +func walkDirs(dir string, baseURL string) error { + sitemaps := make(map[string]time.Time) + + suitedirs, err := ioutil.ReadDir(dir) + if err != nil { + return fmt.Errorf("Reading %v failed: %v", dir, err) + } + for _, sfi := range suitedirs { + if !sfi.IsDir() { + continue + } + + if *verbose { + log.Printf("Searching in \"%v\"...", sfi.Name()) + } + + fn := filepath.Join(*servingDir, sfi.Name()) + bins, err := os.Open(fn) + if err != nil { + return fmt.Errorf("Cannot open %v: %v", fn, err) + } + defer bins.Close() + + // openSUSE Tumbleweed has ~11000 package entries, 20000 should + // be good enough as start + sitemapEntries := make(map[string]time.Time, 20000) + + for { + if *verbose { + log.Print("Calling Readdirnames...") + } + names, err := bins.Readdirnames(0) + if err != nil { + if err == io.EOF { + break + } else { + return fmt.Errorf ("Readdirnames failed: %v", err) + } + } + if *verbose { + log.Printf("Readdirnames found %d entries...", len(names)) + } + + if len(names) == 0 { + break + } + + for _, bfn := range names { + if bfn == "sourcesWithManpages.txt.gz" || + bfn == "index.html.gz" || + bfn == "sitemap.xml.gz" || + bfn == ".nobackup" { + continue + } + + fn := filepath.Join(dir, sfi.Name(), bfn) + fi, err := os.Stat(fn) + if err != nil { + return fmt.Errorf("Stat(%v) failed: %v", fn, err) + } + + if !fi.ModTime().IsZero() { + sitemapEntries[bfn] = fi.ModTime() + } + } + } + bins.Close() + + sitemapPath := filepath.Join(dir, sfi.Name(), "sitemap.xml.gz") + escapedUrlPath := &url.URL{Path: sfi.Name()} + if err := write.Atomically(sitemapPath, true, func(w io.Writer) error { + return sitemap.WriteTo(w, baseURL+"/" + escapedUrlPath.String(), sitemapEntries) + }); err != nil { + return fmt.Errorf("Write sitemap for %v failed: %v", sfi.Name(), err) + } + st, err := os.Stat(sitemapPath) + if err == nil { + sitemaps[escapedUrlPath.String()] = st.ModTime() + } + } + return write.Atomically(filepath.Join(dir, "sitemapindex.xml.gz"), true, func(w io.Writer) error { + return sitemap.WriteIndexTo(w, baseURL, sitemaps) + }) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rpm2docserv-20221108.e2b9545/go.mod new/rpm2docserv-20221121.c1d43dd/go.mod --- old/rpm2docserv-20221108.e2b9545/go.mod 2022-11-08 16:26:08.000000000 +0100 +++ new/rpm2docserv-20221121.c1d43dd/go.mod 2022-11-21 15:41:21.000000000 +0100 @@ -5,7 +5,7 @@ require ( github.com/golang/protobuf v1.5.2 github.com/knqyf263/go-rpm-version v0.0.0-20220614171824-631e686d1075 - golang.org/x/net v0.1.0 + golang.org/x/net v0.2.0 golang.org/x/sync v0.1.0 golang.org/x/text v0.4.0 gopkg.in/yaml.v3 v3.0.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rpm2docserv-20221108.e2b9545/go.sum new/rpm2docserv-20221121.c1d43dd/go.sum --- old/rpm2docserv-20221108.e2b9545/go.sum 2022-11-08 16:26:08.000000000 +0100 +++ new/rpm2docserv-20221121.c1d43dd/go.sum 2022-11-21 15:41:21.000000000 +0100 @@ -5,8 +5,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/knqyf263/go-rpm-version v0.0.0-20220614171824-631e686d1075 h1:aC6MEAs3PE3lWD7lqrJfDxHd6hcced9R4JTZu85cJwU= github.com/knqyf263/go-rpm-version v0.0.0-20220614171824-631e686d1075/go.mod h1:i4sF0l1fFnY1aiw08QQSwVAFxHEm311Me3WsU/X7nL0= -golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rpm2docserv-20221108.e2b9545/pkg/sitemap/sitemap.go new/rpm2docserv-20221121.c1d43dd/pkg/sitemap/sitemap.go --- old/rpm2docserv-20221108.e2b9545/pkg/sitemap/sitemap.go 1970-01-01 01:00:00.000000000 +0100 +++ new/rpm2docserv-20221121.c1d43dd/pkg/sitemap/sitemap.go 2022-11-21 15:41:21.000000000 +0100 @@ -0,0 +1,99 @@ +package sitemap + +import ( + "encoding/xml" + "fmt" + "io" + "sort" + "time" +) + +type url struct { + XMLName xml.Name `xml:"url"` + Loc string `xml:"loc"` + Lastmod string `xml:"lastmod"` +} + +type sitemap struct { + XMLName xml.Name `xml:"sitemap"` + Loc string `xml:"loc"` + Lastmod string `xml:"lastmod"` +} + +const sitemapDateFormat = "2006-01-02" + +func WriteTo(w io.Writer, baseUrl string, contents map[string]time.Time) error { + if _, err := w.Write([]byte(xml.Header)); err != nil { + return err + } + enc := xml.NewEncoder(w) + + start := xml.StartElement{ + Name: xml.Name{Local: "urlset"}, + Attr: []xml.Attr{ + xml.Attr{ + Name: xml.Name{Local: "xmlns"}, + Value: "http://www.sitemaps.org/schemas/sitemap/0.9", + }, + }} + + if err := enc.EncodeToken(start); err != nil { + return err + } + pkgs := make([]string, 0, len(contents)) + for binarypkg := range contents { + pkgs = append(pkgs, binarypkg) + } + sort.Strings(pkgs) + for _, binarypkg := range pkgs { + if err := enc.EncodeElement(&url{ + Loc: fmt.Sprintf("%s/%s/index.html", baseUrl, binarypkg), + Lastmod: contents[binarypkg].Format(sitemapDateFormat), + }, xml.StartElement{Name: xml.Name{Local: "url"}}); err != nil { + return err + } + } + if err := enc.EncodeToken(xml.EndElement{Name: start.Name}); err != nil { + return err + } + + return enc.Flush() +} + +func WriteIndexTo(w io.Writer, baseUrl string, contents map[string]time.Time) error { + if _, err := w.Write([]byte(xml.Header)); err != nil { + return err + } + enc := xml.NewEncoder(w) + + start := xml.StartElement{ + Name: xml.Name{Local: "sitemapindex"}, + Attr: []xml.Attr{ + xml.Attr{ + Name: xml.Name{Local: "xmlns"}, + Value: "http://www.sitemaps.org/schemas/sitemap/0.9", + }, + }} + + if err := enc.EncodeToken(start); err != nil { + return err + } + pkgs := make([]string, 0, len(contents)) + for suite := range contents { + pkgs = append(pkgs, suite) + } + sort.Strings(pkgs) + for _, suite := range pkgs { + if err := enc.EncodeElement(&sitemap{ + Loc: fmt.Sprintf("%s/%s/sitemap.xml.gz", baseUrl, suite), + Lastmod: contents[suite].Format(sitemapDateFormat), + }, xml.StartElement{Name: xml.Name{Local: "sitemap"}}); err != nil { + return err + } + } + if err := enc.EncodeToken(xml.EndElement{Name: start.Name}); err != nil { + return err + } + + return enc.Flush() +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rpm2docserv-20221108.e2b9545/pkg/sitemap/sitemap_test.go new/rpm2docserv-20221121.c1d43dd/pkg/sitemap/sitemap_test.go --- old/rpm2docserv-20221108.e2b9545/pkg/sitemap/sitemap_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/rpm2docserv-20221121.c1d43dd/pkg/sitemap/sitemap_test.go 2022-11-21 15:41:21.000000000 +0100 @@ -0,0 +1,39 @@ +package sitemap + +import ( + "bytes" + "testing" + "time" +) + +func TestSitemap(t *testing.T) { + const want = `<?xml version="1.0" encoding="UTF-8"?> +<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url><loc>https://manpages.debian.org/jessie/pdns-recursor/index.html</loc><lastmod>2017-01-19</lastmod></url></urlset>` + + var gotb bytes.Buffer + if err := WriteTo(&gotb, "https://manpages.debian.org/jessie", map[string]time.Time{ + "pdns-recursor": time.Unix(1484816329, 0), + }); err != nil { + t.Fatal(err) + } + + if got := gotb.String(); got != want { + t.Fatalf("unexpected sitemap contents: got %q, want %q", got, want) + } +} + +func TestSitemapIndex(t *testing.T) { + const want = `<?xml version="1.0" encoding="UTF-8"?> +<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><sitemap><loc>https://manpages.debian.org/jessie/sitemap.xml.gz</loc><lastmod>2017-01-19</lastmod></sitemap></sitemapindex>` + + var gotb bytes.Buffer + if err := WriteIndexTo(&gotb, "https://manpages.debian.org", map[string]time.Time{ + "jessie": time.Unix(1484816329, 0), + }); err != nil { + t.Fatal(err) + } + + if got := gotb.String(); got != want { + t.Fatalf("unexpected sitemap contents: got %q, want %q", got, want) + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rpm2docserv-20221108.e2b9545/pkg/write/atomically.go new/rpm2docserv-20221121.c1d43dd/pkg/write/atomically.go --- old/rpm2docserv-20221108.e2b9545/pkg/write/atomically.go 2022-11-08 16:26:08.000000000 +0100 +++ new/rpm2docserv-20221121.c1d43dd/pkg/write/atomically.go 2022-11-21 15:41:21.000000000 +0100 @@ -21,7 +21,7 @@ } func Atomically(dest string, compress bool, write func(w io.Writer) error) (err error) { - f, err := ioutil.TempFile(tempDir(dest), "debiman-") + f, err := ioutil.TempFile(tempDir(dest), "docserv-") if err != nil { return err } @@ -71,7 +71,7 @@ } func AtomicallyWithGz(dest string, gzipw *gzip.Writer, write func(w io.Writer) error) (err error) { - f, err := ioutil.TempFile(tempDir(dest), "debiman-") + f, err := ioutil.TempFile(tempDir(dest), "docserv-") if err != nil { return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rpm2docserv-20221108.e2b9545/vendor/golang.org/x/net/html/token.go new/rpm2docserv-20221121.c1d43dd/vendor/golang.org/x/net/html/token.go --- old/rpm2docserv-20221108.e2b9545/vendor/golang.org/x/net/html/token.go 2022-11-08 16:26:08.000000000 +0100 +++ new/rpm2docserv-20221121.c1d43dd/vendor/golang.org/x/net/html/token.go 2022-11-21 15:41:21.000000000 +0100 @@ -605,7 +605,10 @@ z.data.end = z.data.start } }() - for dashCount := 2; ; { + + var dashCount int + beginning := true + for { c := z.readByte() if z.err != nil { // Ignore up to two dashes at EOF. @@ -620,7 +623,7 @@ dashCount++ continue case '>': - if dashCount >= 2 { + if dashCount >= 2 || beginning { z.data.end = z.raw.end - len("-->") return } @@ -638,6 +641,7 @@ } } dashCount = 0 + beginning = false } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rpm2docserv-20221108.e2b9545/vendor/modules.txt new/rpm2docserv-20221121.c1d43dd/vendor/modules.txt --- old/rpm2docserv-20221108.e2b9545/vendor/modules.txt 2022-11-08 16:26:08.000000000 +0100 +++ new/rpm2docserv-20221121.c1d43dd/vendor/modules.txt 2022-11-21 15:41:21.000000000 +0100 @@ -4,7 +4,7 @@ # github.com/knqyf263/go-rpm-version v0.0.0-20220614171824-631e686d1075 ## explicit github.com/knqyf263/go-rpm-version -# golang.org/x/net v0.1.0 +# golang.org/x/net v0.2.0 ## explicit; go 1.17 golang.org/x/net/context golang.org/x/net/html