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

Reply via email to