def build_targets(): for pyver in PY_VERSIONS: run_setup("bdist_egg", pyver) built_files.append("dist/%s-%s-py%s.egg" % (PACKAGE_NAME, get_package_version(), pyver)) run_setup("sdist") built_files.append("dist/%s-%s.tar.gz" % (PACKAGE_NAME, get_package_version()))
def get(self, request, *args, **kwargs): """Returns the information on the Review Board server.""" site = Site.objects.get_current() siteconfig = SiteConfiguration.objects.get_current() url = '%s://%s%s' % (siteconfig.get('site_domain_method'), site.domain, local_site_reverse('root', request=request)) return 200, { self.item_result_key: { 'product': { 'name': 'Review Board', 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), }, 'site': { 'url': url, 'administrators': [{'name': name, 'email': email} for name, email in settings.ADMINS], 'time_zone': settings.TIME_ZONE, }, 'capabilities': { 'diffs': { 'base_commit_ids': True, 'moved_files': True, }, 'scmtools': { 'perforce': { 'moved_files': True, }, }, }, }, }
def get_server_info(request=None): """Returns server information for use in the API. This is used for the root resource and for the deprecated server info resource. """ capabilities = _capabilities_defaults.copy() capabilities.update(_registered_capabilities) return { 'product': { 'name': 'Review Board', 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), }, 'site': { 'url': get_server_url(request=request), 'administrators': [{ 'name': name, 'email': email, } for name, email in settings.ADMINS], 'time_zone': settings.TIME_ZONE, }, 'capabilities': capabilities }
def get_server_info(request=None): """Return server information for use in the API. This is used for the root resource and for the deprecated server info resource. Args: request (django.http.HttpRequest, optional): The HTTP request from the client. Returns: dict: A dictionary of information about the server and its capabilities. """ return { 'product': { 'name': 'Review Board', 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), }, 'site': { 'url': get_server_url(request=request), 'administrators': [ { 'name': name, 'email': email, } for name, email in settings.ADMINS ], 'time_zone': settings.TIME_ZONE, }, 'capabilities': get_capabilities(request=request), }
def version(request): return { 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), 'version_raw': VERSION, }
def get_support_url(request): """Returns the URL for the configured support page.""" siteconfig = SiteConfiguration.objects.get_current() support_url = siteconfig.get("support_url") if not support_url: support_data = base64.b64encode( "\t".join( [ get_install_key(), str(int(request.user.is_staff)), siteconfig.site.domain, siteconfig.get("site_admin_name"), siteconfig.get("site_admin_email"), get_package_version(), str(User.objects.filter(is_active=True).count()), str(int(time.mktime(datetime.now().timetuple()))), ] ) ) support_url = settings.DEFAULT_SUPPORT_URL % {"support_data": support_data} return support_url
def get_server_info(request=None): """Return server information for use in the API. This is used for the root resource and for the deprecated server info resource. Args: request (django.http.HttpRequest, optional): The HTTP request from the client. Returns: dict: A dictionary of information about the server and its capabilities. """ return { 'product': { 'name': 'Review Board', 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), }, 'site': { 'url': get_server_url(request=request), 'administrators': [{ 'name': name, 'email': email, } for name, email in settings.ADMINS], 'time_zone': settings.TIME_ZONE, }, 'capabilities': get_capabilities(request=request), }
def get_server_info(request=None): """Returns server information for use in the API. This is used for the root resource and for the deprecated server info resource. """ capabilities = _capabilities_defaults.copy() capabilities.update(_registered_capabilities) return { 'product': { 'name': 'Review Board', 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), }, 'site': { 'url': get_server_url(request=request), 'administrators': [ { 'name': name, 'email': email, } for name, email in settings.ADMINS ], 'time_zone': settings.TIME_ZONE, }, 'capabilities': capabilities }
def version(request): return { 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), 'version_raw': VERSION, 'RB_MANUAL_URL': get_manual_url(), }
def get_server_info(request=None): """Returns server information for use in the API. This is used for the root resource and for the deprecated server info resource. """ site = Site.objects.get_current() siteconfig = SiteConfiguration.objects.get_current() url = '%s://%s%s' % (siteconfig.get('site_domain_method'), site.domain, local_site_reverse('root', request=request)) return { 'product': { 'name': 'Review Board', 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), }, 'site': { 'url': url, 'administrators': [ { 'name': name, 'email': email, } for name, email in settings.ADMINS ], 'time_zone': settings.TIME_ZONE, }, 'capabilities': { 'diffs': { 'base_commit_ids': True, 'moved_files': True, }, 'review_requests': { 'commit_ids': True, }, 'scmtools': { 'git': { 'empty_files': True, }, 'mercurial': { 'empty_files': True, }, 'perforce': { 'moved_files': True, 'empty_files': True, }, 'svn': { 'empty_files': True, }, }, 'text': { 'markdown': True, }, } }
def version(request): """Return a dictionary with version information.""" return { 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), 'version_raw': VERSION, 'RB_MANUAL_URL': get_manual_url(), }
def dispatch_webhook_event(request, webhook_targets, event, payload): """Dispatch the given event and payload to the given WebHook targets.""" encoder = ResourceAPIEncoder() bodies = {} for webhook_target in webhook_targets: if webhook_target.use_custom_content: try: body = render_custom_content(webhook_target.custom_content, payload) except Exception as e: logging.exception("Could not render WebHook payload: %s", e) continue else: encoding = webhook_target.encoding if encoding not in bodies: try: if encoding == webhook_target.ENCODING_JSON: adapter = JSONEncoderAdapter(encoder) body = adapter.encode(payload, request=request) elif encoding == webhook_target.ENCODING_XML: adapter = XMLEncoderAdapter(encoder) body = adapter.encode(payload, request=request) elif encoding == webhook_target.ENCODING_FORM_DATA: adapter = JSONEncoderAdapter(encoder) body = urlencode({"payload": adapter.encode(payload, request=request)}) else: logging.error( 'Unexpected WebHookTarget encoding "%s" ' "for ID %s", encoding, webhook_target.pk ) continue except Exception as e: logging.exception("Could not encode WebHook payload: %s", e) continue body = body.encode("utf-8") bodies[encoding] = body else: body = bodies[encoding] headers = { "X-ReviewBoard-Event": event, "Content-Type": webhook_target.encoding, "Content-Length": len(body), "User-Agent": "ReviewBoard-WebHook/%s" % get_package_version(), } if webhook_target.secret: signer = hmac.new(webhook_target.secret.encode("utf-8"), body, hashlib.sha1) headers["X-Hub-Signature"] = "sha1=%s" % signer.hexdigest() logging.info("Dispatching webhook for event %s to %s", event, webhook_target.url) try: urlopen(Request(webhook_target.url, body, headers)) except Exception as e: logging.exception("Could not dispatch WebHook to %s: %s", webhook_target.url, e)
def get_server_info(request=None): """Returns server information for use in the API. This is used for the root resource and for the deprecated server info resource. """ return { 'product': { 'name': 'Review Board', 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), }, 'site': { 'url': get_server_url(request=request), 'administrators': [ { 'name': name, 'email': email, } for name, email in settings.ADMINS ], 'time_zone': settings.TIME_ZONE, }, 'capabilities': { 'diffs': { 'base_commit_ids': True, 'moved_files': True, }, 'review_requests': { 'commit_ids': True, }, 'scmtools': { 'git': { 'empty_files': True, }, 'mercurial': { 'empty_files': True, }, 'perforce': { 'moved_files': True, 'empty_files': True, }, 'svn': { 'empty_files': True, }, }, 'text': { 'markdown': True, 'per_field_text_types': True, 'can_include_raw_values': True, }, } }
def dispatch_webhook_event(request, webhook_targets, event, payload): """Dispatch the given event and payload to the given webhook targets.""" encoder = BasicAPIEncoder() bodies = {} for webhook_target in webhook_targets: if webhook_target.use_custom_content: body = render_custom_content(webhook_target.custom_content, payload) else: encoding = webhook_target.encoding if encoding not in bodies: if encoding == webhook_target.ENCODING_JSON: adapter = JSONEncoderAdapter(encoder) body = adapter.encode(payload, request=request) elif encoding == webhook_target.ENCODING_XML: adapter = XMLEncoderAdapter(encoder) body = adapter.encode(payload, request=request) elif encoding == webhook_target.ENCODING_FORM_DATA: adapter = JSONEncoderAdapter(encoder) body = urlencode({ 'payload': adapter.encode(payload, request=request), }) else: logging.error( 'Unexpected WebHookTarget encoding "%s" for ' 'ID %s', encoding, webhook_target.pk) continue body = body.encode('utf-8') bodies[encoding] = body else: body = bodies[encoding] headers = { 'X-ReviewBoard-Event': event, 'Content-Type': webhook_target.encoding, 'Content-Length': len(body), 'User-Agent': 'ReviewBoard-WebHook/%s' % get_package_version(), } if webhook_target.secret: signer = hmac.new(webhook_target.secret.encode('utf-8'), body) headers['X-Hub-Signature'] = 'sha1=%s' % signer.hexdigest() logging.info('Dispatching webhook for event %s to %s', event, webhook_target.url) urlopen(Request(webhook_target.url, body, headers))
def dispatch_webhook_event(request, webhook_targets, event, payload): """Dispatch the given event and payload to the given webhook targets.""" encoder = BasicAPIEncoder() bodies = {} for webhook_target in webhook_targets: if webhook_target.use_custom_content: body = render_custom_content(webhook_target.custom_content, payload) else: encoding = webhook_target.encoding if encoding not in bodies: if encoding == webhook_target.ENCODING_JSON: adapter = JSONEncoderAdapter(encoder) body = adapter.encode(payload, request=request) elif encoding == webhook_target.ENCODING_XML: adapter = XMLEncoderAdapter(encoder) body = adapter.encode(payload, request=request) elif encoding == webhook_target.ENCODING_FORM_DATA: adapter = JSONEncoderAdapter(encoder) body = urlencode({ 'payload': adapter.encode(payload, request=request), }) else: logging.error('Unexpected WebHookTarget encoding "%s" for ' 'ID %s', encoding, webhook_target.pk) continue body = body.encode('utf-8') bodies[encoding] = body else: body = bodies[encoding] headers = { 'X-ReviewBoard-Event': event, 'Content-Type': webhook_target.encoding, 'Content-Length': len(body), 'User-Agent': 'ReviewBoard-WebHook/%s' % get_package_version(), } if webhook_target.secret: signer = hmac.new(webhook_target.secret.encode('utf-8'), body) headers['X-Hub-Signature'] = 'sha1=%s' % signer.hexdigest() logging.info('Dispatching webhook for event %s to %s', event, webhook_target.url) urlopen(Request(webhook_target.url, body, headers))
def server_info(request): site = Site.objects.get_current() siteconfig = site.config.get() url = "%s://%s%s" % (siteconfig.get("site_domain_method"), site.domain, settings.SITE_ROOT) return WebAPIResponse( request, { "product": { "name": "Review Board", "version": get_version_string(), "package_version": get_package_version(), "is_release": is_release(), }, "site": {"url": url, "administrators": [{"name": name, "email": email} for name, email in settings.ADMINS]}, }, )
def version(request): """Return a dictionary with version information. Args: request (django.http.HttpRequest): The current HTTP request. Returns: dict: State to add to the context. """ return { 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), 'version_raw': VERSION, 'RB_MANUAL_URL': get_manual_url(), }
def serialize_support_data(request=None, force_is_admin=False): """Serializes support data into a base64-encoded string.""" siteconfig = SiteConfiguration.objects.get_current() is_admin = (force_is_admin or (request is not None and request.user.is_staff)) return base64.b64encode('\t'.join([ get_install_key(), '%d' % is_admin, siteconfig.site.domain, _norm_siteconfig_value(siteconfig, 'site_admin_name'), _norm_siteconfig_value(siteconfig, 'site_admin_email'), get_package_version(), '%d' % User.objects.filter(is_active=True).count(), '%d' % int(time.mktime(datetime.now().timetuple())), _norm_siteconfig_value(siteconfig, 'company'), '%s.%s.%s' % sys.version_info[:3], ]))
def serialize_support_data(request=None, force_is_admin=False): """Serialize support data into a base64-encoded string.""" siteconfig = SiteConfiguration.objects.get_current() is_admin = (force_is_admin or (request is not None and request.user.is_staff)) return base64.b64encode('\t'.join([ get_install_key(), '%d' % is_admin, siteconfig.site.domain, _norm_siteconfig_value(siteconfig, 'site_admin_name'), _norm_siteconfig_value(siteconfig, 'site_admin_email'), get_package_version(), '%d' % User.objects.filter(is_active=True).count(), '%d' % int(time.mktime(datetime.now().timetuple())), _norm_siteconfig_value(siteconfig, 'company'), '%s.%s.%s' % sys.version_info[:3], ]).encode('utf-8')).decode('utf-8')
def server_info(request): site = Site.objects.get_current() siteconfig = site.config.get() url = '%s://%s%s' % (siteconfig.get('site_domain_method'), site.domain, settings.SITE_ROOT) return WebAPIResponse(request, { 'product': { 'name': 'Review Board', 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), }, 'site': { 'url': url, 'administrators': [{'name': name, 'email': email} for name, email in settings.ADMINS], }, })
def compare_item(self, item_rsp, obj): self.assertIn('product', item_rsp) self.assertIn('site', item_rsp) self.assertIn('capabilities', item_rsp) product_rsp = item_rsp['product'] self.assertEqual(product_rsp['name'], 'Review Board') self.assertEqual(product_rsp['version'], get_version_string()) self.assertEqual(product_rsp['package_version'], get_package_version()) self.assertEqual(product_rsp['is_release'], is_release()) site_rsp = item_rsp['site'] self.assertTrue(site_rsp['url'].startswith(get_server_url())) self.assertEqual(site_rsp['administrators'], [{ 'name': name, 'email': email, } for name, email in settings.ADMINS]) self.assertEqual(site_rsp['time_zone'], settings.TIME_ZONE) self.assertEqual(item_rsp['capabilities'], get_capabilities())
def get(self, request, *args, **kwargs): """Returns the information on the Review Board server.""" site = Site.objects.get_current() siteconfig = SiteConfiguration.objects.get_current() url = '%s://%s%s' % (siteconfig.get('site_domain_method'), site.domain, local_site_reverse('root', request=request)) return 200, { self.item_result_key: { 'product': { 'name': 'Review Board', 'version': get_version_string(), 'package_version': get_package_version(), 'is_release': is_release(), }, 'site': { 'url': url, 'administrators': [{ 'name': name, 'email': email } for name, email in settings.ADMINS], 'time_zone': settings.TIME_ZONE, }, 'capabilities': { 'diffs': { 'base_commit_ids': True, 'moved_files': True, }, 'scmtools': { 'perforce': { 'moved_files': True, }, }, }, }, }
def compare_item(self, item_rsp, obj): self.assertIn('product', item_rsp) self.assertIn('site', item_rsp) self.assertIn('capabilities', item_rsp) product_rsp = item_rsp['product'] self.assertEqual(product_rsp['name'], 'Review Board') self.assertEqual(product_rsp['version'], get_version_string()) self.assertEqual(product_rsp['package_version'], get_package_version()) self.assertEqual(product_rsp['is_release'], is_release()) site_rsp = item_rsp['site'] self.assertTrue(site_rsp['url'].startswith(get_server_url())) self.assertEqual(site_rsp['administrators'], [ { 'name': name, 'email': email, } for name, email in settings.ADMINS ]) self.assertEqual(site_rsp['time_zone'], settings.TIME_ZONE) self.assertEqual(item_rsp['capabilities'], get_capabilities())
def get_support_url(request): """Returns the URL for the configured support page.""" siteconfig = SiteConfiguration.objects.get_current() support_url = siteconfig.get('support_url') if not support_url: support_data = base64.b64encode('\t'.join([ get_install_key(), '%d' % int(request.user.is_staff), siteconfig.site.domain, siteconfig.get('site_admin_name'), siteconfig.get('site_admin_email'), get_package_version(), '%d' % User.objects.filter(is_active=True).count(), '%d' % int(time.mktime(datetime.now().timetuple())), ])) support_url = settings.DEFAULT_SUPPORT_URL % { 'support_data': support_data, } return support_url
def dispatch_webhook_event(request, webhook_targets, event, payload): """Dispatch the given event and payload to the given WebHook targets. Args: request (django.http.HttpRequest): The HTTP request from the client. webhook_targets (list of reviewboard.notifications.models.WebHookTarget): The list of WebHook targets containing endpoint URLs to dispatch to. event (unicode): The name of the event being dispatched. payload (dict): The payload data to encode for the WebHook payload. Raises: ValueError: There was an error with the payload format. Details are in the log and the exception message. """ try: payload = normalize_webhook_payload(payload, request) except TypeError as e: logging.exception('WebHook payload passed to dispatch_webhook_event ' 'containing invalid data types: %s', e) raise ValueError(six.text_type(e)) encoder = BasicAPIEncoder() bodies = {} for webhook_target in webhook_targets: if webhook_target.use_custom_content: try: body = render_custom_content(webhook_target.custom_content, payload) body = body.encode('utf-8') except Exception as e: logging.exception('Could not render WebHook payload: %s', e) continue else: encoding = webhook_target.encoding if encoding not in bodies: try: if encoding == webhook_target.ENCODING_JSON: adapter = JSONEncoderAdapter(encoder) body = adapter.encode(payload, request=request) body = body.encode('utf-8') elif encoding == webhook_target.ENCODING_XML: adapter = XMLEncoderAdapter(encoder) body = adapter.encode(payload, request=request) elif encoding == webhook_target.ENCODING_FORM_DATA: adapter = JSONEncoderAdapter(encoder) body = urlencode({ 'payload': adapter.encode(payload, request=request), }) body = body.encode('utf-8') else: logging.error('Unexpected WebHookTarget encoding "%s" ' 'for ID %s', encoding, webhook_target.pk) continue except Exception as e: logging.exception('Could not encode WebHook payload: %s', e) continue bodies[encoding] = body else: body = bodies[encoding] headers = { b'X-ReviewBoard-Event': event.encode('utf-8'), b'Content-Type': webhook_target.encoding.encode('utf-8'), b'Content-Length': len(body), b'User-Agent': ('ReviewBoard-WebHook/%s' % get_package_version()) .encode('utf-8'), } if webhook_target.secret: signer = hmac.new(webhook_target.secret.encode('utf-8'), body, hashlib.sha1) headers[b'X-Hub-Signature'] = \ ('sha1=%s' % signer.hexdigest()).encode('utf-8') logging.info('Dispatching webhook for event %s to %s', event, webhook_target.url) try: url = webhook_target.url url_parts = urlsplit(url) if url_parts.username or url_parts.password: netloc = url_parts.netloc.split('@', 1)[1] url = urlunsplit( (url_parts.scheme, netloc, url_parts.path, url_parts.params, url_parts.query)) password_mgr = HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password( None, url, url_parts.username, url_parts.password) handler = HTTPBasicAuthHandler(password_mgr) opener = build_opener(handler) else: opener = build_opener() opener.open(Request(url.encode('utf-8'), body, headers)) except Exception as e: logging.exception('Could not dispatch WebHook to %s: %s', webhook_target.url, e)
from setuptools import setup, find_packages from setuptools.command.develop import develop from setuptools.command.egg_info import egg_info from reviewboard import get_package_version, VERSION from reviewboard.dependencies import build_dependency_list, package_dependencies # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. if sys.hexversion < 0x02050000: sys.stderr.write( "Review Board %s is incompatible with your version of Python.\n" "Please install Review Board 1.6.x or upgrade Python to at least " "2.6.x (preferably 2.7).\n" % get_package_version() ) sys.exit(1) elif sys.hexversion < 0x02060500: sys.stderr.write( "Review Board %s is incompatible with your version of Python.\n" "Please install Review Board 1.7.x or upgrade Python to at least " "2.6.5 (preferably 2.7).\n" % get_package_version() ) sys.exit(1) # Make sure we're actually in the directory containing setup.py. root_dir = os.path.dirname(__file__) if root_dir != "":
is_packaging = ('sdist' in sys.argv or 'bdist_egg' in sys.argv or 'bdist_wheel' in sys.argv or 'install' in sys.argv) # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. pyver = sys.version_info[:2] if pyver < (2, 7): sys.stderr.write( 'Review Board %s is incompatible with your version of Python.\n' 'Please install Review Board 3.0.x or upgrade Python to 2.7.\n' % get_package_version()) sys.exit(1) elif (3, 0) <= pyver <= (3, 4) or (pyver >= (3, 5) and is_packaging): sys.stderr.write( 'Review Board %s is incompatible with your version of Python.\n' 'Please install using Python 2.7.\n' % get_package_version()) sys.exit(1) # Make sure we're actually in the directory containing setup.py. root_dir = os.path.dirname(__file__) if root_dir != '': os.chdir(root_dir)
package_dependencies, package_only_dependencies) is_packaging = ('sdist' in sys.argv or 'bdist_egg' in sys.argv or 'bdist_wheel' in sys.argv or 'install' in sys.argv) # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. pyver = sys.version_info[:2] if pyver < PYTHON_MIN_VERSION: sys.stderr.write( 'Review Board %s is incompatible with your version of Python.\n' 'Please install Review Board 4.0.x or upgrade to Python %s or ' 'newer.\n' % (get_package_version(), PYTHON_MIN_VERSION_STR)) sys.exit(1) # NOTE: When updating, make sure you update the classifiers below. SUPPORTED_PYVERS = ['3.7', '3.8', '3.9', '3.10'] if '--all-pyvers' in sys.argv: new_argv = sys.argv[1:] new_argv.remove('--all-pyvers') for pyver in SUPPORTED_PYVERS: result = os.system( subprocess.list2cmdline(['python%s' % pyver, __file__] + new_argv)) if result != 0: sys.exit(result)
def tag_release(): execute("git tag release-%s" % get_package_version())
use_setuptools() from setuptools import setup, find_packages from setuptools.command.egg_info import egg_info from distutils.command.install_data import install_data from distutils.command.install import INSTALL_SCHEMES from distutils.core import Command from reviewboard import get_package_version, is_release, VERSION # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. if sys.hexversion < 0x02050000: sys.stderr.write('Review Board %s is incompatible with your version of ' 'Python.\n' % get_package_version()) sys.stderr.write('Please install Review Board 1.6.x, or ' 'upgrade\n') sys.stderr.write('Python to a newer 2.x version (preferably 2.7).\n') sys.exit(1) elif sys.hexversion < 0x02060000: markdown_requirement = 'markdown==2.2.1' else: markdown_requirement = 'markdown>=2.2.1' # Make sure we're actually in the directory containing setup.py. root_dir = os.path.dirname(__file__) if root_dir != "": os.chdir(root_dir) # Tell distutils to put the data_files in platform-specific installation
from setuptools import setup, find_packages from setuptools.command.egg_info import egg_info from distutils.command.install_data import install_data from distutils.command.install import INSTALL_SCHEMES from distutils.core import Command from reviewboard import get_package_version, is_release, VERSION # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. if sys.hexversion < 0x02050000: sys.stderr.write("Review Board %s is incompatible with your version of " "Python.\n" % get_package_version()) sys.stderr.write("Please install Review Board 1.6.x, or " "upgrade\n") sys.stderr.write("Python to a newer 2.x version (preferably 2.7).\n") sys.exit(1) # Make sure we're actually in the directory containing setup.py. root_dir = os.path.dirname(__file__) if root_dir != "": os.chdir(root_dir) # Tell distutils to put the data_files in platform-specific installation # locations. See here for an explanation: # http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb
def dispatch_webhook_event(request, webhook_targets, event, payload): """Dispatch the given event and payload to the given WebHook targets.""" encoder = ResourceAPIEncoder() bodies = {} for webhook_target in webhook_targets: if webhook_target.use_custom_content: try: body = render_custom_content(webhook_target.custom_content, payload) body = body.encode('utf-8') except Exception as e: logging.exception('Could not render WebHook payload: %s', e) continue else: encoding = webhook_target.encoding if encoding not in bodies: try: if encoding == webhook_target.ENCODING_JSON: adapter = JSONEncoderAdapter(encoder) body = adapter.encode(payload, request=request) body = body.encode('utf-8') elif encoding == webhook_target.ENCODING_XML: adapter = XMLEncoderAdapter(encoder) body = adapter.encode(payload, request=request) elif encoding == webhook_target.ENCODING_FORM_DATA: adapter = JSONEncoderAdapter(encoder) body = urlencode({ 'payload': adapter.encode(payload, request=request), }) body = body.encode('utf-8') else: logging.error( 'Unexpected WebHookTarget encoding "%s" ' 'for ID %s', encoding, webhook_target.pk) continue except Exception as e: logging.exception('Could not encode WebHook payload: %s', e) continue bodies[encoding] = body else: body = bodies[encoding] headers = { b'X-ReviewBoard-Event': event.encode('utf-8'), b'Content-Type': webhook_target.encoding.encode('utf-8'), b'Content-Length': len(body), b'User-Agent': ('ReviewBoard-WebHook/%s' % get_package_version()).encode('utf-8'), } if webhook_target.secret: signer = hmac.new(webhook_target.secret.encode('utf-8'), body, hashlib.sha1) headers[b'X-Hub-Signature'] = \ ('sha1=%s' % signer.hexdigest()).encode('utf-8') logging.info('Dispatching webhook for event %s to %s', event, webhook_target.url) try: url = webhook_target.url.encode('utf-8') urlopen(Request(url, body, headers)) except Exception as e: logging.exception('Could not dispatch WebHook to %s: %s', webhook_target.url, e)
from setuptools.command.egg_info import egg_info from distutils.command.install_data import install_data from distutils.command.install import INSTALL_SCHEMES from distutils.core import Command from reviewboard import (get_package_version, VERSION, django_version) # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. if sys.hexversion < 0x02050000: sys.stderr.write( 'Review Board %s is incompatible with your version of Python.\n' 'Please install Review Board 1.6.x or upgrade Python to at least ' '2.6.x (preferably 2.7).\n' % get_package_version()) sys.exit(1) elif sys.hexversion < 0x02060500: sys.stderr.write( 'Review Board %s is incompatible with your version of Python.\n' 'Please install Review Board 1.7.x or upgrade Python to at least ' '2.6.5 (preferably 2.7).\n' % get_package_version()) sys.exit(1) # Make sure we're actually in the directory containing setup.py. root_dir = os.path.dirname(__file__) if root_dir != "": os.chdir(root_dir) # Tell distutils to put the data_files in platform-specific installation
def dispatch_webhook_event(request, webhook_targets, event, payload): """Dispatch the given event and payload to the given WebHook targets. Args: request (django.http.HttpRequest): The HTTP request from the client. webhook_targets (list of reviewboard.notifications.models.WebHookTarget): The list of WebHook targets containing endpoint URLs to dispatch to. event (unicode): The name of the event being dispatched. payload (dict): The payload data to encode for the WebHook payload. Raises: ValueError: There was an error with the payload format. Details are in the log and the exception message. """ encoder = BasicAPIEncoder() bodies = {} raw_norm_payload = None json_norm_payload = None for webhook_target in webhook_targets: use_custom_content = webhook_target.use_custom_content encoding = webhook_target.encoding # See how we need to handle normalizing this payload. If we need # something JSON-safe, then we need to go the more aggressive route # and normalize keys to strings. if raw_norm_payload is None or json_norm_payload is None: try: if (raw_norm_payload is None and (use_custom_content or encoding == webhook_target.ENCODING_XML)): # This payload's going to be provided for XML and custom # templates. We don't want to alter the keys at all. raw_norm_payload = normalize_webhook_payload( payload=payload, request=request) elif (json_norm_payload is None and not use_custom_content and encoding in (webhook_target.ENCODING_JSON, webhook_target.ENCODING_FORM_DATA)): # This payload's going to be provided for JSON or # form-data. We want to normalize all keys to strings. json_norm_payload = normalize_webhook_payload( payload=payload, request=request, use_string_keys=True) except TypeError as e: logging.exception( 'WebHook payload passed to ' 'dispatch_webhook_event containing invalid ' 'data types: %s', e) raise ValueError(six.text_type(e)) if use_custom_content: try: assert raw_norm_payload is not None body = render_custom_content(webhook_target.custom_content, raw_norm_payload) body = force_bytes(body) except Exception as e: logging.exception('Could not render WebHook payload: %s', e) continue else: if encoding not in bodies: try: if encoding == webhook_target.ENCODING_JSON: assert json_norm_payload is not None adapter = JSONEncoderAdapter(encoder) body = adapter.encode(json_norm_payload, request=request) elif encoding == webhook_target.ENCODING_XML: assert raw_norm_payload is not None adapter = XMLEncoderAdapter(encoder) body = adapter.encode(raw_norm_payload, request=request) elif encoding == webhook_target.ENCODING_FORM_DATA: assert json_norm_payload is not None adapter = JSONEncoderAdapter(encoder) body = urlencode({ 'payload': adapter.encode(json_norm_payload, request=request), }) else: logging.error( 'Unexpected WebHookTarget encoding "%s" ' 'for ID %s', encoding, webhook_target.pk) continue except Exception as e: logging.exception('Could not encode WebHook payload: %s', e) continue body = force_bytes(body) bodies[encoding] = body else: body = bodies[encoding] headers = { b'X-ReviewBoard-Event': event.encode('utf-8'), b'Content-Type': webhook_target.encoding.encode('utf-8'), b'Content-Length': len(body), b'User-Agent': ('ReviewBoard-WebHook/%s' % get_package_version()).encode('utf-8'), } if webhook_target.secret: signer = hmac.new(webhook_target.secret.encode('utf-8'), body, hashlib.sha1) headers[b'X-Hub-Signature'] = \ ('sha1=%s' % signer.hexdigest()).encode('utf-8') logging.info('Dispatching webhook for event %s to %s', event, webhook_target.url) try: url = webhook_target.url url_parts = urlsplit(url) if url_parts.username or url_parts.password: credentials, netloc = url_parts.netloc.split('@', 1) url = urlunsplit((url_parts.scheme, netloc, url_parts.path, url_parts.query, url_parts.fragment)) headers[b'Authorization'] = \ b'Basic %s' % b64encode(credentials.encode('utf-8')) urlopen(Request(url.encode('utf-8'), body, headers)) except Exception as e: logging.exception('Could not dispatch WebHook to %s: %s', webhook_target.url, e) if isinstance(e, HTTPError): logging.info('Error response from %s: %s %s\n%s', webhook_target.url, e.code, e.reason, e.read())
from distutils.command.install import INSTALL_SCHEMES from distutils.core import Command from reviewboard import (get_package_version, VERSION, django_version) # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. if sys.hexversion < 0x02050000: sys.stderr.write( 'Review Board %s is incompatible with your version of Python.\n' 'Please install Review Board 1.6.x or upgrade Python to at least ' '2.6.x (preferably 2.7).\n' % get_package_version()) sys.exit(1) elif sys.hexversion < 0x02060500: sys.stderr.write( 'Review Board %s is incompatible with your version of Python.\n' 'Please install Review Board 1.7.x or upgrade Python to at least ' '2.6.5 (preferably 2.7).\n' % get_package_version()) sys.exit(1) # Make sure we're actually in the directory containing setup.py. root_dir = os.path.dirname(__file__) if root_dir != "": os.chdir(root_dir)
def dispatch_webhook_event(request, webhook_targets, event, payload): """Dispatch the given event and payload to the given WebHook targets.""" encoder = ResourceAPIEncoder() bodies = {} for webhook_target in webhook_targets: if webhook_target.use_custom_content: try: body = render_custom_content(webhook_target.custom_content, payload) body = body.encode('utf-8') except Exception as e: logging.exception('Could not render WebHook payload: %s', e) continue else: encoding = webhook_target.encoding if encoding not in bodies: try: if encoding == webhook_target.ENCODING_JSON: adapter = JSONEncoderAdapter(encoder) body = adapter.encode(payload, request=request) body = body.encode('utf-8') elif encoding == webhook_target.ENCODING_XML: adapter = XMLEncoderAdapter(encoder) body = adapter.encode(payload, request=request) elif encoding == webhook_target.ENCODING_FORM_DATA: adapter = JSONEncoderAdapter(encoder) body = urlencode({ 'payload': adapter.encode(payload, request=request), }) body = body.encode('utf-8') else: logging.error( 'Unexpected WebHookTarget encoding "%s" ' 'for ID %s', encoding, webhook_target.pk) continue except Exception as e: logging.exception('Could not encode WebHook payload: %s', e) continue bodies[encoding] = body else: body = bodies[encoding] headers = { b'X-ReviewBoard-Event': event.encode('utf-8'), b'Content-Type': webhook_target.encoding.encode('utf-8'), b'Content-Length': len(body), b'User-Agent': ('ReviewBoard-WebHook/%s' % get_package_version()).encode('utf-8'), } if webhook_target.secret: signer = hmac.new(webhook_target.secret.encode('utf-8'), body, hashlib.sha1) headers[b'X-Hub-Signature'] = \ ('sha1=%s' % signer.hexdigest()).encode('utf-8') logging.info('Dispatching webhook for event %s to %s', event, webhook_target.url) try: url = webhook_target.url url_parts = urlsplit(url) if url_parts.username or url_parts.password: netloc = url_parts.netloc.split('@', 1)[1] url = urlunsplit((url_parts.scheme, netloc, url_parts.path, url_parts.params, url_parts.query)) password_mgr = HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(None, url, url_parts.username, url_parts.password) handler = HTTPBasicAuthHandler(password_mgr) opener = build_opener(handler) else: opener = build_opener() opener.open(Request(url.encode('utf-8'), body, headers)) except Exception as e: logging.exception('Could not dispatch WebHook to %s: %s', webhook_target.url, e)
from setuptools.command.egg_info import egg_info from reviewboard import get_package_version, VERSION from reviewboard.dependencies import (build_dependency_list, package_dependencies, package_only_dependencies) # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. if sys.hexversion < 0x02070000: sys.stderr.write( 'Review Board %s is incompatible with your version of Python.\n' 'Please install Review Board 2.5.x or upgrade Python to at least ' '2.7.\n' % get_package_version()) sys.exit(1) # Make sure we're actually in the directory containing setup.py. root_dir = os.path.dirname(__file__) if root_dir != '': os.chdir(root_dir) # Tell distutils to put the data_files in platform-specific installation # locations. See here for an explanation: # http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb for scheme in INSTALL_SCHEMES.values(): scheme['data'] = scheme['purelib']
action='store_true', help='whether to tag with "latest" (should only be used if ' 'this is the very latest public version of Review Board.') argparser.add_argument( '--no-major', action='store_false', dest='tag_major', help='disable tagging the image with the "X.Y" major version tag') argparser.add_argument( '--upload', action='store_true', help='upload the image after build') options = argparser.parse_args() package_version = get_package_version() major_version = '%s.%s' % VERSION[:2] image_version = package_version # If this is a development release, check if a built package has been # placed in the packages/ directory. if not is_release(): package_version = '%s.dev0' % package_version package_path = os.path.join(docker_dir, 'packages', 'ReviewBoard-%s-py2.py3-none-any.whl' % package_version) if not os.path.exists(package_path): sys.stderr.write( 'To build a Docker image for an in-development ' 'version of Review Board, you will\n'
from setuptools.command.develop import develop from setuptools.command.egg_info import egg_info from reviewboard import get_package_version, VERSION from reviewboard.dependencies import (build_dependency_list, package_dependencies) # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. if sys.hexversion < 0x02070000: sys.stderr.write( 'Review Board %s is incompatible with your version of Python.\n' 'Please install Review Board 2.5.x or upgrade Python to at least ' '2.7.\n' % get_package_version()) sys.exit(1) # Make sure we're actually in the directory containing setup.py. root_dir = os.path.dirname(__file__) if root_dir != '': os.chdir(root_dir) # Tell distutils to put the data_files in platform-specific installation # locations. See here for an explanation: # http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb for scheme in INSTALL_SCHEMES.values(): scheme['data'] = scheme['purelib']
PYTHON_2_MIN_VERSION, PYTHON_2_MIN_VERSION_STR, PYTHON_3_MIN_VERSION, build_dependency_list, package_dependencies, package_only_dependencies) is_packaging = ('sdist' in sys.argv or 'bdist_egg' in sys.argv or 'bdist_wheel' in sys.argv or 'install' in sys.argv) # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. pyver = sys.version_info[:2] if pyver < PYTHON_2_MIN_VERSION or (3, 0) <= pyver < PYTHON_3_MIN_VERSION: sys.stderr.write( 'Review Board %s is incompatible with your version of Python.\n' 'Please install Review Board 3.0.x or use Python %s.\n' % (get_package_version(), PYTHON_2_MIN_VERSION_STR)) sys.exit(1) elif (pyver >= PYTHON_3_MIN_VERSION and is_packaging and os.getenv('RB_PY3_HAS_NO_OFFICIAL_SUPPORT') != 'agreed'): sys.stderr.write( 'Review Board %s packages are not in any way supported by us ' 'on Python %s.%s.\n' 'To force building of the package, run:\n' '\n' ' RB_PY3_HAS_NO_OFFICIAL_SUPPORT=agreed %s\n' % (get_package_version(), pyver[0], pyver[1], ' '.join(sys.argv))) sys.exit(1) # Make sure we're actually in the directory containing setup.py. root_dir = os.path.dirname(__file__)
from setuptools.command.egg_info import egg_info from distutils.command.install_data import install_data from distutils.command.install import INSTALL_SCHEMES from distutils.core import Command from reviewboard import get_package_version, is_release, VERSION # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. if sys.hexversion < 0x02050000: sys.stderr.write('Review Board %s is incompatible with your version of ' 'Python.\n' % get_package_version()) sys.stderr.write('Please install Review Board 1.6.x, or ' 'upgrade\n') sys.stderr.write('Python to a newer 2.x version (preferably 2.7).\n') sys.exit(1) elif sys.hexversion < 0x02060000: markdown_requirement = 'markdown==2.2.1' else: markdown_requirement = 'markdown>=2.2.1' # Make sure we're actually in the directory containing setup.py. root_dir = os.path.dirname(__file__) if root_dir != "": os.chdir(root_dir)
else: cmdclasses = {"install_data": install_data} PACKAGE_NAME = "ReviewBoard" if is_release(): download_url = "http://downloads.reviewboard.org/releases/%s/%s.%s/" % (PACKAGE_NAME, VERSION[0], VERSION[1]) else: download_url = "http://downloads.reviewboard.org/nightlies/" # Build the reviewboard package. setup( name=PACKAGE_NAME, version=get_package_version(), license="MIT", description="Review Board, a web-based code review tool", url="http://www.reviewboard.org/", download_url=download_url, author="The Review Board Project", author_email="*****@*****.**", maintainer="Christian Hammond", maintainer_email="*****@*****.**", packages=find_packages(), entry_points={ "console_scripts": ["rb-site = reviewboard.cmdline.rbsite:main"], "reviewboard.scmtools": [ "bzr = reviewboard.scmtools.bzr:BZRTool", "clearcase = reviewboard.scmtools.clearcase:ClearCaseTool", "cvs = reviewboard.scmtools.cvs:CVSTool",
PYTHON_3_MIN_VERSION_STR, build_dependency_list, package_dependencies, package_only_dependencies) is_packaging = ('sdist' in sys.argv or 'bdist_egg' in sys.argv or 'bdist_wheel' in sys.argv or 'install' in sys.argv) # Make sure this is a version of Python we are compatible with. This should # prevent people on older versions from unintentionally trying to install # the source tarball, and failing. pyver = sys.version_info[:2] if pyver < PYTHON_2_MIN_VERSION or (3, 0) <= pyver < PYTHON_3_MIN_VERSION: sys.stderr.write( 'Review Board %s is incompatible with your version of Python.\n' 'Please install Review Board 3.0.x or upgrade to either Python %s or ' '%s+.\n' % (get_package_version(), PYTHON_2_MIN_VERSION_STR, PYTHON_3_MIN_VERSION_STR)) sys.exit(1) # Make sure we're actually in the directory containing setup.py. root_dir = os.path.dirname(__file__) if root_dir != '': os.chdir(root_dir) # Tell distutils to put the data_files in platform-specific installation # locations. See here for an explanation: # http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb for scheme in INSTALL_SCHEMES.values(): scheme['data'] = scheme['purelib']