diff options
Diffstat (limited to 'internal/service/repository/pre_fetch.go')
-rw-r--r-- | internal/service/repository/pre_fetch.go | 155 |
1 files changed, 0 insertions, 155 deletions
diff --git a/internal/service/repository/pre_fetch.go b/internal/service/repository/pre_fetch.go deleted file mode 100644 index 0c62b2eb5..000000000 --- a/internal/service/repository/pre_fetch.go +++ /dev/null @@ -1,155 +0,0 @@ -package repository - -import ( - "context" - "errors" - "fmt" - "io/ioutil" - "os" - "path/filepath" - - "gitlab.com/gitlab-org/gitaly-proto/go/gitalypb" - "gitlab.com/gitlab-org/gitaly/internal/git" - "gitlab.com/gitlab-org/gitaly/internal/git/objectpool" - "gitlab.com/gitlab-org/gitaly/internal/helper" -) - -func (s *server) PreFetch(ctx context.Context, req *gitalypb.PreFetchRequest) (*gitalypb.PreFetchResponse, error) { - if err := validatePreFetchRequest(req); err != nil { - return nil, helper.ErrInvalidArgument(err) - } - - if err := validatePreFetchPrecondition(req); err != nil { - return nil, helper.ErrPreconditionFailed(err) - } - - if err := preFetch(ctx, req); err != nil { - return nil, helper.ErrInternal(err) - } - - return &gitalypb.PreFetchResponse{}, nil -} - -func validatePreFetchRequest(req *gitalypb.PreFetchRequest) error { - if req.GetTargetRepository() == nil { - return errors.New("repository is empty") - } - - if req.GetSourceRepository() == nil { - return errors.New("source repository is empty") - } - - if req.GetSourceRepository().GetStorageName() != req.GetTargetRepository().GetStorageName() { - return errors.New("source repository and target repository are not on the same storage") - } - - return nil -} - -func validatePreFetchPrecondition(req *gitalypb.PreFetchRequest) error { - targetRepositoryFullPath, err := helper.GetPath(req.GetTargetRepository()) - if err != nil { - return fmt.Errorf("getting target repository path: %v", err) - } - - if _, err := os.Stat(targetRepositoryFullPath); !os.IsNotExist(err) { - return errors.New("target reopsitory already exists") - } - - objectPool, err := objectpool.FromProto(req.GetObjectPool()) - if err != nil { - return fmt.Errorf("getting object pool from repository: %v", err) - } - - if !objectPool.Exists() { - return errors.New("object pool does not exist") - } - - if !objectPool.IsValid() { - return errors.New("object pool is not valid") - } - - linked, err := objectPool.LinkedToRepository(req.GetSourceRepository()) - if err != nil { - return fmt.Errorf("error when testing if source repository is linked to pool repository: %v", err) - } - - if !linked { - return errors.New("source repository is not linked to pool repository") - } - - return nil -} - -func preFetch(ctx context.Context, req *gitalypb.PreFetchRequest) error { - targetRepository, sourceRepository := req.GetTargetRepository(), req.GetSourceRepository() - - sourceRepositoryFullPath, err := helper.GetPath(sourceRepository) - if err != nil { - return fmt.Errorf("getting source repository path: %v", err) - } - - targetRepositoryFullPath, err := helper.GetPath(targetRepository) - if err != nil { - return fmt.Errorf("getting target repository path: %v", err) - } - - targetPath, err := helper.GetPath(targetRepository) - if err != nil { - return fmt.Errorf("getting target repository path: %v", err) - } - - dir := filepath.Dir(targetPath) - - tmpRepoDir, err := ioutil.TempDir(dir, "repo") - if err != nil { - return fmt.Errorf("creating temp directory for repo: %v", err) - } - defer os.RemoveAll(tmpRepoDir) - - storagePath, err := helper.GetStorageByName(targetRepository.GetStorageName()) - if err != nil { - return fmt.Errorf("getting storage path for target repo: %v", err) - } - - relativePath, err := filepath.Rel(storagePath, tmpRepoDir) - if err != nil { - return fmt.Errorf("getting relative path for temp repo: %v", err) - } - - tmpRepo := &gitalypb.Repository{ - RelativePath: relativePath, - StorageName: targetRepository.GetStorageName(), - } - - args := []string{ - "clone", - "--bare", - "--shared", - "--", - sourceRepositoryFullPath, - tmpRepoDir, - } - - cmd, err := git.BareCommand(ctx, nil, nil, nil, nil, args...) - if err != nil { - return fmt.Errorf("clone command: %v", err) - } - - if err := cmd.Wait(); err != nil { - return fmt.Errorf("clone command: %v", err) - } - - objectPool, err := objectpool.FromProto(req.GetObjectPool()) - if err != nil { - return fmt.Errorf("getting object pool: %v", err) - } - - // As of 11.9, Link will still create remotes in the object pool. In this case the remotes will point to the tempoarary - // directory. This is OK because we don't plan on using these remotes, and will remove them in the future. - if err := objectPool.Link(ctx, tmpRepo); err != nil { - return fmt.Errorf("linking: %v", err) - } - - return os.Rename(tmpRepoDir, targetRepositoryFullPath) -} |