// Copyright 2015 The Gogs Authors. All rights reserved. // Copyright 2017 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. // +build gogit package git import ( "errors" "path/filepath" gitealog "code.gitea.io/gitea/modules/log" "github.com/go-git/go-billy/v5/osfs" gogit "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/cache" "github.com/go-git/go-git/v5/storage/filesystem" ) // Repository represents a Git repository. type Repository struct { Path string tagCache *ObjectCache gogitRepo *gogit.Repository gogitStorage *filesystem.Storage gpgSettings *GPGSettings } // OpenRepository opens the repository at the given path. func OpenRepository(repoPath string) (*Repository, error) { repoPath, err := filepath.Abs(repoPath) if err != nil { return nil, err } else if !isDir(repoPath) { return nil, errors.New("no such file or directory") } fs := osfs.New(repoPath) _, err = fs.Stat(".git") if err == nil { fs, err = fs.Chroot(".git") if err != nil { return nil, err } } storage := filesystem.NewStorageWithOptions(fs, cache.NewObjectLRUDefault(), filesystem.Options{KeepDescriptors: true}) gogitRepo, err := gogit.Open(storage, fs) if err != nil { return nil, err } return &Repository{ Path: repoPath, gogitRepo: gogitRepo, gogitStorage: storage, tagCache: newObjectCache(), }, nil } // Close this repository, in particular close the underlying gogitStorage if this is not nil func (repo *Repository) Close() { if repo == nil || repo.gogitStorage == nil { return } if err := repo.gogitStorage.Close(); err != nil { gitealog.Error("Error closing storage: %v", err) } } // GoGitRepo gets the go-git repo representation func (repo *Repository) GoGitRepo() *gogit.Repository { return repo.gogitRepo }