Show More
@@ -156,6 +156,10 b' def includeme(config):' | |||
|
156 | 156 | pattern='/{repo_name:.*?[^/]}/authors/{commit_id}/{f_path:.*}', repo_route=True) |
|
157 | 157 | |
|
158 | 158 | config.add_route( |
|
159 | name='repo_files_check_head', | |
|
160 | pattern='/{repo_name:.*?[^/]}/check_head/{commit_id}/{f_path:.*}', | |
|
161 | repo_route=True) | |
|
162 | config.add_route( | |
|
159 | 163 | name='repo_files_remove_file', |
|
160 | 164 | pattern='/{repo_name:.*?[^/]}/remove_file/{commit_id}/{f_path:.*}', |
|
161 | 165 | repo_route=True) |
@@ -1114,6 +1114,42 b' class RepoFilesView(RepoAppView):' | |||
|
1114 | 1114 | @LoginRequired() |
|
1115 | 1115 | @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin') |
|
1116 | 1116 | @view_config( |
|
1117 | route_name='repo_files_check_head', request_method='POST', | |
|
1118 | renderer='json_ext', xhr=True) | |
|
1119 | def repo_files_check_head(self): | |
|
1120 | self.load_default_context() | |
|
1121 | ||
|
1122 | commit_id, f_path = self._get_commit_and_path() | |
|
1123 | _branch_name, _sha_commit_id, is_head = \ | |
|
1124 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) | |
|
1125 | ||
|
1126 | new_path = self.request.POST.get('path') | |
|
1127 | operation = self.request.POST.get('operation') | |
|
1128 | path_exist = '' | |
|
1129 | ||
|
1130 | if new_path and operation in ['create', 'upload']: | |
|
1131 | new_f_path = os.path.join(f_path.lstrip('/'), new_path) | |
|
1132 | try: | |
|
1133 | commit_obj = self.rhodecode_vcs_repo.get_commit(commit_id) | |
|
1134 | # NOTE(dan): construct whole path without leading / | |
|
1135 | file_node = commit_obj.get_node(new_f_path) | |
|
1136 | if file_node is not None: | |
|
1137 | path_exist = new_f_path | |
|
1138 | except EmptyRepositoryError: | |
|
1139 | pass | |
|
1140 | except Exception: | |
|
1141 | pass | |
|
1142 | ||
|
1143 | return { | |
|
1144 | 'branch': _branch_name, | |
|
1145 | 'sha': _sha_commit_id, | |
|
1146 | 'is_head': is_head, | |
|
1147 | 'path_exists': path_exist | |
|
1148 | } | |
|
1149 | ||
|
1150 | @LoginRequired() | |
|
1151 | @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin') | |
|
1152 | @view_config( | |
|
1117 | 1153 | route_name='repo_files_remove_file', request_method='GET', |
|
1118 | 1154 | renderer='rhodecode:templates/files/files_delete.mako') |
|
1119 | 1155 | def repo_files_remove_file(self): |
@@ -2532,6 +2532,10 b' h3.files_location{' | |||
|
2532 | 2532 | white-space: nowrap; |
|
2533 | 2533 | } |
|
2534 | 2534 | |
|
2535 | .upload-form { | |
|
2536 | margin-top: 46px; | |
|
2537 | } | |
|
2538 | ||
|
2535 | 2539 | .location-path { |
|
2536 | 2540 | width: -moz-available; /* WebKit-based browsers will ignore this. */ |
|
2537 | 2541 | width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */ |
@@ -204,6 +204,7 b' function registerRCRoutes() {' | |||
|
204 | 204 | pyroutes.register('repo_file_download:legacy', '/%(repo_name)s/rawfile/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
|
205 | 205 | pyroutes.register('repo_file_history', '/%(repo_name)s/history/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
|
206 | 206 | pyroutes.register('repo_file_authors', '/%(repo_name)s/authors/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
|
207 | pyroutes.register('repo_files_check_head', '/%(repo_name)s/check_head/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); | |
|
207 | 208 | pyroutes.register('repo_files_remove_file', '/%(repo_name)s/remove_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
|
208 | 209 | pyroutes.register('repo_files_delete_file', '/%(repo_name)s/delete_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
|
209 | 210 | pyroutes.register('repo_files_edit_file', '/%(repo_name)s/edit_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
@@ -521,3 +521,80 b' var showAuthors = function(elem, annotat' | |||
|
521 | 521 | return FileEditor; |
|
522 | 522 | }); |
|
523 | 523 | |
|
524 | ||
|
525 | var checkFileHead = function($editForm, commit_id, f_path, operation) { | |
|
526 | function getFormData($form){ | |
|
527 | var unindexed_array = $form.serializeArray(); | |
|
528 | var indexed_array = {}; | |
|
529 | ||
|
530 | $.map(unindexed_array, function(n, i){ | |
|
531 | indexed_array[n['name']] = n['value']; | |
|
532 | }); | |
|
533 | ||
|
534 | return indexed_array; | |
|
535 | } | |
|
536 | ||
|
537 | $editForm.on('submit', function (e) { | |
|
538 | ||
|
539 | var validHead = $editForm.find('#commit_btn').data('validHead'); | |
|
540 | if (validHead === true){ | |
|
541 | return true | |
|
542 | } | |
|
543 | ||
|
544 | // no marker, we do "checks" | |
|
545 | e.preventDefault(); | |
|
546 | var formData = getFormData($editForm); | |
|
547 | var new_path = formData['filename']; | |
|
548 | ||
|
549 | var success = function(data) { | |
|
550 | ||
|
551 | if (data['is_head'] === true && data['path_exists'] === "") { | |
|
552 | ||
|
553 | $editForm.find('#commit_btn').data('validHead', true); | |
|
554 | $editForm.find('#commit_btn').val('Committing...'); | |
|
555 | $editForm.submit(); | |
|
556 | ||
|
557 | } else { | |
|
558 | var message = ''; | |
|
559 | var urlTmpl = '<a target="_blank" href="{0}">here</a>'; | |
|
560 | $editForm.find('#commit_btn').val('Commit aborted'); | |
|
561 | ||
|
562 | if (operation === 'edit') { | |
|
563 | var new_url = urlTmpl.format(pyroutes.url('repo_files_edit_file', {"repo_name": templateContext.repo_name, "commit_id": data['branch'], "f_path": f_path})); | |
|
564 | message = _gettext('File `{0}` has a newer version available, or has been removed. Click {1} to see the latest version.'.format(f_path, new_url)); | |
|
565 | } else if (operation === 'delete') { | |
|
566 | var new_url = urlTmpl.format(pyroutes.url('repo_files_remove_file', {"repo_name": templateContext.repo_name, "commit_id": data['branch'], "f_path": f_path})); | |
|
567 | message = _gettext('File `{0}` has a newer version available, or has been removed. Click {1} to see the latest version.'.format(f_path, new_url)); | |
|
568 | } else if (operation === 'create') { | |
|
569 | if (data['path_exists'] !== "") { | |
|
570 | message = _gettext('There is an existing path `{0}` at this commit.'.format(data['path_exists'])); | |
|
571 | } else { | |
|
572 | var new_url = urlTmpl.format(pyroutes.url('repo_files_add_file', {"repo_name": templateContext.repo_name, "commit_id": data['branch'], "f_path": f_path, "filename": new_path})); | |
|
573 | message = _gettext('There is a later version of file tree available. Click {0} to create a file at the latest tree.'.format(new_url)); | |
|
574 | } | |
|
575 | } | |
|
576 | ||
|
577 | var payload = { | |
|
578 | message: { | |
|
579 | message: message, | |
|
580 | level: 'warning', | |
|
581 | force: true | |
|
582 | } | |
|
583 | }; | |
|
584 | $.Topic('/notifications').publish(payload); | |
|
585 | } | |
|
586 | }; | |
|
587 | ||
|
588 | // lock button | |
|
589 | $editForm.find('#commit_btn').attr('disabled', 'disabled'); | |
|
590 | $editForm.find('#commit_btn').val('Checking commit...'); | |
|
591 | ||
|
592 | var postData = {'csrf_token': CSRF_TOKEN, 'path': new_path, 'operation': operation}; | |
|
593 | ajaxPOST(pyroutes.url('repo_files_check_head', | |
|
594 | {'repo_name': templateContext.repo_name, 'commit_id': commit_id, 'f_path': f_path}), | |
|
595 | postData, success); | |
|
596 | ||
|
597 | return false | |
|
598 | ||
|
599 | }); | |
|
600 | }; |
@@ -41,7 +41,7 b'' | |||
|
41 | 41 | </div> |
|
42 | 42 | </li> |
|
43 | 43 | <li class="location-path"> |
|
44 | <input class="file-name-input input-small" type="text" value="" name="filename" id="filename" placeholder="${_('Filename e.g example.py, or docs/readme.md')}"> | |
|
44 | <input class="file-name-input input-small" type="text" value="${request.GET.get('filename')}" name="filename" id="filename" placeholder="${_('Filename e.g example.py, or docs/readme.md')}"> | |
|
45 | 45 | </li> |
|
46 | 46 | </ul> |
|
47 | 47 | </div> |
@@ -50,7 +50,6 b'' | |||
|
50 | 50 | |
|
51 | 51 | <div class="table"> |
|
52 | 52 | <div> |
|
53 | ||
|
54 | 53 | <div id="codeblock" class="codeblock"> |
|
55 | 54 | <div class="editor-items"> |
|
56 | 55 | <div class="editor-action active show-editor pull-left" onclick="fileEditor.showEditor(); return false"> |
@@ -108,6 +107,10 b'' | |||
|
108 | 107 | |
|
109 | 108 | $('#filename').focus(); |
|
110 | 109 | |
|
110 | var commit_id = "${c.commit.raw_id}"; | |
|
111 | var f_path = "${c.f_path}"; | |
|
112 | ||
|
113 | checkFileHead($('#eform'), commit_id, f_path, 'create') | |
|
111 | 114 | }); |
|
112 | 115 | |
|
113 | 116 | </script> |
@@ -69,7 +69,7 b'' | |||
|
69 | 69 | </div> |
|
70 | 70 | </div> |
|
71 | 71 | <div class="pull-left"> |
|
72 | ${h.submit('commit',_('Commit changes'),class_="btn btn-small btn-danger-action")} | |
|
72 | ${h.submit('commit_btn',_('Commit changes'),class_="btn btn-small btn-danger-action")} | |
|
73 | 73 | </div> |
|
74 | 74 | </div> |
|
75 | 75 | ${h.end_form()} |
@@ -82,6 +82,10 b'' | |||
|
82 | 82 | |
|
83 | 83 | fileEditor = new FileEditor('#editor'); |
|
84 | 84 | |
|
85 | var commit_id = "${c.commit.raw_id}"; | |
|
86 | var f_path = "${c.f_path}"; | |
|
87 | ||
|
88 | checkFileHead($('#eform'), commit_id, f_path, 'delete'); | |
|
85 | 89 | }); |
|
86 | 90 | |
|
87 | 91 | </script> |
@@ -117,6 +117,11 b'' | |||
|
117 | 117 | // on entering the new filename set mode, from given extension |
|
118 | 118 | setCodeMirrorModeFromInput(modes_select, filename_selector, fileEditor.cm, null); |
|
119 | 119 | |
|
120 | var commit_id = "${c.commit.raw_id}"; | |
|
121 | var f_path = "${c.f_path}"; | |
|
122 | ||
|
123 | checkFileHead($('#eform'), commit_id, f_path, 'edit') | |
|
124 | ||
|
120 | 125 | }); |
|
121 | 126 | |
|
122 | 127 |
@@ -106,7 +106,7 b'' | |||
|
106 | 106 | |
|
107 | 107 | <div class="file-upload-transaction-wrapper" style="display: none"> |
|
108 | 108 | <div class="file-upload-transaction"> |
|
109 | <h3>${_('Commiting...')}</h3> | |
|
109 | <h3>${_('Committing...')}</h3> | |
|
110 | 110 | <p>${_('Please wait while the files are being uploaded')}</p> |
|
111 | 111 | <p class="error" style="display: none"> |
|
112 | 112 |
General Comments 0
You need to be logged in to leave comments.
Login now