From 5dbd8e886b052a8f0f37950e1ffcbe56029f5da7 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 5 Aug 2023 02:47:43 +0200 Subject: [PATCH] Initialize repo and update tracked refs --- ...4c1f56ff147b7f80d8844bb2b5bad63dab372.json | 12 ++++ ...d700592728bc0d8301b9054082958332d2ebd.json | 12 ++++ ...33cc918937598a0c88851ac6f94de41796a33.json | 12 ++++ ...51cfc88c6188163e5726d83941cdfb6e41c9e.json | 12 ++++ ...0e3e42dbe19c1ea5d71e6dd5910905e4402d4.json | 26 +++++++ migrations/1_commits.sql | 2 +- src/update.rs | 69 ++++++++++++++++++- 7 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 .sqlx/query-0d36a4c7d21f4688db1cf309fd04c1f56ff147b7f80d8844bb2b5bad63dab372.json create mode 100644 .sqlx/query-4a8f4b5856c5c4d117f80983e83d700592728bc0d8301b9054082958332d2ebd.json create mode 100644 .sqlx/query-6e255c9db5fab15a188c0a1ecd333cc918937598a0c88851ac6f94de41796a33.json create mode 100644 .sqlx/query-d6249ada8a6f58fabb3877446e851cfc88c6188163e5726d83941cdfb6e41c9e.json create mode 100644 .sqlx/query-f39201c5c3a530a7f659a923a230e3e42dbe19c1ea5d71e6dd5910905e4402d4.json diff --git a/.sqlx/query-0d36a4c7d21f4688db1cf309fd04c1f56ff147b7f80d8844bb2b5bad63dab372.json b/.sqlx/query-0d36a4c7d21f4688db1cf309fd04c1f56ff147b7f80d8844bb2b5bad63dab372.json new file mode 100644 index 0000000..623af04 --- /dev/null +++ b/.sqlx/query-0d36a4c7d21f4688db1cf309fd04c1f56ff147b7f80d8844bb2b5bad63dab372.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "UPDATE commits SET new = 0", + "describe": { + "columns": [], + "parameters": { + "Right": 0 + }, + "nullable": [] + }, + "hash": "0d36a4c7d21f4688db1cf309fd04c1f56ff147b7f80d8844bb2b5bad63dab372" +} diff --git a/.sqlx/query-4a8f4b5856c5c4d117f80983e83d700592728bc0d8301b9054082958332d2ebd.json b/.sqlx/query-4a8f4b5856c5c4d117f80983e83d700592728bc0d8301b9054082958332d2ebd.json new file mode 100644 index 0000000..cd17aaa --- /dev/null +++ b/.sqlx/query-4a8f4b5856c5c4d117f80983e83d700592728bc0d8301b9054082958332d2ebd.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "INSERT OR IGNORE INTO tracked_refs (name, hash) VALUES (?, ?)", + "describe": { + "columns": [], + "parameters": { + "Right": 2 + }, + "nullable": [] + }, + "hash": "4a8f4b5856c5c4d117f80983e83d700592728bc0d8301b9054082958332d2ebd" +} diff --git a/.sqlx/query-6e255c9db5fab15a188c0a1ecd333cc918937598a0c88851ac6f94de41796a33.json b/.sqlx/query-6e255c9db5fab15a188c0a1ecd333cc918937598a0c88851ac6f94de41796a33.json new file mode 100644 index 0000000..c2d0f00 --- /dev/null +++ b/.sqlx/query-6e255c9db5fab15a188c0a1ecd333cc918937598a0c88851ac6f94de41796a33.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "UPDATE tracked_refs SET hash = ? WHERE name = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 2 + }, + "nullable": [] + }, + "hash": "6e255c9db5fab15a188c0a1ecd333cc918937598a0c88851ac6f94de41796a33" +} diff --git a/.sqlx/query-d6249ada8a6f58fabb3877446e851cfc88c6188163e5726d83941cdfb6e41c9e.json b/.sqlx/query-d6249ada8a6f58fabb3877446e851cfc88c6188163e5726d83941cdfb6e41c9e.json new file mode 100644 index 0000000..d77a0cc --- /dev/null +++ b/.sqlx/query-d6249ada8a6f58fabb3877446e851cfc88c6188163e5726d83941cdfb6e41c9e.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "DELETE FROM tracked_refs WHERE name = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "d6249ada8a6f58fabb3877446e851cfc88c6188163e5726d83941cdfb6e41c9e" +} diff --git a/.sqlx/query-f39201c5c3a530a7f659a923a230e3e42dbe19c1ea5d71e6dd5910905e4402d4.json b/.sqlx/query-f39201c5c3a530a7f659a923a230e3e42dbe19c1ea5d71e6dd5910905e4402d4.json new file mode 100644 index 0000000..fc8302d --- /dev/null +++ b/.sqlx/query-f39201c5c3a530a7f659a923a230e3e42dbe19c1ea5d71e6dd5910905e4402d4.json @@ -0,0 +1,26 @@ +{ + "db_name": "SQLite", + "query": "SELECT name, hash FROM tracked_refs", + "describe": { + "columns": [ + { + "name": "name", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "hash", + "ordinal": 1, + "type_info": "Text" + } + ], + "parameters": { + "Right": 0 + }, + "nullable": [ + false, + false + ] + }, + "hash": "f39201c5c3a530a7f659a923a230e3e42dbe19c1ea5d71e6dd5910905e4402d4" +} diff --git a/migrations/1_commits.sql b/migrations/1_commits.sql index 2e8ada0..4d735c7 100644 --- a/migrations/1_commits.sql +++ b/migrations/1_commits.sql @@ -11,7 +11,7 @@ CREATE TABLE commit_links ( FOREIGN KEY (child) REFERENCES commits (hash) ON DELETE CASCADE ) STRICT; -CREATE TABLE branches ( +CREATE TABLE tracked_refs ( name TEXT NOT NULL PRIMARY KEY, hash TEXT NOT NULL, FOREIGN KEY (hash) REFERENCES commits (hash) ON DELETE CASCADE diff --git a/src/update.rs b/src/update.rs index 272fc36..ebcd98c 100644 --- a/src/update.rs +++ b/src/update.rs @@ -11,8 +11,11 @@ use tracing::{debug, debug_span, error, info, Instrument}; use crate::state::AppState; /// Add new commits from the repo to the database, marked as new. -// TODO Initialize tracked refs? -// TODO Update tracked refs? +// TODO Rename so the name fits better (maybe rename update module to recurring as well?) +// upadte module -> recurring +// Fetching new commits -> fetch submodule +// Updating repo (current file) -> repo submodule +// Updating queue -> queue submodule async fn add_new_commits_to_db(db: &SqlitePool, repo: &Repository) -> anyhow::Result<()> { debug!("Adding new commits to db"); let mut tx = db.begin().await?; @@ -37,6 +40,17 @@ async fn add_new_commits_to_db(db: &SqlitePool, repo: &Repository) -> anyhow::Re insert_new_commit_links(conn, &new).await?; debug!("Inserted {} new commits into db", new.len()); + if old.is_empty() { + // We've never seen any repo before, so we need to do additional + // initialization. + info!("Detected new repo, initializing"); + mark_all_commits_as_old(conn).await?; + track_main_branch(conn, repo).await?; + info!("Initialized new repo"); + } + + update_tracked_refs(conn, repo).await?; + tx.commit().await?; debug!("Finished adding new commits to db"); Ok(()) @@ -102,7 +116,7 @@ async fn insert_new_commit_links(conn: &mut SqliteConnection, new: &[Info]) -> a sqlx::query!( "INSERT OR IGNORE INTO commit_links (parent, child) VALUES (?, ?)", parent, - child + child, ) .execute(&mut *conn) .await?; @@ -111,6 +125,55 @@ async fn insert_new_commit_links(conn: &mut SqliteConnection, new: &[Info]) -> a Ok(()) } +async fn mark_all_commits_as_old(conn: &mut SqliteConnection) -> anyhow::Result<()> { + sqlx::query!("UPDATE commits SET new = 0") + .execute(conn) + .await?; + Ok(()) +} + +async fn track_main_branch(conn: &mut SqliteConnection, repo: &Repository) -> anyhow::Result<()> { + let Some(head) = repo.head_ref()? else { return Ok(()); }; + let name = head.inner.name.to_string(); + let hash = head.into_fully_peeled_id()?.to_string(); + sqlx::query!( + "INSERT OR IGNORE INTO tracked_refs (name, hash) VALUES (?, ?)", + name, + hash, + ) + .execute(conn) + .await?; + Ok(()) +} + +async fn update_tracked_refs(conn: &mut SqliteConnection, repo: &Repository) -> anyhow::Result<()> { + let tracked_refs = sqlx::query!("SELECT name, hash FROM tracked_refs") + .fetch_all(&mut *conn) + .await?; + + for tracked_ref in tracked_refs { + if let Some(reference) = repo.try_find_reference(&tracked_ref.name)? { + let hash = reference.id().to_string(); + if hash != tracked_ref.hash { + debug!("Updated tracked ref {}", tracked_ref.name); + sqlx::query!( + "UPDATE tracked_refs SET hash = ? WHERE name = ?", + hash, + tracked_ref.name + ) + .execute(&mut *conn) + .await?; + } + } else { + debug!("Deleted tracked ref {}", tracked_ref.name); + sqlx::query!("DELETE FROM tracked_refs WHERE name = ?", tracked_ref.name) + .execute(&mut *conn) + .await?; + } + } + Ok(()) +} + async fn update_repo(state: &AppState) -> anyhow::Result<()> { info!("Updating repo"); let repo = state.repo.to_thread_local();