Skip to content

Commit

Permalink
Merge pull request #4252 from gitbutlerapp/disable-project-semaphore-…
Browse files Browse the repository at this point in the history
…usage

feature flag for disabling the project semaphore
  • Loading branch information
krlvi committed Jul 6, 2024
2 parents 66d0ba2 + 532b51b commit ef3e6af
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 21 deletions.
1 change: 1 addition & 0 deletions app/src/lib/backend/projects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
17 changes: 17 additions & 0 deletions app/src/lib/settings/PreferencesForm.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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>
2 changes: 2 additions & 0 deletions crates/gitbutler-core/src/projects/project.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
5 changes: 5 additions & 0 deletions crates/gitbutler-core/src/projects/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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)?)?;

Expand Down
48 changes: 27 additions & 21 deletions crates/gitbutler-core/src/virtual_branches/controller.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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)
Expand All @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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();
Expand All @@ -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)
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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();
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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();
Expand All @@ -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)
Expand All @@ -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
Expand All @@ -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()
Expand Down Expand Up @@ -466,14 +466,20 @@ 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
.project()
.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> {
Expand Down

0 comments on commit ef3e6af

Please sign in to comment.