@@ -384,35 +384,81 @@ func DeleteFile(ctx *context.Context) {
384384 ctx .HTML (http .StatusOK , tplDeleteFile )
385385}
386386
387- // DeleteFilePost response for deleting file
387+ // DeleteFilePost response for deleting file or directory
388388func DeleteFilePost (ctx * context.Context ) {
389389 parsed := prepareEditorCommitSubmittedForm [* forms.DeleteRepoFileForm ](ctx )
390390 if ctx .Written () {
391391 return
392392 }
393393
394394 treePath := ctx .Repo .TreePath
395- _ , err := files_service .ChangeRepoFiles (ctx , ctx .Repo .Repository , ctx .Doer , & files_service.ChangeRepoFilesOptions {
396- LastCommitID : parsed .form .LastCommit ,
397- OldBranch : parsed .OldBranchName ,
398- NewBranch : parsed .NewBranchName ,
399- Files : []* files_service.ChangeRepoFile {
395+
396+ // Check if the path is a directory
397+ entry , err := ctx .Repo .Commit .GetTreeEntryByPath (treePath )
398+ if err != nil {
399+ ctx .NotFoundOrServerError ("GetTreeEntryByPath" , git .IsErrNotExist , err )
400+ return
401+ }
402+
403+ var filesToDelete []* files_service.ChangeRepoFile
404+ var commitMessage string
405+
406+ if entry .IsDir () {
407+ // Get all files in the directory recursively
408+ tree , err := ctx .Repo .Commit .SubTree (treePath )
409+ if err != nil {
410+ ctx .ServerError ("SubTree" , err )
411+ return
412+ }
413+
414+ entries , err := tree .ListEntriesRecursiveFast ()
415+ if err != nil {
416+ ctx .ServerError ("ListEntriesRecursiveFast" , err )
417+ return
418+ }
419+
420+ // Create delete operations for all files in the directory
421+ for _ , e := range entries {
422+ if ! e .IsDir () && ! e .IsSubModule () {
423+ filesToDelete = append (filesToDelete , & files_service.ChangeRepoFile {
424+ Operation : "delete" ,
425+ TreePath : treePath + "/" + e .Name (),
426+ })
427+ }
428+ }
429+
430+ commitMessage = parsed .GetCommitMessage (ctx .Locale .TrString ("repo.editor.delete_directory" , treePath ))
431+ } else {
432+ // Single file deletion
433+ filesToDelete = []* files_service.ChangeRepoFile {
400434 {
401435 Operation : "delete" ,
402436 TreePath : treePath ,
403437 },
404- },
405- Message : parsed .GetCommitMessage (ctx .Locale .TrString ("repo.editor.delete" , treePath )),
406- Signoff : parsed .form .Signoff ,
407- Author : parsed .GitCommitter ,
408- Committer : parsed .GitCommitter ,
438+ }
439+ commitMessage = parsed .GetCommitMessage (ctx .Locale .TrString ("repo.editor.delete" , treePath ))
440+ }
441+
442+ _ , err = files_service .ChangeRepoFiles (ctx , ctx .Repo .Repository , ctx .Doer , & files_service.ChangeRepoFilesOptions {
443+ LastCommitID : parsed .form .LastCommit ,
444+ OldBranch : parsed .OldBranchName ,
445+ NewBranch : parsed .NewBranchName ,
446+ Files : filesToDelete ,
447+ Message : commitMessage ,
448+ Signoff : parsed .form .Signoff ,
449+ Author : parsed .GitCommitter ,
450+ Committer : parsed .GitCommitter ,
409451 })
410452 if err != nil {
411453 editorHandleFileOperationError (ctx , parsed .NewBranchName , err )
412454 return
413455 }
414456
415- ctx .Flash .Success (ctx .Tr ("repo.editor.file_delete_success" , treePath ))
457+ if entry .IsDir () {
458+ ctx .Flash .Success (ctx .Tr ("repo.editor.directory_delete_success" , treePath ))
459+ } else {
460+ ctx .Flash .Success (ctx .Tr ("repo.editor.file_delete_success" , treePath ))
461+ }
416462 redirectTreePath := getClosestParentWithFiles (ctx .Repo .GitRepo , parsed .NewBranchName , treePath )
417463 redirectForCommitChoice (ctx , parsed , redirectTreePath )
418464}
0 commit comments