forked from go-gitea/gitea
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Contrib] Checkout a PR (go-gitea#6021)
- Loading branch information
1 parent
9fd8b26
commit 9d3732d
Showing
2 changed files
with
260 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,256 @@ | ||
package main | ||
|
||
/* | ||
Checkout a PR and load the tests data into sqlite database | ||
*/ | ||
|
||
import ( | ||
"flag" | ||
"fmt" | ||
"io/ioutil" | ||
"log" | ||
"net/http" | ||
"net/url" | ||
"os" | ||
"os/exec" | ||
"os/user" | ||
"path" | ||
"path/filepath" | ||
"runtime" | ||
"time" | ||
|
||
"code.gitea.io/gitea/modules/markup/external" | ||
"code.gitea.io/gitea/routers" | ||
"code.gitea.io/gitea/routers/routes" | ||
"github.com/Unknwon/com" | ||
"github.com/go-xorm/xorm" | ||
context2 "github.com/gorilla/context" | ||
"gopkg.in/src-d/go-git.v4" | ||
"gopkg.in/src-d/go-git.v4/config" | ||
"gopkg.in/src-d/go-git.v4/plumbing" | ||
"gopkg.in/testfixtures.v2" | ||
|
||
"code.gitea.io/gitea/models" | ||
"code.gitea.io/gitea/modules/setting" | ||
) | ||
|
||
var codeFilePath = "contrib/pr/checkout.go" | ||
|
||
func runPR() { | ||
log.Printf("[PR] Starting gitea ...\n") | ||
curDir, err := os.Getwd() | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
setting.NewContext() | ||
|
||
setting.RepoRootPath, err = ioutil.TempDir(os.TempDir(), "repos") | ||
if err != nil { | ||
log.Fatalf("TempDir: %v\n", err) | ||
} | ||
setting.AppDataPath, err = ioutil.TempDir(os.TempDir(), "appdata") | ||
if err != nil { | ||
log.Fatalf("TempDir: %v\n", err) | ||
} | ||
setting.AppWorkPath = curDir | ||
setting.StaticRootPath = curDir | ||
setting.GravatarSourceURL, err = url.Parse("https://secure.gravatar.com/avatar/") | ||
if err != nil { | ||
log.Fatalf("url.Parse: %v\n", err) | ||
} | ||
|
||
setting.AppURL = "http://localhost:8080/" | ||
setting.HTTPPort = "8080" | ||
setting.SSH.Domain = "localhost" | ||
setting.SSH.Port = 3000 | ||
setting.InstallLock = true | ||
setting.SecretKey = "9pCviYTWSb" | ||
setting.InternalToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTI3OTU5ODN9.OQkH5UmzID2XBdwQ9TAI6Jj2t1X-wElVTjbE7aoN4I8" | ||
curUser, err := user.Current() | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
setting.RunUser = curUser.Username | ||
|
||
log.Printf("[PR] Loading fixtures data ...\n") | ||
setting.CheckLFSVersion() | ||
//models.LoadConfigs() | ||
/* | ||
models.DbCfg.Type = "sqlite3" | ||
models.DbCfg.Path = ":memory:" | ||
models.DbCfg.Timeout = 500 | ||
*/ | ||
db := setting.Cfg.Section("database") | ||
db.NewKey("DB_TYPE", "sqlite3") | ||
db.NewKey("PATH", ":memory:") | ||
setting.LogSQL = true | ||
models.LoadConfigs() | ||
routers.NewServices() | ||
//x, err = xorm.NewEngine("sqlite3", "file::memory:?cache=shared") | ||
|
||
var helper testfixtures.Helper | ||
helper = &testfixtures.SQLite{} | ||
models.NewEngine(func(_ *xorm.Engine) error { | ||
return nil | ||
}) | ||
models.HasEngine = true | ||
//x.ShowSQL(true) | ||
err = models.InitFixtures( | ||
helper, | ||
path.Join(curDir, "models/fixtures/"), | ||
) | ||
if err != nil { | ||
fmt.Printf("Error initializing test database: %v\n", err) | ||
os.Exit(1) | ||
} | ||
models.LoadFixtures() | ||
os.RemoveAll(setting.RepoRootPath) | ||
os.RemoveAll(models.LocalCopyPath()) | ||
os.RemoveAll(models.LocalWikiPath()) | ||
com.CopyDir(path.Join(curDir, "integrations/gitea-repositories-meta"), setting.RepoRootPath) | ||
|
||
log.Printf("[PR] Setting up router\n") | ||
//routers.GlobalInit() | ||
external.RegisterParsers() | ||
m := routes.NewMacaron() | ||
routes.RegisterRoutes(m) | ||
|
||
log.Printf("[PR] Ready for testing !\n") | ||
log.Printf("[PR] Login with user1, user2, user3, ... with pass: password\n") | ||
/* | ||
log.Info("Listen: %v://%s%s", setting.Protocol, listenAddr, setting.AppSubURL) | ||
if setting.LFS.StartServer { | ||
log.Info("LFS server enabled") | ||
} | ||
if setting.EnablePprof { | ||
go func() { | ||
log.Info("Starting pprof server on localhost:6060") | ||
log.Info("%v", http.ListenAndServe("localhost:6060", nil)) | ||
}() | ||
} | ||
*/ | ||
|
||
//Start the server | ||
http.ListenAndServe(":8080", context2.ClearHandler(m)) | ||
|
||
log.Printf("[PR] Cleaning up ...\n") | ||
/* | ||
if err = os.RemoveAll(setting.Indexer.IssuePath); err != nil { | ||
fmt.Printf("os.RemoveAll: %v\n", err) | ||
os.Exit(1) | ||
} | ||
if err = os.RemoveAll(setting.Indexer.RepoPath); err != nil { | ||
fmt.Printf("Unable to remove repo indexer: %v\n", err) | ||
os.Exit(1) | ||
} | ||
*/ | ||
if err = os.RemoveAll(setting.RepoRootPath); err != nil { | ||
log.Fatalf("os.RemoveAll: %v\n", err) | ||
} | ||
if err = os.RemoveAll(setting.AppDataPath); err != nil { | ||
log.Fatalf("os.RemoveAll: %v\n", err) | ||
} | ||
} | ||
|
||
func main() { | ||
var runPRFlag = flag.Bool("run", false, "Run the PR code") | ||
flag.Parse() | ||
if *runPRFlag { | ||
runPR() | ||
return | ||
} | ||
|
||
//Otherwise checkout PR | ||
if len(os.Args) != 2 { | ||
log.Fatal("Need only one arg: the PR number") | ||
} | ||
pr := os.Args[1] | ||
|
||
codeFilePath = filepath.FromSlash(codeFilePath) //Convert to running OS | ||
|
||
//Copy this file if it will not exist in the PR branch | ||
dat, err := ioutil.ReadFile(codeFilePath) | ||
if err != nil { | ||
log.Fatalf("Failed to cache this code file : %v", err) | ||
} | ||
|
||
repo, err := git.PlainOpen(".") | ||
if err != nil { | ||
log.Fatalf("Failed to open the repo : %v", err) | ||
} | ||
|
||
//Find remote upstream | ||
remotes, err := repo.Remotes() | ||
if err != nil { | ||
log.Fatalf("Failed to list remotes of repo : %v", err) | ||
} | ||
remoteUpstream := "origin" //Default | ||
for _, r := range remotes { | ||
if r.Config().URLs[0] == "https://github.com/go-gitea/gitea" || r.Config().URLs[0] == "git@github.com:go-gitea/gitea.git" { //fetch at index 0 | ||
remoteUpstream = r.Config().Name | ||
break | ||
} | ||
} | ||
|
||
branch := fmt.Sprintf("pr-%s-%d", pr, time.Now().Unix()) | ||
branchRef := plumbing.NewBranchReferenceName(branch) | ||
|
||
log.Printf("Fetching PR #%s in %s\n", pr, branch) | ||
if runtime.GOOS == "windows" { | ||
//Use git cli command for windows | ||
runCmd("git", "fetch", "origin", fmt.Sprintf("pull/%s/head:%s", pr, branch)) | ||
} else { | ||
ref := fmt.Sprintf("refs/pull/%s/head:%s", pr, branchRef) | ||
err = repo.Fetch(&git.FetchOptions{ | ||
RemoteName: remoteUpstream, | ||
RefSpecs: []config.RefSpec{ | ||
config.RefSpec(ref), | ||
}, | ||
}) | ||
if err != nil { | ||
log.Fatalf("Failed to fetch %s from %s : %v", ref, remoteUpstream, err) | ||
} | ||
} | ||
|
||
tree, err := repo.Worktree() | ||
if err != nil { | ||
log.Fatalf("Failed to parse git tree : %v", err) | ||
} | ||
log.Printf("Checkout PR #%s in %s\n", pr, branch) | ||
err = tree.Checkout(&git.CheckoutOptions{ | ||
Branch: branchRef, | ||
//Force: runtime.GOOS == "windows", | ||
}) | ||
if err != nil { | ||
log.Fatalf("Failed to checkout %s : %v", branch, err) | ||
} | ||
|
||
//Copy this file if not exist | ||
if _, err := os.Stat(codeFilePath); os.IsNotExist(err) { | ||
err = os.MkdirAll(filepath.Dir(codeFilePath), 0755) | ||
if err != nil { | ||
log.Fatalf("Failed to duplicate this code file in PR : %v", err) | ||
} | ||
err = ioutil.WriteFile(codeFilePath, dat, 0644) | ||
if err != nil { | ||
log.Fatalf("Failed to duplicate this code file in PR : %v", err) | ||
} | ||
} | ||
time.Sleep(5 * time.Second) | ||
//Start with integration test | ||
runCmd("go", "run", "-tags", "sqlite sqlite_unlock_notify", codeFilePath, "-run") | ||
} | ||
func runCmd(cmd ...string) { | ||
log.Printf("Executing : %s ...\n", cmd) | ||
c := exec.Command(cmd[0], cmd[1:]...) | ||
c.Stdout = os.Stdout | ||
c.Stderr = os.Stderr | ||
if err := c.Start(); err != nil { | ||
log.Panicln(err) | ||
} | ||
if err := c.Wait(); err != nil { | ||
log.Panicln(err) | ||
} | ||
} |