Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions admin/admin_routes.v
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ pub fn (mut app App) admin_settings(mut ctx Context) veb.Result {
}

@['/admin/settings'; post]
pub fn (mut app App) handle_admin_update_settings(oauth_client_id string, oauth_client_secret string) veb.Result {
pub fn (mut app App) handle_admin_update_settings(mut ctx Context, oauth_client_id string, oauth_client_secret string) veb.Result {
if !ctx.is_admin() {
return ctx.redirect_to_index()
}
Expand All @@ -34,7 +34,7 @@ pub fn (mut app App) handle_admin_update_settings(oauth_client_id string, oauth_
}

@['/admin/users/:user'; post]
pub fn (mut app App) handle_admin_edit_user(user_id string) veb.Result {
pub fn (mut app App) handle_admin_edit_user(mut ctx Context, user_id string) veb.Result {
if !ctx.is_admin() {
return ctx.redirect_to_index()
}
Expand Down
8 changes: 4 additions & 4 deletions ci/ci_routes.v
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ fn (mut app App) verify_ci_callback_signature(ctx &Context, body string) bool {

// GET /:username/:repo_name/ci - CI runs list page
@['/:username/:repo_name/ci']
pub fn (mut app App) ci_runs(username string, repo_name string) veb.Result {
pub fn (mut app App) ci_runs(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }

if !app.can_read_repo(ctx, repo) {
Expand Down Expand Up @@ -141,7 +141,7 @@ pub fn (mut app App) ci_runs(username string, repo_name string) veb.Result {

// GET /:username/:repo_name/ci/:run_id_str - CI run detail page
@['/:username/:repo_name/ci/:run_id_str']
pub fn (mut app App) ci_run_detail(username string, repo_name string, run_id_str string) veb.Result {
pub fn (mut app App) ci_run_detail(mut ctx Context, username string, repo_name string, run_id_str string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }

if !app.can_read_repo(ctx, repo) {
Expand Down Expand Up @@ -178,7 +178,7 @@ pub fn (mut app App) ci_run_detail(username string, repo_name string, run_id_str

// POST /:username/:repo_name/ci/:run_id_str/restart - Restart a CI run
@['/:username/:repo_name/ci/:run_id_str/restart'; post]
pub fn (mut app App) ci_restart_run(username string, repo_name string, run_id_str string) veb.Result {
pub fn (mut app App) ci_restart_run(mut ctx Context, username string, repo_name string, run_id_str string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }

if !app.can_admin_repo(ctx, repo) {
Expand Down Expand Up @@ -221,7 +221,7 @@ pub fn (mut app App) ci_restart_run(username string, repo_name string, run_id_st

// POST /:username/:repo_name/ci/:run_id_str/cancel - Cancel a CI run.
@['/:username/:repo_name/ci/:run_id_str/cancel'; post]
pub fn (mut app App) ci_cancel_run(username string, repo_name string, run_id_str string) veb.Result {
pub fn (mut app App) ci_cancel_run(mut ctx Context, username string, repo_name string, run_id_str string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
Expand Down
2 changes: 1 addition & 1 deletion gitly.v
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ pub fn (mut app App) index(mut ctx Context) veb.Result {
}

@['/change_lang/:lang'; post]
pub fn (mut app App) change_lang(lang string) veb.Result {
pub fn (mut app App) change_lang(mut ctx Context, lang string) veb.Result {
if lang !in ['en', 'ru', 'es', 'jp', 'cn', 'pt'] {
ctx.res.set_status(.bad_request)
return ctx.json_error('Unsupported language')
Expand Down
18 changes: 9 additions & 9 deletions project_governance_routes.v
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ module main
import veb

@['/:username/:repo_name/settings/members']
pub fn (mut app App) repo_members(username string, repo_name string) veb.Result {
pub fn (mut app App) repo_members(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
Expand All @@ -15,7 +15,7 @@ pub fn (mut app App) repo_members(username string, repo_name string) veb.Result
}

@['/:username/:repo_name/settings/members'; post]
pub fn (mut app App) handle_add_repo_member(username string, repo_name string) veb.Result {
pub fn (mut app App) handle_add_repo_member(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
Expand All @@ -42,7 +42,7 @@ pub fn (mut app App) handle_add_repo_member(username string, repo_name string) v
}

@['/:username/:repo_name/settings/members/:member_id'; post]
pub fn (mut app App) handle_update_repo_member(username string, repo_name string, member_id string) veb.Result {
pub fn (mut app App) handle_update_repo_member(mut ctx Context, username string, repo_name string, member_id string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
Expand All @@ -56,7 +56,7 @@ pub fn (mut app App) handle_update_repo_member(username string, repo_name string
}

@['/:username/:repo_name/settings/members/:member_id/delete'; post]
pub fn (mut app App) handle_delete_repo_member(username string, repo_name string, member_id string) veb.Result {
pub fn (mut app App) handle_delete_repo_member(mut ctx Context, username string, repo_name string, member_id string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
Expand All @@ -69,7 +69,7 @@ pub fn (mut app App) handle_delete_repo_member(username string, repo_name string
}

@['/:username/:repo_name/settings/branches']
pub fn (mut app App) protected_branches(username string, repo_name string) veb.Result {
pub fn (mut app App) protected_branches(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
Expand All @@ -80,7 +80,7 @@ pub fn (mut app App) protected_branches(username string, repo_name string) veb.R
}

@['/:username/:repo_name/settings/branches'; post]
pub fn (mut app App) handle_protect_branch(username string, repo_name string) veb.Result {
pub fn (mut app App) handle_protect_branch(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
Expand All @@ -96,7 +96,7 @@ pub fn (mut app App) handle_protect_branch(username string, repo_name string) ve
}

@['/:username/:repo_name/settings/branches/:rule_id'; post]
pub fn (mut app App) handle_update_protected_branch(username string, repo_name string, rule_id string) veb.Result {
pub fn (mut app App) handle_update_protected_branch(mut ctx Context, username string, repo_name string, rule_id string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
Expand All @@ -110,7 +110,7 @@ pub fn (mut app App) handle_update_protected_branch(username string, repo_name s
}

@['/:username/:repo_name/settings/branches/:rule_id/delete'; post]
pub fn (mut app App) handle_unprotect_branch(username string, repo_name string, rule_id string) veb.Result {
pub fn (mut app App) handle_unprotect_branch(mut ctx Context, username string, repo_name string, rule_id string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
Expand All @@ -123,7 +123,7 @@ pub fn (mut app App) handle_unprotect_branch(username string, repo_name string,
}

@['/:username/:repo_name/settings/approvals'; post]
pub fn (mut app App) handle_update_repo_approvals(username string, repo_name string) veb.Result {
pub fn (mut app App) handle_update_repo_approvals(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if !app.can_admin_repo(ctx, repo) {
return ctx.not_found()
Expand Down
2 changes: 1 addition & 1 deletion repo/branch_routes.v
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ fn (mut app App) handle_branch_count(username string, repo_name string) veb.Resu
}

@['/:user/:repo/branches']
pub fn (mut app App) branches(username string, repo_name string) veb.Result {
pub fn (mut app App) branches(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or {
return ctx.json_error('Not found')
}
Expand Down
2 changes: 1 addition & 1 deletion repo/comment.v
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ mut:
}

@['/:username/:repo_name/comments'; post]
pub fn (mut app App) handle_add_comment(username string, repo_name string) veb.Result {
pub fn (mut app App) handle_add_comment(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
text := ctx.form['text']
issue_id := ctx.form['issue_id']
Expand Down
5 changes: 4 additions & 1 deletion repo/file.v
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,10 @@ fn pretty_size_bytes(size_in_bytes int) string {
return '${size_in} ${sizes[index]}'
}

struct FileInfo {
// Named `RepoFileInfo` rather than `FileInfo` to avoid colliding with
// `os.FileInfo`, which V resolves in the wrong scope when this type is
// substituted into the `api.ApiSuccessResponse[T]` generic.
struct RepoFileInfo {
name string
last_msg string
last_hash string
Expand Down
10 changes: 5 additions & 5 deletions repo/file_routes.v
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import rand
// GET /:username/:repo_name/new/:branch_name... - Show create file form.
// The catch-all is required because branch names may contain `/`.
@['/:username/:repo_name/new/:branch_name...']
pub fn (mut app App) new_file(username string, repo_name string, branch_name string) veb.Result {
pub fn (mut app App) new_file(mut ctx Context, username string, repo_name string, branch_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }

if repo.require_signed_commits || !ctx.logged_in || !app.user_can_push_branch(ctx.user.id, repo, branch_name)
Expand All @@ -23,7 +23,7 @@ pub fn (mut app App) new_file(username string, repo_name string, branch_name str

// GET /:username/:repo_name/new-ci-file - Show create .gitly-ci.yml form (pre-filled)
@['/:username/:repo_name/new-ci-file']
pub fn (mut app App) new_ci_file(username string, repo_name string) veb.Result {
pub fn (mut app App) new_ci_file(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }

if repo.require_signed_commits || !ctx.logged_in
Expand All @@ -46,7 +46,7 @@ pub fn (mut app App) new_ci_file(username string, repo_name string) veb.Result {

// GET /:username/:repo_name/edit/:location... - Show edit file form
@['/:username/:repo_name/edit/:location...']
pub fn (mut app App) edit_file(username string, repo_name string, location string) veb.Result {
pub fn (mut app App) edit_file(mut ctx Context, username string, repo_name string, location string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or { return ctx.not_found() }
if repo.require_signed_commits || !ctx.logged_in || !app.user_can_write_repo(ctx.user.id, repo) {
return ctx.redirect_to_repository(username, repo_name)
Expand All @@ -69,7 +69,7 @@ pub fn (mut app App) edit_file(username string, repo_name string, location strin

// POST /:username/:repo_name/update-file - Save edited file
@['/:username/:repo_name/update-file'; post]
pub fn (mut app App) handle_update_file(username string, repo_name string) veb.Result {
pub fn (mut app App) handle_update_file(mut ctx Context, username string, repo_name string) veb.Result {
mut repo := app.find_repo_by_name_and_username(repo_name, username) or {
return ctx.not_found()
}
Expand Down Expand Up @@ -132,7 +132,7 @@ pub fn (mut app App) handle_update_file(username string, repo_name string) veb.R

// POST /:username/:repo_name/create-file - Create a file in the repo
@['/:username/:repo_name/create-file'; post]
pub fn (mut app App) handle_create_file(username string, repo_name string) veb.Result {
pub fn (mut app App) handle_create_file(mut ctx Context, username string, repo_name string) veb.Result {
mut repo := app.find_repo_by_name_and_username(repo_name, username) or {
return ctx.not_found()
}
Expand Down
20 changes: 10 additions & 10 deletions repo/repo_routes.v
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ fn repo_sort_indicator(current_sort string, current_dir string, target_sort stri
}

@['/:username/repos']
pub fn (mut app App) user_repos(username string) veb.Result {
pub fn (mut app App) user_repos(mut ctx Context, username string) veb.Result {
exists, user := app.check_username(username)

if !exists {
Expand Down Expand Up @@ -128,7 +128,7 @@ pub fn (mut app App) user_repos(username string) veb.Result {
}

@['/:username/stars']
pub fn (mut app App) user_stars(username string) veb.Result {
pub fn (mut app App) user_stars(mut ctx Context, username string) veb.Result {
exists, user := app.check_username(username)

if !exists {
Expand All @@ -145,7 +145,7 @@ pub fn (mut app App) user_stars(username string) veb.Result {
}

@['/:username/:repo_name/settings']
pub fn (mut app App) repo_settings(username string, repo_name string) veb.Result {
pub fn (mut app App) repo_settings(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or {
return ctx.redirect_to_repository(username, repo_name)
}
Expand All @@ -161,7 +161,7 @@ pub fn (mut app App) repo_settings(username string, repo_name string) veb.Result
}

@['/:username/:repo_name/settings'; post]
pub fn (mut app App) handle_update_repo_settings(username string, repo_name string) veb.Result {
pub fn (mut app App) handle_update_repo_settings(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or {
return ctx.redirect_to_repository(username, repo_name)
}
Expand Down Expand Up @@ -226,7 +226,7 @@ pub fn (mut app App) handle_update_repo_settings(username string, repo_name stri
}

@['/:username/:repo_name/settings/features'; post]
pub fn (mut app App) handle_update_repo_features(username string, repo_name string) veb.Result {
pub fn (mut app App) handle_update_repo_features(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or {
return ctx.redirect_to_repository(username, repo_name)
}
Expand All @@ -246,7 +246,7 @@ pub fn (mut app App) handle_update_repo_features(username string, repo_name stri
}

@['/:user/:repo_name/delete'; post]
pub fn (mut app App) handle_repo_delete(username string, repo_name string) veb.Result {
pub fn (mut app App) handle_repo_delete(mut ctx Context, username string, repo_name string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or {
return ctx.redirect_to_repository(username, repo_name)
}
Expand All @@ -273,7 +273,7 @@ pub fn (mut app App) handle_repo_delete(username string, repo_name string) veb.R
}

@['/:username/:repo_name/move'; post]
pub fn (mut app App) handle_repo_move(username string, repo_name string, dest string, verify string) veb.Result {
pub fn (mut app App) handle_repo_move(mut ctx Context, username string, repo_name string, dest string, verify string) veb.Result {
repo := app.find_repo_by_name_and_username(repo_name, username) or {
return ctx.redirect_to_index()
}
Expand Down Expand Up @@ -1028,9 +1028,9 @@ pub fn (mut app App) handle_api_repo_files(mut ctx Context, repo_id_str string)
}

items := app.find_repository_items(repo_id, branch, path)
mut result := []FileInfo{}
mut result := []RepoFileInfo{}
for item in items {
result << FileInfo{
result << RepoFileInfo{
name: item.name
last_msg: item.last_msg
last_hash: item.last_hash
Expand All @@ -1039,7 +1039,7 @@ pub fn (mut app App) handle_api_repo_files(mut ctx Context, repo_id_str string)
}
}

return ctx.json(api.ApiSuccessResponse[[]FileInfo]{
return ctx.json(api.ApiSuccessResponse[[]RepoFileInfo]{
success: true
result: result
})
Expand Down
4 changes: 2 additions & 2 deletions repo/tag_routes.v
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ import os
import rand

@['/:username/:repo_name/tag/:tag/:format']
pub fn (mut app App) handle_download_tag_archive(username string, repo_name string, tag string, format string) veb.Result {
pub fn (mut app App) handle_download_tag_archive(mut ctx Context, username string, repo_name string, tag string, format string) veb.Result {
return stream_tag_archive(mut app, mut ctx, username, repo_name, tag, format)
}

// The legacy route above cannot represent a tag containing `/`, because veb
// treats each slash as another route segment. Keep it for existing links and
// use this catch-all route for canonical release downloads.
@['/:username/:repo_name/archive/:tag...']
pub fn (mut app App) handle_download_tag_archive_path(username string, repo_name string, tag string) veb.Result {
pub fn (mut app App) handle_download_tag_archive_path(mut ctx Context, username string, repo_name string, tag string) veb.Result {
format := ctx.query['format'] or { '' }
return stream_tag_archive(mut app, mut ctx, username, repo_name, tag, format)
}
Expand Down
45 changes: 44 additions & 1 deletion search_routes.v
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
module main

import veb
import git

const max_search_query_len = 100

struct CodeSearchResult {
repo_user string
repo_name string
path string
}

// Preserve international project and user names while preventing callers from
// turning the search box into an unbounded SQL LIKE wildcard query.
fn normalize_search_query(query string) string {
Expand All @@ -28,7 +35,11 @@ fn normalize_search_query(query string) string {
pub fn (mut app App) search() veb.Result {
query := (ctx.query['query'] or { '' }).trim_space()
requested_type := ctx.query['type'] or { 'repos' }
search_type := if requested_type in ['repos', 'users'] { requested_type } else { 'repos' }
search_type := if requested_type in ['repos', 'users', 'code'] {
requested_type
} else {
'repos'
}
valid_query := normalize_search_query(query)

repos := if search_type == 'repos' && valid_query != '' {
Expand All @@ -43,5 +54,37 @@ pub fn (mut app App) search() veb.Result {
[]User{}
}

mut code_results := []CodeSearchResult{}
if search_type == 'code' && valid_query != '' {
code_results = app.search_code(valid_query)
}

return $veb.html()
}

fn (mut app App) search_code(query string) []CodeSearchResult {
mut results := []CodeSearchResult{}
repos := sql app.db {
select from Repo where is_public == true limit 20
} or { []Repo{} }
for repo in repos {
res := git.Git.exec_in_dir(repo.git_dir, ['grep', '-l', '-I', query, repo.primary_branch])
if res.exit_code != 0 {
continue
}
for line in res.output.split_into_lines() {
path := line.trim_space()
if path == '' {
continue
}
results << CodeSearchResult{ repo_user: repo.user_name, repo_name: repo.name, path: path }
if results.len >= 50 {
break
}
}
if results.len >= 50 {
break
}
}
return results
}
Loading
Loading