Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
683 changes: 245 additions & 438 deletions Cargo.lock

Large diffs are not rendered by default.

12 changes: 5 additions & 7 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,18 @@ resolver = "3"
[workspace.dependencies]
api-model = { path = "api-model" }
io-orbit = { path = "io-orbit" }
mono = { path = "mono" }
common = { path = "common" }
jupiter = { path = "jupiter" }
jupiter-migrate = { path = "jupiter-migrate" }
ceres = { path = "ceres" }
callisto = { path = "jupiter/callisto" }
vault = { path = "vault" }
saturn = { path = "saturn" }
orion = { path = "orion" }
orion-client = { path = "clients/orion-client" }
orion-scheduler-client = { path = "clients/orion-scheduler-client" }

git-internal = "0.9.0"
libvault = "0.3.0"
libvault = "0.4.0"

#====
anyhow = "1.0.104"
Expand Down Expand Up @@ -77,8 +75,8 @@ lettre = { version = "0.11", default-features = false, features = [
"rustls-platform-verifier",
] }
#====
sea-orm = "2.0.2"
sea-orm-migration = "2.0.2"
sea-orm = "2.0.3"
sea-orm-migration = "2.0.3"

#====
rand = "0.10.2"
Expand All @@ -98,7 +96,7 @@ uuid = "1.24.1"
regex = "1.13.1"
ctrlc = "3.5.2"
cedar-policy = "4.12.0"
secp256k1 = "0.31.1"
secp256k1 = "0.33.1"
pgp = "0.20.0"
base64 = "0.23.1"

Expand Down Expand Up @@ -128,7 +126,7 @@ redis-test = "1.0.4"
rustls = "0.23.43"
object_store = "0.14.1"
parse-display = "0.11.0"
toml = "1.1.3"
toml = "1.1.6"
rkyv = "0.8.18"
percent-encoding = "2.3"

Expand Down
1 change: 1 addition & 0 deletions ceres/src/application/code_edit/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,7 @@ mod tests {
to_hash: to_hash.to_string(),
created_at: chrono::Utc::now().naive_utc(),
updated_at: chrono::Utc::now().naive_utc(),
closed_at: None,
campsite_user_id: "tester".to_string(),
base_branch: "main".to_string(),
}
Expand Down
1 change: 1 addition & 0 deletions ceres/src/application/code_edit/on_edit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ mod tests {
to_hash: "2".repeat(40),
created_at: now,
updated_at: now,
closed_at: None,
campsite_user_id: "tester".to_string(),
base_branch: "main".to_string(),
}
Expand Down
1 change: 1 addition & 0 deletions ceres/src/application/code_edit/on_push.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ mod tests {
to_hash: "2".repeat(40),
created_at: now,
updated_at: now,
closed_at: None,
campsite_user_id: "tester".to_string(),
base_branch: "main".to_string(),
}
Expand Down
2 changes: 2 additions & 0 deletions ceres/src/application/notification/triggers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ mod tests {
to_hash: Set("b".to_string()),
created_at: Set(now),
updated_at: Set(now),
closed_at: Set(None),
campsite_user_id: Set("alice".to_string()),
base_branch: Set("main".to_string()),
}
Expand Down Expand Up @@ -224,6 +225,7 @@ mod tests {
to_hash: Set("b".to_string()),
created_at: Set(now),
updated_at: Set(now),
closed_at: Set(None),
campsite_user_id: Set("alice".to_string()),
base_branch: Set("main".to_string()),
}
Expand Down
2 changes: 1 addition & 1 deletion ceres/src/model/issue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ impl From<ItemDetails> for ItemRes {
author_is_bot: false,
open_timestamp: model.created_at.and_utc().timestamp(),
merge_timestamp: model.merge_date.map(|dt| dt.and_utc().timestamp()),
closed_at: None,
closed_at: model.closed_at.map(|dt| dt.and_utc().timestamp()),
updated_at: model.updated_at.and_utc().timestamp(),
labels: value.labels.into_iter().map(|m| m.into()).collect(),
assignees: value.assignees,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,13 @@
//!
//! ```bash
//! # Basic (explicit config path)
//! cargo run -p io-orbit --bin migrate_local_to_s3 -- --config ./config.toml
//! cargo run -p io-orbit --bin migrate-local-to-s3 -- --config ./config.toml
//!
//! # Or via env var
//! MEGA_CONFIG=./config.toml cargo run -p io-orbit --bin migrate_local_to_s3
//! MEGA_CONFIG=./config.toml cargo run -p io-orbit --bin migrate-local-to-s3
//!
//! # Tune concurrency (default: 16)
//! MIGRATE_CONCURRENCY=32 MEGA_CONFIG=./config.toml cargo run -p io-orbit --bin migrate_local_to_s3
//! MIGRATE_CONCURRENCY=32 MEGA_CONFIG=./config.toml cargo run -p io-orbit --bin migrate-local-to-s3
//! ```
//!
//! ## Verification tips
Expand Down Expand Up @@ -125,7 +125,7 @@ async fn run() -> Result<(), MegaError> {
.map_err(|e| MegaError::Other(format!("failed to init S3-compatible client: {e}")))?,
other => {
return Err(MegaError::Other(format!(
"migrate_local_to_s3 only supports S3/S3Compatible targets, got {:?}",
"migrate-local-to-s3 only supports S3/S3Compatible targets, got {:?}",
other
)));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
use sea_orm_migration::prelude::*;

#[derive(DeriveMigrationName)]
pub struct Migration;

#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.alter_table(
Table::alter()
.table(MegaCl::Table)
.add_column_if_not_exists(ColumnDef::new(MegaCl::ClosedAt).date_time().null())
.to_owned(),
)
.await
}

async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.alter_table(
Table::alter()
.table(MegaCl::Table)
.drop_column(MegaCl::ClosedAt)
.to_owned(),
)
.await
}
}

#[derive(DeriveIden)]
enum MegaCl {
Table,
ClosedAt,
}
2 changes: 2 additions & 0 deletions jupiter-migrate/src/migration/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ mod m20260804_120000_actor_to_campsite_user_id;
mod m20260804_130000_data_backfill_ledger;
mod m20260811_100000_create_campsite_member_identity;
mod m20260909_120000_create_orion_vm_image;
mod m20260915_100000_add_closed_at_to_mega_cl;
mod runner;
pub use runner::apply_migrations;

Expand Down Expand Up @@ -197,6 +198,7 @@ impl MigratorTrait for Migrator {
Box::new(m20260804_130000_data_backfill_ledger::Migration),
Box::new(m20260811_100000_create_campsite_member_identity::Migration),
Box::new(m20260909_120000_create_orion_vm_image::Migration),
Box::new(m20260915_100000_add_closed_at_to_mega_cl::Migration),
]
}
}
2 changes: 2 additions & 0 deletions jupiter/callisto/src/entity_ext/mega_cl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ impl mega_cl::Model {
status: MergeStatusEnum::Open,
created_at: now,
updated_at: now,
closed_at: None,
merge_date: None,
path,
base_branch,
Expand All @@ -95,6 +96,7 @@ impl mega_cl::Model {
status: MergeStatusEnum::Draft,
created_at: now,
updated_at: now,
closed_at: None,
merge_date: None,
path,
base_branch,
Expand Down
1 change: 1 addition & 0 deletions jupiter/callisto/src/mega_cl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ pub struct Model {
pub to_hash: String,
pub created_at: DateTime,
pub updated_at: DateTime,
pub closed_at: Option<DateTime>,
pub campsite_user_id: String,
pub base_branch: String,
}
Expand Down
1 change: 1 addition & 0 deletions jupiter/src/service/webhook_service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@ mod tests {
to_hash: "def".to_string(),
created_at: DateTime::from_timestamp(0, 0).unwrap().naive_utc(),
updated_at: DateTime::from_timestamp(0, 0).unwrap().naive_utc(),
closed_at: None,
campsite_user_id: "alice".to_string(),
};

Expand Down
23 changes: 18 additions & 5 deletions jupiter/src/storage/cl_storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -309,17 +309,21 @@ impl ClStorage {
}

pub async fn close_cl(&self, model: mega_cl::Model) -> Result<(), MegaError> {
let now = chrono::Utc::now().naive_utc();
let mut a_model = model.into_active_model();
a_model.status = Set(MergeStatusEnum::Closed);
a_model.updated_at = Set(chrono::Utc::now().naive_utc());
a_model.closed_at = Set(Some(now));
a_model.updated_at = Set(now);
a_model.update(self.get_connection()).await.unwrap();
Ok(())
}

pub async fn reopen_cl(&self, model: mega_cl::Model) -> Result<(), MegaError> {
let now = chrono::Utc::now().naive_utc();
let mut a_model = model.into_active_model();
a_model.status = Set(MergeStatusEnum::Open);
a_model.updated_at = Set(chrono::Utc::now().naive_utc());
a_model.closed_at = Set(None);
a_model.updated_at = Set(now);
a_model.update(self.get_connection()).await.unwrap();
Ok(())
}
Expand All @@ -329,17 +333,26 @@ impl ClStorage {
model: mega_cl::Model,
status: MergeStatusEnum,
) -> Result<(), MegaError> {
let now = chrono::Utc::now().naive_utc();
let mut a_model = model.into_active_model();
a_model.status = Set(status);
a_model.updated_at = Set(chrono::Utc::now().naive_utc());
a_model.status = Set(status.clone());
if status == MergeStatusEnum::Open || status == MergeStatusEnum::Draft {
a_model.closed_at = Set(None);
} else if matches!(status, MergeStatusEnum::Closed | MergeStatusEnum::Merged) {
a_model.closed_at = Set(Some(now));
}
a_model.updated_at = Set(now);
a_model.update(self.get_connection()).await?;
Ok(())
}

pub async fn merge_cl(&self, model: mega_cl::Model) -> Result<(), MegaError> {
let now = chrono::Utc::now().naive_utc();
let mut a_model = model.into_active_model();
a_model.status = Set(MergeStatusEnum::Merged);
a_model.updated_at = Set(chrono::Utc::now().naive_utc());
a_model.merge_date = Set(Some(now));
a_model.closed_at = Set(Some(now));
a_model.updated_at = Set(now);
a_model.update(self.get_connection()).await.unwrap();
Ok(())
}
Expand Down
1 change: 0 additions & 1 deletion mono/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ version = "0.1.0"
authors = ["Quanyi Ma <genedna@gmail.com>"]
keywords = ["git", "monorepo", "decentralized"]
license = "MIT OR Apache-2.0"
readme = "README.md"
edition.workspace = true

[lib]
Expand Down
55 changes: 46 additions & 9 deletions mono/src/api/router/reviewer_router.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@ use axum::{
Json,
extract::{Path, State},
};
use ceres::model::{
change_list::{
ChangeReviewStatePayload, ChangeReviewerStatePayload, MergeStatus, ReviewerPayload,
ReviewersResponse,
use ceres::{
application::member_identity::display_labels_for_actors,
model::{
change_list::{
ChangeReviewStatePayload, ChangeReviewerStatePayload, MergeStatus, ReviewerPayload,
ReviewersResponse,
},
conversation::ConvType,
},
conversation::ConvType,
};
use common::errors::MegaError;
use utoipa_axum::{router::OpenApiRouter, routes};
Expand Down Expand Up @@ -73,14 +76,29 @@ async fn add_reviewers(
actor
);

for reviewer in payload.reviewer_usernames {
let mut actors = vec![actor.to_string()];
actors.extend(payload.reviewer_usernames.iter().cloned());
let labels = display_labels_for_actors(state.services().storage(), &actors).await;
let actor_display = labels
.get(actor)
.cloned()
.unwrap_or_else(|| actor.to_string());

for reviewer in &payload.reviewer_usernames {
let reviewer_display = labels
.get(reviewer.as_str())
.cloned()
.unwrap_or_else(|| reviewer.clone());
state
.services()
.conversation()
.add_conversation(
&link,
actor,
Some(format!("{} assigned a new reviewer {}", actor, reviewer)),
Some(format!(
"{} assigned a new reviewer {}",
actor_display, reviewer_display
)),
ConvType::Comment,
)
.await?;
Expand Down Expand Up @@ -122,14 +140,29 @@ async fn remove_reviewers(
actor
);

let mut actors = vec![actor.to_string()];
actors.extend(payload.reviewer_usernames.iter().cloned());
let labels = display_labels_for_actors(state.services().storage(), &actors).await;
let actor_display = labels
.get(actor)
.cloned()
.unwrap_or_else(|| actor.to_string());

for reviewer in &payload.reviewer_usernames {
let reviewer_display = labels
.get(reviewer.as_str())
.cloned()
.unwrap_or_else(|| reviewer.clone());
state
.services()
.conversation()
.add_conversation(
&link,
actor,
Some(format!("{} removed reviewer {}", actor, reviewer)),
Some(format!(
"{} removed reviewer {}",
actor_display, reviewer_display
)),
ConvType::Comment,
)
.await?;
Expand Down Expand Up @@ -257,13 +290,17 @@ async fn review_resolve(
.change_review_state(&link, &payload.conversation_id, payload.resolved)
.await?;

let display = display_labels_for_actors(state.services().storage(), &[actor.to_string()])
.await
.remove(actor)
.unwrap_or_else(|| actor.to_string());
state
.services()
.conversation()
.add_conversation(
&link,
actor,
Some(format!("{} resolved a review", actor)),
Some(format!("{} resolved a review", display)),
ConvType::Comment,
)
.await?;
Expand Down
Loading
Loading