mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Notify the user when the file path contains leading or trailing spaces and fix the error message for invalid file names. (#31507)
close #31478
This commit is contained in:
		| @@ -317,7 +317,7 @@ func editFilePost(ctx *context.Context, form forms.EditRepoFileForm, isNewFile b | |||||||
| 				case git.EntryModeBlob: | 				case git.EntryModeBlob: | ||||||
| 					ctx.RenderWithErr(ctx.Tr("repo.editor.directory_is_a_file", fileErr.Path), tplEditFile, &form) | 					ctx.RenderWithErr(ctx.Tr("repo.editor.directory_is_a_file", fileErr.Path), tplEditFile, &form) | ||||||
| 				default: | 				default: | ||||||
| 					ctx.Error(http.StatusInternalServerError, err.Error()) | 					ctx.RenderWithErr(ctx.Tr("repo.editor.filename_is_invalid", fileErr.Path), tplEditFile, &form) | ||||||
| 				} | 				} | ||||||
| 			} else { | 			} else { | ||||||
| 				ctx.Error(http.StatusInternalServerError, err.Error()) | 				ctx.Error(http.StatusInternalServerError, err.Error()) | ||||||
|   | |||||||
| @@ -75,24 +75,63 @@ export function initRepoEditor() { | |||||||
|   } |   } | ||||||
|   filenameInput.addEventListener('input', function () { |   filenameInput.addEventListener('input', function () { | ||||||
|     const parts = filenameInput.value.split('/'); |     const parts = filenameInput.value.split('/'); | ||||||
|  |     const links = Array.from(document.querySelectorAll('.breadcrumb span.section')); | ||||||
|  |     const dividers = Array.from(document.querySelectorAll('.breadcrumb .breadcrumb-divider')); | ||||||
|  |     let warningDiv = document.querySelector('.ui.warning.message.flash-message.flash-warning.space-related'); | ||||||
|  |     let containSpace = false; | ||||||
|     if (parts.length > 1) { |     if (parts.length > 1) { | ||||||
|       for (let i = 0; i < parts.length; ++i) { |       for (let i = 0; i < parts.length; ++i) { | ||||||
|         const value = parts[i]; |         const value = parts[i]; | ||||||
|  |         const trimValue = value.trim(); | ||||||
|  |         if (trimValue === '..') { | ||||||
|  |           // remove previous tree path | ||||||
|  |           if (links.length > 0) { | ||||||
|  |             const link = links.pop(); | ||||||
|  |             const divider = dividers.pop(); | ||||||
|  |             link.remove(); | ||||||
|  |             divider.remove(); | ||||||
|  |           } | ||||||
|  |           continue; | ||||||
|  |         } | ||||||
|         if (i < parts.length - 1) { |         if (i < parts.length - 1) { | ||||||
|           if (value.length) { |           if (trimValue.length) { | ||||||
|             filenameInput.before(createElementFromHTML( |             const linkElement = createElementFromHTML( | ||||||
|               `<span class="section"><a href="#">${htmlEscape(value)}</a></span>`, |               `<span class="section"><a href="#">${htmlEscape(value)}</a></span>`, | ||||||
|             )); |             ); | ||||||
|             filenameInput.before(createElementFromHTML( |             const dividerElement = createElementFromHTML( | ||||||
|               `<div class="breadcrumb-divider">/</div>`, |               `<div class="breadcrumb-divider">/</div>`, | ||||||
|             )); |             ); | ||||||
|  |             links.push(linkElement); | ||||||
|  |             dividers.push(dividerElement); | ||||||
|  |             filenameInput.before(linkElement); | ||||||
|  |             filenameInput.before(dividerElement); | ||||||
|           } |           } | ||||||
|         } else { |         } else { | ||||||
|           filenameInput.value = value; |           filenameInput.value = value; | ||||||
|         } |         } | ||||||
|         this.setSelectionRange(0, 0); |         this.setSelectionRange(0, 0); | ||||||
|  |         containSpace |= (trimValue !== value && trimValue !== ''); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |     containSpace |= Array.from(links).some((link) => { | ||||||
|  |       const value = link.querySelector('a').textContent; | ||||||
|  |       return value.trim() !== value; | ||||||
|  |     }); | ||||||
|  |     containSpace |= parts[parts.length - 1].trim() !== parts[parts.length - 1]; | ||||||
|  |     if (containSpace) { | ||||||
|  |       if (!warningDiv) { | ||||||
|  |         warningDiv = document.createElement('div'); | ||||||
|  |         warningDiv.classList.add('ui', 'warning', 'message', 'flash-message', 'flash-warning', 'space-related'); | ||||||
|  |         warningDiv.innerHTML = '<p>File path contains leading or trailing whitespace.</p>'; | ||||||
|  |         // Add display 'block' because display is set to 'none' in formantic\build\semantic.css | ||||||
|  |         warningDiv.style.display = 'block'; | ||||||
|  |         const inputContainer = document.querySelector('.repo-editor-header'); | ||||||
|  |         inputContainer.insertAdjacentElement('beforebegin', warningDiv); | ||||||
|  |       } | ||||||
|  |       showElem(warningDiv); | ||||||
|  |     } else if (warningDiv) { | ||||||
|  |       hideElem(warningDiv); | ||||||
|  |     } | ||||||
|     joinTreePath(); |     joinTreePath(); | ||||||
|   }); |   }); | ||||||
|   filenameInput.addEventListener('keydown', function (e) { |   filenameInput.addEventListener('keydown', function (e) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 charles
					charles