feature flag for disabling the project semaphore

It's possible that the sempahore state in the virtual branches controller is completely unnecessary. This feature flag allows us to test this hypothesis
This commit is contained in:
Kiril Videlov 2024-07-06 18:57:58 +02:00
parent 66d0ba2ac2
commit 532b51bade
No known key found for this signature in database
GPG Key ID: A4C733025427C471
5 changed files with 52 additions and 21 deletions

View File

@ -27,6 +27,7 @@ export class Project {
use_diff_context: boolean | undefined;
snapshot_lines_threshold!: number | undefined;
use_new_locking!: boolean;
ignore_project_semaphore!: boolean;
get vscodePath() {
return this.path.includes('\\') ? '/' + this.path.replace('\\', '/') : this.path;

View File

@ -23,6 +23,7 @@
let allowForcePushing = project?.ok_with_force_push;
let omitCertificateCheck = project?.omit_certificate_check;
let useNewLocking = project?.use_new_locking || false;
let ignoreProjectSemaphore = project?.ignore_project_semaphore || false;
let signCommits = false;
const gitConfig = getContext(GitConfigService);
@ -101,8 +102,13 @@
project.use_new_locking = value;
await projectService.updateProject(project);
}
async function setIgnoreProjectSemaphore(value: boolean) {
project.ignore_project_semaphore = value;
await projectService.updateProject(project);
}
$: setUseNewLocking(useNewLocking);
$: setIgnoreProjectSemaphore(ignoreProjectSemaphore);
onMount(async () => {
let gitConfigSettings = await gitConfig.getGbConfig(project.id);
@ -288,4 +294,15 @@
<Toggle id="useNewLocking" bind:checked={useNewLocking} />
</svelte:fragment>
</SectionCard>
<SectionCard labelFor="ignoreProjectSemaphore" orientation="row">
<svelte:fragment slot="title">Disable project semaphore usage</svelte:fragment>
<svelte:fragment slot="caption">
This is an experimental setting used to test if the project semaphore used in the GitButler
app API is necessary, or if it can be removed.
</svelte:fragment>
<svelte:fragment slot="actions">
<Toggle id="ignoreProjectSemaphore" bind:checked={ignoreProjectSemaphore} />
</svelte:fragment>
</SectionCard>
</Section>

View File

@ -90,6 +90,8 @@ pub struct Project {
#[serde(default = "default_true")]
pub use_new_locking: bool,
#[serde(default)]
pub ignore_project_semaphore: bool,
}
fn default_true() -> bool {

View File

@ -29,6 +29,7 @@ pub struct UpdateRequest {
pub use_diff_context: Option<bool>,
pub snapshot_lines_threshold: Option<usize>,
pub use_new_locking: Option<bool>,
pub ignore_project_semaphore: Option<bool>,
}
impl Storage {
@ -127,6 +128,10 @@ impl Storage {
project.use_new_locking = use_new_locking;
}
if let Some(ignore_project_semaphore) = update_request.ignore_project_semaphore {
project.ignore_project_semaphore = ignore_project_semaphore;
}
self.inner
.write(PROJECTS_FILE, &serde_json::to_string_pretty(&projects)?)?;

View File

@ -41,7 +41,7 @@ impl Controller {
ownership: Option<&BranchOwnershipClaims>,
run_hooks: bool,
) -> Result<git2::Oid> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let snapshot_tree = project_repository.project().prepare_snapshot();
let result = super::commit(
@ -76,7 +76,7 @@ impl Controller {
&self,
project: &Project,
) -> Result<(Vec<super::VirtualBranch>, Vec<git::diff::FileDiff>)> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
super::list_virtual_branches(&project_repository).map_err(Into::into)
@ -87,7 +87,7 @@ impl Controller {
project: &Project,
create: &super::branch::BranchCreateRequest,
) -> Result<BranchId> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let branch_id = super::create_virtual_branch(&project_repository, create)?.id;
@ -99,7 +99,7 @@ impl Controller {
project: &Project,
branch: &git::Refname,
) -> Result<BranchId> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
super::create_virtual_branch_from_branch(&project_repository, branch).map_err(Into::into)
@ -141,7 +141,7 @@ impl Controller {
project: &Project,
branch_id: BranchId,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
@ -151,7 +151,7 @@ impl Controller {
}
pub async fn update_base_branch(&self, project: &Project) -> Result<Vec<ReferenceName>> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
@ -172,7 +172,7 @@ impl Controller {
project: &Project,
branch_update: super::branch::BranchUpdateRequest,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let snapshot_tree = project_repository.project().prepare_snapshot();
@ -197,7 +197,7 @@ impl Controller {
project: &Project,
branch_id: BranchId,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
super::delete_branch(&project_repository, branch_id)
@ -208,7 +208,7 @@ impl Controller {
project: &Project,
ownership: &BranchOwnershipClaims,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
@ -218,7 +218,7 @@ impl Controller {
}
pub async fn reset_files(&self, project: &Project, files: &Vec<String>) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
@ -234,7 +234,7 @@ impl Controller {
commit_oid: git2::Oid,
ownership: &BranchOwnershipClaims,
) -> Result<git2::Oid> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
@ -251,7 +251,7 @@ impl Controller {
to_commit_oid: git2::Oid,
ownership: &BranchOwnershipClaims,
) -> Result<git2::Oid> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
@ -273,7 +273,7 @@ impl Controller {
branch_id: BranchId,
commit_oid: git2::Oid,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let snapshot_tree = project_repository.project().prepare_snapshot();
@ -296,7 +296,7 @@ impl Controller {
commit_oid: git2::Oid,
offset: i32,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
@ -313,7 +313,7 @@ impl Controller {
commit_oid: git2::Oid,
offset: i32,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
@ -329,7 +329,7 @@ impl Controller {
branch_id: BranchId,
target_commit_oid: git2::Oid,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
@ -344,7 +344,7 @@ impl Controller {
branch_id: BranchId,
name_conflict_resolution: NameConflitResolution,
) -> Result<ReferenceName> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let snapshot_tree = project_repository.project().prepare_snapshot();
@ -366,7 +366,7 @@ impl Controller {
with_force: bool,
askpass: Option<Option<BranchId>>,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let helper = Helper::default();
let project_repository = open_with_verify(project)?;
super::push(&project_repository, branch_id, with_force, &helper, askpass)
@ -392,7 +392,7 @@ impl Controller {
branch_id: BranchId,
commit_oid: git2::Oid,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
@ -408,7 +408,7 @@ impl Controller {
commit_oid: git2::Oid,
message: &str,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
.project()
@ -466,7 +466,7 @@ impl Controller {
target_branch_id: BranchId,
commit_oid: git2::Oid,
) -> Result<()> {
let _permit = self.semaphore.acquire().await;
self.permit(project.ignore_project_semaphore).await;
let project_repository = open_with_verify(project)?;
let _ = project_repository
@ -474,6 +474,12 @@ impl Controller {
.create_snapshot(SnapshotDetails::new(OperationKind::MoveCommit));
super::move_commit(&project_repository, target_branch_id, commit_oid).map_err(Into::into)
}
async fn permit(&self, ignore: bool) {
if !ignore {
let _permit = self.semaphore.acquire().await;
}
}
}
fn open_with_verify(project: &Project) -> Result<Repository> {