Short syntax for aptly mirror create to support ppa:user/project mirror URLs.

This commit is contained in:
Andrey Smirnov
2014-03-06 21:06:50 +04:00
parent 92c3bf0220
commit bed0ac475e
5 changed files with 116 additions and 3 deletions
+21 -2
View File
@@ -6,18 +6,34 @@ import (
"github.com/gonuts/flag" "github.com/gonuts/flag"
"github.com/smira/aptly/debian" "github.com/smira/aptly/debian"
"github.com/smira/aptly/utils" "github.com/smira/aptly/utils"
"strings"
) )
func aptlyMirrorCreate(cmd *commander.Command, args []string) error { func aptlyMirrorCreate(cmd *commander.Command, args []string) error {
var err error var err error
if len(args) < 3 { if !(len(args) == 2 && strings.HasPrefix(args[1], "ppa:") || len(args) >= 3) {
cmd.Usage() cmd.Usage()
return err return err
} }
downloadSources := utils.Config.DownloadSourcePackages || cmd.Flag.Lookup("with-sources").Value.Get().(bool) downloadSources := utils.Config.DownloadSourcePackages || cmd.Flag.Lookup("with-sources").Value.Get().(bool)
repo, err := debian.NewRemoteRepo(args[0], args[1], args[2], args[3:], context.architecturesList, downloadSources) var (
mirrorName, archiveURL, distribution string
components []string
)
mirrorName = args[0]
if len(args) == 2 {
archiveURL, distribution, components, err = debian.ParsePPA(args[1])
if err != nil {
return err
}
} else {
archiveURL, distribution, components = args[1], args[2], args[3:]
}
repo, err := debian.NewRemoteRepo(mirrorName, archiveURL, distribution, components, context.architecturesList, downloadSources)
if err != nil { if err != nil {
return fmt.Errorf("unable to create mirror: %s", err) return fmt.Errorf("unable to create mirror: %s", err)
} }
@@ -51,6 +67,9 @@ func makeCmdMirrorCreate() *commander.Command {
Long: ` Long: `
Create records information about new mirror and fetches Release file (it doesn't download packages). Create records information about new mirror and fetches Release file (it doesn't download packages).
PPA url could specified in short format when running on Debian/Ubuntu:
$ aptly mirror create some_ppa ppa:user/project
ex: ex:
$ aptly mirror create wheezy-main http://mirror.yandex.ru/debian/ wheezy main $ aptly mirror create wheezy-main http://mirror.yandex.ru/debian/ wheezy main
`, `,
+54
View File
@@ -0,0 +1,54 @@
package debian
import (
"fmt"
"github.com/smira/aptly/utils"
"os/exec"
"regexp"
"strings"
)
var ppaRegexp = regexp.MustCompile("^ppa:([^/]+)/(.+)$")
// ParsePPA converts ppa URL like ppa:user/ppa-name to full HTTP url
func ParsePPA(ppaURL string) (url string, distribution string, components []string, err error) {
matches := ppaRegexp.FindStringSubmatch(ppaURL)
if matches == nil {
err = fmt.Errorf("unable to parse ppa URL: %v", ppaURL)
return
}
distributorID := utils.Config.PpaDistributorID
if distributorID == "" {
distributorID, err = getDistributorID()
if err != nil {
err = fmt.Errorf("unable to figure out Distributor ID: %s, please set config option ppaDistributorID", err)
return
}
}
codename := utils.Config.PpaCodename
if codename == "" {
codename, err = getCodename()
if err != nil {
err = fmt.Errorf("unable to figure out Codename: %s, please set config option ppaCodename", err)
return
}
}
distribution = codename
components = []string{"main"}
url = fmt.Sprintf("http://ppa.launchpad.net/%s/%s/%s", matches[1], matches[2], distributorID)
return
}
func getCodename() (string, error) {
out, err := exec.Command("lsb_release", "-sc").Output()
return strings.TrimSpace(string(out)), err
}
func getDistributorID() (string, error) {
out, err := exec.Command("lsb_release", "-si").Output()
return strings.ToLower(strings.TrimSpace(string(out))), err
}
+34
View File
@@ -0,0 +1,34 @@
package debian
import (
"github.com/smira/aptly/utils"
. "launchpad.net/gocheck"
)
type PpaSuite struct {
savedConfig utils.ConfigStructure
}
var _ = Suite(&PpaSuite{})
func (s *PpaSuite) SetUpTest(c *C) {
s.savedConfig = utils.Config
}
func (s *PpaSuite) TearDownTest(c *C) {
utils.Config = s.savedConfig
}
func (s *PpaSuite) TestParsePPA(c *C) {
_, _, _, err := ParsePPA("ppa:dedeed")
c.Check(err, ErrorMatches, "unable to parse ppa URL.*")
utils.Config.PpaDistributorID = "debian"
utils.Config.PpaCodename = "wheezy"
url, distribution, components, err := ParsePPA("ppa:user/project")
c.Check(err, IsNil)
c.Check(url, Equals, "http://ppa.launchpad.net/user/project/debian")
c.Check(distribution, Equals, "wheezy")
c.Check(components, DeepEquals, []string{"main"})
}
+4
View File
@@ -18,6 +18,8 @@ type ConfigStructure struct {
GpgDisableSign bool `json:"gpgDisableSign"` GpgDisableSign bool `json:"gpgDisableSign"`
GpgDisableVerify bool `json:"gpgDisableVerify"` GpgDisableVerify bool `json:"gpgDisableVerify"`
DownloadSourcePackages bool `json:"downloadSourcePackages"` DownloadSourcePackages bool `json:"downloadSourcePackages"`
PpaDistributorID string `json:"ppaDistributorID"`
PpaCodename string `json:"ppaCodename"`
} }
// Config is configuration for aptly, shared by all modules // Config is configuration for aptly, shared by all modules
@@ -32,6 +34,8 @@ var Config = ConfigStructure{
GpgDisableSign: false, GpgDisableSign: false,
GpgDisableVerify: false, GpgDisableVerify: false,
DownloadSourcePackages: false, DownloadSourcePackages: false,
PpaDistributorID: "ubuntu",
PpaCodename: "",
} }
// LoadConfig loads configuration from json file // LoadConfig loads configuration from json file
+3 -1
View File
@@ -51,7 +51,9 @@ func (s *ConfigSuite) TestSaveConfig(c *C) {
" \"dependencyFollowSource\": false,\n"+ " \"dependencyFollowSource\": false,\n"+
" \"gpgDisableSign\": false,\n"+ " \"gpgDisableSign\": false,\n"+
" \"gpgDisableVerify\": false,\n"+ " \"gpgDisableVerify\": false,\n"+
" \"downloadSourcePackages\": false\n"+ " \"downloadSourcePackages\": false,\n"+
" \"ppaDistributorID\": \"\",\n"+
" \"ppaCodename\": \"\"\n"+
"}") "}")
} }