diff --git a/buildman/jobutil/buildjob.py b/buildman/jobutil/buildjob.py index 3c00a3bc3..a8a5e2b80 100644 --- a/buildman/jobutil/buildjob.py +++ b/buildman/jobutil/buildjob.py @@ -104,7 +104,9 @@ class BuildJob(object): return None # Build an in-memory tree of the full heirarchy of images in the repository. - all_images = model.get_repository_images(repo_namespace, repo_name) + all_images = model.get_repository_images_without_placements(repo_build.repository, + with_ancestor=base_image) + all_tags = model.list_repository_tags(repo_namespace, repo_name) tree = ImageTree(all_images, all_tags, base_filter=base_image.id) diff --git a/data/database.py b/data/database.py index d1c701c70..6caae2d73 100644 --- a/data/database.py +++ b/data/database.py @@ -561,6 +561,14 @@ class LogEntry(BaseModel): ip = CharField(null=True) metadata_json = TextField(default='{}') + class Meta: + database = db + read_slaves = (read_slave,) + indexes = ( + # create an index on repository and date + (('repository', 'datetime'), False), + ) + class RepositoryActionCount(BaseModel): repository = ForeignKeyField(Repository, index=True) diff --git a/data/migrations/versions/313179799c8b_add_bitbucket_build_trigger_type.py b/data/migrations/versions/313179799c8b_add_bitbucket_build_trigger_type.py new file mode 100644 index 000000000..7f4d67cad --- /dev/null +++ b/data/migrations/versions/313179799c8b_add_bitbucket_build_trigger_type.py @@ -0,0 +1,25 @@ +"""Add bitbucket build trigger type + +Revision ID: 313179799c8b +Revises: 37c47a7af956 +Create Date: 2015-04-30 15:52:33.388825 + +""" + +# revision identifiers, used by Alembic. +revision = '313179799c8b' +down_revision = '37c47a7af956' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(tables): + op.bulk_insert(tables.buildtriggerservice, [{'id': 3, 'name': 'bitbucket'}]) + + +def downgrade(tables): + op.execute( + tables.buildtriggerservice.delete() + .where(tables.buildtriggerservice.c.name == op.inline_literal('bitbucket')) + ) diff --git a/data/migrations/versions/37c47a7af956_add_custom_git_trigger_type_to_database.py b/data/migrations/versions/37c47a7af956_add_custom_git_trigger_type_to_database.py new file mode 100644 index 000000000..ef2f9efa3 --- /dev/null +++ b/data/migrations/versions/37c47a7af956_add_custom_git_trigger_type_to_database.py @@ -0,0 +1,25 @@ +"""add custom-git trigger type to database + +Revision ID: 37c47a7af956 +Revises: 3fee6f979c2a +Create Date: 2015-04-24 14:50:26.275516 + +""" + +# revision identifiers, used by Alembic. +revision = '37c47a7af956' +down_revision = '3fee6f979c2a' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(tables): + op.bulk_insert(tables.buildtriggerservice, [{'id': 2, 'name': 'custom-git'}]) + + +def downgrade(tables): + op.execute( + tables.buildtriggerservice.delete() + .where(tables.buildtriggerservice.c.name == op.inline_literal('custom-git')) + ) diff --git a/data/model/legacy.py b/data/model/legacy.py index cd158e6a6..a3b9a3d2c 100644 --- a/data/model/legacy.py +++ b/data/model/legacy.py @@ -1751,6 +1751,21 @@ def get_matching_repository_images(namespace_name, repository_name, docker_image return _get_repository_images_base(namespace_name, repository_name, modify_query) + +def get_repository_images_without_placements(repository, with_ancestor=None): + query = (Image + .select(Image, ImageStorage) + .join(ImageStorage) + .where(Image.repository == repository)) + + if with_ancestor: + ancestors_string = '%s%s/' % (with_ancestor.ancestors, with_ancestor.id) + query = query.where((Image.ancestors ** (ancestors_string + '%')) | + (Image.id == with_ancestor.id)) + + return query + + def get_repository_images(namespace_name, repository_name): return _get_repository_images_base(namespace_name, repository_name, lambda q: q) diff --git a/endpoints/api/build.py b/endpoints/api/build.py index 0a5319a5c..f67939576 100644 --- a/endpoints/api/build.py +++ b/endpoints/api/build.py @@ -14,7 +14,9 @@ from endpoints.building import start_build, PreparedBuild from endpoints.trigger import BuildTriggerHandler from data import model, database from auth.auth_context import get_authenticated_user -from auth.permissions import ModifyRepositoryPermission, AdministerOrganizationPermission +from auth.permissions import (ReadRepositoryPermission, ModifyRepositoryPermission, + AdministerRepositoryPermission, AdministerOrganizationPermission) + from data.buildlogs import BuildStatusRetrievalError from util.names import parse_robot_username @@ -33,7 +35,7 @@ def get_job_config(build_obj): try: return json.loads(build_obj.job_config) except: - return None + return {} def user_view(user): @@ -43,11 +45,12 @@ def user_view(user): 'is_robot': user.robot, } -def trigger_view(trigger, can_admin=False): +def trigger_view(trigger, can_read=False, can_admin=False): if trigger and trigger.uuid: build_trigger = BuildTriggerHandler.get_handler(trigger) return { 'service': trigger.service.name, + 'build_source': build_trigger.config.get('build_source') if can_read else None, 'config': build_trigger.config if can_admin else {}, 'id': trigger.uuid, 'connected_user': trigger.connected_user.username, @@ -58,7 +61,7 @@ def trigger_view(trigger, can_admin=False): return None -def build_status_view(build_obj, can_write=False, can_admin=False): +def build_status_view(build_obj): phase = build_obj.phase try: status = build_logs.get_status(build_obj.uuid) @@ -74,28 +77,39 @@ def build_status_view(build_obj, can_write=False, can_admin=False): if datetime.datetime.utcnow() - heartbeat > datetime.timedelta(minutes=1): phase = database.BUILD_PHASE.INTERNAL_ERROR - # If the phase is internal error, return 'error' instead of the number if retries + # If the phase is internal error, return 'error' instead if the number of retries # on the queue item is 0. if phase == database.BUILD_PHASE.INTERNAL_ERROR: retry = build_obj.queue_id and dockerfile_build_queue.has_retries_remaining(build_obj.queue_id) if not retry: phase = database.BUILD_PHASE.ERROR - logger.debug('Can write: %s job_config: %s', can_write, build_obj.job_config) + repo_namespace = build_obj.repository.namespace_user.username + repo_name = build_obj.repository.name + + can_read = ReadRepositoryPermission(repo_namespace, repo_name).can() + can_write = ModifyRepositoryPermission(repo_namespace, repo_name).can() + can_admin = AdministerRepositoryPermission(repo_namespace, repo_name).can() + + job_config = get_job_config(build_obj) + resp = { 'id': build_obj.uuid, 'phase': phase, 'started': format_date(build_obj.started), 'display_name': build_obj.display_name, 'status': status or {}, - 'job_config': get_job_config(build_obj) if can_write else None, + 'subdirectory': job_config.get('build_subdir', ''), + 'tags': job_config.get('docker_tags', []), + 'manual_user': job_config.get('manual_user', None), 'is_writer': can_write, - 'trigger': trigger_view(build_obj.trigger, can_admin), + 'trigger': trigger_view(build_obj.trigger, can_read, can_admin), + 'trigger_metadata': job_config.get('trigger_metadata', None) if can_read else None, 'resource_key': build_obj.resource_key, 'pull_robot': user_view(build_obj.pull_robot) if build_obj.pull_robot else None, 'repository': { - 'namespace': build_obj.repository.namespace_user.username, - 'name': build_obj.repository.name + 'namespace': repo_namespace, + 'name': repo_name } } @@ -157,9 +171,8 @@ class RepositoryBuildList(RepositoryParamResource): since = datetime.datetime.utcfromtimestamp(since) builds = model.list_repository_builds(namespace, repository, limit, since=since) - can_write = ModifyRepositoryPermission(namespace, repository).can() return { - 'builds': [build_status_view(build, can_write) for build in builds] + 'builds': [build_status_view(build) for build in builds] } @require_repo_write @@ -211,7 +224,7 @@ class RepositoryBuildList(RepositoryParamResource): prepared.metadata = {} build_request = start_build(repo, prepared, pull_robot_name=pull_robot_name) - resp = build_status_view(build_request, can_write=True) + resp = build_status_view(build_request) repo_string = '%s/%s' % (namespace, repository) headers = { 'Location': api.url_for(RepositoryBuildStatus, repository=repo_string, @@ -236,8 +249,7 @@ class RepositoryBuildResource(RepositoryParamResource): except model.InvalidRepositoryBuildException: raise NotFound() - can_write = ModifyRepositoryPermission(namespace, repository).can() - return build_status_view(build, can_write) + return build_status_view(build) @require_repo_admin @nickname('cancelRepoBuild') @@ -271,8 +283,7 @@ class RepositoryBuildStatus(RepositoryParamResource): build.repository.namespace_user.username != namespace): raise NotFound() - can_write = ModifyRepositoryPermission(namespace, repository).can() - return build_status_view(build, can_write) + return build_status_view(build) @resource('/v1/repository//build//logs') diff --git a/endpoints/api/trigger.py b/endpoints/api/trigger.py index 805ea08bc..35dc6b9e9 100644 --- a/endpoints/api/trigger.py +++ b/endpoints/api/trigger.py @@ -432,7 +432,7 @@ class ActivateBuildTrigger(RepositoryParamResource): except TriggerStartException as tse: raise InvalidRequest(tse.message) - resp = build_status_view(build_request, can_write=True) + resp = build_status_view(build_request) repo_string = '%s/%s' % (namespace, repository) headers = { 'Location': api.url_for(RepositoryBuildStatus, repository=repo_string, @@ -456,7 +456,7 @@ class TriggerBuildList(RepositoryParamResource): builds = list(model.list_trigger_builds(namespace, repository, trigger_uuid, limit)) return { - 'builds': [build_status_view(build, can_write=True) for build in builds] + 'builds': [build_status_view(build) for build in builds] } diff --git a/endpoints/api/user.py b/endpoints/api/user.py index 93e77f47c..b03c5f87b 100644 --- a/endpoints/api/user.py +++ b/endpoints/api/user.py @@ -444,19 +444,19 @@ class ConvertToOrganization(ApiResource): user = get_authenticated_user() convert_data = request.get_json() - # Ensure that the new admin user is the not user being converted. - admin_username = convert_data['adminUser'] - if admin_username == user.username: - raise request_error(reason='invaliduser', - message='The admin user is not valid') - # Ensure that the sign in credentials work. + admin_username = convert_data['adminUser'] admin_password = convert_data['adminPassword'] (admin_user, error_message) = authentication.verify_user(admin_username, admin_password) if not admin_user: raise request_error(reason='invaliduser', message='The admin user credentials are not valid') + # Ensure that the new admin user is the not user being converted. + if admin_user.id == user.id: + raise request_error(reason='invaliduser', + message='The admin user is not valid') + # Subscribe the organization to the new plan. if features.BILLING: plan = convert_data.get('plan', 'free') diff --git a/endpoints/oauthlogin.py b/endpoints/oauthlogin.py index 269659a42..49510afb7 100644 --- a/endpoints/oauthlogin.py +++ b/endpoints/oauthlogin.py @@ -126,7 +126,7 @@ def github_oauth_callback(): # Exchange the OAuth code. code = request.args.get('code') - token = google_login.exchange_code_for_token(app.config, client, code) + token = github_login.exchange_code_for_token(app.config, client, code) # Retrieve the user's information. user_data = get_user(github_login, token) @@ -214,7 +214,7 @@ def google_oauth_attach(): @require_session_login def github_oauth_attach(): code = request.args.get('code') - token = google_login.exchange_code_for_token(app.config, client, code) + token = github_login.exchange_code_for_token(app.config, client, code) user_data = get_user(github_login, token) if not user_data: return render_ologin_error('GitHub') diff --git a/endpoints/verbs.py b/endpoints/verbs.py index 619da283f..88d9dc7b1 100644 --- a/endpoints/verbs.py +++ b/endpoints/verbs.py @@ -140,7 +140,7 @@ def _repo_verb_signature(namespace, repository, tag, verb, checker=None, **kwarg # Lookup the derived image storage for the verb. derived = model.find_derived_storage(repo_image.storage, verb) if derived is None or derived.uploading: - abort(404) + return make_response('', 202) # Check if we have a valid signer configured. if not signer.name: diff --git a/endpoints/web.py b/endpoints/web.py index 3dda9998d..9d552fe1c 100644 --- a/endpoints/web.py +++ b/endpoints/web.py @@ -28,6 +28,7 @@ from util.systemlogs import build_logs_archive from auth import scopes import features +import json logger = logging.getLogger(__name__) @@ -432,16 +433,16 @@ def request_authorization_code(): # Load the application information. oauth_app = provider.get_application_for_client_id(client_id) - app_email = oauth_app.email or organization.email + app_email = oauth_app.avatar_email or oauth_app.organization.email oauth_app_view = { 'name': oauth_app.name, 'description': oauth_app.description, 'url': oauth_app.application_uri, - 'avatar': avatar.get_data(oauth_app.name, app_email, 'app'), + 'avatar': json.dumps(avatar.get_data(oauth_app.name, app_email, 'app')), 'organization': { 'name': oauth_app.organization.username, - 'avatar': avatar.get_data_for_org(oauth_app.organization) + 'avatar': json.dumps(avatar.get_data_for_org(oauth_app.organization)) } } @@ -562,6 +563,9 @@ def redirect_to_repository(namespace, reponame, tag): permission = ReadRepositoryPermission(namespace, reponame) is_public = model.repository_is_public(namespace, reponame) + if request.args.get('ac-discovery', 0) == 1: + return index('') + if permission.can() or is_public: repository_name = '/'.join([namespace, reponame]) return redirect(url_for('web.repository', path=repository_name, tag=tag)) diff --git a/external_libraries.py b/external_libraries.py index 7004a2cca..1e0e2c73c 100644 --- a/external_libraries.py +++ b/external_libraries.py @@ -18,9 +18,9 @@ EXTERNAL_JS = [ ] EXTERNAL_CSS = [ - 'netdna.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.css', + 'netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css', 'netdna.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css', - 'fonts.googleapis.com/css?family=Source+Sans+Pro:400,700', + 'fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700', 's3.amazonaws.com/cdn.core-os.net/icons/core-icons.css' ] diff --git a/requirements.txt b/requirements.txt index 6d8962281..e3d00eeb0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -53,11 +53,13 @@ raven==5.1.1 redis==2.10.3 reportlab==2.7 requests==2.5.1 +requests-oauthlib==0.4.2 six==1.9.0 stringscore==0.1.0 stripe==1.20.1 trollius==1.0.4 tzlocal==1.1.2 +urllib3==1.10.2 waitress==0.8.9 websocket-client==0.23.0 wsgiref==0.1.2 diff --git a/static/css/core-ui.css b/static/css/core-ui.css index 691d6a74f..4c401c8a2 100644 --- a/static/css/core-ui.css +++ b/static/css/core-ui.css @@ -1,3 +1,10 @@ +a:active { + outline: none !important; +} + +a:focus { + outline: none !important; +} .co-options-menu .fa-gear { color: #999; @@ -879,6 +886,7 @@ } .cor-title-link { + font-weight: 300; line-height: 30px; margin-top: 22px; margin-bottom: 10px; diff --git a/static/css/directives/repo-view/repo-panel-changes.css b/static/css/directives/repo-view/repo-panel-changes.css index 14838ee1d..8c4310a47 100644 --- a/static/css/directives/repo-view/repo-panel-changes.css +++ b/static/css/directives/repo-view/repo-panel-changes.css @@ -26,3 +26,9 @@ margin-right: 8px; vertical-align: middle; } + +.repo-panel-changes .multiselect-dropdown { + display: inline-block; + margin-left: 10px; + min-width: 200px; +} \ No newline at end of file diff --git a/static/css/directives/repo-view/repo-panel-info.css b/static/css/directives/repo-view/repo-panel-info.css index 496d32a2f..1b39b3a6b 100644 --- a/static/css/directives/repo-view/repo-panel-info.css +++ b/static/css/directives/repo-view/repo-panel-info.css @@ -67,4 +67,8 @@ .repo-panel-info-element .builds-list { min-height: 200px; +} + +.repo-panel-info-element .copy-box { + vertical-align: middle; } \ No newline at end of file diff --git a/static/css/directives/ui/header-bar.css b/static/css/directives/ui/header-bar.css index db72b4e73..7fa08bf22 100644 --- a/static/css/directives/ui/header-bar.css +++ b/static/css/directives/ui/header-bar.css @@ -48,7 +48,7 @@ nav.navbar-default .navbar-nav>li>a.active { right: 0px; top: -50px; z-index: 4; - height: 83px; + height: 56px; transition: top 0.3s cubic-bezier(.23,.88,.72,.98); background: white; box-shadow: 0px 1px 16px #444; @@ -71,7 +71,7 @@ nav.navbar-default .navbar-nav>li>a.active { color: #ccc; margin-right: 10px; position: absolute; - top: 34px; + top: 20px; left: 14px; } @@ -84,9 +84,9 @@ nav.navbar-default .navbar-nav>li>a.active { } .header-bar-element .search-box .search-box-wrapper input { - font-size: 28px; + font-size: 18px; width: 100%; - padding: 10px; + padding: 6px; border: 0px; } @@ -94,7 +94,7 @@ nav.navbar-default .navbar-nav>li>a.active { position: absolute; left: 0px; right: 0px; - top: -130px; + top: -106px; z-index: 3; transition: top 0.4s cubic-bezier(.23,.88,.72,.98), height 0.25s ease-in-out; @@ -104,7 +104,7 @@ nav.navbar-default .navbar-nav>li>a.active { } .header-bar-element .search-results.loading, .header-bar-element .search-results.results { - top: 130px; + top: 106px; } .header-bar-element .search-results.loading { @@ -153,7 +153,7 @@ nav.navbar-default .navbar-nav>li>a.active { margin-right: 4px; } -.header-bar-element .search-results li .description { +.header-bar-element .search-results li .result-description { overflow: hidden; text-overflow: ellipsis; max-height: 24px; @@ -161,6 +161,11 @@ nav.navbar-default .navbar-nav>li>a.active { display: inline-block; color: #aaa; vertical-align: middle; + margin-top: 2px; +} + +.header-bar-element .search-results li .description img { + display: none; } .header-bar-element .search-results li .score:before { diff --git a/static/css/directives/ui/logs-view.css b/static/css/directives/ui/logs-view.css index 198bad42f..db77c9b23 100644 --- a/static/css/directives/ui/logs-view.css +++ b/static/css/directives/ui/logs-view.css @@ -94,7 +94,12 @@ white-space: nowrap; } +.logs-view-element .side-controls .filter-input { + vertical-align: middle; +} + .logs-view-element .side-controls { + float: none !important; text-align: right; margin-bottom: 20px; } \ No newline at end of file diff --git a/static/css/directives/ui/multiselect-dropdown.css b/static/css/directives/ui/multiselect-dropdown.css new file mode 100644 index 000000000..76f29f3dd --- /dev/null +++ b/static/css/directives/ui/multiselect-dropdown.css @@ -0,0 +1,42 @@ +.multiselect-dropdown .dropdown, +.multiselect-dropdown .dropdown .btn-dropdown, +.multiselect-dropdown .dropdown .dropdown-menu { + width: 100%; +} + +.multiselect-dropdown .dropdown .btn-dropdown { + text-align: left; + position: relative; + padding-right: 16px; +} + +.multiselect-dropdown .dropdown .btn-dropdown .caret { + position: absolute; + top: 14px; + right: 10px; +} + +.multiselect-dropdown .none { + color: #ccc; + margin-right: 10px; +} + +.multiselect-dropdown .dropdown-menu { + padding: 10px; +} + +.multiselect-dropdown .dropdown-menu .menu-item { + padding: 4px; +} + +.multiselect-dropdown .dropdown-menu .menu-item .co-checkable-item { + margin-right: 6px; +} + +.multiselect-dropdown .dropdown-menu .menu-item .menu-item-template { + vertical-align: middle; +} + +.multiselect-dropdown .selected-item-template { + margin-right: 10px; +} diff --git a/static/css/directives/ui/namespace-selector.css b/static/css/directives/ui/namespace-selector.css new file mode 100644 index 000000000..21053e9c9 --- /dev/null +++ b/static/css/directives/ui/namespace-selector.css @@ -0,0 +1,35 @@ +.namespace-selector-dropdown .namespace { + padding: 6px; + padding-left: 10px; + cursor: pointer; + font-size: 14px; + color: black; +} + +.namespace-selector-dropdown .namespace-item { + position: relative; +} + +.namespace-selector-dropdown .namespace-item .fa { + position: absolute; + right: 12px; + top: 12px; + color: #aaa; +} + +.namespace-selector-dropdown .avatar { + margin-right: 4px; +} + +.namespace-selector-dropdown a.namespace { + color: black !important; +} + +.namespace-selector-dropdown .namespace-item.disabled .avatar { + -webkit-filter: grayscale(1); + opacity: 0.5; +} + +.namespace-selector-dropdown .namespace-item .tooltip-inner { + min-width: 200px; +} diff --git a/static/css/directives/ui/repo-list-grid.css b/static/css/directives/ui/repo-list-grid.css index d9418ae95..786cc793c 100644 --- a/static/css/directives/ui/repo-list-grid.css +++ b/static/css/directives/ui/repo-list-grid.css @@ -90,9 +90,7 @@ .new-repo-listing .description { font-size: 0.91em; padding-top: 13px; -} - -.new-repo-listing .description { + padding-left: 11px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; diff --git a/static/css/directives/ui/setup-trigger-dialog.css b/static/css/directives/ui/setup-trigger-dialog.css new file mode 100644 index 000000000..482a687bf --- /dev/null +++ b/static/css/directives/ui/setup-trigger-dialog.css @@ -0,0 +1,28 @@ +.setup-trigger-directive-element .dockerfile-found-content { + margin-left: 32px; +} + +.setup-trigger-directive-element .dockerfile-found-content:before { + content: "\f071"; + font-family: FontAwesome; + color: rgb(255, 194, 0); + position: absolute; + top: 0px; + left: 0px; + font-size: 20px; +} + +.setup-trigger-directive-element .loading { + text-align: center; +} + +.setup-trigger-directive-element .loading .cor-loader-inline { + margin-right: 4px; +} + +.setup-trigger-directive-element .dockerfile-found { + position: relative; + margin-bottom: 16px; + padding-bottom: 16px; + border-bottom: 1px solid #eee; +} \ No newline at end of file diff --git a/static/css/directives/ui/source-commit-link.css b/static/css/directives/ui/source-commit-link.css index 489b79c9a..b16c15248 100644 --- a/static/css/directives/ui/source-commit-link.css +++ b/static/css/directives/ui/source-commit-link.css @@ -1,8 +1,42 @@ -.source-commit-link-element .fa { - margin-right: 4px; +.source-commit-link-element .commit-circle { + margin-right: 6px; display: inline-block; + padding-top: 2px; } +.source-commit-link-element .commit-circle { + display: inline-block; + border: 2px solid #999; + width: 10px; + height: 10px; + border-radius: 50%; + position: relative; +} + +.source-commit-link-element .commit-circle:before, +.source-commit-link-element .commit-circle:after { + content: ""; + display: inline-block; + border-top: 2px solid #999; + height: 10px; + width: 4px; + position: absolute; + top: 2px; +} + +.source-commit-link-element .commit-circle:before { + left: -5px; +} + +.source-commit-link-element .commit-circle:after { + left: 7px; +} + + .source-commit-link-element { white-space: nowrap; +} + +.source-commit-link-element .anchor { + vertical-align: middle; } \ No newline at end of file diff --git a/static/css/directives/ui/step-view-step.css b/static/css/directives/ui/step-view-step.css new file mode 100644 index 000000000..16f31abda --- /dev/null +++ b/static/css/directives/ui/step-view-step.css @@ -0,0 +1,9 @@ +.step-view-step-content .loading-message { + position: relative; + text-align: center; + display: block; +} + +.step-view-step-content .loading-message .cor-loader-inline { + margin-right: 6px; +} \ No newline at end of file diff --git a/static/css/directives/ui/trigger-setup-githost.css b/static/css/directives/ui/trigger-setup-githost.css index edaf63c86..b4ac0f94f 100644 --- a/static/css/directives/ui/trigger-setup-githost.css +++ b/static/css/directives/ui/trigger-setup-githost.css @@ -42,7 +42,7 @@ vertical-align: middle; } -.trigger-setup-githost-element li.repo-listing i { +.trigger-setup-githost-element li.host-repo-listing i { margin-right: 10px; margin-left: 6px; } diff --git a/static/css/directives/ui/triggered-build-description.css b/static/css/directives/ui/triggered-build-description.css index a3b0bda1a..803a58472 100644 --- a/static/css/directives/ui/triggered-build-description.css +++ b/static/css/directives/ui/triggered-build-description.css @@ -10,9 +10,8 @@ .triggered-build-description-element .commit-who img { width: 16px; height: 16px; - margin-left: 2px; + margin-left: 4px; margin-right: 2px; - border-radius: 50%; } .triggered-build-description-element .fa-github { diff --git a/static/css/pages/repo-view.css b/static/css/pages/repo-view.css index 73e38891c..08971ed23 100644 --- a/static/css/pages/repo-view.css +++ b/static/css/pages/repo-view.css @@ -50,9 +50,7 @@ } @media (max-width: 767px) { - .repository-view .repo-star { - position: absolute; - top: 16px; - left: -16px; + .repository-view .cor-title-content { + padding-top: 8px; } } diff --git a/static/css/quay.css b/static/css/quay.css index 02409c42a..8631585e7 100644 --- a/static/css/quay.css +++ b/static/css/quay.css @@ -548,38 +548,6 @@ i.toggle-icon:hover { float: right; } -.namespace-selector-dropdown .namespace { - padding: 6px; - padding-left: 10px; - cursor: pointer; - font-size: 14px; - color: black; -} - -.namespace-selector-dropdown .namespace-item { - position: relative; -} - -.namespace-selector-dropdown .namespace-item .fa { - position: absolute; - right: 12px; - top: 12px; - color: #aaa; -} - -.namespace-selector-dropdown a.namespace { - color: black !important; -} - -.namespace-selector-dropdown .namespace-item.disabled img { - -webkit-filter: grayscale(1); - opacity: 0.5; -} - -.namespace-selector-dropdown .namespace-item .tooltip-inner { - min-width: 200px; -} - .notification-primary { background: #428bca; color: white; @@ -3768,27 +3736,6 @@ pre.command:before { border-bottom-left-radius: 0px; } -.setup-trigger-directive-element .dockerfile-found-content { - margin-left: 32px; -} - -.setup-trigger-directive-element .dockerfile-found-content:before { - content: "\f071"; - font-family: FontAwesome; - color: rgb(255, 194, 0); - position: absolute; - top: 0px; - left: 0px; - font-size: 20px; -} - -.setup-trigger-directive-element .dockerfile-found { - position: relative; - margin-bottom: 16px; - padding-bottom: 16px; - border-bottom: 1px solid #eee; -} - .slideinout { -webkit-transition:0.5s all; transition:0.5s linear all; diff --git a/static/directives/anchor.html b/static/directives/anchor.html index 563fbe581..258f441e8 100644 --- a/static/directives/anchor.html +++ b/static/directives/anchor.html @@ -1,4 +1,4 @@ - + diff --git a/static/directives/build-logs-view.html b/static/directives/build-logs-view.html index 074ccd5b0..f99a7eb00 100644 --- a/static/directives/build-logs-view.html +++ b/static/directives/build-logs-view.html @@ -30,7 +30,7 @@
- +
diff --git a/static/directives/build-mini-status.html b/static/directives/build-mini-status.html index bba073329..97b14d5c5 100644 --- a/static/directives/build-mini-status.html +++ b/static/directives/build-mini-status.html @@ -1,6 +1,7 @@ - +
diff --git a/static/directives/cor-title-content.html b/static/directives/cor-title-content.html index 5b2077d08..0d3e13ddd 100644 --- a/static/directives/cor-title-content.html +++ b/static/directives/cor-title-content.html @@ -1,3 +1,3 @@ -
+

diff --git a/static/directives/cor-title-link.html b/static/directives/cor-title-link.html index 428671f86..afd345c75 100644 --- a/static/directives/cor-title-link.html +++ b/static/directives/cor-title-link.html @@ -1 +1 @@ - + diff --git a/static/directives/multiselect-dropdown.html b/static/directives/multiselect-dropdown.html new file mode 100644 index 000000000..11acda579 --- /dev/null +++ b/static/directives/multiselect-dropdown.html @@ -0,0 +1,31 @@ +
+ +
\ No newline at end of file diff --git a/static/directives/new-header-bar.html b/static/directives/new-header-bar.html index 4768f8222..36be8e58e 100644 --- a/static/directives/new-header-bar.html +++ b/static/directives/new-header-bar.html @@ -108,8 +108,8 @@ data-container="body" data-animation="am-slide-right" bs-aside> + - @@ -185,7 +185,7 @@ {{ result.namespace.name }}/{{ result.name }} -
+
diff --git a/static/directives/plan-manager.html b/static/directives/plan-manager.html index 18d87b55a..76038668f 100644 --- a/static/directives/plan-manager.html +++ b/static/directives/plan-manager.html @@ -1,6 +1,6 @@
-
+
@@ -58,7 +58,7 @@
@@ -66,14 +66,14 @@
diff --git a/static/directives/repo-view/repo-panel-builds.html b/static/directives/repo-view/repo-panel-builds.html index 3079d06f0..d4f2b1db7 100644 --- a/static/directives/repo-view/repo-panel-builds.html +++ b/static/directives/repo-view/repo-panel-builds.html @@ -54,7 +54,6 @@ style="min-width: 66px;"> Tags - @@ -139,6 +138,7 @@ {{ trigger.config.branchtag_regex || 'All' }} + (None) diff --git a/static/directives/repo-view/repo-panel-changes.html b/static/directives/repo-view/repo-panel-changes.html index 281fff6bb..094df41b0 100644 --- a/static/directives/repo-view/repo-panel-changes.html +++ b/static/directives/repo-view/repo-panel-changes.html @@ -1,23 +1,24 @@
+

+ Visualize Tags: + + {{ item }} + +

+
No tags selected to view
- Please select one or more tags in the Tags tab to visualize. + Please select one or more tags above.
-
-

- Visualize Tags: - - {{ tag }} - -

- +
diff --git a/static/directives/repo-view/repo-panel-info.html b/static/directives/repo-view/repo-panel-info.html index 3cef46919..5fdab5a4c 100644 --- a/static/directives/repo-view/repo-panel-info.html +++ b/static/directives/repo-view/repo-panel-info.html @@ -6,12 +6,12 @@
Repo Pulls
-
{{ repository.stats.pulls.today }}
+
{{ repository.stats.pulls.today | abbreviated }}
Last 24 hours
-
{{ repository.stats.pulls.thirty_day }}
+
{{ repository.stats.pulls.thirty_day | abbreviated }}
Last 30 days
@@ -21,12 +21,12 @@
Repo Pushes
-
{{ repository.stats.pushes.today }}
+
{{ repository.stats.pushes.today | abbreviated }}
Last 24 hours
-
{{ repository.stats.pushes.thirty_day }}
+
{{ repository.stats.pushes.thirty_day | abbreviated }}
Last 30 days
diff --git a/static/directives/repo-view/repo-panel-tags.html b/static/directives/repo-view/repo-panel-tags.html index cde9744ca..a95318ba2 100644 --- a/static/directives/repo-view/repo-panel-tags.html +++ b/static/directives/repo-view/repo-panel-tags.html @@ -133,12 +133,12 @@ - - Delete Tag - Add New Tag + + Delete Tag + diff --git a/static/directives/robots-manager.html b/static/directives/robots-manager.html index 2e71ac142..345d28fc3 100644 --- a/static/directives/robots-manager.html +++ b/static/directives/robots-manager.html @@ -65,7 +65,7 @@ - + @@ -78,7 +78,7 @@ Direct Permissions on -