From f3da96c2563656c476883fccde2f2862daae041a Mon Sep 17 00:00:00 2001
From: Ben Boeckel <ben.boeckel@kitware.com>
Date: Mon, 23 Dec 2019 10:27:06 -0500
Subject: [PATCH 1/2] gitlab-ci: fix only settings

---
 .gitlab-ci.yml | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6d892b86..70f266e3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,8 +6,8 @@ before_script:
 
 .only_settings: &only_settings
     - merge_requests
-    - branches@utils/rust-git-workarea
-    - tags@utils/rust-git-workarea
+    - branches@utils/rust-ghostflow
+    - tags@utils/rust-ghostflow
 
 .cargo_update: &cargo_update
     - cargo generate-lockfile $GENERATE_LOCKFILE_ARGS
@@ -53,6 +53,9 @@ before_script:
     - apt-get install -yqq --no-install-recommends git rsync
     - git config --global user.name "Ghostflow Testing"
     - git config --global user.email "ghostflow@example.invalid"
+    # Make a ref locally available. The `clone` test assumes that the test
+    # repository has a branch checked out. This is not the case on gitlab-ci.
+    - git fetch origin +refs/heads/*:refs/heads/*
     - cargo tarpaulin --frozen --exclude-files vendor --ignore-panics --all --verbose
 
 .rust_minimum: &rust_minimum
-- 
GitLab


From 88456b601495ca136f6038eadf37823c977e166b Mon Sep 17 00:00:00 2001
From: Ben Boeckel <ben.boeckel@kitware.com>
Date: Mon, 23 Dec 2019 10:59:48 -0500
Subject: [PATCH 2/2] clippy: remove unnecessary clone calls

---
 ghostflow-github/src/ghostflow.rs    |  2 +-
 ghostflow/src/actions/tests/check.rs | 34 ++++++++++-----------
 ghostflow/src/actions/tests/data.rs  |  4 +--
 ghostflow/src/actions/tests/host.rs  | 10 +++----
 ghostflow/src/actions/tests/stage.rs | 44 ++++++++++++++--------------
 5 files changed, 46 insertions(+), 48 deletions(-)

diff --git a/ghostflow-github/src/ghostflow.rs b/ghostflow-github/src/ghostflow.rs
index 3c1c2fde..10c29876 100644
--- a/ghostflow-github/src/ghostflow.rs
+++ b/ghostflow-github/src/ghostflow.rs
@@ -1338,7 +1338,7 @@ impl HostingService for GithubService {
             app_id: self.github.app_id(),
         };
 
-        let query = queries::CommitStatuses::build_query(vars.clone());
+        let query = queries::CommitStatuses::build_query(vars);
         let check_suite = self
             .github
             .send::<queries::CommitStatuses>(owner, &query)
diff --git a/ghostflow/src/actions/tests/check.rs b/ghostflow/src/actions/tests/check.rs
index c9477bfa..2aafb65a 100644
--- a/ghostflow/src/actions/tests/check.rs
+++ b/ghostflow/src/actions/tests/check.rs
@@ -117,7 +117,7 @@ fn test_check_success() {
     service.step(2);
     let mr_update = service.merge_request("base", 1).unwrap();
     let admins = admins();
-    let check = Check::new(ctx.clone(), service.clone(), config, &admins);
+    let check = Check::new(ctx, service.clone(), config, &admins);
 
     let result = check
         .check_mr("test_check_success", &CommitId::new(BASE), &mr_update)
@@ -147,7 +147,7 @@ fn test_check_success() {
 
     let status = &mr_commit_statuses_head[1];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(
         status.name,
         "ghostflow-check-58b2dee73ab6e6b1f3587b41d0ccdbe2ded785dd",
@@ -173,7 +173,7 @@ fn test_check_custom_base_name() {
     service.step(2);
     let mr_update = service.merge_request("base", 1).unwrap();
     let admins = admins();
-    let check = Check::new(ctx.clone(), service.clone(), config, &admins).base_name("test");
+    let check = Check::new(ctx, service.clone(), config, &admins).base_name("test");
 
     let result = check
         .check_mr(
@@ -207,7 +207,7 @@ fn test_check_custom_base_name() {
 
     let status = &mr_commit_statuses_head[1];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(
         status.name,
         "test-check-58b2dee73ab6e6b1f3587b41d0ccdbe2ded785dd",
@@ -232,8 +232,7 @@ fn test_check_success_post_when_failure() {
     service.step(2);
     let mr_update = service.merge_request("base", 1).unwrap();
     let admins = admins();
-    let check =
-        Check::new(ctx.clone(), service.clone(), config, &admins).post_when(PostWhen::Failure);
+    let check = Check::new(ctx, service.clone(), config, &admins).post_when(PostWhen::Failure);
 
     let result = check
         .check_mr(
@@ -269,7 +268,7 @@ fn test_check_failure() {
     service.step(2);
     let mr_update = service.merge_request("base", 1).unwrap();
     let admins = admins();
-    let check = Check::new(ctx.clone(), service.clone(), config, &admins);
+    let check = Check::new(ctx, service.clone(), config, &admins);
 
     let result = check
         .check_mr("test_check_failure", &CommitId::new(BASE), &mr_update)
@@ -354,8 +353,7 @@ fn test_check_failure_post_when_failure() {
     service.step(2);
     let mr_update = service.merge_request("base", 1).unwrap();
     let admins = admins();
-    let check =
-        Check::new(ctx.clone(), service.clone(), config, &admins).post_when(PostWhen::Failure);
+    let check = Check::new(ctx, service.clone(), config, &admins).post_when(PostWhen::Failure);
 
     let result = check
         .check_mr(
@@ -421,7 +419,7 @@ fn test_check_backport_commit() {
 
     let mr_update = service.merge_request("base", 1).unwrap();
     let admins = admins();
-    let check = Check::new(ctx.clone(), service.clone(), config, &admins);
+    let check = Check::new(ctx, service.clone(), config, &admins);
 
     let result = check
         .check_mr_with(
@@ -456,7 +454,7 @@ fn test_check_backport_commit() {
 
     let status = &mr_update_commit_statuses[1];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(
         status.name,
         "ghostflow-check-58b2dee73ab6e6b1f3587b41d0ccdbe2ded785dd",
@@ -485,7 +483,7 @@ fn test_check_unrelated_commit() {
 
     let mr_update = service.merge_request("base", 1).unwrap();
     let admins = admins();
-    let check = Check::new(ctx.clone(), service.clone(), config, &admins);
+    let check = Check::new(ctx, service.clone(), config, &admins);
 
     let err = check
         .check_mr_with(
@@ -526,7 +524,7 @@ fn test_check_branch_checks_once() {
 
     let mr_update = service.merge_request("base", 1).unwrap();
     let admins = admins();
-    let check = Check::new(ctx.clone(), service.clone(), config, &admins);
+    let check = Check::new(ctx, service.clone(), config, &admins);
 
     let result = check
         .check_mr(
@@ -574,7 +572,7 @@ fn test_check_branch_checks_once() {
 
     let status = &mr_commit_update_statuses[1];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr_update.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr_update.source_branch));
     assert_eq!(
         status.name,
         "ghostflow-check-58b2dee73ab6e6b1f3587b41d0ccdbe2ded785dd",
@@ -598,7 +596,7 @@ fn test_check_warning() {
     let mr = service.merge_request("base", 2).unwrap();
     let config = GitCheckConfiguration::new();
     let admins = admins();
-    let check = Check::new(ctx.clone(), service.clone(), config, &admins);
+    let check = Check::new(ctx, service.clone(), config, &admins);
 
     let result = check
         .check_mr("test_check_warning", &CommitId::new(BASE), &mr)
@@ -640,7 +638,7 @@ fn test_check_warning() {
 
     let status = &mr_commit_statuses[1];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(
         status.name,
         "ghostflow-check-58b2dee73ab6e6b1f3587b41d0ccdbe2ded785dd",
@@ -669,7 +667,7 @@ fn test_check_warning_temporary() {
     config.add_check(&temporary);
 
     let admins = admins();
-    let check = Check::new(ctx.clone(), service.clone(), config, &admins);
+    let check = Check::new(ctx, service.clone(), config, &admins);
 
     let result = check
         .check_mr("test_check_warning_temporary", &CommitId::new(BASE), &mr)
@@ -714,7 +712,7 @@ fn test_check_warning_temporary() {
 
     let status = &mr_commit_statuses[1];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(
         status.name,
         "ghostflow-check-58b2dee73ab6e6b1f3587b41d0ccdbe2ded785dd",
diff --git a/ghostflow/src/actions/tests/data.rs b/ghostflow/src/actions/tests/data.rs
index 2ebfe042..85e7c542 100644
--- a/ghostflow/src/actions/tests/data.rs
+++ b/ghostflow/src/actions/tests/data.rs
@@ -202,7 +202,7 @@ fn test_no_data() {
 fn test_no_destinations() {
     let tempdir = test_workspace_dir("test_no_destinations");
     let (test_repo, ctx) = git_context(tempdir.path());
-    let data = Data::new(ctx.clone());
+    let data = Data::new(ctx);
 
     create_data_refs(VALID_DATA, &test_repo.ctx, "data");
 
@@ -215,7 +215,7 @@ fn test_no_destinations() {
 fn test_no_destinations_no_data() {
     let tempdir = test_workspace_dir("test_no_destinations_no_data");
     let (test_repo, ctx) = git_context(tempdir.path());
-    let data = Data::new(ctx.clone());
+    let data = Data::new(ctx);
 
     let res = data.fetch_data(&test_repo.repo).unwrap();
     assert_eq!(res, DataActionResult::NoData);
diff --git a/ghostflow/src/actions/tests/host.rs b/ghostflow/src/actions/tests/host.rs
index bd680846..3d251b89 100644
--- a/ghostflow/src/actions/tests/host.rs
+++ b/ghostflow/src/actions/tests/host.rs
@@ -515,11 +515,11 @@ impl MockService {
             Self::new()
                 .add_project(base_repo.clone())
                 .add_project(fork_repo.clone())
-                .add_project(self_repo.clone())
+                .add_project(self_repo)
                 .add_user(user_user.clone())
-                .add_user(user_other.clone())
-                .add_user(user_maint.clone())
-                .add_user(user_ignore.clone())
+                .add_user(user_other)
+                .add_user(user_maint)
+                .add_user(user_ignore)
                 .add_issue(issue1)
                 .add_issue(issue2)
                 .add_merge_request(mr1_base)
@@ -723,7 +723,7 @@ impl HostingService for MockService {
     fn members(&self, project: &str) -> Result<Vec<Membership>, HostingServiceError> {
         let _ = self.find_project(project)?;
 
-        Ok(self.find_memberships(project)?.clone())
+        Ok(self.find_memberships(project)?)
     }
 
     fn add_hook(&self, project: &str, url: &str) -> Result<(), HostingServiceError> {
diff --git a/ghostflow/src/actions/tests/stage.rs b/ghostflow/src/actions/tests/stage.rs
index ac31441e..ec6aa4db 100644
--- a/ghostflow/src/actions/tests/stage.rs
+++ b/ghostflow/src/actions/tests/stage.rs
@@ -141,7 +141,7 @@ fn test_stage_branch() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "staged");
 }
@@ -168,7 +168,7 @@ fn test_stage_branch_quiet() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "staged");
 }
@@ -260,7 +260,7 @@ fn test_stage_branch_update() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "staged");
 
@@ -307,7 +307,7 @@ fn test_stage_branch_update_rename() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "staged");
 
@@ -351,7 +351,7 @@ fn test_stage_branch_update_quiet() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "staged");
 
@@ -408,7 +408,7 @@ fn test_stage_branch_missed_update() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "staged");
 }
@@ -454,7 +454,7 @@ fn test_stage_branch_missed_update_quiet() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "staged");
 }
@@ -503,7 +503,7 @@ fn test_stage_branch_update_conflict() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Failed);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "failed to merge: 1 conflicting paths");
 
@@ -511,7 +511,7 @@ fn test_stage_branch_update_conflict() {
 
     let status = &mr2_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr2.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr2.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "staged");
 
@@ -569,7 +569,7 @@ fn test_stage_branch_update_conflict_quiet() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Failed);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "failed to merge: 1 conflicting paths");
 
@@ -577,7 +577,7 @@ fn test_stage_branch_update_conflict_quiet() {
 
     let status = &mr2_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr2.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr2.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "staged");
 
@@ -619,7 +619,7 @@ fn test_stage_branch_conflict() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Failed);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "failed to merge: 1 conflicting paths");
 }
@@ -654,7 +654,7 @@ fn test_stage_branch_conflict_quiet() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Failed);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "failed to merge: 1 conflicting paths");
 }
@@ -687,7 +687,7 @@ fn test_update_base_ok() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "staged");
 }
@@ -731,7 +731,7 @@ fn test_update_base_conflict() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Failed);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "failed to merge: 1 conflicting paths");
 }
@@ -776,7 +776,7 @@ fn test_update_base_conflict_quiet() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Failed);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "failed to merge: 1 conflicting paths");
 }
@@ -815,7 +815,7 @@ fn test_unstage_branch_update() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "unstaged");
 }
@@ -871,7 +871,7 @@ fn test_unstage_branch() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "unstaged");
 }
@@ -902,7 +902,7 @@ fn test_unstage_branch_quiet() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(status.description, "unstaged");
 }
@@ -984,7 +984,7 @@ fn test_tag_stage() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(
         status.description,
@@ -1025,7 +1025,7 @@ fn test_tag_stage_keep_topics() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(
         status.description,
@@ -1078,7 +1078,7 @@ fn test_tag_stage_quiet() {
 
     let status = &mr_commit_statuses[0];
     assert_eq!(status.state, CommitStatusState::Success);
-    assert_eq!(status.refname, Some(mr.source_branch.clone()));
+    assert_eq!(status.refname, Some(mr.source_branch));
     assert_eq!(status.name, "ghostflow-stager");
     assert_eq!(
         status.description,
-- 
GitLab