From 24678d73f59abd46141ef6fece7966e1f9c5c8f3 Mon Sep 17 00:00:00 2001 From: slene Date: Thu, 20 Mar 2014 13:31:24 +0800 Subject: read single file --- models/repo.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'models/repo.go') diff --git a/models/repo.go b/models/repo.go index edf800bd..4b6dedaf 100644 --- a/models/repo.go +++ b/models/repo.go @@ -81,6 +81,7 @@ var ( var ( ErrRepoAlreadyExist = errors.New("Repository already exist") ErrRepoNotExist = errors.New("Repository does not exist") + ErrRepoFileNotExist = errors.New("Target Repo file does not exist") ) func init() { @@ -463,6 +464,51 @@ func GetBranches(userName, reposName string) ([]string, error) { return brs, nil } +func GetTargetFile(userName, reposName, branchName, commitId, rpath string) (*RepoFile, error) { + repo, err := git.OpenRepository(RepoPath(userName, reposName)) + if err != nil { + return nil, err + } + + commit, err := repo.GetCommit(branchName, commitId) + if err != nil { + return nil, err + } + + parts := strings.Split(path.Clean(rpath), "/") + + var entry *git.TreeEntry + tree := commit.Tree + for i, part := range parts { + if i == len(parts)-1 { + entry = tree.EntryByName(part) + if entry == nil { + return nil, ErrRepoFileNotExist + } + } else { + tree, err = repo.SubTree(tree, part) + if err != nil { + return nil, err + } + } + } + + size, err := repo.ObjectSize(entry.Id) + if err != nil { + return nil, err + } + + repoFile := &RepoFile{ + entry, + rpath, + size, + repo, + commit, + } + + return repoFile, nil +} + // GetReposFiles returns a list of file object in given directory of repository. func GetReposFiles(userName, reposName, branchName, commitId, rpath string) ([]*RepoFile, error) { repo, err := git.OpenRepository(RepoPath(userName, reposName)) -- cgit v1.2.3