devel-importer: adapt for scmsync packages
This commit is contained in:
parent
11bf2aafcd
commit
798f96e364
@ -22,6 +22,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -92,6 +93,27 @@ func (refs *GitReferences) addReference(id, branch string) {
|
|||||||
refs.refs = append(refs.refs, GitReference{Branch: branch, Id: id})
|
refs.refs = append(refs.refs, GitReference{Branch: branch, Id: id})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *GitHandler) CloneDevel(gitDir, outName, urlString string) error {
|
||||||
|
url, err := url.Parse(urlString)
|
||||||
|
branch := url.Fragment
|
||||||
|
url.Fragment = ""
|
||||||
|
|
||||||
|
params := []string{"clone", "-o", "devel"}
|
||||||
|
if len(branch) > 0 {
|
||||||
|
params = append(params, "-b", branch)
|
||||||
|
}
|
||||||
|
params = append(params, url.String(), outName)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error parsing SSH URL. %w", err);
|
||||||
|
}
|
||||||
|
out, err := e.GitExecWithOutput(gitDir, params...)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error cloning %s.\n%s\nerr: %w", urlString, out, err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (e *GitHandler) GitBranchHead(gitDir, branchName string) (string, error) {
|
func (e *GitHandler) GitBranchHead(gitDir, branchName string) (string, error) {
|
||||||
id, err := e.GitExecWithOutput(gitDir, "rev-list", "-1", branchName)
|
id, err := e.GitExecWithOutput(gitDir, "rev-list", "-1", branchName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -87,6 +87,13 @@ type ProjectMeta struct {
|
|||||||
UseForBuild Flags `xml:"useforbuild"`
|
UseForBuild Flags `xml:"useforbuild"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PackageMeta struct {
|
||||||
|
XMLName xml.Name `xml:"package"`
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
Project string `xml:"project,attr"`
|
||||||
|
ScmSync string `xml:"scmsync"`
|
||||||
|
}
|
||||||
|
|
||||||
func parseProjectMeta(data []byte) (*ProjectMeta, error) {
|
func parseProjectMeta(data []byte) (*ProjectMeta, error) {
|
||||||
var meta ProjectMeta
|
var meta ProjectMeta
|
||||||
err := xml.Unmarshal(data, &meta)
|
err := xml.Unmarshal(data, &meta)
|
||||||
@ -128,6 +135,43 @@ func (c *ObsClient) GetProjectMeta(project string) (*ProjectMeta, error) {
|
|||||||
return parseProjectMeta(data)
|
return parseProjectMeta(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *ObsClient) GetPackageMeta(project, pkg string) (*PackageMeta, error) {
|
||||||
|
req, err := http.NewRequest("GET", c.baseUrl.JoinPath("source", project, pkg, "_meta").String(), nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req.SetBasicAuth(c.user, c.password)
|
||||||
|
log.Printf("request: %#v", *req.URL)
|
||||||
|
log.Printf("headers: %#v", req.Header)
|
||||||
|
res, err := c.client.Do(req)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch res.StatusCode {
|
||||||
|
case 200:
|
||||||
|
break
|
||||||
|
case 404:
|
||||||
|
return nil, nil
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("Unexpected return code: %d", res.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := io.ReadAll(res.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var meta PackageMeta
|
||||||
|
err = xml.Unmarshal(data, &meta)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &meta, nil
|
||||||
|
}
|
||||||
|
|
||||||
func ObsSafeProjectName(prjname string) string {
|
func ObsSafeProjectName(prjname string) string {
|
||||||
if len(prjname) < 1 {
|
if len(prjname) < 1 {
|
||||||
return prjname
|
return prjname
|
||||||
|
@ -24,6 +24,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
"slices"
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@ -176,6 +177,38 @@ func main() {
|
|||||||
for i := range factoryRepos {
|
for i := range factoryRepos {
|
||||||
pkg := factoryRepos[i]
|
pkg := factoryRepos[i]
|
||||||
|
|
||||||
|
// verify that package was created by `git-importer`, or it's scmsync package and clone it
|
||||||
|
fi, err := os.Stat(filepath.Join(git.GitPath, pkg.Name))
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
// scmsync?
|
||||||
|
devel_project, err := runObsCommand("develproject", "openSUSE:Factory", pkg.Name)
|
||||||
|
if err != nil {
|
||||||
|
log.Panicln(err)
|
||||||
|
}
|
||||||
|
d := strings.Split(strings.TrimSpace(string(devel_project)), "/")
|
||||||
|
if len(d) != 2 {
|
||||||
|
log.Panicln("expected devel project/package. got:", d)
|
||||||
|
}
|
||||||
|
obs, _ := common.NewObsClient("api.opensuse.org")
|
||||||
|
meta, _ := obs.GetPackageMeta(d[0], d[1])
|
||||||
|
if len(meta.ScmSync) > 0 {
|
||||||
|
if err2 := git.CloneDevel("", pkg.Name, meta.ScmSync); err != nil {
|
||||||
|
log.Panicln(err2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// try again, should now exist
|
||||||
|
if fi, err = os.Stat(filepath.Join(git.GitPath, pkg.Name)); err != nil {
|
||||||
|
log.Panicln(err)
|
||||||
|
}
|
||||||
|
} else if err != nil {
|
||||||
|
log.Panicln(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !fi.IsDir() {
|
||||||
|
log.Panicln("Expected package file should be a directory. It's not.", fi)
|
||||||
|
}
|
||||||
|
|
||||||
// add remote repos
|
// add remote repos
|
||||||
out := git.GitExecWithOutputOrPanic(pkg.Name, "remote", "show", "-n")
|
out := git.GitExecWithOutputOrPanic(pkg.Name, "remote", "show", "-n")
|
||||||
switch pkg.Owner.UserName {
|
switch pkg.Owner.UserName {
|
||||||
@ -198,7 +231,10 @@ func main() {
|
|||||||
|
|
||||||
for _, pkgName := range oldPackageNames {
|
for _, pkgName := range oldPackageNames {
|
||||||
log.Println("fetching git:", pkgName)
|
log.Println("fetching git:", pkgName)
|
||||||
out := git.GitExecWithOutputOrPanic(pkgName, "fetch", "--multiple", "factory", "rpm")
|
remotes := common.SplitStringNoEmpty(git.GitExecWithOutputOrPanic(pkgName, "remote", "show", "-n"), "\n")
|
||||||
|
params := []string{"fetch", "--multiple"}
|
||||||
|
params = append(params, remotes...)
|
||||||
|
out := git.GitExecWithOutputOrPanic(pkgName, params...)
|
||||||
if len(strings.TrimSpace(out)) > 1 {
|
if len(strings.TrimSpace(out)) > 1 {
|
||||||
log.Println(out)
|
log.Println(out)
|
||||||
}
|
}
|
||||||
@ -208,8 +244,11 @@ func main() {
|
|||||||
old_revs := strings.Split(out, "\n")
|
old_revs := strings.Split(out, "\n")
|
||||||
out = git.GitExecWithOutputOrPanic(pkgName, "rev-list", "factory", "^factory/factory")
|
out = git.GitExecWithOutputOrPanic(pkgName, "rev-list", "factory", "^factory/factory")
|
||||||
added_revs := strings.Split(out, "\n")
|
added_revs := strings.Split(out, "\n")
|
||||||
out = git.GitExecWithOutputOrPanic(pkgName, "rev-list", "factory", "^rpm/factory")
|
added_rpm_revs := []string{}
|
||||||
added_rpm_revs := strings.Split(out, "\n")
|
if slices.Contains(remotes, "rpm") {
|
||||||
|
out = git.GitExecWithOutputOrPanic(pkgName, "rev-list", "factory", "^rpm/factory")
|
||||||
|
added_rpm_revs = strings.Split(out, "\n")
|
||||||
|
}
|
||||||
if len(added_revs) == len(old_revs) && len(added_rpm_revs) == len(old_revs) {
|
if len(added_revs) == len(old_revs) && len(added_rpm_revs) == len(old_revs) {
|
||||||
log.Printf("Something is wrong with rev-ist for (len %d): %s\n", len(added_revs), pkgName)
|
log.Printf("Something is wrong with rev-ist for (len %d): %s\n", len(added_revs), pkgName)
|
||||||
reposOK = false
|
reposOK = false
|
||||||
|
Loading…
Reference in New Issue
Block a user