Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

File creation/update errors #275

Open
pmcgrath opened this issue Sep 25, 2020 · 0 comments
Open

File creation/update errors #275

pmcgrath opened this issue Sep 25, 2020 · 0 comments
Labels

Comments

@pmcgrath
Copy link

pmcgrath commented Sep 25, 2020

🐛 Bug description

When using file creation and file update I have observed a failure due to the comment_count not being returned in the response, this is the error I get

Codec(Error("missing field `comment_count`", line: 1, column: 2082))

NOTE It does create and update files, it fails deserializing the reponse content form the API call, see the suggested solution at the bottom

🤔 Expected Behavior

Cater for the comment_count field being optional, I checked this GitHub API doc and it does not include it in the response

👟 Steps to reproduce

Some code to illustrate - apologies its a bit long but wanted to show both cases (create and update)

use chrono::Utc;
use hubcaps::{Credentials, Github};
use std::env;

#[tokio::main]
async fn main() -> Result<(), String> {
    let pat = env::var("GITHUB_PAT").expect("GITHUB_PAT env var expected");
    let owner = env::var("GITHUB_OWNER").expect("GITHUB_OWNER env var required");
    let repo = env::var("GITHUB_REPO").expect("GITHUB_REPO env var required");

    let credentials = Credentials::Token(pat);
    let github = Github::new("client/0.1.0", credentials).unwrap();

    let repository = github.repo(&owner, &repo);

    let now = Utc::now();
    let test_file_path = format!("/test-{}", now.format("%F-%H-%M-%S"));

    // CREATE FILE
    println!("About to create file [{}]", test_file_path);
    match repository
        .content()
        .create(
            &test_file_path,
            &format!("Creation content @ {}", now),
            "Updated via rust",
        )
        .await
    {
        Ok(r) => {
            println!(
                "Creation info {} {}",
                r.commit.tree.sha,
                r.commit.comment_count // .unwrap()
            );
        }
        Err(err) => {
            println!("Creation err: {}", err);
        }
    }

    println!(
        "\nAbout to get file [{}], so we have the sha for updating",
        test_file_path
    );
    let mut file_sha = String::new();
    match repository.content().file(&test_file_path).await {
        Ok(f) => file_sha = f.sha,
        Err(err) => {
            println!("File get err: {}", err);
        }
    }

    // UPDATE FILE
    println!(
        "\nAbout to update file [{}], existing sha is {}",
        test_file_path, file_sha
    );
    let now = Utc::now();
    match repository
        .content()
        .update(
            &test_file_path,
            &format!("Updated content @ {}", &now),
            "Updated via rust",
            &file_sha,
        )
        .await
    {
        Ok(r) => {
            println!("Update info {}", r.commit.tree.sha);
        }
        Err(err) => {
            println!("Update err: {}", err);
        }
    }

    println!("\nAbout to get file [{}]", test_file_path);
    match repository.content().file(&test_file_path).await {
        Ok(f) => file_sha = f.sha,
        Err(err) => {
            println!("File get err: {}", err);
        }
    }

    println!(
        "\nUpdated file [{}], sha is now {}",
        test_file_path, file_sha
    );

    // CREATE FILE - Let it crash with unwrap
    let now = Utc::now();
    let test_file_path = format!("/test-{}", now.format("%F-%H-%M-%S"));

    println!("About to create file [{}] - WILL CRASH", test_file_path);
    repository
        .content()
        .create(
            &test_file_path,
            &format!("Creation content @ {}", now),
            "Updated via rust",
        )
        .await
        .unwrap();

    Ok(())
}

Log with backtrace

About to create file [/test-2020-09-25-00-37-53]
Creation err: missing field `comment_count` at line 1 column 2082

About to get file [/test-2020-09-25-00-37-53], so we have the sha for updating

About to update file [/test-2020-09-25-00-37-53], existing sha is b25d3b2bca17ede736e5fa74b54b35f9078a6d3a
Update err: missing field `comment_count` at line 1 column 2082

About to get file [/test-2020-09-25-00-37-53]

Updated file [/test-2020-09-25-00-37-53], sha is now 296efcff4ec00488885fff3858e69e4c840cfdbb
About to create file [/test-2020-09-25-00-37-56] - WILL CRASH
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Codec(Error("missing field `comment_count`", line: 1, column: 2082))', src/main.rs:104:10
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:78
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:59
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1076
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1537
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:62
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:49
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:198
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:217
  10: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:526
  11: rust_begin_unwind
             at src/libstd/panicking.rs:437
  12: core::panicking::panic_fmt
             at src/libcore/panicking.rs:85
  13: core::option::expect_none_failed
             at src/libcore/option.rs:1269
  14: core::result::Result<T,E>::unwrap
             at /home/pmcgrath/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/result.rs:1005
  15: hubcaps_issue::main::{{closure}}
             at src/main.rs:96
  16: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll
             at /home/pmcgrath/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/future/mod.rs:78
  17: tokio::runtime::enter::Enter::block_on::{{closure}}
             at /home/pmcgrath/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/runtime/enter.rs:160
  18: tokio::coop::with_budget::{{closure}}
             at /home/pmcgrath/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/coop.rs:127
  19: std::thread::local::LocalKey<T>::try_with
             at /home/pmcgrath/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/thread/local.rs:263
  20: std::thread::local::LocalKey<T>::with
             at /home/pmcgrath/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/thread/local.rs:239
  21: tokio::coop::with_budget
             at /home/pmcgrath/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/coop.rs:120
  22: tokio::coop::budget
             at /home/pmcgrath/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/coop.rs:96
  23: tokio::runtime::enter::Enter::block_on
             at /home/pmcgrath/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/runtime/enter.rs:160
  24: tokio::runtime::thread_pool::ThreadPool::block_on
             at /home/pmcgrath/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/runtime/thread_pool/mod.rs:82
  25: tokio::runtime::Runtime::block_on::{{closure}}
             at /home/pmcgrath/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/runtime/mod.rs:446
  26: tokio::runtime::context::enter
             at /home/pmcgrath/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/runtime/context.rs:72
  27: tokio::runtime::handle::Handle::enter
             at /home/pmcgrath/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/runtime/handle.rs:76
  28: tokio::runtime::Runtime::block_on
             at /home/pmcgrath/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/runtime/mod.rs:441
  29: hubcaps_issue::main
             at src/main.rs:5
  30: std::rt::lang_start::{{closure}}
             at /home/pmcgrath/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/rt.rs:67
  31: std::rt::lang_start_internal::{{closure}}
             at src/libstd/rt.rs:52
  32: std::panicking::try::do_call
             at src/libstd/panicking.rs:348
  33: std::panicking::try
             at src/libstd/panicking.rs:325
  34: std::panic::catch_unwind
             at src/libstd/panic.rs:394
  35: std::rt::lang_start_internal
             at src/libstd/rt.rs:51
  36: std::rt::lang_start
             at /home/pmcgrath/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/rt.rs:67
  37: main
  38: __libc_start_main
  39: _start
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

🌍 Your environment

os version: Ubuntu 20.04.1 LTS
cargo version: cargo 1.46.0 (149022b1d 2020-07-17)
hubcaps version: 0.6.2

Possible fix

Can see these are the 2 locations in the source that have this field

I have altered a local copy making this optional and this has fixed the issue for me

Leave me know if this seems reasonable and if you want me to create a PR

@pmcgrath pmcgrath added the bug label Sep 25, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant