# Copyright 2008 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""URL mappings for Gerrit."""

# NOTE: Must import *, since Django looks for things here, e.g. handler500.
from django.conf.urls.defaults import *

urlpatterns = patterns(
    'codereview',
    (r'^dev_init$', 'dev_init.dev_init'),
    (r'^proto/_token$', 'proto_server.token'),
    (r'^proto/([^/]*)/([^/]*)$', 'proto_server.serve'),
    (r'^$', 'views.index'),
    (r'^all$', 'views.all'),
    (r'^mine$', 'views.mine'),
    (r'^unclaimed$', 'views.unclaimed'),
    (r'^starred$', 'views.starred'),
    (r'^r/([0-9a-f]{4,40})$', 'views.revision_redirect'),
    (r'^(\d+)$', 'views.show'),
    (r'^(\d+)/show$', 'views.show'),
    (r'^(\d+)/edit$', 'views.edit'),
    (r'^(\d+)/delete$', 'views.delete'),
    (r'^(\d+)/publish$', 'views.publish'),
    (r'^(\d+)/merge/(\d+)$', 'views.merge'),
    (r'^(\d+)/ajax_patchset/(\d+)$', 'views.ajax_patchset'),
    (r'^download/change(\d+)_(\d+)_(\d+|z[0-9a-f]{40})\.diff', 'views.download_patch'),
    (r'^download/bundle(\d+)_(\d+)$', 'views.download_bundle'),
    (r'^(\d+)/patch/(\d+)/(\d+|z[0-9a-f]{40})$', 'views.patch'),
    (r'^(\d+)/diff/(\d+)/(\d+|z[0-9a-f]{40})$', 'views.diff'),
    (r'^(\d+)/diff2/(\d+):(\d+)/(\d+|z[0-9a-f]{40})$', 'views.diff2'),
    (r'^(\d+)/diff_skipped_lines/(\d+)/(\d+|z[0-9a-f]{40})/(\d+)/(\d+)/([tb])$',
     'views.diff_skipped_lines'),
    (r'^(\d+)/diff2_skipped_lines/(\d+):(\d+)/(\d+|z[0-9a-f]{40})/(\d+)/(\d+)/([tb])$',
     'views.diff2_skipped_lines'),
    (r'^star$', 'views.star'),
    (r'^unstar$', 'views.unstar'),
    (r'^user/(.+)$', 'views.show_user'),
    (r'^ajax_user_mine/(.+)/(\d+)$', 'views.ajax_user_mine'),
    (r'^ajax_user_review/(.+)/(\d+)$', 'views.ajax_user_review'),
    (r'^ajax_user_closed/(.+)/(\d+)$', 'views.ajax_user_closed'),
    (r'^inline_draft$', 'views.inline_draft'),
    (r'^settings$', 'settings.settings'),
    (r'^settings/welcome$', 'settings.settings_welcome'),
    (r'^user_popup/(.+)$', 'views.user_popup'),
    (r'^admin$', 'views.admin'),
    (r'^admin/settings$', 'views.admin_settings'),
    (r'^admin/settings/analytics$', 'views.admin_settings_analytics'),
    (r'^admin/settings/from_email$', 'views.admin_settings_from_email'),
    (r'^admin/settings/from_email_test$', 'views.admin_settings_from_email_test'),
    (r'^admin/users$', 'people.admin_users'),
    (r'^admin/users/verify_cla$', 'people.admin_users_verify_cla'),
    (r'^admin/people_info$', 'people.admin_people_info'),
    (r'^admin/user/(.+)$', 'people.admin_user'),
    (r'^admin/groups$', 'people.admin_groups'),
    (r'^admin/group_new$', 'people.admin_group_new'),
    (r'^admin/group/(.+)$', 'people.admin_group'),
    (r'^admin/group_delete/(.+)$', 'people.admin_group_delete'),
    (r'^admin/projects$', 'project.project_list'),
    (r'^admin/project_new$', 'project.project_new'),
    (r'^admin/project/(.+)$', 'project.project_edit'),
    (r'^admin/project_delete/(.+)$', 'project.project_delete'),
    (r'^admin/datastore_delete$', 'views.admin_datastore_delete'),
    (r'^admin/datastore_upgrade$', 'views.admin_datastore_upgrade'),
    )
