##// END OF EJS Templates
pull-requests: increase stability of concurrent pull requests creation by flushing prematurly the statuses of commits....
pull-requests: increase stability of concurrent pull requests creation by flushing prematurly the statuses of commits. This is required to increase the versions on each concurrent call. Otherwise we could get into an integrity errors of commitsha+version+repo

File last commit:

r3330:7e8ec062 default
r3408:2a133f7e stable
Show More
pullrequest.mako
548 lines | 19.8 KiB | application/x-mako | MakoHtmlLexer
templating: use .mako as extensions for template files.
r1282 <%inherit file="/base/base.mako"/>
pull-requests: allow markup rendered description.
r2816 <%namespace name="dt" file="/data_table/_dt_elements.mako"/>
templating: use .mako as extensions for template files.
r1282
<%def name="title()">
${c.repo_name} ${_('New pull request')}
</%def>
<%def name="breadcrumbs_links()">
${_('New pull request')}
</%def>
<%def name="menu_bar_nav()">
${self.menu_items(active='repositories')}
</%def>
<%def name="menu_bar_subnav()">
${self.repo_menu(active='showpullrequest')}
</%def>
<%def name="main()">
<div class="box">
<div class="title">
${self.repo_page_title(c.rhodecode_db_repo)}
</div>
forms: unified usage of h.secure_form. Make sure we ALWAYS pass in...
r2105 ${h.secure_form(h.route_path('pullrequest_create', repo_name=c.repo_name, _query=request.GET.mixed()), id='pull_request_form', request=request)}
pull-requests: expose author in creation view to be consistent with show view.
r1786
${self.breadcrumbs()}
templating: use .mako as extensions for template files.
r1282 <div class="box pr-summary">
<div class="summary-details block-left">
pull-requests: expose author in creation view to be consistent with show view.
r1786
<div class="pr-details-title">
${_('Pull request summary')}
</div>
<div class="form" style="padding-top: 10px">
templating: use .mako as extensions for template files.
r1282 <!-- fields -->
<div class="fields" >
<div class="field">
<div class="label">
<label for="pullrequest_title">${_('Title')}:</label>
</div>
<div class="input">
${h.text('pullrequest_title', c.default_title, class_="medium autogenerated-title")}
</div>
</div>
<div class="field">
<div class="label label-textarea">
<label for="pullrequest_desc">${_('Description')}:</label>
</div>
<div class="textarea text-area editor">
pull-requests: make the renderer stored and saved for each pull requests....
r2903 <input id="pr-renderer-input" type="hidden" name="description_renderer" value="${c.visual.default_renderer}">
pull-requests: allow markup rendered description.
r2816 ${dt.markup_form('pullrequest_desc')}
templating: use .mako as extensions for template files.
r1282 </div>
</div>
<div class="field">
<div class="label label-textarea">
pull-requests: allow markup rendered description.
r2816 <label for="commit_flow">${_('Commit flow')}:</label>
templating: use .mako as extensions for template files.
r1282 </div>
## TODO: johbo: Abusing the "content" class here to get the
## desired effect. Should be replaced by a proper solution.
##ORG
<div class="content">
pull-request: extended default reviewers functionality....
r1769 <strong>${_('Source repository')}:</strong>
templating: use .mako as extensions for template files.
r1282 ${c.rhodecode_db_repo.description}
</div>
<div class="content">
${h.hidden('source_repo')}
${h.hidden('source_ref')}
</div>
##OTHER, most Probably the PARENT OF THIS FORK
<div class="content">
## filled with JS
<div id="target_repo_desc"></div>
</div>
<div class="content">
${h.hidden('target_repo')}
${h.hidden('target_ref')}
<span id="target_ref_loading" style="display: none">
${_('Loading refs...')}
</span>
</div>
</div>
<div class="field">
<div class="label label-textarea">
<label for="pullrequest_submit"></label>
</div>
<div class="input">
<div class="pr-submit-button">
pull-requests: lock submit on pull request to prevent double submission on fast click.
r2806 <input id="pr_submit" class="btn" name="save" type="submit" value="${_('Submit Pull Request')}">
templating: use .mako as extensions for template files.
r1282 </div>
<div id="pr_open_message"></div>
</div>
</div>
<div class="pr-spacing-container"></div>
</div>
</div>
</div>
<div>
pull-requests: expose author in creation view to be consistent with show view.
r1786 ## AUTHOR
<div class="reviewers-title block-right">
<div class="pr-details-title">
${_('Author of this pull request')}
</div>
</div>
<div class="block-right pr-details-content reviewers">
<ul class="group_members">
<li>
${self.gravatar_with_user(c.rhodecode_user.email, 16)}
</li>
</ul>
</div>
## REVIEW RULES
pull-request: extended default reviewers functionality....
r1769 <div id="review_rules" style="display: none" class="reviewers-title block-right">
<div class="pr-details-title">
${_('Reviewer rules')}
</div>
<div class="pr-reviewer-rules">
## review rules will be appended here, by default reviewers logic
</div>
</div>
## REVIEWERS
templating: use .mako as extensions for template files.
r1282 <div class="reviewers-title block-right">
<div class="pr-details-title">
${_('Pull request reviewers')}
<span class="calculate-reviewers"> - ${_('loading...')}</span>
</div>
</div>
<div id="reviewers" class="block-right pr-details-content reviewers">
## members goes here, filled via JS based on initial selection !
<input type="hidden" name="__start__" value="review_members:sequence">
<ul id="review_members" class="group_members"></ul>
<input type="hidden" name="__end__" value="review_members:sequence">
<div id="add_reviewer_input" class='ac'>
<div class="reviewer_ac">
pull-request-reviewers: added option to add reviewers by picking an user group for pull requests....
r1678 ${h.text('user', class_='ac-input', placeholder=_('Add reviewer or reviewer group'))}
templating: use .mako as extensions for template files.
r1282 <div id="reviewers_container"></div>
</div>
</div>
</div>
</div>
</div>
<div class="box">
<div>
## overview pulled by ajax
<div id="pull_request_overview"></div>
</div>
</div>
${h.end_form()}
</div>
<script type="text/javascript">
pull-requests: allow markup rendered description.
r2816 $(function(){
var defaultSourceRepo = '${c.default_repo_data['source_repo_name']}';
var defaultSourceRepoData = ${c.default_repo_data['source_refs_json']|n};
var defaultTargetRepo = '${c.default_repo_data['target_repo_name']}';
var defaultTargetRepoData = ${c.default_repo_data['target_refs_json']|n};
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var $pullRequestForm = $('#pull_request_form');
var $pullRequestSubmit = $('#pr_submit', $pullRequestForm);
var $sourceRepo = $('#source_repo', $pullRequestForm);
var $targetRepo = $('#target_repo', $pullRequestForm);
var $sourceRef = $('#source_ref', $pullRequestForm);
var $targetRef = $('#target_ref', $pullRequestForm);
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var sourceRepo = function() { return $sourceRepo.eq(0).val() };
var sourceRef = function() { return $sourceRef.eq(0).val().split(':') };
pull-request: extended default reviewers functionality....
r1769
pull-requests: allow markup rendered description.
r2816 var targetRepo = function() { return $targetRepo.eq(0).val() };
var targetRef = function() { return $targetRef.eq(0).val().split(':') };
pull-request: extended default reviewers functionality....
r1769
pull-requests: allow markup rendered description.
r2816 var calculateContainerWidth = function() {
var maxWidth = 0;
var repoSelect2Containers = ['#source_repo', '#target_repo'];
$.each(repoSelect2Containers, function(idx, value) {
$(value).select2('container').width('auto');
var curWidth = $(value).select2('container').width();
if (maxWidth <= curWidth) {
maxWidth = curWidth;
}
$.each(repoSelect2Containers, function(idx, value) {
$(value).select2('container').width(maxWidth + 10);
});
});
};
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var initRefSelection = function(selectedRef) {
return function(element, callback) {
// translate our select2 id into a text, it's a mapping to show
// simple label when selecting by internal ID.
var id, refData;
if (selectedRef === undefined || selectedRef === null) {
id = element.val();
refData = element.val().split(':');
pull-requests: fixed cases with default expected refs are closed or unavailable....
r2555
pull-requests: allow markup rendered description.
r2816 if (refData.length !== 3){
refData = ["", "", ""]
}
} else {
id = selectedRef;
refData = selectedRef.split(':');
}
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var text = refData[1];
if (refData[0] === 'rev') {
text = text.substring(0, 12);
}
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var data = {id: id, text: text};
callback(data);
};
};
templating: use .mako as extensions for template files.
r1282
pull-requests: added missing escapeMarkup.
r2995 var formatRefSelection = function(data, container, escapeMarkup) {
pull-requests: allow markup rendered description.
r2816 var prefix = '';
pull-requests: added missing escapeMarkup.
r2995 var refData = data.id.split(':');
pull-requests: allow markup rendered description.
r2816 if (refData[0] === 'branch') {
prefix = '<i class="icon-branch"></i>';
}
else if (refData[0] === 'book') {
prefix = '<i class="icon-bookmark"></i>';
}
else if (refData[0] === 'tag') {
prefix = '<i class="icon-tag"></i>';
}
templating: use .mako as extensions for template files.
r1282
pull-requests: added missing escapeMarkup.
r2995 var originalOption = data.element;
return prefix + escapeMarkup(data.text);
};formatSelection:
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 // custom code mirror
var codeMirrorInstance = $('#pullrequest_desc').get(0).MarkupForm.cm;
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 reviewersController = new ReviewersController();
pull-request: extended default reviewers functionality....
r1769
pull-requests: allow markup rendered description.
r2816 var queryTargetRepo = function(self, query) {
// cache ALL results if query is empty
var cacheKey = query.term || '__';
var cachedData = self.cachedDataSource[cacheKey];
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 if (cachedData) {
query.callback({results: cachedData.results});
} else {
$.ajax({
url: pyroutes.url('pullrequest_repo_destinations', {'repo_name': templateContext.repo_name}),
data: {query: query.term},
dataType: 'json',
type: 'GET',
success: function(data) {
self.cachedDataSource[cacheKey] = data;
query.callback({results: data.results});
},
error: function(data, textStatus, errorThrown) {
alert(
"Error while fetching entries.\nError code {0} ({1}).".format(data.status, data.statusText));
}
});
}
};
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var queryTargetRefs = function(initialData, query) {
var data = {results: []};
// filter initialData
$.each(initialData, function() {
var section = this.text;
var children = [];
$.each(this.children, function() {
if (query.term.length === 0 ||
this.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0 ) {
children.push({'id': this.id, 'text': this.text})
}
});
data.results.push({'text': section, 'children': children})
});
query.callback({results: data.results});
};
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var loadRepoRefDiffPreview = function() {
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var url_data = {
'repo_name': targetRepo(),
'target_repo': sourceRepo(),
'source_ref': targetRef()[2],
'source_ref_type': 'rev',
'target_ref': sourceRef()[2],
'target_ref_type': 'rev',
'merge': true,
'_': Date.now() // bypass browser caching
}; // gather the source/target ref and repo here
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 if (sourceRef().length !== 3 || targetRef().length !== 3) {
prButtonLock(true, "${_('Please select source and target')}");
return;
}
var url = pyroutes.url('repo_compare', url_data);
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 // lock PR button, so we cannot send PR before it's calculated
prButtonLock(true, "${_('Loading compare ...')}", 'compare');
if (loadRepoRefDiffPreview._currentRequest) {
loadRepoRefDiffPreview._currentRequest.abort();
}
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 loadRepoRefDiffPreview._currentRequest = $.get(url)
.error(function(data, textStatus, errorThrown) {
if (textStatus !== 'abort') {
alert(
"Error while processing request.\nError code {0} ({1}).".format(
data.status, data.statusText));
}
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 })
.done(function(data) {
loadRepoRefDiffPreview._currentRequest = null;
$('#pull_request_overview').html(data);
var commitElements = $(data).find('tr[commit_id]');
pull-requests: don't report abort type of ajax requests as errors.
r2480
pull-requests: allow markup rendered description.
r2816 var prTitleAndDesc = getTitleAndDescription(
sourceRef()[1], commitElements, 5);
pull-request: extended default reviewers functionality....
r1769
pull-requests: allow markup rendered description.
r2816 var title = prTitleAndDesc[0];
var proposedDescription = prTitleAndDesc[1];
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var useGeneratedTitle = (
$('#pullrequest_title').hasClass('autogenerated-title') ||
$('#pullrequest_title').val() === "");
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 if (title && useGeneratedTitle) {
// use generated title if we haven't specified our own
$('#pullrequest_title').val(title);
$('#pullrequest_title').addClass('autogenerated-title');
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 }
var useGeneratedDescription = (
!codeMirrorInstance._userDefinedValue ||
codeMirrorInstance.getValue() === "");
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 if (proposedDescription && useGeneratedDescription) {
// set proposed content, if we haven't defined our own,
// or we don't have description written
codeMirrorInstance._userDefinedValue = false; // reset state
codeMirrorInstance.setValue(proposedDescription);
}
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 // refresh our codeMirror so events kicks in and it's change aware
codeMirrorInstance.refresh();
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var msg = '';
if (commitElements.length === 1) {
msg = "${_ungettext('This pull request will consist of __COMMITS__ commit.', 'This pull request will consist of __COMMITS__ commits.', 1)}";
} else {
msg = "${_ungettext('This pull request will consist of __COMMITS__ commit.', 'This pull request will consist of __COMMITS__ commits.', 2)}";
}
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 msg += ' <a id="pull_request_overview_url" href="{0}" target="_blank">${_('Show detailed compare.')}</a>'.format(url);
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 if (commitElements.length) {
var commitsLink = '<a href="#pull_request_overview"><strong>{0}</strong></a>'.format(commitElements.length);
prButtonLock(false, msg.replace('__COMMITS__', commitsLink), 'compare');
}
else {
prButtonLock(true, "${_('There are no commits to merge.')}", 'compare');
}
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 });
};
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var Select2Box = function(element, overrides) {
var globalDefaults = {
dropdownAutoWidth: true,
containerCssClass: "drop-menu",
dropdownCssClass: "drop-menu-dropdown"
};
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var initSelect2 = function(defaultOptions) {
var options = jQuery.extend(globalDefaults, defaultOptions, overrides);
element.select2(options);
};
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 return {
initRef: function() {
var defaultOptions = {
minimumResultsForSearch: 5,
formatSelection: formatRefSelection
};
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 initSelect2(defaultOptions);
},
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 initRepo: function(defaultValue, readOnly) {
var defaultOptions = {
initSelection : function (element, callback) {
var data = {id: defaultValue, text: defaultValue};
callback(data);
}
};
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 initSelect2(defaultOptions);
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 element.select2('val', defaultSourceRepo);
if (readOnly === true) {
element.select2('readonly', true);
}
}
};
};
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var initTargetRefs = function(refsData, selectedRef) {
pull-requests: fixed cases with default expected refs are closed or unavailable....
r2555
pull-requests: allow markup rendered description.
r2816 Select2Box($targetRef, {
placeholder: "${_('Select commit reference')}",
query: function(query) {
queryTargetRefs(refsData, query);
},
initSelection : initRefSelection(selectedRef)
}).initRef();
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 if (!(selectedRef === undefined)) {
$targetRef.select2('val', selectedRef);
}
};
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var targetRepoChanged = function(repoData) {
// generate new DESC of target repo displayed next to select
var prLink = pyroutes.url('pullrequest_new', {'repo_name': repoData['name']});
$('#target_repo_desc').html(
"<strong>${_('Target repository')}</strong>: {0}. <a href=\"{1}\">Switch base, and use as source.</a>".format(repoData['description'], prLink)
);
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 // generate dynamic select2 for refs.
initTargetRefs(repoData['refs']['select2_refs'],
repoData['refs']['selected_ref']);
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 };
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var sourceRefSelect2 = Select2Box($sourceRef, {
placeholder: "${_('Select commit reference')}",
query: function(query) {
var initialData = defaultSourceRepoData['refs']['select2_refs'];
queryTargetRefs(initialData, query)
},
initSelection: initRefSelection()
}
);
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var sourceRepoSelect2 = Select2Box($sourceRepo, {
query: function(query) {}
});
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 var targetRepoSelect2 = Select2Box($targetRepo, {
cachedDataSource: {},
query: $.debounce(250, function(query) {
queryTargetRepo(this, query);
}),
formatResult: formatRepoResult
});
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 sourceRefSelect2.initRef();
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 sourceRepoSelect2.initRepo(defaultSourceRepo, true);
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 targetRepoSelect2.initRepo(defaultTargetRepo, false);
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 $sourceRef.on('change', function(e){
loadRepoRefDiffPreview();
reviewersController.loadDefaultReviewers(
sourceRepo(), sourceRef(), targetRepo(), targetRef());
});
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 $targetRef.on('change', function(e){
loadRepoRefDiffPreview();
reviewersController.loadDefaultReviewers(
sourceRepo(), sourceRef(), targetRepo(), targetRef());
});
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 $targetRepo.on('change', function(e){
var repoName = $(this).val();
calculateContainerWidth();
$targetRef.select2('destroy');
$('#target_ref_loading').show();
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 $.ajax({
url: pyroutes.url('pullrequest_repo_refs',
{'repo_name': templateContext.repo_name, 'target_repo_name':repoName}),
data: {},
dataType: 'json',
type: 'GET',
success: function(data) {
$('#target_ref_loading').hide();
targetRepoChanged(data);
loadRepoRefDiffPreview();
},
error: function(data, textStatus, errorThrown) {
alert("Error while fetching entries.\nError code {0} ({1}).".format(data.status, data.statusText));
}
})
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 });
pull-requests: lock submit on pull request to prevent double submission on fast click.
r2806
pull-requests: allow markup rendered description.
r2816 $pullRequestForm.on('submit', function(e){
// Flush changes into textarea
codeMirrorInstance.save();
prButtonLock(true, null, 'all');
});
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 prButtonLock(true, "${_('Please select source and target')}", 'all');
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 // auto-load on init, the target refs select2
calculateContainerWidth();
targetRepoChanged(defaultTargetRepoData);
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 $('#pullrequest_title').on('keyup', function(e){
$(this).removeClass('autogenerated-title');
});
templating: use .mako as extensions for template files.
r1282
pull-requests: allow markup rendered description.
r2816 % if c.default_source_ref:
// in case we have a pre-selected value, use it now
$sourceRef.select2('val', '${c.default_source_ref}');
// diff preview load
loadRepoRefDiffPreview();
// default reviewers
reviewersController.loadDefaultReviewers(
sourceRepo(), sourceRef(), targetRepo(), targetRef());
% endif
ReviewerAutoComplete('#user');
});
templating: use .mako as extensions for template files.
r1282 </script>
</%def>