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.

151 lines
2.8 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.
sources []Source = []Source{
&GithubSource{},
&GitOscSource{},
}
)
func getSource(pkgName string) Source {
for _, source := range sources {
if source.HasPkg(pkgName) {
return source
}
}
return nil
}
type Source interface {
PkgUrl(pkg *Pkg) string
HasPkg(pkgName string) bool
PkgExt() string
}
type Pkg struct {
Source Source
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.Source.PkgUrl(p)
}
func (p *Pkg) FileName() string {
return fmt.Sprintf("%v.%v", p.VerSimpleString(), p.Source.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]
}
source := getSource(pkgName)
if source == nil {
return nil
}
return &Pkg{source, pkgName, vers[0], verId}
}
// github repository
type GithubSource struct {
}
func (s *GithubSource) 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 *GithubSource) HasPkg(pkgName string) bool {
return strings.HasPrefix(pkgName, "github.com")
}
func (s *GithubSource) PkgExt() string {
return "zip"
}
// git osc repos
type GitOscSource struct {
}
func (s *GitOscSource) 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 *GitOscSource) HasPkg(pkgName string) bool {
return strings.HasPrefix(pkgName, "git.oschina.net")
}
func (s *GitOscSource) PkgExt() string {
return "zip"
}
type GitLabSource struct {
IP string
Username string
Passwd string
PrivateKey string
}