##// END OF EJS Templates
Pull request !2362 Created on Thu, 01 Jul 2021 12:06:29, by
 # 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 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
7 [task:rc_tools_pinned]
8 done = true
8
9
9 [task:fixes_on_stable]
10 [task:fixes_on_stable]
11 done = true
10
12
11 [task:pip2nix_generated]
13 [task:pip2nix_generated]
14 done = true
12
15
13 [task:changelog_updated]
16 [task:changelog_updated]
17 done = true
14
18
15 [task:generate_api_docs]
19 [task:generate_api_docs]
20 done = true
16
21
17 [release]
22 [release]
18 state = in_progress
23 state = prepared
19 version = 4.25.2
24 version = 4.25.2
20
25
21 [task:updated_translation]
26 [task:updated_translation]
@@ -1,5 +1,5 b''
1 [bumpversion]
1 [bumpversion]
2 current_version = 4.25.1
2 current_version = 4.25.2
3 message = release: Bump version {current_version} to {new_version}
3 message = release: Bump version {current_version} to {new_version}
4
4
5 [bumpversion:file:rhodecode/VERSION]
5 [bumpversion:file:rhodecode/VERSION]
@@ -5,23 +5,18 b' done = false'
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
7 [task:rc_tools_pinned]
8 done = true
9
8
10 [task:fixes_on_stable]
9 [task:fixes_on_stable]
11 done = true
12
10
13 [task:pip2nix_generated]
11 [task:pip2nix_generated]
14 done = true
15
12
16 [task:changelog_updated]
13 [task:changelog_updated]
17 done = true
18
14
19 [task:generate_api_docs]
15 [task:generate_api_docs]
20 done = true
21
16
22 [release]
17 [release]
23 state = prepared
18 state = in_progress
24 version = 4.25.1
19 version = 4.25.2
25
20
26 [task:updated_translation]
21 [task:updated_translation]
27
22
@@ -1,1 +1,1 b''
1 4.25.1 No newline at end of file
1 4.25.2 No newline at end of file
@@ -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.
@@ -9,6 +9,7 b' Release Notes'
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.25.2.rst
12 release-notes-4.25.1.rst
13 release-notes-4.25.1.rst
13 release-notes-4.25.0.rst
14 release-notes-4.25.0.rst
14 release-notes-4.24.1.rst
15 release-notes-4.24.1.rst
@@ -27,13 +27,13 b''
27
27
28 <ul class="button-links">
28 <ul class="button-links">
29 % if c.is_super_admin:
29 % if c.is_super_admin:
30 <li class="btn ${h.is_active('all', c.active)}"><a href="${h.route_path('gists_show', _query={'all': 1})}">${_('All gists')}</a></li>
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 %endif
31 %endif
32 <li class="btn ${h.is_active('public', c.active)}"><a href="${h.route_path('gists_show')}">${_('All public')}</a></li>
32 <li><a class="btn ${h.is_active('public', c.active)}" href="${h.route_path('gists_show')}">${_('All public')}</a></li>
33 %if c.rhodecode_user.username != h.DEFAULT_USER:
33 %if c.rhodecode_user.username != h.DEFAULT_USER:
34 <li class="btn ${h.is_active('my_all', c.active)}"><a href="${h.route_path('gists_show', _query={'public':1, 'private': 1})}">${_('My gists')}</a></li>
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 class="btn ${h.is_active('my_private', c.active)}"><a href="${h.route_path('gists_show', _query={'private': 1})}">${_('My private')}</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 class="btn ${h.is_active('my_public', c.active)}"><a href="${h.route_path('gists_show', _query={'public': 1})}">${_('My public')}</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 %endif
37 %endif
38 </ul>
38 </ul>
39
39
@@ -65,11 +65,11 b''
65 <fieldset>
65 <fieldset>
66 <div class="gist-type-fields-wrapper">
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 <label for="private_gist">${_('Private Gist')}</label>
69 <label for="private_gist">${_('Private Gist')}</label>
70 <span class="tooltip label" title="${_('Private Gists are not listed and only accessible through their secret url.')}">${_('Private Gist')}</span>
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 <label for="public_gist">${_('Public Gist')}</label>
73 <label for="public_gist">${_('Public Gist')}</label>
74 <span class="tooltip label" title="${_('Public Gists are accessible to anyone and listed in Gists page.')}">${_('Public Gist')}</span>
74 <span class="tooltip label" title="${_('Public Gists are accessible to anyone and listed in Gists page.')}">${_('Public Gist')}</span>
75 </div>
75 </div>
@@ -99,5 +99,14 b''
99 setCodeMirrorModeFromInput(
99 setCodeMirrorModeFromInput(
100 modes_select, filename_selector, myCodeMirror, null);
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 </script>
111 </script>
103 </%def>
112 </%def>
@@ -76,7 +76,11 b' class TestMyAccountEdit(TestController):'
76 'requests requiring your participation.')
76 'requests requiring your participation.')
77
77
78 @pytest.mark.backends("git", "hg")
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 self.log_user()
84 self.log_user()
81 response = self.app.get(route_path('my_account_pullrequests_data'),
85 response = self.app.get(route_path('my_account_pullrequests_data'),
82 extra_environ=xhr_header)
86 extra_environ=xhr_header)
@@ -43,7 +43,7 b' from rhodecode.model.comment import Comm'
43 from rhodecode.model.db import (
43 from rhodecode.model.db import (
44 IntegrityError, or_, in_filter_generator,
44 IntegrityError, or_, in_filter_generator,
45 Repository, UserEmailMap, UserApiKeys, UserFollowing,
45 Repository, UserEmailMap, UserApiKeys, UserFollowing,
46 PullRequest, UserBookmark, RepoGroup)
46 PullRequest, UserBookmark, RepoGroup, ChangesetStatus)
47 from rhodecode.model.meta import Session
47 from rhodecode.model.meta import Session
48 from rhodecode.model.pull_request import PullRequestModel
48 from rhodecode.model.pull_request import PullRequestModel
49 from rhodecode.model.user import UserModel
49 from rhodecode.model.user import UserModel
@@ -654,21 +654,31 b' class MyAccountView(BaseAppView, DataGri'
654 Session().commit()
654 Session().commit()
655 return user.user_data['notification_status']
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 draw, start, limit = self._extract_chunk(self.request)
658 draw, start, limit = self._extract_chunk(self.request)
659 search_q, order_by, order_dir = self._extract_ordering(self.request)
659 search_q, order_by, order_dir = self._extract_ordering(self.request)
660
660
661 _render = self.request.get_partial_renderer(
661 _render = self.request.get_partial_renderer(
662 'rhodecode:templates/data_table/_dt_elements.mako')
662 'rhodecode:templates/data_table/_dt_elements.mako')
663
663
664 pull_requests = PullRequestModel().get_im_participating_in(
664 if filter_type == 'awaiting_my_review':
665 user_id=self._rhodecode_user.user_id,
665 pull_requests = PullRequestModel().get_im_participating_in_for_review(
666 statuses=statuses, query=search_q,
666 user_id=self._rhodecode_user.user_id,
667 offset=start, length=limit, order_by=order_by,
667 statuses=statuses, query=search_q,
668 order_dir=order_dir)
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 pull_requests_total_count = PullRequestModel().count_im_participating_in_for_review(
671 user_id=self._rhodecode_user.user_id, statuses=statuses, query=search_q)
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 data = []
683 data = []
674 comments_model = CommentsModel()
684 comments_model = CommentsModel()
@@ -678,6 +688,12 b' class MyAccountView(BaseAppView, DataGri'
678 repo_id, pull_request=pr, include_drafts=False, count_only=True)
688 repo_id, pull_request=pr, include_drafts=False, count_only=True)
679 owned = pr.user_id == self._rhodecode_user.user_id
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 data.append({
697 data.append({
682 'target_repo': _render('pullrequest_target_repo',
698 'target_repo': _render('pullrequest_target_repo',
683 pr.target_repo.repo_name),
699 pr.target_repo.repo_name),
@@ -688,6 +704,8 b' class MyAccountView(BaseAppView, DataGri'
688 'name_raw': pr.pull_request_id,
704 'name_raw': pr.pull_request_id,
689 'status': _render('pullrequest_status',
705 'status': _render('pullrequest_status',
690 pr.calculated_review_status()),
706 pr.calculated_review_status()),
707 'my_status': _render('pullrequest_status',
708 my_review_status),
691 'title': _render('pullrequest_title', pr.title, pr.description),
709 'title': _render('pullrequest_title', pr.title, pr.description),
692 'description': h.escape(pr.description),
710 'description': h.escape(pr.description),
693 'updated_on': _render('pullrequest_updated_on',
711 'updated_on': _render('pullrequest_updated_on',
@@ -723,7 +741,14 b' class MyAccountView(BaseAppView, DataGri'
723 c.active = 'pullrequests'
741 c.active = 'pullrequests'
724 req_get = self.request.GET
742 req_get = self.request.GET
725
743
726 c.closed = str2bool(req_get.get('pr_show_closed'))
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 return self._get_template_context(c)
753 return self._get_template_context(c)
729
754
@@ -732,13 +757,19 b' class MyAccountView(BaseAppView, DataGri'
732 def my_account_pullrequests_data(self):
757 def my_account_pullrequests_data(self):
733 self.load_default_context()
758 self.load_default_context()
734 req_get = self.request.GET
759 req_get = self.request.GET
760
761 awaiting_my_review = str2bool(req_get.get('awaiting_my_review'))
735 closed = str2bool(req_get.get('closed'))
762 closed = str2bool(req_get.get('closed'))
736
763
737 statuses = [PullRequest.STATUS_NEW, PullRequest.STATUS_OPEN]
764 statuses = [PullRequest.STATUS_NEW, PullRequest.STATUS_OPEN]
738 if closed:
765 if closed:
739 statuses += [PullRequest.STATUS_CLOSED]
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 return data
773 return data
743
774
744 @LoginRequired()
775 @LoginRequired()
@@ -41,7 +41,7 b' class TestPullRequestList(object):'
41
41
42 @pytest.mark.parametrize('params, expected_title', [
42 @pytest.mark.parametrize('params, expected_title', [
43 ({'source': 0, 'closed': 1}, 'Closed'),
43 ({'source': 0, 'closed': 1}, 'Closed'),
44 ({'source': 0, 'my': 1}, 'Opened by me'),
44 ({'source': 0, 'my': 1}, 'Created by me'),
45 ({'source': 0, 'awaiting_review': 1}, 'Awaiting review'),
45 ({'source': 0, 'awaiting_review': 1}, 'Awaiting review'),
46 ({'source': 0, 'awaiting_my_review': 1}, 'Awaiting my review'),
46 ({'source': 0, 'awaiting_my_review': 1}, 'Awaiting my review'),
47 ({'source': 1}, 'From this repo'),
47 ({'source': 1}, 'From this repo'),
@@ -79,21 +79,20 b' class RepoPullRequestsView(RepoAppView, '
79
79
80 if filter_type == 'awaiting_review':
80 if filter_type == 'awaiting_review':
81 pull_requests = PullRequestModel().get_awaiting_review(
81 pull_requests = PullRequestModel().get_awaiting_review(
82 repo_name, search_q=search_q, source=source, opened_by=opened_by,
82 repo_name,
83 statuses=statuses, offset=start, length=limit,
83 search_q=search_q, statuses=statuses,
84 order_by=order_by, order_dir=order_dir)
84 offset=start, length=limit, order_by=order_by, order_dir=order_dir)
85 pull_requests_total_count = PullRequestModel().count_awaiting_review(
85 pull_requests_total_count = PullRequestModel().count_awaiting_review(
86 repo_name, search_q=search_q, source=source, statuses=statuses,
86 repo_name,
87 opened_by=opened_by)
87 search_q=search_q, statuses=statuses)
88 elif filter_type == 'awaiting_my_review':
88 elif filter_type == 'awaiting_my_review':
89 pull_requests = PullRequestModel().get_awaiting_my_review(
89 pull_requests = PullRequestModel().get_awaiting_my_review(
90 repo_name, search_q=search_q, source=source, opened_by=opened_by,
90 repo_name, self._rhodecode_user.user_id,
91 user_id=self._rhodecode_user.user_id, statuses=statuses,
91 search_q=search_q, statuses=statuses,
92 offset=start, length=limit, order_by=order_by,
92 offset=start, length=limit, order_by=order_by, order_dir=order_dir)
93 order_dir=order_dir)
94 pull_requests_total_count = PullRequestModel().count_awaiting_my_review(
93 pull_requests_total_count = PullRequestModel().count_awaiting_my_review(
95 repo_name, search_q=search_q, source=source, user_id=self._rhodecode_user.user_id,
94 repo_name, self._rhodecode_user.user_id,
96 statuses=statuses, opened_by=opened_by)
95 search_q=search_q, statuses=statuses)
97 else:
96 else:
98 pull_requests = PullRequestModel().get_all(
97 pull_requests = PullRequestModel().get_all(
99 repo_name, search_q=search_q, source=source, opened_by=opened_by,
98 repo_name, search_q=search_q, source=source, opened_by=opened_by,
@@ -110,6 +109,12 b' class RepoPullRequestsView(RepoAppView, '
110 self.db_repo.repo_id, pull_request=pr,
109 self.db_repo.repo_id, pull_request=pr,
111 include_drafts=False, count_only=True)
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 data.append({
118 data.append({
114 'name': _render('pullrequest_name',
119 'name': _render('pullrequest_name',
115 pr.pull_request_id, pr.pull_request_state,
120 pr.pull_request_id, pr.pull_request_state,
@@ -118,6 +123,8 b' class RepoPullRequestsView(RepoAppView, '
118 'name_raw': pr.pull_request_id,
123 'name_raw': pr.pull_request_id,
119 'status': _render('pullrequest_status',
124 'status': _render('pullrequest_status',
120 pr.calculated_review_status()),
125 pr.calculated_review_status()),
126 'my_status': _render('pullrequest_status',
127 my_review_status),
121 'title': _render('pullrequest_title', pr.title, pr.description),
128 'title': _render('pullrequest_title', pr.title, pr.description),
122 'description': h.escape(pr.description),
129 'description': h.escape(pr.description),
123 'updated_on': _render('pullrequest_updated_on',
130 'updated_on': _render('pullrequest_updated_on',
@@ -354,7 +354,7 b' class ChangesetStatusModel(BaseModel):'
354 Session().add(new_status)
354 Session().add(new_status)
355 return new_statuses
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 commit_statuses_map = collections.defaultdict(list)
359 commit_statuses_map = collections.defaultdict(list)
360 for st in commit_statuses:
360 for st in commit_statuses:
@@ -368,6 +368,10 b' class ChangesetStatusModel(BaseModel):'
368 for obj in reviewers_data:
368 for obj in reviewers_data:
369 if not obj.user:
369 if not obj.user:
370 continue
370 continue
371 if user and obj.user.username != user.username:
372 # single user filter
373 continue
374
371 statuses = commit_statuses_map.get(obj.user.username, None)
375 statuses = commit_statuses_map.get(obj.user.username, None)
372 if statuses:
376 if statuses:
373 status_groups = itertools.groupby(
377 status_groups = itertools.groupby(
@@ -376,16 +380,19 b' class ChangesetStatusModel(BaseModel):'
376
380
377 reviewers.append((obj, obj.user, obj.reasons, obj.mandatory, statuses))
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 _commit_statuses = self.get_statuses(
389 _commit_statuses = self.get_statuses(
383 pull_request.source_repo,
390 pull_request.source_repo,
384 pull_request=pull_request,
391 pull_request=pull_request,
385 with_revisions=True)
392 with_revisions=True)
386 reviewers = pull_request.get_pull_request_reviewers(
393 reviewers = pull_request.get_pull_request_reviewers(
387 role=PullRequestReviewers.ROLE_REVIEWER)
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 def calculated_review_status(self, pull_request):
397 def calculated_review_status(self, pull_request):
391 """
398 """
@@ -41,10 +41,10 b' from sqlalchemy import ('
41 Index, Sequence, UniqueConstraint, ForeignKey, CheckConstraint, Column,
41 Index, Sequence, UniqueConstraint, ForeignKey, CheckConstraint, Column,
42 Boolean, String, Unicode, UnicodeText, DateTime, Integer, LargeBinary,
42 Boolean, String, Unicode, UnicodeText, DateTime, Integer, LargeBinary,
43 Text, Float, PickleType, BigInteger)
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 from sqlalchemy.sql.functions import coalesce, count # pragma: no cover
45 from sqlalchemy.sql.functions import coalesce, count # pragma: no cover
46 from sqlalchemy.orm import (
46 from sqlalchemy.orm import (
47 relationship, joinedload, class_mapper, validates, aliased)
47 relationship, lazyload, joinedload, class_mapper, validates, aliased)
48 from sqlalchemy.ext.declarative import declared_attr
48 from sqlalchemy.ext.declarative import declared_attr
49 from sqlalchemy.ext.hybrid import hybrid_property
49 from sqlalchemy.ext.hybrid import hybrid_property
50 from sqlalchemy.exc import IntegrityError # pragma: no cover
50 from sqlalchemy.exc import IntegrityError # pragma: no cover
@@ -4479,9 +4479,9 b' class PullRequest(Base, _PullRequestBase'
4479 from rhodecode.model.changeset_status import ChangesetStatusModel
4479 from rhodecode.model.changeset_status import ChangesetStatusModel
4480 return ChangesetStatusModel().calculated_review_status(self)
4480 return ChangesetStatusModel().calculated_review_status(self)
4481
4481
4482 def reviewers_statuses(self):
4482 def reviewers_statuses(self, user=None):
4483 from rhodecode.model.changeset_status import ChangesetStatusModel
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 def get_pull_request_reviewers(self, role=None):
4486 def get_pull_request_reviewers(self, role=None):
4487 qry = PullRequestReviewers.query()\
4487 qry = PullRequestReviewers.query()\
@@ -56,7 +56,7 b' from rhodecode.model import BaseModel'
56 from rhodecode.model.changeset_status import ChangesetStatusModel
56 from rhodecode.model.changeset_status import ChangesetStatusModel
57 from rhodecode.model.comment import CommentsModel
57 from rhodecode.model.comment import CommentsModel
58 from rhodecode.model.db import (
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 PullRequestVersion, ChangesetComment, Repository, RepoReviewRule, User)
60 PullRequestVersion, ChangesetComment, Repository, RepoReviewRule, User)
61 from rhodecode.model.meta import Session
61 from rhodecode.model.meta import Session
62 from rhodecode.model.notification import NotificationModel, \
62 from rhodecode.model.notification import NotificationModel, \
@@ -319,7 +319,7 b' class PullRequestModel(BaseModel):'
319
319
320 if search_q:
320 if search_q:
321 like_expression = u'%{}%'.format(safe_unicode(search_q))
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 q = q.filter(or_(
323 q = q.filter(or_(
324 cast(PullRequest.pull_request_id, String).ilike(like_expression),
324 cast(PullRequest.pull_request_id, String).ilike(like_expression),
325 User.username.ilike(like_expression),
325 User.username.ilike(like_expression),
@@ -405,36 +405,30 b' class PullRequestModel(BaseModel):'
405
405
406 return pull_requests
406 return pull_requests
407
407
408 def count_awaiting_review(self, repo_name, search_q=None, source=False, statuses=None,
408 def count_awaiting_review(self, repo_name, search_q=None, statuses=None):
409 opened_by=None):
410 """
409 """
411 Count the number of pull requests for a specific repository that are
410 Count the number of pull requests for a specific repository that are
412 awaiting review.
411 awaiting review.
413
412
414 :param repo_name: target or source repo
413 :param repo_name: target or source repo
415 :param search_q: filter by text
414 :param search_q: filter by text
416 :param source: boolean flag to specify if repo_name refers to source
417 :param statuses: list of pull request statuses
415 :param statuses: list of pull request statuses
418 :param opened_by: author user of the pull request
419 :returns: int number of pull requests
416 :returns: int number of pull requests
420 """
417 """
421 pull_requests = self.get_awaiting_review(
418 pull_requests = self.get_awaiting_review(
422 repo_name, search_q=search_q, source=source, statuses=statuses, opened_by=opened_by)
419 repo_name, search_q=search_q, statuses=statuses)
423
420
424 return len(pull_requests)
421 return len(pull_requests)
425
422
426 def get_awaiting_review(self, repo_name, search_q=None, source=False, statuses=None,
423 def get_awaiting_review(self, repo_name, search_q=None, statuses=None,
427 opened_by=None, offset=0, length=None,
424 offset=0, length=None, order_by=None, order_dir='desc'):
428 order_by=None, order_dir='desc'):
429 """
425 """
430 Get all pull requests for a specific repository that are awaiting
426 Get all pull requests for a specific repository that are awaiting
431 review.
427 review.
432
428
433 :param repo_name: target or source repo
429 :param repo_name: target or source repo
434 :param search_q: filter by text
430 :param search_q: filter by text
435 :param source: boolean flag to specify if repo_name refers to source
436 :param statuses: list of pull request statuses
431 :param statuses: list of pull request statuses
437 :param opened_by: author user of the pull request
438 :param offset: pagination offset
432 :param offset: pagination offset
439 :param length: length of returned list
433 :param length: length of returned list
440 :param order_by: order of the returned list
434 :param order_by: order of the returned list
@@ -442,8 +436,8 b' class PullRequestModel(BaseModel):'
442 :returns: list of pull requests
436 :returns: list of pull requests
443 """
437 """
444 pull_requests = self.get_all(
438 pull_requests = self.get_all(
445 repo_name, search_q=search_q, source=source, statuses=statuses,
439 repo_name, search_q=search_q, statuses=statuses,
446 opened_by=opened_by, order_by=order_by, order_dir=order_dir)
440 order_by=order_by, order_dir=order_dir)
447
441
448 _filtered_pull_requests = []
442 _filtered_pull_requests = []
449 for pr in pull_requests:
443 for pr in pull_requests:
@@ -456,68 +450,117 b' class PullRequestModel(BaseModel):'
456 else:
450 else:
457 return _filtered_pull_requests
451 return _filtered_pull_requests
458
452
459 def count_awaiting_my_review(self, repo_name, search_q=None, source=False, statuses=None,
453 def _prepare_awaiting_my_review_review_query(
460 opened_by=None, user_id=None):
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 Count the number of pull requests for a specific repository that are
518 Count the number of pull requests for a specific repository that are
463 awaiting review from a specific user.
519 awaiting review from a specific user.
464
520
465 :param repo_name: target or source repo
521 :param repo_name: target or source repo
522 :param user_id: reviewer user of the pull request
466 :param search_q: filter by text
523 :param search_q: filter by text
467 :param source: boolean flag to specify if repo_name refers to source
468 :param statuses: list of pull request statuses
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 :returns: int number of pull requests
525 :returns: int number of pull requests
472 """
526 """
473 pull_requests = self.get_awaiting_my_review(
527 q = self._prepare_awaiting_my_review_review_query(
474 repo_name, search_q=search_q, source=source, statuses=statuses,
528 repo_name, user_id, search_q=search_q, statuses=statuses)
475 opened_by=opened_by, user_id=user_id)
529 return q.count()
476
530
477 return len(pull_requests)
531 def get_awaiting_my_review(self, repo_name, user_id, search_q=None, statuses=None,
478
532 offset=0, length=None, order_by=None, order_dir='desc'):
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'):
482 """
533 """
483 Get all pull requests for a specific repository that are awaiting
534 Get all pull requests for a specific repository that are awaiting
484 review from a specific user.
535 review from a specific user.
485
536
486 :param repo_name: target or source repo
537 :param repo_name: target or source repo
538 :param user_id: reviewer user of the pull request
487 :param search_q: filter by text
539 :param search_q: filter by text
488 :param source: boolean flag to specify if repo_name refers to source
489 :param statuses: list of pull request statuses
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 :param offset: pagination offset
541 :param offset: pagination offset
493 :param length: length of returned list
542 :param length: length of returned list
494 :param order_by: order of the returned list
543 :param order_by: order of the returned list
495 :param order_dir: 'asc' or 'desc' ordering direction
544 :param order_dir: 'asc' or 'desc' ordering direction
496 :returns: list of pull requests
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)
548 q = self._prepare_awaiting_my_review_review_query(
503 my_participation = []
549 repo_name, user_id, search_q=search_q, statuses=statuses,
504 for pr in pull_requests:
550 order_by=order_by, order_dir=order_dir)
505 if pr in _my:
551
506 my_participation.append(pr)
507 _filtered_pull_requests = my_participation
508 if length:
552 if length:
509 return _filtered_pull_requests[offset:offset+length]
553 pull_requests = q.limit(length).offset(offset).all()
510 else:
554 else:
511 return _filtered_pull_requests
555 pull_requests = q.all()
556
557 return pull_requests
512
558
513 def get_not_reviewed(self, user_id):
559 def _prepare_im_participating_query(self, user_id=None, statuses=None, query='',
514 return [
560 order_by=None, order_dir='desc'):
515 x.pull_request for x in PullRequestReviewers.query().filter(
561 """
516 PullRequestReviewers.user_id == user_id).all()
562 return a query of pull-requests user is an creator, or he's added as a reviewer
517 ]
563 """
518
519 def _prepare_participating_query(self, user_id=None, statuses=None, query='',
520 order_by=None, order_dir='desc'):
521 q = PullRequest.query()
564 q = PullRequest.query()
522 if user_id:
565 if user_id:
523 reviewers_subquery = Session().query(
566 reviewers_subquery = Session().query(
@@ -535,7 +578,7 b' class PullRequestModel(BaseModel):'
535
578
536 if query:
579 if query:
537 like_expression = u'%{}%'.format(safe_unicode(query))
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 q = q.filter(or_(
582 q = q.filter(or_(
540 cast(PullRequest.pull_request_id, String).ilike(like_expression),
583 cast(PullRequest.pull_request_id, String).ilike(like_expression),
541 User.username.ilike(like_expression),
584 User.username.ilike(like_expression),
@@ -557,17 +600,97 b' class PullRequestModel(BaseModel):'
557 return q
600 return q
558
601
559 def count_im_participating_in(self, user_id=None, statuses=None, query=''):
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 return q.count()
604 return q.count()
562
605
563 def get_im_participating_in(
606 def get_im_participating_in(
564 self, user_id=None, statuses=None, query='', offset=0,
607 self, user_id=None, statuses=None, query='', offset=0,
565 length=None, order_by=None, order_dir='desc'):
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 user_id, statuses=statuses, query=query, order_by=order_by,
694 user_id, statuses=statuses, query=query, order_by=order_by,
572 order_dir=order_dir)
695 order_dir=order_dir)
573
696
@@ -618,13 +618,13 b' input[type="reset"] {'
618 text-align: right;
618 text-align: right;
619
619
620 li {
620 li {
621
621 list-style: none;
622
622 text-align: right;
623 display: inline-block;
623 }
624 }
624
625
625 li.active {
626 a.active {
626 background-color: @grey6;
627 border: 2px solid @rcblue;
627 .border ( @border-thickness, @grey4 );
628 }
628 }
629
629
630 }
630 }
@@ -44,7 +44,7 b''
44 padding: @panel-padding;
44 padding: @panel-padding;
45
45
46 &.panel-body-min-height {
46 &.panel-body-min-height {
47 min-height: 150px
47 min-height: 200px
48 }
48 }
49 }
49 }
50
50
@@ -1,17 +1,29 b''
1 <%namespace name="base" file="/base/base.mako"/>
1 <%namespace name="base" file="/base/base.mako"/>
2
2
3 <div class="panel panel-default">
3 <div class="panel panel-default">
4 <div class="panel-body">
4 <div class="panel-heading">
5 <div style="height: 35px">
5 <h3 class="panel-title">${_('Pull Requests You Participate In')}</h3>
6 <%
6 </div>
7 selected_filter = 'all'
8 if c.closed:
9 selected_filter = 'all_closed'
10 %>
11
7
8 <div class="panel-body panel-body-min-height">
9 <div class="title">
12 <ul class="button-links">
10 <ul class="button-links">
13 <li class="btn ${h.is_active('all', selected_filter)}"><a href="${h.route_path('my_account_pullrequests')}">${_('All')}</a></li>
11 <li><a class="btn ${h.is_active('all', c.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>
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 </ul>
27 </ul>
16
28
17 <div class="grid-quick-filter">
29 <div class="grid-quick-filter">
@@ -20,19 +32,13 b''
20 <i class="icon-search"></i>
32 <i class="icon-search"></i>
21 </li>
33 </li>
22 <li class="grid-filter-box-input">
34 <li class="grid-filter-box-input">
23 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" placeholder="${_('quick filter...')}" value=""/>
35 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter"
36 placeholder="${_('quick filter...')}" value=""/>
24 </li>
37 </li>
25 </ul>
38 </ul>
26 </div>
39 </div>
27 </div>
40 </div>
28 </div>
29 </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 <table id="pull_request_list_table" class="rctable table-bordered"></table>
42 <table id="pull_request_list_table" class="rctable table-bordered"></table>
37 </div>
43 </div>
38 </div>
44 </div>
@@ -52,6 +58,7 b''
52 "url": "${h.route_path('my_account_pullrequests_data')}",
58 "url": "${h.route_path('my_account_pullrequests_data')}",
53 "data": function (d) {
59 "data": function (d) {
54 d.closed = "${c.closed}";
60 d.closed = "${c.closed}";
61 d.awaiting_my_review = "${c.awaiting_my_review}";
55 },
62 },
56 "dataSrc": function (json) {
63 "dataSrc": function (json) {
57 return json.data;
64 return json.data;
@@ -60,13 +67,19 b''
60
67
61 dom: 'rtp',
68 dom: 'rtp',
62 pageLength: ${c.visual.dashboard_items},
69 pageLength: ${c.visual.dashboard_items},
63 order: [[1, "desc"]],
70 order: [[2, "desc"]],
64 columns: [
71 columns: [
65 {
72 {
66 data: {
73 data: {
67 "_": "status",
74 "_": "status",
68 "sort": "status"
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 data: {
85 data: {
@@ -23,13 +23,14 b''
23
23
24 <div class="box">
24 <div class="box">
25 <div class="title">
25 <div class="title">
26
26 <ul class="button-links">
27 <ul class="button-links">
27 <li class="btn ${h.is_active('open', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0})}">${_('Opened')}</a></li>
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>
28 <li class="btn ${h.is_active('my', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'my':1})}">${_('Opened by me')}</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>
29 <li class="btn ${h.is_active('awaiting', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'awaiting_review':1})}">${_('Awaiting review')}</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>
30 <li class="btn ${h.is_active('awaiting_my', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'awaiting_my_review':1})}">${_('Awaiting my 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>
31 <li class="btn ${h.is_active('closed', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':0,'closed':1})}">${_('Closed')}</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>
32 <li class="btn ${h.is_active('source', c.active)}"><a href="${h.route_path('pullrequest_show_all',repo_name=c.repo_name, _query={'source':1})}">${_('From this repo')}</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 </ul>
34 </ul>
34
35
35 <ul class="links">
36 <ul class="links">
@@ -88,20 +89,50 b''
88 },
89 },
89 dom: 'rtp',
90 dom: 'rtp',
90 pageLength: ${c.visual.dashboard_items},
91 pageLength: ${c.visual.dashboard_items},
91 order: [[ 1, "desc" ]],
92 order: [[ 2, "desc" ]],
92 columns: [
93 columns: [
93 { data: {"_": "status",
94 {
94 "sort": "status"}, title: "", className: "td-status", orderable: false},
95 data: {
95 { data: {"_": "name",
96 "_": "status",
96 "sort": "name_raw"}, title: "${_('Id')}", className: "td-componentname", "type": "num" },
97 "sort": "status"
97 { data: {"_": "title",
98 }, title: "PR", className: "td-status", orderable: false
98 "sort": "title"}, title: "${_('Title')}", className: "td-description" },
99 },
99 { data: {"_": "author",
100 {
100 "sort": "author_raw"}, title: "${_('Author')}", className: "td-user", orderable: false },
101 data: {
101 { data: {"_": "comments",
102 "_": "my_status",
102 "sort": "comments_raw"}, title: "", className: "td-comments", orderable: false},
103 "sort": "status"
103 { data: {"_": "updated_on",
104 }, title: "You", className: "td-status", orderable: false
104 "sort": "updated_on_raw"}, title: "${_('Last Update')}", className: "td-time" }
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 language: {
137 language: {
107 paginate: DEFAULT_GRID_PAGINATION,
138 paginate: DEFAULT_GRID_PAGINATION,
@@ -171,7 +171,7 b''
171 This repository is already archived. Only super-admin users can un-archive this repository.
171 This repository is already archived. Only super-admin users can un-archive this repository.
172 % else:
172 % else:
173 <button class="btn btn-small btn-warning" type="submit"
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 ${_('Archive this repository')}
176 ${_('Archive this repository')}
177 </button>
177 </button>
@@ -180,6 +180,9 b''
180 </div>
180 </div>
181 <div class="field">
181 <div class="field">
182 <span class="help-block">
182 <span class="help-block">
183 <strong>
184 ${_('This action is irreversible')} !
185 </strong><br/>
183 ${_('Archiving the repository will make it entirely read-only. The repository cannot be committed to.'
186 ${_('Archiving the repository will make it entirely read-only. The repository cannot be committed to.'
184 'It is hidden from the search results and dashboard. ')}
187 'It is hidden from the search results and dashboard. ')}
185 </span>
188 </span>
@@ -26,50 +26,41 b''
26 </div>
26 </div>
27 </div>
27 </div>
28 </div>
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 <label for="redirect_url">${_('Redirect URL')}:</label>
31 <label for="redirect_url">${_('Redirect URL')}:</label>
35 </div>
32 </div>
36 <div class="input">
33 <div class="input">
37 <input type="text" name="redirect_url" value="${redirect_url}" style="width: 600px"/>
34 <input type="text" name="redirect_url" value="${redirect_url}" style="width: 600px"/>
38 </div>
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 % if repo:
45 % if repo:
43 <div class="label">
44 <label for="redirect_url">${_('Repository template')}:</label>
45 </div>
46 ${dt.repo_name(name=repo.repo_name, rtype=repo.repo_type,rstate=None,private=None,archived=False,fork_of=False)}
46 ${dt.repo_name(name=repo.repo_name, rtype=repo.repo_type,rstate=None,private=None,archived=False,fork_of=False)}
47 ${h.hidden('bookmark_repo', repo.repo_id)}
47 ${h.hidden('bookmark_repo', repo.repo_id)}
48 % elif repo_group:
48 % elif repo_group:
49 <div class="label">
50 <label for="redirect_url">${_('Repository group template')}:</label>
51 </div>
52 ${dt.repo_group_name(repo_group.group_name)}
49 ${dt.repo_group_name(repo_group.group_name)}
53 ${h.hidden('bookmark_repo_group', repo_group.group_id)}
50 ${h.hidden('bookmark_repo_group', repo_group.group_id)}
54 % else:
51 % else:
55 <div class="label">
52 <div>
56 <label for="redirect_url">${_('Template Repository or Repository group')}:</label>
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 </div>
55 </div>
58 ${h.hidden('bookmark_repo', class_='bookmark_repo')}
56 <div style="margin-top:5px">
59 <span style="padding-right:15px">OR</span>
57 ${h.hidden('bookmark_repo_group', class_='bookmark_repo_group')}
60 ${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 % endif
61 % endif
62 </div>
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 </td>
64 </td>
74
65
75 </tr>
66 </tr>
@@ -111,9 +111,10 b''
111 </div>
111 </div>
112 %else:
112 %else:
113
113
114 %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name):
114
115 <div class="quick_start">
115 <div class="quick_start">
116 <div class="fieldset">
116 <div class="fieldset">
117 %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name):
117 <p><b>${_('Add or upload files directly via RhodeCode:')}</b></p>
118 <p><b>${_('Add or upload files directly via RhodeCode:')}</b></p>
118 <div class="pull-left">
119 <div class="pull-left">
119 <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>
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 %endif
125 %endif
125 </div>
126 </div>
126
127
128
127 <div class="fieldset">
129 <div class="fieldset">
128 <p><b>${_('Push new repo:')}</b></p>
130 <p><b>${_('Push new repo:')}</b></p>
129 <pre>
131 <pre>
@@ -911,7 +911,7 b' class User(Base, BaseModel):'
911 return {}
911 return {}
912
912
913 try:
913 try:
914 return json.loads(self._user_data)
914 return json.loads(self._user_data) or {}
915 except TypeError:
915 except TypeError:
916 return {}
916 return {}
917
917
@@ -63,7 +63,7 b''
63 </tr>
63 </tr>
64 %endfor
64 %endfor
65 <tr class="compare_select_hidden" style="${('' if c.collapse_all_commits else 'display: none')}">
65 <tr class="compare_select_hidden" style="${('' if c.collapse_all_commits else 'display: none')}">
66 <td colspan="5">
66 <td colspan="7">
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))}
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 </td>
68 </td>
69 </tr>
69 </tr>
@@ -1883,7 +1883,7 b' self: super: {'
1883 };
1883 };
1884 };
1884 };
1885 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1885 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1886 name = "rhodecode-enterprise-ce-4.25.1";
1886 name = "rhodecode-enterprise-ce-4.25.2";
1887 buildInputs = [
1887 buildInputs = [
1888 self."pytest"
1888 self."pytest"
1889 self."py"
1889 self."py"
@@ -791,6 +791,11 b' var CommentsController = function() {'
791 refreshDraftComments()
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 return false;
799 return false;
795 };
800 };
796
801
@@ -560,7 +560,7 b''
560
560
561 <div class="right-sidebar-expanded-state pr-details-title">
561 <div class="right-sidebar-expanded-state pr-details-title">
562 <span style="padding-left: 2px">
562 <span style="padding-left: 2px">
563 <input name="select_all_drafts" type="checkbox" onclick="$('[name=submit_draft]').prop('checked', !$('[name=submit_draft]').prop('checked'))">
563 <input name="select_all_drafts" type="checkbox" onclick="selectDraftComments(event)">
564 </span>
564 </span>
565 <span class="sidebar-heading noselect" onclick="refreshDraftComments(); return false">
565 <span class="sidebar-heading noselect" onclick="refreshDraftComments(); return false">
566 <i class="icon-comment icon-draft"></i>
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 window.closePullRequest = function (status) {
950 window.closePullRequest = function (status) {
946 if (!confirm(_gettext('Are you sure to close this pull request without merging?'))) {
951 if (!confirm(_gettext('Are you sure to close this pull request without merging?'))) {
947 return false;
952 return false;
@@ -311,6 +311,7 b' class BaseRepository(object):'
311 DEFAULT_CONTACT = u"Unknown"
311 DEFAULT_CONTACT = u"Unknown"
312 DEFAULT_DESCRIPTION = u"unknown"
312 DEFAULT_DESCRIPTION = u"unknown"
313 EMPTY_COMMIT_ID = '0' * 40
313 EMPTY_COMMIT_ID = '0' * 40
314 COMMIT_ID_PAT = re.compile(r'[0-9a-fA-F]{40}')
314
315
315 path = None
316 path = None
316
317
@@ -618,7 +618,7 b' class GitRepository(BaseRepository):'
618 else:
618 else:
619 output, __ = self.run_git_command(
619 output, __ = self.run_git_command(
620 ['merge-base', commit_id1, commit_id2])
620 ['merge-base', commit_id1, commit_id2])
621 ancestor_id = re.findall(r'[0-9a-fA-F]{40}', output)[0]
621 ancestor_id = self.COMMIT_ID_PAT.findall(output)[0]
622
622
623 log.debug('Found common ancestor with sha: %s', ancestor_id)
623 log.debug('Found common ancestor with sha: %s', ancestor_id)
624
624
@@ -642,7 +642,7 b' class GitRepository(BaseRepository):'
642 '%s..%s' % (commit_id1, commit_id2)])
642 '%s..%s' % (commit_id1, commit_id2)])
643 commits = [
643 commits = [
644 repo1.get_commit(commit_id=commit_id, pre_load=pre_load)
644 repo1.get_commit(commit_id=commit_id, pre_load=pre_load)
645 for commit_id in re.findall(r'[0-9a-fA-F]{40}', output)]
645 for commit_id in self.COMMIT_ID_PAT.findall(output)]
646
646
647 return commits
647 return commits
648
648
@@ -171,9 +171,9 b' data = {'
171 <tr>
171 <tr>
172 <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td>
172 <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td>
173 <td style="line-height:20px;">
173 <td style="line-height:20px;">
174 <code>${'{}:{}'.format(data['source_ref_type'], pull_request.source_ref_parts.name)}</code> ${_('of')} ${data['source_repo_url']}
174 <code>${data['source_ref_type']}:${pull_request.source_ref_parts.name}</code> ${_('of')} ${data['source_repo_url']}
175 &rarr;
175 &rarr;
176 <code>${'{}:{}'.format(data['target_ref_type'], pull_request.target_ref_parts.name)}</code> ${_('of')} ${data['target_repo_url']}
176 <code>${data['target_ref_type']}:${pull_request.target_ref_parts.name}</code> ${_('of')} ${data['target_repo_url']}
177 </td>
177 </td>
178 </tr>
178 </tr>
179
179
@@ -124,9 +124,9 b' data = {'
124 <tr>
124 <tr>
125 <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td>
125 <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td>
126 <td style="line-height:20px;">
126 <td style="line-height:20px;">
127 <code>${'{}:{}'.format(data['source_ref_type'], pull_request.source_ref_parts.name)}</code> ${_('of')} ${data['source_repo_url']}
127 <code>${data['source_ref_type']}:${pull_request.source_ref_parts.name}</code> ${_('of')} ${data['source_repo_url']}
128 &rarr;
128 &rarr;
129 <code>${'{}:{}'.format(data['target_ref_type'], pull_request.target_ref_parts.name)}</code> ${_('of')} ${data['target_repo_url']}
129 <code>${data['target_ref_type']}:${pull_request.target_ref_parts.name}</code> ${_('of')} ${data['target_repo_url']}
130 </td>
130 </td>
131 </tr>
131 </tr>
132
132
@@ -129,9 +129,9 b' data = {'
129 <tr>
129 <tr>
130 <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td>
130 <td style="padding-right:20px;line-height:20px;">${_('Commit Flow')}:</td>
131 <td style="line-height:20px;">
131 <td style="line-height:20px;">
132 <code>${'{}:{}'.format(data['source_ref_type'], pull_request.source_ref_parts.name)}</code> ${_('of')} ${data['source_repo_url']}
132 <code>${data['source_ref_type']}:${pull_request.source_ref_parts.name}</code> ${_('of')} ${data['source_repo_url']}
133 &rarr;
133 &rarr;
134 <code>${'{}:{}'.format(data['target_ref_type'], pull_request.target_ref_parts.name)}</code> ${_('of')} ${data['target_repo_url']}
134 <code>${data['target_ref_type']}:${pull_request.target_ref_parts.name}</code> ${_('of')} ${data['target_repo_url']}
135 </td>
135 </td>
136 </tr>
136 </tr>
137
137
@@ -143,9 +143,9 b''
143 ## pull url
143 ## pull url
144 <li>
144 <li>
145 %if h.is_hg(c.pull_request.source_repo):
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 %elif h.is_git(c.pull_request.source_repo):
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 %endif
149 %endif
150
150
151 <span>${_('Pull changes from source')}</span>: <input type="text" class="input-monospace pr-pullinfo" value="${clone_url}" readonly="readonly">
151 <span>${_('Pull changes from source')}</span>: <input type="text" class="input-monospace pr-pullinfo" value="${clone_url}" readonly="readonly">
@@ -76,3 +76,4 b' 7637c38528fa38c1eabc1fde6a869c20995a0da7'
76 6aeb4ac3ef7f0ac699c914740dad3688c9495e83 v4.24.0
76 6aeb4ac3ef7f0ac699c914740dad3688c9495e83 v4.24.0
77 6eaf953da06e468a4c4e5239d3d0e700bda6b163 v4.24.1
77 6eaf953da06e468a4c4e5239d3d0e700bda6b163 v4.24.1
78 f8161cbc2d94a935d3c395a0e758d9a094287169 v4.25.0
78 f8161cbc2d94a935d3c395a0e758d9a094287169 v4.25.0
79 77fe47b5b39338e71b2c040de2c0359b529b6251 v4.25.1
@@ -5,17 +5,22 b' done = false'
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
7 [task:rc_tools_pinned]
8 done = true
8
9
9 [task:fixes_on_stable]
10 [task:fixes_on_stable]
11 done = true
10
12
11 [task:pip2nix_generated]
13 [task:pip2nix_generated]
14 done = true
12
15
13 [task:changelog_updated]
16 [task:changelog_updated]
17 done = true
14
18
15 [task:generate_api_docs]
19 [task:generate_api_docs]
20 done = true
16
21
17 [release]
22 [release]
18 state = in_progress
23 state = prepared
19 version = 4.25.1
24 version = 4.25.1
20
25
21 [task:updated_translation]
26 [task:updated_translation]
@@ -1,5 +1,6 b''
1 [bumpversion]
1 [bumpversion]
2 current_version = 4.25.0
2 current_version = 4.25.1
3 message = release: Bump version {current_version} to {new_version}
3 message = release: Bump version {current_version} to {new_version}
4
4
5 [bumpversion:file:rhodecode/VERSION]
5 [bumpversion:file:rhodecode/VERSION]
6
@@ -5,26 +5,20 b' done = false'
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
7 [task:rc_tools_pinned]
8 done = true
9
8
10 [task:fixes_on_stable]
9 [task:fixes_on_stable]
11 done = true
12
10
13 [task:pip2nix_generated]
11 [task:pip2nix_generated]
14 done = true
15
12
16 [task:changelog_updated]
13 [task:changelog_updated]
17 done = true
18
14
19 [task:generate_api_docs]
15 [task:generate_api_docs]
20 done = true
16
17 [release]
18 state = in_progress
19 version = 4.25.1
21
20
22 [task:updated_translation]
21 [task:updated_translation]
23 done = true
24
25 [release]
26 state = prepared
27 version = 4.25.0
28
22
29 [task:generate_js_routes]
23 [task:generate_js_routes]
30
24
@@ -1,1 +1,1 b''
1 4.25.0 No newline at end of file
1 4.25.1 No newline at end of file
@@ -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.
@@ -9,6 +9,7 b' Release Notes'
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.25.1.rst
12 release-notes-4.25.0.rst
13 release-notes-4.25.0.rst
13 release-notes-4.24.1.rst
14 release-notes-4.24.1.rst
14 release-notes-4.24.0.rst
15 release-notes-4.24.0.rst
@@ -1883,7 +1883,7 b' self: super: {'
1883 };
1883 };
1884 };
1884 };
1885 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1885 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1886 name = "rhodecode-enterprise-ce-4.25.0";
1886 name = "rhodecode-enterprise-ce-4.25.1";
1887 buildInputs = [
1887 buildInputs = [
1888 self."pytest"
1888 self."pytest"
1889 self."py"
1889 self."py"
@@ -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 &middot; ${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 Admin prefixed routes
27 Admin prefixed routes
28 """
28 """
29 from rhodecode.apps.admin.views.audit_logs import AdminAuditLogsView
29 from rhodecode.apps.admin.views.audit_logs import AdminAuditLogsView
30 from rhodecode.apps.admin.views.artifacts import AdminArtifactsView
30 from rhodecode.apps.admin.views.defaults import AdminDefaultSettingsView
31 from rhodecode.apps.admin.views.defaults import AdminDefaultSettingsView
31 from rhodecode.apps.admin.views.exception_tracker import ExceptionsTrackerView
32 from rhodecode.apps.admin.views.exception_tracker import ExceptionsTrackerView
32 from rhodecode.apps.admin.views.main_views import AdminMainView
33 from rhodecode.apps.admin.views.main_views import AdminMainView
@@ -60,6 +61,34 b' def admin_routes(config):'
60 route_name='admin_audit_log_entry', request_method='GET',
61 route_name='admin_audit_log_entry', request_method='GET',
61 renderer='rhodecode:templates/admin/admin_audit_log_entry.mako')
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 config.add_route(
92 config.add_route(
64 name='admin_settings_open_source',
93 name='admin_settings_open_source',
65 pattern='/settings/open_source')
94 pattern='/settings/open_source')
@@ -75,3 +75,4 b' 56310d93b33b97535908ef9c7b0985b89bb7fad2'
75 7637c38528fa38c1eabc1fde6a869c20995a0da7 v4.23.2
75 7637c38528fa38c1eabc1fde6a869c20995a0da7 v4.23.2
76 6aeb4ac3ef7f0ac699c914740dad3688c9495e83 v4.24.0
76 6aeb4ac3ef7f0ac699c914740dad3688c9495e83 v4.24.0
77 6eaf953da06e468a4c4e5239d3d0e700bda6b163 v4.24.1
77 6eaf953da06e468a4c4e5239d3d0e700bda6b163 v4.24.1
78 f8161cbc2d94a935d3c395a0e758d9a094287169 v4.25.0
@@ -8,18 +8,22 b' done = true'
8 done = true
8 done = true
9
9
10 [task:fixes_on_stable]
10 [task:fixes_on_stable]
11 done = true
11
12
12 [task:pip2nix_generated]
13 [task:pip2nix_generated]
14 done = true
13
15
14 [task:changelog_updated]
16 [task:changelog_updated]
17 done = true
15
18
16 [task:generate_api_docs]
19 [task:generate_api_docs]
17 done = true
20 done = true
18
21
19 [task:updated_translation]
22 [task:updated_translation]
23 done = true
20
24
21 [release]
25 [release]
22 state = in_progress
26 state = prepared
23 version = 4.25.0
27 version = 4.25.0
24
28
25 [task:generate_js_routes]
29 [task:generate_js_routes]
@@ -5,6 +5,7 b' done = false'
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
7 [task:rc_tools_pinned]
8 done = true
8
9
9 [task:fixes_on_stable]
10 [task:fixes_on_stable]
10
11
@@ -13,6 +14,7 b' done = true'
13 [task:changelog_updated]
14 [task:changelog_updated]
14
15
15 [task:generate_api_docs]
16 [task:generate_api_docs]
17 done = true
16
18
17 [task:updated_translation]
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 #, fuzzy
6 #, fuzzy
7 msgid ""
7 msgid ""
8 msgstr ""
8 msgstr ""
9 "Project-Id-Version: rhodecode-enterprise-ce 4.24.0\n"
9 "Project-Id-Version: rhodecode-enterprise-ce 4.25.0\n"
10 "Report-Msgid-Bugs-To: marcin@rhodecode.com\n"
10 "Report-Msgid-Bugs-To: marcin@rhodecode.com\n"
11 "POT-Creation-Date: 2021-01-14 15:36+0000\n"
11 "POT-Creation-Date: 2021-04-05 19:29+0000\n"
12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14 "Language-Team: LANGUAGE <LL@li.org>\n"
14 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -111,7 +111,7 b' msgstr ""'
111 #: rhodecode/apps/admin/views/settings.py:156
111 #: rhodecode/apps/admin/views/settings.py:156
112 #: rhodecode/apps/admin/views/settings.py:291
112 #: rhodecode/apps/admin/views/settings.py:291
113 #: rhodecode/apps/admin/views/settings.py:360
113 #: rhodecode/apps/admin/views/settings.py:360
114 #: rhodecode/apps/admin/views/settings.py:663
114 #: rhodecode/apps/admin/views/settings.py:664
115 #: rhodecode/apps/repository/views/repo_settings_vcs.py:116
115 #: rhodecode/apps/repository/views/repo_settings_vcs.py:116
116 msgid "Some form inputs contain invalid data."
116 msgid "Some form inputs contain invalid data."
117 msgstr ""
117 msgstr ""
@@ -135,54 +135,54 b' msgstr ""'
135 msgid "Updated application settings"
135 msgid "Updated application settings"
136 msgstr ""
136 msgstr ""
137
137
138 #: rhodecode/apps/admin/views/settings.py:399
138 #: rhodecode/apps/admin/views/settings.py:400
139 msgid "Updated visualisation settings"
139 msgid "Updated visualisation settings"
140 msgstr ""
140 msgstr ""
141
141
142 #: rhodecode/apps/admin/views/settings.py:402
142 #: rhodecode/apps/admin/views/settings.py:403
143 msgid "Error occurred during updating visualisation settings"
143 msgid "Error occurred during updating visualisation settings"
144 msgstr ""
144 msgstr ""
145
145
146 #: rhodecode/apps/admin/views/settings.py:464
146 #: rhodecode/apps/admin/views/settings.py:465
147 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:115
147 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:115
148 msgid "Invalid issue tracker pattern: {}"
148 msgid "Invalid issue tracker pattern: {}"
149 msgstr ""
149 msgstr ""
150
150
151 #: rhodecode/apps/admin/views/settings.py:481
151 #: rhodecode/apps/admin/views/settings.py:482
152 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:124
152 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:124
153 msgid "Updated issue tracker entries"
153 msgid "Updated issue tracker entries"
154 msgstr ""
154 msgstr ""
155
155
156 #: rhodecode/apps/admin/views/settings.py:498
156 #: rhodecode/apps/admin/views/settings.py:499
157 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:82
157 #: rhodecode/apps/repository/views/repo_settings_issue_trackers.py:82
158 msgid "Removed issue tracker entry."
158 msgid "Removed issue tracker entry."
159 msgstr ""
159 msgstr ""
160
160
161 #: rhodecode/apps/admin/views/settings.py:530
161 #: rhodecode/apps/admin/views/settings.py:531
162 msgid "Please enter email address"
162 msgid "Please enter email address"
163 msgstr ""
163 msgstr ""
164
164
165 #: rhodecode/apps/admin/views/settings.py:546
165 #: rhodecode/apps/admin/views/settings.py:547
166 msgid "Send email task created"
166 msgid "Send email task created"
167 msgstr ""
167 msgstr ""
168
168
169 #: rhodecode/apps/admin/views/settings.py:587
169 #: rhodecode/apps/admin/views/settings.py:588
170 msgid "Added new hook"
170 msgid "Added new hook"
171 msgstr ""
171 msgstr ""
172
172
173 #: rhodecode/apps/admin/views/settings.py:602
173 #: rhodecode/apps/admin/views/settings.py:603
174 msgid "Updated hooks"
174 msgid "Updated hooks"
175 msgstr ""
175 msgstr ""
176
176
177 #: rhodecode/apps/admin/views/settings.py:606
177 #: rhodecode/apps/admin/views/settings.py:607
178 msgid "Error occurred during hook creation"
178 msgid "Error occurred during hook creation"
179 msgstr ""
179 msgstr ""
180
180
181 #: rhodecode/apps/admin/views/settings.py:687
181 #: rhodecode/apps/admin/views/settings.py:688
182 msgid "Error occurred during updating labs settings"
182 msgid "Error occurred during updating labs settings"
183 msgstr ""
183 msgstr ""
184
184
185 #: rhodecode/apps/admin/views/settings.py:692
185 #: rhodecode/apps/admin/views/settings.py:693
186 msgid "Updated Labs settings"
186 msgid "Updated Labs settings"
187 msgstr ""
187 msgstr ""
188
188
@@ -592,7 +592,7 b' msgstr ""'
592 msgid "1 month"
592 msgid "1 month"
593 msgstr ""
593 msgstr ""
594
594
595 #: rhodecode/apps/gist/views.py:63 rhodecode/public/js/scripts.js:48529
595 #: rhodecode/apps/gist/views.py:63 rhodecode/public/js/scripts.js:48670
596 #: rhodecode/public/js/scripts.min.js:1
596 #: rhodecode/public/js/scripts.min.js:1
597 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:48
597 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:48
598 #: rhodecode/public/js/src/rhodecode.js:634
598 #: rhodecode/public/js/src/rhodecode.js:634
@@ -653,8 +653,8 b' msgstr ""'
653 #: rhodecode/templates/admin/repos/repo_add.mako:19
653 #: rhodecode/templates/admin/repos/repo_add.mako:19
654 #: rhodecode/templates/admin/users/user_edit_advanced.mako:12
654 #: rhodecode/templates/admin/users/user_edit_advanced.mako:12
655 #: rhodecode/templates/base/base.mako:114
655 #: rhodecode/templates/base/base.mako:114
656 #: rhodecode/templates/base/base.mako:133
656 #: rhodecode/templates/base/base.mako:134
657 #: rhodecode/templates/base/base.mako:1191
657 #: rhodecode/templates/base/base.mako:1192
658 msgid "Repositories"
658 msgid "Repositories"
659 msgstr ""
659 msgstr ""
660
660
@@ -894,104 +894,104 b' msgstr ""'
894 msgid "No such commit exists for this repository. Commit: {}"
894 msgid "No such commit exists for this repository. Commit: {}"
895 msgstr ""
895 msgstr ""
896
896
897 #: rhodecode/apps/repository/views/repo_files.py:358
897 #: rhodecode/apps/repository/views/repo_files.py:359
898 msgid "Downloads disabled"
898 msgid "Downloads disabled"
899 msgstr ""
899 msgstr ""
900
900
901 #: rhodecode/apps/repository/views/repo_files.py:364
901 #: rhodecode/apps/repository/views/repo_files.py:365
902 msgid "Unknown archive type for: `{}`"
902 msgid "Unknown archive type for: `{}`"
903 msgstr ""
903 msgstr ""
904
904
905 #: rhodecode/apps/repository/views/repo_files.py:370
905 #: rhodecode/apps/repository/views/repo_files.py:371
906 msgid "Unknown commit_id {}"
906 msgid "Unknown commit_id {}"
907 msgstr ""
907 msgstr ""
908
908
909 #: rhodecode/apps/repository/views/repo_files.py:373
909 #: rhodecode/apps/repository/views/repo_files.py:374
910 msgid "Empty repository"
910 msgid "Empty repository"
911 msgstr ""
911 msgstr ""
912
912
913 #: rhodecode/apps/repository/views/repo_files.py:378
913 #: rhodecode/apps/repository/views/repo_files.py:384
914 msgid "No node at path {} for this repository"
914 msgid "No node at path {} for this repository"
915 msgstr ""
915 msgstr ""
916
916
917 #: rhodecode/apps/repository/views/repo_files.py:429
917 #: rhodecode/apps/repository/views/repo_files.py:436
918 msgid "Unknown archive type"
918 msgid "Unknown archive type"
919 msgstr ""
919 msgstr ""
920
920
921 #: rhodecode/apps/repository/views/repo_files.py:986
921 #: rhodecode/apps/repository/views/repo_files.py:993
922 msgid "Changesets"
922 msgid "Changesets"
923 msgstr ""
923 msgstr ""
924
924
925 #: rhodecode/apps/repository/views/repo_files.py:1007
925 #: rhodecode/apps/repository/views/repo_files.py:1014
926 #: rhodecode/apps/repository/views/repo_summary.py:243
926 #: rhodecode/apps/repository/views/repo_summary.py:239
927 #: rhodecode/model/pull_request.py:1910 rhodecode/model/scm.py:999
927 #: rhodecode/model/pull_request.py:1912 rhodecode/model/scm.py:999
928 #: rhodecode/templates/base/vcs_settings.mako:235
928 #: rhodecode/templates/base/vcs_settings.mako:235
929 #: rhodecode/templates/summary/components.mako:10
929 #: rhodecode/templates/summary/components.mako:10
930 msgid "Branches"
930 msgid "Branches"
931 msgstr ""
931 msgstr ""
932
932
933 #: rhodecode/apps/repository/views/repo_files.py:1011
933 #: rhodecode/apps/repository/views/repo_files.py:1018
934 #: rhodecode/model/scm.py:1016 rhodecode/templates/base/vcs_settings.mako:260
934 #: rhodecode/model/scm.py:1016 rhodecode/templates/base/vcs_settings.mako:260
935 #: rhodecode/templates/summary/components.mako:34
935 #: rhodecode/templates/summary/components.mako:34
936 msgid "Tags"
936 msgid "Tags"
937 msgstr ""
937 msgstr ""
938
938
939 #: rhodecode/apps/repository/views/repo_files.py:1155
939 #: rhodecode/apps/repository/views/repo_files.py:1162
940 #: rhodecode/apps/repository/views/repo_files.py:1181
940 #: rhodecode/apps/repository/views/repo_files.py:1188
941 msgid "Deleted file {} via RhodeCode Enterprise"
941 msgid "Deleted file {} via RhodeCode Enterprise"
942 msgstr ""
942 msgstr ""
943
943
944 #: rhodecode/apps/repository/views/repo_files.py:1202
944 #: rhodecode/apps/repository/views/repo_files.py:1209
945 msgid "Successfully deleted file `{}`"
945 msgid "Successfully deleted file `{}`"
946 msgstr ""
946 msgstr ""
947
947
948 #: rhodecode/apps/repository/views/repo_files.py:1206
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 #: rhodecode/apps/repository/views/repo_files.py:1319
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 msgid "Successfully committed changes to file `{}`"
965 msgid "Successfully committed changes to file `{}`"
966 msgstr ""
966 msgstr ""
967
967
968 #: rhodecode/apps/repository/views/repo_files.py:1348
968 #: rhodecode/apps/repository/views/repo_files.py:1355
969 #: rhodecode/apps/repository/views/repo_files.py:1387
969 #: rhodecode/apps/repository/views/repo_files.py:1394
970 msgid "Added file via RhodeCode Enterprise"
970 msgid "Added file via RhodeCode Enterprise"
971 msgstr ""
971 msgstr ""
972
972
973 #: rhodecode/apps/repository/views/repo_files.py:1403
973 #: rhodecode/apps/repository/views/repo_files.py:1410
974 msgid "No filename specified"
974 msgid "No filename specified"
975 msgstr ""
975 msgstr ""
976
976
977 #: rhodecode/apps/repository/views/repo_files.py:1428
977 #: rhodecode/apps/repository/views/repo_files.py:1435
978 msgid "Successfully committed new file `{}`"
978 msgid "Successfully committed new file `{}`"
979 msgstr ""
979 msgstr ""
980
980
981 #: rhodecode/apps/repository/views/repo_files.py:1436
981 #: rhodecode/apps/repository/views/repo_files.py:1443
982 #: rhodecode/apps/repository/views/repo_files.py:1546
982 #: rhodecode/apps/repository/views/repo_files.py:1553
983 msgid "The location specified must be a relative path and must not contain .. in the path"
983 msgid "The location specified must be a relative path and must not contain .. in the path"
984 msgstr ""
984 msgstr ""
985
985
986 #: rhodecode/apps/repository/views/repo_files.py:1491
986 #: rhodecode/apps/repository/views/repo_files.py:1498
987 msgid "Uploaded file via RhodeCode Enterprise"
987 msgid "Uploaded file via RhodeCode Enterprise"
988 msgstr ""
988 msgstr ""
989
989
990 #: rhodecode/apps/repository/views/repo_files.py:1535
990 #: rhodecode/apps/repository/views/repo_files.py:1542
991 msgid "Successfully committed {} new files"
991 msgid "Successfully committed {} new files"
992 msgstr ""
992 msgstr ""
993
993
994 #: rhodecode/apps/repository/views/repo_files.py:1537
994 #: rhodecode/apps/repository/views/repo_files.py:1544
995 msgid "Successfully committed 1 new file"
995 msgid "Successfully committed 1 new file"
996 msgstr ""
996 msgstr ""
997
997
@@ -1215,23 +1215,23 b' msgstr ""'
1215 msgid "Error occurred during updating repository VCS settings"
1215 msgid "Error occurred during updating repository VCS settings"
1216 msgstr ""
1216 msgstr ""
1217
1217
1218 #: rhodecode/apps/repository/views/repo_summary.py:222
1218 #: rhodecode/apps/repository/views/repo_summary.py:218
1219 #: rhodecode/templates/admin/permissions/permissions.mako:42
1219 #: rhodecode/templates/admin/permissions/permissions.mako:42
1220 #: rhodecode/templates/summary/components.mako:8
1220 #: rhodecode/templates/summary/components.mako:8
1221 msgid "Branch"
1221 msgid "Branch"
1222 msgstr ""
1222 msgstr ""
1223
1223
1224 #: rhodecode/apps/repository/views/repo_summary.py:223
1224 #: rhodecode/apps/repository/views/repo_summary.py:219
1225 #: rhodecode/templates/summary/components.mako:32
1225 #: rhodecode/templates/summary/components.mako:32
1226 msgid "Tag"
1226 msgid "Tag"
1227 msgstr ""
1227 msgstr ""
1228
1228
1229 #: rhodecode/apps/repository/views/repo_summary.py:224
1229 #: rhodecode/apps/repository/views/repo_summary.py:220
1230 #: rhodecode/templates/summary/components.mako:44
1230 #: rhodecode/templates/summary/components.mako:44
1231 msgid "Bookmark"
1231 msgid "Bookmark"
1232 msgstr ""
1232 msgstr ""
1233
1233
1234 #: rhodecode/apps/repository/views/repo_summary.py:244
1234 #: rhodecode/apps/repository/views/repo_summary.py:240
1235 msgid "Closed branches"
1235 msgid "Closed branches"
1236 msgstr ""
1236 msgstr ""
1237
1237
@@ -1291,9 +1291,9 b' msgid "Enable or disable this authentica'
1291 msgstr ""
1291 msgstr ""
1292
1292
1293 #: rhodecode/authentication/schema.py:38 rhodecode/integrations/schema.py:32
1293 #: rhodecode/authentication/schema.py:38 rhodecode/integrations/schema.py:32
1294 #: rhodecode/model/permission.py:110 rhodecode/model/permission.py:114
1294 #: rhodecode/model/permission.py:112 rhodecode/model/permission.py:116
1295 #: rhodecode/model/permission.py:118 rhodecode/model/permission.py:122
1295 #: rhodecode/model/permission.py:120 rhodecode/model/permission.py:124
1296 #: rhodecode/model/permission.py:126 rhodecode/model/permission.py:130
1296 #: rhodecode/model/permission.py:128 rhodecode/model/permission.py:132
1297 #: rhodecode/model/validation_schema/schemas/integration_schema.py:195
1297 #: rhodecode/model/validation_schema/schemas/integration_schema.py:195
1298 #: rhodecode/templates/admin/auth/auth_settings.mako:64
1298 #: rhodecode/templates/admin/auth/auth_settings.mako:64
1299 #: rhodecode/templates/admin/integrations/list.mako:71
1299 #: rhodecode/templates/admin/integrations/list.mako:71
@@ -1806,7 +1806,7 b' msgstr ""'
1806 #: rhodecode/templates/admin/settings/settings_issuetracker.mako:16
1806 #: rhodecode/templates/admin/settings/settings_issuetracker.mako:16
1807 #: rhodecode/templates/admin/settings/settings_labs.mako:49
1807 #: rhodecode/templates/admin/settings/settings_labs.mako:49
1808 #: rhodecode/templates/admin/settings/settings_vcs.mako:14
1808 #: rhodecode/templates/admin/settings/settings_vcs.mako:14
1809 #: rhodecode/templates/admin/settings/settings_visual.mako:215
1809 #: rhodecode/templates/admin/settings/settings_visual.mako:218
1810 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:217
1810 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:217
1811 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:107
1811 #: rhodecode/templates/admin/users/user_edit_auth_tokens.mako:107
1812 #: rhodecode/templates/admin/users/user_edit_emails.mako:66
1812 #: rhodecode/templates/admin/users/user_edit_emails.mako:66
@@ -1841,7 +1841,7 b' msgstr ""'
1841 #: rhodecode/templates/changeset/changeset_file_comment.mako:236
1841 #: rhodecode/templates/changeset/changeset_file_comment.mako:236
1842 #: rhodecode/templates/changeset/changeset_file_comment.mako:250
1842 #: rhodecode/templates/changeset/changeset_file_comment.mako:250
1843 #: rhodecode/templates/changeset/changeset_file_comment.mako:259
1843 #: rhodecode/templates/changeset/changeset_file_comment.mako:259
1844 #: rhodecode/templates/data_table/_dt_elements.mako:439
1844 #: rhodecode/templates/data_table/_dt_elements.mako:445
1845 #: rhodecode/templates/debug_style/buttons.html:132
1845 #: rhodecode/templates/debug_style/buttons.html:132
1846 #: rhodecode/templates/files/files_source.mako:40
1846 #: rhodecode/templates/files/files_source.mako:40
1847 #: rhodecode/templates/files/files_source.mako:47
1847 #: rhodecode/templates/files/files_source.mako:47
@@ -2229,15 +2229,15 b' msgstr ""'
2229 msgid "Commit not found"
2229 msgid "Commit not found"
2230 msgstr ""
2230 msgstr ""
2231
2231
2232 #: rhodecode/lib/auth.py:1769
2232 #: rhodecode/lib/auth.py:1771
2233 msgid "IP {} not allowed"
2233 msgid "IP {} not allowed"
2234 msgstr ""
2234 msgstr ""
2235
2235
2236 #: rhodecode/lib/auth.py:1861
2236 #: rhodecode/lib/auth.py:1863
2237 msgid "You need to be a registered user to perform this action"
2237 msgid "You need to be a registered user to perform this action"
2238 msgstr ""
2238 msgstr ""
2239
2239
2240 #: rhodecode/lib/auth.py:1905
2240 #: rhodecode/lib/auth.py:1907
2241 msgid "You need to be signed in to view this page"
2241 msgid "You need to be signed in to view this page"
2242 msgstr ""
2242 msgstr ""
2243
2243
@@ -2249,7 +2249,7 b' msgstr ""'
2249 msgid "Click to select line"
2249 msgid "Click to select line"
2250 msgstr ""
2250 msgstr ""
2251
2251
2252 #: rhodecode/lib/helpers.py:1878
2252 #: rhodecode/lib/helpers.py:1883
2253 msgid ""
2253 msgid ""
2254 "Example filter terms:\n"
2254 "Example filter terms:\n"
2255 " repository:vcs\n"
2255 " repository:vcs\n"
@@ -2271,7 +2271,7 b' msgid ""'
2271 " \"username:test AND repository:test*\"\n"
2271 " \"username:test AND repository:test*\"\n"
2272 msgstr ""
2272 msgstr ""
2273
2273
2274 #: rhodecode/lib/helpers.py:1902
2274 #: rhodecode/lib/helpers.py:1907
2275 #, python-format
2275 #, python-format
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"
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 msgstr ""
2277 msgstr ""
@@ -2760,7 +2760,7 b' msgstr ""'
2760 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3011
2760 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:3011
2761 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3012
2761 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:3012
2762 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3230 rhodecode/model/db.py:3997
2762 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:3230 rhodecode/model/db.py:3997
2763 #: rhodecode/public/js/scripts.js:42595 rhodecode/public/js/scripts.min.js:1
2763 #: rhodecode/public/js/scripts.js:42733 rhodecode/public/js/scripts.min.js:1
2764 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:72
2764 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:72
2765 #: rhodecode/public/js/src/rhodecode/pullrequests.js:396
2765 #: rhodecode/public/js/src/rhodecode/pullrequests.js:396
2766 msgid "Not Reviewed"
2766 msgid "Not Reviewed"
@@ -3520,7 +3520,7 b' msgstr ""'
3520 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2358
3520 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2358
3521 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2359
3521 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2359
3522 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2559 rhodecode/model/db.py:3174
3522 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2559 rhodecode/model/db.py:3174
3523 #: rhodecode/model/permission.py:105
3523 #: rhodecode/model/permission.py:107
3524 msgid "Manual activation of external account"
3524 msgid "Manual activation of external account"
3525 msgstr ""
3525 msgstr ""
3526
3526
@@ -3560,7 +3560,7 b' msgstr ""'
3560 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2359
3560 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_0.py:2359
3561 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2360
3561 #: rhodecode/lib/dbmigrate/schema/db_4_7_0_1.py:2360
3562 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2560 rhodecode/model/db.py:3175
3562 #: rhodecode/lib/dbmigrate/schema/db_4_9_0_0.py:2560 rhodecode/model/db.py:3175
3563 #: rhodecode/model/permission.py:106
3563 #: rhodecode/model/permission.py:108
3564 msgid "Automatic activation of external account"
3564 msgid "Automatic activation of external account"
3565 msgstr ""
3565 msgstr ""
3566
3566
@@ -3986,51 +3986,51 b' msgstr ""'
3986 msgid "Commit index"
3986 msgid "Commit index"
3987 msgstr ""
3987 msgstr ""
3988
3988
3989 #: rhodecode/lib/vcs/backends/base.py:186
3989 #: rhodecode/lib/vcs/backends/base.py:190
3990 msgid "This pull request can be automatically merged."
3990 msgid "This pull request can be automatically merged."
3991 msgstr ""
3991 msgstr ""
3992
3992
3993 #: rhodecode/lib/vcs/backends/base.py:188
3993 #: rhodecode/lib/vcs/backends/base.py:192
3994 msgid "This pull request cannot be merged because of an unhandled exception. {exception}"
3994 msgid "This pull request cannot be merged because of an unhandled exception. {exception}"
3995 msgstr ""
3995 msgstr ""
3996
3996
3997 #: rhodecode/lib/vcs/backends/base.py:191
3997 #: rhodecode/lib/vcs/backends/base.py:195
3998 msgid "This pull request cannot be merged because of merge conflicts. {unresolved_files}"
3998 msgid "This pull request cannot be merged because of merge conflicts. {unresolved_files}"
3999 msgstr ""
3999 msgstr ""
4000
4000
4001 #: rhodecode/lib/vcs/backends/base.py:193
4001 #: rhodecode/lib/vcs/backends/base.py:197
4002 msgid "This pull request could not be merged because push to target:`{target}@{merge_commit}` failed."
4002 msgid "This pull request could not be merged because push to target:`{target}@{merge_commit}` failed."
4003 msgstr ""
4003 msgstr ""
4004
4004
4005 #: rhodecode/lib/vcs/backends/base.py:196
4005 #: rhodecode/lib/vcs/backends/base.py:200
4006 msgid "This pull request cannot be merged because the target `{target_ref.name}` is not a head."
4006 msgid "This pull request cannot be merged because the target `{target_ref.name}` is not a head."
4007 msgstr ""
4007 msgstr ""
4008
4008
4009 #: rhodecode/lib/vcs/backends/base.py:199
4009 #: rhodecode/lib/vcs/backends/base.py:203
4010 msgid "This pull request cannot be merged because the source contains more branches than the target."
4010 msgid "This pull request cannot be merged because the source contains more branches than the target."
4011 msgstr ""
4011 msgstr ""
4012
4012
4013 #: rhodecode/lib/vcs/backends/base.py:202
4013 #: rhodecode/lib/vcs/backends/base.py:206
4014 msgid "This pull request cannot be merged because the target `{target_ref.name}` has multiple heads: `{heads}`."
4014 msgid "This pull request cannot be merged because the target `{target_ref.name}` has multiple heads: `{heads}`."
4015 msgstr ""
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 #: rhodecode/lib/vcs/backends/base.py:209
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 msgid "This pull request cannot be merged because the target reference `{target_ref.name}` is missing."
4022 msgid "This pull request cannot be merged because the target reference `{target_ref.name}` is missing."
4023 msgstr ""
4023 msgstr ""
4024
4024
4025 #: rhodecode/lib/vcs/backends/base.py:212
4025 #: rhodecode/lib/vcs/backends/base.py:216
4026 msgid "This pull request cannot be merged because the source reference `{source_ref.name}` is missing."
4026 msgid "This pull request cannot be merged because the source reference `{source_ref.name}` is missing."
4027 msgstr ""
4027 msgstr ""
4028
4028
4029 #: rhodecode/lib/vcs/backends/base.py:215
4029 #: rhodecode/lib/vcs/backends/base.py:219
4030 msgid "This pull request cannot be merged because of conflicts related to sub repositories."
4030 msgid "This pull request cannot be merged because of conflicts related to sub repositories."
4031 msgstr ""
4031 msgstr ""
4032
4032
4033 #: rhodecode/lib/vcs/backends/base.py:220
4033 #: rhodecode/lib/vcs/backends/base.py:224
4034 msgid "This pull request cannot be merged because the target or the source reference is missing."
4034 msgid "This pull request cannot be merged because the target or the source reference is missing."
4035 msgstr ""
4035 msgstr ""
4036
4036
@@ -4138,8 +4138,8 b' msgstr ""'
4138 msgid "%(user)s commented on pull request at %(date_or_age)s"
4138 msgid "%(user)s commented on pull request at %(date_or_age)s"
4139 msgstr ""
4139 msgstr ""
4140
4140
4141 #: rhodecode/model/permission.py:71 rhodecode/model/permission.py:77
4141 #: rhodecode/model/permission.py:73 rhodecode/model/permission.py:79
4142 #: rhodecode/model/permission.py:83
4142 #: rhodecode/model/permission.py:85
4143 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:11
4143 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:11
4144 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:217
4144 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:217
4145 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:11
4145 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:11
@@ -4147,27 +4147,27 b' msgstr ""'
4147 msgid "None"
4147 msgid "None"
4148 msgstr ""
4148 msgstr ""
4149
4149
4150 #: rhodecode/model/permission.py:72 rhodecode/model/permission.py:78
4150 #: rhodecode/model/permission.py:74 rhodecode/model/permission.py:80
4151 #: rhodecode/model/permission.py:84
4151 #: rhodecode/model/permission.py:86
4152 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:12
4152 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:12
4153 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:12
4153 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:12
4154 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:16
4154 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:16
4155 msgid "Read"
4155 msgid "Read"
4156 msgstr ""
4156 msgstr ""
4157
4157
4158 #: rhodecode/model/permission.py:73 rhodecode/model/permission.py:79
4158 #: rhodecode/model/permission.py:75 rhodecode/model/permission.py:81
4159 #: rhodecode/model/permission.py:85
4159 #: rhodecode/model/permission.py:87
4160 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:13
4160 #: rhodecode/templates/admin/repo_groups/repo_group_edit_permissions.mako:13
4161 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:13
4161 #: rhodecode/templates/admin/repos/repo_edit_permissions.mako:13
4162 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:17
4162 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:17
4163 #: rhodecode/templates/changeset/changeset_file_comment.mako:392
4163 #: rhodecode/templates/changeset/changeset_file_comment.mako:392
4164 #: rhodecode/templates/changeset/changeset_file_comment.mako:443
4164 #: rhodecode/templates/changeset/changeset_file_comment.mako:443
4165 #: rhodecode/templates/data_table/_dt_elements.mako:453
4165 #: rhodecode/templates/data_table/_dt_elements.mako:460
4166 msgid "Write"
4166 msgid "Write"
4167 msgstr ""
4167 msgstr ""
4168
4168
4169 #: rhodecode/model/permission.py:74 rhodecode/model/permission.py:80
4169 #: rhodecode/model/permission.py:76 rhodecode/model/permission.py:82
4170 #: rhodecode/model/permission.py:86
4170 #: rhodecode/model/permission.py:88
4171 #: rhodecode/templates/admin/auth/plugin_settings.mako:12
4171 #: rhodecode/templates/admin/auth/plugin_settings.mako:12
4172 #: rhodecode/templates/admin/defaults/defaults.mako:12
4172 #: rhodecode/templates/admin/defaults/defaults.mako:12
4173 #: rhodecode/templates/admin/integrations/base.mako:21
4173 #: rhodecode/templates/admin/integrations/base.mako:21
@@ -4189,51 +4189,51 b' msgstr ""'
4189 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:18
4189 #: rhodecode/templates/admin/user_groups/user_group_edit_perms.mako:18
4190 #: rhodecode/templates/admin/users/user_add.mako:11
4190 #: rhodecode/templates/admin/users/user_add.mako:11
4191 #: rhodecode/templates/admin/users/user_edit.mako:12
4191 #: rhodecode/templates/admin/users/user_edit.mako:12
4192 #: rhodecode/templates/base/base.mako:838
4192 #: rhodecode/templates/base/base.mako:839
4193 msgid "Admin"
4193 msgid "Admin"
4194 msgstr ""
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 #: rhodecode/model/permission.py:91
4196 #: rhodecode/model/permission.py:91
4205 msgid "Push"
4197 msgid "Protected/No Access"
4206 msgstr ""
4198 msgstr ""
4207
4199
4208 #: rhodecode/model/permission.py:92
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 msgid "Force Push"
4209 msgid "Force Push"
4210 msgstr ""
4210 msgstr ""
4211
4211
4212 #: rhodecode/model/permission.py:95 rhodecode/model/permission.py:109
4212 #: rhodecode/model/permission.py:97 rhodecode/model/permission.py:111
4213 #: rhodecode/model/permission.py:113 rhodecode/model/permission.py:117
4213 #: rhodecode/model/permission.py:115 rhodecode/model/permission.py:119
4214 #: rhodecode/model/permission.py:121 rhodecode/model/permission.py:125
4214 #: rhodecode/model/permission.py:123 rhodecode/model/permission.py:127
4215 #: rhodecode/model/permission.py:129
4215 #: rhodecode/model/permission.py:131
4216 #: rhodecode/templates/admin/my_account/my_account_notifications.mako:27
4216 #: rhodecode/templates/admin/my_account/my_account_notifications.mako:27
4217 msgid "Disabled"
4217 msgid "Disabled"
4218 msgstr ""
4218 msgstr ""
4219
4219
4220 #: rhodecode/model/permission.py:96
4220 #: rhodecode/model/permission.py:98
4221 msgid "Allowed with manual account activation"
4221 msgid "Allowed with manual account activation"
4222 msgstr ""
4222 msgstr ""
4223
4223
4224 #: rhodecode/model/permission.py:97
4224 #: rhodecode/model/permission.py:99
4225 msgid "Allowed with automatic account activation"
4225 msgid "Allowed with automatic account activation"
4226 msgstr ""
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 #: rhodecode/model/permission.py:102
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 msgid "Disable password recovery"
4237 msgid "Disable password recovery"
4238 msgstr ""
4238 msgstr ""
4239
4239
@@ -4261,79 +4261,79 b' msgstr ""'
4261 msgid "This pull request cannot be updated because the source reference is missing."
4261 msgid "This pull request cannot be updated because the source reference is missing."
4262 msgstr ""
4262 msgstr ""
4263
4263
4264 #: rhodecode/model/pull_request.py:1688
4264 #: rhodecode/model/pull_request.py:1690
4265 msgid "Server-side pull request merging is disabled."
4265 msgid "Server-side pull request merging is disabled."
4266 msgstr ""
4266 msgstr ""
4267
4267
4268 #: rhodecode/model/pull_request.py:1691
4268 #: rhodecode/model/pull_request.py:1693
4269 msgid "This pull request is closed."
4269 msgid "This pull request is closed."
4270 msgstr ""
4270 msgstr ""
4271
4271
4272 #: rhodecode/model/pull_request.py:1705
4272 #: rhodecode/model/pull_request.py:1707
4273 msgid "Pull request merging is not supported."
4273 msgid "Pull request merging is not supported."
4274 msgstr ""
4274 msgstr ""
4275
4275
4276 #: rhodecode/model/pull_request.py:1722
4276 #: rhodecode/model/pull_request.py:1724
4277 msgid "Target repository large files support is disabled."
4277 msgid "Target repository large files support is disabled."
4278 msgstr ""
4278 msgstr ""
4279
4279
4280 #: rhodecode/model/pull_request.py:1725
4280 #: rhodecode/model/pull_request.py:1727
4281 msgid "Source repository large files support is disabled."
4281 msgid "Source repository large files support is disabled."
4282 msgstr ""
4282 msgstr ""
4283
4283
4284 #: rhodecode/model/pull_request.py:1909 rhodecode/model/scm.py:1008
4284 #: rhodecode/model/pull_request.py:1911 rhodecode/model/scm.py:1008
4285 #: rhodecode/templates/admin/my_account/my_account.mako:32
4285 #: rhodecode/templates/admin/my_account/my_account.mako:32
4286 #: rhodecode/templates/base/base.mako:638
4286 #: rhodecode/templates/base/base.mako:639
4287 #: rhodecode/templates/summary/components.mako:46
4287 #: rhodecode/templates/summary/components.mako:46
4288 msgid "Bookmarks"
4288 msgid "Bookmarks"
4289 msgstr ""
4289 msgstr ""
4290
4290
4291 #: rhodecode/model/pull_request.py:1914
4291 #: rhodecode/model/pull_request.py:1916
4292 msgid "Commit IDs"
4292 msgid "Commit IDs"
4293 msgstr ""
4293 msgstr ""
4294
4294
4295 #: rhodecode/model/pull_request.py:1917
4295 #: rhodecode/model/pull_request.py:1919
4296 #: rhodecode/templates/summary/components.mako:22
4296 #: rhodecode/templates/summary/components.mako:22
4297 msgid "Closed Branches"
4297 msgid "Closed Branches"
4298 msgstr ""
4298 msgstr ""
4299
4299
4300 #: rhodecode/model/pull_request.py:2103
4300 #: rhodecode/model/pull_request.py:2105
4301 msgid "WIP marker in title prevents from accidental merge."
4301 msgid "WIP marker in title prevents from accidental merge."
4302 msgstr ""
4302 msgstr ""
4303
4303
4304 #: rhodecode/model/pull_request.py:2113
4304 #: rhodecode/model/pull_request.py:2115
4305 msgid "User `{}` not allowed to perform merge."
4305 msgid "User `{}` not allowed to perform merge."
4306 msgstr ""
4306 msgstr ""
4307
4307
4308 #: rhodecode/model/pull_request.py:2131
4308 #: rhodecode/model/pull_request.py:2133
4309 msgid "Target branch `{}` changes rejected by rule {}."
4309 msgid "Target branch `{}` changes rejected by rule {}."
4310 msgstr ""
4310 msgstr ""
4311
4311
4312 #: rhodecode/model/pull_request.py:2146
4312 #: rhodecode/model/pull_request.py:2148
4313 msgid "Pull request reviewer approval is pending."
4313 msgid "Pull request reviewer approval is pending."
4314 msgstr ""
4314 msgstr ""
4315
4315
4316 #: rhodecode/model/pull_request.py:2160
4316 #: rhodecode/model/pull_request.py:2162
4317 msgid "Cannot merge, {} TODO still not resolved."
4317 msgid "Cannot merge, {} TODO still not resolved."
4318 msgstr ""
4318 msgstr ""
4319
4319
4320 #: rhodecode/model/pull_request.py:2163
4320 #: rhodecode/model/pull_request.py:2165
4321 msgid "Cannot merge, {} TODOs still not resolved."
4321 msgid "Cannot merge, {} TODOs still not resolved."
4322 msgstr ""
4322 msgstr ""
4323
4323
4324 #: rhodecode/model/pull_request.py:2218
4324 #: rhodecode/model/pull_request.py:2220
4325 msgid "Merge strategy: rebase"
4325 msgid "Merge strategy: rebase"
4326 msgstr ""
4326 msgstr ""
4327
4327
4328 #: rhodecode/model/pull_request.py:2223
4328 #: rhodecode/model/pull_request.py:2225
4329 msgid "Merge strategy: explicit merge commit"
4329 msgid "Merge strategy: explicit merge commit"
4330 msgstr ""
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 #: rhodecode/model/pull_request.py:2233
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 msgid "Source branch will be deleted after the merge."
4337 msgid "Source branch will be deleted after the merge."
4338 msgstr ""
4338 msgstr ""
4339
4339
@@ -4880,129 +4880,133 b' msgstr ""'
4880 msgid "Note Comment"
4880 msgid "Note Comment"
4881 msgstr ""
4881 msgstr ""
4882
4882
4883 #: rhodecode/public/js/scripts.js:39599 rhodecode/public/js/scripts.js:39987
4883 #: rhodecode/public/js/scripts.js:39599 rhodecode/public/js/scripts.js:39985
4884 #: rhodecode/public/js/scripts.min.js:1
4884 #: rhodecode/public/js/scripts.min.js:1
4885 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:103
4885 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:103
4886 #: rhodecode/public/js/src/rhodecode/codemirror.js:730
4886 #: rhodecode/public/js/src/rhodecode/codemirror.js:730
4887 #: rhodecode/public/js/src/rhodecode/comments.js:267
4887 #: rhodecode/public/js/src/rhodecode/comments.js:265
4888 msgid "Status Review"
4888 msgid "Status Review"
4889 msgstr ""
4889 msgstr ""
4890
4890
4891 #: rhodecode/public/js/scripts.js:39614 rhodecode/public/js/scripts.js:40004
4891 #: rhodecode/public/js/scripts.js:39614 rhodecode/public/js/scripts.js:40002
4892 #: rhodecode/public/js/scripts.min.js:1
4892 #: rhodecode/public/js/scripts.min.js:1
4893 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:24
4893 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:24
4894 #: rhodecode/public/js/src/rhodecode/codemirror.js:745
4894 #: rhodecode/public/js/src/rhodecode/codemirror.js:745
4895 #: rhodecode/public/js/src/rhodecode/comments.js:284
4895 #: rhodecode/public/js/src/rhodecode/comments.js:282
4896 msgid "Comment text will be set automatically based on currently selected status ({0}) ..."
4896 msgid "Comment text will be set automatically based on currently selected status ({0}) ..."
4897 msgstr ""
4897 msgstr ""
4898
4898
4899 #: rhodecode/public/js/scripts.js:39695 rhodecode/public/js/scripts.js:40213
4899 #: rhodecode/public/js/scripts.js:39695 rhodecode/public/js/scripts.js:40211
4900 #: rhodecode/public/js/scripts.js:41745 rhodecode/public/js/scripts.min.js:1
4900 #: rhodecode/public/js/scripts.js:41883 rhodecode/public/js/scripts.min.js:1
4901 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:49
4901 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:49
4902 #: rhodecode/public/js/src/rhodecode/codemirror.js:826
4902 #: rhodecode/public/js/src/rhodecode/codemirror.js:826
4903 #: rhodecode/public/js/src/rhodecode/comments.js:493
4903 #: rhodecode/public/js/src/rhodecode/comments.js:491
4904 #: rhodecode/public/js/src/rhodecode/files.js:499
4904 #: rhodecode/public/js/src/rhodecode/files.js:499
4905 #: rhodecode/templates/files/files_browser_tree.mako:57
4905 #: rhodecode/templates/files/files_browser_tree.mako:57
4906 msgid "Loading ..."
4906 msgid "Loading ..."
4907 msgstr ""
4907 msgstr ""
4908
4908
4909 #: rhodecode/public/js/scripts.js:39860 rhodecode/public/js/scripts.min.js:1
4909 #: rhodecode/public/js/scripts.js:39859 rhodecode/public/js/scripts.min.js:1
4910 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:123
4910 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:123
4911 #: rhodecode/public/js/src/rhodecode/comments.js:140
4911 #: rhodecode/public/js/src/rhodecode/comments.js:139
4912 msgid "Update Comment"
4912 msgid "Update Comment"
4913 msgstr ""
4913 msgstr ""
4914
4914
4915 #: rhodecode/public/js/scripts.js:39884 rhodecode/public/js/scripts.min.js:1
4915 #: rhodecode/public/js/scripts.js:39883 rhodecode/public/js/scripts.min.js:1
4916 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:150
4916 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:150
4917 #: rhodecode/public/js/src/rhodecode/comments.js:164
4917 #: rhodecode/public/js/src/rhodecode/comments.js:163
4918 msgid "resolve comment"
4918 msgid "resolve comment"
4919 msgstr ""
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 #: rhodecode/public/js/scripts.js:40157 rhodecode/public/js/scripts.min.js:1
4927 #: rhodecode/public/js/scripts.js:40157 rhodecode/public/js/scripts.min.js:1
4922 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:83
4928 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:108
4923 #: rhodecode/public/js/src/rhodecode/comments.js:437
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 msgid "Submitting..."
4930 msgid "Submitting..."
4931 msgstr ""
4931 msgstr ""
4932
4932
4933 #: rhodecode/public/js/scripts.js:40481 rhodecode/public/js/scripts.min.js:1
4933 #: rhodecode/public/js/scripts.js:40479 rhodecode/public/js/scripts.min.js:1
4934 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:131
4934 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:131
4935 #: rhodecode/public/js/src/rhodecode/comments.js:761
4935 #: rhodecode/public/js/src/rhodecode/comments.js:759
4936 msgid "Yes, delete comment #{0}!"
4936 msgid "Yes, delete comment #{0}!"
4937 msgstr ""
4937 msgstr ""
4938
4938
4939 #: rhodecode/public/js/scripts.js:40526 rhodecode/public/js/scripts.min.js:1
4939 #: rhodecode/public/js/scripts.js:40524 rhodecode/public/js/scripts.min.js:1
4940 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:106
4940 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:106
4941 #: rhodecode/public/js/src/rhodecode/comments.js:806
4941 #: rhodecode/public/js/src/rhodecode/comments.js:804
4942 msgid "Submit {0} draft comment."
4942 msgid "Submit {0} draft comment."
4943 msgstr ""
4943 msgstr ""
4944
4944
4945 #: rhodecode/public/js/scripts.js:40529 rhodecode/public/js/scripts.min.js:1
4945 #: rhodecode/public/js/scripts.js:40527 rhodecode/public/js/scripts.js:41225
4946 #: rhodecode/public/js/scripts.min.js:1
4946 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:130
4947 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:130
4947 #: rhodecode/public/js/src/rhodecode/comments.js:809
4948 #: rhodecode/public/js/src/rhodecode/comments.js:807
4949 #: rhodecode/public/js/src/rhodecode/comments.js:1505
4948 msgid "Yes"
4950 msgid "Yes"
4949 msgstr ""
4951 msgstr ""
4950
4952
4951 #: rhodecode/public/js/scripts.js:40621 rhodecode/public/js/scripts.min.js:1
4953 #: rhodecode/public/js/scripts.js:40619 rhodecode/public/js/scripts.min.js:1
4952 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:47
4954 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:47
4953 #: rhodecode/public/js/src/rhodecode/comments.js:901
4955 #: rhodecode/public/js/src/rhodecode/comments.js:899
4954 msgid "Leave a resolution comment, or click resolve button to resolve TODO comment #{0}"
4956 msgid "Leave a resolution comment, or click resolve button to resolve TODO comment #{0}"
4955 msgstr ""
4957 msgstr ""
4956
4958
4957 #: rhodecode/public/js/scripts.js:40825 rhodecode/public/js/scripts.min.js:1
4959 #: rhodecode/public/js/scripts.js:40823 rhodecode/public/js/scripts.min.js:1
4958 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:23
4960 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:23
4959 #: rhodecode/public/js/src/rhodecode/comments.js:1105
4961 #: rhodecode/public/js/src/rhodecode/comments.js:1103
4960 msgid "Comment body was not changed."
4962 msgid "Comment body was not changed."
4961 msgstr ""
4963 msgstr ""
4962
4964
4963 #: rhodecode/public/js/scripts.js:41071 rhodecode/public/js/scripts.min.js:1
4965 #: rhodecode/public/js/scripts.js:41074 rhodecode/public/js/scripts.min.js:1
4964 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:44
4966 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:44
4965 #: rhodecode/public/js/src/rhodecode/comments.js:1351
4967 #: rhodecode/public/js/src/rhodecode/comments.js:1354
4966 msgid "Leave a comment on file {0} line {1}."
4968 msgid "Leave a comment on file {0} line {1}."
4967 msgstr ""
4969 msgstr ""
4968
4970
4969 #: rhodecode/public/js/scripts.js:41212 rhodecode/public/js/scripts.min.js:1
4971 #: rhodecode/public/js/scripts.js:41214 rhodecode/public/js/scripts.js:41267
4972 #: rhodecode/public/js/scripts.min.js:1
4970 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:113
4973 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:113
4971 #: rhodecode/public/js/src/rhodecode/comments.js:1492
4974 #: rhodecode/public/js/src/rhodecode/comments.js:1494
4975 #: rhodecode/public/js/src/rhodecode/comments.js:1547
4972 msgid "TODO from comment {0} was fixed."
4976 msgid "TODO from comment {0} was fixed."
4973 msgstr ""
4977 msgstr ""
4974
4978
4975 #: rhodecode/public/js/scripts.js:41494 rhodecode/public/js/scripts.min.js:1
4979 #: rhodecode/public/js/scripts.js:41632 rhodecode/public/js/scripts.min.js:1
4976 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:154
4980 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:154
4977 #: rhodecode/public/js/src/rhodecode/files.js:248
4981 #: rhodecode/public/js/src/rhodecode/files.js:248
4978 msgid "truncated result"
4982 msgid "truncated result"
4979 msgstr ""
4983 msgstr ""
4980
4984
4981 #: rhodecode/public/js/scripts.js:41496 rhodecode/public/js/scripts.min.js:1
4985 #: rhodecode/public/js/scripts.js:41634 rhodecode/public/js/scripts.min.js:1
4982 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:155
4986 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:155
4983 #: rhodecode/public/js/src/rhodecode/files.js:250
4987 #: rhodecode/public/js/src/rhodecode/files.js:250
4984 msgid "truncated results"
4988 msgid "truncated results"
4985 msgstr ""
4989 msgstr ""
4986
4990
4987 #: rhodecode/public/js/scripts.js:41505 rhodecode/public/js/scripts.min.js:1
4991 #: rhodecode/public/js/scripts.js:41643 rhodecode/public/js/scripts.min.js:1
4988 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:60
4992 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:60
4989 #: rhodecode/public/js/src/rhodecode/files.js:259
4993 #: rhodecode/public/js/src/rhodecode/files.js:259
4990 msgid "No matching files"
4994 msgid "No matching files"
4991 msgstr ""
4995 msgstr ""
4992
4996
4993 #: rhodecode/public/js/scripts.js:41563 rhodecode/public/js/scripts.min.js:1
4997 #: rhodecode/public/js/scripts.js:41701 rhodecode/public/js/scripts.min.js:1
4994 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:86
4998 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:86
4995 #: rhodecode/public/js/src/rhodecode/files.js:317
4999 #: rhodecode/public/js/src/rhodecode/files.js:317
4996 msgid "Selection link"
5000 msgid "Selection link"
4997 msgstr ""
5001 msgstr ""
4998
5002
4999 #: rhodecode/public/js/scripts.js:41660 rhodecode/public/js/scripts.min.js:1
5003 #: rhodecode/public/js/scripts.js:41798 rhodecode/public/js/scripts.min.js:1
5000 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:10
5004 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:10
5001 #: rhodecode/public/js/src/rhodecode/files.js:414
5005 #: rhodecode/public/js/src/rhodecode/files.js:414
5002 msgid "All Authors"
5006 msgid "All Authors"
5003 msgstr ""
5007 msgstr ""
5004
5008
5005 #: rhodecode/public/js/scripts.js:41810 rhodecode/public/js/scripts.js:41813
5009 #: rhodecode/public/js/scripts.js:41948 rhodecode/public/js/scripts.js:41951
5006 #: rhodecode/public/js/scripts.min.js:1
5010 #: rhodecode/public/js/scripts.min.js:1
5007 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:38
5011 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:38
5008 #: rhodecode/public/js/src/rhodecode/files.js:564
5012 #: rhodecode/public/js/src/rhodecode/files.js:564
@@ -5010,141 +5014,141 b' msgstr ""'
5010 msgid "File `{0}` has a newer version available, or has been removed. Click {1} to see the latest version."
5014 msgid "File `{0}` has a newer version available, or has been removed. Click {1} to see the latest version."
5011 msgstr ""
5015 msgstr ""
5012
5016
5013 #: rhodecode/public/js/scripts.js:41816 rhodecode/public/js/scripts.min.js:1
5017 #: rhodecode/public/js/scripts.js:41954 rhodecode/public/js/scripts.min.js:1
5014 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:117
5018 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:117
5015 #: rhodecode/public/js/src/rhodecode/files.js:570
5019 #: rhodecode/public/js/src/rhodecode/files.js:570
5016 msgid "There is an existing path `{0}` at this commit."
5020 msgid "There is an existing path `{0}` at this commit."
5017 msgstr ""
5021 msgstr ""
5018
5022
5019 #: rhodecode/public/js/scripts.js:41819 rhodecode/public/js/scripts.min.js:1
5023 #: rhodecode/public/js/scripts.js:41957 rhodecode/public/js/scripts.min.js:1
5020 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:116
5024 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:116
5021 #: rhodecode/public/js/src/rhodecode/files.js:573
5025 #: rhodecode/public/js/src/rhodecode/files.js:573
5022 msgid "There is a later version of file tree available. Click {0} to create a file at the latest tree."
5026 msgid "There is a later version of file tree available. Click {0} to create a file at the latest tree."
5023 msgstr ""
5027 msgstr ""
5024
5028
5025 #: rhodecode/public/js/scripts.js:41873 rhodecode/public/js/scripts.min.js:1
5029 #: rhodecode/public/js/scripts.js:42011 rhodecode/public/js/scripts.min.js:1
5026 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:105
5030 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:105
5027 #: rhodecode/public/js/src/rhodecode/followers.js:26
5031 #: rhodecode/public/js/src/rhodecode/followers.js:26
5028 msgid "Stopped watching this repository"
5032 msgid "Stopped watching this repository"
5029 msgstr ""
5033 msgstr ""
5030
5034
5031 #: rhodecode/public/js/scripts.js:41874 rhodecode/public/js/scripts.min.js:1
5035 #: rhodecode/public/js/scripts.js:42012 rhodecode/public/js/scripts.min.js:1
5032 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:129
5036 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:129
5033 #: rhodecode/public/js/src/rhodecode/followers.js:27
5037 #: rhodecode/public/js/src/rhodecode/followers.js:27
5034 #: rhodecode/templates/base/base.mako:310
5038 #: rhodecode/templates/base/base.mako:311
5035 msgid "Watch"
5039 msgid "Watch"
5036 msgstr ""
5040 msgstr ""
5037
5041
5038 #: rhodecode/public/js/scripts.js:41877 rhodecode/public/js/scripts.min.js:1
5042 #: rhodecode/public/js/scripts.js:42015 rhodecode/public/js/scripts.min.js:1
5039 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:102
5043 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:102
5040 #: rhodecode/public/js/src/rhodecode/followers.js:30
5044 #: rhodecode/public/js/src/rhodecode/followers.js:30
5041 msgid "Started watching this repository"
5045 msgid "Started watching this repository"
5042 msgstr ""
5046 msgstr ""
5043
5047
5044 #: rhodecode/public/js/scripts.js:41878 rhodecode/public/js/scripts.min.js:1
5048 #: rhodecode/public/js/scripts.js:42016 rhodecode/public/js/scripts.min.js:1
5045 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:122
5049 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:122
5046 #: rhodecode/public/js/src/rhodecode/followers.js:31
5050 #: rhodecode/public/js/src/rhodecode/followers.js:31
5047 #: rhodecode/templates/base/base.mako:308
5051 #: rhodecode/templates/base/base.mako:309
5048 msgid "Unwatch"
5052 msgid "Unwatch"
5049 msgstr ""
5053 msgstr ""
5050
5054
5051 #: rhodecode/public/js/scripts.js:42384 rhodecode/public/js/scripts.min.js:1
5055 #: rhodecode/public/js/scripts.js:42522 rhodecode/public/js/scripts.min.js:1
5052 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:12
5056 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:12
5053 #: rhodecode/public/js/src/rhodecode/pullrequests.js:185
5057 #: rhodecode/public/js/src/rhodecode/pullrequests.js:185
5054 msgid "All reviewers must vote."
5058 msgid "All reviewers must vote."
5055 msgstr ""
5059 msgstr ""
5056
5060
5057 #: rhodecode/public/js/scripts.js:42408 rhodecode/public/js/scripts.min.js:1
5061 #: rhodecode/public/js/scripts.js:42546 rhodecode/public/js/scripts.min.js:1
5058 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:54
5062 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:54
5059 #: rhodecode/public/js/src/rhodecode/pullrequests.js:209
5063 #: rhodecode/public/js/src/rhodecode/pullrequests.js:209
5060 msgid "No additional review rules set."
5064 msgid "No additional review rules set."
5061 msgstr ""
5065 msgstr ""
5062
5066
5063 #: rhodecode/public/js/scripts.js:42454 rhodecode/public/js/scripts.min.js:1
5067 #: rhodecode/public/js/scripts.js:42592 rhodecode/public/js/scripts.min.js:1
5064 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:50
5068 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:50
5065 #: rhodecode/public/js/src/rhodecode/pullrequests.js:255
5069 #: rhodecode/public/js/src/rhodecode/pullrequests.js:255
5066 msgid "Loading diff ..."
5070 msgid "Loading diff ..."
5067 msgstr ""
5071 msgstr ""
5068
5072
5069 #: rhodecode/public/js/scripts.js:42507 rhodecode/public/js/scripts.min.js:1
5073 #: rhodecode/public/js/scripts.js:42645 rhodecode/public/js/scripts.min.js:1
5070 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:115
5074 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:115
5071 #: rhodecode/public/js/src/rhodecode/pullrequests.js:308
5075 #: rhodecode/public/js/src/rhodecode/pullrequests.js:308
5072 msgid "There are no commits to merge."
5076 msgid "There are no commits to merge."
5073 msgstr ""
5077 msgstr ""
5074
5078
5075 #: rhodecode/public/js/scripts.js:42579 rhodecode/public/js/scripts.min.js:1
5079 #: rhodecode/public/js/scripts.js:42717 rhodecode/public/js/scripts.min.js:1
5076 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:128
5080 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:128
5077 #: rhodecode/public/js/src/rhodecode/pullrequests.js:380
5081 #: rhodecode/public/js/src/rhodecode/pullrequests.js:380
5078 msgid "User `{0}` not allowed to be a reviewer"
5082 msgid "User `{0}` not allowed to be a reviewer"
5079 msgstr ""
5083 msgstr ""
5080
5084
5081 #: rhodecode/public/js/scripts.js:42585 rhodecode/public/js/scripts.min.js:1
5085 #: rhodecode/public/js/scripts.js:42723 rhodecode/public/js/scripts.min.js:1
5082 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:127
5086 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:127
5083 #: rhodecode/public/js/src/rhodecode/pullrequests.js:386
5087 #: rhodecode/public/js/src/rhodecode/pullrequests.js:386
5084 msgid "User `{0}` already in reviewers/observers"
5088 msgid "User `{0}` already in reviewers/observers"
5085 msgstr ""
5089 msgstr ""
5086
5090
5087 #: rhodecode/public/js/scripts.js:42699 rhodecode/public/js/scripts.min.js:1
5091 #: rhodecode/public/js/scripts.js:42838 rhodecode/public/js/scripts.min.js:1
5088 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:135
5092 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:135
5089 #: rhodecode/public/js/src/rhodecode/pullrequests.js:501
5093 #: rhodecode/public/js/src/rhodecode/pullrequests.js:501
5090 msgid "added manually by \"{0}\""
5094 msgid "added manually by \"{0}\""
5091 msgstr ""
5095 msgstr ""
5092
5096
5093 #: rhodecode/public/js/scripts.js:42704 rhodecode/public/js/scripts.min.js:1
5097 #: rhodecode/public/js/scripts.js:42843 rhodecode/public/js/scripts.min.js:1
5094 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:147
5098 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:147
5095 #: rhodecode/public/js/src/rhodecode/pullrequests.js:506
5099 #: rhodecode/public/js/src/rhodecode/pullrequests.js:506
5096 msgid "member of \"{0}\""
5100 msgid "member of \"{0}\""
5097 msgstr ""
5101 msgstr ""
5098
5102
5099 #: rhodecode/public/js/scripts.js:42937 rhodecode/public/js/scripts.min.js:1
5103 #: rhodecode/public/js/scripts.js:43076 rhodecode/public/js/scripts.min.js:1
5100 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:125
5104 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:125
5101 #: rhodecode/public/js/src/rhodecode/pullrequests.js:739
5105 #: rhodecode/public/js/src/rhodecode/pullrequests.js:739
5102 msgid "Updating..."
5106 msgid "Updating..."
5103 msgstr ""
5107 msgstr ""
5104
5108
5105 #: rhodecode/public/js/scripts.js:42947 rhodecode/public/js/scripts.min.js:1
5109 #: rhodecode/public/js/scripts.js:43086 rhodecode/public/js/scripts.min.js:1
5106 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:40
5110 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:40
5107 #: rhodecode/public/js/src/rhodecode/pullrequests.js:749
5111 #: rhodecode/public/js/src/rhodecode/pullrequests.js:749
5108 msgid "Force updating..."
5112 msgid "Force updating..."
5109 msgstr ""
5113 msgstr ""
5110
5114
5111 #: rhodecode/public/js/scripts.js:47812 rhodecode/public/js/scripts.min.js:1
5115 #: rhodecode/public/js/scripts.js:47953 rhodecode/public/js/scripts.min.js:1
5112 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:98
5116 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:98
5113 #: rhodecode/public/js/src/rhodecode/users.js:54
5117 #: rhodecode/public/js/src/rhodecode/users.js:54
5114 msgid "Show this authentication token?"
5118 msgid "Show this authentication token?"
5115 msgstr ""
5119 msgstr ""
5116
5120
5117 #: rhodecode/public/js/scripts.js:47814 rhodecode/public/js/scripts.min.js:1
5121 #: rhodecode/public/js/scripts.js:47955 rhodecode/public/js/scripts.min.js:1
5118 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:90
5122 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:90
5119 #: rhodecode/public/js/src/rhodecode/users.js:56
5123 #: rhodecode/public/js/src/rhodecode/users.js:56
5120 msgid "Show"
5124 msgid "Show"
5121 msgstr ""
5125 msgstr ""
5122
5126
5123 #: rhodecode/public/js/scripts.js:47850 rhodecode/public/js/scripts.min.js:1
5127 #: rhodecode/public/js/scripts.js:47991 rhodecode/public/js/scripts.min.js:1
5124 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:16
5128 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:16
5125 #: rhodecode/public/js/src/rhodecode/users.js:92
5129 #: rhodecode/public/js/src/rhodecode/users.js:92
5126 msgid "Authentication Token"
5130 msgid "Authentication Token"
5127 msgstr ""
5131 msgstr ""
5128
5132
5129 #: rhodecode/public/js/scripts.js:48039 rhodecode/public/js/scripts.min.js:1
5133 #: rhodecode/public/js/scripts.js:48180 rhodecode/public/js/scripts.min.js:1
5130 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:139
5134 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:139
5131 #: rhodecode/public/js/src/rhodecode.js:144
5135 #: rhodecode/public/js/src/rhodecode.js:144
5132 msgid "file"
5136 msgid "file"
5133 msgstr ""
5137 msgstr ""
5134
5138
5135 #: rhodecode/public/js/scripts.js:48183 rhodecode/public/js/scripts.min.js:1
5139 #: rhodecode/public/js/scripts.js:48324 rhodecode/public/js/scripts.min.js:1
5136 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:53
5140 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:53
5137 #: rhodecode/public/js/src/rhodecode.js:288
5141 #: rhodecode/public/js/src/rhodecode.js:288
5138 msgid "Loading..."
5142 msgid "Loading..."
5139 msgstr ""
5143 msgstr ""
5140
5144
5141 #: rhodecode/public/js/scripts.js:48565 rhodecode/public/js/scripts.min.js:1
5145 #: rhodecode/public/js/scripts.js:48706 rhodecode/public/js/scripts.min.js:1
5142 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:136
5146 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:136
5143 #: rhodecode/public/js/src/rhodecode.js:670
5147 #: rhodecode/public/js/src/rhodecode.js:670
5144 msgid "date not in future"
5148 msgid "date not in future"
5145 msgstr ""
5149 msgstr ""
5146
5150
5147 #: rhodecode/public/js/scripts.js:48573 rhodecode/public/js/scripts.min.js:1
5151 #: rhodecode/public/js/scripts.js:48714 rhodecode/public/js/scripts.min.js:1
5148 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:100
5152 #: rhodecode/public/js/rhodecode/i18n/js_translations.js:100
5149 #: rhodecode/public/js/src/rhodecode.js:678
5153 #: rhodecode/public/js/src/rhodecode.js:678
5150 msgid "Specified expiration date"
5154 msgid "Specified expiration date"
@@ -5737,8 +5741,8 b' msgid "%s Repository group dashboard"'
5737 msgstr ""
5741 msgstr ""
5738
5742
5739 #: rhodecode/templates/index_repo_group.mako:13
5743 #: rhodecode/templates/index_repo_group.mako:13
5740 #: rhodecode/templates/base/base.mako:810
5741 #: rhodecode/templates/base/base.mako:811
5744 #: rhodecode/templates/base/base.mako:811
5745 #: rhodecode/templates/base/base.mako:812
5742 msgid "Home"
5746 msgid "Home"
5743 msgstr ""
5747 msgstr ""
5744
5748
@@ -5933,9 +5937,9 b' msgstr ""'
5933 #: rhodecode/templates/admin/admin_log_base.mako:10
5937 #: rhodecode/templates/admin/admin_log_base.mako:10
5934 #: rhodecode/templates/admin/defaults/defaults.mako:32
5938 #: rhodecode/templates/admin/defaults/defaults.mako:32
5935 #: rhodecode/templates/admin/permissions/permissions_objects.mako:16
5939 #: rhodecode/templates/admin/permissions/permissions_objects.mako:16
5936 #: rhodecode/templates/base/base.mako:658
5940 #: rhodecode/templates/base/base.mako:659
5937 #: rhodecode/templates/base/base.mako:660
5941 #: rhodecode/templates/base/base.mako:661
5938 #: rhodecode/templates/base/base.mako:662
5942 #: rhodecode/templates/base/base.mako:663
5939 #: rhodecode/templates/search/search_commit.mako:8
5943 #: rhodecode/templates/search/search_commit.mako:8
5940 #: rhodecode/templates/search/search_path.mako:7
5944 #: rhodecode/templates/search/search_path.mako:7
5941 msgid "Repository"
5945 msgid "Repository"
@@ -6261,7 +6265,7 b' msgid "Expires"'
6261 msgstr ""
6265 msgstr ""
6262
6266
6263 #: rhodecode/templates/admin/gists/gist_new.mako:5
6267 #: rhodecode/templates/admin/gists/gist_new.mako:5
6264 #: rhodecode/templates/base/base.mako:577
6268 #: rhodecode/templates/base/base.mako:578
6265 msgid "New Gist"
6269 msgid "New Gist"
6266 msgstr ""
6270 msgstr ""
6267
6271
@@ -6353,7 +6357,7 b' msgstr ""'
6353 #: rhodecode/templates/admin/integrations/new.mako:15
6357 #: rhodecode/templates/admin/integrations/new.mako:15
6354 #: rhodecode/templates/admin/repo_groups/repo_group_edit.mako:33
6358 #: rhodecode/templates/admin/repo_groups/repo_group_edit.mako:33
6355 #: rhodecode/templates/admin/repos/repo_edit.mako:74
6359 #: rhodecode/templates/admin/repos/repo_edit.mako:74
6356 #: rhodecode/templates/base/base.mako:120
6360 #: rhodecode/templates/base/base.mako:121
6357 msgid "Integrations"
6361 msgid "Integrations"
6358 msgstr ""
6362 msgstr ""
6359
6363
@@ -6368,7 +6372,7 b' msgstr ""'
6368 #: rhodecode/templates/admin/settings/settings.mako:14
6372 #: rhodecode/templates/admin/settings/settings.mako:14
6369 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:34
6373 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:34
6370 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:9
6374 #: rhodecode/templates/admin/user_groups/user_group_edit_settings.mako:9
6371 #: rhodecode/templates/base/base.mako:122
6375 #: rhodecode/templates/base/base.mako:123
6372 msgid "Settings"
6376 msgid "Settings"
6373 msgstr ""
6377 msgstr ""
6374
6378
@@ -6469,7 +6473,7 b' msgid "No description available"'
6469 msgstr ""
6473 msgstr ""
6470
6474
6471 #: rhodecode/templates/admin/my_account/my_account.mako:5
6475 #: rhodecode/templates/admin/my_account/my_account.mako:5
6472 #: rhodecode/templates/base/base.mako:622
6476 #: rhodecode/templates/base/base.mako:623
6473 msgid "My account"
6477 msgid "My account"
6474 msgstr ""
6478 msgstr ""
6475
6479
@@ -6520,15 +6524,15 b' msgstr ""'
6520
6524
6521 #: rhodecode/templates/admin/my_account/my_account.mako:45
6525 #: rhodecode/templates/admin/my_account/my_account.mako:45
6522 #: rhodecode/templates/admin/notifications/notifications_show_all.mako:42
6526 #: rhodecode/templates/admin/notifications/notifications_show_all.mako:42
6523 #: rhodecode/templates/base/base.mako:385
6527 #: rhodecode/templates/base/base.mako:386
6524 #: rhodecode/templates/base/base.mako:626
6528 #: rhodecode/templates/base/base.mako:627
6525 msgid "Pull Requests"
6529 msgid "Pull Requests"
6526 msgstr ""
6530 msgstr ""
6527
6531
6528 #: rhodecode/templates/admin/my_account/my_account.mako:46
6532 #: rhodecode/templates/admin/my_account/my_account.mako:46
6529 #: rhodecode/templates/admin/permissions/permissions.mako:14
6533 #: rhodecode/templates/admin/permissions/permissions.mako:14
6530 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:35
6534 #: rhodecode/templates/admin/user_groups/user_group_edit.mako:35
6531 #: rhodecode/templates/base/base.mako:118
6535 #: rhodecode/templates/base/base.mako:119
6532 msgid "Permissions"
6536 msgid "Permissions"
6533 msgstr ""
6537 msgstr ""
6534
6538
@@ -7047,7 +7051,7 b' msgstr ""'
7047 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:14
7051 #: rhodecode/templates/admin/repo_groups/repo_group_add.mako:14
7048 #: rhodecode/templates/admin/users/user_edit_advanced.mako:13
7052 #: rhodecode/templates/admin/users/user_edit_advanced.mako:13
7049 #: rhodecode/templates/base/base.mako:115
7053 #: rhodecode/templates/base/base.mako:115
7050 #: rhodecode/templates/base/base.mako:136
7054 #: rhodecode/templates/base/base.mako:137
7051 msgid "Repository groups"
7055 msgid "Repository groups"
7052 msgstr ""
7056 msgstr ""
7053
7057
@@ -7062,7 +7066,7 b' msgstr ""'
7062 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.mako:25
7066 #: rhodecode/templates/admin/repo_groups/repo_group_edit_settings.mako:25
7063 #: rhodecode/templates/admin/repos/repo_add_base.mako:43
7067 #: rhodecode/templates/admin/repos/repo_add_base.mako:43
7064 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:33
7068 #: rhodecode/templates/admin/repos/repo_edit_settings.mako:33
7065 #: rhodecode/templates/base/base.mako:671
7069 #: rhodecode/templates/base/base.mako:672
7066 #: rhodecode/templates/data_table/_dt_elements.mako:217
7070 #: rhodecode/templates/data_table/_dt_elements.mako:217
7067 #: rhodecode/templates/forks/fork.mako:41
7071 #: rhodecode/templates/forks/fork.mako:41
7068 msgid "Repository group"
7072 msgid "Repository group"
@@ -7312,7 +7316,7 b' msgid "Import Existing Repository ?"'
7312 msgstr ""
7316 msgstr ""
7313
7317
7314 #: rhodecode/templates/admin/repos/repo_add_base.mako:23
7318 #: rhodecode/templates/admin/repos/repo_add_base.mako:23
7315 #: rhodecode/templates/base/base.mako:332
7319 #: rhodecode/templates/base/base.mako:333
7316 msgid "Clone from"
7320 msgid "Clone from"
7317 msgstr ""
7321 msgstr ""
7318
7322
@@ -8024,7 +8028,7 b' msgstr ""'
8024 #: rhodecode/templates/admin/settings/settings_global.mako:140
8028 #: rhodecode/templates/admin/settings/settings_global.mako:140
8025 #: rhodecode/templates/admin/settings/settings_labs.mako:48
8029 #: rhodecode/templates/admin/settings/settings_labs.mako:48
8026 #: rhodecode/templates/admin/settings/settings_vcs.mako:13
8030 #: rhodecode/templates/admin/settings/settings_vcs.mako:13
8027 #: rhodecode/templates/admin/settings/settings_visual.mako:214
8031 #: rhodecode/templates/admin/settings/settings_visual.mako:217
8028 msgid "Save settings"
8032 msgid "Save settings"
8029 msgstr ""
8033 msgstr ""
8030
8034
@@ -8550,7 +8554,7 b' msgstr ""'
8550 msgid "Clone URL templates"
8554 msgid "Clone URL templates"
8551 msgstr ""
8555 msgstr ""
8552
8556
8553 #: rhodecode/templates/admin/settings/settings_visual.mako:181
8557 #: rhodecode/templates/admin/settings/settings_visual.mako:184
8554 msgid ""
8558 msgid ""
8555 "Schema of clone url construction eg. '{scheme}://{user}@{netloc}/{repo}', available vars:\n"
8559 "Schema of clone url construction eg. '{scheme}://{user}@{netloc}/{repo}', available vars:\n"
8556 " {scheme} 'http' or 'https' sent from running RhodeCode server,\n"
8560 " {scheme} 'http' or 'https' sent from running RhodeCode server,\n"
@@ -8562,11 +8566,11 b' msgid ""'
8562 " {repoid} ID of repository, can be used to contruct clone-by-id"
8566 " {repoid} ID of repository, can be used to contruct clone-by-id"
8563 msgstr ""
8567 msgstr ""
8564
8568
8565 #: rhodecode/templates/admin/settings/settings_visual.mako:196
8569 #: rhodecode/templates/admin/settings/settings_visual.mako:199
8566 msgid "Custom Support Link"
8570 msgid "Custom Support Link"
8567 msgstr ""
8571 msgstr ""
8568
8572
8569 #: rhodecode/templates/admin/settings/settings_visual.mako:204
8573 #: rhodecode/templates/admin/settings/settings_visual.mako:207
8570 #, python-format
8574 #, python-format
8571 msgid ""
8575 msgid ""
8572 "Custom url for the support link located at the bottom.\n"
8576 "Custom url for the support link located at the bottom.\n"
@@ -8582,7 +8586,7 b' msgstr ""'
8582 #: rhodecode/templates/admin/user_groups/user_group_add.mako:13
8586 #: rhodecode/templates/admin/user_groups/user_group_add.mako:13
8583 #: rhodecode/templates/admin/users/user_edit_advanced.mako:14
8587 #: rhodecode/templates/admin/users/user_edit_advanced.mako:14
8584 #: rhodecode/templates/base/base.mako:117
8588 #: rhodecode/templates/base/base.mako:117
8585 #: rhodecode/templates/base/base.mako:139
8589 #: rhodecode/templates/base/base.mako:140
8586 msgid "User groups"
8590 msgid "User groups"
8587 msgstr ""
8591 msgstr ""
8588
8592
@@ -9090,16 +9094,21 b' msgstr ""'
9090 msgid "Delegated Admin Panel"
9094 msgid "Delegated Admin Panel"
9091 msgstr ""
9095 msgstr ""
9092
9096
9093 #: rhodecode/templates/base/base.mako:119
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 msgid "Authentication"
9103 msgid "Authentication"
9095 msgstr ""
9104 msgstr ""
9096
9105
9097 #: rhodecode/templates/base/base.mako:121
9106 #: rhodecode/templates/base/base.mako:122
9098 msgid "Defaults"
9107 msgid "Defaults"
9099 msgstr ""
9108 msgstr ""
9100
9109
9101 #: rhodecode/templates/base/base.mako:161
9110 #: rhodecode/templates/base/base.mako:162
9102 #: rhodecode/templates/base/base.mako:201
9111 #: rhodecode/templates/base/base.mako:202
9103 #: rhodecode/templates/changeset/changeset.mako:140
9112 #: rhodecode/templates/changeset/changeset.mako:140
9104 #: rhodecode/templates/files/files_source_header.mako:57
9113 #: rhodecode/templates/files/files_source_header.mako:57
9105 #: rhodecode/templates/files/files_tree_header.mako:44
9114 #: rhodecode/templates/files/files_tree_header.mako:44
@@ -9107,40 +9116,40 b' msgstr ""'
9107 msgid "Show More"
9116 msgid "Show More"
9108 msgstr ""
9117 msgstr ""
9109
9118
9110 #: rhodecode/templates/base/base.mako:304
9119 #: rhodecode/templates/base/base.mako:305
9111 #: rhodecode/templates/base/base.mako:315
9120 #: rhodecode/templates/base/base.mako:316
9112 msgid "RSS Feed"
9121 msgid "RSS Feed"
9113 msgstr ""
9122 msgstr ""
9114
9123
9115 #: rhodecode/templates/base/base.mako:306
9124 #: rhodecode/templates/base/base.mako:307
9116 msgid "Watch this Repository and actions on it in your personalized journal"
9125 msgid "Watch this Repository and actions on it in your personalized journal"
9117 msgstr ""
9126 msgstr ""
9118
9127
9119 #: rhodecode/templates/base/base.mako:324
9128 #: rhodecode/templates/base/base.mako:325
9120 msgid "Fork of"
9129 msgid "Fork of"
9121 msgstr ""
9130 msgstr ""
9122
9131
9123 #: rhodecode/templates/base/base.mako:341
9132 #: rhodecode/templates/base/base.mako:342
9124 #, python-format
9133 #, python-format
9125 msgid "Repository locked by %(user)s"
9134 msgid "Repository locked by %(user)s"
9126 msgstr ""
9135 msgstr ""
9127
9136
9128 #: rhodecode/templates/base/base.mako:346
9137 #: rhodecode/templates/base/base.mako:347
9129 msgid "Repository not locked. Pull repository to lock it."
9138 msgid "Repository not locked. Pull repository to lock it."
9130 msgstr ""
9139 msgstr ""
9131
9140
9132 #: rhodecode/templates/base/base.mako:362
9141 #: rhodecode/templates/base/base.mako:363
9133 msgid "This repository has been archived. It is now read-only."
9142 msgid "This repository has been archived. It is now read-only."
9134 msgstr ""
9143 msgstr ""
9135
9144
9136 #: rhodecode/templates/base/base.mako:375
9145 #: rhodecode/templates/base/base.mako:376
9137 #: rhodecode/templates/data_table/_dt_elements.mako:58
9146 #: rhodecode/templates/data_table/_dt_elements.mako:58
9138 #: rhodecode/templates/data_table/_dt_elements.mako:59
9147 #: rhodecode/templates/data_table/_dt_elements.mako:59
9139 #: rhodecode/templates/data_table/_dt_elements.mako:207
9148 #: rhodecode/templates/data_table/_dt_elements.mako:207
9140 msgid "Summary"
9149 msgid "Summary"
9141 msgstr ""
9150 msgstr ""
9142
9151
9143 #: rhodecode/templates/base/base.mako:376
9152 #: rhodecode/templates/base/base.mako:377
9144 #: rhodecode/templates/data_table/_dt_elements.mako:63
9153 #: rhodecode/templates/data_table/_dt_elements.mako:63
9145 #: rhodecode/templates/data_table/_dt_elements.mako:64
9154 #: rhodecode/templates/data_table/_dt_elements.mako:64
9146 #: rhodecode/templates/files/file_authors_box.mako:30
9155 #: rhodecode/templates/files/file_authors_box.mako:30
@@ -9150,7 +9159,7 b' msgstr ""'
9150 msgid "Commits"
9159 msgid "Commits"
9151 msgstr ""
9160 msgstr ""
9152
9161
9153 #: rhodecode/templates/base/base.mako:377
9162 #: rhodecode/templates/base/base.mako:378
9154 #: rhodecode/templates/data_table/_dt_elements.mako:68
9163 #: rhodecode/templates/data_table/_dt_elements.mako:68
9155 #: rhodecode/templates/data_table/_dt_elements.mako:69
9164 #: rhodecode/templates/data_table/_dt_elements.mako:69
9156 #: rhodecode/templates/files/files.mako:15
9165 #: rhodecode/templates/files/files.mako:15
@@ -9158,87 +9167,83 b' msgstr ""'
9158 msgid "Files"
9167 msgid "Files"
9159 msgstr ""
9168 msgstr ""
9160
9169
9161 #: rhodecode/templates/base/base.mako:378
9170 #: rhodecode/templates/base/base.mako:379
9162 #: rhodecode/templates/bookmarks/bookmarks.mako:78
9171 #: rhodecode/templates/bookmarks/bookmarks.mako:78
9163 #: rhodecode/templates/branches/branches.mako:77
9172 #: rhodecode/templates/branches/branches.mako:77
9164 #: rhodecode/templates/tags/tags.mako:78
9173 #: rhodecode/templates/tags/tags.mako:78
9165 msgid "Compare"
9174 msgid "Compare"
9166 msgstr ""
9175 msgstr ""
9167
9176
9168 #: rhodecode/templates/base/base.mako:383
9177 #: rhodecode/templates/base/base.mako:384
9169 #, python-format
9178 #, python-format
9170 msgid "Show Pull Requests for %s"
9179 msgid "Show Pull Requests for %s"
9171 msgstr ""
9180 msgstr ""
9172
9181
9173 #: rhodecode/templates/base/base.mako:394
9182 #: rhodecode/templates/base/base.mako:401
9174 msgid "Artifacts"
9175 msgstr ""
9176
9177 #: rhodecode/templates/base/base.mako:400
9178 msgid "Repository Settings"
9183 msgid "Repository Settings"
9179 msgstr ""
9184 msgstr ""
9180
9185
9181 #: rhodecode/templates/base/base.mako:406
9186 #: rhodecode/templates/base/base.mako:407
9182 msgid "Options"
9187 msgid "Options"
9183 msgstr ""
9188 msgstr ""
9184
9189
9185 #: rhodecode/templates/base/base.mako:411
9190 #: rhodecode/templates/base/base.mako:412
9186 msgid "Unlock Repository"
9191 msgid "Unlock Repository"
9187 msgstr ""
9192 msgstr ""
9188
9193
9189 #: rhodecode/templates/base/base.mako:413
9194 #: rhodecode/templates/base/base.mako:414
9190 msgid "Lock Repository"
9195 msgid "Lock Repository"
9191 msgstr ""
9196 msgstr ""
9192
9197
9193 #: rhodecode/templates/base/base.mako:466
9198 #: rhodecode/templates/base/base.mako:467
9194 msgid "Group Home"
9199 msgid "Group Home"
9195 msgstr ""
9200 msgstr ""
9196
9201
9197 #: rhodecode/templates/base/base.mako:470
9202 #: rhodecode/templates/base/base.mako:471
9198 msgid "You have admin right to this group, and can edit it"
9203 msgid "You have admin right to this group, and can edit it"
9199 msgstr ""
9204 msgstr ""
9200
9205
9201 #: rhodecode/templates/base/base.mako:470
9206 #: rhodecode/templates/base/base.mako:471
9202 msgid "Group Settings"
9207 msgid "Group Settings"
9203 msgstr ""
9208 msgstr ""
9204
9209
9205 #: rhodecode/templates/base/base.mako:521
9210 #: rhodecode/templates/base/base.mako:522
9206 msgid "This Repository"
9211 msgid "This Repository"
9207 msgstr ""
9212 msgstr ""
9208
9213
9209 #: rhodecode/templates/base/base.mako:523
9214 #: rhodecode/templates/base/base.mako:524
9210 msgid "Create Pull Request"
9215 msgid "Create Pull Request"
9211 msgstr ""
9216 msgstr ""
9212
9217
9213 #: rhodecode/templates/base/base.mako:527
9218 #: rhodecode/templates/base/base.mako:528
9214 msgid "Fork this repository"
9219 msgid "Fork this repository"
9215 msgstr ""
9220 msgstr ""
9216
9221
9217 #: rhodecode/templates/base/base.mako:534
9222 #: rhodecode/templates/base/base.mako:535
9218 msgid "This Repository Group"
9223 msgid "This Repository Group"
9219 msgstr ""
9224 msgstr ""
9220
9225
9221 #: rhodecode/templates/base/base.mako:538
9226 #: rhodecode/templates/base/base.mako:539
9222 #: rhodecode/templates/base/base.mako:554
9227 #: rhodecode/templates/base/base.mako:555
9223 #: rhodecode/templates/base/base.mako:566
9228 #: rhodecode/templates/base/base.mako:567
9224 msgid "New Repository"
9229 msgid "New Repository"
9225 msgstr ""
9230 msgstr ""
9226
9231
9227 #: rhodecode/templates/base/base.mako:544
9232 #: rhodecode/templates/base/base.mako:545
9228 #: rhodecode/templates/base/base.mako:558
9233 #: rhodecode/templates/base/base.mako:559
9229 #: rhodecode/templates/base/base.mako:572
9234 #: rhodecode/templates/base/base.mako:573
9230 msgid "New Repository Group"
9235 msgid "New Repository Group"
9231 msgstr ""
9236 msgstr ""
9232
9237
9233 #: rhodecode/templates/base/base.mako:599
9238 #: rhodecode/templates/base/base.mako:600
9234 msgid "Sign in"
9239 msgid "Sign in"
9235 msgstr ""
9240 msgstr ""
9236
9241
9237 #: rhodecode/templates/base/base.mako:624
9242 #: rhodecode/templates/base/base.mako:625
9238 msgid "My personal group"
9243 msgid "My personal group"
9239 msgstr ""
9244 msgstr ""
9240
9245
9241 #: rhodecode/templates/base/base.mako:630
9246 #: rhodecode/templates/base/base.mako:631
9242 #: rhodecode/templates/debug_style/alerts.html:5
9247 #: rhodecode/templates/debug_style/alerts.html:5
9243 #: rhodecode/templates/debug_style/buttons.html:5
9248 #: rhodecode/templates/debug_style/buttons.html:5
9244 #: rhodecode/templates/debug_style/code-block.html:6
9249 #: rhodecode/templates/debug_style/code-block.html:6
@@ -9261,62 +9266,62 b' msgstr ""'
9261 msgid "Style"
9266 msgid "Style"
9262 msgstr ""
9267 msgstr ""
9263
9268
9264 #: rhodecode/templates/base/base.mako:631
9269 #: rhodecode/templates/base/base.mako:632
9265 msgid "[Style]"
9270 msgid "[Style]"
9266 msgstr ""
9271 msgstr ""
9267
9272
9268 #: rhodecode/templates/base/base.mako:648
9273 #: rhodecode/templates/base/base.mako:649
9269 msgid "No Bookmarks yet."
9274 msgid "No Bookmarks yet."
9270 msgstr ""
9275 msgstr ""
9271
9276
9272 #: rhodecode/templates/base/base.mako:686
9277 #: rhodecode/templates/base/base.mako:687
9273 msgid "Sign Out"
9278 msgid "Sign Out"
9274 msgstr ""
9279 msgstr ""
9275
9280
9276 #: rhodecode/templates/base/base.mako:731
9281 #: rhodecode/templates/base/base.mako:732
9277 #: rhodecode/templates/changeset/changeset_file_comment.mako:538
9282 #: rhodecode/templates/changeset/changeset_file_comment.mako:538
9278 msgid "dismiss"
9283 msgid "dismiss"
9279 msgstr ""
9284 msgstr ""
9280
9285
9281 #: rhodecode/templates/base/base.mako:772
9286 #: rhodecode/templates/base/base.mako:773
9282 msgid "search / go to..."
9287 msgid "search / go to..."
9283 msgstr ""
9288 msgstr ""
9284
9289
9285 #: rhodecode/templates/base/base.mako:817
9286 msgid "Show activity journal"
9287 msgstr ""
9288
9289 #: rhodecode/templates/base/base.mako:818
9290 #: rhodecode/templates/base/base.mako:818
9291 msgid "Show activity journal"
9292 msgstr ""
9293
9294 #: rhodecode/templates/base/base.mako:819
9290 #: rhodecode/templates/journal/journal.mako:4
9295 #: rhodecode/templates/journal/journal.mako:4
9291 #: rhodecode/templates/journal/journal.mako:14
9296 #: rhodecode/templates/journal/journal.mako:14
9292 msgid "Journal"
9297 msgid "Journal"
9293 msgstr ""
9298 msgstr ""
9294
9299
9295 #: rhodecode/templates/base/base.mako:823
9296 msgid "Show Public activity journal"
9297 msgstr ""
9298
9299 #: rhodecode/templates/base/base.mako:824
9300 #: rhodecode/templates/base/base.mako:824
9301 msgid "Show Public activity journal"
9302 msgstr ""
9303
9304 #: rhodecode/templates/base/base.mako:825
9300 msgid "Public journal"
9305 msgid "Public journal"
9301 msgstr ""
9306 msgstr ""
9302
9307
9303 #: rhodecode/templates/base/base.mako:830
9304 msgid "Show Gists"
9305 msgstr ""
9306
9307 #: rhodecode/templates/base/base.mako:831
9308 #: rhodecode/templates/base/base.mako:831
9309 msgid "Show Gists"
9310 msgstr ""
9311
9312 #: rhodecode/templates/base/base.mako:832
9308 msgid "Gists"
9313 msgid "Gists"
9309 msgstr ""
9314 msgstr ""
9310
9315
9311 #: rhodecode/templates/base/base.mako:837
9316 #: rhodecode/templates/base/base.mako:838
9312 msgid "Admin settings"
9317 msgid "Admin settings"
9313 msgstr ""
9318 msgstr ""
9314
9319
9315 #: rhodecode/templates/base/base.mako:1154
9320 #: rhodecode/templates/base/base.mako:1155
9316 msgid "Keyboard shortcuts"
9321 msgid "Keyboard shortcuts"
9317 msgstr ""
9322 msgstr ""
9318
9323
9319 #: rhodecode/templates/base/base.mako:1162
9324 #: rhodecode/templates/base/base.mako:1163
9320 msgid "Site-wide shortcuts"
9325 msgid "Site-wide shortcuts"
9321 msgstr ""
9326 msgstr ""
9322
9327
@@ -9357,7 +9362,7 b' msgid "Repository Forking"'
9357 msgstr ""
9362 msgstr ""
9358
9363
9359 #: rhodecode/templates/base/default_perms_box.mako:65
9364 #: rhodecode/templates/base/default_perms_box.mako:65
9360 msgid "Permission to create root level repository forks. When disabled, users can still fork repositories inside their own repository groups."
9365 msgid "Permission to create repository forks. Root level forks will only work if repository creation is enabled."
9361 msgstr ""
9366 msgstr ""
9362
9367
9363 #: rhodecode/templates/base/default_perms_box.mako:70
9368 #: rhodecode/templates/base/default_perms_box.mako:70
@@ -9418,7 +9423,7 b' msgstr ""'
9418 #: rhodecode/templates/base/issue_tracker_settings.mako:300
9423 #: rhodecode/templates/base/issue_tracker_settings.mako:300
9419 #: rhodecode/templates/changeset/changeset_file_comment.mako:395
9424 #: rhodecode/templates/changeset/changeset_file_comment.mako:395
9420 #: rhodecode/templates/changeset/changeset_file_comment.mako:446
9425 #: rhodecode/templates/changeset/changeset_file_comment.mako:446
9421 #: rhodecode/templates/data_table/_dt_elements.mako:456
9426 #: rhodecode/templates/data_table/_dt_elements.mako:463
9422 #: rhodecode/templates/files/files_add.mako:59
9427 #: rhodecode/templates/files/files_add.mako:59
9423 #: rhodecode/templates/files/files_edit.mako:61
9428 #: rhodecode/templates/files/files_edit.mako:61
9424 msgid "Preview"
9429 msgid "Preview"
@@ -10481,11 +10486,11 b' msgstr ""'
10481 msgid "Work in progress"
10486 msgid "Work in progress"
10482 msgstr ""
10487 msgstr ""
10483
10488
10484 #: rhodecode/templates/data_table/_dt_elements.mako:432
10489 #: rhodecode/templates/data_table/_dt_elements.mako:438
10485 msgid "Info"
10490 msgid "Info"
10486 msgstr ""
10491 msgstr ""
10487
10492
10488 #: rhodecode/templates/data_table/_dt_elements.mako:473
10493 #: rhodecode/templates/data_table/_dt_elements.mako:480
10489 #, python-format
10494 #, python-format
10490 msgid "Parsed using %s syntax"
10495 msgid "Parsed using %s syntax"
10491 msgstr ""
10496 msgstr ""
@@ -10645,7 +10650,7 b' msgid "{mention_prefix}{user} left a {co'
10645 msgstr ""
10650 msgstr ""
10646
10651
10647 #: rhodecode/templates/email_templates/commit_comment.mako:54
10652 #: rhodecode/templates/email_templates/commit_comment.mako:54
10648 #: rhodecode/templates/email_templates/pull_request_comment.mako:63
10653 #: rhodecode/templates/email_templates/pull_request_comment.mako:62
10649 msgid "Comment link"
10654 msgid "Comment link"
10650 msgstr ""
10655 msgstr ""
10651
10656
@@ -10662,26 +10667,26 b' msgid "Commit message"'
10662 msgstr ""
10667 msgstr ""
10663
10668
10664 #: rhodecode/templates/email_templates/commit_comment.mako:65
10669 #: rhodecode/templates/email_templates/commit_comment.mako:65
10665 #: rhodecode/templates/email_templates/pull_request_comment.mako:77
10670 #: rhodecode/templates/email_templates/pull_request_comment.mako:76
10666 msgid "File: {comment_file} on line {comment_line}"
10671 msgid "File: {comment_file} on line {comment_line}"
10667 msgstr ""
10672 msgstr ""
10668
10673
10669 #: rhodecode/templates/email_templates/commit_comment.mako:69
10674 #: rhodecode/templates/email_templates/commit_comment.mako:69
10670 #: rhodecode/templates/email_templates/commit_comment.mako:161
10675 #: rhodecode/templates/email_templates/commit_comment.mako:161
10671 #: rhodecode/templates/email_templates/pull_request_comment.mako:81
10676 #: rhodecode/templates/email_templates/pull_request_comment.mako:80
10672 #: rhodecode/templates/email_templates/pull_request_comment.mako:191
10677 #: rhodecode/templates/email_templates/pull_request_comment.mako:190
10673 msgid "`TODO` number"
10678 msgid "`TODO` number"
10674 msgstr ""
10679 msgstr ""
10675
10680
10676 #: rhodecode/templates/email_templates/commit_comment.mako:71
10681 #: rhodecode/templates/email_templates/commit_comment.mako:71
10677 #: rhodecode/templates/email_templates/commit_comment.mako:163
10682 #: rhodecode/templates/email_templates/commit_comment.mako:163
10678 #: rhodecode/templates/email_templates/pull_request_comment.mako:83
10683 #: rhodecode/templates/email_templates/pull_request_comment.mako:82
10679 #: rhodecode/templates/email_templates/pull_request_comment.mako:193
10684 #: rhodecode/templates/email_templates/pull_request_comment.mako:192
10680 msgid "`Note` number"
10685 msgid "`Note` number"
10681 msgstr ""
10686 msgstr ""
10682
10687
10683 #: rhodecode/templates/email_templates/commit_comment.mako:104
10688 #: rhodecode/templates/email_templates/commit_comment.mako:104
10684 #: rhodecode/templates/email_templates/pull_request_comment.mako:124
10689 #: rhodecode/templates/email_templates/pull_request_comment.mako:123
10685 msgid "left a"
10690 msgid "left a"
10686 msgstr ""
10691 msgstr ""
10687
10692
@@ -10702,18 +10707,18 b' msgid "Commit Status"'
10702 msgstr ""
10707 msgstr ""
10703
10708
10704 #: rhodecode/templates/email_templates/commit_comment.mako:153
10709 #: rhodecode/templates/email_templates/commit_comment.mako:153
10705 #: rhodecode/templates/email_templates/pull_request_comment.mako:183
10710 #: rhodecode/templates/email_templates/pull_request_comment.mako:182
10706 #: rhodecode/templates/search/search_path.mako:9
10711 #: rhodecode/templates/search/search_path.mako:9
10707 msgid "File"
10712 msgid "File"
10708 msgstr ""
10713 msgstr ""
10709
10714
10710 #: rhodecode/templates/email_templates/commit_comment.mako:154
10715 #: rhodecode/templates/email_templates/commit_comment.mako:154
10711 #: rhodecode/templates/email_templates/pull_request_comment.mako:184
10716 #: rhodecode/templates/email_templates/pull_request_comment.mako:183
10712 msgid "`{comment_file}` on line {comment_line}"
10717 msgid "`{comment_file}` on line {comment_line}"
10713 msgstr ""
10718 msgstr ""
10714
10719
10715 #: rhodecode/templates/email_templates/commit_comment.mako:173
10720 #: rhodecode/templates/email_templates/commit_comment.mako:173
10716 #: rhodecode/templates/email_templates/pull_request_comment.mako:203
10721 #: rhodecode/templates/email_templates/pull_request_comment.mako:202
10717 msgid "Reply"
10722 msgid "Reply"
10718 msgstr ""
10723 msgstr ""
10719
10724
@@ -10729,35 +10734,35 b' msgstr ""'
10729 msgid "{mention_prefix}{user} left a {comment_type} on pull request !{pr_id}: \"{pr_title}\""
10734 msgid "{mention_prefix}{user} left a {comment_type} on pull request !{pr_id}: \"{pr_title}\""
10730 msgstr ""
10735 msgstr ""
10731
10736
10732 #: rhodecode/templates/email_templates/pull_request_comment.mako:65
10737 #: rhodecode/templates/email_templates/pull_request_comment.mako:64
10733 #: rhodecode/templates/hovercards/hovercard_pull_request.mako:24
10738 #: rhodecode/templates/hovercards/hovercard_pull_request.mako:24
10734 msgid "Pull Request"
10739 msgid "Pull Request"
10735 msgstr ""
10740 msgstr ""
10736
10741
10737 #: rhodecode/templates/email_templates/pull_request_comment.mako:67
10742 #: rhodecode/templates/email_templates/pull_request_comment.mako:66
10738 #: rhodecode/templates/email_templates/pull_request_review.mako:45
10743 #: rhodecode/templates/email_templates/pull_request_review.mako:45
10739 #: rhodecode/templates/email_templates/pull_request_update.mako:41
10744 #: rhodecode/templates/email_templates/pull_request_update.mako:41
10740 msgid "Commit flow: {source_ref_type}:{source_ref_name} of {source_repo_url} into {target_ref_type}:{target_ref_name} of {target_repo_url}"
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 msgstr ""
10746 msgstr ""
10742
10747
10743 #: rhodecode/templates/email_templates/pull_request_comment.mako:70
10748 #: rhodecode/templates/email_templates/pull_request_comment.mako:69
10744 msgid "{user} submitted pull request !{pr_id} status: *{status}*"
10749 msgid "{user} submitted pull request !{pr_id} status: *{status}*"
10745 msgstr ""
10750 msgstr ""
10746
10751
10747 #: rhodecode/templates/email_templates/pull_request_comment.mako:73
10752 #: rhodecode/templates/email_templates/pull_request_comment.mako:72
10748 msgid "{user} submitted pull request !{pr_id} status: *{status} and closed*"
10753 msgid "{user} submitted pull request !{pr_id} status: *{status} and closed*"
10749 msgstr ""
10754 msgstr ""
10750
10755
10751 #: rhodecode/templates/email_templates/pull_request_comment.mako:127
10756 #: rhodecode/templates/email_templates/pull_request_comment.mako:126
10752 msgid "{comment_type} on file `{comment_file}` in pull request."
10757 msgid "{comment_type} on file `{comment_file}` in pull request."
10753 msgstr ""
10758 msgstr ""
10754
10759
10755 #: rhodecode/templates/email_templates/pull_request_comment.mako:129
10760 #: rhodecode/templates/email_templates/pull_request_comment.mako:128
10756 msgid "{comment_type} on pull request."
10761 msgid "{comment_type} on pull request."
10757 msgstr ""
10762 msgstr ""
10758
10763
10759 #: rhodecode/templates/email_templates/pull_request_comment.mako:134
10764 #: rhodecode/templates/email_templates/pull_request_comment.mako:133
10760 #: rhodecode/templates/email_templates/pull_request_comment.mako:164
10765 #: rhodecode/templates/email_templates/pull_request_comment.mako:163
10761 #: rhodecode/templates/email_templates/pull_request_review.mako:100
10766 #: rhodecode/templates/email_templates/pull_request_review.mako:100
10762 #: rhodecode/templates/email_templates/pull_request_review.mako:116
10767 #: rhodecode/templates/email_templates/pull_request_review.mako:116
10763 #: rhodecode/templates/email_templates/pull_request_update.mako:104
10768 #: rhodecode/templates/email_templates/pull_request_update.mako:104
@@ -10765,26 +10770,26 b' msgstr ""'
10765 msgid "Pull request"
10770 msgid "Pull request"
10766 msgstr ""
10771 msgstr ""
10767
10772
10768 #: rhodecode/templates/email_templates/pull_request_comment.mako:153
10773 #: rhodecode/templates/email_templates/pull_request_comment.mako:152
10769 msgid "Review Status"
10774 msgid "Review Status"
10770 msgstr ""
10775 msgstr ""
10771
10776
10772 #: rhodecode/templates/email_templates/pull_request_comment.mako:156
10777 #: rhodecode/templates/email_templates/pull_request_comment.mako:155
10773 msgid "Closed pull request with status"
10778 msgid "Closed pull request with status"
10774 msgstr ""
10779 msgstr ""
10775
10780
10776 #: rhodecode/templates/email_templates/pull_request_comment.mako:158
10781 #: rhodecode/templates/email_templates/pull_request_comment.mako:157
10777 msgid "Submitted review status"
10782 msgid "Submitted review status"
10778 msgstr ""
10783 msgstr ""
10779
10784
10780 #: rhodecode/templates/email_templates/pull_request_comment.mako:173
10785 #: rhodecode/templates/email_templates/pull_request_comment.mako:172
10781 #: rhodecode/templates/email_templates/pull_request_review.mako:125
10786 #: rhodecode/templates/email_templates/pull_request_review.mako:125
10782 #: rhodecode/templates/email_templates/pull_request_update.mako:130
10787 #: rhodecode/templates/email_templates/pull_request_update.mako:130
10783 msgid "Commit Flow"
10788 msgid "Commit Flow"
10784 msgstr ""
10789 msgstr ""
10785
10790
10786 #: rhodecode/templates/email_templates/pull_request_comment.mako:175
10791 #: rhodecode/templates/email_templates/pull_request_comment.mako:174
10787 #: rhodecode/templates/email_templates/pull_request_comment.mako:177
10792 #: rhodecode/templates/email_templates/pull_request_comment.mako:176
10788 #: rhodecode/templates/email_templates/pull_request_review.mako:127
10793 #: rhodecode/templates/email_templates/pull_request_review.mako:127
10789 #: rhodecode/templates/email_templates/pull_request_review.mako:129
10794 #: rhodecode/templates/email_templates/pull_request_review.mako:129
10790 #: rhodecode/templates/email_templates/pull_request_update.mako:132
10795 #: rhodecode/templates/email_templates/pull_request_update.mako:132
@@ -11447,12 +11452,12 b' msgstr ""'
11447 msgid "In pull request description"
11452 msgid "In pull request description"
11448 msgstr ""
11453 msgstr ""
11449
11454
11450 #: rhodecode/templates/pullrequests/pullrequest_show.mako:838
11455 #: rhodecode/templates/pullrequests/pullrequest_show.mako:840
11451 #: rhodecode/templates/pullrequests/pullrequest_show.mako:857
11456 #: rhodecode/templates/pullrequests/pullrequest_show.mako:860
11452 msgid "No Ticket data found."
11457 msgid "No Ticket data found."
11453 msgstr ""
11458 msgstr ""
11454
11459
11455 #: rhodecode/templates/pullrequests/pullrequest_show.mako:843
11460 #: rhodecode/templates/pullrequests/pullrequest_show.mako:845
11456 msgid "In commit messages"
11461 msgid "In commit messages"
11457 msgstr ""
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 [bumpversion]
1 [bumpversion]
2 current_version = 4.24.1
2 current_version = 4.25.0
3 message = release: Bump version {current_version} to {new_version}
3 message = release: Bump version {current_version} to {new_version}
4
4
5 [bumpversion:file:rhodecode/VERSION]
5 [bumpversion:file:rhodecode/VERSION]
6
@@ -5,25 +5,20 b' done = false'
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
7 [task:rc_tools_pinned]
8 done = true
9
8
10 [task:fixes_on_stable]
9 [task:fixes_on_stable]
11 done = true
12
10
13 [task:pip2nix_generated]
11 [task:pip2nix_generated]
14 done = true
15
12
16 [task:changelog_updated]
13 [task:changelog_updated]
17 done = true
18
14
19 [task:generate_api_docs]
15 [task:generate_api_docs]
20 done = true
16
17 [task:updated_translation]
21
18
22 [release]
19 [release]
23 state = prepared
20 state = in_progress
24 version = 4.24.1
21 version = 4.25.0
25
26 [task:updated_translation]
27
22
28 [task:generate_js_routes]
23 [task:generate_js_routes]
29
24
@@ -130,6 +130,24 b' file_store_get_info (EE only)'
130 error : null
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 file_store_add_metadata (EE only)
151 file_store_add_metadata (EE only)
134 ---------------------------------
152 ---------------------------------
135
153
@@ -9,6 +9,7 b' Release Notes'
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.25.0.rst
12 release-notes-4.24.1.rst
13 release-notes-4.24.1.rst
13 release-notes-4.24.0.rst
14 release-notes-4.24.0.rst
14 release-notes-4.23.2.rst
15 release-notes-4.23.2.rst
@@ -6,7 +6,7 b' diff -rup pytest-4.6.5-orig/setup.py pyt'
6 setup(
6 setup(
7 use_scm_version={"write_to": "src/_pytest/_version.py"},
7 use_scm_version={"write_to": "src/_pytest/_version.py"},
8 - setup_requires=["setuptools-scm", "setuptools>=40.0"],
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 package_dir={"": "src"},
10 package_dir={"": "src"},
11 # fmt: off
11 # fmt: off
12 extras_require={ No newline at end of file
12 extras_require={
@@ -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 # Avoid that base packages screw up the build process
349 # Avoid that base packages screw up the build process
284 inherit (basePythonPackages)
350 inherit (basePythonPackages)
285 setuptools;
351 setuptools;
@@ -1883,7 +1883,7 b' self: super: {'
1883 };
1883 };
1884 };
1884 };
1885 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1885 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1886 name = "rhodecode-enterprise-ce-4.24.1";
1886 name = "rhodecode-enterprise-ce-4.25.0";
1887 buildInputs = [
1887 buildInputs = [
1888 self."pytest"
1888 self."pytest"
1889 self."py"
1889 self."py"
@@ -2092,6 +2092,17 b' self: super: {'
2092 license = [ pkgs.lib.licenses.mit ];
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 "simplegeneric" = super.buildPythonPackage {
2106 "simplegeneric" = super.buildPythonPackage {
2096 name = "simplegeneric-0.8.1";
2107 name = "simplegeneric-0.8.1";
2097 doCheck = false;
2108 doCheck = false;
@@ -1,1 +1,1 b''
1 4.24.1 No newline at end of file
1 4.25.0 No newline at end of file
@@ -1212,7 +1212,7 b' def fork_repo(request, apiuser, repoid, '
1212 validate_repo_permissions(apiuser, repoid, repo, _perms)
1212 validate_repo_permissions(apiuser, repoid, repo, _perms)
1213
1213
1214 # check if the regular user has at least fork permissions as well
1214 # check if the regular user has at least fork permissions as well
1215 if not HasPermissionAnyApi('hg.fork.repository')(user=apiuser):
1215 if not HasPermissionAnyApi(PermissionModel.FORKING_ENABLED)(user=apiuser):
1216 raise JSONRPCForbidden()
1216 raise JSONRPCForbidden()
1217
1217
1218 # check if user can set owner parameter
1218 # check if user can set owner parameter
@@ -255,7 +255,7 b' class LocalFileStorage(object):'
255
255
256 return filename, metadata
256 return filename, metadata
257
257
258 def get_metadata(self, filename):
258 def get_metadata(self, filename, ignore_missing=False):
259 """
259 """
260 Reads JSON stored metadata for a file
260 Reads JSON stored metadata for a file
261
261
@@ -264,6 +264,7 b' class LocalFileStorage(object):'
264 """
264 """
265 filename = self.store_path(filename)
265 filename = self.store_path(filename)
266 filename_meta = filename + '.meta'
266 filename_meta = filename + '.meta'
267
267 if ignore_missing and not os.path.isfile(filename_meta):
268 return {}
268 with open(filename_meta, "rb") as source_meta:
269 with open(filename_meta, "rb") as source_meta:
269 return json.loads(source_meta.read())
270 return json.loads(source_meta.read())
@@ -932,8 +932,8 b' def includeme(config):'
932 name='edit_repo_perms_branch',
932 name='edit_repo_perms_branch',
933 pattern='/{repo_name:.*?[^/]}/settings/branch_permissions', repo_route=True)
933 pattern='/{repo_name:.*?[^/]}/settings/branch_permissions', repo_route=True)
934 config.add_view(
934 config.add_view(
935 RepoBranchesView,
935 RepoSettingsBranchPermissionsView,
936 attr='branches',
936 attr='branch_permissions',
937 route_name='edit_repo_perms_branch', request_method='GET',
937 route_name='edit_repo_perms_branch', request_method='GET',
938 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
938 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
939
939
@@ -950,8 +950,8 b' def includeme(config):'
950 config.add_view(
950 config.add_view(
951 RepoMaintenanceView,
951 RepoMaintenanceView,
952 attr='repo_maintenance',
952 attr='repo_maintenance',
953 route_name='edit_repo_maintenance_execute', request_method='GET',
953 route_name='edit_repo_maintenance', request_method='GET',
954 renderer='json', xhr=True)
954 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
955
955
956 config.add_route(
956 config.add_route(
957 name='edit_repo_maintenance_execute',
957 name='edit_repo_maintenance_execute',
@@ -959,8 +959,8 b' def includeme(config):'
959 config.add_view(
959 config.add_view(
960 RepoMaintenanceView,
960 RepoMaintenanceView,
961 attr='repo_maintenance_execute',
961 attr='repo_maintenance_execute',
962 route_name='edit_repo_maintenance', request_method='GET',
962 route_name='edit_repo_maintenance_execute', request_method='GET',
963 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
963 renderer='json', xhr=True)
964
964
965 # Fields
965 # Fields
966 config.add_route(
966 config.add_route(
@@ -542,6 +542,28 b' class TestRepositoryArchival(object):'
542 for header in headers:
542 for header in headers:
543 assert header in response.headers.items()
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 @pytest.mark.parametrize('arch_ext',[
567 @pytest.mark.parametrize('arch_ext',[
546 'tar', 'rar', 'x', '..ax', '.zipz', 'tar.gz.tar'])
568 'tar', 'rar', 'x', '..ax', '.zipz', 'tar.gz.tar'])
547 def test_archival_wrong_ext(self, backend, arch_ext):
569 def test_archival_wrong_ext(self, backend, arch_ext):
@@ -34,7 +34,7 b' from rhodecode.lib.auth import ('
34 from rhodecode.lib.ext_json import json
34 from rhodecode.lib.ext_json import json
35 from rhodecode.lib.graphmod import _colored, _dagwalker
35 from rhodecode.lib.graphmod import _colored, _dagwalker
36 from rhodecode.lib.helpers import RepoPage
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 from rhodecode.lib.vcs.exceptions import (
38 from rhodecode.lib.vcs.exceptions import (
39 RepositoryError, CommitDoesNotExistError,
39 RepositoryError, CommitDoesNotExistError,
40 CommitError, NodeDoesNotExistError, EmptyRepositoryError)
40 CommitError, NodeDoesNotExistError, EmptyRepositoryError)
@@ -110,7 +110,7 b' class RepoChangelogView(RepoAppView):'
110
110
111 def _check_if_valid_branch(self, branch_name, repo_name, f_path):
111 def _check_if_valid_branch(self, branch_name, repo_name, f_path):
112 if branch_name not in self.rhodecode_vcs_repo.branches_all:
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 category='warning')
114 category='warning')
115 redirect_url = h.route_path(
115 redirect_url = h.route_path(
116 'repo_commits_file', repo_name=repo_name,
116 'repo_commits_file', repo_name=repo_name,
@@ -674,6 +674,10 b' class RepoCommitsView(RepoAppView):'
674 is_repo_comment = comment.repo.repo_id == self.db_repo.repo_id
674 is_repo_comment = comment.repo.repo_id == self.db_repo.repo_id
675 comment_repo_admin = is_repo_admin and is_repo_comment
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 if super_admin or comment_owner or comment_repo_admin:
681 if super_admin or comment_owner or comment_repo_admin:
678 CommentsModel().delete(comment=comment, auth_user=self._rhodecode_user)
682 CommentsModel().delete(comment=comment, auth_user=self._rhodecode_user)
679 Session().commit()
683 Session().commit()
@@ -104,6 +104,9 b' class RepoFeedView(RepoAppView):'
104
104
105 def _get_commits(self):
105 def _get_commits(self):
106 pre_load = ['author', 'branch', 'date', 'message', 'parents']
106 pre_load = ['author', 'branch', 'date', 'message', 'parents']
107 if self.rhodecode_vcs_repo.is_empty():
108 return []
109
107 collection = self.rhodecode_vcs_repo.get_commits(
110 collection = self.rhodecode_vcs_repo.get_commits(
108 branch_name=None, show_hidden=False, pre_load=pre_load,
111 branch_name=None, show_hidden=False, pre_load=pre_load,
109 translate_tags=False)
112 translate_tags=False)
@@ -137,6 +140,7 b' class RepoFeedView(RepoAppView):'
137 language=self.language,
140 language=self.language,
138 ttl=self.ttl
141 ttl=self.ttl
139 )
142 )
143
140 for commit in reversed(self._get_commits()):
144 for commit in reversed(self._get_commits()):
141 date = self._set_timezone(commit.date)
145 date = self._set_timezone(commit.date)
142 feed.add_item(
146 feed.add_item(
@@ -325,17 +325,18 b' class RepoFilesView(RepoAppView):'
325
325
326 return lf_enabled
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 # original backward compat name of archive
329 # original backward compat name of archive
330 clean_name = safe_str(db_repo_name.replace('/', '_'))
330 clean_name = safe_str(db_repo_name.replace('/', '_'))
331
331
332 # e.g vcsserver.zip
332 # e.g vcsserver.zip
333 # e.g vcsserver-abcdefgh.zip
333 # e.g vcsserver-abcdefgh.zip
334 # e.g vcsserver-abcdefgh-defghijk.zip
334 # e.g vcsserver-abcdefgh-defghijk.zip
335 archive_name = '{}{}{}{}{}'.format(
335 archive_name = '{}{}{}{}{}{}'.format(
336 clean_name,
336 clean_name,
337 '-sub' if subrepos else '',
337 '-sub' if subrepos else '',
338 commit_sha,
338 commit_sha,
339 '-{}'.format('plain') if not with_hash else '',
339 '-{}'.format(path_sha) if path_sha else '',
340 '-{}'.format(path_sha) if path_sha else '',
340 ext)
341 ext)
341 return archive_name
342 return archive_name
@@ -372,6 +373,11 b' class RepoFilesView(RepoAppView):'
372 except EmptyRepositoryError:
373 except EmptyRepositoryError:
373 return Response(_('Empty repository'))
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 try:
381 try:
376 at_path = commit.get_node(at_path).path or default_at_path
382 at_path = commit.get_node(at_path).path or default_at_path
377 except Exception:
383 except Exception:
@@ -385,7 +391,7 b' class RepoFilesView(RepoAppView):'
385 # used for cache etc
391 # used for cache etc
386 archive_name = self._get_archive_name(
392 archive_name = self._get_archive_name(
387 self.db_repo_name, commit_sha=short_sha, ext=ext, subrepos=subrepos,
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 if not with_hash:
396 if not with_hash:
391 short_sha = ''
397 short_sha = ''
@@ -394,7 +400,7 b' class RepoFilesView(RepoAppView):'
394 # what end client gets served
400 # what end client gets served
395 response_archive_name = self._get_archive_name(
401 response_archive_name = self._get_archive_name(
396 self.db_repo_name, commit_sha=short_sha, ext=ext, subrepos=subrepos,
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 # remove extension from our archive directory name
404 # remove extension from our archive directory name
399 archive_dir_name = response_archive_name[:-len(ext)]
405 archive_dir_name = response_archive_name[:-len(ext)]
400
406
@@ -404,9 +410,10 b' class RepoFilesView(RepoAppView):'
404 cached_archive_path = None
410 cached_archive_path = None
405
411
406 if archive_cache_enabled:
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 if not os.path.isdir(CONFIG['archive_cache_dir']):
414 if not os.path.isdir(CONFIG['archive_cache_dir']):
409 os.makedirs(CONFIG['archive_cache_dir'])
415 os.makedirs(CONFIG['archive_cache_dir'])
416
410 cached_archive_path = os.path.join(
417 cached_archive_path = os.path.join(
411 CONFIG['archive_cache_dir'], archive_name)
418 CONFIG['archive_cache_dir'], archive_name)
412 if os.path.isfile(cached_archive_path):
419 if os.path.isfile(cached_archive_path):
@@ -165,7 +165,7 b' class RepoForksView(RepoAppView, DataGri'
165
165
166 @LoginRequired()
166 @LoginRequired()
167 @NotAnonymous()
167 @NotAnonymous()
168 @HasPermissionAnyDecorator('hg.admin', 'hg.fork.repository')
168 @HasPermissionAnyDecorator('hg.admin', PermissionModel.FORKING_ENABLED)
169 @HasRepoPermissionAnyDecorator(
169 @HasRepoPermissionAnyDecorator(
170 'repository.read', 'repository.write', 'repository.admin')
170 'repository.read', 'repository.write', 'repository.admin')
171 def repo_fork_new(self):
171 def repo_fork_new(self):
@@ -191,7 +191,7 b' class RepoForksView(RepoAppView, DataGri'
191
191
192 @LoginRequired()
192 @LoginRequired()
193 @NotAnonymous()
193 @NotAnonymous()
194 @HasPermissionAnyDecorator('hg.admin', 'hg.fork.repository')
194 @HasPermissionAnyDecorator('hg.admin', PermissionModel.FORKING_ENABLED)
195 @HasRepoPermissionAnyDecorator(
195 @HasRepoPermissionAnyDecorator(
196 'repository.read', 'repository.write', 'repository.admin')
196 'repository.read', 'repository.write', 'repository.admin')
197 @CSRFRequired()
197 @CSRFRequired()
@@ -1748,6 +1748,10 b' class RepoPullRequestsView(RepoAppView, '
1748 is_repo_comment = comment.repo.repo_name == self.db_repo_name
1748 is_repo_comment = comment.repo.repo_name == self.db_repo_name
1749 comment_repo_admin = is_repo_admin and is_repo_comment
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 if super_admin or comment_owner or comment_repo_admin:
1755 if super_admin or comment_owner or comment_repo_admin:
1752 old_calculated_status = comment.pull_request.calculated_review_status()
1756 old_calculated_status = comment.pull_request.calculated_review_status()
1753 CommentsModel().delete(comment=comment, auth_user=self._rhodecode_user)
1757 CommentsModel().delete(comment=comment, auth_user=self._rhodecode_user)
@@ -89,6 +89,14 b' class SshWrapper(object):'
89
89
90 return conn
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 def get_repo_details(self, mode):
100 def get_repo_details(self, mode):
93 vcs_type = mode if mode in ['svn', 'hg', 'git'] else None
101 vcs_type = mode if mode in ['svn', 'hg', 'git'] else None
94 repo_name = None
102 repo_name = None
@@ -97,14 +105,14 b' class SshWrapper(object):'
97 hg_match = re.match(hg_pattern, self.command)
105 hg_match = re.match(hg_pattern, self.command)
98 if hg_match is not None:
106 if hg_match is not None:
99 vcs_type = 'hg'
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 return vcs_type, repo_name, mode
109 return vcs_type, repo_name, mode
102
110
103 git_pattern = r'^git-(receive-pack|upload-pack)\s\'[/]?(\S+?)(|\.git)\'$'
111 git_pattern = r'^git-(receive-pack|upload-pack)\s\'[/]?(\S+?)(|\.git)\'$'
104 git_match = re.match(git_pattern, self.command)
112 git_match = re.match(git_pattern, self.command)
105 if git_match is not None:
113 if git_match is not None:
106 vcs_type = 'git'
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 mode = git_match.group(1)
116 mode = git_match.group(1)
109 return vcs_type, repo_name, mode
117 return vcs_type, repo_name, mode
110
118
@@ -19,6 +19,8 b''
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import json
21 import json
22 import os
23
22 import mock
24 import mock
23 import pytest
25 import pytest
24
26
@@ -107,6 +109,8 b' class TestGitServer(object):'
107 def test_run_returns_executes_command(self, git_server):
109 def test_run_returns_executes_command(self, git_server):
108 server = git_server.create()
110 server = git_server.create()
109 from rhodecode.apps.ssh_support.lib.backends.git import GitTunnelWrapper
111 from rhodecode.apps.ssh_support.lib.backends.git import GitTunnelWrapper
112
113 os.environ['SSH_CLIENT'] = '127.0.0.1'
110 with mock.patch.object(GitTunnelWrapper, 'create_hooks_env') as _patch:
114 with mock.patch.object(GitTunnelWrapper, 'create_hooks_env') as _patch:
111 _patch.return_value = 0
115 _patch.return_value = 0
112 with mock.patch.object(GitTunnelWrapper, 'command', return_value='date'):
116 with mock.patch.object(GitTunnelWrapper, 'command', return_value='date'):
@@ -108,6 +108,7 b' class TestMercurialServer(object):'
108 def test_run_returns_executes_command(self, hg_server):
108 def test_run_returns_executes_command(self, hg_server):
109 server = hg_server.create()
109 server = hg_server.create()
110 from rhodecode.apps.ssh_support.lib.backends.hg import MercurialTunnelWrapper
110 from rhodecode.apps.ssh_support.lib.backends.hg import MercurialTunnelWrapper
111 os.environ['SSH_CLIENT'] = '127.0.0.1'
111 with mock.patch.object(MercurialTunnelWrapper, 'create_hooks_env') as _patch:
112 with mock.patch.object(MercurialTunnelWrapper, 'create_hooks_env') as _patch:
112 _patch.return_value = 0
113 _patch.return_value = 0
113 with mock.patch.object(MercurialTunnelWrapper, 'command', return_value='date'):
114 with mock.patch.object(MercurialTunnelWrapper, 'command', return_value='date'):
@@ -17,7 +17,7 b''
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20 import os
21 import mock
21 import mock
22 import pytest
22 import pytest
23
23
@@ -174,6 +174,7 b' class TestSubversionServer(object):'
174 def test_run_returns_executes_command(self, svn_server):
174 def test_run_returns_executes_command(self, svn_server):
175 server = svn_server.create()
175 server = svn_server.create()
176 from rhodecode.apps.ssh_support.lib.backends.svn import SubversionTunnelWrapper
176 from rhodecode.apps.ssh_support.lib.backends.svn import SubversionTunnelWrapper
177 os.environ['SSH_CLIENT'] = '127.0.0.1'
177 with mock.patch.object(
178 with mock.patch.object(
178 SubversionTunnelWrapper, 'get_first_client_response',
179 SubversionTunnelWrapper, 'get_first_client_response',
179 return_value={'url': 'http://server/test-svn'}):
180 return_value={'url': 'http://server/test-svn'}):
@@ -32,6 +32,7 b' import json'
32 from rhodecode.lib import diffs
32 from rhodecode.lib import diffs
33 from rhodecode.lib.vcs.backends.hg.diff import MercurialDiff
33 from rhodecode.lib.vcs.backends.hg.diff import MercurialDiff
34 from rhodecode.lib.vcs.backends.git.diff import GitDiff
34 from rhodecode.lib.vcs.backends.git.diff import GitDiff
35 from vcsserver.utils import safe_int
35
36
36
37
37 def get_svn_files(repo, vcs_repo, refs):
38 def get_svn_files(repo, vcs_repo, refs):
@@ -74,7 +75,7 b' def get_svn_files(repo, vcs_repo, refs):'
74 # skip dirs
75 # skip dirs
75 continue
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 files.append(parsed_entry)
80 files.append(parsed_entry)
80
81
@@ -524,8 +524,10 b' class PermissionCalculator(object):'
524
524
525 # In case we want to extend this list we should make sure
525 # In case we want to extend this list we should make sure
526 # this is in sync with User.DEFAULT_USER_PERMISSIONS definitions
526 # this is in sync with User.DEFAULT_USER_PERMISSIONS definitions
527 from rhodecode.model.permission import PermissionModel
528
527 _configurable = frozenset([
529 _configurable = frozenset([
528 'hg.fork.none', 'hg.fork.repository',
530 PermissionModel.FORKING_DISABLED, PermissionModel.FORKING_ENABLED,
529 'hg.create.none', 'hg.create.repository',
531 'hg.create.none', 'hg.create.repository',
530 'hg.usergroup.create.false', 'hg.usergroup.create.true',
532 'hg.usergroup.create.false', 'hg.usergroup.create.true',
531 'hg.repogroup.create.false', 'hg.repogroup.create.true',
533 'hg.repogroup.create.false', 'hg.repogroup.create.true',
@@ -25,6 +25,7 b' Consists of functions to typically be us'
25 available to Controllers. This module is available to both as 'h'.
25 available to Controllers. This module is available to both as 'h'.
26 """
26 """
27 import base64
27 import base64
28 import collections
28
29
29 import os
30 import os
30 import random
31 import random
@@ -1733,7 +1734,7 b' def process_patterns(text_string, repo_n'
1733
1734
1734
1735
1735 def urlify_commit_message(commit_text, repository=None, active_pattern_entries=None,
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 Parses given text message and makes proper links.
1739 Parses given text message and makes proper links.
1739 issues are linked to given issue-server, and rest is a commit link
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 new_text, issues, errors = process_patterns(
1757 new_text, issues, errors = process_patterns(
1757 new_text, repository or '', active_entries=active_pattern_entries)
1758 new_text, repository or '', active_entries=active_pattern_entries)
1758
1759
1759 if issues_container is not None:
1760 if issues_container_callback is not None:
1760 issues_container.extend(issues)
1761 for issue in issues:
1762 issues_container_callback(issue)
1761
1763
1762 if error_container is not None:
1764 if error_container is not None:
1763 error_container.extend(errors)
1765 error_container.extend(errors)
@@ -1802,7 +1804,7 b' def renderer_from_filename(filename, exc'
1802
1804
1803
1805
1804 def render(source, renderer='rst', mentions=False, relative_urls=None,
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 def maybe_convert_relative_links(html_source):
1809 def maybe_convert_relative_links(html_source):
1808 if relative_urls:
1810 if relative_urls:
@@ -1819,8 +1821,9 b" def render(source, renderer='rst', menti"
1819 source, issues, errors = process_patterns(
1821 source, issues, errors = process_patterns(
1820 source, repo_name, link_format='rst',
1822 source, repo_name, link_format='rst',
1821 active_entries=active_pattern_entries)
1823 active_entries=active_pattern_entries)
1822 if issues_container is not None:
1824 if issues_container_callback is not None:
1823 issues_container.extend(issues)
1825 for issue in issues:
1826 issues_container_callback(issue)
1824
1827
1825 return literal(
1828 return literal(
1826 '<div class="rst-block">%s</div>' %
1829 '<div class="rst-block">%s</div>' %
@@ -1833,8 +1836,10 b" def render(source, renderer='rst', menti"
1833 source, issues, errors = process_patterns(
1836 source, issues, errors = process_patterns(
1834 source, repo_name, link_format='markdown',
1837 source, repo_name, link_format='markdown',
1835 active_entries=active_pattern_entries)
1838 active_entries=active_pattern_entries)
1836 if issues_container is not None:
1839 if issues_container_callback is not None:
1837 issues_container.extend(issues)
1840 for issue in issues:
1841 issues_container_callback(issue)
1842
1838
1843
1839 return literal(
1844 return literal(
1840 '<div class="markdown-block">%s</div>' %
1845 '<div class="markdown-block">%s</div>' %
@@ -2115,3 +2120,29 b' def is_active(menu_entry, selected):'
2115
2120
2116 if selected in menu_entry:
2121 if selected in menu_entry:
2117 return "active"
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 # List of path views first chunk we don't do any checks
161 # List of path views first chunk we don't do any checks
162 white_list = [
162 white_list = [
163 # e.g /_file_store/download
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 path_info = environ['PATH_INFO']
173 path_info = environ['PATH_INFO']
168
174
169 if get_path_elem(path_info) in white_list:
175 path_elem = get_path_elem(path_info)
176
177 if path_elem in white_list:
170 log.debug('path `%s` in whitelist, skipping...', path_info)
178 log.debug('path `%s` in whitelist, skipping...', path_info)
171 return handler
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 if VCS_TYPE_KEY in environ:
186 if VCS_TYPE_KEY in environ:
174 raw_type = environ[VCS_TYPE_KEY]
187 raw_type = environ[VCS_TYPE_KEY]
175 if raw_type == VCS_TYPE_SKIP:
188 if raw_type == VCS_TYPE_SKIP:
@@ -181,7 +194,7 b' def detect_vcs_request(environ, backends'
181 log.debug('got handler:%s from environ', handler)
194 log.debug('got handler:%s from environ', handler)
182
195
183 if not handler:
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 for vcs_type in backends:
198 for vcs_type in backends:
186 vcs_check, _handler = checks[vcs_type]
199 vcs_check, _handler = checks[vcs_type]
187 if vcs_check(environ):
200 if vcs_check(environ):
@@ -594,6 +594,9 b' def credentials_filter(uri):'
594 :param uri:
594 :param uri:
595 """
595 """
596 import urlobject
596 import urlobject
597 if isinstance(uri, rhodecode.lib.encrypt.InvalidDecryptedValue):
598 return 'InvalidDecryptionKey'
599
597 url_obj = urlobject.URLObject(cleaned_uri(uri))
600 url_obj = urlobject.URLObject(cleaned_uri(uri))
598 url_obj = url_obj.without_password().without_username()
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 def get_commit_safe(repo, commit_id=None, commit_idx=None, pre_load=None,
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 Safe version of get_commit if this commit doesn't exists for a
663 Safe version of get_commit if this commit doesn't exists for a
661 repository it returns a Dummy one instead
664 repository it returns a Dummy one instead
@@ -665,6 +668,7 b' def get_commit_safe(repo, commit_id=None'
665 :param commit_idx: numeric commit index
668 :param commit_idx: numeric commit index
666 :param pre_load: optional list of commit attributes to load
669 :param pre_load: optional list of commit attributes to load
667 :param maybe_unreachable: translate unreachable commits on git repos
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 # TODO(skreft): remove these circular imports
673 # TODO(skreft): remove these circular imports
670 from rhodecode.lib.vcs.backends.base import BaseRepository, EmptyCommit
674 from rhodecode.lib.vcs.backends.base import BaseRepository, EmptyCommit
@@ -676,7 +680,7 b' def get_commit_safe(repo, commit_id=None'
676 try:
680 try:
677 commit = repo.get_commit(
681 commit = repo.get_commit(
678 commit_id=commit_id, commit_idx=commit_idx, pre_load=pre_load,
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 except (RepositoryError, LookupError):
684 except (RepositoryError, LookupError):
681 commit = EmptyCommit()
685 commit = EmptyCommit()
682 return commit
686 return commit
@@ -72,6 +72,10 b' class Reference(_Reference):'
72 if self.type == 'book':
72 if self.type == 'book':
73 return self.name
73 return self.name
74
74
75 @property
76 def to_unicode(self):
77 return reference_to_unicode(self)
78
75
79
76 def unicode_to_reference(raw):
80 def unicode_to_reference(raw):
77 """
81 """
@@ -483,7 +487,7 b' class BaseRepository(object):'
483 self._is_empty = False
487 self._is_empty = False
484
488
485 def get_commit(self, commit_id=None, commit_idx=None, pre_load=None,
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 Returns instance of `BaseCommit` class. If `commit_id` and `commit_idx`
492 Returns instance of `BaseCommit` class. If `commit_id` and `commit_idx`
489 are both None, most recent commit is returned.
493 are both None, most recent commit is returned.
@@ -98,7 +98,7 b' class GitCommit(base.BaseCommit):'
98 elif attr == "parents":
98 elif attr == "parents":
99 value = self._make_commits(value)
99 value = self._make_commits(value)
100 elif attr == "branch":
100 elif attr == "branch":
101 value = value[0] if value else None
101 value = self._set_branch(value)
102 self.__dict__[attr] = value
102 self.__dict__[attr] = value
103
103
104 @LazyProperty
104 @LazyProperty
@@ -156,13 +156,15 b' class GitCommit(base.BaseCommit):'
156 branches.append(name)
156 branches.append(name)
157 return branches
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 @LazyProperty
164 @LazyProperty
160 def branch(self):
165 def branch(self):
161 branches = self._remote.branch(self.raw_id)
166 branches = self._remote.branch(self.raw_id)
162
167 return self._set_branch(branches)
163 if branches:
164 # actually commit can have multiple branches in git
165 return safe_unicode(branches[0])
166
168
167 def _get_tree_id_for_path(self, path):
169 def _get_tree_id_for_path(self, path):
168 path = safe_str(path)
170 path = safe_str(path)
@@ -228,7 +228,8 b' class GitRepository(BaseRepository):'
228 return []
228 return []
229 return output.splitlines()
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 def is_null(value):
233 def is_null(value):
233 return len(value) == commit_id_or_idx.count('0')
234 return len(value) == commit_id_or_idx.count('0')
234
235
@@ -239,21 +240,34 b' class GitRepository(BaseRepository):'
239 *map(safe_str, [commit_id_or_idx, self.name]))
240 *map(safe_str, [commit_id_or_idx, self.name]))
240
241
241 is_bstr = isinstance(commit_id_or_idx, (str, unicode))
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 is_branch = reference_obj and reference_obj.branch
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)
248
244
249 elif is_bstr:
245 lookup_ok = False
250 # Need to call remote to translate id for tagging scenario
246 if is_bstr:
247 # Need to call remote to translate id for tagging scenarios,
248 # or branch that are numeric
251 try:
249 try:
252 remote_data = self._remote.get_object(commit_id_or_idx,
250 remote_data = self._remote.get_object(commit_id_or_idx,
253 maybe_unreachable=maybe_unreachable)
251 maybe_unreachable=maybe_unreachable)
254 commit_id_or_idx = remote_data["commit_id"]
252 commit_id_or_idx = remote_data["commit_id"]
253 lookup_ok = True
255 except (CommitDoesNotExistError,):
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 # Ensure we return full id
272 # Ensure we return full id
259 if not SHA_PATTERN.match(str(commit_id_or_idx)):
273 if not SHA_PATTERN.match(str(commit_id_or_idx)):
@@ -413,11 +427,12 b' class GitRepository(BaseRepository):'
413 return
427 return
414
428
415 def get_commit(self, commit_id=None, commit_idx=None, pre_load=None,
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 Returns `GitCommit` object representing commit from git repository
432 Returns `GitCommit` object representing commit from git repository
419 at the given `commit_id` or head (most recent commit) if None given.
433 at the given `commit_id` or head (most recent commit) if None given.
420 """
434 """
435
421 if self.is_empty():
436 if self.is_empty():
422 raise EmptyRepositoryError("There are no commits yet")
437 raise EmptyRepositoryError("There are no commits yet")
423
438
@@ -443,7 +458,9 b' class GitRepository(BaseRepository):'
443 commit_id = "tip"
458 commit_id = "tip"
444
459
445 if translate_tag:
460 if translate_tag:
446 commit_id = self._lookup_commit(commit_id, maybe_unreachable=maybe_unreachable)
461 commit_id = self._lookup_commit(
462 commit_id, maybe_unreachable=maybe_unreachable,
463 reference_obj=reference_obj)
447
464
448 try:
465 try:
449 idx = self._commit_ids[commit_id]
466 idx = self._commit_ids[commit_id]
@@ -437,7 +437,7 b' class MercurialRepository(BaseRepository'
437 return os.path.join(self.path, '.hg', '.hgrc')
437 return os.path.join(self.path, '.hg', '.hgrc')
438
438
439 def get_commit(self, commit_id=None, commit_idx=None, pre_load=None,
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 Returns ``MercurialCommit`` object representing repository's
442 Returns ``MercurialCommit`` object representing repository's
443 commit at the given `commit_id` or `commit_idx`.
443 commit at the given `commit_id` or `commit_idx`.
@@ -277,7 +277,7 b' class SubversionRepository(base.BaseRepo'
277 return os.path.join(self.path, 'hooks')
277 return os.path.join(self.path, 'hooks')
278
278
279 def get_commit(self, commit_id=None, commit_idx=None, pre_load=None,
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 if self.is_empty():
281 if self.is_empty():
282 raise EmptyRepositoryError("There are no commits yet")
282 raise EmptyRepositoryError("There are no commits yet")
283 if commit_id is not None:
283 if commit_id is not None:
@@ -468,7 +468,7 b' class FileNode(Node):'
468 mtype, encoding = db.guess_type(self.name)
468 mtype, encoding = db.guess_type(self.name)
469
469
470 if mtype is None:
470 if mtype is None:
471 if self.is_binary:
471 if not self.is_largefile() and self.is_binary:
472 mtype = 'application/octet-stream'
472 mtype = 'application/octet-stream'
473 encoding = None
473 encoding = None
474 else:
474 else:
@@ -839,6 +839,7 b' class LargeFileNode(FileNode):'
839 self.org_path = org_path
839 self.org_path = org_path
840 self.kind = NodeKind.LARGEFILE
840 self.kind = NodeKind.LARGEFILE
841 self.alias = alias
841 self.alias = alias
842 self._content = ''
842
843
843 def _validate_path(self, path):
844 def _validate_path(self, path):
844 """
845 """
@@ -2398,10 +2398,10 b' class Repository(Base, BaseModel):'
2398 # SCM PROPERTIES
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 return get_commit_safe(
2402 return get_commit_safe(
2403 self.scm_instance(), commit_id, commit_idx, pre_load=pre_load,
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 def get_changeset(self, rev=None, pre_load=None):
2406 def get_changeset(self, rev=None, pre_load=None):
2407 warnings.warn("Use get_commit", DeprecationWarning)
2407 warnings.warn("Use get_commit", DeprecationWarning)
@@ -41,6 +41,8 b' class PermissionModel(BaseModel):'
41 """
41 """
42 Permissions model for RhodeCode
42 Permissions model for RhodeCode
43 """
43 """
44 FORKING_DISABLED = 'hg.fork.none'
45 FORKING_ENABLED = 'hg.fork.repository'
44
46
45 cls = Permission
47 cls = Permission
46 global_perms = {
48 global_perms = {
@@ -122,8 +124,8 b' class PermissionModel(BaseModel):'
122 ('hg.repogroup.create.true', _('Enabled'))]
124 ('hg.repogroup.create.true', _('Enabled'))]
123
125
124 c_obj.fork_choices = [
126 c_obj.fork_choices = [
125 ('hg.fork.none', _('Disabled')),
127 (self.FORKING_DISABLED, _('Disabled')),
126 ('hg.fork.repository', _('Enabled'))]
128 (self.FORKING_ENABLED, _('Enabled'))]
127
129
128 c_obj.inherit_default_permission_choices = [
130 c_obj.inherit_default_permission_choices = [
129 ('hg.inherit_default_perms.false', _('Disabled')),
131 ('hg.inherit_default_perms.false', _('Disabled')),
@@ -908,7 +908,8 b' class PullRequestModel(BaseModel):'
908
908
909 try:
909 try:
910 if source_ref_type in self.REF_TYPES:
910 if source_ref_type in self.REF_TYPES:
911 source_commit = source_repo.get_commit(source_ref_name)
911 source_commit = source_repo.get_commit(
912 source_ref_name, reference_obj=pull_request.source_ref_parts)
912 else:
913 else:
913 source_commit = source_repo.get_commit(source_ref_id)
914 source_commit = source_repo.get_commit(source_ref_id)
914 except CommitDoesNotExistError:
915 except CommitDoesNotExistError:
@@ -922,7 +923,8 b' class PullRequestModel(BaseModel):'
922
923
923 try:
924 try:
924 if target_ref_type in self.REF_TYPES:
925 if target_ref_type in self.REF_TYPES:
925 target_commit = target_repo.get_commit(target_ref_name)
926 target_commit = target_repo.get_commit(
927 target_ref_name, reference_obj=pull_request.target_ref_parts)
926 else:
928 else:
927 target_commit = target_repo.get_commit(target_ref_id)
929 target_commit = target_repo.get_commit(target_ref_id)
928 except CommitDoesNotExistError:
930 except CommitDoesNotExistError:
@@ -46,6 +46,7 b' from rhodecode.model.db import ('
46 Session, Repository, UserRepoToPerm, UserGroupRepoToPerm,
46 Session, Repository, UserRepoToPerm, UserGroupRepoToPerm,
47 UserRepoGroupToPerm, UserGroupRepoGroupToPerm, User, Permission,
47 UserRepoGroupToPerm, UserGroupRepoGroupToPerm, User, Permission,
48 Statistics, UserGroup, RepoGroup, RepositoryField, UserLog)
48 Statistics, UserGroup, RepoGroup, RepositoryField, UserLog)
49 from rhodecode.model.permission import PermissionModel
49 from rhodecode.model.settings import VcsSettingsModel
50 from rhodecode.model.settings import VcsSettingsModel
50
51
51 log = logging.getLogger(__name__)
52 log = logging.getLogger(__name__)
@@ -422,8 +423,15 b' class RepoModel(BaseModel):'
422 try:
423 try:
423 cur_repo = self._get_repo(repo)
424 cur_repo = self._get_repo(repo)
424 source_repo_name = cur_repo.repo_name
425 source_repo_name = cur_repo.repo_name
426
427 affected_user_ids = []
425 if 'user' in kwargs:
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 if 'repo_group' in kwargs:
436 if 'repo_group' in kwargs:
429 cur_repo.group = RepoGroup.get(kwargs['repo_group'])
437 cur_repo.group = RepoGroup.get(kwargs['repo_group'])
@@ -474,6 +482,9 b' class RepoModel(BaseModel):'
474 self._rename_filesystem_repo(
482 self._rename_filesystem_repo(
475 old=source_repo_name, new=new_name)
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 return cur_repo
488 return cur_repo
478 except Exception:
489 except Exception:
479 log.error(traceback.format_exc())
490 log.error(traceback.format_exc())
@@ -39,6 +39,7 b' from rhodecode.model import BaseModel'
39 from rhodecode.model.db import (_hash_key, func, or_, in_filter_generator,
39 from rhodecode.model.db import (_hash_key, func, or_, in_filter_generator,
40 Session, RepoGroup, UserRepoGroupToPerm, User, Permission, UserGroupRepoGroupToPerm,
40 Session, RepoGroup, UserRepoGroupToPerm, User, Permission, UserGroupRepoGroupToPerm,
41 UserGroup, Repository)
41 UserGroup, Repository)
42 from rhodecode.model.permission import PermissionModel
42 from rhodecode.model.settings import VcsSettingsModel, SettingsModel
43 from rhodecode.model.settings import VcsSettingsModel, SettingsModel
43 from rhodecode.lib.caching_query import FromCache
44 from rhodecode.lib.caching_query import FromCache
44 from rhodecode.lib.utils2 import action_logger_generic
45 from rhodecode.lib.utils2 import action_logger_generic
@@ -531,8 +532,14 b' class RepoGroupModel(BaseModel):'
531
532
532 new_path = repo_group.full_path
533 new_path = repo_group.full_path
533
534
535 affected_user_ids = []
534 if 'user' in form_data:
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 self.sa.add(repo_group)
544 self.sa.add(repo_group)
538
545
@@ -566,6 +573,9 b' class RepoGroupModel(BaseModel):'
566 # Trigger update event.
573 # Trigger update event.
567 events.trigger(events.RepoGroupUpdateEvent(repo_group))
574 events.trigger(events.RepoGroupUpdateEvent(repo_group))
568
575
576 if affected_user_ids:
577 PermissionModel().trigger_permission_flush(affected_user_ids)
578
569 return repo_group
579 return repo_group
570 except Exception:
580 except Exception:
571 log.error(traceback.format_exc())
581 log.error(traceback.format_exc())
@@ -12,6 +12,12 b''
12 ******************************************************************************/
12 ******************************************************************************/
13 function registerRCRoutes() {
13 function registerRCRoutes() {
14 // routes registration
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 pyroutes.register('admin_audit_log_entry', '/_admin/audit_logs/%(audit_log_id)s', ['audit_log_id']);
21 pyroutes.register('admin_audit_log_entry', '/_admin/audit_logs/%(audit_log_id)s', ['audit_log_id']);
16 pyroutes.register('admin_audit_logs', '/_admin/audit_logs', []);
22 pyroutes.register('admin_audit_logs', '/_admin/audit_logs', []);
17 pyroutes.register('admin_defaults_repositories', '/_admin/defaults/repositories', []);
23 pyroutes.register('admin_defaults_repositories', '/_admin/defaults/repositories', []);
@@ -1331,7 +1331,7 b' var CommentsController = function() {'
1331
1331
1332 // There aren't any comments, we init the `.inline-comments` with `reply-thread-container` first
1332 // There aren't any comments, we init the `.inline-comments` with `reply-thread-container` first
1333 if ($comments.length===0) {
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 var $reply_container = $('#cb-comments-inline-container-template')
1335 var $reply_container = $('#cb-comments-inline-container-template')
1336 $reply_container.find('button.cb-comment-add-button').replaceWith(replBtn);
1336 $reply_container.find('button.cb-comment-add-button').replaceWith(replBtn);
1337 $td.append($($reply_container).html());
1337 $td.append($($reply_container).html());
@@ -115,6 +115,7 b''
115 <li class="${h.is_active('repository_groups', active)}"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
115 <li class="${h.is_active('repository_groups', active)}"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
116 <li class="${h.is_active('users', active)}"><a href="${h.route_path('users')}">${_('Users')}</a></li>
116 <li class="${h.is_active('users', active)}"><a href="${h.route_path('users')}">${_('Users')}</a></li>
117 <li class="${h.is_active('user_groups', active)}"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
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 <li class="${h.is_active('permissions', active)}"><a href="${h.route_path('admin_permissions_application')}">${_('Permissions')}</a></li>
119 <li class="${h.is_active('permissions', active)}"><a href="${h.route_path('admin_permissions_application')}">${_('Permissions')}</a></li>
119 <li class="${h.is_active('authentication', active)}"><a href="${h.route_path('auth_home', traverse='')}">${_('Authentication')}</a></li>
120 <li class="${h.is_active('authentication', active)}"><a href="${h.route_path('auth_home', traverse='')}">${_('Authentication')}</a></li>
120 <li class="${h.is_active('integrations', active)}"><a href="${h.route_path('global_integrations_home')}">${_('Integrations')}</a></li>
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 <div class="radios">
62 <div class="radios">
63 ${h.radio('default_fork_create' + suffix, c.fork_choices[1][0], label=c.fork_choices[1][1], **kwargs)}
63 ${h.radio('default_fork_create' + suffix, c.fork_choices[1][0], label=c.fork_choices[1][1], **kwargs)}
64 ${h.radio('default_fork_create' + suffix, c.fork_choices[0][0], label=c.fork_choices[0][1], **kwargs)}
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 root level repository forks. When disabled, users can still fork repositories inside their own repository groups.')}</span>
65 <span class="help-block">${_('Permission to create repository forks. Root level forks will only work if repository creation is enabled.')}</span>
66 </div>
66 </div>
67 </div>
67 </div>
68 <div class="field">
68 <div class="field">
@@ -24,7 +24,7 b''
24 ## to speed up lookups cache some functions before the loop
24 ## to speed up lookups cache some functions before the loop
25 <%
25 <%
26 active_patterns = h.get_active_pattern_entries(c.repo_name)
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, issues_container=getattr(c, 'referenced_commit_issues', None))
27 urlify_commit_message = h.partial(h.urlify_commit_message, active_pattern_entries=active_patterns)
28 %>
28 %>
29
29
30 %for commit in c.commit_ranges:
30 %for commit in c.commit_ranges:
@@ -57,7 +57,7 b''
57 </td>
57 </td>
58 <td class="mid td-description">
58 <td class="mid td-description">
59 <div class="log-container truncate-wrap">
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 </div>
61 </div>
62 </td>
62 </td>
63 </tr>
63 </tr>
@@ -416,6 +416,12 b''
416 </a>
416 </a>
417 </%def>
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 <%def name="repo_artifact_uid(repo_name, file_uid)">
425 <%def name="repo_artifact_uid(repo_name, file_uid)">
420 <code>${h.shorter(file_uid, size=24, prefix=True)}</code>
426 <code>${h.shorter(file_uid, size=24, prefix=True)}</code>
421 </%def>
427 </%def>
@@ -443,6 +449,7 b''
443 % endif
449 % endif
444 </%def>
450 </%def>
445
451
452
446 <%def name="markup_form(form_id, form_text='', help_text=None)">
453 <%def name="markup_form(form_id, form_text='', help_text=None)">
447
454
448 <div class="markup-form">
455 <div class="markup-form">
@@ -221,7 +221,7 b' if (show_disabled) {'
221 <%= version_info %>
221 <%= version_info %>
222 <% } %>
222 <% } %>
223 <br/>
223 <br/>
224 File: <code><%- file_name -%></code>
224 File: <code><%= file_name -%></code>
225 <% } else { %>
225 <% } else { %>
226 <% if (review_status) { %>
226 <% if (review_status) { %>
227 <i class="icon-circle review-status-<%= review_status %>"></i>
227 <i class="icon-circle review-status-<%= review_status %>"></i>
@@ -27,8 +27,8 b''
27 <%def name="main()">
27 <%def name="main()">
28 ## Container to gather extracted Tickets
28 ## Container to gather extracted Tickets
29 <%
29 <%
30 c.referenced_commit_issues = []
30 c.referenced_commit_issues = h.IssuesRegistry()
31 c.referenced_desc_issues = []
31 c.referenced_desc_issues = h.IssuesRegistry()
32 %>
32 %>
33
33
34 <script type="text/javascript">
34 <script type="text/javascript">
@@ -86,7 +86,7 b''
86 </div>
86 </div>
87
87
88 <div id="pr-desc" class="input" title="${_('Rendered using {} renderer').format(c.renderer)}">
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 </div>
90 </div>
91
91
92 <div id="pr-desc-edit" class="input textarea" style="display: none;">
92 <div id="pr-desc-edit" class="input textarea" style="display: none;">
@@ -435,7 +435,7 b''
435 </td>
435 </td>
436 <td class="mid td-description">
436 <td class="mid td-description">
437 <div class="log-container truncate-wrap">
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 </div>
439 </div>
440 </td>
440 </td>
441 </tr>
441 </tr>
@@ -809,7 +809,7 b''
809 <div class="sidebar-element clear-both">
809 <div class="sidebar-element clear-both">
810 <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${_('Referenced Tickets')}">
810 <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${_('Referenced Tickets')}">
811 <i class="icon-info-circled"></i>
811 <i class="icon-info-circled"></i>
812 ${(len(c.referenced_desc_issues) + len(c.referenced_commit_issues))}
812 ${(c.referenced_desc_issues.issues_unique_count + c.referenced_commit_issues.issues_unique_count)}
813 </div>
813 </div>
814
814
815 <div class="right-sidebar-expanded-state pr-details-title">
815 <div class="right-sidebar-expanded-state pr-details-title">
@@ -822,15 +822,17 b''
822 <table>
822 <table>
823
823
824 <tr><td><code>${_('In pull request description')}:</code></td></tr>
824 <tr><td><code>${_('In pull request description')}:</code></td></tr>
825 % if c.referenced_desc_issues:
825 % if c.referenced_desc_issues.issues:
826 % for ticket_dict in sorted(c.referenced_desc_issues):
826
827 % for ticket_id, ticket_dict in c.referenced_desc_issues.unique_issues.items():
827 <tr>
828 <tr>
828 <td>
829 <td>
829 <a href="${ticket_dict.get('url')}">
830 <a href="${ticket_dict[0].get('url')}">
830 ${ticket_dict.get('id')}
831 ${ticket_id}
831 </a>
832 </a>
832 </td>
833 </td>
833 </tr>
834 </tr>
835
834 % endfor
836 % endfor
835 % else:
837 % else:
836 <tr>
838 <tr>
@@ -841,13 +843,14 b''
841 % endif
843 % endif
842
844
843 <tr><td style="padding-top: 10px"><code>${_('In commit messages')}:</code></td></tr>
845 <tr><td style="padding-top: 10px"><code>${_('In commit messages')}:</code></td></tr>
844 % if c.referenced_commit_issues:
846 % if c.referenced_commit_issues.issues:
845 % for ticket_dict in sorted(c.referenced_commit_issues):
847 % for ticket_id, ticket_dict in c.referenced_commit_issues.unique_issues.items():
846 <tr>
848 <tr>
847 <td>
849 <td>
848 <a href="${ticket_dict.get('url')}">
850 <a href="${ticket_dict[0].get('url')}">
849 ${ticket_dict.get('id')}
851 ${ticket_id}
850 </a>
852 </a>
853 - ${_ungettext('in %s commit', 'in %s commits', len(ticket_dict)) % (len(ticket_dict))}
851 </td>
854 </td>
852 </tr>
855 </tr>
853 % endfor
856 % endfor
@@ -95,7 +95,8 b''
95 var fname = selectedReference.raw_id + ext;
95 var fname = selectedReference.raw_id + ext;
96 var href = pyroutes.url('repo_archivefile', {
96 var href = pyroutes.url('repo_archivefile', {
97 'repo_name': templateContext.repo_name,
97 'repo_name': templateContext.repo_name,
98 'fname': fname
98 'fname': fname,
99 'with_hash': '1'
99 });
100 });
100 // set new label
101 // set new label
101 $(this).html(ico + ' {0}{1}'.format(escapeHtml(e.added.text), ext));
102 $(this).html(ico + ' {0}{1}'.format(escapeHtml(e.added.text), ext));
General Comments 1
Under Review
author

Auto status change to "Under Review"

You need to be logged in to leave comments. Login now

Merge is not currently possible because of below failed checks.

  • - User `default` not allowed to perform merge.
  • - Pull request reviewer approval is pending.