mirror of https://github.com/gogits/gogs.git
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.
241 lines
4.6 KiB
241 lines
4.6 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] |
|
} |
|
|
|
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" |
|
}
|
|
|