Age | Commit message (Collapse) | Author |
|
Planning to separate the `Suggestion` and `Client` code.
|
|
Don't apply the patch when it doesn't apply, instead fail with an error.
Previously, the `apply()` method would apply the patch to the lines from
`Suggestion`, even if the file was different from what the suggestion
expected. So, you could end up with the `Suggestion` lines being
overwritten with the suggestion text, even when they didn't match the
original side of the suggestion.
Fix this by getting the diff text from `diff_with_repo()` and applying
it using `git-apply`. This gives us a suitable error when the patch
doesn't apply to the file, leaving the file alone.
|
|
Add a test for diff generation. Split `diff()` into `diff_with_repo()`
to allow us to test with a new repo instead of defaulting to the current
one.
In the test, create a new Git repo using `git2`, add and commit a file,
and check that the diff generated by a Suggestion is correct.
Got the `IndexEntry` format from
https://docs.rs/git2/0.13.8/src/git2/index.rs.html#858-871.
|
|
Take a `BufRead`er instead of a file path to read from. This gives us
more flexibility.
We can't use the `Read` trait because of the error described in
b4a7561ccc1ed7dab6cd2c786902dec8c4ad9be6.
Fix the bug in `Suggestion.diff()` so that the suggestion is applied to
the commit it corresponds to instead of HEAD.
|
|
|
|
Create a patch file for the suggestion. Instead of building the patch
text manually, as in my earlier attempts (`patch` and `unified_diff`),
apply the patch to the file in memory, and then ask libgit2 to give us a
Git patch by comparing the original blob and the patched buffer.
Doing this because I was unsuccessful in manually composing a patch file
that Git would accept. I could create unified diffs that the `patch`
program would accept, but these wouldn't work with `git-apply`. My
current guess is that these didn't work because I didn't have both
before and after context in my manually-created patch files.
Since this tool is intended to be used with Git, I want a patch file
that will work transparently with Git utilities. The easiest alternative
to manually generating the patch file seemed to be to have Git create
the patch text.
Add a new binary, `git-sugpatch`, that outputs the patch text to
standard output.
TODO: This gets the original from the current HEAD in `apply_to()`. We
should instead be using the contents of `blob`, because the original is
not necessarily the working copy.
|
|
This is no longer absolutely necessary now that we have the
`suggestion_apply_to_writes_patch_to_writer` test.
|
|
|
|
Make the suggestion's line endings consistent with those used in the
file.
By default, the suggestion block we get from the GitHub API uses CRLF
line endings. These need to be converted to be consistent with the file
the change is being applied to.
|
|
Now that I fixed the line numbers in the code
(0ea9202eb81e18647b40563fd3dbc61b626ce2ec), we need to correct them in
the test as well. The empty line after the `r#"` delimiter is the first
line.
|
|
We had been using the enumerator's index, which starts at 0, but line
numbers start at 1. Use the correct line number.
|
|
Single-line changes weren't getting applied, because if only a single
line changed, the `original_start_line` field is null. That caused the
first `if` branch to always evaluate to true.
Swap the `if` branches to fix this.
|
|
We can't read from the original file, because we want to be able to use
that as the writer in `apply()`.
Previously, this would result in the original file simply being
truncated, as we weren't reading from the correct file.
To fix this, we need to give `apply_to()` both a reader and a writer.
Now, in `apply()`, we can pass it the temporary file to read, and the
original to write to.
Used a `Path` as an input to `apply_to()` instead of a `Read`er because
I got an error that didn't really make sense to me when I did so:
error[E0275]: overflow evaluating the requirement `&tokio_reactor::poll_evented::PollEvented<_>: std::io::Read`
|
= help: consider adding a `#![recursion_limit="256"]` attribute to your crate (`git_suggested_patch`)
= note: required because of the requirements on the impl of `std::io::Read` for `&tokio_reactor::poll_evented::PollEvented<tokio_reactor::poll_evented::PollEvented<_>>`
= note: required because of the requirements on the impl of `std::io::Read` for `&tokio_reactor::poll_evented::PollEvented<tokio_reactor::poll_evented::PollEvented<tokio_reactor::poll_evented::PollEvented<_>>>`
A search for the error message turned up a few active issues:
- https://github.com/rust-lang/rust/issues/57854
- https://github.com/rust-lang/rust/issues/62755
- https://github.com/rust-lang/rust/issues/39959
The above issues indicate that this could come from having a variable
with an inferred type. However, for the moment the issue isn't resolved,
and the error message doesn't indicate where the problem is actually
coming from. As I was unable to track down the source of the problem, I
decided not to bother using a `Read` argument.
|
|
This field can be null in the API response.
|
|
An executable to apply a suggested change to the appropriate file in the
repo.
Add a new `SuggestionUrl` type that allows us to extract the necessary
data to fetch a suggestion comment from the GitHub API using a GitHub
pull request comment URL.
|
|
Replace common code with a call to `Suggestion.apply_to()`.
|
|
I didn't feel like writing a test for `Suggestion.apply()`, which writes
files, so decided to write a different version that used the original
file and a writer.
Changed the `Suggestion.suggestion()` function to not prepend "+" to
suggestion lines so we can use the function to extract the suggested
lines unmodified from the comment. Kept the old version around as
`suggestion_patch()` because we may need it to generate patches.
Copied the code from `Suggestion.apply()`, except write the changes to
`writer` instead of the file at `Suggestion.path`.
|
|
Add the new fields from `Suggestion`.
|
|
The name "suggestion" sounds like the suggested diff change, when really
this field will be deserialised with the whole GitHub comment, including
adjacent text as well as the suggestion.
|
|
Haven't tested this yet.
To keep the original file's metadata, try writing the changes to the
original instead of the temporary file. First copy the original to a new
file that we can reference after truncating the original, then write the
change onto the original.
|
|
Not working yet, but the idea is to get the file referenced by the
suggestion and apply the suggested change directly to it.
Here, we read the original file, and write its contents to the new file,
replacing the lines modified by the suggestion with the suggested
change.
Currently doesn't work because you can't pass file instances to
`fs::rename`, only paths.
I'd like to try a slightly different system so I can keep the original
file's creation date. With the current system, it would be overwritten
by the new temporary file created to store the change.
|
|
|
|
Work out the code required to get a file blob's contents from a Git
repository using the 'git2' crate.
We'll be using this to get the original file for patching.
|
|
Will test patching a file using the generated suggestion patch.
|
|
Testing out 'unidiff' to build the patch. Trying to see if it will
adjust the line numbers automatically when the patch is modified.
Doesn't look like it. Seems like it has a nice interface, though.
Still having trouble applying the patch due to complaints of patch
format errors.
|
|
Update the regex matcher to allow both LF line endings and CRLF.
|
|
Describe the source of the test data.
|
|
Still working on it, but have an initial draft working. There's no file
name in the diff hunk, so I'm assuming I'm going to have to add one
later.
Build a patch from the diff hunk and suggestion comment.
1. Remove `-` lines
2. Change `+` lines to ` `
3. Change last line to `-`
4. Append suggestion to the diff with a `+` prefix
|
|
Split the `Suggestion` struct into a new `Client` struct for the GitHub
request, and `Suggestion` for the required response data.
|
|
Add a `Suggestion` struct to represent a GitHub PR suggestion comment.
Use the 'github-rs' library to fetch a given comment from the site by
its ID.
Converted the 'github-rs' error into a string because its
`github_rs::client::Error` type is private, so I can't define an error
variant source with that type.
|
|
Initialised with:
$ cargo init --bin
|