init repo

Sun, 14 Dec 2025 16:51:29 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 14 Dec 2025 16:51:29 +0100
changeset 0
75d2ad4c7dee
child 1
05a8e80e577e

init repo

.hgignore file | annotate | diff | comparison | revisions
build.template file | annotate | diff | comparison | revisions
src/go.mod file | annotate | diff | comparison | revisions
src/main.go file | annotate | diff | comparison | revisions
testconfig.xml file | annotate | diff | comparison | revisions
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Sun Dec 14 16:51:29 2025 +0100
@@ -0,0 +1,3 @@
+^.idea/
+^tmp/
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/build.template	Sun Dec 14 16:51:29 2025 +0100
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+echo {{ .Path }}
+echo TODO
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/go.mod	Sun Dec 14 16:51:29 2025 +0100
@@ -0,0 +1,3 @@
+module uwbuild
+
+go 1.25
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main.go	Sun Dec 14 16:51:29 2025 +0100
@@ -0,0 +1,149 @@
+package main
+
+import (
+	"bytes"
+	"encoding/xml"
+	"fmt"
+	"log"
+	"os"
+	"os/exec"
+	"path"
+	"text/template"
+)
+
+type Config struct {
+	XMLName  xml.Name `xml:"config"`
+	BuildEnv []struct {
+		Name string `xml:"name,attr"`
+		Host string `xml:"host"`
+		User string `xml:"user"`
+	} `xml:"buildenv"`
+
+	Repository []struct {
+		Path      string `xml:"path"`
+		BuildEnvs string `xml:"buildenvs"`
+		Build     []struct {
+			IsPlatform  string   `xml:"isplatform,attr"`
+			NotPlatform string   `xml:"not,attr"`
+			Test        []string `xml:"test"`
+			Var         []struct {
+				Name  string `xml:"name,attr"`
+				Value string `xml:",chardata"`
+			}
+			Configure string `xml:"configure"`
+			Compile   string `xml:"compile"`
+			Check     string `xml:"check"`
+		} `xml:"build"`
+	} `xml:"repository"`
+}
+
+func main() {
+	data, err := os.ReadFile("testconfig.xml")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	config := &Config{}
+	if err := xml.Unmarshal(data, &config); err != nil {
+		log.Fatal(err)
+	}
+
+	templateStr, err := os.ReadFile("build.template")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	tpl, err := template.New("").Parse(string(templateStr))
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	err = os.Mkdir("tmp", 0755)
+	if err != nil && !os.IsExist(err) {
+		log.Fatal(err)
+	}
+
+	tmpDir := "tmp"
+
+	for _, repo := range config.Repository {
+		// create a build directory, that contains the repository source
+		// and build scripts
+		buildPath := path.Join(tmpDir, "build")
+
+		if err = os.RemoveAll(buildPath); err != nil {
+			log.Fatal(err)
+		}
+		if err = os.RemoveAll(path.Join(tmpDir, "build.tar")); err != nil {
+			log.Fatal(err)
+		}
+		if err = os.RemoveAll(path.Join(tmpDir, "build.tar.gz")); err != nil {
+			log.Fatal(err)
+		}
+
+		err = os.Mkdir(buildPath, 0755)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		// update repository and copy it to the build directory
+		cmd := exec.Command("hg", "pull")
+		var outb, errb bytes.Buffer
+		cmd.Dir = repo.Path
+		cmd.Stdout = &outb
+		cmd.Stderr = &errb
+		err = cmd.Run()
+		if err != nil {
+			log.Print("hg: ", errb.String())
+			log.Fatal(err)
+		}
+
+		outb.Reset()
+		errb.Reset()
+		cmd = exec.Command("hg", "update")
+		cmd.Dir = repo.Path
+		cmd.Stdout = &outb
+		cmd.Stderr = &errb
+		err = cmd.Run()
+		if err != nil {
+			log.Print("hg: ", errb.String())
+			log.Fatal(err)
+		}
+
+		// copy repository to the tmp build directory
+		cmd = exec.Command("cp", "-r", repo.Path, path.Join(buildPath, "src"))
+		err = cmd.Run()
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		// create build script
+		file, err := os.Create(path.Join(buildPath, "build.sh"))
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		err = tpl.Execute(file, repo)
+
+		if err != nil {
+			log.Fatal(err)
+		}
+		file.Close()
+
+		// create tarball
+		cmd = exec.Command("tar", "cvf", "../build.tar", "src", "build.sh")
+		cmd.Dir = buildPath
+		if err := cmd.Run(); err != nil {
+			log.Print("tar error")
+			log.Fatal(err)
+		}
+
+		fmt.Println(path.Join(buildPath, "build.tar"))
+		cmd = exec.Command("gzip", path.Join(tmpDir, "build.tar"))
+		if err := cmd.Run(); err != nil {
+			log.Print("gzip error")
+			log.Fatal(err)
+		}
+
+		// TODO: upload build.tar.gz to buildenvs and execute the build.sh script remotely
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testconfig.xml	Sun Dec 14 16:51:29 2025 +0100
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<config>
+	<buildenv name="x1">
+		<host>x1</host>
+	</buildenv>
+
+	<repository>
+		<path>../ucx</path>
+		<buildon>linux</buildon>
+		<build isplatform="linux">
+			<test>true</test>
+			<test>which make</test>
+			<var name="CFLAGS">-m64</var>
+			<var name="LDFLAGS">-m64></var>
+			<configure>./configure --debug</configure>
+			<compile>make</compile>
+			<test>build/test/ucxtest</test>
+		</build>
+	</repository>
+</config>

mercurial