2020-04-05 01:20:50 -05:00
// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2019-03-08 02:54:10 +01:00
package main
/ *
Checkout a PR and load the tests data into sqlite database
* /
import (
2019-12-15 09:51:28 +00:00
"context"
2019-03-08 02:54:10 +01:00
"flag"
"fmt"
"log"
"net/http"
"net/url"
"os"
"os/exec"
"os/user"
"path"
"path/filepath"
"runtime"
2019-03-15 11:18:01 -05:00
"strconv"
2019-03-08 02:54:10 +01:00
"time"
2019-06-27 02:15:26 +08:00
"code.gitea.io/gitea/models"
2021-09-19 19:49:59 +08:00
"code.gitea.io/gitea/models/db"
2021-06-26 19:28:55 +08:00
gitea_git "code.gitea.io/gitea/modules/git"
2019-05-26 01:15:39 +08:00
"code.gitea.io/gitea/modules/markup"
2019-03-08 02:54:10 +01:00
"code.gitea.io/gitea/modules/markup/external"
2019-06-27 02:15:26 +08:00
"code.gitea.io/gitea/modules/setting"
2020-08-11 21:05:34 +01:00
"code.gitea.io/gitea/modules/util"
2019-03-08 02:54:10 +01:00
"code.gitea.io/gitea/routers"
2019-06-27 02:15:26 +08:00
2020-03-17 18:19:58 +02:00
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/config"
"github.com/go-git/go-git/v5/plumbing"
2019-03-08 02:54:10 +01:00
context2 "github.com/gorilla/context"
2019-10-17 17:26:49 +08:00
"xorm.io/xorm"
2019-03-08 02:54:10 +01:00
)
var codeFilePath = "contrib/pr/checkout.go"
func runPR ( ) {
log . Printf ( "[PR] Starting gitea ...\n" )
curDir , err := os . Getwd ( )
if err != nil {
log . Fatal ( err )
}
2019-05-14 16:20:35 +01:00
setting . SetCustomPathAndConf ( "" , "" , "" )
2019-03-08 02:54:10 +01:00
setting . NewContext ( )
2021-09-22 13:38:34 +08:00
setting . RepoRootPath , err = os . MkdirTemp ( os . TempDir ( ) , "repos" )
2019-03-08 02:54:10 +01:00
if err != nil {
log . Fatalf ( "TempDir: %v\n" , err )
}
2021-09-22 13:38:34 +08:00
setting . AppDataPath , err = os . MkdirTemp ( os . TempDir ( ) , "appdata" )
2019-03-08 02:54:10 +01:00
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" )
2021-06-26 19:28:55 +08:00
gitea_git . CheckLFSVersion ( )
2019-03-08 02:54:10 +01:00
//models.LoadConfigs()
/ *
2019-08-24 17:24:45 +08:00
setting . Database . Type = "sqlite3"
setting . Database . Path = ":memory:"
setting . Database . Timeout = 500
2019-03-08 02:54:10 +01:00
* /
2021-09-19 19:49:59 +08:00
dbCfg := setting . Cfg . Section ( "database" )
dbCfg . NewKey ( "DB_TYPE" , "sqlite3" )
dbCfg . NewKey ( "PATH" , ":memory:" )
2019-08-24 17:24:45 +08:00
2019-03-08 02:54:10 +01:00
routers . NewServices ( )
2019-08-24 17:24:45 +08:00
setting . Database . LogSQL = true
2019-03-08 02:54:10 +01:00
//x, err = xorm.NewEngine("sqlite3", "file::memory:?cache=shared")
2021-09-19 19:49:59 +08:00
db . NewEngine ( context . Background ( ) , func ( _ * xorm . Engine ) error {
2019-03-08 02:54:10 +01:00
return nil
} )
2021-09-19 19:49:59 +08:00
db . HasEngine = true
2019-03-08 02:54:10 +01:00
//x.ShowSQL(true)
2021-09-19 19:49:59 +08:00
err = db . InitFixtures (
2019-03-08 02:54:10 +01:00
path . Join ( curDir , "models/fixtures/" ) ,
)
if err != nil {
fmt . Printf ( "Error initializing test database: %v\n" , err )
os . Exit ( 1 )
}
2021-09-19 19:49:59 +08:00
db . LoadFixtures ( )
2020-08-11 21:05:34 +01:00
util . RemoveAll ( setting . RepoRootPath )
util . RemoveAll ( models . LocalCopyPath ( ) )
2020-12-25 09:59:32 +00:00
util . CopyDir ( path . Join ( curDir , "integrations/gitea-repositories-meta" ) , setting . RepoRootPath )
2019-03-08 02:54:10 +01:00
log . Printf ( "[PR] Setting up router\n" )
//routers.GlobalInit()
2021-04-20 06:25:08 +08:00
external . RegisterRenderers ( )
2019-05-26 01:15:39 +08:00
markup . Init ( )
2021-06-09 07:33:54 +08:00
c := routers . NormalRoutes ( )
2019-03-08 02:54:10 +01:00
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
2020-11-13 20:51:07 +08:00
http . ListenAndServe ( ":8080" , context2 . ClearHandler ( c ) )
2019-03-08 02:54:10 +01:00
log . Printf ( "[PR] Cleaning up ...\n" )
/ *
2020-08-11 21:05:34 +01:00
if err = util . RemoveAll ( setting . Indexer . IssuePath ) ; err != nil {
fmt . Printf ( "util.RemoveAll: %v\n" , err )
2019-03-08 02:54:10 +01:00
os . Exit ( 1 )
}
2020-08-11 21:05:34 +01:00
if err = util . RemoveAll ( setting . Indexer . RepoPath ) ; err != nil {
2019-03-08 02:54:10 +01:00
fmt . Printf ( "Unable to remove repo indexer: %v\n" , err )
os . Exit ( 1 )
}
* /
2020-08-11 21:05:34 +01:00
if err = util . RemoveAll ( setting . RepoRootPath ) ; err != nil {
log . Fatalf ( "util.RemoveAll: %v\n" , err )
2019-03-08 02:54:10 +01:00
}
2020-08-11 21:05:34 +01:00
if err = util . RemoveAll ( setting . AppDataPath ) ; err != nil {
log . Fatalf ( "util.RemoveAll: %v\n" , err )
2019-03-08 02:54:10 +01:00
}
}
func main ( ) {
var runPRFlag = flag . Bool ( "run" , false , "Run the PR code" )
flag . Parse ( )
if * runPRFlag {
runPR ( )
return
}
2019-03-15 11:18:01 -05:00
// To force checkout (e.g. Windows complains about unclean work tree) set env variable FORCE=true
force , err := strconv . ParseBool ( os . Getenv ( "FORCE" ) )
if err != nil {
force = false
}
2019-03-08 02:54:10 +01:00
//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
2021-09-22 13:38:34 +08:00
dat , err := os . ReadFile ( codeFilePath )
2019-03-08 02:54:10 +01:00
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 {
2020-08-05 22:15:57 +03:00
if r . Config ( ) . URLs [ 0 ] == "https://github.com/go-gitea/gitea.git" ||
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
2019-03-08 02:54:10 +01:00
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
2019-03-12 12:47:04 -05:00
runCmd ( "git" , "fetch" , remoteUpstream , fmt . Sprintf ( "pull/%s/head:%s" , pr , branch ) )
2019-03-08 02:54:10 +01:00
} 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 ,
2019-03-15 11:18:01 -05:00
Force : force ,
2019-03-08 02:54:10 +01:00
} )
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 )
}
2021-09-22 13:38:34 +08:00
err = os . WriteFile ( codeFilePath , dat , 0644 )
2019-03-08 02:54:10 +01:00
if err != nil {
log . Fatalf ( "Failed to duplicate this code file in PR : %v" , err )
}
}
2020-02-08 01:14:43 +01:00
//Force build of js, css, bin, ...
runCmd ( "make" , "build" )
2019-03-08 02:54:10 +01:00
//Start with integration test
2020-02-16 17:30:09 +01:00
runCmd ( "go" , "run" , "-mod" , "vendor" , "-tags" , "sqlite sqlite_unlock_notify" , codeFilePath , "-run" )
2019-03-08 02:54:10 +01:00
}
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 )
}
}