-
-
Notifications
You must be signed in to change notification settings - Fork 5.8k
[Contrib] Checkout a PR #6021
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
[Contrib] Checkout a PR #6021
Changes from all commits
Commits
Show all changes
35 commits
Select commit
Hold shift + click to select a range
da8e9a8
init
sapk 883abcf
config user
sapk ac9d1b1
add todo
sapk 557c3bc
Switch method to re-call program with -run flag
sapk 6e5d8e2
fix meta path
sapk 36e81b9
be more resilient
sapk 9f10a23
don't depends on external change
sapk e2fdc42
add time sleep
sapk f410377
fix args
sapk 480a929
Display output
sapk a9927f8
Find the upstream + use src-d/go-git
sapk 0307340
stream output of command. thx @jolheiser
sapk b103f85
Fix auth by @jolheiser
sapk 0ec9d3d
migrate to native http listener for windows user
sapk 53fdf33
fix ref error
sapk 8976b72
convert to os path to be compatible to windows
sapk 1739a0c
fix typo
sapk 52129e5
Merge branch 'master' into checkout-pr
lafriks 874ea5b
Merge branch 'master' into checkout-pr
sapk 4b5a6a2
Merge branch 'master' into checkout-pr
sapk 96873ff
Merge branch 'master' into checkout-pr
lunny 0cf15ca
Merge branch 'master' into checkout-pr
lunny 788d514
Merge branch 'master' into checkout-pr
sapk 9f6820b
testing
sapk ad1bed4
Fix branch creation
sapk d0745d3
Merge branch 'checkout-pr' of github.com:sapk-fork/gitea into checkou…
sapk 324fc27
Merge branch 'checkout-pr' of github.com:sapk-fork/gitea into test-dev
sapk 88a1506
force checkout on windows
sapk fd536ea
cleaning
sapk ed62748
go fmt
sapk fce17f4
use git cli for fetch on windows
sapk d348ec4
Add make pr PR=0000
sapk 2d6483a
Fix tab
jolheiser 10d9520
Merge branch 'master' into checkout-pr
sapk d29abcf
Merge branch 'master' into checkout-pr
techknowlogick File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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 hidden or 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) | ||
} | ||
} |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.