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 [![wercker status](https://app.wercker.com/status/ad0bdb0b
 
 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) {