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

54
debian/ppa.go vendored Normal file
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
debian/ppa_test.go vendored Normal file
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"})
}