mirror of
https://github.com/hanzoai/migrate.git
synced 2026-09-30 22:55:10 +00:00
Github Enterprise support (#234)
* exported Github struct fields and ReadDirectory method
* github ee implementation, tests and docs
* build fixes
* Github Enterprise API endpoint based on docs
* addressing PR comments
* code review
* make linter happy
* parseBool() takes fallback
* pr comments
* tweaks to Config{}
This commit is contained in:
committed by
Dale Hui
parent
1a55d8a165
commit
57af81c94a
+62
-18
@@ -29,17 +29,17 @@ var (
|
||||
)
|
||||
|
||||
type Github struct {
|
||||
client *github.Client
|
||||
url string
|
||||
|
||||
pathOwner string
|
||||
pathRepo string
|
||||
path string
|
||||
config *Config
|
||||
client *github.Client
|
||||
options *github.RepositoryContentGetOptions
|
||||
migrations *source.Migrations
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
Owner string
|
||||
Repo string
|
||||
Path string
|
||||
Ref string
|
||||
}
|
||||
|
||||
func (g *Github) Open(url string) (source.Driver, error) {
|
||||
@@ -64,20 +64,21 @@ func (g *Github) Open(url string) (source.Driver, error) {
|
||||
|
||||
gn := &Github{
|
||||
client: github.NewClient(tr.Client()),
|
||||
url: url,
|
||||
migrations: source.NewMigrations(),
|
||||
options: &github.RepositoryContentGetOptions{Ref: u.Fragment},
|
||||
}
|
||||
|
||||
gn.ensureFields()
|
||||
|
||||
// set owner, repo and path in repo
|
||||
gn.pathOwner = u.Host
|
||||
gn.config.Owner = u.Host
|
||||
pe := strings.Split(strings.Trim(u.Path, "/"), "/")
|
||||
if len(pe) < 1 {
|
||||
return nil, ErrInvalidRepo
|
||||
}
|
||||
gn.pathRepo = pe[0]
|
||||
gn.config.Repo = pe[0]
|
||||
if len(pe) > 1 {
|
||||
gn.path = strings.Join(pe[1:], "/")
|
||||
gn.config.Path = strings.Join(pe[1:], "/")
|
||||
}
|
||||
|
||||
if err := gn.readDirectory(); err != nil {
|
||||
@@ -90,16 +91,29 @@ func (g *Github) Open(url string) (source.Driver, error) {
|
||||
func WithInstance(client *github.Client, config *Config) (source.Driver, error) {
|
||||
gn := &Github{
|
||||
client: client,
|
||||
config: config,
|
||||
migrations: source.NewMigrations(),
|
||||
options: &github.RepositoryContentGetOptions{Ref: config.Ref},
|
||||
}
|
||||
|
||||
if err := gn.readDirectory(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return gn, nil
|
||||
}
|
||||
|
||||
func (g *Github) readDirectory() error {
|
||||
fileContent, dirContents, _, err := g.client.Repositories.GetContents(context.Background(), g.pathOwner, g.pathRepo, g.path, g.options)
|
||||
g.ensureFields()
|
||||
|
||||
fileContent, dirContents, _, err := g.client.Repositories.GetContents(
|
||||
context.Background(),
|
||||
g.config.Owner,
|
||||
g.config.Repo,
|
||||
g.config.Path,
|
||||
g.options,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -120,37 +134,58 @@ func (g *Github) readDirectory() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *Github) ensureFields() {
|
||||
if g.config == nil {
|
||||
g.config = &Config{}
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Github) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *Github) First() (version uint, er error) {
|
||||
g.ensureFields()
|
||||
|
||||
if v, ok := g.migrations.First(); !ok {
|
||||
return 0, &os.PathError{Op: "first", Path: g.path, Err: os.ErrNotExist}
|
||||
return 0, &os.PathError{Op: "first", Path: g.config.Path, Err: os.ErrNotExist}
|
||||
} else {
|
||||
return v, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Github) Prev(version uint) (prevVersion uint, err error) {
|
||||
g.ensureFields()
|
||||
|
||||
if v, ok := g.migrations.Prev(version); !ok {
|
||||
return 0, &os.PathError{Op: fmt.Sprintf("prev for version %v", version), Path: g.path, Err: os.ErrNotExist}
|
||||
return 0, &os.PathError{Op: fmt.Sprintf("prev for version %v", version), Path: g.config.Path, Err: os.ErrNotExist}
|
||||
} else {
|
||||
return v, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Github) Next(version uint) (nextVersion uint, err error) {
|
||||
g.ensureFields()
|
||||
|
||||
if v, ok := g.migrations.Next(version); !ok {
|
||||
return 0, &os.PathError{Op: fmt.Sprintf("next for version %v", version), Path: g.path, Err: os.ErrNotExist}
|
||||
return 0, &os.PathError{Op: fmt.Sprintf("next for version %v", version), Path: g.config.Path, Err: os.ErrNotExist}
|
||||
} else {
|
||||
return v, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Github) ReadUp(version uint) (r io.ReadCloser, identifier string, err error) {
|
||||
g.ensureFields()
|
||||
|
||||
if m, ok := g.migrations.Up(version); ok {
|
||||
file, _, _, err := g.client.Repositories.GetContents(context.Background(), g.pathOwner, g.pathRepo, path.Join(g.path, m.Raw), g.options)
|
||||
file, _, _, err := g.client.Repositories.GetContents(
|
||||
context.Background(),
|
||||
g.config.Owner,
|
||||
g.config.Repo,
|
||||
path.Join(g.config.Path, m.Raw),
|
||||
g.options,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
@@ -162,12 +197,21 @@ func (g *Github) ReadUp(version uint) (r io.ReadCloser, identifier string, err e
|
||||
return ioutil.NopCloser(strings.NewReader(r)), m.Identifier, nil
|
||||
}
|
||||
}
|
||||
return nil, "", &os.PathError{Op: fmt.Sprintf("read version %v", version), Path: g.path, Err: os.ErrNotExist}
|
||||
return nil, "", &os.PathError{Op: fmt.Sprintf("read version %v", version), Path: g.config.Path, Err: os.ErrNotExist}
|
||||
}
|
||||
|
||||
func (g *Github) ReadDown(version uint) (r io.ReadCloser, identifier string, err error) {
|
||||
g.ensureFields()
|
||||
|
||||
if m, ok := g.migrations.Down(version); ok {
|
||||
file, _, _, err := g.client.Repositories.GetContents(context.Background(), g.pathOwner, g.pathRepo, path.Join(g.path, m.Raw), g.options)
|
||||
file, _, _, err := g.client.Repositories.GetContents(
|
||||
context.Background(),
|
||||
g.config.Owner,
|
||||
g.config.Repo,
|
||||
path.Join(g.config.Path, m.Raw),
|
||||
g.options,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
@@ -179,5 +223,5 @@ func (g *Github) ReadDown(version uint) (r io.ReadCloser, identifier string, err
|
||||
return ioutil.NopCloser(strings.NewReader(r)), m.Identifier, nil
|
||||
}
|
||||
}
|
||||
return nil, "", &os.PathError{Op: fmt.Sprintf("read version %v", version), Path: g.path, Err: os.ErrNotExist}
|
||||
return nil, "", &os.PathError{Op: fmt.Sprintf("read version %v", version), Path: g.config.Path, Err: os.ErrNotExist}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user