summaryrefslogtreecommitdiff
path: root/crates/git-tracker/src/managed_repository.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/git-tracker/src/managed_repository.rs')
-rw-r--r--crates/git-tracker/src/managed_repository.rs95
1 files changed, 0 insertions, 95 deletions
diff --git a/crates/git-tracker/src/managed_repository.rs b/crates/git-tracker/src/managed_repository.rs
deleted file mode 100644
index 0a41bd0..0000000
--- a/crates/git-tracker/src/managed_repository.rs
+++ /dev/null
@@ -1,95 +0,0 @@
-use git2::{AutotagOption, FetchOptions, RemoteCallbacks, RemoteUpdateFlags, Repository};
-use log::{debug, info, trace, warn};
-use std::{io::Write, path::PathBuf};
-
-// much of this is shamelessly lifted from
-// https://github.com/rust-lang/git2-rs/blob/9a5c9706ff578c936be644dd1e8fe155bdc4d129/examples/pull.rs
-
-#[derive(Debug, thiserror::Error)]
-pub enum Error {
- #[error("libgit2 error")]
- Git(#[from] git2::Error),
-}
-
-pub struct ManagedRepository {
- pub path: PathBuf,
- pub tracked_branches: Vec<String>,
- pub upstream_remote_url: String,
- pub upstream_remote_name: String,
-}
-
-impl ManagedRepository {
- /// basic set of options for fetching from remotes
- fn fetch_options<'a>() -> FetchOptions<'a> {
- let mut remote_callbacks = RemoteCallbacks::new();
- remote_callbacks.transfer_progress(|progress| {
- if progress.received_objects() == progress.total_objects() {
- trace!(
- "Resolving deltas {}/{}\r",
- progress.indexed_deltas(),
- progress.total_deltas()
- );
- } else {
- trace!(
- "Received {}/{} objects ({}) in {} bytes\r",
- progress.received_objects(),
- progress.total_objects(),
- progress.indexed_objects(),
- progress.received_bytes()
- );
- }
- std::io::stdout().flush().ok();
- true
- });
-
- let mut fetch_opts = FetchOptions::new();
- fetch_opts.remote_callbacks(remote_callbacks);
-
- fetch_opts
- }
-
- /// Update the given branches in the [`repository`] using the nixpkgs remote
- fn update_branches_in(&self, repository: &Repository) -> Result<(), Error> {
- let mut remote = repository.find_remote(&self.upstream_remote_name)?;
- // download all the refs
- remote.download(&self.tracked_branches, Some(&mut Self::fetch_options()))?;
- remote.disconnect()?;
- // and (hopefully) update what they refer to for later
- remote.update_tips(
- None,
- RemoteUpdateFlags::UPDATE_FETCHHEAD,
- AutotagOption::Auto,
- None,
- )?;
-
- Ok(())
- }
-
- /// Fetch the repository or update it if it exists
- ///
- /// # Errors
- /// Will return [`Err`] if the repository cannot be opened, cloned, or updated
- pub fn fetch_or_update(&self) -> Result<(), Error> {
- // Open our repository or clone it if it doesn't exist
- let repository = if self.path.exists() {
- Repository::open(self.path.as_path())?
- } else {
- warn!(
- "Couldn't find repository at {}! Cloning a fresh one from {}",
- self.path.display(),
- self.upstream_remote_url
- );
- Repository::clone(&self.upstream_remote_url, self.path.as_path())?;
- info!("Finished cloning to {}", self.path.display());
-
- // bail early as we already have a fresh copy
- return Ok(());
- };
-
- debug!("Updating repository at {}", self.path.display());
- self.update_branches_in(&repository)?;
- debug!("Finished updating!");
-
- Ok(())
- }
-}