You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

246 lines
4.7 KiB

// Copyright 2013 gopm authors.
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package cmd
import (
//"errors"
"fmt"
"strings"
)
const (
TRUNK = "trunk"
TAG = "tag"
BRANCH = "branch"
COMMIT = "commit"
)
var (
downloadCache map[string]bool // Saves packages that have been downloaded.
services []Service = []Service{
&GithubService{},
&GitOscService{},
&BitBucketService{},
//&GitCafeService{},
//&CodeCSDNSource{},
}
)
func getService(pkgName string) Service {
for _, service := range services {
if service.HasPkg(pkgName) {
return service
}
}
return nil
}
type Service interface {
PkgUrl(pkg *Pkg) string
HasPkg(pkgName string) bool
PkgExt() string
}
type Pkg struct {
Service Service
Name string
Ver string
VerId string
}
func (p *Pkg) VerSimpleString() string {
if p.VerId != "" {
return p.VerId
}
return p.Ver
}
func (p *Pkg) VerString() string {
if p.VerId == "" {
return p.Ver
}
return fmt.Sprintf("%v:%v", p.Ver, p.VerId)
}
func (p *Pkg) Url() string {
return p.Service.PkgUrl(p)
}
func (p *Pkg) FileName() string {
return fmt.Sprintf("%v.%v", p.VerSimpleString(), p.Service.PkgExt())
}
func NewPkg(pkgName string, ver string) *Pkg {
vers := strings.Split(ver, ":")
if len(vers) > 2 {
return nil
}
var verId string
if len(vers) == 2 {
verId = vers[1]
}
if len(vers) == 1 {
vers[0] = TRUNK
}
service := getService(pkgName)
if service == nil {
return nil
}
return &Pkg{service, pkgName, vers[0], verId}
}
// github repository
type GithubService struct {
}
func (s *GithubService) PkgUrl(pkg *Pkg) string {
var verPath string
if pkg.Ver == TRUNK {
verPath = "master"
} else {
verPath = pkg.VerId
}
return fmt.Sprintf("https://%v/archive/%v.zip", pkg.Name, verPath)
}
func (s *GithubService) HasPkg(pkgName string) bool {
return strings.HasPrefix(pkgName, "github.com")
}
func (s *GithubService) PkgExt() string {
return "zip"
}
// git osc repos
type GitOscService struct {
}
func (s *GitOscService) PkgUrl(pkg *Pkg) string {
var verPath string
if pkg.Ver == TRUNK {
verPath = "master"
} else {
verPath = pkg.VerId
}
return fmt.Sprintf("https://%v/repository/archive?ref=%v", pkg.Name, verPath)
}
func (s *GitOscService) HasPkg(pkgName string) bool {
return strings.HasPrefix(pkgName, "git.oschina.net")
}
func (s *GitOscService) PkgExt() string {
return "zip"
}
// bitbucket.org
type BitBucketService struct {
}
func (s *BitBucketService) PkgUrl(pkg *Pkg) string {
var verPath string
if pkg.Ver == TRUNK {
verPath = "default"
} else {
verPath = pkg.VerId
}
return fmt.Sprintf("https://%v/get/%v.zip", pkg.Name, verPath)
}
func (s *BitBucketService) HasPkg(pkgName string) bool {
return strings.HasPrefix(pkgName, "bitbucket.org")
}
func (s *BitBucketService) PkgExt() string {
return "zip"
}
type GitCafeService struct {
}
func (s *GitCafeService) PkgUrl(pkg *Pkg) string {
var verPath string
if pkg.Ver == TRUNK {
verPath = "master"
} else {
verPath = pkg.VerId
}
return fmt.Sprintf("https://%v/tarball/%v", pkg.Name, verPath)
}
func (s *GitCafeService) HasPkg(pkgName string) bool {
return strings.HasPrefix(pkgName, "gitcafe.com")
}
func (s *GitCafeService) PkgExt() string {
return "tar.gz"
}
// git lab repos, not completed
type GitLabService struct {
DomainOrIp string
Username string
Passwd string
PrivateKey string
}
func (s *GitLabService) PkgUrl(pkg *Pkg) string {
var verPath string
if pkg.Ver == TRUNK {
verPath = "master"
} else {
verPath = pkg.VerId
}
return fmt.Sprintf("https://%v/repository/archive/%v", pkg.Name, verPath)
}
func (s *GitLabService) HasPkg(pkgName string) bool {
return strings.HasPrefix(pkgName, s.DomainOrIp)
}
func (s *GitLabService) PkgExt() string {
return "tar.gz"
}
// code.csdn.net
type CodeCSDNService struct {
}
func (s *CodeCSDNService) PkgUrl(pkg *Pkg) string {
var verPath string
if pkg.Ver == TRUNK {
verPath = "master"
} else {
verPath = pkg.VerId
}
return fmt.Sprintf("https://%v/repository/archive?ref=%v", pkg.Name, verPath)
}
func (s *CodeCSDNService) HasPkg(pkgName string) bool {
return strings.HasPrefix(pkgName, "code.csdn.net")
}
func (s *CodeCSDNService) PkgExt() string {
return "zip"
}