From 4fbe5d14eb2608028d8a94a0d52c7df3187cdf36 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 14 Aug 2013 13:14:59 +0800 Subject: [PATCH] get add gitosc & bitbucket --- cmd/get.go | 12 ++- cmd/service.go | 241 +++++++++++++++++++++++++++++++++++++++++++++++++ cmd/source.go | 150 ------------------------------ 3 files changed, 249 insertions(+), 154 deletions(-) create mode 100644 cmd/service.go delete mode 100644 cmd/source.go diff --git a/cmd/get.go b/cmd/get.go index 68294503d..2c710f7dd 100644 --- a/cmd/get.go +++ b/cmd/get.go @@ -253,20 +253,24 @@ func extractPkg(pkg *Pkg, localfile string, update bool) error { defer r.Close() for _, f := range r.File { - //fmt.Printf("Contents of %s:\n", f.Name) + fmt.Printf("Contents of %s:\n", f.Name) + if f.FileInfo().IsDir() { + continue + } + paths := strings.Split(f.Name, "/")[1:] //fmt.Println(paths) if len(paths) < 1 { continue } - if f.FileInfo().IsDir() { - childDir := joinPath(dstDir, joinPath(paths...)) + if len(paths) > 1 { + childDir := joinPath(dstDir, joinPath(paths[0:len(paths)-1]...)) + //fmt.Println("creating", childDir) err = os.MkdirAll(childDir, 0777) if err != nil { return err } - continue } rc, err := f.Open() diff --git a/cmd/service.go b/cmd/service.go new file mode 100644 index 000000000..a22cc0e28 --- /dev/null +++ b/cmd/service.go @@ -0,0 +1,241 @@ +// 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" +} diff --git a/cmd/source.go b/cmd/source.go deleted file mode 100644 index 06c49cb41..000000000 --- a/cmd/source.go +++ /dev/null @@ -1,150 +0,0 @@ -// 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 -}