Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
wreulicke committed Jan 17, 2020
1 parent c391431 commit 675b3c8
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 76 deletions.
143 changes: 70 additions & 73 deletions clone.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@ import (

"gopkg.in/src-d/go-billy.v4/memfs"

"fmt"
"log"

"github.com/sirupsen/logrus"
giturls "github.com/whilp/git-urls"
"gopkg.in/src-d/go-billy.v4"
"gopkg.in/src-d/go-git.v4"
Expand All @@ -35,97 +33,50 @@ func toURL(rawurl string) (*url.URL, error) {
return url.Parse("https://" + path.Join("github.com", rawurl+".git"))
}

type PrefixMatcher struct {
type Copier struct {
logger *logrus.Logger
prefix string
dest string
}

func (p *PrefixMatcher) Match(path string) bool {
return strings.HasPrefix(path, p.prefix)
}

func List(fs billy.Filesystem, f os.FileInfo, base string) {
if f.IsDir() {
d, err := fs.ReadDir(path.Join(base, f.Name()))
if err != nil {
return
}
for _, e := range d {
List(fs, e, path.Join(base, f.Name()))
}
return
}
fmt.Println(path.Join(base, f.Name()))
}

func Clone(u *url.URL, prefix string, dest string) error {
log.Printf("Cloning... %s into %s\n", u, dest)
f := memfs.New()
c := git.CloneOptions{
URL: u.String(),
ReferenceName: plumbing.ReferenceName("refs/heads/master"),
Depth: 1,
}
_, err := git.Clone(memory.NewStorage(), f, &c)
func (c *Copier) WriteResource(fs billy.Filesystem) error {
d, err := fs.ReadDir("/")
if err != nil {
return err
}
m := &PrefixMatcher{
prefix: prefix,
}
return WriteResource(f, dest, m)
return c.visitFiles(fs, d, []string{})
}

func mkdirRecursively(path string) error {
_, err := os.Stat(path)
if os.IsNotExist(err) {
err := os.Mkdir(path, 0771)
if _, ok := err.(*os.PathError); ok {
err := mkdirRecursively(filepath.Dir(path))
if err != nil {
return err
}
if err := os.Mkdir(path, 0771); err != nil {
return err
}
return nil
}
return err
}
return nil
}

func WriteResource(fs billy.Filesystem, dest string, m *PrefixMatcher) error {
d, _ := fs.ReadDir("/")
for _, e := range d {
err := writeResourceInternal(fs, e, dest, m, []string{})
func (c *Copier) visitFiles(fs billy.Filesystem, files []os.FileInfo, base []string) error {
for _, e := range files {
err := c.visitFile(fs, e, base)
if err != nil {
return err
}
}
return nil
}

func writeResourceInternal(fs billy.Filesystem, f os.FileInfo, dest string, m *PrefixMatcher, base []string) error {
func (c *Copier) visitDirectory(fs billy.Filesystem, f os.FileInfo, base []string) error {
base = append(base, f.Name())
p := path.Join(base...)
if f.IsDir() {
d, err := fs.ReadDir(p)
if err != nil {
return err
}
for _, e := range d {
err := writeResourceInternal(fs, e, dest, m, base)
if err != nil {
return err
}
}
return nil
d, err := fs.ReadDir(p)
if err != nil {
return err
}
destPath := filepath.Join(dest, filepath.Join(base...))
if !m.Match(p) {
return c.visitFiles(fs, d, base)
}

func (c *Copier) copyFile(fs billy.Filesystem, f os.FileInfo, base []string) error {
base = append(base, f.Name())
p := path.Join(base...)
if !strings.HasPrefix(p, c.prefix) {
return nil
}
c.logger.Infof("%s %s", filepath.Join(c.dest, filepath.Join(base...)), c.prefix)
destPath := filepath.Join(c.dest, strings.TrimPrefix(filepath.Join(base...), c.prefix))
basePath := filepath.Dir(destPath)
c.logger.Infof("matched! copy %s to %s", p, destPath)
err := mkdirRecursively(basePath)
if err != nil {
return err
Expand All @@ -141,3 +92,49 @@ func writeResourceInternal(fs billy.Filesystem, f os.FileInfo, dest string, m *P
_, err = io.Copy(destFile, file)
return err
}

func (c *Copier) visitFile(fs billy.Filesystem, f os.FileInfo, base []string) error {
if f.IsDir() {
return c.visitDirectory(fs, f, base)
}
return c.copyFile(fs, f, base)
}

// Clone repository into destination striping prefix
func Clone(l *logrus.Logger, u *url.URL, prefix string, dest string) error {
l.Infof("Cloning... %s into %s", u.String(), dest)
f := memfs.New()
c := git.CloneOptions{
URL: u.String(),
ReferenceName: plumbing.ReferenceName("refs/heads/master"),
Depth: 1,
}
_, err := git.Clone(memory.NewStorage(), f, &c)
if err != nil {
return err
}
cp := Copier{
dest: dest,
prefix: prefix,
logger: l,
}
return cp.WriteResource(f)
}

func mkdirRecursively(path string) error {
if _, err := os.Stat(path); !os.IsNotExist(err) {
return nil
}
err := os.Mkdir(path, 0771)
if _, ok := err.(*os.PathError); ok {
err := mkdirRecursively(filepath.Dir(path))
if err != nil {
return err
}
if err := os.Mkdir(path, 0771); err != nil {
return err
}
return nil
}
return err
}
3 changes: 1 addition & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@ module github.com/wreulicke/go-degit
go 1.13

require (
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd
github.com/sirupsen/logrus v1.4.2
github.com/spf13/cobra v0.0.5
github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4
gopkg.in/src-d/go-billy.v4 v4.3.2
gopkg.in/src-d/go-git.v4 v4.13.1
)
15 changes: 15 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
Expand All @@ -25,6 +31,8 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY=
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
Expand All @@ -37,11 +45,15 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
Expand All @@ -53,8 +65,10 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM
github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4=
github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 h1:qqllXPzXh+So+mmANlX/gCJrgo+1kQyshMoQ+NASzm0=
Expand All @@ -76,6 +90,7 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e h1:D5TXcfTk7xF7hvieo4QErS3qqCB4teTffacDWr7CI+0=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand Down
7 changes: 6 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package main

import (
"errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"log"
"os"
Expand Down Expand Up @@ -32,7 +33,11 @@ func NewCommand() *cobra.Command {
prefix = args[1]
dest = args[2]
}
return Clone(u, prefix, dest)
// TODO support windows
if !strings.HasSuffix(prefix, "/") {
prefix = prefix + "/"
}
return Clone(logrus.New(), u, prefix, dest)
},
}
return cmd
Expand Down

0 comments on commit 675b3c8

Please sign in to comment.