aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build/ci.go41
-rw-r--r--build/dput-launchpad.cf8
-rw-r--r--internal/build/util.go31
3 files changed, 53 insertions, 27 deletions
diff --git a/build/ci.go b/build/ci.go
index 6ca08d9ef..11fa759da 100644
--- a/build/ci.go
+++ b/build/ci.go
@@ -511,41 +511,44 @@ func doDebianSource(cmdline []string) {
debuild.Dir = pkgdir
build.MustRun(debuild)
- changes := fmt.Sprintf("%s_%s_source.changes", meta.Name(), meta.VersionString())
- changes = filepath.Join(*workdir, changes)
+ var (
+ basename = fmt.Sprintf("%s_%s", meta.Name(), meta.VersionString())
+ source = filepath.Join(*workdir, basename+".tar.xz")
+ dsc = filepath.Join(*workdir, basename+".dsc")
+ changes = filepath.Join(*workdir, basename+"_source.changes")
+ )
if *signer != "" {
build.MustRunCommand("debsign", changes)
}
if *upload != "" {
- uploadDebianSource(*workdir, *upload, *sshUser, changes)
+ ppaUpload(*workdir, *upload, *sshUser, []string{source, dsc, changes})
}
}
}
}
-func uploadDebianSource(workdir, ppa, sshUser, changes string) {
- // Create the dput config file.
- dputConfig := filepath.Join(workdir, "dput.cf")
+func ppaUpload(workdir, ppa, sshUser string, files []string) {
p := strings.Split(ppa, "/")
if len(p) != 2 {
log.Fatal("-upload PPA name must contain single /")
}
- templateData := map[string]string{
- "LaunchpadUser": p[0],
- "LaunchpadPPA": p[1],
- "LaunchpadSSH": sshUser,
+ if sshUser == "" {
+ sshUser = p[0]
}
+ incomingDir := fmt.Sprintf("~%s/ubuntu/%s", p[0], p[1])
+ // Create the SSH identity file if it doesn't exist.
+ var idfile string
if sshkey := getenvBase64("PPA_SSH_KEY"); len(sshkey) > 0 {
- idfile := filepath.Join(workdir, "sshkey")
- ioutil.WriteFile(idfile, sshkey, 0600)
- templateData["IdentityFile"] = idfile
+ idfile = filepath.Join(workdir, "sshkey")
+ if _, err := os.Stat(idfile); os.IsNotExist(err) {
+ ioutil.WriteFile(idfile, sshkey, 0600)
+ }
+ }
+ // Upload
+ dest := sshUser + "@ppa.launchpad.net"
+ if err := build.UploadSFTP(idfile, dest, incomingDir, files); err != nil {
+ log.Fatal(err)
}
- build.Render("build/dput-launchpad.cf", dputConfig, 0644, templateData)
-
- // Run dput to do the upload.
- dput := exec.Command("dput", "-c", dputConfig, "--no-upload-log", ppa, changes)
- dput.Stdin = strings.NewReader("Yes\n") // accept SSH host key
- build.MustRun(dput)
}
func getenvBase64(variable string) []byte {
diff --git a/build/dput-launchpad.cf b/build/dput-launchpad.cf
deleted file mode 100644
index 3063c3c07..000000000
--- a/build/dput-launchpad.cf
+++ /dev/null
@@ -1,8 +0,0 @@
-[{{.LaunchpadUser}}/{{.LaunchpadPPA}}]
-fqdn = ppa.launchpad.net
-method = sftp
-incoming = ~{{.LaunchpadUser}}/ubuntu/{{.LaunchpadPPA}}/
-login = {{.LaunchpadSSH}}
-{{ if .IdentityFile }}
- ssh_options = IdentityFile {{.IdentityFile}}
-{{ end }}
diff --git a/internal/build/util.go b/internal/build/util.go
index 195bdb404..a41ecfbed 100644
--- a/internal/build/util.go
+++ b/internal/build/util.go
@@ -177,3 +177,34 @@ func ExpandPackagesNoVendor(patterns []string) []string {
}
return patterns
}
+
+// UploadSFTP uploads files to a remote host using the sftp command line tool.
+// The destination host may be specified either as [user@]host[: or as a URI in
+// the form sftp://[user@]host[:port].
+func UploadSFTP(identityFile, host, dir string, files []string) error {
+ sftp := exec.Command("sftp")
+ sftp.Stdout = nil
+ sftp.Stderr = os.Stderr
+ if identityFile != "" {
+ sftp.Args = append(sftp.Args, "-i", identityFile)
+ }
+ sftp.Args = append(sftp.Args, host)
+ fmt.Println(">>>", strings.Join(sftp.Args, " "))
+ if *DryRunFlag {
+ return nil
+ }
+
+ stdin, err := sftp.StdinPipe()
+ if err != nil {
+ return fmt.Errorf("can't create stdin pipe for sftp: %v", err)
+ }
+ if err := sftp.Start(); err != nil {
+ return err
+ }
+ in := io.MultiWriter(stdin, os.Stdout)
+ for _, f := range files {
+ fmt.Fprintln(in, "put", f, path.Join(dir, filepath.Base(f)))
+ }
+ stdin.Close()
+ return sftp.Wait()
+}