瀏覽代碼

add GetReposFiles

Lunny Xiao 11 年之前
父節點
當前提交
23400dd0a2
共有 2 個文件被更改,包括 86 次插入27 次删除
  1. 77 26
      models/repo.go
  2. 9 1
      models/user.go

+ 77 - 26
models/repo.go

@@ -141,43 +141,52 @@ func CreateRepository(user *User, repoName, desc, repoLang, license string, priv
 
 // 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{
-		"readme":  "README.md",
-		"gitign":  ".gitignore",
-		"license": "LICENSE",
+	fileName := map[string]string{}
+
+	if initReadme {
+		fileName["readme"] = "README.md"
+	}
+	if repoLang != "" {
+		fileName["gitign"] = ".gitignore"
 	}
+	if license != "" {
+		fileName["license"] = "LICENSE"
+	}
+
 	workdir := os.TempDir() + fmt.Sprintf("%d", time.Now().Nanosecond())
 	os.MkdirAll(workdir, os.ModePerm)
 
-	sig := &git.Signature{
-		Name:  user.Name,
-		Email: user.Email,
-		When:  time.Now(),
-	}
+	sig := user.NewGitSig()
 
 	// README
-	defaultReadme := repo.Name + "\n" + strings.Repeat("=",
-		utf8.RuneCountInString(repo.Name)) + "\n\n" + repo.Description
-	if err := ioutil.WriteFile(filepath.Join(workdir, fileName["readme"]),
-		[]byte(defaultReadme), 0644); err != nil {
-		return err
+	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"]),
+			[]byte(defaultReadme), 0644); err != nil {
+			return err
+		}
 	}
 
-	// .gitignore
-	filePath := "conf/gitignore/" + repoLang
-	if com.IsFile(filePath) {
-		if _, err := com.Copy(filePath,
-			filepath.Join(workdir, fileName["gitign"])); err != nil {
-			return err
+	if repoLang != "" {
+		// .gitignore
+		filePath := "conf/gitignore/" + repoLang
+		if com.IsFile(filePath) {
+			if _, err := com.Copy(filePath,
+				filepath.Join(workdir, fileName["gitign"])); err != nil {
+				return err
+			}
 		}
 	}
 
-	// LICENSE
-	filePath = "conf/license/" + license
-	if com.IsFile(filePath) {
-		if _, err := com.Copy(filePath,
-			filepath.Join(workdir, fileName["license"])); err != nil {
-			return err
+	if license != "" {
+		// LICENSE
+		filePath := "conf/license/" + license
+		if com.IsFile(filePath) {
+			if _, err := com.Copy(filePath,
+				filepath.Join(workdir, fileName["license"])); err != nil {
+				return err
+			}
 		}
 	}
 
@@ -227,6 +236,48 @@ func GetRepositoryCount(user *User) (int64, error) {
 	return orm.Count(&Repository{OwnerId: user.Id})
 }
 
+const (
+	RFile = iota + 1
+	RDir
+)
+
+type RepoFile struct {
+	Type int
+	Name string
+
+	Created time.Time
+}
+
+func GetReposFiles(userName, reposName, treeName, rpath string) ([]RepoFile, error) {
+	f := RepoPath(userName, reposName)
+	repo, err := git.OpenRepository(f)
+	if err != nil {
+		return nil, err
+	}
+
+	obj, err := repo.RevparseSingle("HEAD")
+	if err != nil {
+		return nil, err
+	}
+	lastCommit := obj.(*git.Commit)
+	var repofiles []RepoFile
+	tree, err := lastCommit.Tree()
+	if err != nil {
+		return nil, err
+	}
+	var i uint64 = 0
+	for ; i < tree.EntryCount(); i++ {
+		entry := tree.EntryByIndex(i)
+		repofiles = append(repofiles, RepoFile{
+			entry.Filemode,
+			entry.Name,
+			time.Now(),
+		})
+	}
+
+	return repofiles, nil
+}
+
 func StarReposiory(user *User, repoName string) error {
 	return nil
 }

+ 9 - 1
models/user.go

@@ -13,8 +13,8 @@ import (
 	"time"
 
 	"github.com/dchest/scrypt"
-
 	"github.com/gogits/gogs/modules/base"
+	git "github.com/libgit2/git2go"
 )
 
 var UserPasswdSalt string
@@ -98,6 +98,14 @@ func IsEmailUsed(email string) (bool, error) {
 	return orm.Get(&User{Email: email})
 }
 
+func (user *User) NewGitSig() *git.Signature {
+	return &git.Signature{
+		Name:  user.Name,
+		Email: user.Email,
+		When:  time.Now(),
+	}
+}
+
 // RegisterUser creates record of a new user.
 func RegisterUser(user *User) (err error) {
 	isExist, err := IsUserExist(user.Name)