diff options
| author | Jeff Carr <[email protected]> | 2025-10-27 15:03:18 -0500 | 
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-10-27 15:20:23 -0500 | 
| commit | 48dd4e6cb7d8107f12d21ef3b980427b2f3e517a (patch) | |
| tree | 0a3d8bb013a5b5805a4837f6ad2a187fef676545 | |
| parent | e746a70f9a213795a823afe4a36f97a68b27e071 (diff) | |
hopefully really checks the versions nowv0.0.33
| -rw-r--r-- | doIncoming.go | 139 | 
1 files changed, 135 insertions, 4 deletions
diff --git a/doIncoming.go b/doIncoming.go index bca869a..b3ab324 100644 --- a/doIncoming.go +++ b/doIncoming.go @@ -2,8 +2,10 @@ package main  import (  	"errors" +	"fmt"  	"os"  	"path/filepath" +	"strconv"  	"strings"  	"go.wit.com/lib/config" @@ -38,11 +40,138 @@ func moveOutOfIncoming(fullname string, repopath string) error {  	return nil  } +// newver(0.25.101-1+b10) +// a == 0 +// b == 25 +// c == 101 +// pnum == 1 +// bnum == 10 +type vers struct { +	a    int // major +	b    int +	c    int +	pnum int +	bnum int +} + +func tokenVersions(ver string) (*vers, error) { +	var err error +	tok := new(vers) +	parts := strings.Split(ver, "-") +	if len(parts) != 2 { +		return nil, errors.New(fmt.Sprintf("len != 2 %v", parts)) +	} +	abc := strings.Split(parts[0], ".") +	if len(abc) != 3 { +		return nil, errors.New(fmt.Sprintf("len != 3 parts(%v) abc(%v)", parts, abc)) +	} +	tok.a, err = strconv.Atoi(abc[0]) +	if err != nil { +		return nil, errors.Join(err, errors.New(fmt.Sprintf("parts(%v) abc(%v)", parts, abc))) +	} +	tok.b, err = strconv.Atoi(abc[1]) +	if err != nil { +		return nil, errors.Join(err, errors.New(fmt.Sprintf("parts(%v) abc(%v)", parts, abc))) +	} +	tok.c, err = strconv.Atoi(abc[2]) +	if err != nil { +		return nil, errors.Join(err, errors.New(fmt.Sprintf("parts(%v) abc(%v)", parts, abc))) +	} +	bb := strings.Split(parts[1], "+") +	if len(bb) != 2 { +		return nil, errors.Join(err, errors.New(fmt.Sprintf("parts(%v) abc(%v)", parts, abc))) +	} +	tok.pnum, err = strconv.Atoi(bb[0]) +	if err != nil { +		return nil, errors.Join(err, errors.New(fmt.Sprintf("parts(%v) abc(%v)", parts, abc))) +	} +	tok.bnum, err = strconv.Atoi(strings.TrimPrefix(bb[1], "b")) +	if err != nil { +		return nil, errors.Join(err, errors.New(fmt.Sprintf("parts(%v) abc(%v)", parts, abc))) +	} +	return tok, nil +} + +// compares newver(0.25.101-1+b10) curver(0.25.101-5+b1) +func compareVersions(newver string, curver string) (bool, error) { +	newtok, err1 := tokenVersions(newver) +	curtok, err2 := tokenVersions(curver) +	if (newtok == nil) || (curtok == nil) { +		s := log.Sprintf("token on the railroad failed (%v) to curver (%v) err(%v)(%v)", newtok, curtok, err1, err2) +		return false, errors.New(s) +	} +	// log.Printf("compare (%v) to (%v)\n", newtok, curtok) +	if curtok.a > newtok.a { +		return false, errors.New(log.Sprintf("A.x.x lower (%v) to curver (%v)", newver, curver)) +	} +	if curtok.b > newtok.b { +		return false, errors.New(log.Sprintf("x.B.x lower (%v) to curver (%v)", newver, curver)) +	} +	if curtok.c > newtok.c { +		return false, errors.New(log.Sprintf("x.x.C lower (%v) to curver (%v)", newver, curver)) +	} +	if curtok.pnum > newtok.pnum { +		return false, errors.New(log.Sprintf("patch # lower (%v) to curver (%v)", newver, curver)) +	} +	if curtok.bnum > newtok.bnum { +		return false, errors.New(log.Sprintf("build # lower (%v) to curver (%v)", newver, curver)) +	} +	if curtok.bnum == newtok.bnum { +		return false, errors.New(log.Sprintf("build is equal (%v) to curver (%v)", newver, curver)) +	} +	return true, nil +} + +func moveToBad(packageName string, fullname string, err error) string { +	_, filename := filepath.Split(fullname) +	baddir := filepath.Join(me.pb.BaseDir, "badincoming") +	os.MkdirAll(baddir, 0755) +	newbadname := filepath.Join(baddir, filename) +	os.Rename(fullname, newbadname) +	return newbadname +} + +// true if package is actually newer +func checkAgainstNewest(fullname string, newest *zoopb.Packages) bool { +	_, filename := filepath.Split(fullname) +	parts := strings.Split(filename, "_") +	if len(parts) != 3 { +		// todo: add more filename checking here (check for ".deb") +		// return errors.New(log.Sprintf("bad filenae %s", filename)) +		return false +	} +	packageName := parts[0] +	version := parts[1] +	p := newest.FindByPackage(packageName) +	if p == nil { +		log.Info("NEW PACKAGE NAME", packageName, version, fullname) +		return false +	} +	_, filename = filepath.Split(p.Filename) +	parts = strings.Split(filename, "_") +	if len(parts) != 3 { +		// this should never happen +		return false +	} +	curversion := parts[1] +	if ok, err := compareVersions(version, curversion); ok { +		log.Printf("IS NEW: %s err=(%v)\n", packageName, err) +	} else { +		// log.Printf("IS BAD: %s err=(%v)\n", packageName, err) +		badname := moveToBad(packageName, fullname, err) +		log.Printf("IS BAD: %s err=(%v) %s\n", packageName, err, badname) +	} + +	return false +} +  func doIncoming(pb *zoopb.Packages) (string, error) {  	if err := os.Chdir(me.pb.BaseDir); err != nil {  		return "no dir " + me.pb.BaseDir, err  	} +	newest := doGetNewest("amd64") +  	globPattern := "/home/mirrors/wit/incoming/*.deb"  	files, err := filepath.Glob(globPattern)  	if err != nil { @@ -50,8 +179,9 @@ func doIncoming(pb *zoopb.Packages) (string, error) {  	}  	for _, filename := range files { -		// log.Info("need to move", filename) -		moveOutOfIncoming(filename, "pool/main") +		if checkAgainstNewest(filename, newest) { +			moveOutOfIncoming(filename, "pool/main") +		}  	}  	globPattern = "/home/mirrors/wit/incoming-devel/*.deb" @@ -61,8 +191,9 @@ func doIncoming(pb *zoopb.Packages) (string, error) {  	}  	for _, filename := range files { -		// log.Info("need to move", filename) -		moveOutOfIncoming(filename, "pool/main") +		if checkAgainstNewest(filename, newest) { +			moveOutOfIncoming(filename, "pool/main") +		}  	}  	s := log.Sprintf("scanned (%d) in incoming", len(files))  | 
