refactor: rewrite checkout/create branch with submodules

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo 2025-05-09 17:51:46 +08:00
parent e446e97f28
commit 0f6c8976af
No known key found for this signature in database
8 changed files with 136 additions and 65 deletions

View file

@ -46,17 +46,19 @@ namespace SourceGit.ViewModels
var updateSubmodules = IsRecurseSubmoduleVisible && RecurseSubmodules;
return Task.Run(() =>
{
var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result();
var succ = false;
var needPopStash = false;
if (changes > 0)
if (DiscardLocalChanges)
{
if (DiscardLocalChanges)
succ = new Commands.Checkout(_repo.FullPath).Use(log).Branch(Branch, true);
}
else
{
var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result();
if (changes > 0)
{
Commands.Discard.All(_repo.FullPath, false, log);
}
else
{
var succ = new Commands.Stash(_repo.FullPath).Use(log).Push("CHECKOUT_AUTO_STASH");
succ = new Commands.Stash(_repo.FullPath).Use(log).Push("CHECKOUT_AUTO_STASH");
if (!succ)
{
log.Complete();
@ -66,18 +68,22 @@ namespace SourceGit.ViewModels
needPopStash = true;
}
succ = new Commands.Checkout(_repo.FullPath).Use(log).Branch(Branch, false);
}
var rs = new Commands.Checkout(_repo.FullPath).Use(log).Branch(Branch);
if (rs && updateSubmodules)
if (succ)
{
var submodules = new Commands.QuerySubmodules(_repo.FullPath).Result();
foreach (var submodule in submodules)
new Commands.Submodule(_repo.FullPath).Use(log).Update(submodule.Path, true, true, false);
}
if (updateSubmodules)
{
var submodules = new Commands.QuerySubmodules(_repo.FullPath).Result();
if (submodules.Count > 0)
new Commands.Submodule(_repo.FullPath).Use(log).Update(submodules, true, true, false);
}
if (rs && needPopStash)
rs = new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
if (needPopStash)
new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
}
log.Complete();
@ -94,7 +100,7 @@ namespace SourceGit.ViewModels
});
Task.Delay(400).Wait();
return rs;
return succ;
});
}

View file

@ -15,11 +15,24 @@ namespace SourceGit.ViewModels
set;
}
public bool IsRecurseSubmoduleVisible
{
get;
private set;
}
public bool RecurseSubmodules
{
get => _repo.Settings.UpdateSubmodulesOnCheckoutBranch;
set => _repo.Settings.UpdateSubmodulesOnCheckoutBranch = value;
}
public CheckoutCommit(Repository repo, Models.Commit commit)
{
_repo = repo;
Commit = commit;
DiscardLocalChanges = false;
IsRecurseSubmoduleVisible = repo.Submodules.Count > 0;
}
public override Task<bool> Sure()
@ -30,19 +43,22 @@ namespace SourceGit.ViewModels
var log = _repo.CreateLog("Checkout Commit");
Use(log);
var updateSubmodules = IsRecurseSubmoduleVisible && RecurseSubmodules;
return Task.Run(() =>
{
var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result();
var needPopStash = false;
if (changes > 0)
var succ = false;
var needPop = false;
if (DiscardLocalChanges)
{
if (DiscardLocalChanges)
succ = new Commands.Checkout(_repo.FullPath).Use(log).Commit(Commit.SHA, true);
}
else
{
var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result();
if (changes > 0)
{
Commands.Discard.All(_repo.FullPath, false, log);
}
else
{
var succ = new Commands.Stash(_repo.FullPath).Use(log).Push("CHECKOUT_AUTO_STASH");
succ = new Commands.Stash(_repo.FullPath).Use(log).Push("CHECKOUT_AUTO_STASH");
if (!succ)
{
log.Complete();
@ -50,17 +66,28 @@ namespace SourceGit.ViewModels
return false;
}
needPopStash = true;
needPop = true;
}
succ = new Commands.Checkout(_repo.FullPath).Use(log).Commit(Commit.SHA, false);
}
var rs = new Commands.Checkout(_repo.FullPath).Use(log).Commit(Commit.SHA);
if (needPopStash)
rs = new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
if (succ)
{
if (updateSubmodules)
{
var submodules = new Commands.QuerySubmodules(_repo.FullPath).Result();
if (submodules.Count > 0)
new Commands.Submodule(_repo.FullPath).Use(log).Update(submodules, true, true, false);
}
if (needPop)
new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
}
log.Complete();
CallUIThread(() => _repo.SetWatcherEnabled(true));
return rs;
return succ;
});
}

View file

@ -141,8 +141,8 @@ namespace SourceGit.ViewModels
if (InitAndUpdateSubmodules)
{
var submodules = new Commands.QuerySubmodules(path).Result();
foreach (var submodule in submodules)
new Commands.Submodule(path).Use(log).Update(submodule.Path, true, true, false);
if (submodules.Count > 0)
new Commands.Submodule(path).Use(log).Update(submodules, true, true, false);
}
log.Complete();

View file

@ -864,7 +864,7 @@ namespace SourceGit.ViewModels
{
new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevision(path, $"{_commit.SHA}");
log.Complete();
});
});
}
private Task ResetToParentRevision(Models.Change change)

View file

@ -117,18 +117,18 @@ namespace SourceGit.ViewModels
var updateSubmodules = IsRecurseSubmoduleVisible && RecurseSubmodules;
return Task.Run(() =>
{
bool succ;
bool succ = false;
if (CheckoutAfterCreated && !_repo.IsBare)
{
var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result();
var needPopStash = false;
if (changes > 0)
if (DiscardLocalChanges)
{
if (DiscardLocalChanges)
{
Commands.Discard.All(_repo.FullPath, false, log);
}
else
succ = new Commands.Checkout(_repo.FullPath).Use(log).Branch(fixedName, _baseOnRevision, true);
}
else
{
var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result();
if (changes > 0)
{
succ = new Commands.Stash(_repo.FullPath).Use(log).Push("CREATE_BRANCH_AUTO_STASH");
if (!succ)
@ -140,18 +140,22 @@ namespace SourceGit.ViewModels
needPopStash = true;
}
succ = new Commands.Checkout(_repo.FullPath).Use(log).Branch(fixedName, _baseOnRevision, false);
}
succ = new Commands.Checkout(_repo.FullPath).Use(log).Branch(fixedName, _baseOnRevision);
if (succ && updateSubmodules)
if (succ)
{
var submodules = new Commands.QuerySubmodules(_repo.FullPath).Result();
foreach (var submodule in submodules)
new Commands.Submodule(_repo.FullPath).Use(log).Update(submodule.Path, true, true, false);
}
if (updateSubmodules)
{
var submodules = new Commands.QuerySubmodules(_repo.FullPath).Result();
if (submodules.Count > 0)
new Commands.Submodule(_repo.FullPath).Use(log).Update(submodules, true, true, false);
}
if (succ && needPopStash)
new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
if (needPopStash)
new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
}
}
else
{
@ -174,6 +178,8 @@ namespace SourceGit.ViewModels
if (_repo.HistoriesFilterMode == Models.FilterMode.Included)
_repo.SetBranchFilterMode(fake, Models.FilterMode.Included, true, false);
ProgressDescription = "Waiting for branch updated...";
}
_repo.MarkBranchesDirtyManually();
@ -181,10 +187,7 @@ namespace SourceGit.ViewModels
});
if (CheckoutAfterCreated)
{
CallUIThread(() => ProgressDescription = "Waiting for branch updated...");
Task.Delay(400).Wait();
}
return true;
});