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
35 changes: 34 additions & 1 deletion commit/commit_routes.v
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import veb
import time
import api
import git
import os

@['/api/v1/:user/:repo_name/:branch_name/commits/count']
fn (mut app App) handle_commits_count(mut ctx Context, username string, repo_name string, branch_name string) veb.Result {
Expand Down Expand Up @@ -32,7 +33,7 @@ fn (mut app App) handle_commits_count(mut ctx Context, username string, repo_nam
// app.debug("${branch} ${count}" )
return ctx.json(api.ApiCommitCount{
success: true
result: count
result: count
})
}

Expand Down Expand Up @@ -140,3 +141,35 @@ pub fn (mut app App) commit(mut ctx Context, username string, repo_name string,

return $veb.html()
}

@['/:username/:repo_name/revert/:hash'; post]
pub fn (mut app App) handle_revert_commit(mut ctx Context, username string, repo_name string, hash 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()
}
branch := ctx.form['branch'] or { repo.primary_branch }
if !is_safe_ref(branch) || !is_valid_commit_hash(hash) {
ctx.error('Invalid branch or commit')
return ctx.redirect('///-/commits/')
}
worktree := os.join_path(os.temp_dir(), 'gitly_revert_')
os.mkdir_all(worktree) or {
ctx.error('Failed to create worktree: ')
return ctx.redirect('///-/commits/')
}
defer { os.rmdir_all(worktree) or {} }
add_res := git.Git.exec_in_dir(repo.git_dir, ['worktree', 'add', '--force', worktree, branch])
if add_res.exit_code != 0 {
ctx.error('Failed to prepare worktree: ')
return ctx.redirect('///-/commits/')
}
revert_res := git.Git.exec_in_dir(worktree, ['revert', '--no-edit', hash])
remove_res := git.Git.exec_in_dir(repo.git_dir, ['worktree', 'remove', '--force', worktree])
if revert_res.exit_code != 0 {
ctx.error('Revert failed: ')
return ctx.redirect('///-/commits/')
}
_ = remove_res
return ctx.redirect('///-/commits/')
}
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
Loading