enhance: record more git command logs

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo 2025-04-18 11:29:59 +08:00
parent d254b557a9
commit 75b4a4b294
No known key found for this signature in database
9 changed files with 107 additions and 50 deletions

View file

@ -36,9 +36,9 @@ namespace SourceGit.Commands
return content.Contains("git lfs pre-push");
}
public bool Install()
public bool Install(Models.ICommandLog log)
{
return new SubCmd(_repo, "lfs install --local", null).Exec();
return new SubCmd(_repo, "lfs install --local", log).Exec();
}
public bool Track(string pattern, bool isFilenameMode, Models.ICommandLog log)
@ -93,21 +93,21 @@ namespace SourceGit.Commands
return locks;
}
public bool Lock(string remote, string file)
public bool Lock(string remote, string file, Models.ICommandLog log)
{
return new SubCmd(_repo, $"lfs lock --remote={remote} \"{file}\"", null).Exec();
return new SubCmd(_repo, $"lfs lock --remote={remote} \"{file}\"", log).Exec();
}
public bool Unlock(string remote, string file, bool force)
public bool Unlock(string remote, string file, bool force, Models.ICommandLog log)
{
var opt = force ? "-f" : "";
return new SubCmd(_repo, $"lfs unlock --remote={remote} {opt} \"{file}\"", null).Exec();
return new SubCmd(_repo, $"lfs unlock --remote={remote} {opt} \"{file}\"", log).Exec();
}
public bool Unlock(string remote, long id, bool force)
public bool Unlock(string remote, long id, bool force, Models.ICommandLog log)
{
var opt = force ? "-f" : "";
return new SubCmd(_repo, $"lfs unlock --remote={remote} {opt} --id={id}", null).Exec();
return new SubCmd(_repo, $"lfs unlock --remote={remote} {opt} --id={id}", log).Exec();
}
private readonly string _repo;

View file

@ -9,14 +9,14 @@ namespace SourceGit.ViewModels
{
public AvaloniaList<string> Files { get; private set; }
public AssumeUnchangedManager(string repo)
public AssumeUnchangedManager(Repository repo)
{
_repo = repo;
Files = new AvaloniaList<string>();
Task.Run(() =>
{
var collect = new Commands.QueryAssumeUnchangedFiles(_repo).Result();
var collect = new Commands.QueryAssumeUnchangedFiles(_repo.FullPath).Result();
Dispatcher.UIThread.Invoke(() => Files.AddRange(collect));
});
}
@ -25,11 +25,13 @@ namespace SourceGit.ViewModels
{
if (!string.IsNullOrEmpty(file))
{
new Commands.AssumeUnchanged(_repo, file, false).Exec();
var log = _repo.CreateLog("Remove Assue Unchanged File");
new Commands.AssumeUnchanged(_repo.FullPath, file, false).Use(log).Exec();
log.Complete();
Files.Remove(file);
}
}
private readonly string _repo;
private readonly Repository _repo;
}
}

View file

@ -391,7 +391,9 @@ namespace SourceGit.ViewModels
resetToThisRevision.Icon = App.CreateMenuIcon("Icons.File.Checkout");
resetToThisRevision.Click += (_, ev) =>
{
new Commands.Checkout(_repo.FullPath).FileWithRevision(change.Path, $"{_commit.SHA}");
var log = _repo.CreateLog($"Reset File to '{_commit.SHA}'");
new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevision(change.Path, $"{_commit.SHA}");
log.Complete();
ev.Handled = true;
};
@ -401,10 +403,12 @@ namespace SourceGit.ViewModels
resetToFirstParent.IsEnabled = _commit.Parents.Count > 0;
resetToFirstParent.Click += (_, ev) =>
{
var log = _repo.CreateLog($"Reset File to '{_commit.SHA}~1'");
if (change.Index == Models.ChangeState.Renamed)
new Commands.Checkout(_repo.FullPath).FileWithRevision(change.OriginalPath, $"{_commit.SHA}~1");
new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevision(change.OriginalPath, $"{_commit.SHA}~1");
new Commands.Checkout(_repo.FullPath).FileWithRevision(change.Path, $"{_commit.SHA}~1");
new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevision(change.Path, $"{_commit.SHA}~1");
log.Complete();
ev.Handled = true;
};
@ -530,7 +534,9 @@ namespace SourceGit.ViewModels
resetToThisRevision.IsEnabled = File.Exists(fullPath);
resetToThisRevision.Click += (_, ev) =>
{
new Commands.Checkout(_repo.FullPath).FileWithRevision(file.Path, $"{_commit.SHA}");
var log = _repo.CreateLog($"Reset File to '{_commit.SHA}'");
new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevision(file.Path, $"{_commit.SHA}");
log.Complete();
ev.Handled = true;
};
@ -542,7 +548,9 @@ namespace SourceGit.ViewModels
resetToFirstParent.IsEnabled = _commit.Parents.Count > 0 && fileIndex != Models.ChangeState.Renamed;
resetToFirstParent.Click += (_, ev) =>
{
new Commands.Checkout(_repo.FullPath).FileWithRevision(file.Path, $"{_commit.SHA}~1");
var log = _repo.CreateLog($"Reset File to '{_commit.SHA}~1'");
new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevision(file.Path, $"{_commit.SHA}~1");
log.Complete();
ev.Handled = true;
};
@ -737,10 +745,12 @@ namespace SourceGit.ViewModels
{
lfsLock.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(_repo.Remotes[0].Name, path));
var log = _repo.CreateLog("Lock LFS file");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(_repo.Remotes[0].Name, path, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Lock file \"{path}\" successfully!");
log.Complete();
e.Handled = true;
};
}
@ -753,10 +763,12 @@ namespace SourceGit.ViewModels
lockRemote.Header = remoteName;
lockRemote.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(remoteName, path));
var log = _repo.CreateLog("Lock LFS file");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(remoteName, path, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Lock file \"{path}\" successfully!");
log.Complete();
e.Handled = true;
};
lfsLock.Items.Add(lockRemote);
@ -772,10 +784,12 @@ namespace SourceGit.ViewModels
{
lfsUnlock.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(_repo.Remotes[0].Name, path, false));
var log = _repo.CreateLog("Unlock LFS file");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(_repo.Remotes[0].Name, path, false, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Unlock file \"{path}\" successfully!");
log.Complete();
e.Handled = true;
};
}
@ -788,10 +802,12 @@ namespace SourceGit.ViewModels
unlockRemote.Header = remoteName;
unlockRemote.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(remoteName, path, false));
var log = _repo.CreateLog("Unlock LFS file");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(remoteName, path, false, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Unlock file \"{path}\" successfully!");
log.Complete();
e.Handled = true;
};
lfsUnlock.Items.Add(unlockRemote);

View file

@ -297,12 +297,14 @@ namespace SourceGit.ViewModels
return;
var options = new FolderPickerOpenOptions() { AllowMultiple = false };
var log = null as CommandLog;
try
{
var picker = await storageProvider.OpenFolderPickerAsync(options);
if (picker.Count == 1)
{
var log = _repo.CreateLog("Save as Patch");
log = _repo.CreateLog("Save as Patch");
var succ = false;
for (var i = 0; i < selected.Count; i++)
{
@ -314,8 +316,6 @@ namespace SourceGit.ViewModels
if (succ)
App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
log.Complete();
}
}
catch (Exception exception)
@ -323,6 +323,7 @@ namespace SourceGit.ViewModels
App.RaiseException(_repo.FullPath, $"Failed to save as patch: {exception.Message}");
}
log?.Complete();
e.Handled = true;
};
multipleMenu.Items.Add(saveToPatchMultiple);
@ -658,13 +659,16 @@ namespace SourceGit.ViewModels
return;
var options = new FolderPickerOpenOptions() { AllowMultiple = false };
var log = null as CommandLog;
try
{
var selected = await storageProvider.OpenFolderPickerAsync(options);
if (selected.Count == 1)
{
log = _repo.CreateLog("Save as Patch");
var saveTo = GetPatchFileName(selected[0].Path.LocalPath, commit);
var succ = new Commands.FormatPatch(_repo.FullPath, commit.SHA, saveTo).Exec();
var succ = new Commands.FormatPatch(_repo.FullPath, commit.SHA, saveTo).Use(log).Exec();
if (succ)
App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
}
@ -674,6 +678,7 @@ namespace SourceGit.ViewModels
App.RaiseException(_repo.FullPath, $"Failed to save as patch: {exception.Message}");
}
log?.Complete();
e.Handled = true;
};
menu.Items.Add(saveToPatch);

View file

@ -174,12 +174,14 @@ namespace SourceGit.ViewModels
}
File.WriteAllText(saveFile, JsonSerializer.Serialize(collection, JsonCodeGen.Default.InteractiveRebaseJobCollection));
var log = _repo.CreateLog("Interactive Rebase");
return Task.Run(() =>
{
var succ = new Commands.InteractiveRebase(_repo.FullPath, On.SHA).Exec();
var succ = new Commands.InteractiveRebase(_repo.FullPath, On.SHA).Use(log).Exec();
if (succ)
File.Delete(saveFile);
log.Complete();
Dispatcher.UIThread.Invoke(() => _repo.SetWatcherEnabled(true));
return succ;
});

View file

@ -37,17 +37,17 @@ namespace SourceGit.ViewModels
private set => SetProperty(ref _visibleLocks, value);
}
public LFSLocks(string repo, string remote)
public LFSLocks(Repository repo, string remote)
{
_repo = repo;
_remote = remote;
_userName = new Commands.Config(repo).Get("user.name");
_userName = new Commands.Config(repo.FullPath).Get("user.name");
HasValidUserName = !string.IsNullOrEmpty(_userName);
Task.Run(() =>
{
_cachedLocks = new Commands.LFS(_repo).Locks(_remote);
_cachedLocks = new Commands.LFS(_repo.FullPath).Locks(_remote);
Dispatcher.UIThread.Invoke(() =>
{
UpdateVisibleLocks();
@ -62,9 +62,13 @@ namespace SourceGit.ViewModels
return;
IsLoading = true;
var log = _repo.CreateLog("Unlock LFS File");
Task.Run(() =>
{
var succ = new Commands.LFS(_repo).Unlock(_remote, lfsLock.ID, force);
var succ = new Commands.LFS(_repo.FullPath).Unlock(_remote, lfsLock.ID, force, log);
log.Complete();
Dispatcher.UIThread.Invoke(() =>
{
if (succ)
@ -99,7 +103,7 @@ namespace SourceGit.ViewModels
VisibleLocks = visible;
}
private string _repo;
private Repository _repo;
private string _remote;
private bool _isLoading = true;
private List<Models.LFSLock> _cachedLocks = [];

View file

@ -1405,7 +1405,7 @@ namespace SourceGit.ViewModels
{
locks.Click += (_, e) =>
{
var dialog = new Views.LFSLocks() { DataContext = new LFSLocks(_fullpath, _remotes[0].Name) };
var dialog = new Views.LFSLocks() { DataContext = new LFSLocks(this, _remotes[0].Name) };
App.OpenDialog(dialog);
e.Handled = true;
};
@ -1419,7 +1419,7 @@ namespace SourceGit.ViewModels
lockRemote.Header = remoteName;
lockRemote.Click += (_, e) =>
{
var dialog = new Views.LFSLocks() { DataContext = new LFSLocks(_fullpath, remoteName) };
var dialog = new Views.LFSLocks() { DataContext = new LFSLocks(this, remoteName) };
App.OpenDialog(dialog);
e.Handled = true;
};
@ -1437,10 +1437,12 @@ namespace SourceGit.ViewModels
install.Icon = App.CreateMenuIcon("Icons.Init");
install.Click += (_, e) =>
{
var succ = new Commands.LFS(_fullpath).Install();
var log = CreateLog("Install LFS");
var succ = new Commands.LFS(_fullpath).Install(log);
if (succ)
App.SendNotification(_fullpath, $"LFS enabled successfully!");
log.Complete();
e.Handled = true;
};
menu.Items.Add(install);
@ -2249,9 +2251,11 @@ namespace SourceGit.ViewModels
unlock.Click += (_, ev) =>
{
SetWatcherEnabled(false);
var succ = new Commands.Worktree(_fullpath).Unlock(worktree.FullPath);
var log = CreateLog("Unlock Worktree");
var succ = new Commands.Worktree(_fullpath).Use(log).Unlock(worktree.FullPath);
if (succ)
worktree.IsLocked = false;
log.Complete();
SetWatcherEnabled(true);
ev.Handled = true;
};
@ -2265,9 +2269,11 @@ namespace SourceGit.ViewModels
loc.Click += (_, ev) =>
{
SetWatcherEnabled(false);
var succ = new Commands.Worktree(_fullpath).Lock(worktree.FullPath);
var log = CreateLog("Lock Worktree");
var succ = new Commands.Worktree(_fullpath).Use(log).Lock(worktree.FullPath);
if (succ)
worktree.IsLocked = true;
log.Complete();
SetWatcherEnabled(true);
ev.Handled = true;
};

View file

@ -238,7 +238,9 @@ namespace SourceGit.ViewModels
resetToThisRevision.Icon = App.CreateMenuIcon("Icons.File.Checkout");
resetToThisRevision.Click += (_, ev) =>
{
new Commands.Checkout(_repo.FullPath).FileWithRevision(change.Path, $"{_selectedStash.SHA}");
var log = _repo.CreateLog($"Reset File to '{_selectedStash.SHA}'");
new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevision(change.Path, $"{_selectedStash.SHA}");
log.Complete();
ev.Handled = true;
};

View file

@ -325,7 +325,7 @@ namespace SourceGit.ViewModels
{
App.OpenDialog(new Views.AssumeUnchangedManager()
{
DataContext = new AssumeUnchangedManager(_repo.FullPath)
DataContext = new AssumeUnchangedManager(_repo)
});
}
@ -377,6 +377,7 @@ namespace SourceGit.ViewModels
var files = new List<string>();
var needStage = new List<string>();
var log = _repo.CreateLog("Use Theirs");
foreach (var change in changes)
{
@ -399,14 +400,15 @@ namespace SourceGit.ViewModels
if (files.Count > 0)
{
var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).UseTheirs(files));
var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).Use(log).UseTheirs(files));
if (succ)
needStage.AddRange(files);
}
if (needStage.Count > 0)
await Task.Run(() => new Commands.Add(_repo.FullPath, needStage).Exec());
await Task.Run(() => new Commands.Add(_repo.FullPath, needStage).Use(log).Exec());
log.Complete();
_repo.MarkWorkingCopyDirtyManually();
_repo.SetWatcherEnabled(true);
}
@ -417,6 +419,7 @@ namespace SourceGit.ViewModels
var files = new List<string>();
var needStage = new List<string>();
var log = _repo.CreateLog("Use Mine");
foreach (var change in changes)
{
@ -439,14 +442,15 @@ namespace SourceGit.ViewModels
if (files.Count > 0)
{
var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).UseMine(files));
var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).Use(log).UseMine(files));
if (succ)
needStage.AddRange(files);
}
if (needStage.Count > 0)
await Task.Run(() => new Commands.Add(_repo.FullPath, needStage).Exec());
await Task.Run(() => new Commands.Add(_repo.FullPath, needStage).Use(log).Exec());
log.Complete();
_repo.MarkWorkingCopyDirtyManually();
_repo.SetWatcherEnabled(true);
}
@ -845,10 +849,12 @@ namespace SourceGit.ViewModels
{
lfsLock.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(_repo.Remotes[0].Name, change.Path));
var log = _repo.CreateLog("Lock LFS File");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(_repo.Remotes[0].Name, change.Path, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
log.Complete();
e.Handled = true;
};
}
@ -861,10 +867,12 @@ namespace SourceGit.ViewModels
lockRemote.Header = remoteName;
lockRemote.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(remoteName, change.Path));
var log = _repo.CreateLog("Lock LFS File");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(remoteName, change.Path, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
log.Complete();
e.Handled = true;
};
lfsLock.Items.Add(lockRemote);
@ -880,10 +888,12 @@ namespace SourceGit.ViewModels
{
lfsUnlock.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(_repo.Remotes[0].Name, change.Path, false));
var log = _repo.CreateLog("Unlock LFS File");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(_repo.Remotes[0].Name, change.Path, false, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
log.Complete();
e.Handled = true;
};
}
@ -896,10 +906,12 @@ namespace SourceGit.ViewModels
unlockRemote.Header = remoteName;
unlockRemote.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(remoteName, change.Path, false));
var log = _repo.CreateLog("Unlock LFS File");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(remoteName, change.Path, false, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
log.Complete();
e.Handled = true;
};
lfsUnlock.Items.Add(unlockRemote);
@ -1211,10 +1223,12 @@ namespace SourceGit.ViewModels
{
lfsLock.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(_repo.Remotes[0].Name, change.Path));
var log = _repo.CreateLog("Lock LFS File");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(_repo.Remotes[0].Name, change.Path, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
log.Complete();
e.Handled = true;
};
}
@ -1227,10 +1241,12 @@ namespace SourceGit.ViewModels
lockRemote.Header = remoteName;
lockRemote.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(remoteName, change.Path));
var log = _repo.CreateLog("Lock LFS File");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(remoteName, change.Path, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
log.Complete();
e.Handled = true;
};
lfsLock.Items.Add(lockRemote);
@ -1246,10 +1262,12 @@ namespace SourceGit.ViewModels
{
lfsUnlock.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(_repo.Remotes[0].Name, change.Path, false));
var log = _repo.CreateLog("Unlock LFS File");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(_repo.Remotes[0].Name, change.Path, false, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
log.Complete();
e.Handled = true;
};
}
@ -1262,10 +1280,12 @@ namespace SourceGit.ViewModels
unlockRemote.Header = remoteName;
unlockRemote.Click += async (_, e) =>
{
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(remoteName, change.Path, false));
var log = _repo.CreateLog("Unlock LFS File");
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(remoteName, change.Path, false, log));
if (succ)
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
log.Complete();
e.Handled = true;
};
lfsUnlock.Items.Add(unlockRemote);