Auto status change to "Under Review"
Pull request !2362
Created on
Thu, 01 Jul 2021 12:06:29,
# import all the libraries
import numpy as np
import re
import nltk
from sklearn.datasets import load_files
nltk.download('stopwords')
import pickle
import pandas as pd
from sklearn.multioutput import MultiOutputClassifier
from sklearn.preprocessing import LabelEncoder
from nltk.corpus import stopwords
from collections import defaultdict
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import make_pipeline
import joblib
pd.options.display.float_format = "{:,.2f}".format
df = pd.read_csv(r'/Users/tabetibrahim/Desktop/Vona/vef/facture_mobile_mars_avril_2021.csv', sep=";")
data_set = df[['Tem section 1', 'Tem section 2','Tem section 3','Description facture operateur']]
data_set.head()
tem_section= data_set[['Tem section 1', 'Tem section 2','Tem section 3']]
tem_en= data_set[['Tem section 1', 'Tem section 2','Tem section 3']]
labelencoder = LabelEncoder()
le = LabelEncoder()
encoder_dict = defaultdict(LabelEncoder)
df_encode = tem_en.apply(lambda x: encoder_dict[x.name].fit_transform(x))
inverse_transform_lambda = df_encode.apply(lambda x: encoder_dict[x.name].inverse_transform(x))
X, y = data_set[['Description facture operateur']], tem_section
import nltk
import pandas as pd
import numpy as np
from nltk.stem import PorterStemmer
from nltk.corpus import stopwords
# If not previously performed:
# nltk.download('stopwords')
stemming = PorterStemmer()
stops = set(stopwords.words("french"))
def apply_cleaning_function_to_list(X):
cleaned_X = []
for element in X:
cleaned_X.append(clean_text(element))
return cleaned_X
def clean_text(raw_text):
"""This function works on a raw text string, and:
1) changes to lower case
2) tokenizes (breaks down into words
3) removes punctuation and non-word text
4) finds word stems
5) removes stop words
6) rejoins meaningful stem words"""
# Convert to lower case
text = raw_text.lower()
# Tokenize
tokens = nltk.word_tokenize(text)
# Keep only words (removes punctuation + numbers)
# use .isalnum to keep also numbers
token_words = [w for w in tokens if w.isalpha()]
# Stemming
stemmed_words = [stemming.stem(w) for w in token_words]
# Remove stop words
meaningful_words = [w for w in stemmed_words if not w in stops]
# Rejoin meaningful stemmed words
joined_words = ( " ".join(meaningful_words))
# Return cleaned data
return joined_words
# Get text to clean
text_to_clean = list(data_set['Description facture operateur'])
# Clean text
cleaned_text = apply_cleaning_function_to_list(text_to_clean)
# Add cleaned data back into DataFrame
data_set['cleaned_review'] = cleaned_text
# Remove temporary cleaned_text list (after transfer to DataFrame)
del cleaned_text
from sklearn.model_selection import train_test_split
X = list(data_set['cleaned_review'])
y = df_encode
X_train, X_test, y_train, y_test = train_test_split(
X,y, test_size = 0.25)
def create_bag_of_words(X):
from sklearn.feature_extraction.text import CountVectorizer
print ('Creating bag of words...')
# Initialize the "CountVectorizer" object, which is scikit-learn's
# bag of words tool.
# In this example features may be single words or two consecutive words
# (as shown by ngram_range = 1,2)
vectorizer = CountVectorizer(analyzer = "word", \
tokenizer = None, \
preprocessor = None, \
stop_words = None, \
ngram_range = (1,2), \
max_features = 10000
)
# fit_transform() does two functions: First, it fits the model
# and learns the vocabulary; second, it transforms our training data
# into feature vectors. The input to fit_transform should be a list of
# strings. The output is a sparse array
train_data_features = vectorizer.fit_transform(X)
# Convert to a NumPy array for easy of handling
train_data_features = train_data_features.toarray()
# tfidf transform
from sklearn.feature_extraction.text import TfidfTransformer
tfidf = TfidfTransformer()
tfidf_features = tfidf.fit_transform(train_data_features).toarray()
# Get words in the vocabulary
vocab = vectorizer.get_feature_names()
return vectorizer, vocab, train_data_features, tfidf_features, tfidf
vectorizer, vocab, train_data_features, tfidf_features, tfidf = \
create_bag_of_words(X_train)
def train_logistic_regression(features, label):
print ("Training the logistic regression model...")
from sklearn.linear_model import LogisticRegression
ml_model = MultiOutputClassifier(LogisticRegression(C = 0.1, solver = 'newton-cg', penalty = 'l2',multi_class = 'multinomial'))
ml_model.fit(features, label)
print ('Finished')
return ml_model
ml_model = train_logistic_regression(tfidf_features, y_train)
test_data_features = vectorizer.transform(X_test)
# Convert to numpy array
test_data_features = test_data_features.toarray()
test_data_tfidf_features = tfidf.fit_transform(test_data_features)
# Convert to numpy array
test_data_tfidf_features = test_data_tfidf_features.toarray()
predicted_y = ml_model.predict(test_data_tfidf_features)
correctly_identified_y = predicted_y == y_test
accuracy = np.mean(correctly_identified_y) * 100
1 version available for this pull request,
show versions.
There are new changes for `branch:stable` in source repository, please consider updating this pull request.
ver | Time | Author | Commit | Description | ||
---|---|---|---|---|---|---|
24 commits hidden, click expand to show them. |
@@ -5,17 +5,22 b' done = false' | |||
|
5 | 5 | done = true |
|
6 | 6 | |
|
7 | 7 | [task:rc_tools_pinned] |
|
8 | done = true | |
|
8 | 9 | |
|
9 | 10 | [task:fixes_on_stable] |
|
11 | done = true | |
|
10 | 12 | |
|
11 | 13 | [task:pip2nix_generated] |
|
14 | done = true | |
|
12 | 15 | |
|
13 | 16 | [task:changelog_updated] |
|
17 | done = true | |
|
14 | 18 | |
|
15 | 19 | [task:generate_api_docs] |
|
20 | done = true | |
|
16 | 21 | |
|
17 | 22 | [release] |
|
18 |
state = |
|
|
23 | state = prepared | |
|
19 | 24 | version = 4.25.2 |
|
20 | 25 | |
|
21 | 26 | [task:updated_translation] |
@@ -1,5 +1,5 b'' | |||
|
1 | 1 | [bumpversion] |
|
2 |
current_version = 4.25. |
|
|
2 | current_version = 4.25.2 | |
|
3 | 3 | message = release: Bump version {current_version} to {new_version} |
|
4 | 4 | |
|
5 | 5 | [bumpversion:file:rhodecode/VERSION] |
@@ -5,23 +5,18 b' done = false' | |||
|
5 | 5 | done = true |
|
6 | 6 | |
|
7 | 7 | [task:rc_tools_pinned] |
|
8 | done = true | |
|
9 | 8 | |
|
10 | 9 | [task:fixes_on_stable] |
|
11 | done = true | |
|
12 | 10 | |
|
13 | 11 | [task:pip2nix_generated] |
|
14 | done = true | |
|
15 | 12 | |
|
16 | 13 | [task:changelog_updated] |
|
17 | done = true | |
|
18 | 14 | |
|
19 | 15 | [task:generate_api_docs] |
|
20 | done = true | |
|
21 | 16 | |
|
22 | 17 | [release] |
|
23 |
state = |
|
|
24 |
version = 4.25. |
|
|
18 | state = in_progress | |
|
19 | version = 4.25.2 | |
|
25 | 20 | |
|
26 | 21 | [task:updated_translation] |
|
27 | 22 |
@@ -0,0 +1,53 b'' | |||
|
1 | |RCE| 4.25.2 |RNS| | |
|
2 | ------------------ | |
|
3 | ||
|
4 | Release Date | |
|
5 | ^^^^^^^^^^^^ | |
|
6 | ||
|
7 | - 2021-04-14 | |
|
8 | ||
|
9 | ||
|
10 | New Features | |
|
11 | ^^^^^^^^^^^^ | |
|
12 | ||
|
13 | ||
|
14 | ||
|
15 | General | |
|
16 | ^^^^^^^ | |
|
17 | ||
|
18 | - Comments: refresh on draft sidebar on draft submit. | |
|
19 | - Vcsserver: log exceptions into the logs | |
|
20 | - Archiving: make it explicit archiving a repo is irreversible. | |
|
21 | - My-account: updated bookmarks UX | |
|
22 | - Pull requests: added awaiting my review filter for users pull-requests. | |
|
23 | Additionally the awaiting my review now properly filters pull requests that have no review votes on them. | |
|
24 | ||
|
25 | ||
|
26 | Security | |
|
27 | ^^^^^^^^ | |
|
28 | ||
|
29 | ||
|
30 | ||
|
31 | Performance | |
|
32 | ^^^^^^^^^^^ | |
|
33 | ||
|
34 | ||
|
35 | ||
|
36 | Fixes | |
|
37 | ^^^^^ | |
|
38 | ||
|
39 | - Draft comments: fixed logic in toggle all draft for submit. | |
|
40 | - Draft comments: when submitting edited drafts also clear the history to prevent DB problems. | |
|
41 | - Mercurial: fixed a case of lookup branches that had 40 characters in length. | |
|
42 | - Gists: block id input for public gists. | |
|
43 | - Pull requests: fixed problems with unicode characters in branches. | |
|
44 | - Pull requests: small ui fix for grid. | |
|
45 | - Summary: fixed ui on summary page for non-admins. | |
|
46 | The setup instructions were broken if user had no write permissions. | |
|
47 | - Users: make user data loading more resilient to errors. | |
|
48 | ||
|
49 | ||
|
50 | Upgrade notes | |
|
51 | ^^^^^^^^^^^^^ | |
|
52 | ||
|
53 | - Scheduled release addressing problems in 4.25.X releases. |
@@ -27,13 +27,13 b'' | |||
|
27 | 27 | |
|
28 | 28 | <ul class="button-links"> |
|
29 | 29 | % if c.is_super_admin: |
|
30 |
<li class="btn ${h.is_active('all', c.active)}" |
|
|
30 | <li><a class="btn ${h.is_active('all', c.active)}" href="${h.route_path('gists_show', _query={'all': 1})}">${_('All gists')}</a></li> | |
|
31 | 31 | %endif |
|
32 |
<li class="btn ${h.is_active('public', c.active)}" |
|
|
32 | <li><a class="btn ${h.is_active('public', c.active)}" href="${h.route_path('gists_show')}">${_('All public')}</a></li> | |
|
33 | 33 | %if c.rhodecode_user.username != h.DEFAULT_USER: |
|
34 |
<li class="btn ${h.is_active('my_all', c.active)}" |
|
|
35 |
<li class="btn ${h.is_active('my_private', c.active)}" |
|
|
36 |
<li class="btn ${h.is_active('my_public', c.active)}" |
|
|
34 | <li><a class="btn ${h.is_active('my_all', c.active)}" href="${h.route_path('gists_show', _query={'public':1, 'private': 1})}">${_('My gists')}</a></li> | |
|
35 | <li><a class="btn ${h.is_active('my_private', c.active)}" href="${h.route_path('gists_show', _query={'private': 1})}">${_('My private')}</a></li> | |
|
36 | <li><a class="btn ${h.is_active('my_public', c.active)}" href="${h.route_path('gists_show', _query={'public': 1})}">${_('My public')}</a></li> | |
|
37 | 37 | %endif |
|
38 | 38 | </ul> |
|
39 | 39 |
@@ -65,11 +65,11 b'' | |||
|
65 | 65 | <fieldset> |
|
66 | 66 | <div class="gist-type-fields-wrapper"> |
|
67 | 67 | |
|
68 | <input type="radio" id="private_gist" checked="" name="gist_type" value="private"> | |
|
68 | <input type="radio" id="private_gist" checked="" name="gist_type" value="private" onchange="setGistId('private')"> | |
|
69 | 69 | <label for="private_gist">${_('Private Gist')}</label> |
|
70 | 70 | <span class="tooltip label" title="${_('Private Gists are not listed and only accessible through their secret url.')}">${_('Private Gist')}</span> |
|
71 | 71 | |
|
72 | <input type="radio" id="public_gist" name="gist_type" value="public"> | |
|
72 | <input type="radio" id="public_gist" name="gist_type" value="public" onchange="setGistId('public')"> | |
|
73 | 73 | <label for="public_gist">${_('Public Gist')}</label> |
|
74 | 74 | <span class="tooltip label" title="${_('Public Gists are accessible to anyone and listed in Gists page.')}">${_('Public Gist')}</span> |
|
75 | 75 | </div> |
@@ -99,5 +99,14 b'' | |||
|
99 | 99 | setCodeMirrorModeFromInput( |
|
100 | 100 | modes_select, filename_selector, myCodeMirror, null); |
|
101 | 101 | |
|
102 | setGistId = function(gistType) { | |
|
103 | if (gistType === 'private') { | |
|
104 | $('#gistid').removeAttr('disabled'); | |
|
105 | } | |
|
106 | else { | |
|
107 | $('#gistid').val(''); | |
|
108 | $('#gistid').attr('disabled', 'disabled') | |
|
109 | } | |
|
110 | } | |
|
102 | 111 | </script> |
|
103 | 112 | </%def> |
@@ -76,7 +76,11 b' class TestMyAccountEdit(TestController):' | |||
|
76 | 76 | 'requests requiring your participation.') |
|
77 | 77 | |
|
78 | 78 | @pytest.mark.backends("git", "hg") |
|
79 | def test_my_account_my_pullrequests_data(self, pr_util, xhr_header): | |
|
79 | @pytest.mark.parametrize('params, expected_title', [ | |
|
80 | ({'closed': 1}, 'Closed'), | |
|
81 | ({'awaiting_my_review': 1}, 'Awaiting my review'), | |
|
82 | ]) | |
|
83 | def test_my_account_my_pullrequests_data(self, pr_util, xhr_header, params, expected_title): | |
|
80 | 84 | self.log_user() |
|
81 | 85 | response = self.app.get(route_path('my_account_pullrequests_data'), |
|
82 | 86 | extra_environ=xhr_header) |
@@ -43,7 +43,7 b' from rhodecode.model.comment import Comm' | |||
|
43 | 43 | from rhodecode.model.db import ( |
|
44 | 44 | IntegrityError, or_, in_filter_generator, |
|
45 | 45 | Repository, UserEmailMap, UserApiKeys, UserFollowing, |
|
46 | PullRequest, UserBookmark, RepoGroup) | |
|
46 | PullRequest, UserBookmark, RepoGroup, ChangesetStatus) | |
|
47 | 47 | from rhodecode.model.meta import Session |
|
48 | 48 | from rhodecode.model.pull_request import PullRequestModel |
|
49 | 49 | from rhodecode.model.user import UserModel |
@@ -654,21 +654,31 b' class MyAccountView(BaseAppView, DataGri' | |||
|
654 | 654 | Session().commit() |
|
655 | 655 | return user.user_data['notification_status'] |
|
656 | 656 | |
|
657 | def _get_pull_requests_list(self, statuses): | |
|
657 | def _get_pull_requests_list(self, statuses, filter_type=None): | |
|
658 | 658 | draw, start, limit = self._extract_chunk(self.request) |
|
659 | 659 | search_q, order_by, order_dir = self._extract_ordering(self.request) |
|
660 | 660 | |
|
661 | 661 | _render = self.request.get_partial_renderer( |
|
662 | 662 | 'rhodecode:templates/data_table/_dt_elements.mako') |
|
663 | 663 | |
|
664 | pull_requests = PullRequestModel().get_im_participating_in( | |
|
665 | user_id=self._rhodecode_user.user_id, | |
|
666 | statuses=statuses, query=search_q, | |
|
667 | offset=start, length=limit, order_by=order_by, | |
|
668 | order_dir=order_dir) | |
|
664 | if filter_type == 'awaiting_my_review': | |
|
665 | pull_requests = PullRequestModel().get_im_participating_in_for_review( | |
|
666 | user_id=self._rhodecode_user.user_id, | |
|
667 | statuses=statuses, query=search_q, | |
|
668 | offset=start, length=limit, order_by=order_by, | |
|
669 | order_dir=order_dir) | |
|
669 | 670 | |
|
670 | pull_requests_total_count = PullRequestModel().count_im_participating_in( | |
|
671 | user_id=self._rhodecode_user.user_id, statuses=statuses, query=search_q) | |
|
671 | pull_requests_total_count = PullRequestModel().count_im_participating_in_for_review( | |
|
672 | user_id=self._rhodecode_user.user_id, statuses=statuses, query=search_q) | |
|
673 | else: | |
|
674 | pull_requests = PullRequestModel().get_im_participating_in( | |
|
675 | user_id=self._rhodecode_user.user_id, | |
|
676 | statuses=statuses, query=search_q, | |
|
677 | offset=start, length=limit, order_by=order_by, | |
|
678 | order_dir=order_dir) | |
|
679 | ||
|
680 | pull_requests_total_count = PullRequestModel().count_im_participating_in( | |
|
681 | user_id=self._rhodecode_user.user_id, statuses=statuses, query=search_q) | |
|
672 | 682 | |
|
673 | 683 | data = [] |
|
674 | 684 | comments_model = CommentsModel() |
@@ -678,6 +688,12 b' class MyAccountView(BaseAppView, DataGri' | |||
|
678 | 688 | repo_id, pull_request=pr, include_drafts=False, count_only=True) |
|
679 | 689 | owned = pr.user_id == self._rhodecode_user.user_id |
|
680 | 690 | |
|
691 | review_statuses = pr.reviewers_statuses(user=self._rhodecode_db_user) | |
|
692 | my_review_status = ChangesetStatus.STATUS_NOT_REVIEWED | |
|
693 | if review_statuses and review_statuses[4]: | |
|
694 | _review_obj, _user, _reasons, _mandatory, statuses = review_statuses | |
|
695 | my_review_status = statuses[0][1].status | |
|
696 | ||
|
681 | 697 | data.append({ |
|
682 | 698 | 'target_repo': _render('pullrequest_target_repo', |
|
683 | 699 | pr.target_repo.repo_name), |
@@ -688,6 +704,8 b' class MyAccountView(BaseAppView, DataGri' | |||
|
688 | 704 | 'name_raw': pr.pull_request_id, |
|
689 | 705 | 'status': _render('pullrequest_status', |
|
690 | 706 | pr.calculated_review_status()), |
|
707 | 'my_status': _render('pullrequest_status', | |
|
708 | my_review_status), | |
|
691 | 709 | 'title': _render('pullrequest_title', pr.title, pr.description), |
|
692 | 710 | 'description': h.escape(pr.description), |
|
693 | 711 | 'updated_on': _render('pullrequest_updated_on', |
@@ -723,7 +741,14 b' class MyAccountView(BaseAppView, DataGri' | |||
|
723 | 741 | c.active = 'pullrequests' |
|
724 | 742 | req_get = self.request.GET |
|
725 | 743 | |
|
726 |
c.closed = str2bool(req_get.get(' |
|
|
744 | c.closed = str2bool(req_get.get('closed')) | |
|
745 | c.awaiting_my_review = str2bool(req_get.get('awaiting_my_review')) | |
|
746 | ||
|
747 | c.selected_filter = 'all' | |
|
748 | if c.closed: | |
|
749 | c.selected_filter = 'all_closed' | |
|
750 | if c.awaiting_my_review: | |
|
751 | c.selected_filter = 'awaiting_my_review' | |
|
727 | 752 | |
|
728 | 753 | return self._get_template_context(c) |
|
729 | 754 | |
@@ -732,13 +757,19 b' class MyAccountView(BaseAppView, DataGri' | |||
|
732 | 757 | def my_account_pullrequests_data(self): |
|
733 | 758 | self.load_default_context() |
|
734 | 759 | req_get = self.request.GET |
|
760 | ||
|
761 | awaiting_my_review = str2bool(req_get.get('awaiting_my_review')) | |
|
735 | 762 | closed = str2bool(req_get.get('closed')) |
|
736 | 763 | |
|
737 | 764 | statuses = [PullRequest.STATUS_NEW, PullRequest.STATUS_OPEN] |
|
738 | 765 | if closed: |
|
739 | 766 | statuses += [PullRequest.STATUS_CLOSED] |
|
740 | 767 | |
|
741 | data = self._get_pull_requests_list(statuses=statuses) | |
|
768 | filter_type = \ | |
|
769 | 'awaiting_my_review' if awaiting_my_review \ | |
|
770 | else None | |
|
771 | ||
|
772 | data = self._get_pull_requests_list(statuses=statuses, filter_type=filter_type) | |
|
742 | 773 | return data |
|
743 | 774 | |
|
744 | 775 | @LoginRequired() |
@@ -41,7 +41,7 b' class TestPullRequestList(object):' | |||
|
41 | 41 | |
|
42 | 42 | @pytest.mark.parametrize('params, expected_title', [ |
|
43 | 43 | ({'source': 0, 'closed': 1}, 'Closed'), |
|
44 |
({'source': 0, 'my': 1}, ' |
|
|
44 | ({'source': 0, 'my': 1}, 'Created by me'), | |
|
45 | 45 | ({'source': 0, 'awaiting_review': 1}, 'Awaiting review'), |
|
46 | 46 | ({'source': 0, 'awaiting_my_review': 1}, 'Awaiting my review'), |
|
47 | 47 | ({'source': 1}, 'From this repo'), |
@@ -79,21 +79,20 b' class RepoPullRequestsView(RepoAppView, ' | |||
|
79 | 79 | |
|
80 | 80 | if filter_type == 'awaiting_review': |
|
81 | 81 | pull_requests = PullRequestModel().get_awaiting_review( |
|
82 | repo_name, search_q=search_q, source=source, opened_by=opened_by, | |
|
83 | statuses=statuses, offset=start, length=limit, | |
|
84 | order_by=order_by, order_dir=order_dir) | |
|
82 | repo_name, | |
|
83 | search_q=search_q, statuses=statuses, | |
|
84 | offset=start, length=limit, order_by=order_by, order_dir=order_dir) | |
|
85 | 85 | pull_requests_total_count = PullRequestModel().count_awaiting_review( |
|
86 | repo_name, search_q=search_q, source=source, statuses=statuses, | |
|
87 | opened_by=opened_by) | |
|
86 | repo_name, | |
|
87 | search_q=search_q, statuses=statuses) | |
|
88 | 88 | elif filter_type == 'awaiting_my_review': |
|
89 | 89 | pull_requests = PullRequestModel().get_awaiting_my_review( |
|
90 | repo_name, search_q=search_q, source=source, opened_by=opened_by, | |
|
91 |
|
|
|
92 | offset=start, length=limit, order_by=order_by, | |
|
93 | order_dir=order_dir) | |
|
90 | repo_name, self._rhodecode_user.user_id, | |
|
91 | search_q=search_q, statuses=statuses, | |
|
92 | offset=start, length=limit, order_by=order_by, order_dir=order_dir) | |
|
94 | 93 | pull_requests_total_count = PullRequestModel().count_awaiting_my_review( |
|
95 |
repo_name, |
|
|
96 |
statuses=statuses |
|
|
94 | repo_name, self._rhodecode_user.user_id, | |
|
95 | search_q=search_q, statuses=statuses) | |
|
97 | 96 | else: |
|
98 | 97 | pull_requests = PullRequestModel().get_all( |
|
99 | 98 | repo_name, search_q=search_q, source=source, opened_by=opened_by, |
@@ -110,6 +109,12 b' class RepoPullRequestsView(RepoAppView, ' | |||
|
110 | 109 | self.db_repo.repo_id, pull_request=pr, |
|
111 | 110 | include_drafts=False, count_only=True) |
|
112 | 111 | |
|
112 | review_statuses = pr.reviewers_statuses(user=self._rhodecode_db_user) | |
|
113 | my_review_status = ChangesetStatus.STATUS_NOT_REVIEWED | |
|
114 | if review_statuses and review_statuses[4]: | |
|
115 | _review_obj, _user, _reasons, _mandatory, statuses = review_statuses | |
|
116 | my_review_status = statuses[0][1].status | |
|
117 | ||
|
113 | 118 | data.append({ |
|
114 | 119 | 'name': _render('pullrequest_name', |
|
115 | 120 | pr.pull_request_id, pr.pull_request_state, |
@@ -118,6 +123,8 b' class RepoPullRequestsView(RepoAppView, ' | |||
|
118 | 123 | 'name_raw': pr.pull_request_id, |
|
119 | 124 | 'status': _render('pullrequest_status', |
|
120 | 125 | pr.calculated_review_status()), |
|
126 | 'my_status': _render('pullrequest_status', | |
|
127 | my_review_status), | |
|
121 | 128 | 'title': _render('pullrequest_title', pr.title, pr.description), |
|
122 | 129 | 'description': h.escape(pr.description), |
|
123 | 130 | 'updated_on': _render('pullrequest_updated_on', |
@@ -354,7 +354,7 b' class ChangesetStatusModel(BaseModel):' | |||
|
354 | 354 | Session().add(new_status) |
|
355 | 355 | return new_statuses |
|
356 | 356 | |
|
357 | def aggregate_votes_by_user(self, commit_statuses, reviewers_data): | |
|
357 | def aggregate_votes_by_user(self, commit_statuses, reviewers_data, user=None): | |
|
358 | 358 | |
|
359 | 359 | commit_statuses_map = collections.defaultdict(list) |
|
360 | 360 | for st in commit_statuses: |
@@ -368,6 +368,10 b' class ChangesetStatusModel(BaseModel):' | |||
|
368 | 368 | for obj in reviewers_data: |
|
369 | 369 | if not obj.user: |
|
370 | 370 | continue |
|
371 | if user and obj.user.username != user.username: | |
|
372 | # single user filter | |
|
373 | continue | |
|
374 | ||
|
371 | 375 | statuses = commit_statuses_map.get(obj.user.username, None) |
|
372 | 376 | if statuses: |
|
373 | 377 | status_groups = itertools.groupby( |
@@ -376,16 +380,19 b' class ChangesetStatusModel(BaseModel):' | |||
|
376 | 380 | |
|
377 | 381 | reviewers.append((obj, obj.user, obj.reasons, obj.mandatory, statuses)) |
|
378 | 382 | |
|
379 | return reviewers | |
|
383 | if user: | |
|
384 | return reviewers[0] if reviewers else reviewers | |
|
385 | else: | |
|
386 | return reviewers | |
|
380 | 387 | |
|
381 | def reviewers_statuses(self, pull_request): | |
|
388 | def reviewers_statuses(self, pull_request, user=None): | |
|
382 | 389 | _commit_statuses = self.get_statuses( |
|
383 | 390 | pull_request.source_repo, |
|
384 | 391 | pull_request=pull_request, |
|
385 | 392 | with_revisions=True) |
|
386 | 393 | reviewers = pull_request.get_pull_request_reviewers( |
|
387 | 394 | role=PullRequestReviewers.ROLE_REVIEWER) |
|
388 | return self.aggregate_votes_by_user(_commit_statuses, reviewers) | |
|
395 | return self.aggregate_votes_by_user(_commit_statuses, reviewers, user=user) | |
|
389 | 396 | |
|
390 | 397 | def calculated_review_status(self, pull_request): |
|
391 | 398 | """ |
@@ -41,10 +41,10 b' from sqlalchemy import (' | |||
|
41 | 41 | Index, Sequence, UniqueConstraint, ForeignKey, CheckConstraint, Column, |
|
42 | 42 | Boolean, String, Unicode, UnicodeText, DateTime, Integer, LargeBinary, |
|
43 | 43 | Text, Float, PickleType, BigInteger) |
|
44 | from sqlalchemy.sql.expression import true, false, case | |
|
44 | from sqlalchemy.sql.expression import true, false, case, null | |
|
45 | 45 | from sqlalchemy.sql.functions import coalesce, count # pragma: no cover |
|
46 | 46 | from sqlalchemy.orm import ( |
|
47 | relationship, joinedload, class_mapper, validates, aliased) | |
|
47 | relationship, lazyload, joinedload, class_mapper, validates, aliased) | |
|
48 | 48 | from sqlalchemy.ext.declarative import declared_attr |
|
49 | 49 | from sqlalchemy.ext.hybrid import hybrid_property |
|
50 | 50 | from sqlalchemy.exc import IntegrityError # pragma: no cover |
@@ -4479,9 +4479,9 b' class PullRequest(Base, _PullRequestBase' | |||
|
4479 | 4479 | from rhodecode.model.changeset_status import ChangesetStatusModel |
|
4480 | 4480 | return ChangesetStatusModel().calculated_review_status(self) |
|
4481 | 4481 | |
|
4482 | def reviewers_statuses(self): | |
|
4482 | def reviewers_statuses(self, user=None): | |
|
4483 | 4483 | from rhodecode.model.changeset_status import ChangesetStatusModel |
|
4484 | return ChangesetStatusModel().reviewers_statuses(self) | |
|
4484 | return ChangesetStatusModel().reviewers_statuses(self, user=user) | |
|
4485 | 4485 | |
|
4486 | 4486 | def get_pull_request_reviewers(self, role=None): |
|
4487 | 4487 | qry = PullRequestReviewers.query()\ |
@@ -56,7 +56,7 b' from rhodecode.model import BaseModel' | |||
|
56 | 56 | from rhodecode.model.changeset_status import ChangesetStatusModel |
|
57 | 57 | from rhodecode.model.comment import CommentsModel |
|
58 | 58 | from rhodecode.model.db import ( |
|
59 | or_, String, cast, PullRequest, PullRequestReviewers, ChangesetStatus, | |
|
59 | aliased, null, lazyload, and_, or_, func, String, cast, PullRequest, PullRequestReviewers, ChangesetStatus, | |
|
60 | 60 | PullRequestVersion, ChangesetComment, Repository, RepoReviewRule, User) |
|
61 | 61 | from rhodecode.model.meta import Session |
|
62 | 62 | from rhodecode.model.notification import NotificationModel, \ |
@@ -319,7 +319,7 b' class PullRequestModel(BaseModel):' | |||
|
319 | 319 | |
|
320 | 320 | if search_q: |
|
321 | 321 | like_expression = u'%{}%'.format(safe_unicode(search_q)) |
|
322 | q = q.join(User) | |
|
322 | q = q.join(User, User.user_id == PullRequest.user_id) | |
|
323 | 323 | q = q.filter(or_( |
|
324 | 324 | cast(PullRequest.pull_request_id, String).ilike(like_expression), |
|
325 | 325 | User.username.ilike(like_expression), |
@@ -405,36 +405,30 b' class PullRequestModel(BaseModel):' | |||
|
405 | 405 | |
|
406 | 406 | return pull_requests |
|
407 | 407 | |
|
408 |
def count_awaiting_review(self, repo_name, search_q=None, |
|
|
409 | opened_by=None): | |
|
408 | def count_awaiting_review(self, repo_name, search_q=None, statuses=None): | |
|
410 | 409 | """ |
|
411 | 410 | Count the number of pull requests for a specific repository that are |
|
412 | 411 | awaiting review. |
|
413 | 412 | |
|
414 | 413 | :param repo_name: target or source repo |
|
415 | 414 | :param search_q: filter by text |
|
416 | :param source: boolean flag to specify if repo_name refers to source | |
|
417 | 415 | :param statuses: list of pull request statuses |
|
418 | :param opened_by: author user of the pull request | |
|
419 | 416 | :returns: int number of pull requests |
|
420 | 417 | """ |
|
421 | 418 | pull_requests = self.get_awaiting_review( |
|
422 |
repo_name, search_q=search_q, |
|
|
419 | repo_name, search_q=search_q, statuses=statuses) | |
|
423 | 420 | |
|
424 | 421 | return len(pull_requests) |
|
425 | 422 | |
|
426 |
def get_awaiting_review(self, repo_name, search_q=None, |
|
|
427 |
|
|
|
428 | order_by=None, order_dir='desc'): | |
|
423 | def get_awaiting_review(self, repo_name, search_q=None, statuses=None, | |
|
424 | offset=0, length=None, order_by=None, order_dir='desc'): | |
|
429 | 425 | """ |
|
430 | 426 | Get all pull requests for a specific repository that are awaiting |
|
431 | 427 | review. |
|
432 | 428 | |
|
433 | 429 | :param repo_name: target or source repo |
|
434 | 430 | :param search_q: filter by text |
|
435 | :param source: boolean flag to specify if repo_name refers to source | |
|
436 | 431 | :param statuses: list of pull request statuses |
|
437 | :param opened_by: author user of the pull request | |
|
438 | 432 | :param offset: pagination offset |
|
439 | 433 | :param length: length of returned list |
|
440 | 434 | :param order_by: order of the returned list |
@@ -442,8 +436,8 b' class PullRequestModel(BaseModel):' | |||
|
442 | 436 | :returns: list of pull requests |
|
443 | 437 | """ |
|
444 | 438 | pull_requests = self.get_all( |
|
445 |
repo_name, search_q=search_q, |
|
|
446 |
|
|
|
439 | repo_name, search_q=search_q, statuses=statuses, | |
|
440 | order_by=order_by, order_dir=order_dir) | |
|
447 | 441 | |
|
448 | 442 | _filtered_pull_requests = [] |
|
449 | 443 | for pr in pull_requests: |
@@ -456,68 +450,117 b' class PullRequestModel(BaseModel):' | |||
|
456 | 450 | else: |
|
457 | 451 | return _filtered_pull_requests |
|
458 | 452 | |
|
459 | def count_awaiting_my_review(self, repo_name, search_q=None, source=False, statuses=None, | |
|
460 | opened_by=None, user_id=None): | |
|
453 | def _prepare_awaiting_my_review_review_query( | |
|
454 | self, repo_name, user_id, search_q=None, statuses=None, | |
|
455 | order_by=None, order_dir='desc'): | |
|
456 | ||
|
457 | for_review_statuses = [ | |
|
458 | ChangesetStatus.STATUS_UNDER_REVIEW, ChangesetStatus.STATUS_NOT_REVIEWED | |
|
459 | ] | |
|
460 | ||
|
461 | pull_request_alias = aliased(PullRequest) | |
|
462 | status_alias = aliased(ChangesetStatus) | |
|
463 | reviewers_alias = aliased(PullRequestReviewers) | |
|
464 | repo_alias = aliased(Repository) | |
|
465 | ||
|
466 | last_ver_subq = Session()\ | |
|
467 | .query(func.min(ChangesetStatus.version)) \ | |
|
468 | .filter(ChangesetStatus.pull_request_id == reviewers_alias.pull_request_id)\ | |
|
469 | .filter(ChangesetStatus.user_id == reviewers_alias.user_id) \ | |
|
470 | .subquery() | |
|
471 | ||
|
472 | q = Session().query(pull_request_alias) \ | |
|
473 | .options(lazyload(pull_request_alias.author)) \ | |
|
474 | .join(reviewers_alias, | |
|
475 | reviewers_alias.pull_request_id == pull_request_alias.pull_request_id) \ | |
|
476 | .join(repo_alias, | |
|
477 | repo_alias.repo_id == pull_request_alias.target_repo_id) \ | |
|
478 | .outerjoin(status_alias, | |
|
479 | and_(status_alias.user_id == reviewers_alias.user_id, | |
|
480 | status_alias.pull_request_id == reviewers_alias.pull_request_id)) \ | |
|
481 | .filter(or_(status_alias.version == null(), | |
|
482 | status_alias.version == last_ver_subq)) \ | |
|
483 | .filter(reviewers_alias.user_id == user_id) \ | |
|
484 | .filter(repo_alias.repo_name == repo_name) \ | |
|
485 | .filter(or_(status_alias.status == null(), status_alias.status.in_(for_review_statuses))) \ | |
|
486 | .group_by(pull_request_alias) | |
|
487 | ||
|
488 | # closed,opened | |
|
489 | if statuses: | |
|
490 | q = q.filter(pull_request_alias.status.in_(statuses)) | |
|
491 | ||
|
492 | if search_q: | |
|
493 | like_expression = u'%{}%'.format(safe_unicode(search_q)) | |
|
494 | q = q.join(User, User.user_id == pull_request_alias.user_id) | |
|
495 | q = q.filter(or_( | |
|
496 | cast(pull_request_alias.pull_request_id, String).ilike(like_expression), | |
|
497 | User.username.ilike(like_expression), | |
|
498 | pull_request_alias.title.ilike(like_expression), | |
|
499 | pull_request_alias.description.ilike(like_expression), | |
|
500 | )) | |
|
501 | ||
|
502 | if order_by: | |
|
503 | order_map = { | |
|
504 | 'name_raw': pull_request_alias.pull_request_id, | |
|
505 | 'title': pull_request_alias.title, | |
|
506 | 'updated_on_raw': pull_request_alias.updated_on, | |
|
507 | 'target_repo': pull_request_alias.target_repo_id | |
|
508 | } | |
|
509 | if order_dir == 'asc': | |
|
510 | q = q.order_by(order_map[order_by].asc()) | |
|
511 | else: | |
|
512 | q = q.order_by(order_map[order_by].desc()) | |
|
513 | ||
|
514 | return q | |
|
515 | ||
|
516 | def count_awaiting_my_review(self, repo_name, user_id, search_q=None, statuses=None): | |
|
461 | 517 | """ |
|
462 | 518 | Count the number of pull requests for a specific repository that are |
|
463 | 519 | awaiting review from a specific user. |
|
464 | 520 | |
|
465 | 521 | :param repo_name: target or source repo |
|
522 | :param user_id: reviewer user of the pull request | |
|
466 | 523 | :param search_q: filter by text |
|
467 | :param source: boolean flag to specify if repo_name refers to source | |
|
468 | 524 | :param statuses: list of pull request statuses |
|
469 | :param opened_by: author user of the pull request | |
|
470 | :param user_id: reviewer user of the pull request | |
|
471 | 525 | :returns: int number of pull requests |
|
472 | 526 | """ |
|
473 |
|
|
|
474 |
repo_name, search_q=search_q, |
|
|
475 | opened_by=opened_by, user_id=user_id) | |
|
527 | q = self._prepare_awaiting_my_review_review_query( | |
|
528 | repo_name, user_id, search_q=search_q, statuses=statuses) | |
|
529 | return q.count() | |
|
476 | 530 | |
|
477 | return len(pull_requests) | |
|
478 | ||
|
479 | def get_awaiting_my_review(self, repo_name, search_q=None, source=False, statuses=None, | |
|
480 | opened_by=None, user_id=None, offset=0, | |
|
481 | length=None, order_by=None, order_dir='desc'): | |
|
531 | def get_awaiting_my_review(self, repo_name, user_id, search_q=None, statuses=None, | |
|
532 | offset=0, length=None, order_by=None, order_dir='desc'): | |
|
482 | 533 | """ |
|
483 | 534 | Get all pull requests for a specific repository that are awaiting |
|
484 | 535 | review from a specific user. |
|
485 | 536 | |
|
486 | 537 | :param repo_name: target or source repo |
|
538 | :param user_id: reviewer user of the pull request | |
|
487 | 539 | :param search_q: filter by text |
|
488 | :param source: boolean flag to specify if repo_name refers to source | |
|
489 | 540 | :param statuses: list of pull request statuses |
|
490 | :param opened_by: author user of the pull request | |
|
491 | :param user_id: reviewer user of the pull request | |
|
492 | 541 | :param offset: pagination offset |
|
493 | 542 | :param length: length of returned list |
|
494 | 543 | :param order_by: order of the returned list |
|
495 | 544 | :param order_dir: 'asc' or 'desc' ordering direction |
|
496 | 545 | :returns: list of pull requests |
|
497 | 546 | """ |
|
498 | pull_requests = self.get_all( | |
|
499 | repo_name, search_q=search_q, source=source, statuses=statuses, | |
|
500 | opened_by=opened_by, order_by=order_by, order_dir=order_dir) | |
|
501 | 547 | |
|
502 | _my = PullRequestModel().get_not_reviewed(user_id) | |
|
503 | my_participation = [] | |
|
504 | for pr in pull_requests: | |
|
505 | if pr in _my: | |
|
506 | my_participation.append(pr) | |
|
507 | _filtered_pull_requests = my_participation | |
|
548 | q = self._prepare_awaiting_my_review_review_query( | |
|
549 | repo_name, user_id, search_q=search_q, statuses=statuses, | |
|
550 | order_by=order_by, order_dir=order_dir) | |
|
551 | ||
|
508 | 552 | if length: |
|
509 | return _filtered_pull_requests[offset:offset+length] | |
|
553 | pull_requests = q.limit(length).offset(offset).all() | |
|
510 | 554 | else: |
|
511 |
|
|
|
555 | pull_requests = q.all() | |
|
556 | ||
|
557 | return pull_requests | |
|
512 | 558 | |
|
513 | def get_not_reviewed(self, user_id): | |
|
514 | return [ | |
|
515 | x.pull_request for x in PullRequestReviewers.query().filter( | |
|
516 | PullRequestReviewers.user_id == user_id).all() | |
|
517 |
|
|
|
518 | ||
|
519 | def _prepare_participating_query(self, user_id=None, statuses=None, query='', | |
|
520 | order_by=None, order_dir='desc'): | |
|
559 | def _prepare_im_participating_query(self, user_id=None, statuses=None, query='', | |
|
560 | order_by=None, order_dir='desc'): | |
|
561 | """ | |
|
562 | return a query of pull-requests user is an creator, or he's added as a reviewer | |
|
563 | """ | |
|
521 | 564 | q = PullRequest.query() |
|
522 | 565 | if user_id: |
|
523 | 566 | reviewers_subquery = Session().query( |
@@ -535,7 +578,7 b' class PullRequestModel(BaseModel):' | |||
|
535 | 578 | |
|
536 | 579 | if query: |
|
537 | 580 | like_expression = u'%{}%'.format(safe_unicode(query)) |
|
538 | q = q.join(User) | |
|
581 | q = q.join(User, User.user_id == PullRequest.user_id) | |
|
539 | 582 | q = q.filter(or_( |
|
540 | 583 | cast(PullRequest.pull_request_id, String).ilike(like_expression), |
|
541 | 584 | User.username.ilike(like_expression), |
@@ -557,17 +600,97 b' class PullRequestModel(BaseModel):' | |||
|
557 | 600 | return q |
|
558 | 601 | |
|
559 | 602 | def count_im_participating_in(self, user_id=None, statuses=None, query=''): |
|
560 | q = self._prepare_participating_query(user_id, statuses=statuses, query=query) | |
|
603 | q = self._prepare_im_participating_query(user_id, statuses=statuses, query=query) | |
|
561 | 604 | return q.count() |
|
562 | 605 | |
|
563 | 606 | def get_im_participating_in( |
|
564 | 607 | self, user_id=None, statuses=None, query='', offset=0, |
|
565 | 608 | length=None, order_by=None, order_dir='desc'): |
|
566 | 609 | """ |
|
567 | Get all Pull requests that i'm participating in, or i have opened | |
|
610 | Get all Pull requests that i'm participating in as a reviewer, or i have opened | |
|
568 | 611 | """ |
|
569 | 612 | |
|
570 | q = self._prepare_participating_query( | |
|
613 | q = self._prepare_im_participating_query( | |
|
614 | user_id, statuses=statuses, query=query, order_by=order_by, | |
|
615 | order_dir=order_dir) | |
|
616 | ||
|
617 | if length: | |
|
618 | pull_requests = q.limit(length).offset(offset).all() | |
|
619 | else: | |
|
620 | pull_requests = q.all() | |
|
621 | ||
|
622 | return pull_requests | |
|
623 | ||
|
624 | def _prepare_participating_in_for_review_query( | |
|
625 | self, user_id, statuses=None, query='', order_by=None, order_dir='desc'): | |
|
626 | ||
|
627 | for_review_statuses = [ | |
|
628 | ChangesetStatus.STATUS_UNDER_REVIEW, ChangesetStatus.STATUS_NOT_REVIEWED | |
|
629 | ] | |
|
630 | ||
|
631 | pull_request_alias = aliased(PullRequest) | |
|
632 | status_alias = aliased(ChangesetStatus) | |
|
633 | reviewers_alias = aliased(PullRequestReviewers) | |
|
634 | ||
|
635 | last_ver_subq = Session()\ | |
|
636 | .query(func.min(ChangesetStatus.version)) \ | |
|
637 | .filter(ChangesetStatus.pull_request_id == reviewers_alias.pull_request_id)\ | |
|
638 | .filter(ChangesetStatus.user_id == reviewers_alias.user_id) \ | |
|
639 | .subquery() | |
|
640 | ||
|
641 | q = Session().query(pull_request_alias) \ | |
|
642 | .options(lazyload(pull_request_alias.author)) \ | |
|
643 | .join(reviewers_alias, | |
|
644 | reviewers_alias.pull_request_id == pull_request_alias.pull_request_id) \ | |
|
645 | .outerjoin(status_alias, | |
|
646 | and_(status_alias.user_id == reviewers_alias.user_id, | |
|
647 | status_alias.pull_request_id == reviewers_alias.pull_request_id)) \ | |
|
648 | .filter(or_(status_alias.version == null(), | |
|
649 | status_alias.version == last_ver_subq)) \ | |
|
650 | .filter(reviewers_alias.user_id == user_id) \ | |
|
651 | .filter(or_(status_alias.status == null(), status_alias.status.in_(for_review_statuses))) \ | |
|
652 | .group_by(pull_request_alias) | |
|
653 | ||
|
654 | # closed,opened | |
|
655 | if statuses: | |
|
656 | q = q.filter(pull_request_alias.status.in_(statuses)) | |
|
657 | ||
|
658 | if query: | |
|
659 | like_expression = u'%{}%'.format(safe_unicode(query)) | |
|
660 | q = q.join(User, User.user_id == pull_request_alias.user_id) | |
|
661 | q = q.filter(or_( | |
|
662 | cast(pull_request_alias.pull_request_id, String).ilike(like_expression), | |
|
663 | User.username.ilike(like_expression), | |
|
664 | pull_request_alias.title.ilike(like_expression), | |
|
665 | pull_request_alias.description.ilike(like_expression), | |
|
666 | )) | |
|
667 | ||
|
668 | if order_by: | |
|
669 | order_map = { | |
|
670 | 'name_raw': pull_request_alias.pull_request_id, | |
|
671 | 'title': pull_request_alias.title, | |
|
672 | 'updated_on_raw': pull_request_alias.updated_on, | |
|
673 | 'target_repo': pull_request_alias.target_repo_id | |
|
674 | } | |
|
675 | if order_dir == 'asc': | |
|
676 | q = q.order_by(order_map[order_by].asc()) | |
|
677 | else: | |
|
678 | q = q.order_by(order_map[order_by].desc()) | |
|
679 | ||
|
680 | return q | |
|
681 | ||
|
682 | def count_im_participating_in_for_review(self, user_id, statuses=None, query=''): | |
|
683 | q = self._prepare_participating_in_for_review_query(user_id, statuses=statuses, query=query) | |
|
684 | return q.count() | |
|
685 | ||
|
686 | def get_im_participating_in_for_review( | |
|
687 | self, user_id, statuses=None, query='', offset=0, | |
|
688 | length=None, order_by=None, order_dir='desc'): | |
|
689 | """ | |
|
690 | Get all Pull requests that needs user approval or rejection | |
|
691 | """ | |
|
692 | ||
|
693 | q = self._prepare_participating_in_for_review_query( | |
|
571 | 694 | user_id, statuses=statuses, query=query, order_by=order_by, |
|
572 | 695 | order_dir=order_dir) |
|
573 | 696 |
@@ -618,13 +618,13 b' input[type="reset"] {' | |||
|
618 | 618 | text-align: right; |
|
619 | 619 | |
|
620 | 620 | li { |
|
621 | ||
|
622 | ||
|
621 | list-style: none; | |
|
622 | text-align: right; | |
|
623 | display: inline-block; | |
|
623 | 624 | } |
|
624 | 625 | |
|
625 |
|
|
|
626 | background-color: @grey6; | |
|
627 | .border ( @border-thickness, @grey4 ); | |
|
626 | a.active { | |
|
627 | border: 2px solid @rcblue; | |
|
628 | 628 | } |
|
629 | 629 | |
|
630 | 630 | } |
@@ -44,7 +44,7 b'' | |||
|
44 | 44 | padding: @panel-padding; |
|
45 | 45 | |
|
46 | 46 | &.panel-body-min-height { |
|
47 |
min-height: |
|
|
47 | min-height: 200px | |
|
48 | 48 | } |
|
49 | 49 | } |
|
50 | 50 |
@@ -1,17 +1,29 b'' | |||
|
1 | 1 | <%namespace name="base" file="/base/base.mako"/> |
|
2 | 2 | |
|
3 | 3 | <div class="panel panel-default"> |
|
4 |
<div class="panel- |
|
|
5 | <div style="height: 35px"> | |
|
6 | <% | |
|
7 | selected_filter = 'all' | |
|
8 | if c.closed: | |
|
9 | selected_filter = 'all_closed' | |
|
10 | %> | |
|
4 | <div class="panel-heading"> | |
|
5 | <h3 class="panel-title">${_('Pull Requests You Participate In')}</h3> | |
|
6 | </div> | |
|
11 | 7 | |
|
8 | <div class="panel-body panel-body-min-height"> | |
|
9 | <div class="title"> | |
|
12 | 10 | <ul class="button-links"> |
|
13 |
<li class="btn ${h.is_active('all', selected_filter)}" |
|
|
14 | <li class="btn ${h.is_active('all_closed', selected_filter)}"><a href="${h.route_path('my_account_pullrequests', _query={'pr_show_closed':1})}">${_('All + Closed')}</a></li> | |
|
11 | <li><a class="btn ${h.is_active('all', c.selected_filter)}" | |
|
12 | href="${h.route_path('my_account_pullrequests', _query={})}"> | |
|
13 | ${_('Open')} | |
|
14 | </a> | |
|
15 | </li> | |
|
16 | <li><a class="btn ${h.is_active('all_closed', c.selected_filter)}" | |
|
17 | href="${h.route_path('my_account_pullrequests', _query={'closed':1})}"> | |
|
18 | ${_('All + Closed')} | |
|
19 | </a> | |
|
20 | </li> | |
|
21 | <li><a class="btn ${h.is_active('awaiting_my_review', c.selected_filter)}" | |
|
22 | href="${h.route_path('my_account_pullrequests', _query={'awaiting_my_review':1})}"> | |
|
23 | ||
|
24 | ${_('Awaiting my review')} | |
|
25 | </a> | |
|
26 | </li> | |
|
15 | 27 | </ul> |
|
16 | 28 | |
|
17 | 29 | <div class="grid-quick-filter"> |
@@ -20,19 +32,13 b'' | |||
|
20 | 32 | <i class="icon-search"></i> |
|
21 | 33 | </li> |
|
22 | 34 | <li class="grid-filter-box-input"> |
|
23 |
<input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" |
|
|
35 | <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" | |
|
36 | placeholder="${_('quick filter...')}" value=""/> | |
|
24 | 37 | </li> |
|
25 | 38 | </ul> |
|
26 | 39 | </div> |
|
27 | </div> | |
|
28 | </div> | |
|
29 | </div> | |
|
40 | </div> | |
|
30 | 41 | |
|
31 | <div class="panel panel-default"> | |
|
32 | <div class="panel-heading"> | |
|
33 | <h3 class="panel-title">${_('Pull Requests You Participate In')}</h3> | |
|
34 | </div> | |
|
35 | <div class="panel-body panel-body-min-height"> | |
|
36 | 42 | <table id="pull_request_list_table" class="rctable table-bordered"></table> |
|
37 | 43 | </div> |
|
38 | 44 | </div> |
@@ -52,6 +58,7 b'' | |||
|
52 | 58 | "url": "${h.route_path('my_account_pullrequests_data')}", |
|
53 | 59 | "data": function (d) { |
|
54 | 60 | d.closed = "${c.closed}"; |
|
61 | d.awaiting_my_review = "${c.awaiting_my_review}"; | |
|
55 | 62 | }, |
|
56 | 63 | "dataSrc": function (json) { |
|
57 | 64 | return json.data; |
@@ -60,13 +67,19 b'' | |||
|
60 | 67 | |
|
61 | 68 | dom: 'rtp', |
|
62 | 69 | pageLength: ${c.visual.dashboard_items}, |
|
63 |
order: [[ |
|
|
70 | order: [[2, "desc"]], | |
|
64 | 71 | columns: [ |
|
65 | 72 | { |
|
66 | 73 | data: { |
|
67 | 74 | "_": "status", |
|
68 | 75 | "sort": "status" |
|
69 | }, title: "", className: "td-status", orderable: false | |
|
76 | }, title: "PR", className: "td-status", orderable: false | |
|
77 | }, | |
|
78 | { | |
|
79 | data: { | |
|
80 | "_": "my_status", | |
|
81 | "sort": "status" | |
|
82 | }, title: "You", className: "td-status", orderable: false | |
|
70 | 83 | }, |
|
71 | 84 | { |
|
72 | 85 | data: { |
@@ -23,13 +23,14 b'' | |||
|
23 | 23 | |
|
24 | 24 | <div class="box"> |
|
25 | 25 | <div class="title"> |
|
26 | ||
|
26 | 27 | <ul class="button-links"> |
|
27 |
<li class="btn ${h.is_active('open', c.active)}" |
|
|
28 |
<li class="btn ${h.is_active('my', c.active)}" |
|
|
29 |
<li class="btn ${h.is_active('awaiting', c.active)}" |
|
|
30 |
<li class="btn ${h.is_active('awaiting_my', c.active)}" |
|
|
31 |
<li class="btn ${h.is_active('closed', c.active)}" |
|
|
32 |
<li class="btn ${h.is_active('source', c.active)}" |
|
|
28 | <li><a class="btn ${h.is_active('open', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'open':1})}">${_('Open')}</a></li> | |
|
29 | <li><a class="btn ${h.is_active('my', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'my':1})}">${_('Created by me')}</a></li> | |
|
30 | <li><a class="btn ${h.is_active('awaiting', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'awaiting_review':1})}">${_('Awaiting review')}</a></li> | |
|
31 | <li><a class="btn ${h.is_active('awaiting_my', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'awaiting_my_review':1})}">${_('Awaiting my review')}</a></li> | |
|
32 | <li><a class="btn ${h.is_active('closed', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'closed':1})}">${_('Closed')}</a></li> | |
|
33 | <li><a class="btn ${h.is_active('source', c.active)}" href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':1})}">${_('From this repo')}</a></li> | |
|
33 | 34 | </ul> |
|
34 | 35 | |
|
35 | 36 | <ul class="links"> |
@@ -88,20 +89,50 b'' | |||
|
88 | 89 | }, |
|
89 | 90 | dom: 'rtp', |
|
90 | 91 | pageLength: ${c.visual.dashboard_items}, |
|
91 |
order: [[ |
|
|
92 | order: [[ 2, "desc" ]], | |
|
92 | 93 | columns: [ |
|
93 | { data: {"_": "status", | |
|
94 | "sort": "status"}, title: "", className: "td-status", orderable: false}, | |
|
95 |
|
|
|
96 | "sort": "name_raw"}, title: "${_('Id')}", className: "td-componentname", "type": "num" }, | |
|
97 | { data: {"_": "title", | |
|
98 | "sort": "title"}, title: "${_('Title')}", className: "td-description" }, | |
|
99 | { data: {"_": "author", | |
|
100 | "sort": "author_raw"}, title: "${_('Author')}", className: "td-user", orderable: false }, | |
|
101 |
|
|
|
102 | "sort": "comments_raw"}, title: "", className: "td-comments", orderable: false}, | |
|
103 | { data: {"_": "updated_on", | |
|
104 | "sort": "updated_on_raw"}, title: "${_('Last Update')}", className: "td-time" } | |
|
94 | { | |
|
95 | data: { | |
|
96 | "_": "status", | |
|
97 | "sort": "status" | |
|
98 | }, title: "PR", className: "td-status", orderable: false | |
|
99 | }, | |
|
100 | { | |
|
101 | data: { | |
|
102 | "_": "my_status", | |
|
103 | "sort": "status" | |
|
104 | }, title: "You", className: "td-status", orderable: false | |
|
105 | }, | |
|
106 | { | |
|
107 | data: { | |
|
108 | "_": "name", | |
|
109 | "sort": "name_raw" | |
|
110 | }, title: "${_('Id')}", className: "td-componentname", "type": "num" | |
|
111 | }, | |
|
112 | { | |
|
113 | data: { | |
|
114 | "_": "title", | |
|
115 | "sort": "title" | |
|
116 | }, title: "${_('Title')}", className: "td-description" | |
|
117 | }, | |
|
118 | { | |
|
119 | data: { | |
|
120 | "_": "author", | |
|
121 | "sort": "author_raw" | |
|
122 | }, title: "${_('Author')}", className: "td-user", orderable: false | |
|
123 | }, | |
|
124 | { | |
|
125 | data: { | |
|
126 | "_": "comments", | |
|
127 | "sort": "comments_raw" | |
|
128 | }, title: "", className: "td-comments", orderable: false | |
|
129 | }, | |
|
130 | { | |
|
131 | data: { | |
|
132 | "_": "updated_on", | |
|
133 | "sort": "updated_on_raw" | |
|
134 | }, title: "${_('Last Update')}", className: "td-time" | |
|
135 | } | |
|
105 | 136 | ], |
|
106 | 137 | language: { |
|
107 | 138 | paginate: DEFAULT_GRID_PAGINATION, |
@@ -171,7 +171,7 b'' | |||
|
171 | 171 | This repository is already archived. Only super-admin users can un-archive this repository. |
|
172 | 172 | % else: |
|
173 | 173 | <button class="btn btn-small btn-warning" type="submit" |
|
174 | onclick="submitConfirm(event, this, _gettext('Confirm to archive this repository'), _gettext('Archive'), '${c.rhodecode_db_repo.repo_name}')" | |
|
174 | onclick="submitConfirm(event, this, _gettext('Confirm to archive this repository. <br/>This action is irreversible !'), _gettext('Archive'), '${c.rhodecode_db_repo.repo_name}')" | |
|
175 | 175 | > |
|
176 | 176 | ${_('Archive this repository')} |
|
177 | 177 | </button> |
@@ -180,6 +180,9 b'' | |||
|
180 | 180 | </div> |
|
181 | 181 | <div class="field"> |
|
182 | 182 | <span class="help-block"> |
|
183 | <strong> | |
|
184 | ${_('This action is irreversible')} ! | |
|
185 | </strong><br/> | |
|
183 | 186 | ${_('Archiving the repository will make it entirely read-only. The repository cannot be committed to.' |
|
184 | 187 | 'It is hidden from the search results and dashboard. ')} |
|
185 | 188 | </span> |
@@ -26,50 +26,41 b'' | |||
|
26 | 26 | </div> |
|
27 | 27 | </div> |
|
28 | 28 | </div> |
|
29 | <p class="help-block help-block-inline" > | |
|
30 | ${_('Server URL is available as ${server_url} variable. E.g. Redirect url: ${server_url}/_admin/exception_tracker')} | |
|
31 | </p> | |
|
32 | 29 | |
|
33 | <div class="label"> | |
|
30 | <div class="label" style="margin-top:10px"> | |
|
34 | 31 | <label for="redirect_url">${_('Redirect URL')}:</label> |
|
35 | 32 | </div> |
|
36 | 33 | <div class="input"> |
|
37 | 34 | <input type="text" name="redirect_url" value="${redirect_url}" style="width: 600px"/> |
|
38 | 35 | </div> |
|
39 | ||
|
36 | <p class="help-block help-block-inline"> | |
|
37 | ${_('Server URL is available as ${server_url} variable. E.g. Redirect url: ${server_url}/_admin/exception_tracker')} | |
|
38 | </p> | |
|
40 | 39 | |
|
41 | <div class="select"> | |
|
40 | <div class="select" style="margin-top:5px"> | |
|
41 | <div class="label"> | |
|
42 | <label for="redirect_url">${_('Templates')}:</label> | |
|
43 | </div> | |
|
44 | ||
|
42 | 45 |
|
|
43 | <div class="label"> | |
|
44 | <label for="redirect_url">${_('Repository template')}:</label> | |
|
45 | </div> | |
|
46 | 46 | ${dt.repo_name(name=repo.repo_name, rtype=repo.repo_type,rstate=None,private=None,archived=False,fork_of=False)} |
|
47 | 47 | ${h.hidden('bookmark_repo', repo.repo_id)} |
|
48 | 48 | % elif repo_group: |
|
49 | <div class="label"> | |
|
50 | <label for="redirect_url">${_('Repository group template')}:</label> | |
|
51 | </div> | |
|
52 | 49 | ${dt.repo_group_name(repo_group.group_name)} |
|
53 | 50 | ${h.hidden('bookmark_repo_group', repo_group.group_id)} |
|
54 | 51 | % else: |
|
55 |
<div |
|
|
56 | <label for="redirect_url">${_('Template Repository or Repository group')}:</label> | |
|
52 | <div> | |
|
53 | ${h.hidden('bookmark_repo', class_='bookmark_repo')} | |
|
54 | <p class="help-block help-block-inline">${_('Available as ${repo_url} e.g. Redirect url: ${repo_url}/changelog')}</p> | |
|
57 | 55 | </div> |
|
58 | ${h.hidden('bookmark_repo', class_='bookmark_repo')} | |
|
59 | <span style="padding-right:15px">OR</span> | |
|
60 | ${h.hidden('bookmark_repo_group', class_='bookmark_repo_group')} | |
|
56 | <div style="margin-top:5px"> | |
|
57 | ${h.hidden('bookmark_repo_group', class_='bookmark_repo_group')} | |
|
58 | <p class="help-block help-block-inline">${_('Available as ${repo_group_url} e.g. Redirect url: ${repo_group_url}')}</p> | |
|
59 | </div> | |
|
60 | ||
|
61 | 61 | % endif |
|
62 | 62 | </div> |
|
63 | 63 | |
|
64 | <p class="help-block help-block-inline" > | |
|
65 | % if repo: | |
|
66 | ${_('Available as ${repo_url} e.g. Redirect url: ${repo_url}/changelog')} | |
|
67 | % elif repo_group: | |
|
68 | ${_('Available as ${repo_group_url} e.g. Redirect url: ${repo_group_url}')} | |
|
69 | % else: | |
|
70 | ${_('Available as full url variables in redirect url. i.e: ${repo_url}, ${repo_group_url}.')} | |
|
71 | % endif | |
|
72 | </p> | |
|
73 | 64 | </td> |
|
74 | 65 | |
|
75 | 66 | </tr> |
@@ -111,9 +111,10 b'' | |||
|
111 | 111 | </div> |
|
112 | 112 | %else: |
|
113 | 113 |
|
|
114 | %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name): | |
|
114 | ||
|
115 | 115 | <div class="quick_start"> |
|
116 | 116 | <div class="fieldset"> |
|
117 | %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name): | |
|
117 | 118 | <p><b>${_('Add or upload files directly via RhodeCode:')}</b></p> |
|
118 | 119 | <div class="pull-left"> |
|
119 | 120 | <a href="${h.route_path('repo_files_add_file',repo_name=c.repo_name,commit_id=0, f_path='')}" class="btn btn-default">${_('Add New File')}</a> |
@@ -124,6 +125,7 b'' | |||
|
124 | 125 | %endif |
|
125 | 126 | </div> |
|
126 | 127 | |
|
128 | ||
|
127 | 129 | <div class="fieldset"> |
|
128 | 130 | <p><b>${_('Push new repo:')}</b></p> |
|
129 | 131 | <pre> |
@@ -63,7 +63,7 b'' | |||
|
63 | 63 | </tr> |
|
64 | 64 | %endfor |
|
65 | 65 | <tr class="compare_select_hidden" style="${('' if c.collapse_all_commits else 'display: none')}"> |
|
66 |
<td colspan=" |
|
|
66 | <td colspan="7"> | |
|
67 | 67 | ${_ungettext('{} commit hidden, click expand to show them.', '{} commits hidden, click expand to show them.', len(c.commit_ranges)).format(len(c.commit_ranges))} |
|
68 | 68 | </td> |
|
69 | 69 | </tr> |
@@ -791,6 +791,11 b' var CommentsController = function() {' | |||
|
791 | 791 | refreshDraftComments() |
|
792 | 792 | } |
|
793 | 793 | |
|
794 | if (window.refreshAllComments !== undefined) { | |
|
795 | // if we have this handler, run it, and refresh all comments boxes | |
|
796 | refreshAllComments() | |
|
797 | } | |
|
798 | ||
|
794 | 799 | return false; |
|
795 | 800 | }; |
|
796 | 801 |
@@ -560,7 +560,7 b'' | |||
|
560 | 560 | |
|
561 | 561 | <div class="right-sidebar-expanded-state pr-details-title"> |
|
562 | 562 | <span style="padding-left: 2px"> |
|
563 |
<input name="select_all_drafts" type="checkbox" onclick=" |
|
|
563 | <input name="select_all_drafts" type="checkbox" onclick="selectDraftComments(event)"> | |
|
564 | 564 | </span> |
|
565 | 565 | <span class="sidebar-heading noselect" onclick="refreshDraftComments(); return false"> |
|
566 | 566 | <i class="icon-comment icon-draft"></i> |
@@ -942,6 +942,11 b' window.setObserversData = ${c.pull_reque' | |||
|
942 | 942 | } |
|
943 | 943 | } |
|
944 | 944 | |
|
945 | window.selectDraftComments = function (event) { | |
|
946 | var $target = $(event.currentTarget); | |
|
947 | $('[name=submit_draft]').prop('checked', $target.prop('checked')) | |
|
948 | } | |
|
949 | ||
|
945 | 950 | window.closePullRequest = function (status) { |
|
946 | 951 | if (!confirm(_gettext('Are you sure to close this pull request without merging?'))) { |
|
947 | 952 | return false; |
@@ -311,6 +311,7 b' class BaseRepository(object):' | |||
|
311 | 311 | DEFAULT_CONTACT = u"Unknown" |
|
312 | 312 | DEFAULT_DESCRIPTION = u"unknown" |
|
313 | 313 | EMPTY_COMMIT_ID = '0' * 40 |
|
314 | COMMIT_ID_PAT = re.compile(r'[0-9a-fA-F]{40}') | |
|
314 | 315 | |
|
315 | 316 | path = None |
|
316 | 317 |
@@ -618,7 +618,7 b' class GitRepository(BaseRepository):' | |||
|
618 | 618 | else: |
|
619 | 619 | output, __ = self.run_git_command( |
|
620 | 620 | ['merge-base', commit_id1, commit_id2]) |
|
621 |
ancestor_id = |
|
|
621 | ancestor_id = self.COMMIT_ID_PAT.findall(output)[0] | |
|
622 | 622 | |
|
623 | 623 | log.debug('Found common ancestor with sha: %s', ancestor_id) |
|
624 | 624 | |
@@ -642,7 +642,7 b' class GitRepository(BaseRepository):' | |||
|
642 | 642 | '%s..%s' % (commit_id1, commit_id2)]) |
|
643 | 643 | commits = [ |
|
644 | 644 | repo1.get_commit(commit_id=commit_id, pre_load=pre_load) |
|
645 |
for commit_id in |
|
|
645 | for commit_id in self.COMMIT_ID_PAT.findall(output)] | |
|
646 | 646 | |
|
647 | 647 | return commits |
|
648 | 648 |
@@ -171,9 +171,9 b' data = {' | |||
|
171 | 171 | <tr> |
|
172 | 172 | <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td> |
|
173 | 173 | <td style="line-height:20px;"> |
|
174 |
<code>${' |
|
|
174 | <code>${data['source_ref_type']}:${pull_request.source_ref_parts.name}</code> ${_('of')} ${data['source_repo_url']} | |
|
175 | 175 | → |
|
176 |
<code>${' |
|
|
176 | <code>${data['target_ref_type']}:${pull_request.target_ref_parts.name}</code> ${_('of')} ${data['target_repo_url']} | |
|
177 | 177 | </td> |
|
178 | 178 | </tr> |
|
179 | 179 |
@@ -124,9 +124,9 b' data = {' | |||
|
124 | 124 | <tr> |
|
125 | 125 | <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td> |
|
126 | 126 | <td style="line-height:20px;"> |
|
127 |
<code>${' |
|
|
127 | <code>${data['source_ref_type']}:${pull_request.source_ref_parts.name}</code> ${_('of')} ${data['source_repo_url']} | |
|
128 | 128 | → |
|
129 |
<code>${' |
|
|
129 | <code>${data['target_ref_type']}:${pull_request.target_ref_parts.name}</code> ${_('of')} ${data['target_repo_url']} | |
|
130 | 130 | </td> |
|
131 | 131 | </tr> |
|
132 | 132 |
@@ -129,9 +129,9 b' data = {' | |||
|
129 | 129 | <tr> |
|
130 | 130 | <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td> |
|
131 | 131 | <td style="line-height:20px;"> |
|
132 |
<code>${' |
|
|
132 | <code>${data['source_ref_type']}:${pull_request.source_ref_parts.name}</code> ${_('of')} ${data['source_repo_url']} | |
|
133 | 133 | → |
|
134 |
<code>${' |
|
|
134 | <code>${data['target_ref_type']}:${pull_request.target_ref_parts.name}</code> ${_('of')} ${data['target_repo_url']} | |
|
135 | 135 | </td> |
|
136 | 136 | </tr> |
|
137 | 137 |
@@ -143,9 +143,9 b'' | |||
|
143 | 143 | ## pull url |
|
144 | 144 | <li> |
|
145 | 145 | %if h.is_hg(c.pull_request.source_repo): |
|
146 | <% clone_url = 'hg pull -r {} {}'.format(h.short_id(c.source_ref), c.pull_request.source_repo.clone_url()) %> | |
|
146 | <% clone_url = u'hg pull -r {} {}'.format(h.short_id(c.source_ref), c.pull_request.source_repo.clone_url()) %> | |
|
147 | 147 | %elif h.is_git(c.pull_request.source_repo): |
|
148 | <% clone_url = 'git pull {} {}'.format(c.pull_request.source_repo.clone_url(), c.pull_request.source_ref_parts.name) %> | |
|
148 | <% clone_url = u'git pull {} {}'.format(c.pull_request.source_repo.clone_url(), c.pull_request.source_ref_parts.name) %> | |
|
149 | 149 | %endif |
|
150 | 150 | |
|
151 | 151 | <span>${_('Pull changes from source')}</span>: <input type="text" class="input-monospace pr-pullinfo" value="${clone_url}" readonly="readonly"> |
@@ -5,17 +5,22 b' done = false' | |||
|
5 | 5 | done = true |
|
6 | 6 | |
|
7 | 7 | [task:rc_tools_pinned] |
|
8 | done = true | |
|
8 | 9 | |
|
9 | 10 | [task:fixes_on_stable] |
|
11 | done = true | |
|
10 | 12 | |
|
11 | 13 | [task:pip2nix_generated] |
|
14 | done = true | |
|
12 | 15 | |
|
13 | 16 | [task:changelog_updated] |
|
17 | done = true | |
|
14 | 18 | |
|
15 | 19 | [task:generate_api_docs] |
|
20 | done = true | |
|
16 | 21 | |
|
17 | 22 | [release] |
|
18 |
state = |
|
|
23 | state = prepared | |
|
19 | 24 | version = 4.25.1 |
|
20 | 25 | |
|
21 | 26 | [task:updated_translation] |
@@ -1,5 +1,6 b'' | |||
|
1 | 1 | [bumpversion] |
|
2 |
current_version = 4.25. |
|
|
2 | current_version = 4.25.1 | |
|
3 | 3 | message = release: Bump version {current_version} to {new_version} |
|
4 | 4 | |
|
5 | 5 | [bumpversion:file:rhodecode/VERSION] |
|
6 |
@@ -5,26 +5,20 b' done = false' | |||
|
5 | 5 | done = true |
|
6 | 6 | |
|
7 | 7 | [task:rc_tools_pinned] |
|
8 | done = true | |
|
9 | 8 | |
|
10 | 9 | [task:fixes_on_stable] |
|
11 | done = true | |
|
12 | 10 | |
|
13 | 11 | [task:pip2nix_generated] |
|
14 | done = true | |
|
15 | 12 | |
|
16 | 13 | [task:changelog_updated] |
|
17 | done = true | |
|
18 | 14 | |
|
19 | 15 | [task:generate_api_docs] |
|
20 | done = true | |
|
16 | ||
|
17 | [release] | |
|
18 | state = in_progress | |
|
19 | version = 4.25.1 | |
|
21 | 20 | |
|
22 | 21 | [task:updated_translation] |
|
23 | done = true | |
|
24 | ||
|
25 | [release] | |
|
26 | state = prepared | |
|
27 | version = 4.25.0 | |
|
28 | 22 | |
|
29 | 23 | [task:generate_js_routes] |
|
30 | 24 |
@@ -0,0 +1,40 b'' | |||
|
1 | |RCE| 4.25.1 |RNS| | |
|
2 | ------------------ | |
|
3 | ||
|
4 | Release Date | |
|
5 | ^^^^^^^^^^^^ | |
|
6 | ||
|
7 | - 2021-04-06 | |
|
8 | ||
|
9 | ||
|
10 | New Features | |
|
11 | ^^^^^^^^^^^^ | |
|
12 | ||
|
13 | ||
|
14 | ||
|
15 | General | |
|
16 | ^^^^^^^ | |
|
17 | ||
|
18 | ||
|
19 | ||
|
20 | Security | |
|
21 | ^^^^^^^^ | |
|
22 | ||
|
23 | ||
|
24 | ||
|
25 | Performance | |
|
26 | ^^^^^^^^^^^ | |
|
27 | ||
|
28 | ||
|
29 | ||
|
30 | Fixes | |
|
31 | ^^^^^ | |
|
32 | ||
|
33 | - Artifacts: fixed admin panel bad urls generated for the new artifacts admin view in CE edition. | |
|
34 | ||
|
35 | ||
|
36 | ||
|
37 | Upgrade notes | |
|
38 | ^^^^^^^^^^^^^ | |
|
39 | ||
|
40 | - Un-scheduled release addressing problems in 4.25.X releases. |
@@ -0,0 +1,40 b'' | |||
|
1 | # -*- coding: utf-8 -*- | |
|
2 | ||
|
3 | # Copyright (C) 2016-2020 RhodeCode GmbH | |
|
4 | # | |
|
5 | # This program is free software: you can redistribute it and/or modify | |
|
6 | # it under the terms of the GNU Affero General Public License, version 3 | |
|
7 | # (only), as published by the Free Software Foundation. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU Affero General Public License | |
|
15 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
|
16 | # | |
|
17 | # This program is dual-licensed. If you wish to learn more about the | |
|
18 | # RhodeCode Enterprise Edition, including its added features, Support services, | |
|
19 | # and proprietary license terms, please see https://rhodecode.com/licenses/ | |
|
20 | ||
|
21 | import logging | |
|
22 | ||
|
23 | from rhodecode.apps._base import BaseAppView, DataGridAppView | |
|
24 | from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator | |
|
25 | ||
|
26 | log = logging.getLogger(__name__) | |
|
27 | ||
|
28 | ||
|
29 | class AdminArtifactsView(BaseAppView, DataGridAppView): | |
|
30 | ||
|
31 | def load_default_context(self): | |
|
32 | c = self._get_local_tmpl_context() | |
|
33 | return c | |
|
34 | ||
|
35 | @LoginRequired() | |
|
36 | @HasPermissionAllDecorator('hg.admin') | |
|
37 | def artifacts(self): | |
|
38 | c = self.load_default_context() | |
|
39 | c.active = 'artifacts' | |
|
40 | return self._get_template_context(c) |
@@ -0,0 +1,39 b'' | |||
|
1 | ## -*- coding: utf-8 -*- | |
|
2 | <%inherit file="/base/base.mako"/> | |
|
3 | ||
|
4 | <%def name="title()"> | |
|
5 | ${_('Artifacts Admin')} | |
|
6 | %if c.rhodecode_name: | |
|
7 | · ${h.branding(c.rhodecode_name)} | |
|
8 | %endif | |
|
9 | </%def> | |
|
10 | ||
|
11 | <%def name="breadcrumbs_links()"></%def> | |
|
12 | ||
|
13 | <%def name="menu_bar_nav()"> | |
|
14 | ${self.menu_items(active='admin')} | |
|
15 | </%def> | |
|
16 | ||
|
17 | <%def name="menu_bar_subnav()"> | |
|
18 | ${self.admin_menu(active='artifacts')} | |
|
19 | </%def> | |
|
20 | ||
|
21 | <%def name="main()"> | |
|
22 | ||
|
23 | <div class="box"> | |
|
24 | ||
|
25 | <div class="panel panel-default"> | |
|
26 | <div class="panel-heading"> | |
|
27 | <h3 class="panel-title">${_('Artifacts Administration.')}</h3> | |
|
28 | </div> | |
|
29 | <div class="panel-body"> | |
|
30 | <h4>${_('This feature is available in RhodeCode EE edition only. Contact {sales_email} to obtain a trial license.').format(sales_email='<a href="mailto:sales@rhodecode.com">sales@rhodecode.com</a>')|n}</h4> | |
|
31 | ||
|
32 | </div> | |
|
33 | </div> | |
|
34 | ||
|
35 | </div> | |
|
36 | ||
|
37 | ||
|
38 | </%def> | |
|
39 |
@@ -27,6 +27,7 b' def admin_routes(config):' | |||
|
27 | 27 | Admin prefixed routes |
|
28 | 28 | """ |
|
29 | 29 | from rhodecode.apps.admin.views.audit_logs import AdminAuditLogsView |
|
30 | from rhodecode.apps.admin.views.artifacts import AdminArtifactsView | |
|
30 | 31 | from rhodecode.apps.admin.views.defaults import AdminDefaultSettingsView |
|
31 | 32 | from rhodecode.apps.admin.views.exception_tracker import ExceptionsTrackerView |
|
32 | 33 | from rhodecode.apps.admin.views.main_views import AdminMainView |
@@ -60,6 +61,34 b' def admin_routes(config):' | |||
|
60 | 61 | route_name='admin_audit_log_entry', request_method='GET', |
|
61 | 62 | renderer='rhodecode:templates/admin/admin_audit_log_entry.mako') |
|
62 | 63 | |
|
64 | # Artifacts EE feature | |
|
65 | config.add_route( | |
|
66 | 'admin_artifacts', | |
|
67 | pattern=ADMIN_PREFIX + '/artifacts') | |
|
68 | config.add_route( | |
|
69 | 'admin_artifacts_show_all', | |
|
70 | pattern=ADMIN_PREFIX + '/artifacts') | |
|
71 | config.add_view( | |
|
72 | AdminArtifactsView, | |
|
73 | attr='artifacts', | |
|
74 | route_name='admin_artifacts', request_method='GET', | |
|
75 | renderer='rhodecode:templates/admin/artifacts/artifacts.mako') | |
|
76 | config.add_view( | |
|
77 | AdminArtifactsView, | |
|
78 | attr='artifacts', | |
|
79 | route_name='admin_artifacts_show_all', request_method='GET', | |
|
80 | renderer='rhodecode:templates/admin/artifacts/artifacts.mako') | |
|
81 | # EE views | |
|
82 | config.add_route( | |
|
83 | name='admin_artifacts_show_info', | |
|
84 | pattern=ADMIN_PREFIX + '/artifacts/{uid}') | |
|
85 | config.add_route( | |
|
86 | name='admin_artifacts_delete', | |
|
87 | pattern=ADMIN_PREFIX + '/artifacts/{uid}/delete') | |
|
88 | config.add_route( | |
|
89 | name='admin_artifacts_update', | |
|
90 | pattern=ADMIN_PREFIX + '/artifacts/{uid}/update') | |
|
91 | ||
|
63 | 92 | config.add_route( |
|
64 | 93 | name='admin_settings_open_source', |
|
65 | 94 | pattern='/settings/open_source') |
@@ -8,18 +8,22 b' done = true' | |||
|
8 | 8 | done = true |
|
9 | 9 | |
|
10 | 10 | [task:fixes_on_stable] |
|
11 | done = true | |
|
11 | 12 | |
|
12 | 13 | [task:pip2nix_generated] |
|
14 | done = true | |
|
13 | 15 | |
|
14 | 16 | [task:changelog_updated] |
|
17 | done = true | |
|
15 | 18 | |
|
16 | 19 | [task:generate_api_docs] |
|
17 | 20 | done = true |
|
18 | 21 | |
|
19 | 22 | [task:updated_translation] |
|
23 | done = true | |
|
20 | 24 | |
|
21 | 25 | [release] |
|
22 |
state = |
|
|
26 | state = prepared | |
|
23 | 27 | version = 4.25.0 |
|
24 | 28 | |
|
25 | 29 | [task:generate_js_routes] |
@@ -5,6 +5,7 b' done = false' | |||
|
5 | 5 | done = true |
|
6 | 6 | |
|
7 | 7 | [task:rc_tools_pinned] |
|
8 | done = true | |
|
8 | 9 | |
|
9 | 10 | [task:fixes_on_stable] |
|
10 | 11 | |
@@ -13,6 +14,7 b' done = true' | |||
|
13 | 14 | [task:changelog_updated] |
|
14 | 15 | |
|
15 | 16 | [task:generate_api_docs] |
|
17 | done = true | |
|
16 | 18 | |
|
17 | 19 | [task:updated_translation] |
|
18 | 20 |
This diff has been collapsed as it changes many lines, (635 lines changed) Show them Hide them | |||
@@ -6,9 +6,9 b'' | |||
|
6 | 6 | #, fuzzy |
|
7 | 7 | msgid "" |
|
8 | 8 | msgstr "" |
|
9 |
"Project-Id-Version: rhodecode-enterprise-ce 4.2 |
|
|
9 | "Project-Id-Version: rhodecode-enterprise-ce 4.25.0\n" | |
|
10 | 10 | "Report-Msgid-Bugs-To: marcin@rhodecode.com\n" |
|
11 |
"POT-Creation-Date: 2021-0 |
|
|
11 | "POT-Creation-Date: 2021-04-05 19:29+0000\n" | |
|
12 | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
|
13 | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
|
14 | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" |
@@ -111,7 +111,7 b' msgstr ""' | |||
|
111 | 111 | #: rhodecode/apps/admin/views/settings.py:156 |
|
112 | 112 | #: rhodecode/apps/admin/views/settings.py:291 |
|
113 | 113 | #: rhodecode/apps/admin/views/settings.py:360 |
|
114 |
#: rhodecode/apps/admin/views/settings.py:66 |
|
|
114 | #: rhodecode/apps/admin/views/settings.py:664 | |
|
115 | 115 | #: rhodecode/apps/repository/views/repo_settings_vcs.py:116 |
|
116 | 116 | msgid "Some form inputs contain invalid data." |
|
117 | 117 | msgstr "" |
@@ -135,54 +135,54 b' msgstr ""' | |||
|
135 | 135 | msgid "Updated application settings" |
|
136 | 136 | msgstr "" |
|
137 | 137 | |
|
138 |
#: rhodecode/apps/admin/views/settings.py: |
|
|
138 | #: rhodecode/apps/admin/views/settings.py:400 | |
|
139 | 139 | msgid "Updated visualisation settings" |
|
140 | 140 | msgstr "" |
|
141 | 141 | |
|
142 |
#: rhodecode/apps/admin/views/settings.py:40 |
|
|
142 | #: rhodecode/apps/admin/views/settings.py:403 | |
|
143 | 143 | msgid "Error occurred during updating visualisation settings" |
|
144 | 144 | msgstr "" |
|
145 | 145 | |
|
146 |
#: rhodecode/apps/admin/views/settings.py:46 |
|
|
146 | #: rhodecode/apps/admin/views/settings.py:465 | |
|
147 | 147 | #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:115 |
|
148 | 148 | msgid "Invalid issue tracker pattern: {}" |
|
149 | 149 | msgstr "" |
|
150 | 150 | |
|
151 |
#: rhodecode/apps/admin/views/settings.py:48 |
|
|
151 | #: rhodecode/apps/admin/views/settings.py:482 | |
|
152 | 152 | #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:124 |
|
153 | 153 | msgid "Updated issue tracker entries" |
|
154 | 154 | msgstr "" |
|
155 | 155 | |
|
156 |
#: rhodecode/apps/admin/views/settings.py:49 |
|
|
156 | #: rhodecode/apps/admin/views/settings.py:499 | |
|
157 | 157 | #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:82 |
|
158 | 158 | msgid "Removed issue tracker entry." |
|
159 | 159 | msgstr "" |
|
160 | 160 | |
|
161 |
#: rhodecode/apps/admin/views/settings.py:53 |
|
|
161 | #: rhodecode/apps/admin/views/settings.py:531 | |
|
162 | 162 | msgid "Please enter email address" |
|
163 | 163 | msgstr "" |
|
164 | 164 | |
|
165 |
#: rhodecode/apps/admin/views/settings.py:54 |
|
|
165 | #: rhodecode/apps/admin/views/settings.py:547 | |
|
166 | 166 | msgid "Send email task created" |
|
167 | 167 | msgstr "" |
|
168 | 168 | |
|
169 |
#: rhodecode/apps/admin/views/settings.py:58 |
|
|
169 | #: rhodecode/apps/admin/views/settings.py:588 | |
|
170 | 170 | msgid "Added new hook" |
|
171 | 171 | msgstr "" |
|
172 | 172 | |
|
173 |
#: rhodecode/apps/admin/views/settings.py:60 |
|
|
173 | #: rhodecode/apps/admin/views/settings.py:603 | |
|
174 | 174 | msgid "Updated hooks" |
|
175 | 175 | msgstr "" |
|
176 | 176 | |
|
177 |
#: rhodecode/apps/admin/views/settings.py:60 |
|
|
177 | #: rhodecode/apps/admin/views/settings.py:607 | |
|
178 | 178 | msgid "Error occurred during hook creation" |
|
179 | 179 | msgstr "" |
|
180 | 180 | |
|
181 |
#: rhodecode/apps/admin/views/settings.py:68 |
|
|
181 | #: rhodecode/apps/admin/views/settings.py:688 | |
|
182 | 182 | msgid "Error occurred during updating labs settings" |
|
183 | 183 | msgstr "" |
|
184 | 184 | |
|
185 |
#: rhodecode/apps/admin/views/settings.py:69 |
|
|
185 | #: rhodecode/apps/admin/views/settings.py:693 | |
|
186 | 186 | msgid "Updated Labs settings" |
|
187 | 187 | msgstr "" |
|
188 | 188 | |
@@ -592,7 +592,7 b' msgstr ""' | |||
|
592 | 592 | msgid "1 month" |
|
593 | 593 | msgstr "" |
|
594 | 594 | |
|
595 |
#: rhodecode/apps/gist/views.py:63 rhodecode/public/js/scripts.js:48 |
|
|
595 | #: rhodecode/apps/gist/views.py:63 rhodecode/public/js/scripts.js:48670 | |
|
596 | 596 | #: rhodecode/public/js/scripts.min.js:1 |
|
597 | 597 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:48 |
|
598 | 598 | #: rhodecode/public/js/src/rhodecode.js:634 |
@@ -653,8 +653,8 b' msgstr ""' | |||
|
653 | 653 | #: rhodecode/templates/admin/repos/repo_add.mako:19 |
|
654 | 654 | #: rhodecode/templates/admin/users/user_edit_advanced.mako:12 |
|
655 | 655 | #: rhodecode/templates/base/base.mako:114 |
|
656 |
#: rhodecode/templates/base/base.mako:13 |
|
|
657 |
#: rhodecode/templates/base/base.mako:119 |
|
|
656 | #: rhodecode/templates/base/base.mako:134 | |
|
657 | #: rhodecode/templates/base/base.mako:1192 | |
|
658 | 658 | msgid "Repositories" |
|
659 | 659 | msgstr "" |
|
660 | 660 | |
@@ -894,104 +894,104 b' msgstr ""' | |||
|
894 | 894 | msgid "No such commit exists for this repository. Commit: {}" |
|
895 | 895 | msgstr "" |
|
896 | 896 | |
|
897 |
#: rhodecode/apps/repository/views/repo_files.py:35 |
|
|
897 | #: rhodecode/apps/repository/views/repo_files.py:359 | |
|
898 | 898 | msgid "Downloads disabled" |
|
899 | 899 | msgstr "" |
|
900 | 900 | |
|
901 |
#: rhodecode/apps/repository/views/repo_files.py:36 |
|
|
901 | #: rhodecode/apps/repository/views/repo_files.py:365 | |
|
902 | 902 | msgid "Unknown archive type for: `{}`" |
|
903 | 903 | msgstr "" |
|
904 | 904 | |
|
905 |
#: rhodecode/apps/repository/views/repo_files.py:37 |
|
|
905 | #: rhodecode/apps/repository/views/repo_files.py:371 | |
|
906 | 906 | msgid "Unknown commit_id {}" |
|
907 | 907 | msgstr "" |
|
908 | 908 | |
|
909 |
#: rhodecode/apps/repository/views/repo_files.py:37 |
|
|
909 | #: rhodecode/apps/repository/views/repo_files.py:374 | |
|
910 | 910 | msgid "Empty repository" |
|
911 | 911 | msgstr "" |
|
912 | 912 | |
|
913 |
#: rhodecode/apps/repository/views/repo_files.py:3 |
|
|
913 | #: rhodecode/apps/repository/views/repo_files.py:384 | |
|
914 | 914 | msgid "No node at path {} for this repository" |
|
915 | 915 | msgstr "" |
|
916 | 916 | |
|
917 |
#: rhodecode/apps/repository/views/repo_files.py:4 |
|
|
917 | #: rhodecode/apps/repository/views/repo_files.py:436 | |
|
918 | 918 | msgid "Unknown archive type" |
|
919 | 919 | msgstr "" |
|
920 | 920 | |
|
921 |
#: rhodecode/apps/repository/views/repo_files.py:9 |
|
|
921 | #: rhodecode/apps/repository/views/repo_files.py:993 | |
|
922 | 922 | msgid "Changesets" |
|
923 | 923 | msgstr "" |
|
924 | 924 | |
|
925 |
#: rhodecode/apps/repository/views/repo_files.py:10 |
|
|
926 |
#: rhodecode/apps/repository/views/repo_summary.py:2 |
|
|
927 |
#: rhodecode/model/pull_request.py:191 |
|
|
925 | #: rhodecode/apps/repository/views/repo_files.py:1014 | |
|
926 | #: rhodecode/apps/repository/views/repo_summary.py:239 | |
|
927 | #: rhodecode/model/pull_request.py:1912 rhodecode/model/scm.py:999 | |
|
928 | 928 | #: rhodecode/templates/base/vcs_settings.mako:235 |
|
929 | 929 | #: rhodecode/templates/summary/components.mako:10 |
|
930 | 930 | msgid "Branches" |
|
931 | 931 | msgstr "" |
|
932 | 932 | |
|
933 |
#: rhodecode/apps/repository/views/repo_files.py:101 |
|
|
933 | #: rhodecode/apps/repository/views/repo_files.py:1018 | |
|
934 | 934 | #: rhodecode/model/scm.py:1016 rhodecode/templates/base/vcs_settings.mako:260 |
|
935 | 935 | #: rhodecode/templates/summary/components.mako:34 |
|
936 | 936 | msgid "Tags" |
|
937 | 937 | msgstr "" |
|
938 | 938 | |
|
939 |
#: rhodecode/apps/repository/views/repo_files.py:11 |
|
|
940 |
#: rhodecode/apps/repository/views/repo_files.py:118 |
|
|
939 | #: rhodecode/apps/repository/views/repo_files.py:1162 | |
|
940 | #: rhodecode/apps/repository/views/repo_files.py:1188 | |
|
941 | 941 | msgid "Deleted file {} via RhodeCode Enterprise" |
|
942 | 942 | msgstr "" |
|
943 | 943 | |
|
944 |
#: rhodecode/apps/repository/views/repo_files.py:120 |
|
|
944 | #: rhodecode/apps/repository/views/repo_files.py:1209 | |
|
945 | 945 | msgid "Successfully deleted file `{}`" |
|
946 | 946 | msgstr "" |
|
947 | 947 | |
|
948 |
#: rhodecode/apps/repository/views/repo_files.py:12 |
|
|
948 | #: rhodecode/apps/repository/views/repo_files.py:1213 | |
|
949 | #: rhodecode/apps/repository/views/repo_files.py:1326 | |
|
950 | #: rhodecode/apps/repository/views/repo_files.py:1450 | |
|
951 | #: rhodecode/apps/repository/views/repo_files.py:1571 | |
|
952 | msgid "Error occurred during commit" | |
|
953 | msgstr "" | |
|
954 | ||
|
955 | #: rhodecode/apps/repository/views/repo_files.py:1243 | |
|
956 | #: rhodecode/apps/repository/views/repo_files.py:1272 | |
|
957 | msgid "Edited file {} via RhodeCode Enterprise" | |
|
958 | msgstr "" | |
|
959 | ||
|
960 | #: rhodecode/apps/repository/views/repo_files.py:1295 | |
|
961 | msgid "No changes detected on {}" | |
|
962 | msgstr "" | |
|
963 | ||
|
949 | 964 | #: rhodecode/apps/repository/views/repo_files.py:1319 |
|
950 | #: rhodecode/apps/repository/views/repo_files.py:1443 | |
|
951 | #: rhodecode/apps/repository/views/repo_files.py:1564 | |
|
952 | msgid "Error occurred during commit" | |
|
953 | msgstr "" | |
|
954 | ||
|
955 | #: rhodecode/apps/repository/views/repo_files.py:1236 | |
|
956 | #: rhodecode/apps/repository/views/repo_files.py:1265 | |
|
957 | msgid "Edited file {} via RhodeCode Enterprise" | |
|
958 | msgstr "" | |
|
959 | ||
|
960 | #: rhodecode/apps/repository/views/repo_files.py:1288 | |
|
961 | msgid "No changes detected on {}" | |
|
962 | msgstr "" | |
|
963 | ||
|
964 | #: rhodecode/apps/repository/views/repo_files.py:1312 | |
|
965 | 965 | msgid "Successfully committed changes to file `{}`" |
|
966 | 966 | msgstr "" |
|
967 | 967 | |
|
968 |
#: rhodecode/apps/repository/views/repo_files.py:13 |
|
|
969 |
#: rhodecode/apps/repository/views/repo_files.py:13 |
|
|
968 | #: rhodecode/apps/repository/views/repo_files.py:1355 | |
|
969 | #: rhodecode/apps/repository/views/repo_files.py:1394 | |
|
970 | 970 | msgid "Added file via RhodeCode Enterprise" |
|
971 | 971 | msgstr "" |
|
972 | 972 | |
|
973 |
#: rhodecode/apps/repository/views/repo_files.py:140 |
|
|
973 | #: rhodecode/apps/repository/views/repo_files.py:1410 | |
|
974 | 974 | msgid "No filename specified" |
|
975 | 975 | msgstr "" |
|
976 | 976 | |
|
977 |
#: rhodecode/apps/repository/views/repo_files.py:14 |
|
|
977 | #: rhodecode/apps/repository/views/repo_files.py:1435 | |
|
978 | 978 | msgid "Successfully committed new file `{}`" |
|
979 | 979 | msgstr "" |
|
980 | 980 | |
|
981 |
#: rhodecode/apps/repository/views/repo_files.py:143 |
|
|
982 |
#: rhodecode/apps/repository/views/repo_files.py:15 |
|
|
981 | #: rhodecode/apps/repository/views/repo_files.py:1443 | |
|
982 | #: rhodecode/apps/repository/views/repo_files.py:1553 | |
|
983 | 983 | msgid "The location specified must be a relative path and must not contain .. in the path" |
|
984 | 984 | msgstr "" |
|
985 | 985 | |
|
986 |
#: rhodecode/apps/repository/views/repo_files.py:149 |
|
|
986 | #: rhodecode/apps/repository/views/repo_files.py:1498 | |
|
987 | 987 | msgid "Uploaded file via RhodeCode Enterprise" |
|
988 | 988 | msgstr "" |
|
989 | 989 | |
|
990 |
#: rhodecode/apps/repository/views/repo_files.py:15 |
|
|
990 | #: rhodecode/apps/repository/views/repo_files.py:1542 | |
|
991 | 991 | msgid "Successfully committed {} new files" |
|
992 | 992 | msgstr "" |
|
993 | 993 | |
|
994 |
#: rhodecode/apps/repository/views/repo_files.py:15 |
|
|
994 | #: rhodecode/apps/repository/views/repo_files.py:1544 | |
|
995 | 995 | msgid "Successfully committed 1 new file" |
|
996 | 996 | msgstr "" |
|
997 | 997 | |
@@ -1215,23 +1215,23 b' msgstr ""' | |||
|
1215 | 1215 | msgid "Error occurred during updating repository VCS settings" |
|
1216 | 1216 | msgstr "" |
|
1217 | 1217 | |
|
1218 |
#: rhodecode/apps/repository/views/repo_summary.py:2 |
|
|
1218 | #: rhodecode/apps/repository/views/repo_summary.py:218 | |
|
1219 | 1219 | #: rhodecode/templates/admin/permissions/permissions.mako:42 |
|
1220 | 1220 | #: rhodecode/templates/summary/components.mako:8 |
|
1221 | 1221 | msgid "Branch" |
|
1222 | 1222 | msgstr "" |
|
1223 | 1223 | |
|
1224 |
#: rhodecode/apps/repository/views/repo_summary.py:2 |
|
|
1224 | #: rhodecode/apps/repository/views/repo_summary.py:219 | |
|
1225 | 1225 | #: rhodecode/templates/summary/components.mako:32 |
|
1226 | 1226 | msgid "Tag" |
|
1227 | 1227 | msgstr "" |
|
1228 | 1228 | |
|
1229 |
#: rhodecode/apps/repository/views/repo_summary.py:22 |
|
|
1229 | #: rhodecode/apps/repository/views/repo_summary.py:220 | |
|
1230 | 1230 | #: rhodecode/templates/summary/components.mako:44 |
|
1231 | 1231 | msgid "Bookmark" |
|
1232 | 1232 | msgstr "" |
|
1233 | 1233 | |
|
1234 |
#: rhodecode/apps/repository/views/repo_summary.py:24 |
|
|
1234 | #: rhodecode/apps/repository/views/repo_summary.py:240 | |
|
1235 | 1235 | msgid "Closed branches" |
|
1236 | 1236 | msgstr "" |
|
1237 | 1237 | |
@@ -1291,9 +1291,9 b' msgid "Enable or disable this authentica' | |||
|
1291 | 1291 | msgstr "" |
|
1292 | 1292 | |
|
1293 | 1293 | #: rhodecode/authentication/schema.py:38 rhodecode/integrations/schema.py:32 |
|
1294 |
#: rhodecode/model/permission.py:11 |
|
|
1295 |
#: rhodecode/model/permission.py:1 |
|
|
1296 |
#: rhodecode/model/permission.py:12 |
|
|
1294 | #: rhodecode/model/permission.py:112 rhodecode/model/permission.py:116 | |
|
1295 | #: rhodecode/model/permission.py:120 rhodecode/model/permission.py:124 | |
|
1296 | #: rhodecode/model/permission.py:128 rhodecode/model/permission.py:132 | |
|
1297 | 1297 | #: rhodecode/model/validation_schema/schemas/integration_schema.py:195 |
|
1298 | 1298 | #: rhodecode/templates/admin/auth/auth_settings.mako:64 |
|
1299 | 1299 | #: rhodecode/templates/admin/integrations/list.mako:71 |
@@ -1806,7 +1806,7 b' msgstr ""' | |||
|
1806 | 1806 | #: rhodecode/templates/admin/settings/settings_issuetracker.mako:16 |
|
1807 | 1807 | #: rhodecode/templates/admin/settings/settings_labs.mako:49 |
|
1808 | 1808 | #: rhodecode/templates/admin/settings/settings_vcs.mako:14 |
|
1809 |
#: rhodecode/templates/admin/settings/settings_visual.mako:21 |
|
|
1809 | #: rhodecode/templates/admin/settings/settings_visual.mako:218 | |
|
1810 | 1810 | #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:217 |
|
1811 | 1811 | #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:107 |
|
1812 | 1812 | #: rhodecode/templates/admin/users/user_edit_emails.mako:66 |
@@ -1841,7 +1841,7 b' msgstr ""' | |||
|
1841 | 1841 | #: rhodecode/templates/changeset/changeset_file_comment.mako:236 |
|
1842 | 1842 | #: rhodecode/templates/changeset/changeset_file_comment.mako:250 |
|
1843 | 1843 | #: rhodecode/templates/changeset/changeset_file_comment.mako:259 |
|
1844 |
#: rhodecode/templates/data_table/_dt_elements.mako:4 |
|
|
1844 | #: rhodecode/templates/data_table/_dt_elements.mako:445 | |
|
1845 | 1845 | #: rhodecode/templates/debug_style/buttons.html:132 |
|
1846 | 1846 | #: rhodecode/templates/files/files_source.mako:40 |
|
1847 | 1847 | #: rhodecode/templates/files/files_source.mako:47 |
@@ -2229,15 +2229,15 b' msgstr ""' | |||
|
2229 | 2229 | msgid "Commit not found" |
|
2230 | 2230 | msgstr "" |
|
2231 | 2231 | |
|
2232 |
#: rhodecode/lib/auth.py:17 |
|
|
2232 | #: rhodecode/lib/auth.py:1771 | |
|
2233 | 2233 | msgid "IP {} not allowed" |
|
2234 | 2234 | msgstr "" |
|
2235 | 2235 | |
|
2236 |
#: rhodecode/lib/auth.py:186 |
|
|
2236 | #: rhodecode/lib/auth.py:1863 | |
|
2237 | 2237 | msgid "You need to be a registered user to perform this action" |
|
2238 | 2238 | msgstr "" |
|
2239 | 2239 | |
|
2240 |
#: rhodecode/lib/auth.py:190 |
|
|
2240 | #: rhodecode/lib/auth.py:1907 | |
|
2241 | 2241 | msgid "You need to be signed in to view this page" |
|
2242 | 2242 | msgstr "" |
|
2243 | 2243 | |
@@ -2249,7 +2249,7 b' msgstr ""' | |||
|
2249 | 2249 | msgid "Click to select line" |
|
2250 | 2250 | msgstr "" |
|
2251 | 2251 | |
|
2252 |
#: rhodecode/lib/helpers.py:18 |
|
|
2252 | #: rhodecode/lib/helpers.py:1883 | |
|
2253 | 2253 | msgid "" |
|
2254 | 2254 | "Example filter terms:\n" |
|
2255 | 2255 | " repository:vcs\n" |
@@ -2271,7 +2271,7 b' msgid ""' | |||
|
2271 | 2271 | " \"username:test AND repository:test*\"\n" |
|
2272 | 2272 | msgstr "" |
|
2273 | 2273 | |
|
2274 |
#: rhodecode/lib/helpers.py:190 |
|
|
2274 | #: rhodecode/lib/helpers.py:1907 | |
|
2275 | 2275 | #, python-format |
|
2276 | 2276 | msgid "%s repository is not mapped to db perhaps it was created or renamed from the filesystem please run the application again in order to rescan repositories" |
|
2277 | 2277 | msgstr "" |
@@ -2760,7 +2760,7 b' msgstr ""' | |||
|
2760 | 2760 | #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3011 |
|
2761 | 2761 | #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3012 |
|
2762 | 2762 | #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3230 rhodecode/model/db.py:3997 |
|
2763 |
#: rhodecode/public/js/scripts.js:42 |
|
|
2763 | #: rhodecode/public/js/scripts.js:42733 rhodecode/public/js/scripts.min.js:1 | |
|
2764 | 2764 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:72 |
|
2765 | 2765 | #: rhodecode/public/js/src/rhodecode/pullrequests.js:396 |
|
2766 | 2766 | msgid "Not Reviewed" |
@@ -3520,7 +3520,7 b' msgstr ""' | |||
|
3520 | 3520 | #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2358 |
|
3521 | 3521 | #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2359 |
|
3522 | 3522 | #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2559 rhodecode/model/db.py:3174 |
|
3523 |
#: rhodecode/model/permission.py:10 |
|
|
3523 | #: rhodecode/model/permission.py:107 | |
|
3524 | 3524 | msgid "Manual activation of external account" |
|
3525 | 3525 | msgstr "" |
|
3526 | 3526 | |
@@ -3560,7 +3560,7 b' msgstr ""' | |||
|
3560 | 3560 | #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2359 |
|
3561 | 3561 | #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2360 |
|
3562 | 3562 | #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2560 rhodecode/model/db.py:3175 |
|
3563 |
#: rhodecode/model/permission.py:10 |
|
|
3563 | #: rhodecode/model/permission.py:108 | |
|
3564 | 3564 | msgid "Automatic activation of external account" |
|
3565 | 3565 | msgstr "" |
|
3566 | 3566 | |
@@ -3986,51 +3986,51 b' msgstr ""' | |||
|
3986 | 3986 | msgid "Commit index" |
|
3987 | 3987 | msgstr "" |
|
3988 | 3988 | |
|
3989 |
#: rhodecode/lib/vcs/backends/base.py:1 |
|
|
3989 | #: rhodecode/lib/vcs/backends/base.py:190 | |
|
3990 | 3990 | msgid "This pull request can be automatically merged." |
|
3991 | 3991 | msgstr "" |
|
3992 | 3992 | |
|
3993 |
#: rhodecode/lib/vcs/backends/base.py:1 |
|
|
3993 | #: rhodecode/lib/vcs/backends/base.py:192 | |
|
3994 | 3994 | msgid "This pull request cannot be merged because of an unhandled exception. {exception}" |
|
3995 | 3995 | msgstr "" |
|
3996 | 3996 | |
|
3997 |
#: rhodecode/lib/vcs/backends/base.py:19 |
|
|
3997 | #: rhodecode/lib/vcs/backends/base.py:195 | |
|
3998 | 3998 | msgid "This pull request cannot be merged because of merge conflicts. {unresolved_files}" |
|
3999 | 3999 | msgstr "" |
|
4000 | 4000 | |
|
4001 |
#: rhodecode/lib/vcs/backends/base.py:19 |
|
|
4001 | #: rhodecode/lib/vcs/backends/base.py:197 | |
|
4002 | 4002 | msgid "This pull request could not be merged because push to target:`{target}@{merge_commit}` failed." |
|
4003 | 4003 | msgstr "" |
|
4004 | 4004 | |
|
4005 |
#: rhodecode/lib/vcs/backends/base.py: |
|
|
4005 | #: rhodecode/lib/vcs/backends/base.py:200 | |
|
4006 | 4006 | msgid "This pull request cannot be merged because the target `{target_ref.name}` is not a head." |
|
4007 | 4007 | msgstr "" |
|
4008 | 4008 | |
|
4009 |
#: rhodecode/lib/vcs/backends/base.py: |
|
|
4009 | #: rhodecode/lib/vcs/backends/base.py:203 | |
|
4010 | 4010 | msgid "This pull request cannot be merged because the source contains more branches than the target." |
|
4011 | 4011 | msgstr "" |
|
4012 | 4012 | |
|
4013 |
#: rhodecode/lib/vcs/backends/base.py:20 |
|
|
4013 | #: rhodecode/lib/vcs/backends/base.py:206 | |
|
4014 | 4014 | msgid "This pull request cannot be merged because the target `{target_ref.name}` has multiple heads: `{heads}`." |
|
4015 | 4015 | msgstr "" |
|
4016 | 4016 | |
|
4017 | #: rhodecode/lib/vcs/backends/base.py:205 | |
|
4018 | msgid "This pull request cannot be merged because the target repository is locked by {locked_by}." | |
|
4019 | msgstr "" | |
|
4020 | ||
|
4021 | 4017 | #: rhodecode/lib/vcs/backends/base.py:209 |
|
4018 | msgid "This pull request cannot be merged because the target repository is locked by {locked_by}." | |
|
4019 | msgstr "" | |
|
4020 | ||
|
4021 | #: rhodecode/lib/vcs/backends/base.py:213 | |
|
4022 | 4022 | msgid "This pull request cannot be merged because the target reference `{target_ref.name}` is missing." |
|
4023 | 4023 | msgstr "" |
|
4024 | 4024 | |
|
4025 |
#: rhodecode/lib/vcs/backends/base.py:21 |
|
|
4025 | #: rhodecode/lib/vcs/backends/base.py:216 | |
|
4026 | 4026 | msgid "This pull request cannot be merged because the source reference `{source_ref.name}` is missing." |
|
4027 | 4027 | msgstr "" |
|
4028 | 4028 | |
|
4029 |
#: rhodecode/lib/vcs/backends/base.py:21 |
|
|
4029 | #: rhodecode/lib/vcs/backends/base.py:219 | |
|
4030 | 4030 | msgid "This pull request cannot be merged because of conflicts related to sub repositories." |
|
4031 | 4031 | msgstr "" |
|
4032 | 4032 | |
|
4033 |
#: rhodecode/lib/vcs/backends/base.py:22 |
|
|
4033 | #: rhodecode/lib/vcs/backends/base.py:224 | |
|
4034 | 4034 | msgid "This pull request cannot be merged because the target or the source reference is missing." |
|
4035 | 4035 | msgstr "" |
|
4036 | 4036 | |
@@ -4138,8 +4138,8 b' msgstr ""' | |||
|
4138 | 4138 | msgid "%(user)s commented on pull request at %(date_or_age)s" |
|
4139 | 4139 | msgstr "" |
|
4140 | 4140 | |
|
4141 |
#: rhodecode/model/permission.py:7 |
|
|
4142 |
#: rhodecode/model/permission.py:8 |
|
|
4141 | #: rhodecode/model/permission.py:73 rhodecode/model/permission.py:79 | |
|
4142 | #: rhodecode/model/permission.py:85 | |
|
4143 | 4143 | #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:11 |
|
4144 | 4144 | #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:217 |
|
4145 | 4145 | #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:11 |
@@ -4147,27 +4147,27 b' msgstr ""' | |||
|
4147 | 4147 | msgid "None" |
|
4148 | 4148 | msgstr "" |
|
4149 | 4149 | |
|
4150 |
#: rhodecode/model/permission.py:7 |
|
|
4151 |
#: rhodecode/model/permission.py:8 |
|
|
4150 | #: rhodecode/model/permission.py:74 rhodecode/model/permission.py:80 | |
|
4151 | #: rhodecode/model/permission.py:86 | |
|
4152 | 4152 | #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:12 |
|
4153 | 4153 | #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:12 |
|
4154 | 4154 | #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:16 |
|
4155 | 4155 | msgid "Read" |
|
4156 | 4156 | msgstr "" |
|
4157 | 4157 | |
|
4158 |
#: rhodecode/model/permission.py:7 |
|
|
4159 |
#: rhodecode/model/permission.py:8 |
|
|
4158 | #: rhodecode/model/permission.py:75 rhodecode/model/permission.py:81 | |
|
4159 | #: rhodecode/model/permission.py:87 | |
|
4160 | 4160 | #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:13 |
|
4161 | 4161 | #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:13 |
|
4162 | 4162 | #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:17 |
|
4163 | 4163 | #: rhodecode/templates/changeset/changeset_file_comment.mako:392 |
|
4164 | 4164 | #: rhodecode/templates/changeset/changeset_file_comment.mako:443 |
|
4165 |
#: rhodecode/templates/data_table/_dt_elements.mako:4 |
|
|
4165 | #: rhodecode/templates/data_table/_dt_elements.mako:460 | |
|
4166 | 4166 | msgid "Write" |
|
4167 | 4167 | msgstr "" |
|
4168 | 4168 | |
|
4169 |
#: rhodecode/model/permission.py:7 |
|
|
4170 |
#: rhodecode/model/permission.py:8 |
|
|
4169 | #: rhodecode/model/permission.py:76 rhodecode/model/permission.py:82 | |
|
4170 | #: rhodecode/model/permission.py:88 | |
|
4171 | 4171 | #: rhodecode/templates/admin/auth/plugin_settings.mako:12 |
|
4172 | 4172 | #: rhodecode/templates/admin/defaults/defaults.mako:12 |
|
4173 | 4173 | #: rhodecode/templates/admin/integrations/base.mako:21 |
@@ -4189,51 +4189,51 b' msgstr ""' | |||
|
4189 | 4189 | #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:18 |
|
4190 | 4190 | #: rhodecode/templates/admin/users/user_add.mako:11 |
|
4191 | 4191 | #: rhodecode/templates/admin/users/user_edit.mako:12 |
|
4192 |
#: rhodecode/templates/base/base.mako:83 |
|
|
4192 | #: rhodecode/templates/base/base.mako:839 | |
|
4193 | 4193 | msgid "Admin" |
|
4194 | 4194 | msgstr "" |
|
4195 | 4195 | |
|
4196 | #: rhodecode/model/permission.py:89 | |
|
4197 | msgid "Protected/No Access" | |
|
4198 | msgstr "" | |
|
4199 | ||
|
4200 | #: rhodecode/model/permission.py:90 | |
|
4201 | msgid "Web merge" | |
|
4202 | msgstr "" | |
|
4203 | ||
|
4204 | 4196 | #: rhodecode/model/permission.py:91 |
|
4205 | msgid "Push" | |
|
4197 | msgid "Protected/No Access" | |
|
4206 | 4198 | msgstr "" |
|
4207 | 4199 | |
|
4208 | 4200 | #: rhodecode/model/permission.py:92 |
|
4201 | msgid "Web merge" | |
|
4202 | msgstr "" | |
|
4203 | ||
|
4204 | #: rhodecode/model/permission.py:93 | |
|
4205 | msgid "Push" | |
|
4206 | msgstr "" | |
|
4207 | ||
|
4208 | #: rhodecode/model/permission.py:94 | |
|
4209 | 4209 | msgid "Force Push" |
|
4210 | 4210 | msgstr "" |
|
4211 | 4211 | |
|
4212 |
#: rhodecode/model/permission.py:9 |
|
|
4213 |
#: rhodecode/model/permission.py:11 |
|
|
4214 |
#: rhodecode/model/permission.py:12 |
|
|
4215 |
#: rhodecode/model/permission.py:1 |
|
|
4212 | #: rhodecode/model/permission.py:97 rhodecode/model/permission.py:111 | |
|
4213 | #: rhodecode/model/permission.py:115 rhodecode/model/permission.py:119 | |
|
4214 | #: rhodecode/model/permission.py:123 rhodecode/model/permission.py:127 | |
|
4215 | #: rhodecode/model/permission.py:131 | |
|
4216 | 4216 | #: rhodecode/templates/admin/my_account/my_account_notifications.mako:27 |
|
4217 | 4217 | msgid "Disabled" |
|
4218 | 4218 | msgstr "" |
|
4219 | 4219 | |
|
4220 |
#: rhodecode/model/permission.py:9 |
|
|
4220 | #: rhodecode/model/permission.py:98 | |
|
4221 | 4221 | msgid "Allowed with manual account activation" |
|
4222 | 4222 | msgstr "" |
|
4223 | 4223 | |
|
4224 |
#: rhodecode/model/permission.py:9 |
|
|
4224 | #: rhodecode/model/permission.py:99 | |
|
4225 | 4225 | msgid "Allowed with automatic account activation" |
|
4226 | 4226 | msgstr "" |
|
4227 | 4227 | |
|
4228 | #: rhodecode/model/permission.py:100 | |
|
4229 | msgid "Allow password recovery" | |
|
4230 | msgstr "" | |
|
4231 | ||
|
4232 | #: rhodecode/model/permission.py:101 | |
|
4233 | msgid "Hide password recovery link" | |
|
4234 | msgstr "" | |
|
4235 | ||
|
4236 | 4228 | #: rhodecode/model/permission.py:102 |
|
4229 | msgid "Allow password recovery" | |
|
4230 | msgstr "" | |
|
4231 | ||
|
4232 | #: rhodecode/model/permission.py:103 | |
|
4233 | msgid "Hide password recovery link" | |
|
4234 | msgstr "" | |
|
4235 | ||
|
4236 | #: rhodecode/model/permission.py:104 | |
|
4237 | 4237 | msgid "Disable password recovery" |
|
4238 | 4238 | msgstr "" |
|
4239 | 4239 | |
@@ -4261,79 +4261,79 b' msgstr ""' | |||
|
4261 | 4261 | msgid "This pull request cannot be updated because the source reference is missing." |
|
4262 | 4262 | msgstr "" |
|
4263 | 4263 | |
|
4264 |
#: rhodecode/model/pull_request.py:16 |
|
|
4264 | #: rhodecode/model/pull_request.py:1690 | |
|
4265 | 4265 | msgid "Server-side pull request merging is disabled." |
|
4266 | 4266 | msgstr "" |
|
4267 | 4267 | |
|
4268 |
#: rhodecode/model/pull_request.py:169 |
|
|
4268 | #: rhodecode/model/pull_request.py:1693 | |
|
4269 | 4269 | msgid "This pull request is closed." |
|
4270 | 4270 | msgstr "" |
|
4271 | 4271 | |
|
4272 |
#: rhodecode/model/pull_request.py:170 |
|
|
4272 | #: rhodecode/model/pull_request.py:1707 | |
|
4273 | 4273 | msgid "Pull request merging is not supported." |
|
4274 | 4274 | msgstr "" |
|
4275 | 4275 | |
|
4276 |
#: rhodecode/model/pull_request.py:172 |
|
|
4276 | #: rhodecode/model/pull_request.py:1724 | |
|
4277 | 4277 | msgid "Target repository large files support is disabled." |
|
4278 | 4278 | msgstr "" |
|
4279 | 4279 | |
|
4280 |
#: rhodecode/model/pull_request.py:172 |
|
|
4280 | #: rhodecode/model/pull_request.py:1727 | |
|
4281 | 4281 | msgid "Source repository large files support is disabled." |
|
4282 | 4282 | msgstr "" |
|
4283 | 4283 | |
|
4284 |
#: rhodecode/model/pull_request.py:19 |
|
|
4284 | #: rhodecode/model/pull_request.py:1911 rhodecode/model/scm.py:1008 | |
|
4285 | 4285 | #: rhodecode/templates/admin/my_account/my_account.mako:32 |
|
4286 |
#: rhodecode/templates/base/base.mako:63 |
|
|
4286 | #: rhodecode/templates/base/base.mako:639 | |
|
4287 | 4287 | #: rhodecode/templates/summary/components.mako:46 |
|
4288 | 4288 | msgid "Bookmarks" |
|
4289 | 4289 | msgstr "" |
|
4290 | 4290 | |
|
4291 |
#: rhodecode/model/pull_request.py:191 |
|
|
4291 | #: rhodecode/model/pull_request.py:1916 | |
|
4292 | 4292 | msgid "Commit IDs" |
|
4293 | 4293 | msgstr "" |
|
4294 | 4294 | |
|
4295 |
#: rhodecode/model/pull_request.py:191 |
|
|
4295 | #: rhodecode/model/pull_request.py:1919 | |
|
4296 | 4296 | #: rhodecode/templates/summary/components.mako:22 |
|
4297 | 4297 | msgid "Closed Branches" |
|
4298 | 4298 | msgstr "" |
|
4299 | 4299 | |
|
4300 |
#: rhodecode/model/pull_request.py:210 |
|
|
4300 | #: rhodecode/model/pull_request.py:2105 | |
|
4301 | 4301 | msgid "WIP marker in title prevents from accidental merge." |
|
4302 | 4302 | msgstr "" |
|
4303 | 4303 | |
|
4304 |
#: rhodecode/model/pull_request.py:211 |
|
|
4304 | #: rhodecode/model/pull_request.py:2115 | |
|
4305 | 4305 | msgid "User `{}` not allowed to perform merge." |
|
4306 | 4306 | msgstr "" |
|
4307 | 4307 | |
|
4308 |
#: rhodecode/model/pull_request.py:213 |
|
|
4308 | #: rhodecode/model/pull_request.py:2133 | |
|
4309 | 4309 | msgid "Target branch `{}` changes rejected by rule {}." |
|
4310 | 4310 | msgstr "" |
|
4311 | 4311 | |
|
4312 |
#: rhodecode/model/pull_request.py:214 |
|
|
4312 | #: rhodecode/model/pull_request.py:2148 | |
|
4313 | 4313 | msgid "Pull request reviewer approval is pending." |
|
4314 | 4314 | msgstr "" |
|
4315 | 4315 | |
|
4316 |
#: rhodecode/model/pull_request.py:216 |
|
|
4316 | #: rhodecode/model/pull_request.py:2162 | |
|
4317 | 4317 | msgid "Cannot merge, {} TODO still not resolved." |
|
4318 | 4318 | msgstr "" |
|
4319 | 4319 | |
|
4320 |
#: rhodecode/model/pull_request.py:216 |
|
|
4320 | #: rhodecode/model/pull_request.py:2165 | |
|
4321 | 4321 | msgid "Cannot merge, {} TODOs still not resolved." |
|
4322 | 4322 | msgstr "" |
|
4323 | 4323 | |
|
4324 |
#: rhodecode/model/pull_request.py:22 |
|
|
4324 | #: rhodecode/model/pull_request.py:2220 | |
|
4325 | 4325 | msgid "Merge strategy: rebase" |
|
4326 | 4326 | msgstr "" |
|
4327 | 4327 | |
|
4328 |
#: rhodecode/model/pull_request.py:222 |
|
|
4328 | #: rhodecode/model/pull_request.py:2225 | |
|
4329 | 4329 | msgid "Merge strategy: explicit merge commit" |
|
4330 | 4330 | msgstr "" |
|
4331 | 4331 | |
|
4332 | #: rhodecode/model/pull_request.py:2231 | |
|
4333 | msgid "Source branch will be closed before the merge." | |
|
4334 | msgstr "" | |
|
4335 | ||
|
4336 | 4332 | #: rhodecode/model/pull_request.py:2233 |
|
4333 | msgid "Source branch will be closed before the merge." | |
|
4334 | msgstr "" | |
|
4335 | ||
|
4336 | #: rhodecode/model/pull_request.py:2235 | |
|
4337 | 4337 | msgid "Source branch will be deleted after the merge." |
|
4338 | 4338 | msgstr "" |
|
4339 | 4339 | |
@@ -4880,129 +4880,133 b' msgstr ""' | |||
|
4880 | 4880 | msgid "Note Comment" |
|
4881 | 4881 | msgstr "" |
|
4882 | 4882 | |
|
4883 |
#: rhodecode/public/js/scripts.js:39599 rhodecode/public/js/scripts.js:3998 |
|
|
4883 | #: rhodecode/public/js/scripts.js:39599 rhodecode/public/js/scripts.js:39985 | |
|
4884 | 4884 | #: rhodecode/public/js/scripts.min.js:1 |
|
4885 | 4885 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:103 |
|
4886 | 4886 | #: rhodecode/public/js/src/rhodecode/codemirror.js:730 |
|
4887 |
#: rhodecode/public/js/src/rhodecode/comments.js:26 |
|
|
4887 | #: rhodecode/public/js/src/rhodecode/comments.js:265 | |
|
4888 | 4888 | msgid "Status Review" |
|
4889 | 4889 | msgstr "" |
|
4890 | 4890 | |
|
4891 |
#: rhodecode/public/js/scripts.js:39614 rhodecode/public/js/scripts.js:4000 |
|
|
4891 | #: rhodecode/public/js/scripts.js:39614 rhodecode/public/js/scripts.js:40002 | |
|
4892 | 4892 | #: rhodecode/public/js/scripts.min.js:1 |
|
4893 | 4893 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:24 |
|
4894 | 4894 | #: rhodecode/public/js/src/rhodecode/codemirror.js:745 |
|
4895 |
#: rhodecode/public/js/src/rhodecode/comments.js:28 |
|
|
4895 | #: rhodecode/public/js/src/rhodecode/comments.js:282 | |
|
4896 | 4896 | msgid "Comment text will be set automatically based on currently selected status ({0}) ..." |
|
4897 | 4897 | msgstr "" |
|
4898 | 4898 | |
|
4899 |
#: rhodecode/public/js/scripts.js:39695 rhodecode/public/js/scripts.js:4021 |
|
|
4900 |
#: rhodecode/public/js/scripts.js:41 |
|
|
4899 | #: rhodecode/public/js/scripts.js:39695 rhodecode/public/js/scripts.js:40211 | |
|
4900 | #: rhodecode/public/js/scripts.js:41883 rhodecode/public/js/scripts.min.js:1 | |
|
4901 | 4901 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:49 |
|
4902 | 4902 | #: rhodecode/public/js/src/rhodecode/codemirror.js:826 |
|
4903 |
#: rhodecode/public/js/src/rhodecode/comments.js:49 |
|
|
4903 | #: rhodecode/public/js/src/rhodecode/comments.js:491 | |
|
4904 | 4904 | #: rhodecode/public/js/src/rhodecode/files.js:499 |
|
4905 | 4905 | #: rhodecode/templates/files/files_browser_tree.mako:57 |
|
4906 | 4906 | msgid "Loading ..." |
|
4907 | 4907 | msgstr "" |
|
4908 | 4908 | |
|
4909 |
#: rhodecode/public/js/scripts.js:398 |
|
|
4909 | #: rhodecode/public/js/scripts.js:39859 rhodecode/public/js/scripts.min.js:1 | |
|
4910 | 4910 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:123 |
|
4911 |
#: rhodecode/public/js/src/rhodecode/comments.js:1 |
|
|
4911 | #: rhodecode/public/js/src/rhodecode/comments.js:139 | |
|
4912 | 4912 | msgid "Update Comment" |
|
4913 | 4913 | msgstr "" |
|
4914 | 4914 | |
|
4915 |
#: rhodecode/public/js/scripts.js:3988 |
|
|
4915 | #: rhodecode/public/js/scripts.js:39883 rhodecode/public/js/scripts.min.js:1 | |
|
4916 | 4916 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:150 |
|
4917 |
#: rhodecode/public/js/src/rhodecode/comments.js:16 |
|
|
4917 | #: rhodecode/public/js/src/rhodecode/comments.js:163 | |
|
4918 | 4918 | msgid "resolve comment" |
|
4919 | 4919 | msgstr "" |
|
4920 | 4920 | |
|
4921 | #: rhodecode/public/js/scripts.js:40155 rhodecode/public/js/scripts.min.js:1 | |
|
4922 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:83 | |
|
4923 | #: rhodecode/public/js/src/rhodecode/comments.js:435 | |
|
4924 | msgid "Saving Draft..." | |
|
4925 | msgstr "" | |
|
4926 | ||
|
4921 | 4927 | #: rhodecode/public/js/scripts.js:40157 rhodecode/public/js/scripts.min.js:1 |
|
4922 |
#: rhodecode/public/js/rhodecode/i18n/js_translations.js:8 |
|
|
4928 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:108 | |
|
4923 | 4929 | #: rhodecode/public/js/src/rhodecode/comments.js:437 |
|
4924 | msgid "Saving Draft..." | |
|
4925 | msgstr "" | |
|
4926 | ||
|
4927 | #: rhodecode/public/js/scripts.js:40159 rhodecode/public/js/scripts.min.js:1 | |
|
4928 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:108 | |
|
4929 | #: rhodecode/public/js/src/rhodecode/comments.js:439 | |
|
4930 | 4930 | msgid "Submitting..." |
|
4931 | 4931 | msgstr "" |
|
4932 | 4932 | |
|
4933 |
#: rhodecode/public/js/scripts.js:404 |
|
|
4933 | #: rhodecode/public/js/scripts.js:40479 rhodecode/public/js/scripts.min.js:1 | |
|
4934 | 4934 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:131 |
|
4935 |
#: rhodecode/public/js/src/rhodecode/comments.js:7 |
|
|
4935 | #: rhodecode/public/js/src/rhodecode/comments.js:759 | |
|
4936 | 4936 | msgid "Yes, delete comment #{0}!" |
|
4937 | 4937 | msgstr "" |
|
4938 | 4938 | |
|
4939 |
#: rhodecode/public/js/scripts.js:4052 |
|
|
4939 | #: rhodecode/public/js/scripts.js:40524 rhodecode/public/js/scripts.min.js:1 | |
|
4940 | 4940 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:106 |
|
4941 |
#: rhodecode/public/js/src/rhodecode/comments.js:80 |
|
|
4941 | #: rhodecode/public/js/src/rhodecode/comments.js:804 | |
|
4942 | 4942 | msgid "Submit {0} draft comment." |
|
4943 | 4943 | msgstr "" |
|
4944 | 4944 | |
|
4945 |
#: rhodecode/public/js/scripts.js:4052 |
|
|
4945 | #: rhodecode/public/js/scripts.js:40527 rhodecode/public/js/scripts.js:41225 | |
|
4946 | #: rhodecode/public/js/scripts.min.js:1 | |
|
4946 | 4947 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:130 |
|
4947 |
#: rhodecode/public/js/src/rhodecode/comments.js:80 |
|
|
4948 | #: rhodecode/public/js/src/rhodecode/comments.js:807 | |
|
4949 | #: rhodecode/public/js/src/rhodecode/comments.js:1505 | |
|
4948 | 4950 | msgid "Yes" |
|
4949 | 4951 | msgstr "" |
|
4950 | 4952 | |
|
4951 |
#: rhodecode/public/js/scripts.js:406 |
|
|
4953 | #: rhodecode/public/js/scripts.js:40619 rhodecode/public/js/scripts.min.js:1 | |
|
4952 | 4954 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:47 |
|
4953 |
#: rhodecode/public/js/src/rhodecode/comments.js: |
|
|
4955 | #: rhodecode/public/js/src/rhodecode/comments.js:899 | |
|
4954 | 4956 | msgid "Leave a resolution comment, or click resolve button to resolve TODO comment #{0}" |
|
4955 | 4957 | msgstr "" |
|
4956 | 4958 | |
|
4957 |
#: rhodecode/public/js/scripts.js:4082 |
|
|
4959 | #: rhodecode/public/js/scripts.js:40823 rhodecode/public/js/scripts.min.js:1 | |
|
4958 | 4960 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:23 |
|
4959 |
#: rhodecode/public/js/src/rhodecode/comments.js:110 |
|
|
4961 | #: rhodecode/public/js/src/rhodecode/comments.js:1103 | |
|
4960 | 4962 | msgid "Comment body was not changed." |
|
4961 | 4963 | msgstr "" |
|
4962 | 4964 | |
|
4963 |
#: rhodecode/public/js/scripts.js:4107 |
|
|
4965 | #: rhodecode/public/js/scripts.js:41074 rhodecode/public/js/scripts.min.js:1 | |
|
4964 | 4966 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:44 |
|
4965 |
#: rhodecode/public/js/src/rhodecode/comments.js:135 |
|
|
4967 | #: rhodecode/public/js/src/rhodecode/comments.js:1354 | |
|
4966 | 4968 | msgid "Leave a comment on file {0} line {1}." |
|
4967 | 4969 | msgstr "" |
|
4968 | 4970 | |
|
4969 |
#: rhodecode/public/js/scripts.js:4121 |
|
|
4971 | #: rhodecode/public/js/scripts.js:41214 rhodecode/public/js/scripts.js:41267 | |
|
4972 | #: rhodecode/public/js/scripts.min.js:1 | |
|
4970 | 4973 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:113 |
|
4971 |
#: rhodecode/public/js/src/rhodecode/comments.js:149 |
|
|
4974 | #: rhodecode/public/js/src/rhodecode/comments.js:1494 | |
|
4975 | #: rhodecode/public/js/src/rhodecode/comments.js:1547 | |
|
4972 | 4976 | msgid "TODO from comment {0} was fixed." |
|
4973 | 4977 | msgstr "" |
|
4974 | 4978 | |
|
4975 |
#: rhodecode/public/js/scripts.js:41 |
|
|
4979 | #: rhodecode/public/js/scripts.js:41632 rhodecode/public/js/scripts.min.js:1 | |
|
4976 | 4980 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:154 |
|
4977 | 4981 | #: rhodecode/public/js/src/rhodecode/files.js:248 |
|
4978 | 4982 | msgid "truncated result" |
|
4979 | 4983 | msgstr "" |
|
4980 | 4984 | |
|
4981 |
#: rhodecode/public/js/scripts.js:41 |
|
|
4985 | #: rhodecode/public/js/scripts.js:41634 rhodecode/public/js/scripts.min.js:1 | |
|
4982 | 4986 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:155 |
|
4983 | 4987 | #: rhodecode/public/js/src/rhodecode/files.js:250 |
|
4984 | 4988 | msgid "truncated results" |
|
4985 | 4989 | msgstr "" |
|
4986 | 4990 | |
|
4987 |
#: rhodecode/public/js/scripts.js:41 |
|
|
4991 | #: rhodecode/public/js/scripts.js:41643 rhodecode/public/js/scripts.min.js:1 | |
|
4988 | 4992 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:60 |
|
4989 | 4993 | #: rhodecode/public/js/src/rhodecode/files.js:259 |
|
4990 | 4994 | msgid "No matching files" |
|
4991 | 4995 | msgstr "" |
|
4992 | 4996 | |
|
4993 |
#: rhodecode/public/js/scripts.js:41 |
|
|
4997 | #: rhodecode/public/js/scripts.js:41701 rhodecode/public/js/scripts.min.js:1 | |
|
4994 | 4998 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:86 |
|
4995 | 4999 | #: rhodecode/public/js/src/rhodecode/files.js:317 |
|
4996 | 5000 | msgid "Selection link" |
|
4997 | 5001 | msgstr "" |
|
4998 | 5002 | |
|
4999 |
#: rhodecode/public/js/scripts.js:41 |
|
|
5003 | #: rhodecode/public/js/scripts.js:41798 rhodecode/public/js/scripts.min.js:1 | |
|
5000 | 5004 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:10 |
|
5001 | 5005 | #: rhodecode/public/js/src/rhodecode/files.js:414 |
|
5002 | 5006 | msgid "All Authors" |
|
5003 | 5007 | msgstr "" |
|
5004 | 5008 | |
|
5005 |
#: rhodecode/public/js/scripts.js:418 |
|
|
5009 | #: rhodecode/public/js/scripts.js:41948 rhodecode/public/js/scripts.js:41951 | |
|
5006 | 5010 | #: rhodecode/public/js/scripts.min.js:1 |
|
5007 | 5011 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:38 |
|
5008 | 5012 | #: rhodecode/public/js/src/rhodecode/files.js:564 |
@@ -5010,141 +5014,141 b' msgstr ""' | |||
|
5010 | 5014 | msgid "File `{0}` has a newer version available, or has been removed. Click {1} to see the latest version." |
|
5011 | 5015 | msgstr "" |
|
5012 | 5016 | |
|
5013 |
#: rhodecode/public/js/scripts.js:41 |
|
|
5017 | #: rhodecode/public/js/scripts.js:41954 rhodecode/public/js/scripts.min.js:1 | |
|
5014 | 5018 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:117 |
|
5015 | 5019 | #: rhodecode/public/js/src/rhodecode/files.js:570 |
|
5016 | 5020 | msgid "There is an existing path `{0}` at this commit." |
|
5017 | 5021 | msgstr "" |
|
5018 | 5022 | |
|
5019 |
#: rhodecode/public/js/scripts.js:41 |
|
|
5023 | #: rhodecode/public/js/scripts.js:41957 rhodecode/public/js/scripts.min.js:1 | |
|
5020 | 5024 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:116 |
|
5021 | 5025 | #: rhodecode/public/js/src/rhodecode/files.js:573 |
|
5022 | 5026 | msgid "There is a later version of file tree available. Click {0} to create a file at the latest tree." |
|
5023 | 5027 | msgstr "" |
|
5024 | 5028 | |
|
5025 |
#: rhodecode/public/js/scripts.js:4 |
|
|
5029 | #: rhodecode/public/js/scripts.js:42011 rhodecode/public/js/scripts.min.js:1 | |
|
5026 | 5030 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:105 |
|
5027 | 5031 | #: rhodecode/public/js/src/rhodecode/followers.js:26 |
|
5028 | 5032 | msgid "Stopped watching this repository" |
|
5029 | 5033 | msgstr "" |
|
5030 | 5034 | |
|
5031 |
#: rhodecode/public/js/scripts.js:4 |
|
|
5035 | #: rhodecode/public/js/scripts.js:42012 rhodecode/public/js/scripts.min.js:1 | |
|
5032 | 5036 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:129 |
|
5033 | 5037 | #: rhodecode/public/js/src/rhodecode/followers.js:27 |
|
5034 |
#: rhodecode/templates/base/base.mako:31 |
|
|
5038 | #: rhodecode/templates/base/base.mako:311 | |
|
5035 | 5039 | msgid "Watch" |
|
5036 | 5040 | msgstr "" |
|
5037 | 5041 | |
|
5038 |
#: rhodecode/public/js/scripts.js:4 |
|
|
5042 | #: rhodecode/public/js/scripts.js:42015 rhodecode/public/js/scripts.min.js:1 | |
|
5039 | 5043 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:102 |
|
5040 | 5044 | #: rhodecode/public/js/src/rhodecode/followers.js:30 |
|
5041 | 5045 | msgid "Started watching this repository" |
|
5042 | 5046 | msgstr "" |
|
5043 | 5047 | |
|
5044 |
#: rhodecode/public/js/scripts.js:4 |
|
|
5048 | #: rhodecode/public/js/scripts.js:42016 rhodecode/public/js/scripts.min.js:1 | |
|
5045 | 5049 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:122 |
|
5046 | 5050 | #: rhodecode/public/js/src/rhodecode/followers.js:31 |
|
5047 |
#: rhodecode/templates/base/base.mako:30 |
|
|
5051 | #: rhodecode/templates/base/base.mako:309 | |
|
5048 | 5052 | msgid "Unwatch" |
|
5049 | 5053 | msgstr "" |
|
5050 | 5054 | |
|
5051 |
#: rhodecode/public/js/scripts.js:42 |
|
|
5055 | #: rhodecode/public/js/scripts.js:42522 rhodecode/public/js/scripts.min.js:1 | |
|
5052 | 5056 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:12 |
|
5053 | 5057 | #: rhodecode/public/js/src/rhodecode/pullrequests.js:185 |
|
5054 | 5058 | msgid "All reviewers must vote." |
|
5055 | 5059 | msgstr "" |
|
5056 | 5060 | |
|
5057 |
#: rhodecode/public/js/scripts.js:42 |
|
|
5061 | #: rhodecode/public/js/scripts.js:42546 rhodecode/public/js/scripts.min.js:1 | |
|
5058 | 5062 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:54 |
|
5059 | 5063 | #: rhodecode/public/js/src/rhodecode/pullrequests.js:209 |
|
5060 | 5064 | msgid "No additional review rules set." |
|
5061 | 5065 | msgstr "" |
|
5062 | 5066 | |
|
5063 |
#: rhodecode/public/js/scripts.js:42 |
|
|
5067 | #: rhodecode/public/js/scripts.js:42592 rhodecode/public/js/scripts.min.js:1 | |
|
5064 | 5068 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:50 |
|
5065 | 5069 | #: rhodecode/public/js/src/rhodecode/pullrequests.js:255 |
|
5066 | 5070 | msgid "Loading diff ..." |
|
5067 | 5071 | msgstr "" |
|
5068 | 5072 | |
|
5069 |
#: rhodecode/public/js/scripts.js:425 |
|
|
5073 | #: rhodecode/public/js/scripts.js:42645 rhodecode/public/js/scripts.min.js:1 | |
|
5070 | 5074 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:115 |
|
5071 | 5075 | #: rhodecode/public/js/src/rhodecode/pullrequests.js:308 |
|
5072 | 5076 | msgid "There are no commits to merge." |
|
5073 | 5077 | msgstr "" |
|
5074 | 5078 | |
|
5075 |
#: rhodecode/public/js/scripts.js:42 |
|
|
5079 | #: rhodecode/public/js/scripts.js:42717 rhodecode/public/js/scripts.min.js:1 | |
|
5076 | 5080 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:128 |
|
5077 | 5081 | #: rhodecode/public/js/src/rhodecode/pullrequests.js:380 |
|
5078 | 5082 | msgid "User `{0}` not allowed to be a reviewer" |
|
5079 | 5083 | msgstr "" |
|
5080 | 5084 | |
|
5081 |
#: rhodecode/public/js/scripts.js:42 |
|
|
5085 | #: rhodecode/public/js/scripts.js:42723 rhodecode/public/js/scripts.min.js:1 | |
|
5082 | 5086 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:127 |
|
5083 | 5087 | #: rhodecode/public/js/src/rhodecode/pullrequests.js:386 |
|
5084 | 5088 | msgid "User `{0}` already in reviewers/observers" |
|
5085 | 5089 | msgstr "" |
|
5086 | 5090 | |
|
5087 |
#: rhodecode/public/js/scripts.js:42 |
|
|
5091 | #: rhodecode/public/js/scripts.js:42838 rhodecode/public/js/scripts.min.js:1 | |
|
5088 | 5092 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:135 |
|
5089 | 5093 | #: rhodecode/public/js/src/rhodecode/pullrequests.js:501 |
|
5090 | 5094 | msgid "added manually by \"{0}\"" |
|
5091 | 5095 | msgstr "" |
|
5092 | 5096 | |
|
5093 |
#: rhodecode/public/js/scripts.js:42 |
|
|
5097 | #: rhodecode/public/js/scripts.js:42843 rhodecode/public/js/scripts.min.js:1 | |
|
5094 | 5098 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:147 |
|
5095 | 5099 | #: rhodecode/public/js/src/rhodecode/pullrequests.js:506 |
|
5096 | 5100 | msgid "member of \"{0}\"" |
|
5097 | 5101 | msgstr "" |
|
5098 | 5102 | |
|
5099 |
#: rhodecode/public/js/scripts.js:4 |
|
|
5103 | #: rhodecode/public/js/scripts.js:43076 rhodecode/public/js/scripts.min.js:1 | |
|
5100 | 5104 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:125 |
|
5101 | 5105 | #: rhodecode/public/js/src/rhodecode/pullrequests.js:739 |
|
5102 | 5106 | msgid "Updating..." |
|
5103 | 5107 | msgstr "" |
|
5104 | 5108 | |
|
5105 |
#: rhodecode/public/js/scripts.js:4 |
|
|
5109 | #: rhodecode/public/js/scripts.js:43086 rhodecode/public/js/scripts.min.js:1 | |
|
5106 | 5110 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:40 |
|
5107 | 5111 | #: rhodecode/public/js/src/rhodecode/pullrequests.js:749 |
|
5108 | 5112 | msgid "Force updating..." |
|
5109 | 5113 | msgstr "" |
|
5110 | 5114 | |
|
5111 |
#: rhodecode/public/js/scripts.js:47 |
|
|
5115 | #: rhodecode/public/js/scripts.js:47953 rhodecode/public/js/scripts.min.js:1 | |
|
5112 | 5116 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:98 |
|
5113 | 5117 | #: rhodecode/public/js/src/rhodecode/users.js:54 |
|
5114 | 5118 | msgid "Show this authentication token?" |
|
5115 | 5119 | msgstr "" |
|
5116 | 5120 | |
|
5117 |
#: rhodecode/public/js/scripts.js:47 |
|
|
5121 | #: rhodecode/public/js/scripts.js:47955 rhodecode/public/js/scripts.min.js:1 | |
|
5118 | 5122 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:90 |
|
5119 | 5123 | #: rhodecode/public/js/src/rhodecode/users.js:56 |
|
5120 | 5124 | msgid "Show" |
|
5121 | 5125 | msgstr "" |
|
5122 | 5126 | |
|
5123 |
#: rhodecode/public/js/scripts.js:47 |
|
|
5127 | #: rhodecode/public/js/scripts.js:47991 rhodecode/public/js/scripts.min.js:1 | |
|
5124 | 5128 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:16 |
|
5125 | 5129 | #: rhodecode/public/js/src/rhodecode/users.js:92 |
|
5126 | 5130 | msgid "Authentication Token" |
|
5127 | 5131 | msgstr "" |
|
5128 | 5132 | |
|
5129 |
#: rhodecode/public/js/scripts.js:480 |
|
|
5133 | #: rhodecode/public/js/scripts.js:48180 rhodecode/public/js/scripts.min.js:1 | |
|
5130 | 5134 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:139 |
|
5131 | 5135 | #: rhodecode/public/js/src/rhodecode.js:144 |
|
5132 | 5136 | msgid "file" |
|
5133 | 5137 | msgstr "" |
|
5134 | 5138 | |
|
5135 |
#: rhodecode/public/js/scripts.js:48 |
|
|
5139 | #: rhodecode/public/js/scripts.js:48324 rhodecode/public/js/scripts.min.js:1 | |
|
5136 | 5140 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:53 |
|
5137 | 5141 | #: rhodecode/public/js/src/rhodecode.js:288 |
|
5138 | 5142 | msgid "Loading..." |
|
5139 | 5143 | msgstr "" |
|
5140 | 5144 | |
|
5141 |
#: rhodecode/public/js/scripts.js:48 |
|
|
5145 | #: rhodecode/public/js/scripts.js:48706 rhodecode/public/js/scripts.min.js:1 | |
|
5142 | 5146 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:136 |
|
5143 | 5147 | #: rhodecode/public/js/src/rhodecode.js:670 |
|
5144 | 5148 | msgid "date not in future" |
|
5145 | 5149 | msgstr "" |
|
5146 | 5150 | |
|
5147 |
#: rhodecode/public/js/scripts.js:48 |
|
|
5151 | #: rhodecode/public/js/scripts.js:48714 rhodecode/public/js/scripts.min.js:1 | |
|
5148 | 5152 | #: rhodecode/public/js/rhodecode/i18n/js_translations.js:100 |
|
5149 | 5153 | #: rhodecode/public/js/src/rhodecode.js:678 |
|
5150 | 5154 | msgid "Specified expiration date" |
@@ -5737,8 +5741,8 b' msgid "%s Repository group dashboard"' | |||
|
5737 | 5741 | msgstr "" |
|
5738 | 5742 | |
|
5739 | 5743 | #: rhodecode/templates/index_repo_group.mako:13 |
|
5740 | #: rhodecode/templates/base/base.mako:810 | |
|
5741 | 5744 | #: rhodecode/templates/base/base.mako:811 |
|
5745 | #: rhodecode/templates/base/base.mako:812 | |
|
5742 | 5746 | msgid "Home" |
|
5743 | 5747 | msgstr "" |
|
5744 | 5748 | |
@@ -5933,9 +5937,9 b' msgstr ""' | |||
|
5933 | 5937 | #: rhodecode/templates/admin/admin_log_base.mako:10 |
|
5934 | 5938 | #: rhodecode/templates/admin/defaults/defaults.mako:32 |
|
5935 | 5939 | #: rhodecode/templates/admin/permissions/permissions_objects.mako:16 |
|
5936 |
#: rhodecode/templates/base/base.mako:65 |
|
|
5937 |
#: rhodecode/templates/base/base.mako:66 |
|
|
5938 |
#: rhodecode/templates/base/base.mako:66 |
|
|
5940 | #: rhodecode/templates/base/base.mako:659 | |
|
5941 | #: rhodecode/templates/base/base.mako:661 | |
|
5942 | #: rhodecode/templates/base/base.mako:663 | |
|
5939 | 5943 | #: rhodecode/templates/search/search_commit.mako:8 |
|
5940 | 5944 | #: rhodecode/templates/search/search_path.mako:7 |
|
5941 | 5945 | msgid "Repository" |
@@ -6261,7 +6265,7 b' msgid "Expires"' | |||
|
6261 | 6265 | msgstr "" |
|
6262 | 6266 | |
|
6263 | 6267 | #: rhodecode/templates/admin/gists/gist_new.mako:5 |
|
6264 |
#: rhodecode/templates/base/base.mako:57 |
|
|
6268 | #: rhodecode/templates/base/base.mako:578 | |
|
6265 | 6269 | msgid "New Gist" |
|
6266 | 6270 | msgstr "" |
|
6267 | 6271 | |
@@ -6353,7 +6357,7 b' msgstr ""' | |||
|
6353 | 6357 | #: rhodecode/templates/admin/integrations/new.mako:15 |
|
6354 | 6358 | #: rhodecode/templates/admin/repo_groups/repo_group_edit.mako:33 |
|
6355 | 6359 | #: rhodecode/templates/admin/repos/repo_edit.mako:74 |
|
6356 |
#: rhodecode/templates/base/base.mako:12 |
|
|
6360 | #: rhodecode/templates/base/base.mako:121 | |
|
6357 | 6361 | msgid "Integrations" |
|
6358 | 6362 | msgstr "" |
|
6359 | 6363 | |
@@ -6368,7 +6372,7 b' msgstr ""' | |||
|
6368 | 6372 | #: rhodecode/templates/admin/settings/settings.mako:14 |
|
6369 | 6373 | #: rhodecode/templates/admin/user_groups/user_group_edit.mako:34 |
|
6370 | 6374 | #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:9 |
|
6371 |
#: rhodecode/templates/base/base.mako:12 |
|
|
6375 | #: rhodecode/templates/base/base.mako:123 | |
|
6372 | 6376 | msgid "Settings" |
|
6373 | 6377 | msgstr "" |
|
6374 | 6378 | |
@@ -6469,7 +6473,7 b' msgid "No description available"' | |||
|
6469 | 6473 | msgstr "" |
|
6470 | 6474 | |
|
6471 | 6475 | #: rhodecode/templates/admin/my_account/my_account.mako:5 |
|
6472 |
#: rhodecode/templates/base/base.mako:62 |
|
|
6476 | #: rhodecode/templates/base/base.mako:623 | |
|
6473 | 6477 | msgid "My account" |
|
6474 | 6478 | msgstr "" |
|
6475 | 6479 | |
@@ -6520,15 +6524,15 b' msgstr ""' | |||
|
6520 | 6524 | |
|
6521 | 6525 | #: rhodecode/templates/admin/my_account/my_account.mako:45 |
|
6522 | 6526 | #: rhodecode/templates/admin/notifications/notifications_show_all.mako:42 |
|
6523 |
#: rhodecode/templates/base/base.mako:38 |
|
|
6524 |
#: rhodecode/templates/base/base.mako:62 |
|
|
6527 | #: rhodecode/templates/base/base.mako:386 | |
|
6528 | #: rhodecode/templates/base/base.mako:627 | |
|
6525 | 6529 | msgid "Pull Requests" |
|
6526 | 6530 | msgstr "" |
|
6527 | 6531 | |
|
6528 | 6532 | #: rhodecode/templates/admin/my_account/my_account.mako:46 |
|
6529 | 6533 | #: rhodecode/templates/admin/permissions/permissions.mako:14 |
|
6530 | 6534 | #: rhodecode/templates/admin/user_groups/user_group_edit.mako:35 |
|
6531 |
#: rhodecode/templates/base/base.mako:11 |
|
|
6535 | #: rhodecode/templates/base/base.mako:119 | |
|
6532 | 6536 | msgid "Permissions" |
|
6533 | 6537 | msgstr "" |
|
6534 | 6538 | |
@@ -7047,7 +7051,7 b' msgstr ""' | |||
|
7047 | 7051 | #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:14 |
|
7048 | 7052 | #: rhodecode/templates/admin/users/user_edit_advanced.mako:13 |
|
7049 | 7053 | #: rhodecode/templates/base/base.mako:115 |
|
7050 |
#: rhodecode/templates/base/base.mako:13 |
|
|
7054 | #: rhodecode/templates/base/base.mako:137 | |
|
7051 | 7055 | msgid "Repository groups" |
|
7052 | 7056 | msgstr "" |
|
7053 | 7057 | |
@@ -7062,7 +7066,7 b' msgstr ""' | |||
|
7062 | 7066 | #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.mako:25 |
|
7063 | 7067 | #: rhodecode/templates/admin/repos/repo_add_base.mako:43 |
|
7064 | 7068 | #: rhodecode/templates/admin/repos/repo_edit_settings.mako:33 |
|
7065 |
#: rhodecode/templates/base/base.mako:67 |
|
|
7069 | #: rhodecode/templates/base/base.mako:672 | |
|
7066 | 7070 | #: rhodecode/templates/data_table/_dt_elements.mako:217 |
|
7067 | 7071 | #: rhodecode/templates/forks/fork.mako:41 |
|
7068 | 7072 | msgid "Repository group" |
@@ -7312,7 +7316,7 b' msgid "Import Existing Repository ?"' | |||
|
7312 | 7316 | msgstr "" |
|
7313 | 7317 | |
|
7314 | 7318 | #: rhodecode/templates/admin/repos/repo_add_base.mako:23 |
|
7315 |
#: rhodecode/templates/base/base.mako:33 |
|
|
7319 | #: rhodecode/templates/base/base.mako:333 | |
|
7316 | 7320 | msgid "Clone from" |
|
7317 | 7321 | msgstr "" |
|
7318 | 7322 | |
@@ -8024,7 +8028,7 b' msgstr ""' | |||
|
8024 | 8028 | #: rhodecode/templates/admin/settings/settings_global.mako:140 |
|
8025 | 8029 | #: rhodecode/templates/admin/settings/settings_labs.mako:48 |
|
8026 | 8030 | #: rhodecode/templates/admin/settings/settings_vcs.mako:13 |
|
8027 |
#: rhodecode/templates/admin/settings/settings_visual.mako:21 |
|
|
8031 | #: rhodecode/templates/admin/settings/settings_visual.mako:217 | |
|
8028 | 8032 | msgid "Save settings" |
|
8029 | 8033 | msgstr "" |
|
8030 | 8034 | |
@@ -8550,7 +8554,7 b' msgstr ""' | |||
|
8550 | 8554 | msgid "Clone URL templates" |
|
8551 | 8555 | msgstr "" |
|
8552 | 8556 | |
|
8553 |
#: rhodecode/templates/admin/settings/settings_visual.mako:18 |
|
|
8557 | #: rhodecode/templates/admin/settings/settings_visual.mako:184 | |
|
8554 | 8558 | msgid "" |
|
8555 | 8559 | "Schema of clone url construction eg. '{scheme}://{user}@{netloc}/{repo}', available vars:\n" |
|
8556 | 8560 | " {scheme} 'http' or 'https' sent from running RhodeCode server,\n" |
@@ -8562,11 +8566,11 b' msgid ""' | |||
|
8562 | 8566 | " {repoid} ID of repository, can be used to contruct clone-by-id" |
|
8563 | 8567 | msgstr "" |
|
8564 | 8568 | |
|
8565 |
#: rhodecode/templates/admin/settings/settings_visual.mako:19 |
|
|
8569 | #: rhodecode/templates/admin/settings/settings_visual.mako:199 | |
|
8566 | 8570 | msgid "Custom Support Link" |
|
8567 | 8571 | msgstr "" |
|
8568 | 8572 | |
|
8569 |
#: rhodecode/templates/admin/settings/settings_visual.mako:20 |
|
|
8573 | #: rhodecode/templates/admin/settings/settings_visual.mako:207 | |
|
8570 | 8574 | #, python-format |
|
8571 | 8575 | msgid "" |
|
8572 | 8576 | "Custom url for the support link located at the bottom.\n" |
@@ -8582,7 +8586,7 b' msgstr ""' | |||
|
8582 | 8586 | #: rhodecode/templates/admin/user_groups/user_group_add.mako:13 |
|
8583 | 8587 | #: rhodecode/templates/admin/users/user_edit_advanced.mako:14 |
|
8584 | 8588 | #: rhodecode/templates/base/base.mako:117 |
|
8585 |
#: rhodecode/templates/base/base.mako:1 |
|
|
8589 | #: rhodecode/templates/base/base.mako:140 | |
|
8586 | 8590 | msgid "User groups" |
|
8587 | 8591 | msgstr "" |
|
8588 | 8592 | |
@@ -9090,16 +9094,21 b' msgstr ""' | |||
|
9090 | 9094 | msgid "Delegated Admin Panel" |
|
9091 | 9095 | msgstr "" |
|
9092 | 9096 | |
|
9093 |
#: rhodecode/templates/base/base.mako:11 |
|
|
9097 | #: rhodecode/templates/base/base.mako:118 | |
|
9098 | #: rhodecode/templates/base/base.mako:395 | |
|
9099 | msgid "Artifacts" | |
|
9100 | msgstr "" | |
|
9101 | ||
|
9102 | #: rhodecode/templates/base/base.mako:120 | |
|
9094 | 9103 | msgid "Authentication" |
|
9095 | 9104 | msgstr "" |
|
9096 | 9105 | |
|
9097 |
#: rhodecode/templates/base/base.mako:12 |
|
|
9106 | #: rhodecode/templates/base/base.mako:122 | |
|
9098 | 9107 | msgid "Defaults" |
|
9099 | 9108 | msgstr "" |
|
9100 | 9109 | |
|
9101 |
#: rhodecode/templates/base/base.mako:16 |
|
|
9102 |
#: rhodecode/templates/base/base.mako:20 |
|
|
9110 | #: rhodecode/templates/base/base.mako:162 | |
|
9111 | #: rhodecode/templates/base/base.mako:202 | |
|
9103 | 9112 | #: rhodecode/templates/changeset/changeset.mako:140 |
|
9104 | 9113 | #: rhodecode/templates/files/files_source_header.mako:57 |
|
9105 | 9114 | #: rhodecode/templates/files/files_tree_header.mako:44 |
@@ -9107,40 +9116,40 b' msgstr ""' | |||
|
9107 | 9116 | msgid "Show More" |
|
9108 | 9117 | msgstr "" |
|
9109 | 9118 | |
|
9110 |
#: rhodecode/templates/base/base.mako:30 |
|
|
9111 |
#: rhodecode/templates/base/base.mako:31 |
|
|
9119 | #: rhodecode/templates/base/base.mako:305 | |
|
9120 | #: rhodecode/templates/base/base.mako:316 | |
|
9112 | 9121 | msgid "RSS Feed" |
|
9113 | 9122 | msgstr "" |
|
9114 | 9123 | |
|
9115 |
#: rhodecode/templates/base/base.mako:30 |
|
|
9124 | #: rhodecode/templates/base/base.mako:307 | |
|
9116 | 9125 | msgid "Watch this Repository and actions on it in your personalized journal" |
|
9117 | 9126 | msgstr "" |
|
9118 | 9127 | |
|
9119 |
#: rhodecode/templates/base/base.mako:32 |
|
|
9128 | #: rhodecode/templates/base/base.mako:325 | |
|
9120 | 9129 | msgid "Fork of" |
|
9121 | 9130 | msgstr "" |
|
9122 | 9131 | |
|
9123 |
#: rhodecode/templates/base/base.mako:34 |
|
|
9132 | #: rhodecode/templates/base/base.mako:342 | |
|
9124 | 9133 | #, python-format |
|
9125 | 9134 | msgid "Repository locked by %(user)s" |
|
9126 | 9135 | msgstr "" |
|
9127 | 9136 | |
|
9128 |
#: rhodecode/templates/base/base.mako:34 |
|
|
9137 | #: rhodecode/templates/base/base.mako:347 | |
|
9129 | 9138 | msgid "Repository not locked. Pull repository to lock it." |
|
9130 | 9139 | msgstr "" |
|
9131 | 9140 | |
|
9132 |
#: rhodecode/templates/base/base.mako:36 |
|
|
9141 | #: rhodecode/templates/base/base.mako:363 | |
|
9133 | 9142 | msgid "This repository has been archived. It is now read-only." |
|
9134 | 9143 | msgstr "" |
|
9135 | 9144 | |
|
9136 |
#: rhodecode/templates/base/base.mako:37 |
|
|
9145 | #: rhodecode/templates/base/base.mako:376 | |
|
9137 | 9146 | #: rhodecode/templates/data_table/_dt_elements.mako:58 |
|
9138 | 9147 | #: rhodecode/templates/data_table/_dt_elements.mako:59 |
|
9139 | 9148 | #: rhodecode/templates/data_table/_dt_elements.mako:207 |
|
9140 | 9149 | msgid "Summary" |
|
9141 | 9150 | msgstr "" |
|
9142 | 9151 | |
|
9143 |
#: rhodecode/templates/base/base.mako:37 |
|
|
9152 | #: rhodecode/templates/base/base.mako:377 | |
|
9144 | 9153 | #: rhodecode/templates/data_table/_dt_elements.mako:63 |
|
9145 | 9154 | #: rhodecode/templates/data_table/_dt_elements.mako:64 |
|
9146 | 9155 | #: rhodecode/templates/files/file_authors_box.mako:30 |
@@ -9150,7 +9159,7 b' msgstr ""' | |||
|
9150 | 9159 | msgid "Commits" |
|
9151 | 9160 | msgstr "" |
|
9152 | 9161 | |
|
9153 |
#: rhodecode/templates/base/base.mako:37 |
|
|
9162 | #: rhodecode/templates/base/base.mako:378 | |
|
9154 | 9163 | #: rhodecode/templates/data_table/_dt_elements.mako:68 |
|
9155 | 9164 | #: rhodecode/templates/data_table/_dt_elements.mako:69 |
|
9156 | 9165 | #: rhodecode/templates/files/files.mako:15 |
@@ -9158,87 +9167,83 b' msgstr ""' | |||
|
9158 | 9167 | msgid "Files" |
|
9159 | 9168 | msgstr "" |
|
9160 | 9169 | |
|
9161 |
#: rhodecode/templates/base/base.mako:37 |
|
|
9170 | #: rhodecode/templates/base/base.mako:379 | |
|
9162 | 9171 | #: rhodecode/templates/bookmarks/bookmarks.mako:78 |
|
9163 | 9172 | #: rhodecode/templates/branches/branches.mako:77 |
|
9164 | 9173 | #: rhodecode/templates/tags/tags.mako:78 |
|
9165 | 9174 | msgid "Compare" |
|
9166 | 9175 | msgstr "" |
|
9167 | 9176 | |
|
9168 |
#: rhodecode/templates/base/base.mako:38 |
|
|
9177 | #: rhodecode/templates/base/base.mako:384 | |
|
9169 | 9178 | #, python-format |
|
9170 | 9179 | msgid "Show Pull Requests for %s" |
|
9171 | 9180 | msgstr "" |
|
9172 | 9181 | |
|
9173 |
#: rhodecode/templates/base/base.mako: |
|
|
9174 | msgid "Artifacts" | |
|
9175 | msgstr "" | |
|
9176 | ||
|
9177 | #: rhodecode/templates/base/base.mako:400 | |
|
9182 | #: rhodecode/templates/base/base.mako:401 | |
|
9178 | 9183 | msgid "Repository Settings" |
|
9179 | 9184 | msgstr "" |
|
9180 | 9185 | |
|
9181 |
#: rhodecode/templates/base/base.mako:40 |
|
|
9186 | #: rhodecode/templates/base/base.mako:407 | |
|
9182 | 9187 | msgid "Options" |
|
9183 | 9188 | msgstr "" |
|
9184 | 9189 | |
|
9185 |
#: rhodecode/templates/base/base.mako:41 |
|
|
9190 | #: rhodecode/templates/base/base.mako:412 | |
|
9186 | 9191 | msgid "Unlock Repository" |
|
9187 | 9192 | msgstr "" |
|
9188 | 9193 | |
|
9189 |
#: rhodecode/templates/base/base.mako:41 |
|
|
9194 | #: rhodecode/templates/base/base.mako:414 | |
|
9190 | 9195 | msgid "Lock Repository" |
|
9191 | 9196 | msgstr "" |
|
9192 | 9197 | |
|
9193 |
#: rhodecode/templates/base/base.mako:46 |
|
|
9198 | #: rhodecode/templates/base/base.mako:467 | |
|
9194 | 9199 | msgid "Group Home" |
|
9195 | 9200 | msgstr "" |
|
9196 | 9201 | |
|
9197 |
#: rhodecode/templates/base/base.mako:47 |
|
|
9202 | #: rhodecode/templates/base/base.mako:471 | |
|
9198 | 9203 | msgid "You have admin right to this group, and can edit it" |
|
9199 | 9204 | msgstr "" |
|
9200 | 9205 | |
|
9201 |
#: rhodecode/templates/base/base.mako:47 |
|
|
9206 | #: rhodecode/templates/base/base.mako:471 | |
|
9202 | 9207 | msgid "Group Settings" |
|
9203 | 9208 | msgstr "" |
|
9204 | 9209 | |
|
9205 |
#: rhodecode/templates/base/base.mako:52 |
|
|
9210 | #: rhodecode/templates/base/base.mako:522 | |
|
9206 | 9211 | msgid "This Repository" |
|
9207 | 9212 | msgstr "" |
|
9208 | 9213 | |
|
9209 |
#: rhodecode/templates/base/base.mako:52 |
|
|
9214 | #: rhodecode/templates/base/base.mako:524 | |
|
9210 | 9215 | msgid "Create Pull Request" |
|
9211 | 9216 | msgstr "" |
|
9212 | 9217 | |
|
9213 |
#: rhodecode/templates/base/base.mako:52 |
|
|
9218 | #: rhodecode/templates/base/base.mako:528 | |
|
9214 | 9219 | msgid "Fork this repository" |
|
9215 | 9220 | msgstr "" |
|
9216 | 9221 | |
|
9217 |
#: rhodecode/templates/base/base.mako:53 |
|
|
9222 | #: rhodecode/templates/base/base.mako:535 | |
|
9218 | 9223 | msgid "This Repository Group" |
|
9219 | 9224 | msgstr "" |
|
9220 | 9225 | |
|
9221 |
#: rhodecode/templates/base/base.mako:53 |
|
|
9222 |
#: rhodecode/templates/base/base.mako:55 |
|
|
9223 |
#: rhodecode/templates/base/base.mako:56 |
|
|
9226 | #: rhodecode/templates/base/base.mako:539 | |
|
9227 | #: rhodecode/templates/base/base.mako:555 | |
|
9228 | #: rhodecode/templates/base/base.mako:567 | |
|
9224 | 9229 | msgid "New Repository" |
|
9225 | 9230 | msgstr "" |
|
9226 | 9231 | |
|
9227 |
#: rhodecode/templates/base/base.mako:54 |
|
|
9228 |
#: rhodecode/templates/base/base.mako:55 |
|
|
9229 |
#: rhodecode/templates/base/base.mako:57 |
|
|
9232 | #: rhodecode/templates/base/base.mako:545 | |
|
9233 | #: rhodecode/templates/base/base.mako:559 | |
|
9234 | #: rhodecode/templates/base/base.mako:573 | |
|
9230 | 9235 | msgid "New Repository Group" |
|
9231 | 9236 | msgstr "" |
|
9232 | 9237 | |
|
9233 |
#: rhodecode/templates/base/base.mako: |
|
|
9238 | #: rhodecode/templates/base/base.mako:600 | |
|
9234 | 9239 | msgid "Sign in" |
|
9235 | 9240 | msgstr "" |
|
9236 | 9241 | |
|
9237 |
#: rhodecode/templates/base/base.mako:62 |
|
|
9242 | #: rhodecode/templates/base/base.mako:625 | |
|
9238 | 9243 | msgid "My personal group" |
|
9239 | 9244 | msgstr "" |
|
9240 | 9245 | |
|
9241 |
#: rhodecode/templates/base/base.mako:63 |
|
|
9246 | #: rhodecode/templates/base/base.mako:631 | |
|
9242 | 9247 | #: rhodecode/templates/debug_style/alerts.html:5 |
|
9243 | 9248 | #: rhodecode/templates/debug_style/buttons.html:5 |
|
9244 | 9249 | #: rhodecode/templates/debug_style/code-block.html:6 |
@@ -9261,62 +9266,62 b' msgstr ""' | |||
|
9261 | 9266 | msgid "Style" |
|
9262 | 9267 | msgstr "" |
|
9263 | 9268 | |
|
9264 |
#: rhodecode/templates/base/base.mako:63 |
|
|
9269 | #: rhodecode/templates/base/base.mako:632 | |
|
9265 | 9270 | msgid "[Style]" |
|
9266 | 9271 | msgstr "" |
|
9267 | 9272 | |
|
9268 |
#: rhodecode/templates/base/base.mako:64 |
|
|
9273 | #: rhodecode/templates/base/base.mako:649 | |
|
9269 | 9274 | msgid "No Bookmarks yet." |
|
9270 | 9275 | msgstr "" |
|
9271 | 9276 | |
|
9272 |
#: rhodecode/templates/base/base.mako:68 |
|
|
9277 | #: rhodecode/templates/base/base.mako:687 | |
|
9273 | 9278 | msgid "Sign Out" |
|
9274 | 9279 | msgstr "" |
|
9275 | 9280 | |
|
9276 |
#: rhodecode/templates/base/base.mako:73 |
|
|
9281 | #: rhodecode/templates/base/base.mako:732 | |
|
9277 | 9282 | #: rhodecode/templates/changeset/changeset_file_comment.mako:538 |
|
9278 | 9283 | msgid "dismiss" |
|
9279 | 9284 | msgstr "" |
|
9280 | 9285 | |
|
9281 |
#: rhodecode/templates/base/base.mako:77 |
|
|
9286 | #: rhodecode/templates/base/base.mako:773 | |
|
9282 | 9287 | msgid "search / go to..." |
|
9283 | 9288 | msgstr "" |
|
9284 | 9289 | |
|
9285 | #: rhodecode/templates/base/base.mako:817 | |
|
9286 | msgid "Show activity journal" | |
|
9287 | msgstr "" | |
|
9288 | ||
|
9289 | 9290 | #: rhodecode/templates/base/base.mako:818 |
|
9291 | msgid "Show activity journal" | |
|
9292 | msgstr "" | |
|
9293 | ||
|
9294 | #: rhodecode/templates/base/base.mako:819 | |
|
9290 | 9295 | #: rhodecode/templates/journal/journal.mako:4 |
|
9291 | 9296 | #: rhodecode/templates/journal/journal.mako:14 |
|
9292 | 9297 | msgid "Journal" |
|
9293 | 9298 | msgstr "" |
|
9294 | 9299 | |
|
9295 | #: rhodecode/templates/base/base.mako:823 | |
|
9296 | msgid "Show Public activity journal" | |
|
9297 | msgstr "" | |
|
9298 | ||
|
9299 | 9300 | #: rhodecode/templates/base/base.mako:824 |
|
9301 | msgid "Show Public activity journal" | |
|
9302 | msgstr "" | |
|
9303 | ||
|
9304 | #: rhodecode/templates/base/base.mako:825 | |
|
9300 | 9305 | msgid "Public journal" |
|
9301 | 9306 | msgstr "" |
|
9302 | 9307 | |
|
9303 | #: rhodecode/templates/base/base.mako:830 | |
|
9304 | msgid "Show Gists" | |
|
9305 | msgstr "" | |
|
9306 | ||
|
9307 | 9308 | #: rhodecode/templates/base/base.mako:831 |
|
9309 | msgid "Show Gists" | |
|
9310 | msgstr "" | |
|
9311 | ||
|
9312 | #: rhodecode/templates/base/base.mako:832 | |
|
9308 | 9313 | msgid "Gists" |
|
9309 | 9314 | msgstr "" |
|
9310 | 9315 | |
|
9311 |
#: rhodecode/templates/base/base.mako:83 |
|
|
9316 | #: rhodecode/templates/base/base.mako:838 | |
|
9312 | 9317 | msgid "Admin settings" |
|
9313 | 9318 | msgstr "" |
|
9314 | 9319 | |
|
9315 |
#: rhodecode/templates/base/base.mako:115 |
|
|
9320 | #: rhodecode/templates/base/base.mako:1155 | |
|
9316 | 9321 | msgid "Keyboard shortcuts" |
|
9317 | 9322 | msgstr "" |
|
9318 | 9323 | |
|
9319 |
#: rhodecode/templates/base/base.mako:116 |
|
|
9324 | #: rhodecode/templates/base/base.mako:1163 | |
|
9320 | 9325 | msgid "Site-wide shortcuts" |
|
9321 | 9326 | msgstr "" |
|
9322 | 9327 | |
@@ -9357,7 +9362,7 b' msgid "Repository Forking"' | |||
|
9357 | 9362 | msgstr "" |
|
9358 | 9363 | |
|
9359 | 9364 | #: rhodecode/templates/base/default_perms_box.mako:65 |
|
9360 |
msgid "Permission to create r |
|
|
9365 | msgid "Permission to create repository forks. Root level forks will only work if repository creation is enabled." | |
|
9361 | 9366 | msgstr "" |
|
9362 | 9367 | |
|
9363 | 9368 | #: rhodecode/templates/base/default_perms_box.mako:70 |
@@ -9418,7 +9423,7 b' msgstr ""' | |||
|
9418 | 9423 | #: rhodecode/templates/base/issue_tracker_settings.mako:300 |
|
9419 | 9424 | #: rhodecode/templates/changeset/changeset_file_comment.mako:395 |
|
9420 | 9425 | #: rhodecode/templates/changeset/changeset_file_comment.mako:446 |
|
9421 |
#: rhodecode/templates/data_table/_dt_elements.mako:4 |
|
|
9426 | #: rhodecode/templates/data_table/_dt_elements.mako:463 | |
|
9422 | 9427 | #: rhodecode/templates/files/files_add.mako:59 |
|
9423 | 9428 | #: rhodecode/templates/files/files_edit.mako:61 |
|
9424 | 9429 | msgid "Preview" |
@@ -10481,11 +10486,11 b' msgstr ""' | |||
|
10481 | 10486 | msgid "Work in progress" |
|
10482 | 10487 | msgstr "" |
|
10483 | 10488 | |
|
10484 |
#: rhodecode/templates/data_table/_dt_elements.mako:43 |
|
|
10489 | #: rhodecode/templates/data_table/_dt_elements.mako:438 | |
|
10485 | 10490 | msgid "Info" |
|
10486 | 10491 | msgstr "" |
|
10487 | 10492 | |
|
10488 |
#: rhodecode/templates/data_table/_dt_elements.mako:4 |
|
|
10493 | #: rhodecode/templates/data_table/_dt_elements.mako:480 | |
|
10489 | 10494 | #, python-format |
|
10490 | 10495 | msgid "Parsed using %s syntax" |
|
10491 | 10496 | msgstr "" |
@@ -10645,7 +10650,7 b' msgid "{mention_prefix}{user} left a {co' | |||
|
10645 | 10650 | msgstr "" |
|
10646 | 10651 | |
|
10647 | 10652 | #: rhodecode/templates/email_templates/commit_comment.mako:54 |
|
10648 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:6 |
|
|
10653 | #: rhodecode/templates/email_templates/pull_request_comment.mako:62 | |
|
10649 | 10654 | msgid "Comment link" |
|
10650 | 10655 | msgstr "" |
|
10651 | 10656 | |
@@ -10662,26 +10667,26 b' msgid "Commit message"' | |||
|
10662 | 10667 | msgstr "" |
|
10663 | 10668 | |
|
10664 | 10669 | #: rhodecode/templates/email_templates/commit_comment.mako:65 |
|
10665 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:7 |
|
|
10670 | #: rhodecode/templates/email_templates/pull_request_comment.mako:76 | |
|
10666 | 10671 | msgid "File: {comment_file} on line {comment_line}" |
|
10667 | 10672 | msgstr "" |
|
10668 | 10673 | |
|
10669 | 10674 | #: rhodecode/templates/email_templates/commit_comment.mako:69 |
|
10670 | 10675 | #: rhodecode/templates/email_templates/commit_comment.mako:161 |
|
10671 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:8 |
|
|
10672 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:19 |
|
|
10676 | #: rhodecode/templates/email_templates/pull_request_comment.mako:80 | |
|
10677 | #: rhodecode/templates/email_templates/pull_request_comment.mako:190 | |
|
10673 | 10678 | msgid "`TODO` number" |
|
10674 | 10679 | msgstr "" |
|
10675 | 10680 | |
|
10676 | 10681 | #: rhodecode/templates/email_templates/commit_comment.mako:71 |
|
10677 | 10682 | #: rhodecode/templates/email_templates/commit_comment.mako:163 |
|
10678 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:8 |
|
|
10679 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:19 |
|
|
10683 | #: rhodecode/templates/email_templates/pull_request_comment.mako:82 | |
|
10684 | #: rhodecode/templates/email_templates/pull_request_comment.mako:192 | |
|
10680 | 10685 | msgid "`Note` number" |
|
10681 | 10686 | msgstr "" |
|
10682 | 10687 | |
|
10683 | 10688 | #: rhodecode/templates/email_templates/commit_comment.mako:104 |
|
10684 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:12 |
|
|
10689 | #: rhodecode/templates/email_templates/pull_request_comment.mako:123 | |
|
10685 | 10690 | msgid "left a" |
|
10686 | 10691 | msgstr "" |
|
10687 | 10692 | |
@@ -10702,18 +10707,18 b' msgid "Commit Status"' | |||
|
10702 | 10707 | msgstr "" |
|
10703 | 10708 | |
|
10704 | 10709 | #: rhodecode/templates/email_templates/commit_comment.mako:153 |
|
10705 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:18 |
|
|
10710 | #: rhodecode/templates/email_templates/pull_request_comment.mako:182 | |
|
10706 | 10711 | #: rhodecode/templates/search/search_path.mako:9 |
|
10707 | 10712 | msgid "File" |
|
10708 | 10713 | msgstr "" |
|
10709 | 10714 | |
|
10710 | 10715 | #: rhodecode/templates/email_templates/commit_comment.mako:154 |
|
10711 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:18 |
|
|
10716 | #: rhodecode/templates/email_templates/pull_request_comment.mako:183 | |
|
10712 | 10717 | msgid "`{comment_file}` on line {comment_line}" |
|
10713 | 10718 | msgstr "" |
|
10714 | 10719 | |
|
10715 | 10720 | #: rhodecode/templates/email_templates/commit_comment.mako:173 |
|
10716 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:20 |
|
|
10721 | #: rhodecode/templates/email_templates/pull_request_comment.mako:202 | |
|
10717 | 10722 | msgid "Reply" |
|
10718 | 10723 | msgstr "" |
|
10719 | 10724 | |
@@ -10729,35 +10734,35 b' msgstr ""' | |||
|
10729 | 10734 | msgid "{mention_prefix}{user} left a {comment_type} on pull request !{pr_id}: \"{pr_title}\"" |
|
10730 | 10735 | msgstr "" |
|
10731 | 10736 | |
|
10732 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:6 |
|
|
10737 | #: rhodecode/templates/email_templates/pull_request_comment.mako:64 | |
|
10733 | 10738 | #: rhodecode/templates/hovercards/hovercard_pull_request.mako:24 |
|
10734 | 10739 | msgid "Pull Request" |
|
10735 | 10740 | msgstr "" |
|
10736 | 10741 | |
|
10737 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:6 |
|
|
10742 | #: rhodecode/templates/email_templates/pull_request_comment.mako:66 | |
|
10738 | 10743 | #: rhodecode/templates/email_templates/pull_request_review.mako:45 |
|
10739 | 10744 | #: rhodecode/templates/email_templates/pull_request_update.mako:41 |
|
10740 | 10745 | msgid "Commit flow: {source_ref_type}:{source_ref_name} of {source_repo_url} into {target_ref_type}:{target_ref_name} of {target_repo_url}" |
|
10741 | 10746 | msgstr "" |
|
10742 | 10747 | |
|
10743 |
#: rhodecode/templates/email_templates/pull_request_comment.mako: |
|
|
10748 | #: rhodecode/templates/email_templates/pull_request_comment.mako:69 | |
|
10744 | 10749 | msgid "{user} submitted pull request !{pr_id} status: *{status}*" |
|
10745 | 10750 | msgstr "" |
|
10746 | 10751 | |
|
10747 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:7 |
|
|
10752 | #: rhodecode/templates/email_templates/pull_request_comment.mako:72 | |
|
10748 | 10753 | msgid "{user} submitted pull request !{pr_id} status: *{status} and closed*" |
|
10749 | 10754 | msgstr "" |
|
10750 | 10755 | |
|
10751 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:12 |
|
|
10756 | #: rhodecode/templates/email_templates/pull_request_comment.mako:126 | |
|
10752 | 10757 | msgid "{comment_type} on file `{comment_file}` in pull request." |
|
10753 | 10758 | msgstr "" |
|
10754 | 10759 | |
|
10755 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:12 |
|
|
10760 | #: rhodecode/templates/email_templates/pull_request_comment.mako:128 | |
|
10756 | 10761 | msgid "{comment_type} on pull request." |
|
10757 | 10762 | msgstr "" |
|
10758 | 10763 | |
|
10759 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:13 |
|
|
10760 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:16 |
|
|
10764 | #: rhodecode/templates/email_templates/pull_request_comment.mako:133 | |
|
10765 | #: rhodecode/templates/email_templates/pull_request_comment.mako:163 | |
|
10761 | 10766 | #: rhodecode/templates/email_templates/pull_request_review.mako:100 |
|
10762 | 10767 | #: rhodecode/templates/email_templates/pull_request_review.mako:116 |
|
10763 | 10768 | #: rhodecode/templates/email_templates/pull_request_update.mako:104 |
@@ -10765,26 +10770,26 b' msgstr ""' | |||
|
10765 | 10770 | msgid "Pull request" |
|
10766 | 10771 | msgstr "" |
|
10767 | 10772 | |
|
10768 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:15 |
|
|
10773 | #: rhodecode/templates/email_templates/pull_request_comment.mako:152 | |
|
10769 | 10774 | msgid "Review Status" |
|
10770 | 10775 | msgstr "" |
|
10771 | 10776 | |
|
10772 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:15 |
|
|
10777 | #: rhodecode/templates/email_templates/pull_request_comment.mako:155 | |
|
10773 | 10778 | msgid "Closed pull request with status" |
|
10774 | 10779 | msgstr "" |
|
10775 | 10780 | |
|
10776 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:15 |
|
|
10781 | #: rhodecode/templates/email_templates/pull_request_comment.mako:157 | |
|
10777 | 10782 | msgid "Submitted review status" |
|
10778 | 10783 | msgstr "" |
|
10779 | 10784 | |
|
10780 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:17 |
|
|
10785 | #: rhodecode/templates/email_templates/pull_request_comment.mako:172 | |
|
10781 | 10786 | #: rhodecode/templates/email_templates/pull_request_review.mako:125 |
|
10782 | 10787 | #: rhodecode/templates/email_templates/pull_request_update.mako:130 |
|
10783 | 10788 | msgid "Commit Flow" |
|
10784 | 10789 | msgstr "" |
|
10785 | 10790 | |
|
10786 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:17 |
|
|
10787 |
#: rhodecode/templates/email_templates/pull_request_comment.mako:17 |
|
|
10791 | #: rhodecode/templates/email_templates/pull_request_comment.mako:174 | |
|
10792 | #: rhodecode/templates/email_templates/pull_request_comment.mako:176 | |
|
10788 | 10793 | #: rhodecode/templates/email_templates/pull_request_review.mako:127 |
|
10789 | 10794 | #: rhodecode/templates/email_templates/pull_request_review.mako:129 |
|
10790 | 10795 | #: rhodecode/templates/email_templates/pull_request_update.mako:132 |
@@ -11447,12 +11452,12 b' msgstr ""' | |||
|
11447 | 11452 | msgid "In pull request description" |
|
11448 | 11453 | msgstr "" |
|
11449 | 11454 | |
|
11450 |
#: rhodecode/templates/pullrequests/pullrequest_show.mako:8 |
|
|
11451 |
#: rhodecode/templates/pullrequests/pullrequest_show.mako:8 |
|
|
11455 | #: rhodecode/templates/pullrequests/pullrequest_show.mako:840 | |
|
11456 | #: rhodecode/templates/pullrequests/pullrequest_show.mako:860 | |
|
11452 | 11457 | msgid "No Ticket data found." |
|
11453 | 11458 | msgstr "" |
|
11454 | 11459 | |
|
11455 |
#: rhodecode/templates/pullrequests/pullrequest_show.mako:84 |
|
|
11460 | #: rhodecode/templates/pullrequests/pullrequest_show.mako:845 | |
|
11456 | 11461 | msgid "In commit messages" |
|
11457 | 11462 | msgstr "" |
|
11458 | 11463 |
@@ -0,0 +1,76 b'' | |||
|
1 | |RCE| 4.25.0 |RNS| | |
|
2 | ------------------ | |
|
3 | ||
|
4 | Release Date | |
|
5 | ^^^^^^^^^^^^ | |
|
6 | ||
|
7 | - 2021-04-02 | |
|
8 | ||
|
9 | ||
|
10 | New Features | |
|
11 | ^^^^^^^^^^^^ | |
|
12 | ||
|
13 | - SSH: allow clone by ID via SSH operations. | |
|
14 | - Artifacts: added an admin panel to manage artifacts. | |
|
15 | - Redmine: added option to add note to a ticket without changing its status in Redmine integration. | |
|
16 | ||
|
17 | ||
|
18 | General | |
|
19 | ^^^^^^^ | |
|
20 | ||
|
21 | - Git: change lookups logic. Prioritize reference names over numerical ids. | |
|
22 | Numerical ids are supported as a fallback if ref matching is unsuccessful. | |
|
23 | - Permissions: changed fork permission help text to reflect the actual state on how it works. | |
|
24 | - Permissions: flush permissions on owner changes for repo and repo groups. This | |
|
25 | would fix problems when owner of repository changes then the new owner lacked permissions | |
|
26 | until cache expired. | |
|
27 | - Artifacts: added API function to remove artifacts. | |
|
28 | - Archives: use a special name for non-hashed archives to fix caching issues. | |
|
29 | - Packaging: fixed few packages requirements for a proper builds. | |
|
30 | - Packaging: fix rhodecode-tools for docker builds. | |
|
31 | - Packaging: fixed some problem after latest setuptools-scm release. | |
|
32 | - Packaging: added setuptools-scm to packages for build. | |
|
33 | - Packaging: fix jira package for reproducible builds. | |
|
34 | - Packaging: fix zipp package patches. | |
|
35 | ||
|
36 | ||
|
37 | Security | |
|
38 | ^^^^^^^^ | |
|
39 | ||
|
40 | - Comments: forbid removal of comments by anyone except the owners. | |
|
41 | Previously admins of a repository could remove them if they would construct a special url with data. | |
|
42 | - Pull requests: fixed some xss problems when a deleted file with special characters were commented on. | |
|
43 | ||
|
44 | ||
|
45 | Performance | |
|
46 | ^^^^^^^^^^^ | |
|
47 | ||
|
48 | - License: skip channelstream connect on license checks logic to reduce calls handling times. | |
|
49 | - Core: optimize some calls to skip license/scm detection on them. Each license check is expensive | |
|
50 | and we don't need them on each call. | |
|
51 | ||
|
52 | ||
|
53 | Fixes | |
|
54 | ^^^^^ | |
|
55 | ||
|
56 | - Branch-permissions: fixed ce view. Fixes #5656 | |
|
57 | - Feed: fix errors on feed access of empty repositories. | |
|
58 | - Archives: if implicit ref name was used (e.g master) to obtain archive, we now | |
|
59 | redirect to explicit commit sha so we can have the proper caching for references names. | |
|
60 | - rcextensions: fixed pre-files extractor return code support. | |
|
61 | - Svn: fix subprocess problems on some of the calls for file checking. | |
|
62 | - Pull requests: fixed multiple repetitions of referenced tickets in pull requests summary sidebar. | |
|
63 | - Maintenance: fixed bad routes def | |
|
64 | - clone-uri: fixed the problems with key mismatch that caused errors on summary page. | |
|
65 | - Largefiles: added fix for downloading largefiles which had no extension in file name. | |
|
66 | - Compare: fix referenced commits bug. | |
|
67 | - Git: fix for unicode branches | |
|
68 | ||
|
69 | ||
|
70 | Upgrade notes | |
|
71 | ^^^^^^^^^^^^^ | |
|
72 | ||
|
73 | - Scheduled release 4.25.0. | |
|
74 | ||
|
75 | ||
|
76 |
@@ -0,0 +1,13 b'' | |||
|
1 | diff -rup channelstream-0.6.14-orig/setup.py channelstream-0.6.14/setup.py | |
|
2 | ||
|
3 | --- channelstream-0.6.14/setup-orig.py 2021-03-11 12:34:45.000000000 +0100 | |
|
4 | +++ channelstream-0.6.14/setup.py 2021-03-11 12:34:56.000000000 +0100 | |
|
5 | @@ -52,7 +52,7 @@ setup( | |
|
6 | include_package_data=True, | |
|
7 | install_requires=requires, | |
|
8 | python_requires=">=2.7", | |
|
9 | - setup_requires=["pytest-runner"], | |
|
10 | + setup_requires=["pytest-runner==5.1.0"], | |
|
11 | extras_require={ | |
|
12 | "dev": ["coverage", "pytest", "pyramid", "tox", "mock", "webtest"], | |
|
13 | "lint": ["black"], |
@@ -0,0 +1,10 b'' | |||
|
1 | diff -rup configparser-4.0.2-orig/pyproject.toml configparser-4.0.2/pyproject.toml | |
|
2 | --- configparser-4.0.2-orig/pyproject.toml 2021-03-22 21:28:11.000000000 +0100 | |
|
3 | +++ configparser-4.0.2/pyproject.toml 2021-03-22 21:28:11.000000000 +0100 | |
|
4 | @@ -1,5 +1,5 @@ | |
|
5 | [build-system] | |
|
6 | -requires = ["setuptools>=40.7", "wheel", "setuptools_scm>=1.15"] | |
|
7 | +requires = ["setuptools<=42.0", "wheel", "setuptools_scm<6.0.0"] | |
|
8 | build-backend = "setuptools.build_meta" | |
|
9 | ||
|
10 | [tool.black] |
@@ -0,0 +1,7 b'' | |||
|
1 | diff -rup importlib-metadata-1.6.0-orig/yproject.toml importlib-metadata-1.6.0/pyproject.toml | |
|
2 | --- importlib-metadata-1.6.0-orig/yproject.toml 2021-03-22 22:10:33.000000000 +0100 | |
|
3 | +++ importlib-metadata-1.6.0/pyproject.toml 2021-03-22 22:11:09.000000000 +0100 | |
|
4 | @@ -1,3 +1,3 @@ | |
|
5 | [build-system] | |
|
6 | -requires = ["setuptools>=30.3", "wheel", "setuptools_scm"] | |
|
7 | +requires = ["setuptools<42.0", "wheel", "setuptools_scm<6.0.0"] |
@@ -0,0 +1,12 b'' | |||
|
1 | diff -rup pyramid-apispec-0.3.2-orig/setup.py pyramid-apispec-0.3.2/setup.py | |
|
2 | --- pyramid-apispec-0.3.2-orig/setup.py 2021-03-11 11:19:26.000000000 +0100 | |
|
3 | +++ pyramid-apispec-0.3.2/setup.py 2021-03-11 11:19:51.000000000 +0100 | |
|
4 | @@ -44,7 +44,7 @@ setup( | |
|
5 | packages=find_packages(exclude=["contrib", "docs", "tests"]), | |
|
6 | package_data={"pyramid_apispec": ["static/*.*"], "": ["LICENSE"]}, | |
|
7 | install_requires=["apispec[yaml]==1.0.0"], | |
|
8 | - setup_requires=["pytest-runner"], | |
|
9 | + setup_requires=["pytest-runner==5.1"], | |
|
10 | extras_require={ | |
|
11 | "dev": ["coverage", "pytest", "pyramid", "tox", "webtest"], | |
|
12 | "demo": ["marshmallow==2.15.3", "pyramid", "apispec", "webtest"], No newline at end of file |
@@ -0,0 +1,12 b'' | |||
|
1 | diff -rup rhodecode-tools-1.4.0-orig/setup.py rhodecode-tools-1.4.0/setup.py | |
|
2 | --- rhodecode-tools-1.4.0/setup-orig.py 2021-03-11 12:34:45.000000000 +0100 | |
|
3 | +++ rhodecode-tools-1.4.0/setup.py 2021-03-11 12:34:56.000000000 +0100 | |
|
4 | @@ -69,7 +69,7 @@ def _get_requirements(req_filename, excl | |
|
5 | ||
|
6 | ||
|
7 | # requirements extract | |
|
8 | -setup_requirements = ['pytest-runner'] | |
|
9 | +setup_requirements = ['pytest-runner==5.1.0'] | |
|
10 | install_requirements = _get_requirements( | |
|
11 | 'requirements.txt', exclude=['setuptools']) | |
|
12 | test_requirements = _get_requirements('requirements_test.txt') No newline at end of file |
@@ -0,0 +1,10 b'' | |||
|
1 | diff -rup zip-1.2.0-orig/pyproject.toml zip-1.2.0/pyproject.toml | |
|
2 | --- zip-1.2.0-orig/pyproject.toml 2021-03-23 10:55:37.000000000 +0100 | |
|
3 | +++ zip-1.2.0/pyproject.toml 2021-03-23 10:56:05.000000000 +0100 | |
|
4 | @@ -1,5 +1,5 @@ | |
|
5 | [build-system] | |
|
6 | -requires = ["setuptools>=34.4", "wheel", "setuptools_scm>=1.15"] | |
|
7 | +requires = ["setuptools<42.0", "wheel", "setuptools_scm<6.0.0"] | |
|
8 | build-backend = "setuptools.build_meta" | |
|
9 | ||
|
10 | [tool.black] |
@@ -0,0 +1,74 b'' | |||
|
1 | # -*- coding: utf-8 -*- | |
|
2 | ||
|
3 | # Copyright (C) 2010-2020 RhodeCode GmbH | |
|
4 | # | |
|
5 | # This program is free software: you can redistribute it and/or modify | |
|
6 | # it under the terms of the GNU Affero General Public License, version 3 | |
|
7 | # (only), as published by the Free Software Foundation. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU Affero General Public License | |
|
15 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
|
16 | # | |
|
17 | # This program is dual-licensed. If you wish to learn more about the | |
|
18 | # RhodeCode Enterprise Edition, including its added features, Support services, | |
|
19 | # and proprietary license terms, please see https://rhodecode.com/licenses/ | |
|
20 | ||
|
21 | import mock | |
|
22 | import pytest | |
|
23 | ||
|
24 | from rhodecode.lib.utils2 import str2bool | |
|
25 | from rhodecode.lib.vcs.exceptions import RepositoryRequirementError | |
|
26 | from rhodecode.model.db import Repository, UserRepoToPerm, Permission, User | |
|
27 | from rhodecode.model.meta import Session | |
|
28 | from rhodecode.tests import ( | |
|
29 | TEST_USER_ADMIN_LOGIN, TEST_USER_REGULAR_LOGIN, assert_session_flash) | |
|
30 | from rhodecode.tests.fixture import Fixture | |
|
31 | ||
|
32 | fixture = Fixture() | |
|
33 | ||
|
34 | ||
|
35 | def route_path(name, params=None, **kwargs): | |
|
36 | import urllib | |
|
37 | ||
|
38 | base_url = { | |
|
39 | 'edit_repo_maintenance': '/{repo_name}/settings/maintenance', | |
|
40 | 'edit_repo_maintenance_execute': '/{repo_name}/settings/maintenance/execute', | |
|
41 | ||
|
42 | }[name].format(**kwargs) | |
|
43 | ||
|
44 | if params: | |
|
45 | base_url = '{}?{}'.format(base_url, urllib.urlencode(params)) | |
|
46 | return base_url | |
|
47 | ||
|
48 | ||
|
49 | def _get_permission_for_user(user, repo): | |
|
50 | perm = UserRepoToPerm.query()\ | |
|
51 | .filter(UserRepoToPerm.repository == | |
|
52 | Repository.get_by_repo_name(repo))\ | |
|
53 | .filter(UserRepoToPerm.user == User.get_by_username(user))\ | |
|
54 | .all() | |
|
55 | return perm | |
|
56 | ||
|
57 | ||
|
58 | @pytest.mark.usefixtures('autologin_user', 'app') | |
|
59 | class TestAdminRepoMaintenance(object): | |
|
60 | @pytest.mark.parametrize('urlname', [ | |
|
61 | 'edit_repo_maintenance', | |
|
62 | ]) | |
|
63 | def test_show_page(self, urlname, app, backend): | |
|
64 | app.get(route_path(urlname, repo_name=backend.repo_name), status=200) | |
|
65 | ||
|
66 | def test_execute_maintenance_for_repo_hg(self, app, backend_hg, autologin_user, xhr_header): | |
|
67 | repo_name = backend_hg.repo_name | |
|
68 | ||
|
69 | response = app.get( | |
|
70 | route_path('edit_repo_maintenance_execute', | |
|
71 | repo_name=repo_name,), | |
|
72 | extra_environ=xhr_header) | |
|
73 | ||
|
74 | assert "HG Verify repo" in ''.join(response.json) |
@@ -1,6 +1,5 b'' | |||
|
1 | 1 | [bumpversion] |
|
2 |
current_version = 4.2 |
|
|
2 | current_version = 4.25.0 | |
|
3 | 3 | message = release: Bump version {current_version} to {new_version} |
|
4 | 4 | |
|
5 | 5 | [bumpversion:file:rhodecode/VERSION] |
|
6 |
@@ -5,25 +5,20 b' done = false' | |||
|
5 | 5 | done = true |
|
6 | 6 | |
|
7 | 7 | [task:rc_tools_pinned] |
|
8 | done = true | |
|
9 | 8 | |
|
10 | 9 | [task:fixes_on_stable] |
|
11 | done = true | |
|
12 | 10 | |
|
13 | 11 | [task:pip2nix_generated] |
|
14 | done = true | |
|
15 | 12 | |
|
16 | 13 | [task:changelog_updated] |
|
17 | done = true | |
|
18 | 14 | |
|
19 | 15 | [task:generate_api_docs] |
|
20 | done = true | |
|
16 | ||
|
17 | [task:updated_translation] | |
|
21 | 18 | |
|
22 | 19 | [release] |
|
23 |
state = |
|
|
24 |
version = 4.2 |
|
|
25 | ||
|
26 | [task:updated_translation] | |
|
20 | state = in_progress | |
|
21 | version = 4.25.0 | |
|
27 | 22 | |
|
28 | 23 | [task:generate_js_routes] |
|
29 | 24 |
@@ -130,6 +130,24 b' file_store_get_info (EE only)' | |||
|
130 | 130 | error : null |
|
131 | 131 | |
|
132 | 132 | |
|
133 | file_store_delete (EE only) | |
|
134 | --------------------------- | |
|
135 | ||
|
136 | .. py:function:: file_store_delete(apiuser, store_fid) | |
|
137 | ||
|
138 | Delete an artifact based on the secret uuid. | |
|
139 | ||
|
140 | Example output: | |
|
141 | ||
|
142 | .. code-block:: bash | |
|
143 | ||
|
144 | id : <id_given_in_input> | |
|
145 | result: { | |
|
146 | "artifact" : {"uid": "some uid", "removed": true} | |
|
147 | } | |
|
148 | error : null | |
|
149 | ||
|
150 | ||
|
133 | 151 | file_store_add_metadata (EE only) |
|
134 | 152 | --------------------------------- |
|
135 | 153 |
@@ -9,6 +9,7 b' Release Notes' | |||
|
9 | 9 | .. toctree:: |
|
10 | 10 | :maxdepth: 1 |
|
11 | 11 | |
|
12 | release-notes-4.25.0.rst | |
|
12 | 13 | release-notes-4.24.1.rst |
|
13 | 14 | release-notes-4.24.0.rst |
|
14 | 15 | release-notes-4.23.2.rst |
@@ -6,7 +6,7 b' diff -rup pytest-4.6.5-orig/setup.py pyt' | |||
|
6 | 6 | setup( |
|
7 | 7 | use_scm_version={"write_to": "src/_pytest/_version.py"}, |
|
8 | 8 | - setup_requires=["setuptools-scm", "setuptools>=40.0"], |
|
9 | + setup_requires=["setuptools-scm", "setuptools<=42.0"], | |
|
9 | + setup_requires=["setuptools-scm<6.0.0", "setuptools<=42.0"], | |
|
10 | 10 | package_dir={"": "src"}, |
|
11 | 11 | # fmt: off |
|
12 | 12 | extras_require={ No newline at end of file |
@@ -280,6 +280,72 b' self: super: {' | |||
|
280 | 280 | ]; |
|
281 | 281 | }); |
|
282 | 282 | |
|
283 | "pytest-runner" = super."pytest-runner".override (attrs: { | |
|
284 | propagatedBuildInputs = [ | |
|
285 | self."setuptools-scm" | |
|
286 | ]; | |
|
287 | }); | |
|
288 | ||
|
289 | "py" = super."py".override (attrs: { | |
|
290 | propagatedBuildInputs = [ | |
|
291 | self."setuptools-scm" | |
|
292 | ]; | |
|
293 | }); | |
|
294 | ||
|
295 | "python-dateutil" = super."python-dateutil".override (attrs: { | |
|
296 | propagatedBuildInputs = attrs.propagatedBuildInputs ++ [ | |
|
297 | self."setuptools-scm" | |
|
298 | ]; | |
|
299 | }); | |
|
300 | ||
|
301 | "configparser" = super."configparser".override (attrs: { | |
|
302 | patches = [ | |
|
303 | ./patches/configparser/pyproject.patch | |
|
304 | ]; | |
|
305 | propagatedBuildInputs = [ | |
|
306 | self."setuptools-scm" | |
|
307 | ]; | |
|
308 | }); | |
|
309 | ||
|
310 | "importlib-metadata" = super."importlib-metadata".override (attrs: { | |
|
311 | ||
|
312 | patches = [ | |
|
313 | ./patches/importlib_metadata/pyproject.patch | |
|
314 | ]; | |
|
315 | ||
|
316 | propagatedBuildInputs = attrs.propagatedBuildInputs ++ [ | |
|
317 | self."setuptools-scm" | |
|
318 | ]; | |
|
319 | ||
|
320 | }); | |
|
321 | ||
|
322 | "zipp" = super."zipp".override (attrs: { | |
|
323 | patches = [ | |
|
324 | ./patches/zipp/pyproject.patch | |
|
325 | ]; | |
|
326 | propagatedBuildInputs = attrs.propagatedBuildInputs ++ [ | |
|
327 | self."setuptools-scm" | |
|
328 | ]; | |
|
329 | }); | |
|
330 | ||
|
331 | "pyramid-apispec" = super."pyramid-apispec".override (attrs: { | |
|
332 | patches = [ | |
|
333 | ./patches/pyramid_apispec/setuptools.patch | |
|
334 | ]; | |
|
335 | }); | |
|
336 | ||
|
337 | "channelstream" = super."channelstream".override (attrs: { | |
|
338 | patches = [ | |
|
339 | ./patches/channelstream/setuptools.patch | |
|
340 | ]; | |
|
341 | }); | |
|
342 | ||
|
343 | "rhodecode-tools" = super."rhodecode-tools".override (attrs: { | |
|
344 | patches = [ | |
|
345 | ./patches/rhodecode_tools/setuptools.patch | |
|
346 | ]; | |
|
347 | }); | |
|
348 | ||
|
283 | 349 | # Avoid that base packages screw up the build process |
|
284 | 350 | inherit (basePythonPackages) |
|
285 | 351 | setuptools; |
@@ -1883,7 +1883,7 b' self: super: {' | |||
|
1883 | 1883 | }; |
|
1884 | 1884 | }; |
|
1885 | 1885 | "rhodecode-enterprise-ce" = super.buildPythonPackage { |
|
1886 |
name = "rhodecode-enterprise-ce-4.2 |
|
|
1886 | name = "rhodecode-enterprise-ce-4.25.0"; | |
|
1887 | 1887 | buildInputs = [ |
|
1888 | 1888 | self."pytest" |
|
1889 | 1889 | self."py" |
@@ -2092,6 +2092,17 b' self: super: {' | |||
|
2092 | 2092 | license = [ pkgs.lib.licenses.mit ]; |
|
2093 | 2093 | }; |
|
2094 | 2094 | }; |
|
2095 | "setuptools-scm" = super.buildPythonPackage { | |
|
2096 | name = "setuptools-scm-3.5.0"; | |
|
2097 | doCheck = false; | |
|
2098 | src = fetchurl { | |
|
2099 | url = "https://files.pythonhosted.org/packages/b2/f7/60a645aae001a2e06cf4b8db2fba9d9f36b8fd378f10647e3e218b61b74b/setuptools_scm-3.5.0.tar.gz"; | |
|
2100 | sha256 = "5bdf21a05792903cafe7ae0c9501182ab52497614fa6b1750d9dbae7b60c1a87"; | |
|
2101 | }; | |
|
2102 | meta = { | |
|
2103 | license = [ pkgs.lib.licenses.psfl ]; | |
|
2104 | }; | |
|
2105 | }; | |
|
2095 | 2106 | "simplegeneric" = super.buildPythonPackage { |
|
2096 | 2107 | name = "simplegeneric-0.8.1"; |
|
2097 | 2108 | doCheck = false; |
@@ -1212,7 +1212,7 b' def fork_repo(request, apiuser, repoid, ' | |||
|
1212 | 1212 | validate_repo_permissions(apiuser, repoid, repo, _perms) |
|
1213 | 1213 | |
|
1214 | 1214 | # check if the regular user has at least fork permissions as well |
|
1215 |
if not HasPermissionAnyApi( |
|
|
1215 | if not HasPermissionAnyApi(PermissionModel.FORKING_ENABLED)(user=apiuser): | |
|
1216 | 1216 | raise JSONRPCForbidden() |
|
1217 | 1217 | |
|
1218 | 1218 | # check if user can set owner parameter |
@@ -255,7 +255,7 b' class LocalFileStorage(object):' | |||
|
255 | 255 | |
|
256 | 256 | return filename, metadata |
|
257 | 257 | |
|
258 | def get_metadata(self, filename): | |
|
258 | def get_metadata(self, filename, ignore_missing=False): | |
|
259 | 259 | """ |
|
260 | 260 | Reads JSON stored metadata for a file |
|
261 | 261 | |
@@ -264,6 +264,7 b' class LocalFileStorage(object):' | |||
|
264 | 264 | """ |
|
265 | 265 | filename = self.store_path(filename) |
|
266 | 266 | filename_meta = filename + '.meta' |
|
267 | ||
|
267 | if ignore_missing and not os.path.isfile(filename_meta): | |
|
268 | return {} | |
|
268 | 269 | with open(filename_meta, "rb") as source_meta: |
|
269 | 270 | return json.loads(source_meta.read()) |
@@ -932,8 +932,8 b' def includeme(config):' | |||
|
932 | 932 | name='edit_repo_perms_branch', |
|
933 | 933 | pattern='/{repo_name:.*?[^/]}/settings/branch_permissions', repo_route=True) |
|
934 | 934 | config.add_view( |
|
935 | RepoBranchesView, | |
|
936 | attr='branches', | |
|
935 | RepoSettingsBranchPermissionsView, | |
|
936 | attr='branch_permissions', | |
|
937 | 937 | route_name='edit_repo_perms_branch', request_method='GET', |
|
938 | 938 | renderer='rhodecode:templates/admin/repos/repo_edit.mako') |
|
939 | 939 | |
@@ -950,8 +950,8 b' def includeme(config):' | |||
|
950 | 950 | config.add_view( |
|
951 | 951 | RepoMaintenanceView, |
|
952 | 952 | attr='repo_maintenance', |
|
953 |
route_name='edit_repo_maintenance |
|
|
954 | renderer='json', xhr=True) | |
|
953 | route_name='edit_repo_maintenance', request_method='GET', | |
|
954 | renderer='rhodecode:templates/admin/repos/repo_edit.mako') | |
|
955 | 955 | |
|
956 | 956 | config.add_route( |
|
957 | 957 | name='edit_repo_maintenance_execute', |
@@ -959,8 +959,8 b' def includeme(config):' | |||
|
959 | 959 | config.add_view( |
|
960 | 960 | RepoMaintenanceView, |
|
961 | 961 | attr='repo_maintenance_execute', |
|
962 | route_name='edit_repo_maintenance', request_method='GET', | |
|
963 | renderer='rhodecode:templates/admin/repos/repo_edit.mako') | |
|
962 | route_name='edit_repo_maintenance_execute', request_method='GET', | |
|
963 | renderer='json', xhr=True) | |
|
964 | 964 | |
|
965 | 965 | # Fields |
|
966 | 966 | config.add_route( |
@@ -542,6 +542,28 b' class TestRepositoryArchival(object):' | |||
|
542 | 542 | for header in headers: |
|
543 | 543 | assert header in response.headers.items() |
|
544 | 544 | |
|
545 | def test_archival_no_hash(self, backend): | |
|
546 | backend.enable_downloads() | |
|
547 | commit = backend.repo.get_commit(commit_idx=173) | |
|
548 | for a_type, content_type, extension in settings.ARCHIVE_SPECS: | |
|
549 | ||
|
550 | short = 'plain' + extension | |
|
551 | fname = commit.raw_id + extension | |
|
552 | filename = '%s-%s' % (backend.repo_name, short) | |
|
553 | response = self.app.get( | |
|
554 | route_path('repo_archivefile', | |
|
555 | repo_name=backend.repo_name, | |
|
556 | fname=fname, params={'with_hash': 0})) | |
|
557 | ||
|
558 | assert response.status == '200 OK' | |
|
559 | headers = [ | |
|
560 | ('Content-Disposition', 'attachment; filename=%s' % filename), | |
|
561 | ('Content-Type', '%s' % content_type), | |
|
562 | ] | |
|
563 | ||
|
564 | for header in headers: | |
|
565 | assert header in response.headers.items() | |
|
566 | ||
|
545 | 567 | @pytest.mark.parametrize('arch_ext',[ |
|
546 | 568 | 'tar', 'rar', 'x', '..ax', '.zipz', 'tar.gz.tar']) |
|
547 | 569 | def test_archival_wrong_ext(self, backend, arch_ext): |
@@ -34,7 +34,7 b' from rhodecode.lib.auth import (' | |||
|
34 | 34 | from rhodecode.lib.ext_json import json |
|
35 | 35 | from rhodecode.lib.graphmod import _colored, _dagwalker |
|
36 | 36 | from rhodecode.lib.helpers import RepoPage |
|
37 | from rhodecode.lib.utils2 import safe_int, safe_str, str2bool | |
|
37 | from rhodecode.lib.utils2 import safe_int, safe_str, str2bool, safe_unicode | |
|
38 | 38 | from rhodecode.lib.vcs.exceptions import ( |
|
39 | 39 | RepositoryError, CommitDoesNotExistError, |
|
40 | 40 | CommitError, NodeDoesNotExistError, EmptyRepositoryError) |
@@ -110,7 +110,7 b' class RepoChangelogView(RepoAppView):' | |||
|
110 | 110 | |
|
111 | 111 | def _check_if_valid_branch(self, branch_name, repo_name, f_path): |
|
112 | 112 | if branch_name not in self.rhodecode_vcs_repo.branches_all: |
|
113 | h.flash('Branch {} is not found.'.format(h.escape(branch_name)), | |
|
113 | h.flash(u'Branch {} is not found.'.format(h.escape(safe_unicode(branch_name))), | |
|
114 | 114 | category='warning') |
|
115 | 115 | redirect_url = h.route_path( |
|
116 | 116 | 'repo_commits_file', repo_name=repo_name, |
@@ -674,6 +674,10 b' class RepoCommitsView(RepoAppView):' | |||
|
674 | 674 | is_repo_comment = comment.repo.repo_id == self.db_repo.repo_id |
|
675 | 675 | comment_repo_admin = is_repo_admin and is_repo_comment |
|
676 | 676 | |
|
677 | if comment.draft and not comment_owner: | |
|
678 | # We never allow to delete draft comments for other than owners | |
|
679 | raise HTTPNotFound() | |
|
680 | ||
|
677 | 681 | if super_admin or comment_owner or comment_repo_admin: |
|
678 | 682 | CommentsModel().delete(comment=comment, auth_user=self._rhodecode_user) |
|
679 | 683 | Session().commit() |
@@ -104,6 +104,9 b' class RepoFeedView(RepoAppView):' | |||
|
104 | 104 | |
|
105 | 105 | def _get_commits(self): |
|
106 | 106 | pre_load = ['author', 'branch', 'date', 'message', 'parents'] |
|
107 | if self.rhodecode_vcs_repo.is_empty(): | |
|
108 | return [] | |
|
109 | ||
|
107 | 110 | collection = self.rhodecode_vcs_repo.get_commits( |
|
108 | 111 | branch_name=None, show_hidden=False, pre_load=pre_load, |
|
109 | 112 | translate_tags=False) |
@@ -137,6 +140,7 b' class RepoFeedView(RepoAppView):' | |||
|
137 | 140 | language=self.language, |
|
138 | 141 | ttl=self.ttl |
|
139 | 142 | ) |
|
143 | ||
|
140 | 144 | for commit in reversed(self._get_commits()): |
|
141 | 145 | date = self._set_timezone(commit.date) |
|
142 | 146 | feed.add_item( |
@@ -325,17 +325,18 b' class RepoFilesView(RepoAppView):' | |||
|
325 | 325 | |
|
326 | 326 | return lf_enabled |
|
327 | 327 | |
|
328 | def _get_archive_name(self, db_repo_name, commit_sha, ext, subrepos=False, path_sha=''): | |
|
328 | def _get_archive_name(self, db_repo_name, commit_sha, ext, subrepos=False, path_sha='', with_hash=True): | |
|
329 | 329 | # original backward compat name of archive |
|
330 | 330 | clean_name = safe_str(db_repo_name.replace('/', '_')) |
|
331 | 331 | |
|
332 | 332 | # e.g vcsserver.zip |
|
333 | 333 | # e.g vcsserver-abcdefgh.zip |
|
334 | 334 | # e.g vcsserver-abcdefgh-defghijk.zip |
|
335 | archive_name = '{}{}{}{}{}'.format( | |
|
335 | archive_name = '{}{}{}{}{}{}'.format( | |
|
336 | 336 | clean_name, |
|
337 | 337 | '-sub' if subrepos else '', |
|
338 | 338 | commit_sha, |
|
339 | '-{}'.format('plain') if not with_hash else '', | |
|
339 | 340 | '-{}'.format(path_sha) if path_sha else '', |
|
340 | 341 | ext) |
|
341 | 342 | return archive_name |
@@ -372,6 +373,11 b' class RepoFilesView(RepoAppView):' | |||
|
372 | 373 | except EmptyRepositoryError: |
|
373 | 374 | return Response(_('Empty repository')) |
|
374 | 375 | |
|
376 | # we used a ref, or a shorter version, lets redirect client ot use explicit hash | |
|
377 | if commit_id != commit.raw_id: | |
|
378 | fname='{}{}'.format(commit.raw_id, ext) | |
|
379 | raise HTTPFound(self.request.current_route_path(fname=fname)) | |
|
380 | ||
|
375 | 381 | try: |
|
376 | 382 | at_path = commit.get_node(at_path).path or default_at_path |
|
377 | 383 | except Exception: |
@@ -385,7 +391,7 b' class RepoFilesView(RepoAppView):' | |||
|
385 | 391 | # used for cache etc |
|
386 | 392 | archive_name = self._get_archive_name( |
|
387 | 393 | self.db_repo_name, commit_sha=short_sha, ext=ext, subrepos=subrepos, |
|
388 | path_sha=path_sha) | |
|
394 | path_sha=path_sha, with_hash=with_hash) | |
|
389 | 395 | |
|
390 | 396 | if not with_hash: |
|
391 | 397 | short_sha = '' |
@@ -394,7 +400,7 b' class RepoFilesView(RepoAppView):' | |||
|
394 | 400 | # what end client gets served |
|
395 | 401 | response_archive_name = self._get_archive_name( |
|
396 | 402 | self.db_repo_name, commit_sha=short_sha, ext=ext, subrepos=subrepos, |
|
397 | path_sha=path_sha) | |
|
403 | path_sha=path_sha, with_hash=with_hash) | |
|
398 | 404 | # remove extension from our archive directory name |
|
399 | 405 | archive_dir_name = response_archive_name[:-len(ext)] |
|
400 | 406 | |
@@ -404,9 +410,10 b' class RepoFilesView(RepoAppView):' | |||
|
404 | 410 | cached_archive_path = None |
|
405 | 411 | |
|
406 | 412 | if archive_cache_enabled: |
|
407 | # check if we it's ok to write | |
|
413 | # check if we it's ok to write, and re-create the archive cache | |
|
408 | 414 | if not os.path.isdir(CONFIG['archive_cache_dir']): |
|
409 | 415 | os.makedirs(CONFIG['archive_cache_dir']) |
|
416 | ||
|
410 | 417 | cached_archive_path = os.path.join( |
|
411 | 418 | CONFIG['archive_cache_dir'], archive_name) |
|
412 | 419 | if os.path.isfile(cached_archive_path): |
@@ -165,7 +165,7 b' class RepoForksView(RepoAppView, DataGri' | |||
|
165 | 165 | |
|
166 | 166 | @LoginRequired() |
|
167 | 167 | @NotAnonymous() |
|
168 |
@HasPermissionAnyDecorator('hg.admin', |
|
|
168 | @HasPermissionAnyDecorator('hg.admin', PermissionModel.FORKING_ENABLED) | |
|
169 | 169 | @HasRepoPermissionAnyDecorator( |
|
170 | 170 | 'repository.read', 'repository.write', 'repository.admin') |
|
171 | 171 | def repo_fork_new(self): |
@@ -191,7 +191,7 b' class RepoForksView(RepoAppView, DataGri' | |||
|
191 | 191 | |
|
192 | 192 | @LoginRequired() |
|
193 | 193 | @NotAnonymous() |
|
194 |
@HasPermissionAnyDecorator('hg.admin', |
|
|
194 | @HasPermissionAnyDecorator('hg.admin', PermissionModel.FORKING_ENABLED) | |
|
195 | 195 | @HasRepoPermissionAnyDecorator( |
|
196 | 196 | 'repository.read', 'repository.write', 'repository.admin') |
|
197 | 197 | @CSRFRequired() |
@@ -1748,6 +1748,10 b' class RepoPullRequestsView(RepoAppView, ' | |||
|
1748 | 1748 | is_repo_comment = comment.repo.repo_name == self.db_repo_name |
|
1749 | 1749 | comment_repo_admin = is_repo_admin and is_repo_comment |
|
1750 | 1750 | |
|
1751 | if comment.draft and not comment_owner: | |
|
1752 | # We never allow to delete draft comments for other than owners | |
|
1753 | raise HTTPNotFound() | |
|
1754 | ||
|
1751 | 1755 | if super_admin or comment_owner or comment_repo_admin: |
|
1752 | 1756 | old_calculated_status = comment.pull_request.calculated_review_status() |
|
1753 | 1757 | CommentsModel().delete(comment=comment, auth_user=self._rhodecode_user) |
@@ -89,6 +89,14 b' class SshWrapper(object):' | |||
|
89 | 89 | |
|
90 | 90 | return conn |
|
91 | 91 | |
|
92 | def maybe_translate_repo_uid(self, repo_name): | |
|
93 | if repo_name.startswith('_'): | |
|
94 | from rhodecode.model.repo import RepoModel | |
|
95 | by_id_match = RepoModel().get_repo_by_id(repo_name) | |
|
96 | if by_id_match: | |
|
97 | repo_name = by_id_match.repo_name | |
|
98 | return repo_name | |
|
99 | ||
|
92 | 100 | def get_repo_details(self, mode): |
|
93 | 101 | vcs_type = mode if mode in ['svn', 'hg', 'git'] else None |
|
94 | 102 | repo_name = None |
@@ -97,14 +105,14 b' class SshWrapper(object):' | |||
|
97 | 105 | hg_match = re.match(hg_pattern, self.command) |
|
98 | 106 | if hg_match is not None: |
|
99 | 107 | vcs_type = 'hg' |
|
100 | repo_name = hg_match.group(1).strip('/') | |
|
108 | repo_name = self.maybe_translate_repo_uid(hg_match.group(1).strip('/')) | |
|
101 | 109 | return vcs_type, repo_name, mode |
|
102 | 110 | |
|
103 | 111 | git_pattern = r'^git-(receive-pack|upload-pack)\s\'[/]?(\S+?)(|\.git)\'$' |
|
104 | 112 | git_match = re.match(git_pattern, self.command) |
|
105 | 113 | if git_match is not None: |
|
106 | 114 | vcs_type = 'git' |
|
107 | repo_name = git_match.group(2).strip('/') | |
|
115 | repo_name = self.maybe_translate_repo_uid(git_match.group(2).strip('/')) | |
|
108 | 116 | mode = git_match.group(1) |
|
109 | 117 | return vcs_type, repo_name, mode |
|
110 | 118 |
@@ -19,6 +19,8 b'' | |||
|
19 | 19 | # and proprietary license terms, please see https://rhodecode.com/licenses/ |
|
20 | 20 | |
|
21 | 21 | import json |
|
22 | import os | |
|
23 | ||
|
22 | 24 | import mock |
|
23 | 25 | import pytest |
|
24 | 26 | |
@@ -107,6 +109,8 b' class TestGitServer(object):' | |||
|
107 | 109 | def test_run_returns_executes_command(self, git_server): |
|
108 | 110 | server = git_server.create() |
|
109 | 111 | from rhodecode.apps.ssh_support.lib.backends.git import GitTunnelWrapper |
|
112 | ||
|
113 | os.environ['SSH_CLIENT'] = '127.0.0.1' | |
|
110 | 114 | with mock.patch.object(GitTunnelWrapper, 'create_hooks_env') as _patch: |
|
111 | 115 | _patch.return_value = 0 |
|
112 | 116 | with mock.patch.object(GitTunnelWrapper, 'command', return_value='date'): |
@@ -108,6 +108,7 b' class TestMercurialServer(object):' | |||
|
108 | 108 | def test_run_returns_executes_command(self, hg_server): |
|
109 | 109 | server = hg_server.create() |
|
110 | 110 | from rhodecode.apps.ssh_support.lib.backends.hg import MercurialTunnelWrapper |
|
111 | os.environ['SSH_CLIENT'] = '127.0.0.1' | |
|
111 | 112 | with mock.patch.object(MercurialTunnelWrapper, 'create_hooks_env') as _patch: |
|
112 | 113 | _patch.return_value = 0 |
|
113 | 114 | with mock.patch.object(MercurialTunnelWrapper, 'command', return_value='date'): |
@@ -17,7 +17,7 b'' | |||
|
17 | 17 | # This program is dual-licensed. If you wish to learn more about the |
|
18 | 18 | # RhodeCode Enterprise Edition, including its added features, Support services, |
|
19 | 19 | # and proprietary license terms, please see https://rhodecode.com/licenses/ |
|
20 | ||
|
20 | import os | |
|
21 | 21 | import mock |
|
22 | 22 | import pytest |
|
23 | 23 | |
@@ -174,6 +174,7 b' class TestSubversionServer(object):' | |||
|
174 | 174 | def test_run_returns_executes_command(self, svn_server): |
|
175 | 175 | server = svn_server.create() |
|
176 | 176 | from rhodecode.apps.ssh_support.lib.backends.svn import SubversionTunnelWrapper |
|
177 | os.environ['SSH_CLIENT'] = '127.0.0.1' | |
|
177 | 178 | with mock.patch.object( |
|
178 | 179 | SubversionTunnelWrapper, 'get_first_client_response', |
|
179 | 180 | return_value={'url': 'http://server/test-svn'}): |
@@ -32,6 +32,7 b' import json' | |||
|
32 | 32 | from rhodecode.lib import diffs |
|
33 | 33 | from rhodecode.lib.vcs.backends.hg.diff import MercurialDiff |
|
34 | 34 | from rhodecode.lib.vcs.backends.git.diff import GitDiff |
|
35 | from vcsserver.utils import safe_int | |
|
35 | 36 | |
|
36 | 37 | |
|
37 | 38 | def get_svn_files(repo, vcs_repo, refs): |
@@ -74,7 +75,7 b' def get_svn_files(repo, vcs_repo, refs):' | |||
|
74 | 75 | # skip dirs |
|
75 | 76 | continue |
|
76 | 77 | |
|
77 | parsed_entry['file_size'] = int(stdout.strip()) | |
|
78 | parsed_entry['file_size'] = safe_int(stdout.strip()) or 0 | |
|
78 | 79 | |
|
79 | 80 | files.append(parsed_entry) |
|
80 | 81 |
@@ -524,8 +524,10 b' class PermissionCalculator(object):' | |||
|
524 | 524 | |
|
525 | 525 | # In case we want to extend this list we should make sure |
|
526 | 526 | # this is in sync with User.DEFAULT_USER_PERMISSIONS definitions |
|
527 | from rhodecode.model.permission import PermissionModel | |
|
528 | ||
|
527 | 529 | _configurable = frozenset([ |
|
528 | 'hg.fork.none', 'hg.fork.repository', | |
|
530 | PermissionModel.FORKING_DISABLED, PermissionModel.FORKING_ENABLED, | |
|
529 | 531 | 'hg.create.none', 'hg.create.repository', |
|
530 | 532 | 'hg.usergroup.create.false', 'hg.usergroup.create.true', |
|
531 | 533 | 'hg.repogroup.create.false', 'hg.repogroup.create.true', |
@@ -25,6 +25,7 b' Consists of functions to typically be us' | |||
|
25 | 25 | available to Controllers. This module is available to both as 'h'. |
|
26 | 26 | """ |
|
27 | 27 | import base64 |
|
28 | import collections | |
|
28 | 29 | |
|
29 | 30 | import os |
|
30 | 31 | import random |
@@ -1733,7 +1734,7 b' def process_patterns(text_string, repo_n' | |||
|
1733 | 1734 | |
|
1734 | 1735 | |
|
1735 | 1736 | def urlify_commit_message(commit_text, repository=None, active_pattern_entries=None, |
|
1736 | issues_container=None, error_container=None): | |
|
1737 | issues_container_callback=None, error_container=None): | |
|
1737 | 1738 | """ |
|
1738 | 1739 | Parses given text message and makes proper links. |
|
1739 | 1740 | issues are linked to given issue-server, and rest is a commit link |
@@ -1756,8 +1757,9 b' def urlify_commit_message(commit_text, r' | |||
|
1756 | 1757 | new_text, issues, errors = process_patterns( |
|
1757 | 1758 | new_text, repository or '', active_entries=active_pattern_entries) |
|
1758 | 1759 | |
|
1759 | if issues_container is not None: | |
|
1760 | issues_container.extend(issues) | |
|
1760 | if issues_container_callback is not None: | |
|
1761 | for issue in issues: | |
|
1762 | issues_container_callback(issue) | |
|
1761 | 1763 | |
|
1762 | 1764 | if error_container is not None: |
|
1763 | 1765 | error_container.extend(errors) |
@@ -1802,7 +1804,7 b' def renderer_from_filename(filename, exc' | |||
|
1802 | 1804 | |
|
1803 | 1805 | |
|
1804 | 1806 | def render(source, renderer='rst', mentions=False, relative_urls=None, |
|
1805 | repo_name=None, active_pattern_entries=None, issues_container=None): | |
|
1807 | repo_name=None, active_pattern_entries=None, issues_container_callback=None): | |
|
1806 | 1808 | |
|
1807 | 1809 | def maybe_convert_relative_links(html_source): |
|
1808 | 1810 | if relative_urls: |
@@ -1819,8 +1821,9 b" def render(source, renderer='rst', menti" | |||
|
1819 | 1821 | source, issues, errors = process_patterns( |
|
1820 | 1822 | source, repo_name, link_format='rst', |
|
1821 | 1823 | active_entries=active_pattern_entries) |
|
1822 | if issues_container is not None: | |
|
1823 | issues_container.extend(issues) | |
|
1824 | if issues_container_callback is not None: | |
|
1825 | for issue in issues: | |
|
1826 | issues_container_callback(issue) | |
|
1824 | 1827 | |
|
1825 | 1828 | return literal( |
|
1826 | 1829 | '<div class="rst-block">%s</div>' % |
@@ -1833,8 +1836,10 b" def render(source, renderer='rst', menti" | |||
|
1833 | 1836 | source, issues, errors = process_patterns( |
|
1834 | 1837 | source, repo_name, link_format='markdown', |
|
1835 | 1838 | active_entries=active_pattern_entries) |
|
1836 | if issues_container is not None: | |
|
1837 | issues_container.extend(issues) | |
|
1839 | if issues_container_callback is not None: | |
|
1840 | for issue in issues: | |
|
1841 | issues_container_callback(issue) | |
|
1842 | ||
|
1838 | 1843 | |
|
1839 | 1844 | return literal( |
|
1840 | 1845 | '<div class="markdown-block">%s</div>' % |
@@ -2115,3 +2120,29 b' def is_active(menu_entry, selected):' | |||
|
2115 | 2120 | |
|
2116 | 2121 | if selected in menu_entry: |
|
2117 | 2122 | return "active" |
|
2123 | ||
|
2124 | ||
|
2125 | class IssuesRegistry(object): | |
|
2126 | """ | |
|
2127 | issue_registry = IssuesRegistry() | |
|
2128 | some_func(issues_callback=issues_registry(...)) | |
|
2129 | """ | |
|
2130 | ||
|
2131 | def __init__(self): | |
|
2132 | self.issues = [] | |
|
2133 | self.unique_issues = collections.defaultdict(lambda: []) | |
|
2134 | ||
|
2135 | def __call__(self, commit_dict=None): | |
|
2136 | def callback(issue): | |
|
2137 | if commit_dict and issue: | |
|
2138 | issue['commit'] = commit_dict | |
|
2139 | self.issues.append(issue) | |
|
2140 | self.unique_issues[issue['id']].append(issue) | |
|
2141 | return callback | |
|
2142 | ||
|
2143 | def get_issues(self): | |
|
2144 | return self.issues | |
|
2145 | ||
|
2146 | @property | |
|
2147 | def issues_unique_count(self): | |
|
2148 | return len(set(i['id'] for i in self.issues)) |
@@ -161,15 +161,28 b' def detect_vcs_request(environ, backends' | |||
|
161 | 161 | # List of path views first chunk we don't do any checks |
|
162 | 162 | white_list = [ |
|
163 | 163 | # e.g /_file_store/download |
|
164 | '_file_store' | |
|
164 | '_file_store', | |
|
165 | ||
|
166 | # static files no detection | |
|
167 | '_static', | |
|
168 | ||
|
169 | # full channelstream connect should be VCS skipped | |
|
170 | '_admin/channelstream/connect', | |
|
165 | 171 | ] |
|
166 | 172 | |
|
167 | 173 | path_info = environ['PATH_INFO'] |
|
168 | 174 | |
|
169 |
|
|
|
175 | path_elem = get_path_elem(path_info) | |
|
176 | ||
|
177 | if path_elem in white_list: | |
|
170 | 178 | log.debug('path `%s` in whitelist, skipping...', path_info) |
|
171 | 179 | return handler |
|
172 | 180 | |
|
181 | path_url = path_info.lstrip('/') | |
|
182 | if path_url in white_list: | |
|
183 | log.debug('full url path `%s` in whitelist, skipping...', path_url) | |
|
184 | return handler | |
|
185 | ||
|
173 | 186 | if VCS_TYPE_KEY in environ: |
|
174 | 187 | raw_type = environ[VCS_TYPE_KEY] |
|
175 | 188 | if raw_type == VCS_TYPE_SKIP: |
@@ -181,7 +194,7 b' def detect_vcs_request(environ, backends' | |||
|
181 | 194 | log.debug('got handler:%s from environ', handler) |
|
182 | 195 | |
|
183 | 196 | if not handler: |
|
184 | log.debug('request start: checking if request is of VCS type in order: %s', backends) | |
|
197 | log.debug('request start: checking if request for `%s` is of VCS type in order: %s', path_elem, backends) | |
|
185 | 198 | for vcs_type in backends: |
|
186 | 199 | vcs_check, _handler = checks[vcs_type] |
|
187 | 200 | if vcs_check(environ): |
@@ -594,6 +594,9 b' def credentials_filter(uri):' | |||
|
594 | 594 | :param uri: |
|
595 | 595 | """ |
|
596 | 596 | import urlobject |
|
597 | if isinstance(uri, rhodecode.lib.encrypt.InvalidDecryptedValue): | |
|
598 | return 'InvalidDecryptionKey' | |
|
599 | ||
|
597 | 600 | url_obj = urlobject.URLObject(cleaned_uri(uri)) |
|
598 | 601 | url_obj = url_obj.without_password().without_username() |
|
599 | 602 | |
@@ -655,7 +658,7 b' def get_clone_url(request, uri_tmpl, rep' | |||
|
655 | 658 | |
|
656 | 659 | |
|
657 | 660 | def get_commit_safe(repo, commit_id=None, commit_idx=None, pre_load=None, |
|
658 | maybe_unreachable=False): | |
|
661 | maybe_unreachable=False, reference_obj=None): | |
|
659 | 662 | """ |
|
660 | 663 | Safe version of get_commit if this commit doesn't exists for a |
|
661 | 664 | repository it returns a Dummy one instead |
@@ -665,6 +668,7 b' def get_commit_safe(repo, commit_id=None' | |||
|
665 | 668 | :param commit_idx: numeric commit index |
|
666 | 669 | :param pre_load: optional list of commit attributes to load |
|
667 | 670 | :param maybe_unreachable: translate unreachable commits on git repos |
|
671 | :param reference_obj: explicitly search via a reference obj in git. E.g "branch:123" would mean branch "123" | |
|
668 | 672 | """ |
|
669 | 673 | # TODO(skreft): remove these circular imports |
|
670 | 674 | from rhodecode.lib.vcs.backends.base import BaseRepository, EmptyCommit |
@@ -676,7 +680,7 b' def get_commit_safe(repo, commit_id=None' | |||
|
676 | 680 | try: |
|
677 | 681 | commit = repo.get_commit( |
|
678 | 682 | commit_id=commit_id, commit_idx=commit_idx, pre_load=pre_load, |
|
679 | maybe_unreachable=maybe_unreachable) | |
|
683 | maybe_unreachable=maybe_unreachable, reference_obj=reference_obj) | |
|
680 | 684 | except (RepositoryError, LookupError): |
|
681 | 685 | commit = EmptyCommit() |
|
682 | 686 | return commit |
@@ -72,6 +72,10 b' class Reference(_Reference):' | |||
|
72 | 72 | if self.type == 'book': |
|
73 | 73 | return self.name |
|
74 | 74 | |
|
75 | @property | |
|
76 | def to_unicode(self): | |
|
77 | return reference_to_unicode(self) | |
|
78 | ||
|
75 | 79 | |
|
76 | 80 | def unicode_to_reference(raw): |
|
77 | 81 | """ |
@@ -483,7 +487,7 b' class BaseRepository(object):' | |||
|
483 | 487 | self._is_empty = False |
|
484 | 488 | |
|
485 | 489 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, |
|
486 | translate_tag=None, maybe_unreachable=False): | |
|
490 | translate_tag=None, maybe_unreachable=False, reference_obj=None): | |
|
487 | 491 | """ |
|
488 | 492 | Returns instance of `BaseCommit` class. If `commit_id` and `commit_idx` |
|
489 | 493 | are both None, most recent commit is returned. |
@@ -98,7 +98,7 b' class GitCommit(base.BaseCommit):' | |||
|
98 | 98 | elif attr == "parents": |
|
99 | 99 | value = self._make_commits(value) |
|
100 | 100 | elif attr == "branch": |
|
101 | value = value[0] if value else None | |
|
101 | value = self._set_branch(value) | |
|
102 | 102 | self.__dict__[attr] = value |
|
103 | 103 | |
|
104 | 104 | @LazyProperty |
@@ -156,13 +156,15 b' class GitCommit(base.BaseCommit):' | |||
|
156 | 156 | branches.append(name) |
|
157 | 157 | return branches |
|
158 | 158 | |
|
159 | def _set_branch(self, branches): | |
|
160 | if branches: | |
|
161 | # actually commit can have multiple branches in git | |
|
162 | return safe_unicode(branches[0]) | |
|
163 | ||
|
159 | 164 | @LazyProperty |
|
160 | 165 | def branch(self): |
|
161 | 166 | branches = self._remote.branch(self.raw_id) |
|
162 | ||
|
163 | if branches: | |
|
164 | # actually commit can have multiple branches in git | |
|
165 | return safe_unicode(branches[0]) | |
|
167 | return self._set_branch(branches) | |
|
166 | 168 | |
|
167 | 169 | def _get_tree_id_for_path(self, path): |
|
168 | 170 | path = safe_str(path) |
@@ -228,7 +228,8 b' class GitRepository(BaseRepository):' | |||
|
228 | 228 | return [] |
|
229 | 229 | return output.splitlines() |
|
230 | 230 | |
|
231 | def _lookup_commit(self, commit_id_or_idx, translate_tag=True, maybe_unreachable=False): | |
|
231 | def _lookup_commit(self, commit_id_or_idx, translate_tag=True, maybe_unreachable=False, reference_obj=None): | |
|
232 | ||
|
232 | 233 | def is_null(value): |
|
233 | 234 | return len(value) == commit_id_or_idx.count('0') |
|
234 | 235 | |
@@ -239,21 +240,34 b' class GitRepository(BaseRepository):' | |||
|
239 | 240 | *map(safe_str, [commit_id_or_idx, self.name])) |
|
240 | 241 | |
|
241 | 242 | is_bstr = isinstance(commit_id_or_idx, (str, unicode)) |
|
242 | if ((is_bstr and commit_id_or_idx.isdigit() and len(commit_id_or_idx) < 12) | |
|
243 | or isinstance(commit_id_or_idx, int) or is_null(commit_id_or_idx)): | |
|
244 | try: | |
|
245 | commit_id_or_idx = self.commit_ids[int(commit_id_or_idx)] | |
|
246 | except Exception: | |
|
247 | raise CommitDoesNotExistError(commit_missing_err) | |
|
243 | is_branch = reference_obj and reference_obj.branch | |
|
248 | 244 | |
|
249 | elif is_bstr: | |
|
250 | # Need to call remote to translate id for tagging scenario | |
|
245 | lookup_ok = False | |
|
246 | if is_bstr: | |
|
247 | # Need to call remote to translate id for tagging scenarios, | |
|
248 | # or branch that are numeric | |
|
251 | 249 | try: |
|
252 | 250 | remote_data = self._remote.get_object(commit_id_or_idx, |
|
253 | 251 | maybe_unreachable=maybe_unreachable) |
|
254 | 252 | commit_id_or_idx = remote_data["commit_id"] |
|
253 | lookup_ok = True | |
|
255 | 254 | except (CommitDoesNotExistError,): |
|
256 | raise CommitDoesNotExistError(commit_missing_err) | |
|
255 | lookup_ok = False | |
|
256 | ||
|
257 | if lookup_ok is False: | |
|
258 | is_numeric_idx = \ | |
|
259 | (is_bstr and commit_id_or_idx.isdigit() and len(commit_id_or_idx) < 12) \ | |
|
260 | or isinstance(commit_id_or_idx, int) | |
|
261 | if not is_branch and (is_numeric_idx or is_null(commit_id_or_idx)): | |
|
262 | try: | |
|
263 | commit_id_or_idx = self.commit_ids[int(commit_id_or_idx)] | |
|
264 | lookup_ok = True | |
|
265 | except Exception: | |
|
266 | raise CommitDoesNotExistError(commit_missing_err) | |
|
267 | ||
|
268 | # we failed regular lookup, and by integer number lookup | |
|
269 | if lookup_ok is False: | |
|
270 | raise CommitDoesNotExistError(commit_missing_err) | |
|
257 | 271 | |
|
258 | 272 | # Ensure we return full id |
|
259 | 273 | if not SHA_PATTERN.match(str(commit_id_or_idx)): |
@@ -413,11 +427,12 b' class GitRepository(BaseRepository):' | |||
|
413 | 427 | return |
|
414 | 428 | |
|
415 | 429 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, |
|
416 | translate_tag=True, maybe_unreachable=False): | |
|
430 | translate_tag=True, maybe_unreachable=False, reference_obj=None): | |
|
417 | 431 | """ |
|
418 | 432 | Returns `GitCommit` object representing commit from git repository |
|
419 | 433 | at the given `commit_id` or head (most recent commit) if None given. |
|
420 | 434 | """ |
|
435 | ||
|
421 | 436 | if self.is_empty(): |
|
422 | 437 | raise EmptyRepositoryError("There are no commits yet") |
|
423 | 438 | |
@@ -443,7 +458,9 b' class GitRepository(BaseRepository):' | |||
|
443 | 458 | commit_id = "tip" |
|
444 | 459 | |
|
445 | 460 | if translate_tag: |
|
446 |
commit_id = self._lookup_commit( |
|
|
461 | commit_id = self._lookup_commit( | |
|
462 | commit_id, maybe_unreachable=maybe_unreachable, | |
|
463 | reference_obj=reference_obj) | |
|
447 | 464 | |
|
448 | 465 | try: |
|
449 | 466 | idx = self._commit_ids[commit_id] |
@@ -437,7 +437,7 b' class MercurialRepository(BaseRepository' | |||
|
437 | 437 | return os.path.join(self.path, '.hg', '.hgrc') |
|
438 | 438 | |
|
439 | 439 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, |
|
440 | translate_tag=None, maybe_unreachable=False): | |
|
440 | translate_tag=None, maybe_unreachable=False, reference_obj=None): | |
|
441 | 441 | """ |
|
442 | 442 | Returns ``MercurialCommit`` object representing repository's |
|
443 | 443 | commit at the given `commit_id` or `commit_idx`. |
@@ -277,7 +277,7 b' class SubversionRepository(base.BaseRepo' | |||
|
277 | 277 | return os.path.join(self.path, 'hooks') |
|
278 | 278 | |
|
279 | 279 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, |
|
280 | translate_tag=None, maybe_unreachable=False): | |
|
280 | translate_tag=None, maybe_unreachable=False, reference_obj=None): | |
|
281 | 281 | if self.is_empty(): |
|
282 | 282 | raise EmptyRepositoryError("There are no commits yet") |
|
283 | 283 | if commit_id is not None: |
@@ -468,7 +468,7 b' class FileNode(Node):' | |||
|
468 | 468 | mtype, encoding = db.guess_type(self.name) |
|
469 | 469 | |
|
470 | 470 | if mtype is None: |
|
471 | if self.is_binary: | |
|
471 | if not self.is_largefile() and self.is_binary: | |
|
472 | 472 | mtype = 'application/octet-stream' |
|
473 | 473 | encoding = None |
|
474 | 474 | else: |
@@ -839,6 +839,7 b' class LargeFileNode(FileNode):' | |||
|
839 | 839 | self.org_path = org_path |
|
840 | 840 | self.kind = NodeKind.LARGEFILE |
|
841 | 841 | self.alias = alias |
|
842 | self._content = '' | |
|
842 | 843 | |
|
843 | 844 | def _validate_path(self, path): |
|
844 | 845 | """ |
@@ -2398,10 +2398,10 b' class Repository(Base, BaseModel):' | |||
|
2398 | 2398 | # SCM PROPERTIES |
|
2399 | 2399 | #========================================================================== |
|
2400 | 2400 | |
|
2401 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, maybe_unreachable=False): | |
|
2401 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, maybe_unreachable=False, reference_obj=None): | |
|
2402 | 2402 | return get_commit_safe( |
|
2403 | 2403 | self.scm_instance(), commit_id, commit_idx, pre_load=pre_load, |
|
2404 | maybe_unreachable=maybe_unreachable) | |
|
2404 | maybe_unreachable=maybe_unreachable, reference_obj=reference_obj) | |
|
2405 | 2405 | |
|
2406 | 2406 | def get_changeset(self, rev=None, pre_load=None): |
|
2407 | 2407 | warnings.warn("Use get_commit", DeprecationWarning) |
@@ -41,6 +41,8 b' class PermissionModel(BaseModel):' | |||
|
41 | 41 | """ |
|
42 | 42 | Permissions model for RhodeCode |
|
43 | 43 | """ |
|
44 | FORKING_DISABLED = 'hg.fork.none' | |
|
45 | FORKING_ENABLED = 'hg.fork.repository' | |
|
44 | 46 | |
|
45 | 47 | cls = Permission |
|
46 | 48 | global_perms = { |
@@ -122,8 +124,8 b' class PermissionModel(BaseModel):' | |||
|
122 | 124 | ('hg.repogroup.create.true', _('Enabled'))] |
|
123 | 125 | |
|
124 | 126 | c_obj.fork_choices = [ |
|
125 |
( |
|
|
126 |
( |
|
|
127 | (self.FORKING_DISABLED, _('Disabled')), | |
|
128 | (self.FORKING_ENABLED, _('Enabled'))] | |
|
127 | 129 | |
|
128 | 130 | c_obj.inherit_default_permission_choices = [ |
|
129 | 131 | ('hg.inherit_default_perms.false', _('Disabled')), |
@@ -908,7 +908,8 b' class PullRequestModel(BaseModel):' | |||
|
908 | 908 | |
|
909 | 909 | try: |
|
910 | 910 | if source_ref_type in self.REF_TYPES: |
|
911 |
source_commit = source_repo.get_commit( |
|
|
911 | source_commit = source_repo.get_commit( | |
|
912 | source_ref_name, reference_obj=pull_request.source_ref_parts) | |
|
912 | 913 | else: |
|
913 | 914 | source_commit = source_repo.get_commit(source_ref_id) |
|
914 | 915 | except CommitDoesNotExistError: |
@@ -922,7 +923,8 b' class PullRequestModel(BaseModel):' | |||
|
922 | 923 | |
|
923 | 924 | try: |
|
924 | 925 | if target_ref_type in self.REF_TYPES: |
|
925 |
target_commit = target_repo.get_commit( |
|
|
926 | target_commit = target_repo.get_commit( | |
|
927 | target_ref_name, reference_obj=pull_request.target_ref_parts) | |
|
926 | 928 | else: |
|
927 | 929 | target_commit = target_repo.get_commit(target_ref_id) |
|
928 | 930 | except CommitDoesNotExistError: |
@@ -46,6 +46,7 b' from rhodecode.model.db import (' | |||
|
46 | 46 | Session, Repository, UserRepoToPerm, UserGroupRepoToPerm, |
|
47 | 47 | UserRepoGroupToPerm, UserGroupRepoGroupToPerm, User, Permission, |
|
48 | 48 | Statistics, UserGroup, RepoGroup, RepositoryField, UserLog) |
|
49 | from rhodecode.model.permission import PermissionModel | |
|
49 | 50 | from rhodecode.model.settings import VcsSettingsModel |
|
50 | 51 | |
|
51 | 52 | log = logging.getLogger(__name__) |
@@ -422,8 +423,15 b' class RepoModel(BaseModel):' | |||
|
422 | 423 | try: |
|
423 | 424 | cur_repo = self._get_repo(repo) |
|
424 | 425 | source_repo_name = cur_repo.repo_name |
|
426 | ||
|
427 | affected_user_ids = [] | |
|
425 | 428 | if 'user' in kwargs: |
|
426 | cur_repo.user = User.get_by_username(kwargs['user']) | |
|
429 | old_owner_id = cur_repo.user.user_id | |
|
430 | new_owner = User.get_by_username(kwargs['user']) | |
|
431 | cur_repo.user = new_owner | |
|
432 | ||
|
433 | if old_owner_id != new_owner.user_id: | |
|
434 | affected_user_ids = [new_owner.user_id, old_owner_id] | |
|
427 | 435 | |
|
428 | 436 | if 'repo_group' in kwargs: |
|
429 | 437 | cur_repo.group = RepoGroup.get(kwargs['repo_group']) |
@@ -474,6 +482,9 b' class RepoModel(BaseModel):' | |||
|
474 | 482 | self._rename_filesystem_repo( |
|
475 | 483 | old=source_repo_name, new=new_name) |
|
476 | 484 | |
|
485 | if affected_user_ids: | |
|
486 | PermissionModel().trigger_permission_flush(affected_user_ids) | |
|
487 | ||
|
477 | 488 | return cur_repo |
|
478 | 489 | except Exception: |
|
479 | 490 | log.error(traceback.format_exc()) |
@@ -39,6 +39,7 b' from rhodecode.model import BaseModel' | |||
|
39 | 39 | from rhodecode.model.db import (_hash_key, func, or_, in_filter_generator, |
|
40 | 40 | Session, RepoGroup, UserRepoGroupToPerm, User, Permission, UserGroupRepoGroupToPerm, |
|
41 | 41 | UserGroup, Repository) |
|
42 | from rhodecode.model.permission import PermissionModel | |
|
42 | 43 | from rhodecode.model.settings import VcsSettingsModel, SettingsModel |
|
43 | 44 | from rhodecode.lib.caching_query import FromCache |
|
44 | 45 | from rhodecode.lib.utils2 import action_logger_generic |
@@ -531,8 +532,14 b' class RepoGroupModel(BaseModel):' | |||
|
531 | 532 | |
|
532 | 533 | new_path = repo_group.full_path |
|
533 | 534 | |
|
535 | affected_user_ids = [] | |
|
534 | 536 | if 'user' in form_data: |
|
535 | repo_group.user = User.get_by_username(form_data['user']) | |
|
537 | old_owner_id = repo_group.user.user_id | |
|
538 | new_owner = User.get_by_username(form_data['user']) | |
|
539 | repo_group.user = new_owner | |
|
540 | ||
|
541 | if old_owner_id != new_owner.user_id: | |
|
542 | affected_user_ids = [new_owner.user_id, old_owner_id] | |
|
536 | 543 | |
|
537 | 544 | self.sa.add(repo_group) |
|
538 | 545 | |
@@ -566,6 +573,9 b' class RepoGroupModel(BaseModel):' | |||
|
566 | 573 | # Trigger update event. |
|
567 | 574 | events.trigger(events.RepoGroupUpdateEvent(repo_group)) |
|
568 | 575 | |
|
576 | if affected_user_ids: | |
|
577 | PermissionModel().trigger_permission_flush(affected_user_ids) | |
|
578 | ||
|
569 | 579 | return repo_group |
|
570 | 580 | except Exception: |
|
571 | 581 | log.error(traceback.format_exc()) |
@@ -12,6 +12,12 b'' | |||
|
12 | 12 | ******************************************************************************/ |
|
13 | 13 | function registerRCRoutes() { |
|
14 | 14 | // routes registration |
|
15 | pyroutes.register('admin_artifacts', '/_admin/artifacts', []); | |
|
16 | pyroutes.register('admin_artifacts_data', '/_admin/artifacts-data', []); | |
|
17 | pyroutes.register('admin_artifacts_delete', '/_admin/artifacts/%(uid)s/delete', ['uid']); | |
|
18 | pyroutes.register('admin_artifacts_show_all', '/_admin/artifacts', []); | |
|
19 | pyroutes.register('admin_artifacts_show_info', '/_admin/artifacts/%(uid)s', ['uid']); | |
|
20 | pyroutes.register('admin_artifacts_update', '/_admin/artifacts/%(uid)s/update', ['uid']); | |
|
15 | 21 | pyroutes.register('admin_audit_log_entry', '/_admin/audit_logs/%(audit_log_id)s', ['audit_log_id']); |
|
16 | 22 | pyroutes.register('admin_audit_logs', '/_admin/audit_logs', []); |
|
17 | 23 | pyroutes.register('admin_defaults_repositories', '/_admin/defaults/repositories', []); |
@@ -1331,7 +1331,7 b' var CommentsController = function() {' | |||
|
1331 | 1331 | |
|
1332 | 1332 | // There aren't any comments, we init the `.inline-comments` with `reply-thread-container` first |
|
1333 | 1333 | if ($comments.length===0) { |
|
1334 | var replBtn = '<button class="cb-comment-add-button" onclick="return Rhodecode.comments.createComment(this, \'{0}\', \'{1}\', null)">Reply...</button>'.format(f_path, line_no) | |
|
1334 | var replBtn = '<button class="cb-comment-add-button" onclick="return Rhodecode.comments.createComment(this, \'{0}\', \'{1}\', null)">Reply...</button>'.format(escapeHtml(f_path), line_no) | |
|
1335 | 1335 | var $reply_container = $('#cb-comments-inline-container-template') |
|
1336 | 1336 | $reply_container.find('button.cb-comment-add-button').replaceWith(replBtn); |
|
1337 | 1337 | $td.append($($reply_container).html()); |
@@ -115,6 +115,7 b'' | |||
|
115 | 115 | <li class="${h.is_active('repository_groups', active)}"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li> |
|
116 | 116 | <li class="${h.is_active('users', active)}"><a href="${h.route_path('users')}">${_('Users')}</a></li> |
|
117 | 117 | <li class="${h.is_active('user_groups', active)}"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li> |
|
118 | <li class="${h.is_active('artifacts', active)}"><a href="${h.route_path('admin_artifacts')}">${_('Artifacts')}</a></li> | |
|
118 | 119 | <li class="${h.is_active('permissions', active)}"><a href="${h.route_path('admin_permissions_application')}">${_('Permissions')}</a></li> |
|
119 | 120 | <li class="${h.is_active('authentication', active)}"><a href="${h.route_path('auth_home', traverse='')}">${_('Authentication')}</a></li> |
|
120 | 121 | <li class="${h.is_active('integrations', active)}"><a href="${h.route_path('global_integrations_home')}">${_('Integrations')}</a></li> |
@@ -62,7 +62,7 b'' | |||
|
62 | 62 | <div class="radios"> |
|
63 | 63 | ${h.radio('default_fork_create' + suffix, c.fork_choices[1][0], label=c.fork_choices[1][1], **kwargs)} |
|
64 | 64 | ${h.radio('default_fork_create' + suffix, c.fork_choices[0][0], label=c.fork_choices[0][1], **kwargs)} |
|
65 |
<span class="help-block">${_('Permission to create r |
|
|
65 | <span class="help-block">${_('Permission to create repository forks. Root level forks will only work if repository creation is enabled.')}</span> | |
|
66 | 66 | </div> |
|
67 | 67 | </div> |
|
68 | 68 | <div class="field"> |
@@ -24,7 +24,7 b'' | |||
|
24 | 24 | ## to speed up lookups cache some functions before the loop |
|
25 | 25 | <% |
|
26 | 26 | active_patterns = h.get_active_pattern_entries(c.repo_name) |
|
27 |
urlify_commit_message = h.partial(h.urlify_commit_message, active_pattern_entries=active_patterns |
|
|
27 | urlify_commit_message = h.partial(h.urlify_commit_message, active_pattern_entries=active_patterns) | |
|
28 | 28 | %> |
|
29 | 29 | |
|
30 | 30 | %for commit in c.commit_ranges: |
@@ -57,7 +57,7 b'' | |||
|
57 | 57 | </td> |
|
58 | 58 | <td class="mid td-description"> |
|
59 | 59 | <div class="log-container truncate-wrap"> |
|
60 | <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${urlify_commit_message(commit.message, c.repo_name)}</div> | |
|
60 | <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${urlify_commit_message(commit.message, c.repo_name, issues_container_callback=getattr(c, 'referenced_commit_issues', h.IssuesRegistry())(commit.serialize()))}</div> | |
|
61 | 61 | </div> |
|
62 | 62 | </td> |
|
63 | 63 | </tr> |
@@ -416,6 +416,12 b'' | |||
|
416 | 416 | </a> |
|
417 | 417 | </%def> |
|
418 | 418 | |
|
419 | <%def name="repo_artifact_admin_name(file_uid, artifact_display_name)"> | |
|
420 | <a href="${h.route_path('admin_artifacts_show_info', uid=file_uid)}"> | |
|
421 | ${(artifact_display_name or '_EMPTY_NAME_')} | |
|
422 | </a> | |
|
423 | </%def> | |
|
424 | ||
|
419 | 425 | <%def name="repo_artifact_uid(repo_name, file_uid)"> |
|
420 | 426 | <code>${h.shorter(file_uid, size=24, prefix=True)}</code> |
|
421 | 427 | </%def> |
@@ -443,6 +449,7 b'' | |||
|
443 | 449 | % endif |
|
444 | 450 | </%def> |
|
445 | 451 | |
|
452 | ||
|
446 | 453 | <%def name="markup_form(form_id, form_text='', help_text=None)"> |
|
447 | 454 | |
|
448 | 455 | <div class="markup-form"> |
@@ -221,7 +221,7 b' if (show_disabled) {' | |||
|
221 | 221 | <%= version_info %> |
|
222 | 222 | <% } %> |
|
223 | 223 | <br/> |
|
224 |
File: <code><% |
|
|
224 | File: <code><%= file_name -%></code> | |
|
225 | 225 | <% } else { %> |
|
226 | 226 | <% if (review_status) { %> |
|
227 | 227 | <i class="icon-circle review-status-<%= review_status %>"></i> |
@@ -27,8 +27,8 b'' | |||
|
27 | 27 | <%def name="main()"> |
|
28 | 28 | ## Container to gather extracted Tickets |
|
29 | 29 | <% |
|
30 |
c.referenced_commit_issues = |
|
|
31 |
c.referenced_desc_issues = |
|
|
30 | c.referenced_commit_issues = h.IssuesRegistry() | |
|
31 | c.referenced_desc_issues = h.IssuesRegistry() | |
|
32 | 32 | %> |
|
33 | 33 | |
|
34 | 34 | <script type="text/javascript"> |
@@ -86,7 +86,7 b'' | |||
|
86 | 86 | </div> |
|
87 | 87 | |
|
88 | 88 | <div id="pr-desc" class="input" title="${_('Rendered using {} renderer').format(c.renderer)}"> |
|
89 | ${h.render(c.pull_request.description, renderer=c.renderer, repo_name=c.repo_name, issues_container=c.referenced_desc_issues)} | |
|
89 | ${h.render(c.pull_request.description, renderer=c.renderer, repo_name=c.repo_name, issues_container_callback=c.referenced_desc_issues())} | |
|
90 | 90 | </div> |
|
91 | 91 | |
|
92 | 92 | <div id="pr-desc-edit" class="input textarea" style="display: none;"> |
@@ -435,7 +435,7 b'' | |||
|
435 | 435 | </td> |
|
436 | 436 | <td class="mid td-description"> |
|
437 | 437 | <div class="log-container truncate-wrap"> |
|
438 | <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${h.urlify_commit_message(commit.message, c.repo_name, issues_container=c.referenced_commit_issues)}</div> | |
|
438 | <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${h.urlify_commit_message(commit.message, c.repo_name, issues_container_callback=c.referenced_commit_issues(commit.serialize()))}</div> | |
|
439 | 439 | </div> |
|
440 | 440 | </td> |
|
441 | 441 | </tr> |
@@ -809,7 +809,7 b'' | |||
|
809 | 809 | <div class="sidebar-element clear-both"> |
|
810 | 810 | <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${_('Referenced Tickets')}"> |
|
811 | 811 | <i class="icon-info-circled"></i> |
|
812 |
${ |
|
|
812 | ${(c.referenced_desc_issues.issues_unique_count + c.referenced_commit_issues.issues_unique_count)} | |
|
813 | 813 | </div> |
|
814 | 814 | |
|
815 | 815 | <div class="right-sidebar-expanded-state pr-details-title"> |
@@ -822,15 +822,17 b'' | |||
|
822 | 822 | <table> |
|
823 | 823 | |
|
824 | 824 | <tr><td><code>${_('In pull request description')}:</code></td></tr> |
|
825 | % if c.referenced_desc_issues: | |
|
826 | % for ticket_dict in sorted(c.referenced_desc_issues): | |
|
825 | % if c.referenced_desc_issues.issues: | |
|
826 | ||
|
827 | % for ticket_id, ticket_dict in c.referenced_desc_issues.unique_issues.items(): | |
|
827 | 828 | <tr> |
|
828 | 829 | <td> |
|
829 | <a href="${ticket_dict.get('url')}"> | |
|
830 |
${ticket_ |
|
|
830 | <a href="${ticket_dict[0].get('url')}"> | |
|
831 | ${ticket_id} | |
|
831 | 832 | </a> |
|
832 | 833 | </td> |
|
833 | 834 | </tr> |
|
835 | ||
|
834 | 836 |
|
|
835 | 837 | % else: |
|
836 | 838 | <tr> |
@@ -841,13 +843,14 b'' | |||
|
841 | 843 | % endif |
|
842 | 844 | |
|
843 | 845 | <tr><td style="padding-top: 10px"><code>${_('In commit messages')}:</code></td></tr> |
|
844 | % if c.referenced_commit_issues: | |
|
845 |
% for ticket_dict in |
|
|
846 | % if c.referenced_commit_issues.issues: | |
|
847 | % for ticket_id, ticket_dict in c.referenced_commit_issues.unique_issues.items(): | |
|
846 | 848 | <tr> |
|
847 | 849 | <td> |
|
848 | <a href="${ticket_dict.get('url')}"> | |
|
849 |
${ticket_ |
|
|
850 | <a href="${ticket_dict[0].get('url')}"> | |
|
851 | ${ticket_id} | |
|
850 | 852 | </a> |
|
853 | - ${_ungettext('in %s commit', 'in %s commits', len(ticket_dict)) % (len(ticket_dict))} | |
|
851 | 854 | </td> |
|
852 | 855 | </tr> |
|
853 | 856 | % endfor |
@@ -95,7 +95,8 b'' | |||
|
95 | 95 | var fname = selectedReference.raw_id + ext; |
|
96 | 96 | var href = pyroutes.url('repo_archivefile', { |
|
97 | 97 | 'repo_name': templateContext.repo_name, |
|
98 | 'fname': fname | |
|
98 | 'fname': fname, | |
|
99 | 'with_hash': '1' | |
|
99 | 100 | }); |
|
100 | 101 | // set new label |
|
101 | 102 | $(this).html(ico + ' {0}{1}'.format(escapeHtml(e.added.text), ext)); |
General Comments 1
You need to be logged in to leave comments.
Login now