From 757e4f658c400d55eab6f11f1c39c1772cf615a7 Mon Sep 17 00:00:00 2001 From: Unknown <joe2010xtmf@163.com> Date: Mon, 17 Mar 2014 11:56:50 -0400 Subject: [PATCH] Completely rule out the cgo --- .gopmfile | 9 +-- README.md | 4 +- conf/content/git-bare.zip | Bin 0 -> 9910 bytes models/repo.go | 122 ++++++++++++++++++++++---------------- models/user.go | 5 +- routers/repo/repo.go | 7 ++- 6 files changed, 85 insertions(+), 62 deletions(-) create mode 100644 conf/content/git-bare.zip diff --git a/.gopmfile b/.gopmfile index 2aea7ea584..8d965631af 100644 --- a/.gopmfile +++ b/.gopmfile @@ -4,17 +4,18 @@ path=github.com/gogits/gogs [deps] github.com/codegangsta/cli= github.com/codegangsta/martini= -github.com/gogits/binding= github.com/martini-contrib/render= github.com/martini-contrib/sessions= github.com/Unknwon/com= +github.com/Unknwon/cae= +github.com/Unknwon/goconfig= github.com/dchest/scrypt= github.com/go-sql-driver/mysql= -github.com/libgit2/git2go=commit:054268a63418b03892bfd4c6a509a0294660074b github.com/lunny/xorm= -github.com/speedata/gogit= -github.com/Unknwon/goconfig= +github.com/slene/blackfriday= github.com/gogits/logs= +github.com/gogits/binding= +github.com/gogits/git= [res] include=templates|public|conf diff --git a/README.md b/README.md index d0a0c2054c..52f95f3c68 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Gogs - Go Git Service [ is a GitHub-like clone in the Go Programming Language. -Since we choose to use pure Go implmentation of Git manipulation, Gogs certainly supports **ALL platforms** that Go supports, including Linux, Max OS X, and Windows with **ZERO** dependency. +Since we choose to use pure Go implementation of Git manipulation, Gogs certainly supports **ALL platforms** that Go supports, including Linux, Max OS X, and Windows with **ZERO** dependency. ##### Current version: 0.0.9 Alpha @@ -18,7 +18,7 @@ Please see [Wiki](https://github.com/gogits/gogs/wiki) for project design, devel ## Features - Activity timeline -- SSH protocal support. +- SSH protocol support. - Register/delete account. - Create/delete public repository. - User profile page. diff --git a/conf/content/git-bare.zip b/conf/content/git-bare.zip new file mode 100644 index 0000000000000000000000000000000000000000..fde0a1f96ee859f32e18e4b2241174d64cd728c8 GIT binary patch literal 9910 zcmb_?1z1(v*7l~6?v71&rywQL-QC@r*mOz?ZfPW>L%Kmk8UX=mlnx0|x&$TU+v?#Q z@bljPKKJ|KnR~Dv2Jbu8SaZ%X)_hS_fP=>a0078<Bu&=`a5cHkme8wE=s<)H3m0c= zI~%FTTo}PXG=PnFxXM19v$PDQDVb_CKP;aU--pwcHSd>$L!?}+?>P-=i(k`WF+9ht z2Cf%5=sUnl%dX|BgVZ|G-yO&dcp)$`nTxJZHElF6Ji8bRq3|8gt!x`jd{V6Oq^C{w zRvZE`NR(nwemUqsg$_$AcMCT=kcXX%GwRTw!doRJHAZ>1Hyp#P{T!wB+OkUhtZIz? zZ&<Zu2j9wRsjA4aDYFl-GWNe6(a>S+*8zM63_Pc{8()P5+~#4ibAL_@#V3Rgc<7Lo zl6b%(uT-bbD6howeneJDk?H-25-YnL+sdy$MS(g2ex~Z@4}X39NR_RNi-SAIZFtku zcwH120N^!rkpAss1_C+yfXqBBY}uULZP?w-oIs9N0dXQK-Qs8wHoH2h^_#GAuLm?~ zX(#c)GE<ZNdM`OL$r}(3mR>sC*?Dc>8kjX@JpV%Ykd3rK71jG7SY{_rij(Sbhfy9Q z5Jo6;0ofd@d713aG-t4+wFoeZVyt^N>5h=JU$njuTmTA&2mO2H#LVs?y?Va7&anR7 zIzAdqT15Z-FAPNhR(*QJ1yp+A$43`&u7oluT=4`KW#S@u4^O%Z*%hJ$oJgBU9-(&4 zf;s{ot%!0glJVpE)w<7+9r`}arjGck=o6MCv+JdvhoEItRYi`em9Gg0CpT1Noy5c} zK~Nm4%C^Km7dtiNXJ9*TJikGwTQNyaQFAU(f8py}oU*lPAW}woJB6RW4q%-^(-#c) z>nZ(8vxSS3lby%S^d*?MOmO1$WM`<j%Cd}WE9D<X)ys!cPopO4o<8`zMlbNF;q|a% z<iT@)uS)V#eEI_%sj1WN!y<hY?QbyDts0;7juAaYIaaDSk}Pg$iyVS%lRc9*)(FJZ z!F5|`9M2uY*RR#qtY7PYk!M%j@j-YcS|zfGD0ckaXf#mq-HU>GYR)9vJI!cUg^p1$ zl>`_K)f*%XqSX~Dr0<$tP!<zn;SBAPzXS7$%`!o);f&<OvJQSF%*Y61U}-OD6d49u z%R4Gq19~naLJK}tMQF1d=?Q5{`IIx1FVs6jN1mdIrcm{;2{5@XV;K$AWz_`dnhI(9 zm&x?NQ9C)|bI@e9Xti~5A%wuy6z}0m!Gw_NF)^zfr7-o)%i<HY9c)wZ&t_mSCuE8d zcSzvHA>1*kl8wh6f{hG}+e8C*sh-ti)hX9i@WU%lpu>O!J3kJ6$%yHnTsqM)+y8Fw z=jHS25_I`_*ZydCl|V*!R|Ov@W5;V^-M=-1Z6k4;gS4u~z{-f*!mx)07*HK`iYwh0 z#ZX4nN5fckw=}oWII?!ceoG|F*nyp_T{R|ek0k9pCNL{yJ&If}Qm_}nqDX>k=BiHh zP)3lX(|&bYrfLmt{9-LC&hmVOC?KusLVzVfZ~DlF7p1Jyq^;}YmEYs8b0ewtyrtW7 z1u@jI&lkGPa-f6g@8t$^ara>RHDUf*Yiy4taJqn4@Ov%hXgW%}ix<HRV%1bJs;~-H za#~p&kBnd0%o-QnO_2+&>0MFl5MECwl30TSJCvidsY+@J%0D8Eb7^^)li^;z`C_t4 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 C56l?= literal 0 HcmV?d00001 diff --git a/models/repo.go b/models/repo.go index 3b35f49753..7f0307308b 100644 --- a/models/repo.go +++ b/models/repo.go @@ -11,11 +11,14 @@ import ( "os" "path/filepath" "strings" + "sync" "time" "unicode/utf8" + "github.com/Unknwon/cae/zip" "github.com/Unknwon/com" - git "github.com/libgit2/git2go" + + "github.com/gogits/git" "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/log" @@ -44,6 +47,7 @@ type Star struct { } var ( + gitInitLocker = sync.Mutex{} LanguageIgns, Licenses []string ) @@ -55,6 +59,8 @@ var ( func init() { LanguageIgns = strings.Split(base.Cfg.MustValue("repository", "LANG_IGNS"), "|") Licenses = strings.Split(base.Cfg.MustValue("repository", "LICENSES"), "|") + + zip.Verbose = false } // check if repository is exist @@ -66,7 +72,7 @@ func IsRepositoryExist(user *User, repoName string) (bool, error) { } s, err := os.Stat(RepoPath(user.Name, repoName)) if err != nil { - return false, nil + return false, nil // Error simply means does not exist, but we don't want to show up. } return s.IsDir(), nil } @@ -138,12 +144,59 @@ func CreateRepository(user *User, repoName, desc, repoLang, license string, priv } return repo, NewRepoAction(user, repo) + return nil, nil +} + +// extractGitBareZip extracts git-bare.zip to repository path. +func extractGitBareZip(repoPath string) error { + z, err := zip.Open("conf/content/git-bare.zip") + if err != nil { + fmt.Println("shi?") + return err + } + defer z.Close() + + return z.ExtractTo(repoPath) +} + +// initRepoCommit temporarily changes with work directory. +func initRepoCommit(tmpPath string, sig *git.Signature) error { + gitInitLocker.Lock() + defer gitInitLocker.Unlock() + + // Change work directory. + curPath, err := os.Getwd() + if err != nil { + return err + } else if err = os.Chdir(tmpPath); err != nil { + return err + } + defer os.Chdir(curPath) + + if _, _, err := com.ExecCmd("git", "add", "--all"); err != nil { + return err + } + if _, _, err := com.ExecCmd("git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email), + "-m", "Init commit"); err != nil { + return err + } + if _, _, err := com.ExecCmd("git", "push", "origin", "master"); err != nil { + return err + } + return nil } // InitRepository initializes README and .gitignore if needed. func initRepository(f string, user *User, repo *Repository, initReadme bool, repoLang, license string) error { - fileName := map[string]string{} + repoPath := RepoPath(user.Name, repo.Name) + // Create bare new repository. + if err := extractGitBareZip(repoPath); err != nil { + return err + } + + // Initialize repository according to user's choice. + fileName := map[string]string{} if initReadme { fileName["readme"] = "README.md" } @@ -154,87 +207,52 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep fileName["license"] = "LICENSE" } - workdir := filepath.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond())) - os.MkdirAll(workdir, os.ModePerm) + // Clone to temprory path and do the init commit. + tmpDir := filepath.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond())) + os.MkdirAll(tmpDir, os.ModePerm) - sig := user.NewGitSig() + if _, _, err := com.ExecCmd("git", "clone", repoPath, tmpDir); err != nil { + return err + } // README if initReadme { defaultReadme := repo.Name + "\n" + strings.Repeat("=", utf8.RuneCountInString(repo.Name)) + "\n\n" + repo.Description - if err := ioutil.WriteFile(filepath.Join(workdir, fileName["readme"]), + if err := ioutil.WriteFile(filepath.Join(tmpDir, fileName["readme"]), []byte(defaultReadme), 0644); err != nil { return err } } + // .gitignore if repoLang != "" { - // .gitignore filePath := "conf/gitignore/" + repoLang if com.IsFile(filePath) { if _, err := com.Copy(filePath, - filepath.Join(workdir, fileName["gitign"])); err != nil { + filepath.Join(tmpDir, fileName["gitign"])); err != nil { return err } } } + // LICENSE if license != "" { - // LICENSE filePath := "conf/license/" + license if com.IsFile(filePath) { if _, err := com.Copy(filePath, - filepath.Join(workdir, fileName["license"])); err != nil { + filepath.Join(tmpDir, fileName["license"])); err != nil { return err } } } - rp, err := git.InitRepository(f, true) - if err != nil { - return err - } - rp.SetWorkdir(workdir, false) - - idx, err := rp.Index() - if err != nil { + // Apply changes and commit. + if err := initRepoCommit(tmpDir, user.NewGitSig()); err != nil { return err } - for _, name := range fileName { - if err = idx.AddByPath(name); err != nil { - return err - } - } - - treeId, err := idx.WriteTree() - if err != nil { - return err - } - - message := "Init commit" - tree, err := rp.LookupTree(treeId) - if err != nil { - return err - } - - if _, err = rp.CreateCommit("HEAD", sig, sig, message, tree); err != nil { - return err - } - - pu, err := os.OpenFile(filepath.Join(f, "hooks", "post-update"), os.O_CREATE|os.O_WRONLY, 0777) - if err != nil { - return err - } - defer pu.Close() - ep, err := exePath() - if err != nil { - return err - } - _, err = pu.WriteString(fmt.Sprintf("#!/usr/bin/env bash\n%s update\n", ep)) - - return err + return nil } func GetRepositoryByName(user *User, repoName string) (*Repository, error) { diff --git a/models/user.go b/models/user.go index c42599de99..e7301af981 100644 --- a/models/user.go +++ b/models/user.go @@ -13,8 +13,10 @@ import ( "time" "github.com/dchest/scrypt" + + "github.com/gogits/git" + "github.com/gogits/gogs/modules/base" - git "github.com/libgit2/git2go" ) var UserPasswdSalt string @@ -89,6 +91,7 @@ func IsEmailUsed(email string) (bool, error) { return orm.Get(&User{Email: email}) } +// NewGitSig generates and returns the signature of given user. func (user *User) NewGitSig() *git.Signature { return &git.Signature{ Name: user.Name, diff --git a/routers/repo/repo.go b/routers/repo/repo.go index edd8862794..7171ff2640 100644 --- a/routers/repo/repo.go +++ b/routers/repo/repo.go @@ -20,15 +20,16 @@ func Create(ctx *middleware.Context, form auth.CreateRepoForm) { return } - if _, err := models.CreateRepository(ctx.User, - form.RepoName, form.Description, form.Language, form.License, - form.Visibility == "private", form.InitReadme == "on"); err == nil { + _, err := models.CreateRepository(ctx.User, form.RepoName, form.Description, + form.Language, form.License, form.Visibility == "private", form.InitReadme == "on") + if err == nil { ctx.Render.Redirect("/"+ctx.User.Name+"/"+form.RepoName, 302) return } else if err == models.ErrRepoAlreadyExist { ctx.RenderWithErr("Repository name has already been used", "repo/create", &form) return } + ctx.Handle(200, "repo.Create", err) } func SettingPost(ctx *middleware.Context) {