diff --git a/models/error.go b/models/error.go index fc161ed806f3..d3270aef39c0 100644 --- a/models/error.go +++ b/models/error.go @@ -56,6 +56,20 @@ func (err ErrNamePatternNotAllowed) Error() string { return fmt.Sprintf("name pattern is not allowed [pattern: %s]", err.Pattern) } +// ErrLFSNotInstalled represents an "git-lfs not found" error. +type ErrLFSNotInstalled struct { +} + +// IsLFSNotInstalled checks if an error is an ErrLFSNotInstalled. +func IsLFSNotInstalled(err error) bool { + _, ok := err.(ErrLFSNotInstalled) + return ok +} + +func (err ErrLFSNotInstalled) Error() string { + return "git-lfs not found" +} + // ErrNameCharsNotAllowed represents a "character not allowed in name" error. type ErrNameCharsNotAllowed struct { Name string diff --git a/models/repo.go b/models/repo.go index 62d64fbee918..08fee4b54767 100644 --- a/models/repo.go +++ b/models/repo.go @@ -18,6 +18,7 @@ import ( "net" "net/url" "os" + "os/exec" "path" "path/filepath" "sort" @@ -935,7 +936,7 @@ func (repo *Repository) CloneLink() (cl *CloneLink) { } // CheckCreateRepository check if could created a repository -func CheckCreateRepository(doer, u *User, name string, overwriteOrAdopt bool) error { +func CheckCreateRepository(doer, u *User, name string, lfs bool, overwriteOrAdopt bool) error { if !doer.CanCreateRepo() { return ErrReachLimitOfRepo{u.MaxRepoCreation} } @@ -959,6 +960,12 @@ func CheckCreateRepository(doer, u *User, name string, overwriteOrAdopt bool) er if !overwriteOrAdopt && isExist { return ErrRepoFilesAlreadyExist{u.Name, name} } + + if lfs { + if _, err := exec.LookPath("git-lfs"); err != nil { + return ErrLFSNotInstalled{} + } + } return nil } diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index b07dfb08f09e..00aa059821c3 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -392,6 +392,7 @@ user_not_exist = The user does not exist. team_not_exist = The team does not exist. last_org_owner = You cannot remove the last user from the 'owners' team. There must be at least one owner for an organization. cannot_add_org_to_team = An organization cannot be added as a team member. +lfs_not_installed = Please install git-lfs. invalid_ssh_key = Can not verify your SSH key: %s invalid_gpg_key = Can not verify your GPG key: %s diff --git a/routers/repo/migrate.go b/routers/repo/migrate.go index 15df1dfdee88..06fb53e7244d 100644 --- a/routers/repo/migrate.go +++ b/routers/repo/migrate.go @@ -101,6 +101,9 @@ func handleMigrateError(ctx *context.Context, owner *models.User, err error, nam case models.IsErrNamePatternNotAllowed(err): ctx.Data["Err_RepoName"] = true ctx.RenderWithErr(ctx.Tr("repo.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), tpl, form) + case models.IsLFSNotInstalled(err): + ctx.Data["Err_LFSNotInstalled"] = true + ctx.RenderWithErr(ctx.Tr("form.lfs_not_installed"), tpl, form) default: remoteAddr, _ := auth.ParseRemoteAddr(form.CloneAddr, form.AuthUsername, form.AuthPassword, owner) err = util.URLSanitizedError(err, remoteAddr) @@ -194,7 +197,7 @@ func MigratePost(ctx *context.Context) { opts.Releases = false } - err = models.CheckCreateRepository(ctx.User, ctxUser, opts.RepoName, false) + err = models.CheckCreateRepository(ctx.User, ctxUser, opts.RepoName, opts.LFS, false) if err != nil { handleMigrateError(ctx, ctxUser, err, "MigratePost", tpl, form) return