|  | @@ -416,12 +416,10 @@ var (
 | 
	
		
			
				|  |  |  // RepoFile represents a file object in git repository.
 | 
	
		
			
				|  |  |  type RepoFile struct {
 | 
	
		
			
				|  |  |  	*git.TreeEntry
 | 
	
		
			
				|  |  | -	Path       string
 | 
	
		
			
				|  |  | -	Message    string
 | 
	
		
			
				|  |  | -	Created    time.Time
 | 
	
		
			
				|  |  | -	Size       int64
 | 
	
		
			
				|  |  | -	Repo       *git.Repository
 | 
	
		
			
				|  |  | -	LastCommit string
 | 
	
		
			
				|  |  | +	Path   string
 | 
	
		
			
				|  |  | +	Size   int64
 | 
	
		
			
				|  |  | +	Repo   *git.Repository
 | 
	
		
			
				|  |  | +	Commit *git.Commit
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // LookupBlob returns the content of an object.
 | 
	
	
		
			
				|  | @@ -453,32 +451,28 @@ func GetBranches(userName, reposName string) ([]string, error) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // GetReposFiles returns a list of file object in given directory of repository.
 | 
	
		
			
				|  |  | -func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, error) {
 | 
	
		
			
				|  |  | +func GetReposFiles(userName, reposName, branchName, commitId, rpath string) ([]*RepoFile, error) {
 | 
	
		
			
				|  |  |  	repo, err := git.OpenRepository(RepoPath(userName, reposName))
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return nil, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	ref, err := repo.LookupReference("refs/heads/" + branchName)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return nil, err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	lastCommit, err := repo.LookupCommit(ref.Oid)
 | 
	
		
			
				|  |  | +	commit, err := GetCommit(userName, reposName, branchName, commitId)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return nil, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	var repodirs []*RepoFile
 | 
	
		
			
				|  |  |  	var repofiles []*RepoFile
 | 
	
		
			
				|  |  | -	lastCommit.Tree.Walk(func(dirname string, entry *git.TreeEntry) int {
 | 
	
		
			
				|  |  | +	commit.Tree.Walk(func(dirname string, entry *git.TreeEntry) int {
 | 
	
		
			
				|  |  |  		if dirname == rpath {
 | 
	
		
			
				|  |  | +			// TODO: size get method shoule be improved
 | 
	
		
			
				|  |  |  			size, err := repo.ObjectSize(entry.Id)
 | 
	
		
			
				|  |  |  			if err != nil {
 | 
	
		
			
				|  |  |  				return 0
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			var cm = lastCommit
 | 
	
		
			
				|  |  | +			var cm = commit
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			for {
 | 
	
		
			
				|  |  |  				if cm.ParentCount() == 0 {
 | 
	
	
		
			
				|  | @@ -533,11 +527,9 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile,
 | 
	
		
			
				|  |  |  			rp := &RepoFile{
 | 
	
		
			
				|  |  |  				entry,
 | 
	
		
			
				|  |  |  				path.Join(dirname, entry.Name),
 | 
	
		
			
				|  |  | -				cm.Message(),
 | 
	
		
			
				|  |  | -				cm.Committer.When,
 | 
	
		
			
				|  |  |  				size,
 | 
	
		
			
				|  |  |  				repo,
 | 
	
		
			
				|  |  | -				cm.Id().String(),
 | 
	
		
			
				|  |  | +				cm,
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			if entry.IsFile() {
 | 
	
	
		
			
				|  | @@ -552,6 +544,31 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile,
 | 
	
		
			
				|  |  |  	return append(repodirs, repofiles...), nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +func GetCommit(userName, repoName, branchname, commitid string) (*git.Commit, error) {
 | 
	
		
			
				|  |  | +	repo, err := git.OpenRepository(RepoPath(userName, repoName))
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return nil, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if commitid != "" {
 | 
	
		
			
				|  |  | +		oid, err := git.NewOidFromString(commitid)
 | 
	
		
			
				|  |  | +		if err != nil {
 | 
	
		
			
				|  |  | +			return nil, err
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		return repo.LookupCommit(oid)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if branchname == "" {
 | 
	
		
			
				|  |  | +		return nil, errors.New("no branch name and no commit id")
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	r, err := repo.LookupReference(fmt.Sprintf("refs/heads/%s", branchname))
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return nil, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return r.LastCommit()
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  |  // GetLastestCommit returns the latest commit of given repository.
 | 
	
		
			
				|  |  |  func GetLastestCommit(userName, repoName string) (*Commit, error) {
 | 
	
		
			
				|  |  |  	stdout, _, err := com.ExecCmd("git", "--git-dir="+RepoPath(userName, repoName), "log", "-1")
 | 
	
	
		
			
				|  | @@ -581,7 +598,7 @@ func GetLastestCommit(userName, repoName string) (*Commit, error) {
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	return commit, nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +}*/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // GetCommits returns all commits of given branch of repository.
 | 
	
		
			
				|  |  |  func GetCommits(userName, reposName, branchname string) ([]*git.Commit, error) {
 |