You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

475 lines
16 KiB

Pull request review/approval and comment on code (#3748) * Initial ui components for pull request review * Add Review Add IssueComment types Signed-off-by: Jonas Franz <info@jonasfranz.software> (cherry picked from commit 2b4daab) Signed-off-by: Jonas Franz <info@jonasfranz.software> * Replace ReviewComment with Content Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add load functions Add ReviewID to findComments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add create review comment implementation Add migration for review Other small changes Signed-off-by: Jonas Franz <info@jonasfranz.software> * Simplified create and find functions for review Signed-off-by: Jonas Franz <info@jonasfranz.software> * Moved "Pending" to first position Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add GetCurrentReview to simplify fetching current review Signed-off-by: Jonas Franz <info@jonasfranz.software> * Preview for listing comments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Move new comment form to its own file Signed-off-by: Jonas Franz <info@jonasfranz.software> * Implement Review form Show Review comments on comment stream Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for single comments Showing buttons in context Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add pending tag to pending review comments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add unit tests for Review Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fetch all review ids at once Add unit tests Signed-off-by: Jonas Franz <info@jonasfranz.software> * gofmt Signed-off-by: Jonas Franz <info@jonasfranz.software> * Improved comment rendering in "Files" view by adding Comments to DiffLine Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for invalidating comments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Switched back to code.gitea.io/git Signed-off-by: Jonas Franz <info@jonasfranz.software> * Moved review migration from v64 to v65 Signed-off-by: Jonas Franz <info@jonasfranz.software> * Rebuild css Signed-off-by: Jonas Franz <info@jonasfranz.software> * gofmt Signed-off-by: Jonas Franz <info@jonasfranz.software> * Improve translations Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix unit tests by updating fixtures and updating outdated test Signed-off-by: Jonas Franz <info@jonasfranz.software> * Comments will be shown at the right place now Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for deleting CodeComments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix problems caused by files in subdirectories Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for showing code comments of reviews in conversation Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for "Show/Hide outdated" Signed-off-by: Jonas Franz <info@jonasfranz.software> * Update code.gitea.io/git Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for new webhooks Signed-off-by: Jonas Franz <info@jonasfranz.software> * Update comparison Signed-off-by: Jonas Franz <info@jonasfranz.software> * Resolve conflicts Signed-off-by: Jonas Franz <info@jonasfranz.software> * Minor UI improvements * update code.gitea.io/git * Fix ui bug reported by @lunny causing wrong position of add button Add functionality to "Cancel" button Add scale effects to add button Hide "Cancel" button for existing comments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Prepare solving conflicts Signed-off-by: Jonas Franz <info@jonasfranz.software> * Show add button only if no comments already exist for the line Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add missing vendor files Signed-off-by: Jonas Franz <info@jonasfranz.software> * Check if reviewer is nil Signed-off-by: Jonas Franz <info@jonasfranz.software> * Show forms only to users who are logged in Signed-off-by: Jonas Franz <info@jonasfranz.software> * Revert "Show forms only to users who are logged in" This reverts commit c083682 Signed-off-by: Jonas Franz <info@jonasfranz.software> * Save patch in comment Render patch for code comments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add link to comment in code Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add reply form to comment list Show forms only to signed in users Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add 'Reply' as translatable Add CODE_COMMENT_LINES setting Signed-off-by: Jonas Franz <info@jonasfranz.software> * gofmt Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix problems introduced by checking for singed in user Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add v70 Signed-off-by: Jonas Franz <info@jonasfranz.software> * Update generated stylesheet Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix preview Beginn with new review comment patch system Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add new algo to generate diff for line range Remove old algo used for cutting big diffs (it was very buggy) * Add documentation and example for CutDiffAroundLine * Fix example of CutDiffAroundLine * Fix some comment UI rendering bugs * Add code comment edit mode * Send notifications / actions to users until review gets published Fix diff generation bug Fix wrong hashtag * Fix vet errors * Send notifications also for single comments * Fix some notification bugs, fix link * Fix: add comment icon is only shown on code lines * Add lint comment * Add unit tests for git diff * Add more error messages * Regenerated css Signed-off-by: Jonas Franz <info@jonasfranz.software> * fmt Signed-off-by: Jonas Franz <info@jonasfranz.software> * Regenerated CSS with latest less version Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix test by updating comment type to new ID Signed-off-by: Jonas Franz <info@jonasfranz.software> * Introducing CodeComments as type for map[string]map[int64][]*Comment Other minor code improvements Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix data-tab issues Signed-off-by: Jonas Franz <info@jonasfranz.software> * Remove unnecessary change Signed-off-by: Jonas Franz <info@jonasfranz.software> * refactored checkForInvalidation Signed-off-by: Jonas Franz <info@jonasfranz.software> * Append comments instead of setting Signed-off-by: Jonas Franz <info@jonasfranz.software> * Use HeadRepo instead of BaseRepo Signed-off-by: Jonas Franz <info@jonasfranz.software> * Update migration Signed-off-by: Jonas Franz <info@jonasfranz.de> * Regenerated CSS Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add copyright Signed-off-by: Jonas Franz <info@jonasfranz.software> * Update index.css Signed-off-by: Jonas Franz <info@jonasfranz.software>
5 years ago
Pull request review/approval and comment on code (#3748) * Initial ui components for pull request review * Add Review Add IssueComment types Signed-off-by: Jonas Franz <info@jonasfranz.software> (cherry picked from commit 2b4daab) Signed-off-by: Jonas Franz <info@jonasfranz.software> * Replace ReviewComment with Content Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add load functions Add ReviewID to findComments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add create review comment implementation Add migration for review Other small changes Signed-off-by: Jonas Franz <info@jonasfranz.software> * Simplified create and find functions for review Signed-off-by: Jonas Franz <info@jonasfranz.software> * Moved "Pending" to first position Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add GetCurrentReview to simplify fetching current review Signed-off-by: Jonas Franz <info@jonasfranz.software> * Preview for listing comments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Move new comment form to its own file Signed-off-by: Jonas Franz <info@jonasfranz.software> * Implement Review form Show Review comments on comment stream Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for single comments Showing buttons in context Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add pending tag to pending review comments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add unit tests for Review Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fetch all review ids at once Add unit tests Signed-off-by: Jonas Franz <info@jonasfranz.software> * gofmt Signed-off-by: Jonas Franz <info@jonasfranz.software> * Improved comment rendering in "Files" view by adding Comments to DiffLine Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for invalidating comments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Switched back to code.gitea.io/git Signed-off-by: Jonas Franz <info@jonasfranz.software> * Moved review migration from v64 to v65 Signed-off-by: Jonas Franz <info@jonasfranz.software> * Rebuild css Signed-off-by: Jonas Franz <info@jonasfranz.software> * gofmt Signed-off-by: Jonas Franz <info@jonasfranz.software> * Improve translations Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix unit tests by updating fixtures and updating outdated test Signed-off-by: Jonas Franz <info@jonasfranz.software> * Comments will be shown at the right place now Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for deleting CodeComments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix problems caused by files in subdirectories Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for showing code comments of reviews in conversation Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for "Show/Hide outdated" Signed-off-by: Jonas Franz <info@jonasfranz.software> * Update code.gitea.io/git Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add support for new webhooks Signed-off-by: Jonas Franz <info@jonasfranz.software> * Update comparison Signed-off-by: Jonas Franz <info@jonasfranz.software> * Resolve conflicts Signed-off-by: Jonas Franz <info@jonasfranz.software> * Minor UI improvements * update code.gitea.io/git * Fix ui bug reported by @lunny causing wrong position of add button Add functionality to "Cancel" button Add scale effects to add button Hide "Cancel" button for existing comments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Prepare solving conflicts Signed-off-by: Jonas Franz <info@jonasfranz.software> * Show add button only if no comments already exist for the line Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add missing vendor files Signed-off-by: Jonas Franz <info@jonasfranz.software> * Check if reviewer is nil Signed-off-by: Jonas Franz <info@jonasfranz.software> * Show forms only to users who are logged in Signed-off-by: Jonas Franz <info@jonasfranz.software> * Revert "Show forms only to users who are logged in" This reverts commit c083682 Signed-off-by: Jonas Franz <info@jonasfranz.software> * Save patch in comment Render patch for code comments Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add link to comment in code Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add reply form to comment list Show forms only to signed in users Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add 'Reply' as translatable Add CODE_COMMENT_LINES setting Signed-off-by: Jonas Franz <info@jonasfranz.software> * gofmt Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix problems introduced by checking for singed in user Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add v70 Signed-off-by: Jonas Franz <info@jonasfranz.software> * Update generated stylesheet Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix preview Beginn with new review comment patch system Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add new algo to generate diff for line range Remove old algo used for cutting big diffs (it was very buggy) * Add documentation and example for CutDiffAroundLine * Fix example of CutDiffAroundLine * Fix some comment UI rendering bugs * Add code comment edit mode * Send notifications / actions to users until review gets published Fix diff generation bug Fix wrong hashtag * Fix vet errors * Send notifications also for single comments * Fix some notification bugs, fix link * Fix: add comment icon is only shown on code lines * Add lint comment * Add unit tests for git diff * Add more error messages * Regenerated css Signed-off-by: Jonas Franz <info@jonasfranz.software> * fmt Signed-off-by: Jonas Franz <info@jonasfranz.software> * Regenerated CSS with latest less version Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix test by updating comment type to new ID Signed-off-by: Jonas Franz <info@jonasfranz.software> * Introducing CodeComments as type for map[string]map[int64][]*Comment Other minor code improvements Signed-off-by: Jonas Franz <info@jonasfranz.software> * Fix data-tab issues Signed-off-by: Jonas Franz <info@jonasfranz.software> * Remove unnecessary change Signed-off-by: Jonas Franz <info@jonasfranz.software> * refactored checkForInvalidation Signed-off-by: Jonas Franz <info@jonasfranz.software> * Append comments instead of setting Signed-off-by: Jonas Franz <info@jonasfranz.software> * Use HeadRepo instead of BaseRepo Signed-off-by: Jonas Franz <info@jonasfranz.software> * Update migration Signed-off-by: Jonas Franz <info@jonasfranz.de> * Regenerated CSS Signed-off-by: Jonas Franz <info@jonasfranz.software> * Add copyright Signed-off-by: Jonas Franz <info@jonasfranz.software> * Update index.css Signed-off-by: Jonas Franz <info@jonasfranz.software>
5 years ago
Repository avatars (#6986) * Repository avatars - first variant of code from old work for gogs - add migration 87 - add new option in app.ini - add en-US locale string - add new class in repository.less * Add changed index.css, remove unused template name * Update en-us doc about configuration options * Add comments to new functions, add new option to docker app.ini * Add comment for lint * Remove variable, not needed * Fix formatting * Update swagger api template * Check if avatar exists * Fix avatar link/path checks * Typo * TEXT column can't have a default value * Fixes: - remove old avatar file on upload - use ID in name of avatar file - users may upload same files - add simple tests * Fix fmt check * Generate PNG instead of "static" GIF * More informative comment * Fix error message * Update avatar upload checks: - add file size check - add new option - update config docs - add new string to en-us locale * Fixes: - use FileHEader field for check file size - add new test - upload big image * Fix formatting * Update comments * Update log message * Removed wrong style - not needed * Use Sync2 to migrate * Update repos list view - bigger avatar - fix html blocks alignment * A little adjust avatar size * Use small icons for explore/repo list * Use new cool avatar preparation func by @lafriks * Missing changes for new function * Remove unused import, move imports * Missed new option definition in app.ini Add file size check in user/profile avatar upload * Use smaller field length for Avatar * Use session to update repo DB data, update DeleteAvatar - use session too * Fix err variable definition * As suggested @lafriks - return as soon as possible, code readability
5 years ago
Template Repositories (#8768) * Start work on templates Signed-off-by: jolheiser <john.olheiser@gmail.com> * Continue work Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix IsTemplate vs IsGenerated Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix tabs vs spaces * Tabs vs Spaces * Add templates to API & start adding tests Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix integration tests Signed-off-by: jolheiser <john.olheiser@gmail.com> * Remove unused User Signed-off-by: jolheiser <john.olheiser@gmail.com> * Move template tests to existing repos Signed-off-by: jolheiser <john.olheiser@gmail.com> * Minor re-check updates and cleanup Signed-off-by: jolheiser <john.olheiser@gmail.com> * make fmt Signed-off-by: jolheiser <john.olheiser@gmail.com> * Test cleanup Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix optionalbool Signed-off-by: jolheiser <john.olheiser@gmail.com> * make fmt Signed-off-by: jolheiser <john.olheiser@gmail.com> * Test fixes and icon change Signed-off-by: jolheiser <john.olheiser@gmail.com> * Add new user and repo for tests Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix tests (finally) Signed-off-by: jolheiser <john.olheiser@gmail.com> * Update meta repo with env variables Signed-off-by: jolheiser <john.olheiser@gmail.com> * Move generation to create page Combine with repo create template Modify API search to prioritize owner for repo Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix tests and coverage Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix swagger and JS lint Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix API searching for own private repos Signed-off-by: jolheiser <john.olheiser@gmail.com> * Change wording Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix repo search test. User had a private repo that didn't show up Signed-off-by: jolheiser <john.olheiser@gmail.com> * Another search test fix Signed-off-by: jolheiser <john.olheiser@gmail.com> * Clarify git content Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> * Feedback updates Signed-off-by: jolheiser <john.olheiser@gmail.com> * Add topics WIP Signed-off-by: jolheiser <john.olheiser@gmail.com> * Finish adding topics Signed-off-by: jolheiser <john.olheiser@gmail.com> * Update locale Signed-off-by: jolheiser <john.olheiser@gmail.com>
4 years ago
Change target branch for pull request (#6488) * Adds functionality to change target branch of created pull requests Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Use const instead of var in JavaScript additions Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Check if branches are equal and if PR already exists before changing target branch Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Make sure to check all commits Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Print error messages for user as error flash message Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Disallow changing target branch of closed or merged pull requests Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Resolve conflicts after merge of upstream/master Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Change order of branch select fields Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Removes duplicate check Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Use ctx.Tr for translations Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Recompile JS Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Use correct translation namespace Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Remove redundant if condition Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Moves most change branch logic into pull service Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Completes comment Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Add Ref to ChangesPayload for logging changed target branches instead of creating a new struct Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Revert changes to go.mod Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Directly use createComment method Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Return 404 if pull request is not found. Move written check up Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Remove variable declaration Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Return client errors on change pull request target errors Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Return error in commit.HasPreviousCommit Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Adds blank line Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Test patch before persisting new target branch Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Update patch before testing (not working) Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Removes patch calls when changeing pull request target Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Removes unneeded check for base name Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Moves ChangeTargetBranch completely to pull service. Update patch status. Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Set webhook mode after errors were validated Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Update PR in one transaction Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Move logic for check if head is equal with branch to pull model Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Adds missing comment and simplify return Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com> * Adjust CreateComment method call Signed-off-by: Mario Lubenka <mario.lubenka@googlemail.com>
4 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
4 years ago
Add Organization Wide Labels (#10814) * Add organization wide labels Implement organization wide labels similar to organization wide webhooks. This lets you create individual labels for organizations that can be used for all repos under that organization (so being able to reuse the same label across multiple repos). This makes it possible for small organizations with many repos to use labels effectively. Fixes #7406 * Add migration * remove comments * fix tests * Update options/locale/locale_en-US.ini Removed unused translation string * show org labels in issue search label filter * Use more clear var name * rename migration after merge from master * comment typo * update migration again after rebase with master * check for orgID <=0 per guillep2k review * fmt * Apply suggestions from code review Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> * remove unused code * Make sure RepoID is 0 when searching orgID per code review * more changes/code review requests * More descriptive translation var per code review * func description/delete comment when issue label deleted instead of hiding it * remove comment * only use issues in that repo when calculating number of open issues for org label on repo label page * Add integration test for IssuesSearch API with labels * remove unused function * Update models/issue_label.go Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> * Use subquery in GetLabelIDsInReposByNames * Fix tests to use correct orgID * fix more tests * IssuesSearch api now uses new BuildLabelNamesIssueIDsCondition. Add a few more tests as well * update comment for clarity * Revert previous code change now that we can use the new BuildLabelNamesIssueIDsCondition * Don't sort repos by date in IssuesSearch API After much debugging I've found a strange issue where in some cases MySQL will return a different result than other enigines if a query is sorted by a null collumn. For example with our integration test data where we don't set updated_unix in repository fixtures: SELECT `id`, `owner_id`, `owner_name`, `lower_name`, `name`, `description`, `website`, `original_service_type`, `original_url`, `default_branch`, `num_watches`, `num_stars`, `num_forks`, `num_issues`, `num_closed_issues`, `num_pulls`, `num_closed_pulls`, `num_milestones`, `num_closed_milestones`, `is_private`, `is_empty`, `is_archived`, `is_mirror`, `status`, `is_fork`, `fork_id`, `is_template`, `template_id`, `size`, `is_fsck_enabled`, `close_issues_via_commit_in_any_branch`, `topics`, `avatar`, `created_unix`, `updated_unix` FROM `repository` ORDER BY updated_unix DESC LIMIT 15 OFFSET 45 Returns different results for MySQL than other engines. However, the similar query: SELECT `id`, `owner_id`, `owner_name`, `lower_name`, `name`, `description`, `website`, `original_service_type`, `original_url`, `default_branch`, `num_watches`, `num_stars`, `num_forks`, `num_issues`, `num_closed_issues`, `num_pulls`, `num_closed_pulls`, `num_milestones`, `num_closed_milestones`, `is_private`, `is_empty`, `is_archived`, `is_mirror`, `status`, `is_fork`, `fork_id`, `is_template`, `template_id`, `size`, `is_fsck_enabled`, `close_issues_via_commit_in_any_branch`, `topics`, `avatar`, `created_unix`, `updated_unix` FROM `repository` ORDER BY updated_unix DESC LIMIT 15 OFFSET 30 Returns the same results. This causes integration tests to fail on MySQL in certain cases but would never show up in a real installation. Since this API call always returns issues based on the optionally provided repo_priority_id or the issueID itself, there is no change to results by changing the repo sorting method used to get ids earlier in the function. * linter is back! * code review * remove now unused option * Fix newline at end of files * more unused code * update to master * check for matching ids before query * Update models/issue_label.go Co-Authored-By: 6543 <6543@obermui.de> * Update models/issue_label.go * update comments * Update routers/org/setting.go Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com> Co-authored-by: 6543 <6543@obermui.de>
4 years ago
Better logging (#6038) (#6095) * Panic don't fatal on create new logger Fixes #5854 Signed-off-by: Andrew Thornton <art27@cantab.net> * partial broken * Update the logging infrastrcture Signed-off-by: Andrew Thornton <art27@cantab.net> * Reset the skip levels for Fatal and Error Signed-off-by: Andrew Thornton <art27@cantab.net> * broken ncsa * More log.Error fixes Signed-off-by: Andrew Thornton <art27@cantab.net> * Remove nal * set log-levels to lowercase * Make console_test test all levels * switch to lowercased levels * OK now working * Fix vetting issues * Fix lint * Fix tests * change default logging to match current gitea * Improve log testing Signed-off-by: Andrew Thornton <art27@cantab.net> * reset error skip levels to 0 * Update documentation and access logger configuration * Redirect the router log back to gitea if redirect macaron log but also allow setting the log level - i.e. TRACE * Fix broken level caching * Refactor the router log * Add Router logger * Add colorizing options * Adjust router colors * Only create logger if they will be used * update app.ini.sample * rename Attribute ColorAttribute * Change from white to green for function * Set fatal/error levels * Restore initial trace logger * Fix Trace arguments in modules/auth/auth.go * Properly handle XORMLogger * Improve admin/config page * fix fmt * Add auto-compression of old logs * Update error log levels * Remove the unnecessary skip argument from Error, Fatal and Critical * Add stacktrace support * Fix tests * Remove x/sync from vendors? * Add stderr option to console logger * Use filepath.ToSlash to protect against Windows in tests * Remove prefixed underscores from names in colors.go * Remove not implemented database logger This was removed from Gogs on 4 Mar 2016 but left in the configuration since then. * Ensure that log paths are relative to ROOT_PATH * use path.Join * rename jsonConfig to logConfig * Rename "config" to "jsonConfig" to make it clearer * Requested changes * Requested changes: XormLogger * Try to color the windows terminal If successful default to colorizing the console logs * fixup * Colorize initially too * update vendor * Colorize logs on default and remove if this is not a colorizing logger * Fix documentation * fix test * Use go-isatty to detect if on windows we are on msys or cygwin * Fix spelling mistake * Add missing vendors * More changes * Rationalise the ANSI writer protection * Adjust colors on advice from @0x5c * Make Flags a comma separated list * Move to use the windows constant for ENABLE_VIRTUAL_TERMINAL_PROCESSING * Ensure matching is done on the non-colored message - to simpify EXPRESSION
5 years ago
Better logging (#6038) (#6095) * Panic don't fatal on create new logger Fixes #5854 Signed-off-by: Andrew Thornton <art27@cantab.net> * partial broken * Update the logging infrastrcture Signed-off-by: Andrew Thornton <art27@cantab.net> * Reset the skip levels for Fatal and Error Signed-off-by: Andrew Thornton <art27@cantab.net> * broken ncsa * More log.Error fixes Signed-off-by: Andrew Thornton <art27@cantab.net> * Remove nal * set log-levels to lowercase * Make console_test test all levels * switch to lowercased levels * OK now working * Fix vetting issues * Fix lint * Fix tests * change default logging to match current gitea * Improve log testing Signed-off-by: Andrew Thornton <art27@cantab.net> * reset error skip levels to 0 * Update documentation and access logger configuration * Redirect the router log back to gitea if redirect macaron log but also allow setting the log level - i.e. TRACE * Fix broken level caching * Refactor the router log * Add Router logger * Add colorizing options * Adjust router colors * Only create logger if they will be used * update app.ini.sample * rename Attribute ColorAttribute * Change from white to green for function * Set fatal/error levels * Restore initial trace logger * Fix Trace arguments in modules/auth/auth.go * Properly handle XORMLogger * Improve admin/config page * fix fmt * Add auto-compression of old logs * Update error log levels * Remove the unnecessary skip argument from Error, Fatal and Critical * Add stacktrace support * Fix tests * Remove x/sync from vendors? * Add stderr option to console logger * Use filepath.ToSlash to protect against Windows in tests * Remove prefixed underscores from names in colors.go * Remove not implemented database logger This was removed from Gogs on 4 Mar 2016 but left in the configuration since then. * Ensure that log paths are relative to ROOT_PATH * use path.Join * rename jsonConfig to logConfig * Rename "config" to "jsonConfig" to make it clearer * Requested changes * Requested changes: XormLogger * Try to color the windows terminal If successful default to colorizing the console logs * fixup * Colorize initially too * update vendor * Colorize logs on default and remove if this is not a colorizing logger * Fix documentation * fix test * Use go-isatty to detect if on windows we are on msys or cygwin * Fix spelling mistake * Add missing vendors * More changes * Rationalise the ANSI writer protection * Adjust colors on advice from @0x5c * Make Flags a comma separated list * Move to use the windows constant for ENABLE_VIRTUAL_TERMINAL_PROCESSING * Ensure matching is done on the non-colored message - to simpify EXPRESSION
5 years ago
  1. // Copyright 2015 The Gogs Authors. All rights reserved.
  2. // Copyright 2017 The Gitea Authors. All rights reserved.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. package migrations
  6. import (
  7. "fmt"
  8. "regexp"
  9. "strings"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/setting"
  12. "xorm.io/xorm"
  13. )
  14. const minDBVersion = 70 // Gitea 1.5.3
  15. // Migration describes on migration from lower version to high version
  16. type Migration interface {
  17. Description() string
  18. Migrate(*xorm.Engine) error
  19. }
  20. type migration struct {
  21. description string
  22. migrate func(*xorm.Engine) error
  23. }
  24. // NewMigration creates a new migration
  25. func NewMigration(desc string, fn func(*xorm.Engine) error) Migration {
  26. return &migration{desc, fn}
  27. }
  28. // Description returns the migration's description
  29. func (m *migration) Description() string {
  30. return m.description
  31. }
  32. // Migrate executes the migration
  33. func (m *migration) Migrate(x *xorm.Engine) error {
  34. return m.migrate(x)
  35. }
  36. // Version describes the version table. Should have only one row with id==1
  37. type Version struct {
  38. ID int64 `xorm:"pk autoincr"`
  39. Version int64
  40. }
  41. // This is a sequence of migrations. Add new migrations to the bottom of the list.
  42. // If you want to "retire" a migration, remove it from the top of the list and
  43. // update minDBVersion accordingly
  44. var migrations = []Migration{
  45. // Gitea 1.5.3 ends at v70
  46. // v70 -> v71
  47. NewMigration("add issue_dependencies", addIssueDependencies),
  48. // v71 -> v72
  49. NewMigration("protect each scratch token", addScratchHash),
  50. // v72 -> v73
  51. NewMigration("add review", addReview),
  52. // Gitea 1.6.4 ends at v73
  53. // v73 -> v74
  54. NewMigration("add must_change_password column for users table", addMustChangePassword),
  55. // v74 -> v75
  56. NewMigration("add approval whitelists to protected branches", addApprovalWhitelistsToProtectedBranches),
  57. // v75 -> v76
  58. NewMigration("clear nonused data which not deleted when user was deleted", clearNonusedData),
  59. // Gitea 1.7.6 ends at v76
  60. // v76 -> v77
  61. NewMigration("add pull request rebase with merge commit", addPullRequestRebaseWithMerge),
  62. // v77 -> v78
  63. NewMigration("add theme to users", addUserDefaultTheme),
  64. // v78 -> v79
  65. NewMigration("rename repo is_bare to repo is_empty", renameRepoIsBareToIsEmpty),
  66. // v79 -> v80
  67. NewMigration("add can close issues via commit in any branch", addCanCloseIssuesViaCommitInAnyBranch),
  68. // v80 -> v81
  69. NewMigration("add is locked to issues", addIsLockedToIssues),
  70. // v81 -> v82
  71. NewMigration("update U2F counter type", changeU2FCounterType),
  72. // Gitea 1.8.3 ends at v82
  73. // v82 -> v83
  74. NewMigration("hot fix for wrong release sha1 on release table", fixReleaseSha1OnReleaseTable),
  75. // v83 -> v84
  76. NewMigration("add uploader id for table attachment", addUploaderIDForAttachment),
  77. // v84 -> v85
  78. NewMigration("add table to store original imported gpg keys", addGPGKeyImport),
  79. // v85 -> v86
  80. NewMigration("hash application token", hashAppToken),
  81. // v86 -> v87
  82. NewMigration("add http method to webhook", addHTTPMethodToWebhook),
  83. // v87 -> v88
  84. NewMigration("add avatar field to repository", addAvatarFieldToRepository),
  85. // Gitea 1.9.6 ends at v88
  86. // v88 -> v89
  87. NewMigration("add commit status context field to commit_status", addCommitStatusContext),
  88. // v89 -> v90
  89. NewMigration("add original author/url migration info to issues, comments, and repo ", addOriginalMigrationInfo),
  90. // v90 -> v91
  91. NewMigration("change length of some repository columns", changeSomeColumnsLengthOfRepo),
  92. // v91 -> v92
  93. NewMigration("add index on owner_id of repository and type, review_id of comment", addIndexOnRepositoryAndComment),
  94. // v92 -> v93
  95. NewMigration("remove orphaned repository index statuses", removeLingeringIndexStatus),
  96. // v93 -> v94
  97. NewMigration("add email notification enabled preference to user", addEmailNotificationEnabledToUser),
  98. // v94 -> v95
  99. NewMigration("add enable_status_check, status_check_contexts to protected_branch", addStatusCheckColumnsForProtectedBranches),
  100. // v95 -> v96
  101. NewMigration("add table columns for cross referencing issues", addCrossReferenceColumns),
  102. // v96 -> v97
  103. NewMigration("delete orphaned attachments", deleteOrphanedAttachments),
  104. // v97 -> v98
  105. NewMigration("add repo_admin_change_team_access to user", addRepoAdminChangeTeamAccessColumnForUser),
  106. // v98 -> v99
  107. NewMigration("add original author name and id on migrated release", addOriginalAuthorOnMigratedReleases),
  108. // Gitea 1.10.3 ends at v99
  109. // v99 -> v100
  110. NewMigration("add task table and status column for repository table", addTaskTable),
  111. // v100 -> v101
  112. NewMigration("update migration repositories' service type", updateMigrationServiceTypes),
  113. // v101 -> v102
  114. NewMigration("change length of some external login users columns", changeSomeColumnsLengthOfExternalLoginUser),
  115. // v102 -> v103
  116. NewMigration("update migration repositories' service type", dropColumnHeadUserNameOnPullRequest),
  117. // v103 -> v104
  118. NewMigration("Add WhitelistDeployKeys to protected branch", addWhitelistDeployKeysToBranches),
  119. // v104 -> v105
  120. NewMigration("remove unnecessary columns from label", removeLabelUneededCols),
  121. // v105 -> v106
  122. NewMigration("add includes_all_repositories to teams", addTeamIncludesAllRepositories),
  123. // v106 -> v107
  124. NewMigration("add column `mode` to table watch", addModeColumnToWatch),
  125. // v107 -> v108
  126. NewMigration("Add template options to repository", addTemplateToRepo),
  127. // v108 -> v109
  128. NewMigration("Add comment_id on table notification", addCommentIDOnNotification),
  129. // v109 -> v110
  130. NewMigration("add can_create_org_repo to team", addCanCreateOrgRepoColumnForTeam),
  131. // v110 -> v111
  132. NewMigration("change review content type to text", changeReviewContentToText),
  133. // v111 -> v112
  134. NewMigration("update branch protection for can push and whitelist enable", addBranchProtectionCanPushAndEnableWhitelist),
  135. // v112 -> v113
  136. NewMigration("remove release attachments which repository deleted", removeAttachmentMissedRepo),
  137. // v113 -> v114
  138. NewMigration("new feature: change target branch of pull requests", featureChangeTargetBranch),
  139. // v114 -> v115
  140. NewMigration("Remove authentication credentials from stored URL", sanitizeOriginalURL),
  141. // v115 -> v116
  142. NewMigration("add user_id prefix to existing user avatar name", renameExistingUserAvatarName),
  143. // v116 -> v117
  144. NewMigration("Extend TrackedTimes", extendTrackedTimes),
  145. // v117 -> v118
  146. NewMigration("Add block on rejected reviews branch protection", addBlockOnRejectedReviews),
  147. // v118 -> v119
  148. NewMigration("Add commit id and stale to reviews", addReviewCommitAndStale),
  149. // v119 -> v120
  150. NewMigration("Fix migrated repositories' git service type", fixMigratedRepositoryServiceType),
  151. // v120 -> v121
  152. NewMigration("Add owner_name on table repository", addOwnerNameOnRepository),
  153. // v121 -> v122
  154. NewMigration("add is_restricted column for users table", addIsRestricted),
  155. // v122 -> v123
  156. NewMigration("Add Require Signed Commits to ProtectedBranch", addRequireSignedCommits),
  157. // v123 -> v124
  158. NewMigration("Add original informations for reactions", addReactionOriginals),
  159. // v124 -> v125
  160. NewMigration("Add columns to user and repository", addUserRepoMissingColumns),
  161. // v125 -> v126
  162. NewMigration("Add some columns on review for migration", addReviewMigrateInfo),
  163. // v126 -> v127
  164. NewMigration("Fix topic repository count", fixTopicRepositoryCount),
  165. // v127 -> v128
  166. NewMigration("add repository code language statistics", addLanguageStats),
  167. // v128 -> v129
  168. NewMigration("fix merge base for pull requests", fixMergeBase),
  169. // v129 -> v130
  170. NewMigration("remove dependencies from deleted repositories", purgeUnusedDependencies),
  171. // v130 -> v131
  172. NewMigration("Expand webhooks for more granularity", expandWebhooks),
  173. // v131 -> v132
  174. NewMigration("Add IsSystemWebhook column to webhooks table", addSystemWebhookColumn),
  175. // v132 -> v133
  176. NewMigration("Add Branch Protection Protected Files Column", addBranchProtectionProtectedFilesColumn),
  177. // v133 -> v134
  178. NewMigration("Add EmailHash Table", addEmailHashTable),
  179. // v134 -> v135
  180. NewMigration("Refix merge base for merged pull requests", refixMergeBase),
  181. // v135 -> v136
  182. NewMigration("Add OrgID column to Labels table", addOrgIDLabelColumn),
  183. // v136 -> v137
  184. NewMigration("Add CommitsAhead and CommitsBehind Column to PullRequest Table", addCommitDivergenceToPulls),
  185. // v137 -> v138
  186. NewMigration("Add Branch Protection Block Outdated Branch", addBlockOnOutdatedBranch),
  187. // v138 -> v139
  188. NewMigration("Add ResolveDoerID to Comment table", addResolveDoerIDCommentColumn),
  189. // v139 -> v140
  190. NewMigration("prepend refs/heads/ to issue refs", prependRefsHeadsToIssueRefs),
  191. // v140 -> v141
  192. NewMigration("Save detected language file size to database instead of percent", fixLanguageStatsToSaveSize),
  193. // v141 -> v142
  194. NewMigration("Add KeepActivityPrivate to User table", addKeepActivityPrivateUserColumn),
  195. // v142 -> v143
  196. NewMigration("Ensure Repository.IsArchived is not null", setIsArchivedToFalse),
  197. // v143 -> v144
  198. NewMigration("recalculate Stars number for all user", recalculateStars),
  199. // v144 -> v145
  200. NewMigration("update Matrix Webhook http method to 'PUT'", updateMatrixWebhookHTTPMethod),
  201. // v145 -> v146
  202. NewMigration("Increase Language field to 50 in LanguageStats", increaseLanguageField),
  203. }
  204. // GetCurrentDBVersion returns the current db version
  205. func GetCurrentDBVersion(x *xorm.Engine) (int64, error) {
  206. if err := x.Sync(new(Version)); err != nil {
  207. return -1, fmt.Errorf("sync: %v", err)
  208. }
  209. currentVersion := &Version{ID: 1}
  210. has, err := x.Get(currentVersion)
  211. if err != nil {
  212. return -1, fmt.Errorf("get: %v", err)
  213. }
  214. if !has {
  215. return -1, nil
  216. }
  217. return currentVersion.Version, nil
  218. }
  219. // ExpectedVersion returns the expected db version
  220. func ExpectedVersion() int64 {
  221. return int64(minDBVersion + len(migrations))
  222. }
  223. // EnsureUpToDate will check if the db is at the correct version
  224. func EnsureUpToDate(x *xorm.Engine) error {
  225. currentDB, err := GetCurrentDBVersion(x)
  226. if err != nil {
  227. return err
  228. }
  229. if currentDB < 0 {
  230. return fmt.Errorf("Database has not been initialised")
  231. }
  232. if minDBVersion > currentDB {
  233. return fmt.Errorf("DB version %d (<= %d) is too old for auto-migration. Upgrade to Gitea 1.6.4 first then upgrade to this version", currentDB, minDBVersion)
  234. }
  235. expected := ExpectedVersion()
  236. if currentDB != expected {
  237. return fmt.Errorf(`Current database version %d is not equal to the expected version %d. Please run "gitea [--config /path/to/app.ini] migrate" to update the database version`, currentDB, expected)
  238. }
  239. return nil
  240. }
  241. // Migrate database to current version
  242. func Migrate(x *xorm.Engine) error {
  243. if err := x.Sync(new(Version)); err != nil {
  244. return fmt.Errorf("sync: %v", err)
  245. }
  246. currentVersion := &Version{ID: 1}
  247. has, err := x.Get(currentVersion)
  248. if err != nil {
  249. return fmt.Errorf("get: %v", err)
  250. } else if !has {
  251. // If the version record does not exist we think
  252. // it is a fresh installation and we can skip all migrations.
  253. currentVersion.ID = 0
  254. currentVersion.Version = int64(minDBVersion + len(migrations))
  255. if _, err = x.InsertOne(currentVersion); err != nil {
  256. return fmt.Errorf("insert: %v", err)
  257. }
  258. }
  259. v := currentVersion.Version
  260. if minDBVersion > v {
  261. log.Fatal(`Gitea no longer supports auto-migration from your previously installed version.
  262. Please try upgrading to a lower version first (suggested v1.6.4), then upgrade to this version.`)
  263. return nil
  264. }
  265. if int(v-minDBVersion) > len(migrations) {
  266. // User downgraded Gitea.
  267. currentVersion.Version = int64(len(migrations) + minDBVersion)
  268. _, err = x.ID(1).Update(currentVersion)
  269. return err
  270. }
  271. for i, m := range migrations[v-minDBVersion:] {
  272. log.Info("Migration[%d]: %s", v+int64(i), m.Description())
  273. if err = m.Migrate(x); err != nil {
  274. return fmt.Errorf("do migrate: %v", err)
  275. }
  276. currentVersion.Version = v + int64(i) + 1
  277. if _, err = x.ID(1).Update(currentVersion); err != nil {
  278. return err
  279. }
  280. }
  281. return nil
  282. }
  283. func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...string) (err error) {
  284. if tableName == "" || len(columnNames) == 0 {
  285. return nil
  286. }
  287. // TODO: This will not work if there are foreign keys
  288. switch {
  289. case setting.Database.UseSQLite3:
  290. // First drop the indexes on the columns
  291. res, errIndex := sess.Query(fmt.Sprintf("PRAGMA index_list(`%s`)", tableName))
  292. if errIndex != nil {
  293. return errIndex
  294. }
  295. for _, row := range res {
  296. indexName := row["name"]
  297. indexRes, err := sess.Query(fmt.Sprintf("PRAGMA index_info(`%s`)", indexName))
  298. if err != nil {
  299. return err
  300. }
  301. if len(indexRes) != 1 {
  302. continue
  303. }
  304. indexColumn := string(indexRes[0]["name"])
  305. for _, name := range columnNames {
  306. if name == indexColumn {
  307. _, err := sess.Exec(fmt.Sprintf("DROP INDEX `%s`", indexName))
  308. if err != nil {
  309. return err
  310. }
  311. }
  312. }
  313. }
  314. // Here we need to get the columns from the original table
  315. sql := fmt.Sprintf("SELECT sql FROM sqlite_master WHERE tbl_name='%s' and type='table'", tableName)
  316. res, err := sess.Query(sql)
  317. if err != nil {
  318. return err
  319. }
  320. tableSQL := string(res[0]["sql"])
  321. // Separate out the column definitions
  322. tableSQL = tableSQL[strings.Index(tableSQL, "("):]
  323. // Remove the required columnNames
  324. for _, name := range columnNames {
  325. tableSQL = regexp.MustCompile(regexp.QuoteMeta("`"+name+"`")+"[^`,)]*?[,)]").ReplaceAllString(tableSQL, "")
  326. }
  327. // Ensure the query is ended properly
  328. tableSQL = strings.TrimSpace(tableSQL)
  329. if tableSQL[len(tableSQL)-1] != ')' {
  330. if tableSQL[len(tableSQL)-1] == ',' {
  331. tableSQL = tableSQL[:len(tableSQL)-1]
  332. }
  333. tableSQL += ")"
  334. }
  335. // Find all the columns in the table
  336. columns := regexp.MustCompile("`([^`]*)`").FindAllString(tableSQL, -1)
  337. tableSQL = fmt.Sprintf("CREATE TABLE `new_%s_new` ", tableName) + tableSQL
  338. if _, err := sess.Exec(tableSQL); err != nil {
  339. return err
  340. }
  341. // Now restore the data
  342. columnsSeparated := strings.Join(columns, ",")
  343. insertSQL := fmt.Sprintf("INSERT INTO `new_%s_new` (%s) SELECT %s FROM %s", tableName, columnsSeparated, columnsSeparated, tableName)
  344. if _, err := sess.Exec(insertSQL); err != nil {
  345. return err
  346. }
  347. // Now drop the old table
  348. if _, err := sess.Exec(fmt.Sprintf("DROP TABLE `%s`", tableName)); err != nil {
  349. return err
  350. }
  351. // Rename the table
  352. if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `new_%s_new` RENAME TO `%s`", tableName, tableName)); err != nil {
  353. return err
  354. }
  355. case setting.Database.UsePostgreSQL:
  356. cols := ""
  357. for _, col := range columnNames {
  358. if cols != "" {
  359. cols += ", "
  360. }
  361. cols += "DROP COLUMN `" + col + "` CASCADE"
  362. }
  363. if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil {
  364. return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
  365. }
  366. case setting.Database.UseMySQL:
  367. // Drop indexes on columns first
  368. sql := fmt.Sprintf("SHOW INDEX FROM %s WHERE column_name IN ('%s')", tableName, strings.Join(columnNames, "','"))
  369. res, err := sess.Query(sql)
  370. if err != nil {
  371. return err
  372. }
  373. for _, index := range res {
  374. indexName := index["column_name"]
  375. if len(indexName) > 0 {
  376. _, err := sess.Exec(fmt.Sprintf("DROP INDEX `%s` ON `%s`", indexName, tableName))
  377. if err != nil {
  378. return err
  379. }
  380. }
  381. }
  382. // Now drop the columns
  383. cols := ""
  384. for _, col := range columnNames {
  385. if cols != "" {
  386. cols += ", "
  387. }
  388. cols += "DROP COLUMN `" + col + "`"
  389. }
  390. if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil {
  391. return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
  392. }
  393. case setting.Database.UseMSSQL:
  394. cols := ""
  395. for _, col := range columnNames {
  396. if cols != "" {
  397. cols += ", "
  398. }
  399. cols += "`" + strings.ToLower(col) + "`"
  400. }
  401. sql := fmt.Sprintf("SELECT Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('%[1]s') AND PARENT_COLUMN_ID IN (SELECT column_id FROM sys.columns WHERE lower(NAME) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))",
  402. tableName, strings.Replace(cols, "`", "'", -1))
  403. constraints := make([]string, 0)
  404. if err := sess.SQL(sql).Find(&constraints); err != nil {
  405. sess.Rollback()
  406. return fmt.Errorf("Find constraints: %v", err)
  407. }
  408. for _, constraint := range constraints {
  409. if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP CONSTRAINT `%s`", tableName, constraint)); err != nil {
  410. sess.Rollback()
  411. return fmt.Errorf("Drop table `%s` constraint `%s`: %v", tableName, constraint, err)
  412. }
  413. }
  414. if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP COLUMN %s", tableName, cols)); err != nil {
  415. sess.Rollback()
  416. return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
  417. }
  418. return sess.Commit()
  419. default:
  420. log.Fatal("Unrecognized DB")
  421. }
  422. return nil
  423. }