From fe642c30f01c4f3f6637851595ad1b36032461aa Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Tue, 2 Jul 2019 14:19:12 +0100 Subject: feat(third_party): Check in git-appraise --- third_party/go/git-appraise/.gitignore | 2 + third_party/go/git-appraise/CONTRIBUTING.md | 24 + third_party/go/git-appraise/LICENSE | 202 +++++ third_party/go/git-appraise/README.md | 158 ++++ third_party/go/git-appraise/commands/abandon.go | 139 +++ third_party/go/git-appraise/commands/accept.go | 109 +++ third_party/go/git-appraise/commands/commands.go | 55 ++ third_party/go/git-appraise/commands/comment.go | 165 ++++ .../go/git-appraise/commands/input/input.go | 118 +++ third_party/go/git-appraise/commands/list.go | 74 ++ .../go/git-appraise/commands/output/output.go | 216 +++++ third_party/go/git-appraise/commands/pull.go | 93 ++ third_party/go/git-appraise/commands/push.go | 49 + third_party/go/git-appraise/commands/rebase.go | 100 +++ third_party/go/git-appraise/commands/reject.go | 119 +++ third_party/go/git-appraise/commands/request.go | 182 ++++ .../go/git-appraise/commands/request_test.go | 36 + third_party/go/git-appraise/commands/show.go | 85 ++ third_party/go/git-appraise/commands/submit.go | 157 ++++ third_party/go/git-appraise/docs/tutorial.md | 404 +++++++++ .../go/git-appraise/git-appraise/git-appraise.go | 104 +++ third_party/go/git-appraise/repository/git.go | 987 +++++++++++++++++++++ third_party/go/git-appraise/repository/git_test.go | 94 ++ .../go/git-appraise/repository/mock_repo.go | 613 +++++++++++++ third_party/go/git-appraise/repository/repo.go | 221 +++++ .../go/git-appraise/review/analyses/analyses.go | 160 ++++ .../git-appraise/review/analyses/analyses_test.go | 77 ++ third_party/go/git-appraise/review/ci/ci.go | 95 ++ third_party/go/git-appraise/review/ci/ci_test.go | 85 ++ .../go/git-appraise/review/comment/comment.go | 266 ++++++ third_party/go/git-appraise/review/gpg/signable.go | 129 +++ .../go/git-appraise/review/request/request.go | 104 +++ third_party/go/git-appraise/review/review.go | 772 ++++++++++++++++ third_party/go/git-appraise/review/review_test.go | 870 ++++++++++++++++++ third_party/go/git-appraise/schema/analysis.json | 61 ++ third_party/go/git-appraise/schema/ci.json | 42 + third_party/go/git-appraise/schema/comment.json | 75 ++ third_party/go/git-appraise/schema/request.json | 58 ++ 38 files changed, 7300 insertions(+) create mode 100644 third_party/go/git-appraise/.gitignore create mode 100644 third_party/go/git-appraise/CONTRIBUTING.md create mode 100644 third_party/go/git-appraise/LICENSE create mode 100644 third_party/go/git-appraise/README.md create mode 100644 third_party/go/git-appraise/commands/abandon.go create mode 100644 third_party/go/git-appraise/commands/accept.go create mode 100644 third_party/go/git-appraise/commands/commands.go create mode 100644 third_party/go/git-appraise/commands/comment.go create mode 100644 third_party/go/git-appraise/commands/input/input.go create mode 100644 third_party/go/git-appraise/commands/list.go create mode 100644 third_party/go/git-appraise/commands/output/output.go create mode 100644 third_party/go/git-appraise/commands/pull.go create mode 100644 third_party/go/git-appraise/commands/push.go create mode 100644 third_party/go/git-appraise/commands/rebase.go create mode 100644 third_party/go/git-appraise/commands/reject.go create mode 100644 third_party/go/git-appraise/commands/request.go create mode 100644 third_party/go/git-appraise/commands/request_test.go create mode 100644 third_party/go/git-appraise/commands/show.go create mode 100644 third_party/go/git-appraise/commands/submit.go create mode 100644 third_party/go/git-appraise/docs/tutorial.md create mode 100644 third_party/go/git-appraise/git-appraise/git-appraise.go create mode 100644 third_party/go/git-appraise/repository/git.go create mode 100644 third_party/go/git-appraise/repository/git_test.go create mode 100644 third_party/go/git-appraise/repository/mock_repo.go create mode 100644 third_party/go/git-appraise/repository/repo.go create mode 100644 third_party/go/git-appraise/review/analyses/analyses.go create mode 100644 third_party/go/git-appraise/review/analyses/analyses_test.go create mode 100644 third_party/go/git-appraise/review/ci/ci.go create mode 100644 third_party/go/git-appraise/review/ci/ci_test.go create mode 100644 third_party/go/git-appraise/review/comment/comment.go create mode 100644 third_party/go/git-appraise/review/gpg/signable.go create mode 100644 third_party/go/git-appraise/review/request/request.go create mode 100644 third_party/go/git-appraise/review/review.go create mode 100644 third_party/go/git-appraise/review/review_test.go create mode 100644 third_party/go/git-appraise/schema/analysis.json create mode 100644 third_party/go/git-appraise/schema/ci.json create mode 100644 third_party/go/git-appraise/schema/comment.json create mode 100644 third_party/go/git-appraise/schema/request.json diff --git a/third_party/go/git-appraise/.gitignore b/third_party/go/git-appraise/.gitignore new file mode 100644 index 0000000000..385b6eee94 --- /dev/null +++ b/third_party/go/git-appraise/.gitignore @@ -0,0 +1,2 @@ +*~ +bin/ diff --git a/third_party/go/git-appraise/CONTRIBUTING.md b/third_party/go/git-appraise/CONTRIBUTING.md new file mode 100644 index 0000000000..8532a3336e --- /dev/null +++ b/third_party/go/git-appraise/CONTRIBUTING.md @@ -0,0 +1,24 @@ +Want to contribute? Great! First, read this page (including the small print at the end). + +### Before you contribute +Before we can use your code, you must sign the +[Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual?csw=1) +(CLA), which you can do online. The CLA is necessary mainly because you own the +copyright to your changes, even after your contribution becomes part of our +codebase. Therefore, we need your permission to use and distribute your code. +We also need to be sure of various other things—for instance that you'll tell +us if you know that your code infringes on other people's patents. You don't +have to sign the CLA until after you've submitted your code for review and a +member has approved it, but you must do it before we can put your code into our +codebase. Before you start working on a larger contribution, you should get in +touch with us first through the issue tracker with your idea so that we can +help out and possibly guide you. Coordinating up front avoids frustrations later. + +### Code reviews +All submissions, including submissions by project members, require review. You +may use a Github pull request to start such a review, but the review itself +will be conducted using this tool. + +### The small print +Contributions made by corporations are covered by a different agreement than +the one above, the Software Grant and Corporate Contributor License Agreement. \ No newline at end of file diff --git a/third_party/go/git-appraise/LICENSE b/third_party/go/git-appraise/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/third_party/go/git-appraise/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/third_party/go/git-appraise/README.md b/third_party/go/git-appraise/README.md new file mode 100644 index 0000000000..0227c41366 --- /dev/null +++ b/third_party/go/git-appraise/README.md @@ -0,0 +1,158 @@ +# Distributed Code Review For Git +[![Build Status](https://travis-ci.org/google/git-appraise.svg?branch=master)](https://travis-ci.org/google/git-appraise) + +This repo contains a command line tool for performing code reviews on git +repositories. + +## Overview + +This tool is a *distributed* code review system for git repos. + +By "distributed", we mean that code reviews are stored inside of the repository +as git objects. Every developer on your team has their own copy of the review +history that they can push or pull. When pulling, updates from the remote +repo are automatically merged by the tool. + +This design removes the need for any sort of server-side setup. As a result, +this tool can work with any git hosting provider, and the only setup required +is installing the client on your workstation. + +## Installation + +Assuming you have the [Go tools installed](https://golang.org/doc/install), run +the following command: + + go get github.com/google/git-appraise/git-appraise + +Then, either make sure that `${GOPATH}/bin` is in your PATH, or explicitly add the +"appraise" git alias by running the following command. + + git config --global alias.appraise '!'"${GOPATH}/bin/git-appraise" + +#### Windows: + + git config --global alias.appraise "!%GOPATH%/bin/git-appraise.exe" + +## Requirements + +This tool expects to run in an environment with the following attributes: + +1. The git command line tool is installed, and included in the PATH. +2. The tool is run from within a git repo. +3. The git command line tool is configured with the credentials it needs to + push to and pull from the remote repos. + +## Usage + +Requesting a code review: + + git appraise request + +Pushing code reviews to a remote: + + git appraise push [] + +Pulling code reviews from a remote: + + git appraise pull [] + +Listing open code reviews: + + git appraise list + +Showing the status of the current review, including comments: + + git appraise show + +Showing the diff of a review: + + git appraise show --diff [--diff-opts ""] [] + +Commenting on a review: + + git appraise comment -m "" [-f [-l ]] [] + +Accepting the changes in a review: + + git appraise accept [-m ""] [] + +Submitting the current review: + + git appraise submit [--merge | --rebase] + +A more detailed getting started doc is available [here](docs/tutorial.md). + +## Metadata + +The code review data is stored in [git-notes](https://git-scm.com/docs/git-notes), +using the formats described below. Each item stored is written as a single +line of JSON, and is written with at most one such item per line. This allows +the git notes to be automatically merged using the "cat\_sort\_uniq" strategy. + +Since these notes are not in a human-friendly form, all of the refs used to +track them start with the prefix "refs/notes/devtools". This helps make it +clear that these are meant to be read and written by automated tools. + +When a field named "v" appears in one of these notes, it is used to denote +the version of the metadata format being used. If that field is missing, then +it defaults to the value 0, which corresponds to this initial version of the +formats. + +### Code Review Requests + +Code review requests are stored in the "refs/notes/devtools/reviews" ref, and +annotate the first revision in a review. They must conform to the +[request schema](schema/request.json). + +If there are multiple requests for a single commit, then they are sorted by +timestamp and the final request is treated as the current one. This sorting +should be done in a stable manner, so that if there are multiple requests +with the same timestamp, then the last such request in the note is treated +as the current one. + +This design allows a user to update a review request by re-running the +`git appraise request` command. + +### Continuous Integration Status + +Continuous integration build and test results are stored in the +"refs/notes/devtools/ci" ref, and annotate the revision that was built and +tested. They must conform to the [ci schema](schema/ci.json). + +### Robot Comments + +Robot comments are comments generated by static analysis tools. These are +stored in the "refs/notes/devtools/analyses" ref, and annotate the revision. +They must conform to the [analysis schema](schema/analysis.json). + +### Review Comments + +Review comments are comments that were written by a person rather than by a +machine. These are stored in the "refs/notes/devtools/discuss" ref, and +annotate the first revision in the review. They must conform to the +[comment schema](schema/comment.json). + +## Integrations + +### Libraries + + - [Go (use git-appraise itself)](https://github.com/google/git-appraise/blob/master/review/review.go) + - [Rust](https://github.com/Nemo157/git-appraise-rs) + +### Graphical User Interfaces + + - [Git-Appraise-Web](https://github.com/google/git-appraise-web) + +### Plugins + + - [Eclipse](https://github.com/google/git-appraise-eclipse) + - [Jenkins](https://github.com/jenkinsci/google-git-notes-publisher-plugin) + +### Mirrors to other systems + + - [GitHub Pull Requests](https://github.com/google/git-pull-request-mirror) + - [Phabricator Revisions](https://github.com/google/git-phabricator-mirror) + +## Contributing + +Please see [the CONTRIBUTING file](CONTRIBUTING.md) for information on contributing to Git Appraise. diff --git a/third_party/go/git-appraise/commands/abandon.go b/third_party/go/git-appraise/commands/abandon.go new file mode 100644 index 0000000000..6f408e1663 --- /dev/null +++ b/third_party/go/git-appraise/commands/abandon.go @@ -0,0 +1,139 @@ +/* +Copyright 2015 Google Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package commands + +import ( + "errors" + "flag" + "fmt" + + "github.com/google/git-appraise/commands/input" + "github.com/google/git-appraise/repository" + "github.com/google/git-appraise/review" + "github.com/google/git-appraise/review/comment" + "github.com/google/git-appraise/review/gpg" + "github.com/google/git-appraise/review/request" +) + +var abandonFlagSet = flag.NewFlagSet("abandon", flag.ExitOnError) + +var ( + abandonMessageFile = abandonFlagSet.String("F", "", "Take the comment from the given file. Use - to read the message from the standard input") + abandonMessage = abandonFlagSet.String("m", "", "Message to attach to the review") + + abandonSign = abandonFlagSet.Bool("S", false, + "Sign the contents of the abandonment") +) + +// abandonReview adds an NMW comment to the current code review. +func abandonReview(repo repository.Repo, args []string) error { + abandonFlagSet.Parse(args) + args = abandonFlagSet.Args() + + var r *review.Review + var err error + if len(args) > 1 { + return errors.New("Only abandon a single review is supported.") + } + + if len(args) == 1 { + r, err = review.Get(repo, args[0]) + } else { + r, err = review.GetCurrent(repo) + } + + if err != nil { + return fmt.Errorf("Failed to load the review: %v\n", err) + } + if r == nil { + return errors.New("There is no matching review.") + } + + if *abandonMessageFile != "" && *abandonMessage == "" { + *abandonMessage, err = input.FromFile(*abandonMessageFile) + if err != nil { + return err + } + } + if *abandonMessageFile == "" && *abandonMessage == "" { + *abandonMessage, err = input.LaunchEditor(repo, commentFilename) + if err != nil { + return err + } + } + + abandonedCommit, err := r.GetHeadCommit() + if err != nil { + return err + } + location := comment.Location{ + Commit: abandonedCommit, + } + resolved := false + userEmail, err := repo.GetUserEmail() + if err != nil { + return err + } + c := comment.New(userEmail, *abandonMessage) + c.Location = &location + c.Resolved = &resolved + + var key string + if *abandonSign { + key, err := repo.GetUserSigningKey() + if err != nil { + return err + } + err = gpg.Sign(key, &c) + if err != nil { + return err + } + } + + err = r.AddComment(c) + if err != nil { + return err + } + + // Empty target ref indicates that request was abandoned + r.Request.TargetRef = "" + // (re)sign the request after clearing out `TargetRef'. + if *abandonSign { + err = gpg.Sign(key, &r.Request) + if err != nil { + return err + } + } + + note, err := r.Request.Write() + if err != nil { + return err + } + + return repo.AppendNote(request.Ref, r.Revision, note) +} + +// abandonCmd defines the "abandon" subcommand. +var abandonCmd = &Command{ + Usage: func(arg0 string) { + fmt.Printf("Usage: %s abandon [