##// END OF EJS Templates
git: use force fetch and update for target ref. This solves a case...
git: use force fetch and update for target ref. This solves a case when in PRs a target is force updated and is out of sync. Before we used a pull which --ff-only fails obviosly because two are out of sync. This change uses new logic that resets the target branch according to the source target branch allowing smooth merge simulation.

File last commit:

r2487:fcee5614 default
r2784:e8c62649 default
Show More
simplegit.py
155 lines | 5.1 KiB | text/x-python | PythonLexer
project: added all source files and assets
r1 # -*- coding: utf-8 -*-
release: update copyright year to 2018
r2487 # Copyright (C) 2010-2018 RhodeCode GmbH
project: added all source files and assets
r1 #
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License, version 3
# (only), as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# This program is dual-licensed. If you wish to learn more about the
# RhodeCode Enterprise Edition, including its added features, Support services,
# and proprietary license terms, please see https://rhodecode.com/licenses/
"""
SimpleGit middleware for handling git protocol request (push/clone etc.)
It's implemented with basic auth function
"""
git-lfs: enable support for detection of git-lfs requests type...
r1565 import os
project: added all source files and assets
r1 import re
vcs: added logging into VCS middlewares
r753 import logging
project: added all source files and assets
r1 import urlparse
import rhodecode
git-lfs: push settings to git-lfs backend stored inside our rhodecode settings...
r1571 from rhodecode.lib import utils
project: added all source files and assets
r1 from rhodecode.lib import utils2
from rhodecode.lib.middleware import simplevcs
vcs: added logging into VCS middlewares
r753 log = logging.getLogger(__name__)
project: added all source files and assets
r1
GIT_PROTO_PAT = re.compile(
git-lfs: enable support for detection of git-lfs requests type...
r1565 r'^/(.+)/(info/refs|info/lfs/(.+)|git-upload-pack|git-receive-pack)')
GIT_LFS_PROTO_PAT = re.compile(r'^/(.+)/(info/lfs/(.+))')
def default_lfs_store():
"""
Default lfs store location, it's consistent with Mercurials large file
store which is in .cache/largefiles
"""
from rhodecode.lib.vcs.backends.git import lfs_store
user_home = os.path.expanduser("~")
return lfs_store(user_home)
project: added all source files and assets
r1
class SimpleGit(simplevcs.SimpleVCS):
SCM = 'git'
def _get_repository_name(self, environ):
"""
Gets repository name out of PATH_INFO header
:param environ: environ where PATH_INFO is stored
"""
repo_name = GIT_PROTO_PAT.match(environ['PATH_INFO']).group(1)
git-lfs: enable support for detection of git-lfs requests type...
r1565 # for GIT LFS, and bare format strip .git suffix from names
if repo_name.endswith('.git'):
repo_name = repo_name[:-4]
project: added all source files and assets
r1 return repo_name
git-lfs: enable support for detection of git-lfs requests type...
r1565 def _get_lfs_action(self, path, request_method):
"""
return an action based on LFS requests type.
Those routes are handled inside vcsserver app.
batch -> POST to /info/lfs/objects/batch => PUSH/PULL
batch is based on the `operation.
that could be download or upload, but those are only
instructions to fetch so we return pull always
download -> GET to /info/lfs/{oid} => PULL
upload -> PUT to /info/lfs/{oid} => PUSH
verification -> POST to /info/lfs/verify => PULL
"""
match_obj = GIT_LFS_PROTO_PAT.match(path)
_parts = match_obj.groups()
repo_name, path, operation = _parts
log.debug(
'LFS: detecting operation based on following '
'data: %s, req_method:%s', _parts, request_method)
if operation == 'verify':
return 'pull'
elif operation == 'objects/batch':
# batch sends back instructions for API to dl/upl we report it
# as pull
if request_method == 'POST':
return 'pull'
elif operation:
# probably a OID, upload is PUT, download a GET
if request_method == 'GET':
return 'pull'
else:
return 'push'
# if default not found require push, as action
return 'push'
project: added all source files and assets
r1 _ACTION_MAPPING = {
'git-receive-pack': 'push',
'git-upload-pack': 'pull',
}
def _get_action(self, environ):
"""
Maps git request commands into a pull or push command.
In case of unknown/unexpected data, it returns 'pull' to be safe.
:param environ:
"""
path = environ['PATH_INFO']
if path.endswith('/info/refs'):
query = urlparse.parse_qs(environ['QUERY_STRING'])
service_cmd = query.get('service', [''])[0]
return self._ACTION_MAPPING.get(service_cmd, 'pull')
git-lfs: enable support for detection of git-lfs requests type...
r1565
elif GIT_LFS_PROTO_PAT.match(environ['PATH_INFO']):
return self._get_lfs_action(
environ['PATH_INFO'], environ['REQUEST_METHOD'])
project: added all source files and assets
r1 elif path.endswith('/git-receive-pack'):
return 'push'
elif path.endswith('/git-upload-pack'):
return 'pull'
return 'pull'
def _create_wsgi_app(self, repo_path, repo_name, config):
Martin Bornhold
pyro4: Add the custom header `X-RhodeCode-Backend` to the pyro4 backend responses....
r848 return self.scm_app.create_git_wsgi_app(
Martin Bornhold
vcs: Do not pass the backend key into the scm app instances....
r951 repo_path, repo_name, config)
project: added all source files and assets
r1
def _create_config(self, extras, repo_name):
extras['git_update_server_info'] = utils2.str2bool(
rhodecode.CONFIG.get('git_update_server_info'))
git-lfs: enable support for detection of git-lfs requests type...
r1565
git-lfs: push settings to git-lfs backend stored inside our rhodecode settings...
r1571 config = utils.make_db_config(repo=repo_name)
custom_store = config.get('vcs_git_lfs', 'store_location')
git-lfs: enable support for detection of git-lfs requests type...
r1565
git-lfs: push settings to git-lfs backend stored inside our rhodecode settings...
r1571 extras['git_lfs_enabled'] = utils2.str2bool(
config.get('vcs_git_lfs', 'enabled'))
extras['git_lfs_store_path'] = custom_store or default_lfs_store()
project: added all source files and assets
r1 return extras