diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 0845774fb3..9397d78e2b 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -103,6 +103,7 @@ jobs: name: package.${{ matrix.runtime }} path: | build/sourcegit-*.AppImage + build/sourcegit-*.AppImage.zsync build/sourcegit_*.deb build/sourcegit-*.rpm - name: Delete temp artifacts diff --git a/README.md b/README.md index 53baa34274..2ac5ba0723 100644 --- a/README.md +++ b/README.md @@ -200,6 +200,25 @@ For `OrcaRouter`: * `API Key` should be an OrcaRouter API key (prefixed with `sk-orca-`) * A good starting `Model` is `orcarouter/auto`, which routes each request to the best available model +For `Cheaper Inference`: + +* `Server` should be `https://api.cheaperinference.com/v1` +* `API Key` should be a Cheaper Inference API key (prefixed with `ci_live_`) +* A good starting `Model` is `gpt-5.4-mini` + +For `Opper`: + +* `Server` should be `https://api.opper.ai/v3/compat` +* `API Key` should be an Opper API key, created at https://platform.opper.ai +* A good starting `Model` is `gpt-5.4-mini` + +For `API Route`: + +* `Server` should be `https://global.api-route.com/v1` +* `API Key` should be your API Route API key +* `Model` can be `gpt-6.1-sol` if it is available to your key; otherwise select an available chat model from the fetched catalog +* See the [API documentation](https://github.com/DennyHo0917/api-route/blob/main/API.md) for authentication and model discovery + For other AI service: * The `Server` should fill in a URL equivalent to OpenAI's `https://api.openai.com/v1`. For example, when using `Ollama`, it should be `http://localhost:11434/v1` instead of `http://localhost:11434/api/generate` diff --git a/TRANSLATION.md b/TRANSLATION.md index 67becad004..0e33d6f6a4 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -6,13 +6,22 @@ This document shows the translation status of each locale file in the repository ### ![en_US](https://img.shields.io/badge/en__US-%E2%88%9A-brightgreen) -### ![de__DE](https://img.shields.io/badge/de__DE-95.66%25-yellow) +### ![de__DE](https://img.shields.io/badge/de__DE-93.94%25-yellow)
Missing keys in de_DE.axaml - Text.Blame.Tips +- Text.BranchCM.CheckoutAsWorktree - Text.BranchTree.PushURL +- Text.CheckoutAsWorktree +- Text.CheckoutAsWorktree.LocalBranch +- Text.CheckoutAsWorktree.NewBranchName +- Text.CheckoutAsWorktree.NewBranchName.Placeholder +- Text.CheckoutAsWorktree.RemoteBranch +- Text.CheckoutAsWorktree.Tracking +- Text.CheckoutAsWorktree.WorktreePath +- Text.CheckoutAsWorktree.WorktreePath.Placeholder - Text.CommitDetail.Files.Tips - Text.Dashboard - Text.Diff.Binary.ViewContentOfNew @@ -52,21 +61,40 @@ This document shows the translation status of each locale file in the repository - Text.SSHKeyHelper.Path - Text.SSHKeyHelper.PublicKey - Text.SSHKeyHelper.Title +- Text.Statistics.Commits - Text.Statistics.Tips +- Text.Statistics.TopAuthors +- Text.Statistics.TopAuthors.Count +- Text.Statistics.TopAuthors.Percentage +- Text.Statistics.TopAuthors.Tip - Text.Terminate +- Text.TrustRepository +- Text.TrustRepository.CommandTip +- Text.TrustRepository.Description +- Text.TrustRepository.Path +- Text.TrustRepository.ScanSkipped - Text.WorkingCopy.CollapseSidebar - Text.WorkingCopy.DiscardAll - Text.WorkingCopy.ExpandSidebar
-### ![el__GR](https://img.shields.io/badge/el__GR-95.19%25-yellow) +### ![el__GR](https://img.shields.io/badge/el__GR-93.48%25-yellow)
Missing keys in el_GR.axaml - Text.Blame.Tips +- Text.BranchCM.CheckoutAsWorktree - Text.BranchTree.PushURL +- Text.CheckoutAsWorktree +- Text.CheckoutAsWorktree.LocalBranch +- Text.CheckoutAsWorktree.NewBranchName +- Text.CheckoutAsWorktree.NewBranchName.Placeholder +- Text.CheckoutAsWorktree.RemoteBranch +- Text.CheckoutAsWorktree.Tracking +- Text.CheckoutAsWorktree.WorktreePath +- Text.CheckoutAsWorktree.WorktreePath.Placeholder - Text.CommitDetail.Files.Tips - Text.Dashboard - Text.Diff.Binary.ViewContentOfNew @@ -110,8 +138,18 @@ This document shows the translation status of each locale file in the repository - Text.SSHKeyHelper.Path - Text.SSHKeyHelper.PublicKey - Text.SSHKeyHelper.Title +- Text.Statistics.Commits - Text.Statistics.Tips +- Text.Statistics.TopAuthors +- Text.Statistics.TopAuthors.Count +- Text.Statistics.TopAuthors.Percentage +- Text.Statistics.TopAuthors.Tip - Text.Terminate +- Text.TrustRepository +- Text.TrustRepository.CommandTip +- Text.TrustRepository.Description +- Text.TrustRepository.Path +- Text.TrustRepository.ScanSkipped - Text.WorkingCopy.CollapseSidebar - Text.WorkingCopy.DiscardAll - Text.WorkingCopy.ExpandSidebar @@ -119,18 +157,9 @@ This document shows the translation status of each locale file in the repository
-### ![es__ES](https://img.shields.io/badge/es__ES-99.72%25-yellow) +### ![es__ES](https://img.shields.io/badge/es__ES-%E2%88%9A-brightgreen) -
-Missing keys in es_ES.axaml - -- Text.CommitDetail.Files.Tips -- Text.WorkingCopy.CollapseSidebar -- Text.WorkingCopy.ExpandSidebar - -
- -### ![fr__FR](https://img.shields.io/badge/fr__FR-91.42%25-yellow) +### ![fr__FR](https://img.shields.io/badge/fr__FR-89.75%25-yellow)
Missing keys in fr_FR.axaml @@ -141,7 +170,16 @@ This document shows the translation status of each locale file in the repository - Text.Bisect.WaitingForCheckoutAnother - Text.Bisect.WaitingForFirstBad - Text.Blame.Tips +- Text.BranchCM.CheckoutAsWorktree - Text.BranchTree.PushURL +- Text.CheckoutAsWorktree +- Text.CheckoutAsWorktree.LocalBranch +- Text.CheckoutAsWorktree.NewBranchName +- Text.CheckoutAsWorktree.NewBranchName.Placeholder +- Text.CheckoutAsWorktree.RemoteBranch +- Text.CheckoutAsWorktree.Tracking +- Text.CheckoutAsWorktree.WorktreePath +- Text.CheckoutAsWorktree.WorktreePath.Placeholder - Text.CheckoutDetached - Text.CheckoutDetached.Target - Text.CheckoutDetached.Warning @@ -216,10 +254,20 @@ This document shows the translation status of each locale file in the repository - Text.SSHKeyHelper.Path - Text.SSHKeyHelper.PublicKey - Text.SSHKeyHelper.Title +- Text.Statistics.Commits - Text.Statistics.Tips +- Text.Statistics.TopAuthors +- Text.Statistics.TopAuthors.Count +- Text.Statistics.TopAuthors.Percentage +- Text.Statistics.TopAuthors.Tip - Text.TagCM.Checkout - Text.TagCM.Merge - Text.Terminate +- Text.TrustRepository +- Text.TrustRepository.CommandTip +- Text.TrustRepository.Description +- Text.TrustRepository.Path +- Text.TrustRepository.ScanSkipped - Text.UpdateSubmodules.Recursive - Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder - Text.WorkingCopy.CollapseSidebar @@ -229,7 +277,7 @@ This document shows the translation status of each locale file in the repository
-### ![he__IL](https://img.shields.io/badge/he__IL-91.42%25-yellow) +### ![he__IL](https://img.shields.io/badge/he__IL-89.75%25-yellow)
Missing keys in he_IL.axaml @@ -240,7 +288,16 @@ This document shows the translation status of each locale file in the repository - Text.Bisect.WaitingForCheckoutAnother - Text.Bisect.WaitingForFirstBad - Text.Blame.Tips +- Text.BranchCM.CheckoutAsWorktree - Text.BranchTree.PushURL +- Text.CheckoutAsWorktree +- Text.CheckoutAsWorktree.LocalBranch +- Text.CheckoutAsWorktree.NewBranchName +- Text.CheckoutAsWorktree.NewBranchName.Placeholder +- Text.CheckoutAsWorktree.RemoteBranch +- Text.CheckoutAsWorktree.Tracking +- Text.CheckoutAsWorktree.WorktreePath +- Text.CheckoutAsWorktree.WorktreePath.Placeholder - Text.CheckoutDetached - Text.CheckoutDetached.Target - Text.CheckoutDetached.Warning @@ -315,10 +372,20 @@ This document shows the translation status of each locale file in the repository - Text.SSHKeyHelper.Path - Text.SSHKeyHelper.PublicKey - Text.SSHKeyHelper.Title +- Text.Statistics.Commits - Text.Statistics.Tips +- Text.Statistics.TopAuthors +- Text.Statistics.TopAuthors.Count +- Text.Statistics.TopAuthors.Percentage +- Text.Statistics.TopAuthors.Tip - Text.TagCM.Checkout - Text.TagCM.Merge - Text.Terminate +- Text.TrustRepository +- Text.TrustRepository.CommandTip +- Text.TrustRepository.Description +- Text.TrustRepository.Path +- Text.TrustRepository.ScanSkipped - Text.UpdateSubmodules.Recursive - Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder - Text.WorkingCopy.CollapseSidebar @@ -328,13 +395,22 @@ This document shows the translation status of each locale file in the repository
-### ![id__ID](https://img.shields.io/badge/id__ID-95.66%25-yellow) +### ![id__ID](https://img.shields.io/badge/id__ID-93.94%25-yellow)
Missing keys in id_ID.axaml - Text.Blame.Tips +- Text.BranchCM.CheckoutAsWorktree - Text.BranchTree.PushURL +- Text.CheckoutAsWorktree +- Text.CheckoutAsWorktree.LocalBranch +- Text.CheckoutAsWorktree.NewBranchName +- Text.CheckoutAsWorktree.NewBranchName.Placeholder +- Text.CheckoutAsWorktree.RemoteBranch +- Text.CheckoutAsWorktree.Tracking +- Text.CheckoutAsWorktree.WorktreePath +- Text.CheckoutAsWorktree.WorktreePath.Placeholder - Text.CommitDetail.Files.Tips - Text.Dashboard - Text.Diff.Binary.ViewContentOfNew @@ -373,8 +449,18 @@ This document shows the translation status of each locale file in the repository - Text.SSHKeyHelper.Path - Text.SSHKeyHelper.PublicKey - Text.SSHKeyHelper.Title +- Text.Statistics.Commits - Text.Statistics.Tips +- Text.Statistics.TopAuthors +- Text.Statistics.TopAuthors.Count +- Text.Statistics.TopAuthors.Percentage +- Text.Statistics.TopAuthors.Tip - Text.Terminate +- Text.TrustRepository +- Text.TrustRepository.CommandTip +- Text.TrustRepository.Description +- Text.TrustRepository.Path +- Text.TrustRepository.ScanSkipped - Text.WorkingCopy.CollapseSidebar - Text.WorkingCopy.DiscardAll - Text.WorkingCopy.ExpandSidebar @@ -382,7 +468,7 @@ This document shows the translation status of each locale file in the repository
-### ![it__IT](https://img.shields.io/badge/it__IT-85.28%25-yellow) +### ![it__IT](https://img.shields.io/badge/it__IT-83.78%25-yellow)
Missing keys in it_IT.axaml @@ -396,9 +482,18 @@ This document shows the translation status of each locale file in the repository - Text.Bisect.WaitingForCheckoutAnother - Text.Bisect.WaitingForFirstBad - Text.Blame.Tips +- Text.BranchCM.CheckoutAsWorktree - Text.BranchCM.CompareWithSpecial - Text.BranchTree.PushURL - Text.ChangeCM.ResetFileTo +- Text.CheckoutAsWorktree +- Text.CheckoutAsWorktree.LocalBranch +- Text.CheckoutAsWorktree.NewBranchName +- Text.CheckoutAsWorktree.NewBranchName.Placeholder +- Text.CheckoutAsWorktree.RemoteBranch +- Text.CheckoutAsWorktree.Tracking +- Text.CheckoutAsWorktree.WorktreePath +- Text.CheckoutAsWorktree.WorktreePath.Placeholder - Text.CheckoutBranchFromStash - Text.CheckoutBranchFromStash.Branch - Text.CheckoutBranchFromStash.Stash @@ -415,7 +510,6 @@ This document shows the translation status of each locale file in the repository - Text.CommitCM.CopyCommitterTime - Text.CommitDetail.CollapseToBottom - Text.CommitDetail.Files.Tips -- Text.CommitMessageTextBox.Column - Text.Compare.Changes - Text.Compare.Commits - Text.Compare.Commits.LeftOnly @@ -528,12 +622,22 @@ This document shows the translation status of each locale file in the repository - Text.SSHKeyHelper.Title - Text.StashCM.ApplyFileChanges - Text.StashCM.Branch +- Text.Statistics.Commits - Text.Statistics.Tips +- Text.Statistics.TopAuthors +- Text.Statistics.TopAuthors.Count +- Text.Statistics.TopAuthors.Percentage +- Text.Statistics.TopAuthors.Tip - Text.SubmoduleRevisionCompare - Text.SubmoduleRevisionCompare.OpenDetails - Text.TagCM.Checkout - Text.TagCM.Merge - Text.Terminate +- Text.TrustRepository +- Text.TrustRepository.CommandTip +- Text.TrustRepository.Description +- Text.TrustRepository.Path +- Text.TrustRepository.ScanSkipped - Text.UpdateSubmodules.Recursive - Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder - Text.WorkingCopy.CollapseSidebar @@ -546,18 +650,37 @@ This document shows the translation status of each locale file in the repository
-### ![ja__JP](https://img.shields.io/badge/ja__JP-99.72%25-yellow) +### ![ja__JP](https://img.shields.io/badge/ja__JP-97.95%25-yellow)
Missing keys in ja_JP.axaml +- Text.BranchCM.CheckoutAsWorktree +- Text.CheckoutAsWorktree +- Text.CheckoutAsWorktree.LocalBranch +- Text.CheckoutAsWorktree.NewBranchName +- Text.CheckoutAsWorktree.NewBranchName.Placeholder +- Text.CheckoutAsWorktree.RemoteBranch +- Text.CheckoutAsWorktree.Tracking +- Text.CheckoutAsWorktree.WorktreePath +- Text.CheckoutAsWorktree.WorktreePath.Placeholder - Text.CommitDetail.Files.Tips +- Text.Statistics.Commits +- Text.Statistics.TopAuthors +- Text.Statistics.TopAuthors.Count +- Text.Statistics.TopAuthors.Percentage +- Text.Statistics.TopAuthors.Tip +- Text.TrustRepository +- Text.TrustRepository.CommandTip +- Text.TrustRepository.Description +- Text.TrustRepository.Path +- Text.TrustRepository.ScanSkipped - Text.WorkingCopy.CollapseSidebar - Text.WorkingCopy.ExpandSidebar
-### ![ko__KR](https://img.shields.io/badge/ko__KR-92.83%25-yellow) +### ![ko__KR](https://img.shields.io/badge/ko__KR-91.15%25-yellow)
Missing keys in ko_KR.axaml @@ -565,7 +688,16 @@ This document shows the translation status of each locale file in the repository - Text.Bisect.WaitingForCheckoutAnother - Text.Bisect.WaitingForFirstBad - Text.Blame.Tips +- Text.BranchCM.CheckoutAsWorktree - Text.BranchTree.PushURL +- Text.CheckoutAsWorktree +- Text.CheckoutAsWorktree.LocalBranch +- Text.CheckoutAsWorktree.NewBranchName +- Text.CheckoutAsWorktree.NewBranchName.Placeholder +- Text.CheckoutAsWorktree.RemoteBranch +- Text.CheckoutAsWorktree.Tracking +- Text.CheckoutAsWorktree.WorktreePath +- Text.CheckoutAsWorktree.WorktreePath.Placeholder - Text.CheckoutDetached - Text.CheckoutDetached.Target - Text.CheckoutDetached.Warning @@ -628,10 +760,20 @@ This document shows the translation status of each locale file in the repository - Text.SSHKeyHelper.Path - Text.SSHKeyHelper.PublicKey - Text.SSHKeyHelper.Title +- Text.Statistics.Commits - Text.Statistics.Tips +- Text.Statistics.TopAuthors +- Text.Statistics.TopAuthors.Count +- Text.Statistics.TopAuthors.Percentage +- Text.Statistics.TopAuthors.Tip - Text.TagCM.Checkout - Text.TagCM.Merge - Text.Terminate +- Text.TrustRepository +- Text.TrustRepository.CommandTip +- Text.TrustRepository.Description +- Text.TrustRepository.Path +- Text.TrustRepository.ScanSkipped - Text.UpdateSubmodules.Recursive - Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder - Text.WorkingCopy.CollapseSidebar @@ -641,7 +783,7 @@ This document shows the translation status of each locale file in the repository
-### ![pt__BR](https://img.shields.io/badge/pt__BR-60.19%25-red) +### ![pt__BR](https://img.shields.io/badge/pt__BR-58.99%25-red)
Missing keys in pt_BR.axaml @@ -656,6 +798,7 @@ This document shows the translation status of each locale file in the repository - Text.Bisect.WaitingForFirstBad - Text.Blame.BlameOnPreviousRevision - Text.Blame.Tips +- Text.BranchCM.CheckoutAsWorktree - Text.BranchCM.CompareWithSpecial - Text.BranchCM.InteractiveRebase.Manually - Text.BranchTree.AheadBehind @@ -674,6 +817,14 @@ This document shows the translation status of each locale file in the repository - Text.Checkout.WarnUpdatingSubmodules - Text.Checkout.WithFastForward - Text.Checkout.WithFastForward.Upstream +- Text.CheckoutAsWorktree +- Text.CheckoutAsWorktree.LocalBranch +- Text.CheckoutAsWorktree.NewBranchName +- Text.CheckoutAsWorktree.NewBranchName.Placeholder +- Text.CheckoutAsWorktree.RemoteBranch +- Text.CheckoutAsWorktree.Tracking +- Text.CheckoutAsWorktree.WorktreePath +- Text.CheckoutAsWorktree.WorktreePath.Placeholder - Text.CheckoutBranchFromStash - Text.CheckoutBranchFromStash.Branch - Text.CheckoutBranchFromStash.Stash @@ -713,7 +864,6 @@ This document shows the translation status of each locale file in the repository - Text.CommitDetail.Info.CopyNameAndEmail - Text.CommitDetail.Info.Key - Text.CommitDetail.Info.Signer -- Text.CommitMessageTextBox.Column - Text.CommitMessageTextBox.Placeholder - Text.CommitMessageTextBox.SubjectCount - Text.Compare.Changes @@ -1007,7 +1157,12 @@ This document shows the translation status of each locale file in the repository - Text.StashCM.Branch - Text.StashCM.CopyMessage - Text.StashCM.SaveAsPatch +- Text.Statistics.Commits - Text.Statistics.Tips +- Text.Statistics.TopAuthors +- Text.Statistics.TopAuthors.Count +- Text.Statistics.TopAuthors.Percentage +- Text.Statistics.TopAuthors.Tip - Text.Submodule.Branch - Text.Submodule.CopyBranch - Text.Submodule.Deinit @@ -1038,6 +1193,11 @@ This document shows the translation status of each locale file in the repository - Text.TagCM.DeleteMultiple - Text.TagCM.Merge - Text.Terminate +- Text.TrustRepository +- Text.TrustRepository.CommandTip +- Text.TrustRepository.Description +- Text.TrustRepository.Path +- Text.TrustRepository.ScanSkipped - Text.UpdateSubmodules.Recursive - Text.UpdateSubmodules.UpdateToRemoteTrackingBranch - Text.ViewLogs @@ -1071,36 +1231,9 @@ This document shows the translation status of each locale file in the repository
-### ![ru__RU](https://img.shields.io/badge/ru__RU-98.02%25-yellow) +### ![ru__RU](https://img.shields.io/badge/ru__RU-%E2%88%9A-brightgreen) -
-Missing keys in ru_RU.axaml - -- Text.Blame.Tips -- Text.BranchTree.PushURL -- Text.CommitDetail.Files.Tips -- Text.Dashboard -- Text.Histories.AdvancedOptions -- Text.Hotkeys.Repo.ToggleCommitDetailPanel -- Text.Hotkeys.Repo.ToggleSearchCommits -- Text.Hotkeys.Repo.ViewDashboard -- Text.Preferences.AI.ExtraHeaders -- Text.Remote.ResetPushURL -- Text.RemoteCM.SetPushURL -- Text.Repository.Search.Method -- Text.Repository.Search.ToolTip -- Text.SetPushUrl -- Text.SetPushUrl.PushURL -- Text.SetPushUrl.Remote -- Text.SetPushUrl.URL -- Text.Statistics.Tips -- Text.WorkingCopy.CollapseSidebar -- Text.WorkingCopy.DiscardAll -- Text.WorkingCopy.ExpandSidebar - -
- -### ![ta__IN](https://img.shields.io/badge/ta__IN-61.79%25-red) +### ![ta__IN](https://img.shields.io/badge/ta__IN-60.58%25-red)
Missing keys in ta_IN.axaml @@ -1132,6 +1265,7 @@ This document shows the translation status of each locale file in the repository - Text.Blame.BlameOnPreviousRevision - Text.Blame.IgnoreWhitespace - Text.Blame.Tips +- Text.BranchCM.CheckoutAsWorktree - Text.BranchCM.CompareTwo - Text.BranchCM.CompareWith - Text.BranchCM.CompareWithHead @@ -1162,6 +1296,14 @@ This document shows the translation status of each locale file in the repository - Text.Checkout.WarnUpdatingSubmodules - Text.Checkout.WithFastForward - Text.Checkout.WithFastForward.Upstream +- Text.CheckoutAsWorktree +- Text.CheckoutAsWorktree.LocalBranch +- Text.CheckoutAsWorktree.NewBranchName +- Text.CheckoutAsWorktree.NewBranchName.Placeholder +- Text.CheckoutAsWorktree.RemoteBranch +- Text.CheckoutAsWorktree.Tracking +- Text.CheckoutAsWorktree.WorktreePath +- Text.CheckoutAsWorktree.WorktreePath.Placeholder - Text.CheckoutBranchFromStash - Text.CheckoutBranchFromStash.Branch - Text.CheckoutBranchFromStash.Stash @@ -1198,7 +1340,6 @@ This document shows the translation status of each locale file in the repository - Text.CommitDetail.Info.CopyNameAndEmail - Text.CommitDetail.Info.Key - Text.CommitDetail.Info.Signer -- Text.CommitMessageTextBox.Column - Text.CommitMessageTextBox.Placeholder - Text.CommitMessageTextBox.SubjectCount - Text.Compare.Changes @@ -1451,7 +1592,12 @@ This document shows the translation status of each locale file in the repository - Text.StashCM.ApplyFileChanges - Text.StashCM.Branch - Text.StashCM.CopyMessage +- Text.Statistics.Commits - Text.Statistics.Tips +- Text.Statistics.TopAuthors +- Text.Statistics.TopAuthors.Count +- Text.Statistics.TopAuthors.Percentage +- Text.Statistics.TopAuthors.Tip - Text.Submodule.Branch - Text.Submodule.CopyBranch - Text.Submodule.Deinit @@ -1482,6 +1628,11 @@ This document shows the translation status of each locale file in the repository - Text.TagCM.DeleteMultiple - Text.TagCM.Merge - Text.Terminate +- Text.TrustRepository +- Text.TrustRepository.CommandTip +- Text.TrustRepository.Description +- Text.TrustRepository.Path +- Text.TrustRepository.ScanSkipped - Text.UpdateSubmodules.Target - Text.UpdateSubmodules.Recursive - Text.UpdateSubmodules.UpdateToRemoteTrackingBranch @@ -1513,7 +1664,7 @@ This document shows the translation status of each locale file in the repository
-### ![uk__UA](https://img.shields.io/badge/uk__UA-62.55%25-red) +### ![uk__UA](https://img.shields.io/badge/uk__UA-61.32%25-red)
Missing keys in uk_UA.axaml @@ -1545,6 +1696,7 @@ This document shows the translation status of each locale file in the repository - Text.Blame.BlameOnPreviousRevision - Text.Blame.IgnoreWhitespace - Text.Blame.Tips +- Text.BranchCM.CheckoutAsWorktree - Text.BranchCM.CompareTwo - Text.BranchCM.CompareWith - Text.BranchCM.CompareWithHead @@ -1575,6 +1727,14 @@ This document shows the translation status of each locale file in the repository - Text.Checkout.WarnUpdatingSubmodules - Text.Checkout.WithFastForward - Text.Checkout.WithFastForward.Upstream +- Text.CheckoutAsWorktree +- Text.CheckoutAsWorktree.LocalBranch +- Text.CheckoutAsWorktree.NewBranchName +- Text.CheckoutAsWorktree.NewBranchName.Placeholder +- Text.CheckoutAsWorktree.RemoteBranch +- Text.CheckoutAsWorktree.Tracking +- Text.CheckoutAsWorktree.WorktreePath +- Text.CheckoutAsWorktree.WorktreePath.Placeholder - Text.CheckoutBranchFromStash - Text.CheckoutBranchFromStash.Branch - Text.CheckoutBranchFromStash.Stash @@ -1611,7 +1771,6 @@ This document shows the translation status of each locale file in the repository - Text.CommitDetail.Info.CopyNameAndEmail - Text.CommitDetail.Info.Key - Text.CommitDetail.Info.Signer -- Text.CommitMessageTextBox.Column - Text.CommitMessageTextBox.Placeholder - Text.CommitMessageTextBox.SubjectCount - Text.Compare.Changes @@ -1860,7 +2019,12 @@ This document shows the translation status of each locale file in the repository - Text.StashCM.ApplyFileChanges - Text.StashCM.Branch - Text.StashCM.CopyMessage +- Text.Statistics.Commits - Text.Statistics.Tips +- Text.Statistics.TopAuthors +- Text.Statistics.TopAuthors.Count +- Text.Statistics.TopAuthors.Percentage +- Text.Statistics.TopAuthors.Tip - Text.Submodule.Branch - Text.Submodule.CopyBranch - Text.Submodule.Deinit @@ -1891,6 +2055,11 @@ This document shows the translation status of each locale file in the repository - Text.TagCM.DeleteMultiple - Text.TagCM.Merge - Text.Terminate +- Text.TrustRepository +- Text.TrustRepository.CommandTip +- Text.TrustRepository.Description +- Text.TrustRepository.Path +- Text.TrustRepository.ScanSkipped - Text.UpdateSubmodules.Recursive - Text.UpdateSubmodules.UpdateToRemoteTrackingBranch - Text.ViewLogs @@ -1920,13 +2089,4 @@ This document shows the translation status of each locale file in the repository ### ![zh__CN](https://img.shields.io/badge/zh__CN-%E2%88%9A-brightgreen) -### ![zh__TW](https://img.shields.io/badge/zh__TW-99.72%25-yellow) - -
-Missing keys in zh_TW.axaml - -- Text.CommitDetail.Files.Tips -- Text.WorkingCopy.CollapseSidebar -- Text.WorkingCopy.ExpandSidebar - -
\ No newline at end of file +### ![zh__TW](https://img.shields.io/badge/zh__TW-%E2%88%9A-brightgreen) \ No newline at end of file diff --git a/VERSION b/VERSION index 88005f0e1c..bb71f1638b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2026.21 \ No newline at end of file +2026.22 \ No newline at end of file diff --git a/build/scripts/package.linux.sh b/build/scripts/package.linux.sh index 262f141ae8..e4645b7213 100755 --- a/build/scripts/package.linux.sh +++ b/build/scripts/package.linux.sh @@ -51,7 +51,9 @@ ln -rsf SourceGit.AppDir/opt/sourcegit/sourcegit SourceGit.AppDir/AppRun ln -rsf SourceGit.AppDir/usr/share/applications/com.sourcegit_scm.SourceGit.desktop SourceGit.AppDir cp resources/appimage/sourcegit.appdata.xml SourceGit.AppDir/usr/share/metainfo/com.sourcegit_scm.SourceGit.appdata.xml -ARCH="$appimage_arch" ./appimagetool -v SourceGit.AppDir "sourcegit-$VERSION.linux.$arch.AppImage" +ARCH="$appimage_arch" ./appimagetool -v \ + -u "gh-releases-zsync|sourcegit-scm|sourcegit|latest|sourcegit-*.linux.$arch.AppImage.zsync" \ + SourceGit.AppDir "sourcegit-$VERSION.linux.$arch.AppImage" mkdir -p resources/deb/opt/sourcegit/ mkdir -p resources/deb/usr/bin diff --git a/build/scripts/package.osx-app.sh b/build/scripts/package.osx-app.sh index 62e9184f66..78c31114f4 100755 --- a/build/scripts/package.osx-app.sh +++ b/build/scripts/package.osx-app.sh @@ -21,5 +21,7 @@ case "$RUNTIME" in esac clang -arch "$ARCH" ../tools/setsid-macos/setsid.c -o SourceGit.app/Contents/MacOS/setsid -mmacosx-version-min=13.0 +codesign --force --deep --sign - SourceGit.app +codesign --verify --deep --strict --verbose=2 SourceGit.app zip "sourcegit_$VERSION.$RUNTIME.zip" -r SourceGit.app diff --git a/src/App.axaml.cs b/src/App.axaml.cs index eef4684cee..66882b4869 100644 --- a/src/App.axaml.cs +++ b/src/App.axaml.cs @@ -350,7 +350,7 @@ private bool TryLaunchAsFileHistoryViewer(IClassicDesktopStyleApplicationLifetim var test = new Commands.QueryRepositoryRootPath(dir).GetResult(); if (!test.IsSuccess || string.IsNullOrEmpty(test.StdOut)) { - Console.Out.WriteLine($"'{args[1]}' is not in a valid git repository"); + Console.Out.WriteLine(string.IsNullOrWhiteSpace(test.StdErr) ? $"'{args[1]}' is not in a valid git repository" : test.StdErr.Trim()); desktop.Shutdown(-1); return true; } @@ -395,7 +395,7 @@ private bool TryLaunchAsBlameViewer(IClassicDesktopStyleApplicationLifetime desk var test = new Commands.QueryRepositoryRootPath(dir).GetResult(); if (!test.IsSuccess || string.IsNullOrEmpty(test.StdOut)) { - Console.Out.WriteLine($"'{args[1]}' is not in a valid git repository"); + Console.Out.WriteLine(string.IsNullOrWhiteSpace(test.StdErr) ? $"'{args[1]}' is not in a valid git repository" : test.StdErr.Trim()); desktop.Shutdown(-1); return true; } diff --git a/src/Commands/AddSafeDirectory.cs b/src/Commands/AddSafeDirectory.cs new file mode 100644 index 0000000000..52e190db69 --- /dev/null +++ b/src/Commands/AddSafeDirectory.cs @@ -0,0 +1,11 @@ +namespace SourceGit.Commands +{ + public class AddSafeDirectory : Command + { + public AddSafeDirectory(string ctx, string value) + { + Context = ctx; + Args = $"config --global --add safe.directory {value.Quoted()}"; + } + } +} diff --git a/src/Commands/Command.cs b/src/Commands/Command.cs index ba68bb90da..14430805c2 100644 --- a/src/Commands/Command.cs +++ b/src/Commands/Command.cs @@ -210,8 +210,8 @@ protected ProcessStartInfo CreateGitStartInfo(bool redirect) if (!start.Environment.ContainsKey("GIT_SSH_COMMAND") && !string.IsNullOrEmpty(SSHKey)) start.Environment.Add("GIT_SSH_COMMAND", $"ssh -i '{SSHKey}' -o AddKeysToAgent=yes"); - // Force using en_US.UTF-8 locale - if (OperatingSystem.IsLinux()) + // Force the C locale on Unix, so that git's output (including fatal errors) can always be parsed. + if (!OperatingSystem.IsWindows()) { start.Environment.Add("LANG", "C"); start.Environment.Add("LC_ALL", "C"); diff --git a/src/Commands/QueryLocalChanges.cs b/src/Commands/QueryLocalChanges.cs index 31d72a0959..7c2e4156ab 100644 --- a/src/Commands/QueryLocalChanges.cs +++ b/src/Commands/QueryLocalChanges.cs @@ -46,8 +46,8 @@ public QueryLocalChanges(string repo, bool includeUntracked = true, bool noOptio { lock (capturedLock) { - if (captured is { Process: { HasExited: false } }) - captured.Process.Kill(true); + if (captured is { Process: { HasExited: false } proc }) + Native.OS.TerminateProcess(proc); } }); } diff --git a/src/Commands/Worktree.cs b/src/Commands/Worktree.cs index 7b70e2ab49..137bb3f7f1 100644 --- a/src/Commands/Worktree.cs +++ b/src/Commands/Worktree.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Text; using System.Threading.Tasks; @@ -61,20 +62,33 @@ public Worktree(string repo) return worktrees; } - public async Task AddAsync(string fullpath, string name, bool createNew, string tracking) + public async Task AddAsync(string fullpath, string name) + { + if (string.IsNullOrEmpty(name)) + Args = $"worktree add {fullpath.Quoted()}"; + else + Args = $"worktree add -b {name} {fullpath.Quoted()}"; + + return await ExecAsync().ConfigureAwait(false); + } + + public async Task AddWithLocalBranchAsync(string fullpath, string localBranch) + { + Args = $"worktree add -B {localBranch} {fullpath.Quoted()} {localBranch}"; + return await ExecAsync().ConfigureAwait(false); + } + + public async Task AddWithRemoteBranchAsync(string fullpath, string name, string remoteBranch, bool tracking) { var builder = new StringBuilder(1024); builder.Append("worktree add "); - if (!string.IsNullOrEmpty(tracking)) - builder.Append("--track "); - if (!string.IsNullOrEmpty(name)) - builder.Append(createNew ? "-b " : "-B ").Append(name).Append(' '); - builder.Append(fullpath.Quoted()).Append(' '); - - if (!string.IsNullOrEmpty(tracking)) - builder.Append(tracking); - else if (!string.IsNullOrEmpty(name) && !createNew) - builder.Append(name); + + if (tracking) + builder.Append("--track -b ").Append(string.IsNullOrEmpty(name) ? Path.GetFileName(fullpath) : name).Append(' '); + else if (!string.IsNullOrEmpty(name)) + builder.Append("-b ").Append(name).Append(' '); + + builder.Append(fullpath.Quoted()).Append(' ').Append(remoteBranch); Args = builder.ToString(); return await ExecAsync().ConfigureAwait(false); diff --git a/src/Converters/IntConverters.cs b/src/Converters/IntConverters.cs index 566952536b..4d6c723a8d 100644 --- a/src/Converters/IntConverters.cs +++ b/src/Converters/IntConverters.cs @@ -14,12 +14,6 @@ public static class IntConverters public static readonly FuncValueConverter IsZero = new(v => v == 0); - public static readonly FuncValueConverter IsOne = - new(v => v == 1); - - public static readonly FuncValueConverter IsNotOne = - new(v => v != 1); - public static readonly FuncValueConverter ToTreeMargin = new(v => new Thickness(v * 16, 0, 0, 0)); diff --git a/src/Models/SafeDirectories.cs b/src/Models/SafeDirectories.cs new file mode 100644 index 0000000000..5fcf24a3af --- /dev/null +++ b/src/Models/SafeDirectories.cs @@ -0,0 +1,103 @@ +using System; +using System.Text; +using System.Text.RegularExpressions; + +namespace SourceGit.Models +{ + /// + /// Helpers for the `safe.directory` protection introduced by git 2.35.2 (CVE-2022-24765). + /// Git refuses to use a repository whose top-level directory is owned by another user (which is + /// always the case for network shares / UNC paths) unless the path is listed in the `safe.directory` config. + /// + public static partial class SafeDirectories + { + public static bool IsUntrustedRepository(string output) + { + if (string.IsNullOrWhiteSpace(output)) + return false; + + return output.Contains("detected dubious ownership", StringComparison.OrdinalIgnoreCase) || + output.Contains("unsafe repository", StringComparison.OrdinalIgnoreCase); + } + + /// + /// Tries to get the value that should be written into the `safe.directory` config. + /// Prefers the value suggested by git itself (which knows the correct form for the current platform), + /// and falls back to building a value from the given path. + /// + public static bool TryGetSafeDirectoryValue(string path, string output, out string value) + { + value = ParseSuggestedValue(output); + if (!string.IsNullOrEmpty(value)) + return true; + + var normalized = Normalize(path); + if (string.IsNullOrEmpty(normalized)) + return false; + + // Git for Windows uses the `%(prefix)/` prefix for UNC paths. + value = OperatingSystem.IsWindows() && normalized.StartsWith("//", StringComparison.Ordinal) ? $"%(prefix)/{normalized}" : normalized; + return true; + } + + private static string Normalize(string path) + { + return path?.Replace('\\', '/').TrimEnd('/') ?? string.Empty; + } + + private static string ParseSuggestedValue(string output) + { + if (string.IsNullOrEmpty(output)) + return string.Empty; + + var match = REG_SAFE_DIRECTORY_HINT().Match(output); + if (!match.Success) + return string.Empty; + + return Dequote(match.Groups["value"].Value.Trim()); + } + + /// + /// Git quotes the suggested value with `sq_quote_buf()`, which escapes `'` and `!` as `'\''` and + /// `'\!'`. Decodes it back to the plain path (see `quote.c` of git). + /// + private static string Dequote(string value) + { + if (value.Length > 1 && value[0] == '\'') + { + var builder = new StringBuilder(value.Length); + for (var i = 1; i < value.Length; i++) + { + var c = value[i]; + if (c != '\'') + { + builder.Append(c); + continue; + } + + if (i == value.Length - 1) + return builder.ToString(); + + if (i + 3 < value.Length && value[i + 1] == '\\' && (value[i + 2] == '\'' || value[i + 2] == '!') && value[i + 3] == '\'') + { + builder.Append(value[i + 2]); + i += 3; + continue; + } + + return string.Empty; + } + + return string.Empty; + } + + if (value.Length > 1 && value[0] == '"' && value[^1] == '"') + return value[1..^1]; + + return value; + } + + [GeneratedRegex(@"--add\s+safe\.directory\s+(?[^\r\n]+)", RegexOptions.Multiline)] + private static partial Regex REG_SAFE_DIRECTORY_HINT(); + } +} diff --git a/src/Models/Watcher.cs b/src/Models/Watcher.cs index ce18fe4be2..66e246bc07 100644 --- a/src/Models/Watcher.cs +++ b/src/Models/Watcher.cs @@ -43,6 +43,7 @@ public Watcher(IRepository repo, string fullpath, string gitDir) combined.Renamed += OnRepositoryChanged; combined.Changed += OnRepositoryChanged; combined.Deleted += OnRepositoryChanged; + combined.Error += OnWatcherError; combined.EnableRaisingEvents = false; _watchers.Add(combined); @@ -58,6 +59,7 @@ public Watcher(IRepository repo, string fullpath, string gitDir) wc.Renamed += OnWorkingCopyChanged; wc.Changed += OnWorkingCopyChanged; wc.Deleted += OnWorkingCopyChanged; + wc.Error += OnWatcherError; wc.EnableRaisingEvents = false; var git = new FileSystemWatcher(); @@ -69,6 +71,7 @@ public Watcher(IRepository repo, string fullpath, string gitDir) git.Renamed += OnGitDirChanged; git.Changed += OnGitDirChanged; git.Deleted += OnGitDirChanged; + git.Error += OnWatcherError; git.EnableRaisingEvents = false; _watchers.Add(wc); @@ -240,6 +243,21 @@ private void OnRepositoryChanged(object o, FileSystemEventArgs e) HandleWorkingCopyFileChanged(name, e.FullPath); } + /// + /// The internal buffer overflowed (a large fetch or checkout writes thousands of files), so + /// some events were dropped and we cannot know which. Reload everything once things settle. + /// + private void OnWatcherError(object o, ErrorEventArgs e) + { + var desired = DateTime.Now.AddSeconds(1).ToFileTime(); + Interlocked.Exchange(ref _updateBranch, desired); + Interlocked.Exchange(ref _updateTags, desired); + Interlocked.Exchange(ref _updateStashes, desired); + Interlocked.Exchange(ref _updateWC, desired); + if (_repo.MayHaveSubmodules()) + Interlocked.Exchange(ref _updateSubmodules, desired); + } + private void OnGitDirChanged(object o, FileSystemEventArgs e) { if (string.IsNullOrEmpty(e.Name)) @@ -290,7 +308,7 @@ private void HandleGitDirFileChanged(string name) { Interlocked.Exchange(ref _updateTags, DateTime.Now.AddSeconds(.5).ToFileTime()); } - else if (name.StartsWith("refs/stash", StringComparison.Ordinal)) + else if (name.StartsWith("refs/stash", StringComparison.Ordinal) || name.Equals("logs/refs/stash", StringComparison.Ordinal)) { Interlocked.Exchange(ref _updateStashes, DateTime.Now.AddSeconds(.5).ToFileTime()); } @@ -302,6 +320,12 @@ private void HandleGitDirFileChanged(string name) { Interlocked.Exchange(ref _updateBranch, DateTime.Now.AddSeconds(.5).ToFileTime()); } + else if (name.Equals("packed-refs", StringComparison.Ordinal)) + { + var desired = DateTime.Now.AddSeconds(.5).ToFileTime(); + Interlocked.Exchange(ref _updateBranch, desired); + Interlocked.Exchange(ref _updateTags, desired); + } else if (name.StartsWith("reftable/", StringComparison.Ordinal)) { var desired = DateTime.Now.AddSeconds(.5).ToFileTime(); diff --git a/src/Resources/Locales/de_DE.axaml b/src/Resources/Locales/de_DE.axaml index fee376aad9..9e2d348bc8 100644 --- a/src/Resources/Locales/de_DE.axaml +++ b/src/Resources/Locales/de_DE.axaml @@ -16,11 +16,6 @@ Pfad für diesen Worktree. Relative Pfade werden unterstützt. Branch-Name: Optional. Standard ist der Name des Zielordners. - Branch verfolgen: - Remote-Branch verfolgen - Was auschecken: - Neuen Branch erstellen - Existierender Branch AI-Assistent Modell NEU GENERIEREN @@ -201,7 +196,6 @@ SHA Unterzeichner: Im Browser öffnen - SPALTE Commit-Nachricht eingeben. Leerzeile zum Trennen von Betreff und Beschreibung verwenden! BETREFF Vergleichen diff --git a/src/Resources/Locales/el_GR.axaml b/src/Resources/Locales/el_GR.axaml index 6c6996121a..8e5e5f4dfe 100644 --- a/src/Resources/Locales/el_GR.axaml +++ b/src/Resources/Locales/el_GR.axaml @@ -16,11 +16,6 @@ Διαδρομή για αυτό το worktree. Υποστηρίζεται σχετική διαδρομή. Όνομα κλάδου: Προαιρετικό. Προεπιλογή είναι το όνομα του φακέλου προορισμού. - Παρακολούθηση κλάδου: - Παρακολούθηση απομακρυσμένου κλάδου - Τι να γίνει checkout: - Δημιουργία νέου κλάδου - Υπάρχων κλάδος Βοηθός AI ΜΟΝΤΕΛΟ ΕΠΑΝΑΔΗΜΙΟΥΡΓΙΑ @@ -201,7 +196,6 @@ SHA Υπογράφων: Άνοιγμα στον περιηγητή - ΣΤΗΛΗ Εισαγάγετε το μήνυμα commit. Χρησιμοποιήστε μια κενή γραμμή για να διαχωρίσετε το θέμα από την περιγραφή! ΘΕΜΑ Σύγκριση diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml index eb8ff1ca7e..76ac9e4dcb 100644 --- a/src/Resources/Locales/en_US.axaml +++ b/src/Resources/Locales/en_US.axaml @@ -12,11 +12,6 @@ Path for this worktree. Relative path is supported. Branch Name: Optional. Default is the destination folder name. - Track Branch: - Tracking remote branch - What to Checkout: - Create New Branch - Existing Branch AI Assistant MODEL RE-GENERATE @@ -63,6 +58,7 @@ Holding Ctrl (on Windows/Linux) or ⌘ (on macOS) when clicking commit SHA will rebuild blame data based on that revision. BLAME ON THIS FILE IS NOT SUPPORTED!!! Checkout ${0}$... + Checkout ${0}$ as worktree... Compare selected 2 branches Compare with... Compare with HEAD @@ -119,6 +115,14 @@ The following submodules need to be updated:{0}Do you want to update them? Checkout & Fast-Forward Fast-Forward to: + Checkout Branch as Worktree + Local Branch: + New Branch Name: + Optional. Default is the destination folder name. + Remote Branch: + Tracking this remote branch. + Worktree Path: + Path for this worktree. Relative path is supported. Checkout Branch From Stash New Branch: Stash: @@ -200,7 +204,6 @@ SHA Signer: Open in Browser - COL Enter commit message. Please use an empty-line to separate subject and description! SUBJECT Compare @@ -947,10 +950,15 @@ CHANGES STASHES Statistics + COMMITS OVERVIEW MONTH WEEK SourceGit will only get a maximum of 200,000 commits according to the target branch for analysis. + TOP AUTHORS + COMMITS + PERCENTAGE + Authors with less than 1% commits will be grouped under Others. AUTHORS: COMMITS: SUBMODULES @@ -994,6 +1002,11 @@ Merge ${0}$ into ${1}$... Push ${0}$... TERMINATE + Untrusted Repository + Do you want to run `git config --global --add safe.directory {0}` command to trust this path? + Git refused to access this repository: + Path: + {0} repositories were skipped because git does not trust them. Please open them manually and confirm whether to trust them. Update Submodules All submodules Initialize as needed diff --git a/src/Resources/Locales/es_ES.axaml b/src/Resources/Locales/es_ES.axaml index 856153ea2f..e5a8c77e75 100644 --- a/src/Resources/Locales/es_ES.axaml +++ b/src/Resources/Locales/es_ES.axaml @@ -11,16 +11,11 @@ Agregar Archivo(s) Para Ignorar Patrón: Almacenar Archivo: - Agregar Worktree + Agregar Árbol de trabajo Ubicación: - Ruta para este worktree. Se admite ruta relativa. + Ruta para este árbol de trabajo. Se admite ruta relativa. Nombre de la Rama: Opcional. Por defecto es el nombre de la carpeta de destino. - Rama de Seguimiento: - Seguimiento de rama remota - Qué Checkout: - Crear Nueva Rama - Rama Existente Asistente OpenAI Modelo RE-GENERAR @@ -66,7 +61,8 @@ Ignorar cambios de espacios en blanco Mantener presionado Ctrl (en Windows/Linux) o ⌘ (en macOS) cuando se hace click en el SHA del commit reconstruirá lo datos del blame basados en esa revisión. ¡BLAME EN ESTE ARCHIVO NO SOPORTADO! - Checkout ${0}$... + Checkout a ${0}$... + Checkout a ${0}$ como árbol de trabajo... Comparar las 2 ramas seleccionadas Comparar con... Comparar con HEAD @@ -90,7 +86,7 @@ Rebase ${0}$ en ${1}$... Renombrar ${0}$... Resetear ${0}$ a ${1}$... - Cambiar a ${0}$ (worktree) + Cambiar a ${0}$ (árbol de trabajo) Establecer Rama de Seguimiento... {0} commit(s) adelante {0} commit(s) adelante, {1} commit(s) detrás @@ -101,7 +97,7 @@ ESTADO SEGUIMIENTO URL - WORKTREE + ÁRBOL DE TRABAJO CANCELAR Resetear a Revisión Padre Resetear a Esta Revisión @@ -123,6 +119,14 @@ Los siguientes submódulos necesitan ser actualizados:{0} ¿Quieres actualizarlos? Checkout y Fast-Forward Fast-Forward a: + Checkout a Rama como Árbol de trabajo + Rama Local: + Nombre de la Nueva Rama: + Opcional. Por defecto es el nombre de la carpeta de destino. + Rama Remota: + Rastrear esta rama remota. + Ruta del Árbol de trabajo: + Ruta para este árbol de trabajo. Se puede usar una ruta relativa. Checkout a la Rama desde el Stash Nueva Rama: Stash: @@ -157,7 +161,7 @@ Cherry-Pick Este Commit Cherry-Pick ... Comparar con HEAD - Comparar con Worktree + Comparar con Árbol de trabajo Autor Fecha/Hora del Autor Mensaje @@ -187,6 +191,7 @@ Archivo LFS Buscar Archivos... Submódulo + SELECCIONAR ARCHIVO PARA VER SU CONTENIDO INFORMACIÓN AUTOR COMMITTER @@ -203,7 +208,6 @@ SHA Firmante: Abrir en Navegador - COL Ingresa el mensaje de commit. ¡Por favor usa una línea en blanco para separar el título y la descripción! ASUNTO Comparar @@ -738,8 +742,8 @@ Shell/Terminal Podar Remoto Destino: - Podar Worktrees - Podar información de worktree en `$GIT_COMMON_DIR/worktrees` + Podar Árboles de trabajo + Podar información del árbol de trabajo en `$GIT_COMMON_DIR/worktrees` Pull Rama Remota: En: @@ -791,7 +795,7 @@ Abrir En Navegador Podar (Prune) Establecer Push URL... - Confirmar para Eliminar Worktree + Confirmar para Eliminar Árbol de trabajo Utilizar Opción `--force` Destino: Renombrar Rama @@ -865,8 +869,8 @@ Abrir en Terminal Ver Logs Visitar '{0}' en el Navegador - WORKTREES - AÑADIR WORKTREE + ÁRBOLES DE TRABAJO + AÑADIR ÁRBOL DE TRABAJO PRUNE URL del Repositorio Git Resetear Rama Actual a Revisión @@ -950,10 +954,15 @@ CAMBIOS STASHES Estadísticas + COMMITS GENERAL MES SEMANA SourceGit solamente obtendrá un máximo de 200,000 commits de acuerdo a la rama destino para su análisis. + AUTORES DESTACADOS + COMMITS + PORCENTAJE + Autores con menos del 1% de commits serán agrupados bajo Otros. AUTORES: COMMITS: SUBMÓDULOS @@ -997,6 +1006,11 @@ Hacer merge de ${0}$ a ${1}$... Hacer push a ${0}$... FINALIZAR + Repositorio No confiable + ¿Quieres correr el comando `git config --global --add safe.directory {0}` para confiar en está ruta? + Git rechazó el acceso a este repositorio: + Ruta: + {0} repositorios fueron omitidos porque git no confía en ellos. Ábrelos manualmente por favor y confirma si confías en ellos. Actualizar Submódulos Todos los submódulos Inicializar según sea necesario @@ -1033,6 +1047,7 @@ Puedes hacer stage a este archivo ahora. Limpiar Historial ¿Estás seguro de querer limpiar todo el historial de los mensajes de commit? Esta acción no se puede deshacer. + Ocultar Barra lateral COMMIT COMMIT y PUSH Plantilla/Historias @@ -1049,6 +1064,7 @@ USAR MÍOS USAR SUYOS DESCARTAR TODO + Mostrar Barra lateral Cambios de Filtro... INCLUIR ARCHIVOS SIN RASTREAR NO HAY MENSAJES DE ENTRADA RECIENTES @@ -1066,7 +1082,7 @@ Plantilla: ${0}$ ESPACIO DE TRABAJO: Configura Espacios de Trabajo... - WORKTREE + ÁRBOL DE TRABAJO RAMA Copiar Ruta HEAD diff --git a/src/Resources/Locales/fr_FR.axaml b/src/Resources/Locales/fr_FR.axaml index 823b851bae..e6b46a1e27 100644 --- a/src/Resources/Locales/fr_FR.axaml +++ b/src/Resources/Locales/fr_FR.axaml @@ -16,11 +16,6 @@ Chemin vers ce worktree. Relatif supporté. Nom de branche: Optionnel. Nom du dossier de destination par défaut. - Suivre la branche : - Suivi de la branche distante - Que récupérer : - Créer une nouvelle branche - Branche existante Assistant IA Modèle RE-GÉNÉRER @@ -191,7 +186,6 @@ SHA Signataire : Ouvrir dans le navigateur - COL Saisissez le message de commit. Utilisez une ligne vide pour séparer le sujet et la description ! SUJET Comparer diff --git a/src/Resources/Locales/he_IL.axaml b/src/Resources/Locales/he_IL.axaml index 2ba8cc88c1..98426b3023 100644 --- a/src/Resources/Locales/he_IL.axaml +++ b/src/Resources/Locales/he_IL.axaml @@ -16,11 +16,6 @@ נתיב ל־worktree זה. נתיב יחסי נתמך. שם Branch: לא חובה. ברירת המחדל היא שם תיקיית היעד. - Branch למעקב: - מעקב אחר branch מרוחק - מה לבצע לו checkout: - צור Branch חדש - Branch קיים עוזר AI מודל צור מחדש @@ -191,7 +186,6 @@ SHA חותם: פתח בדפדפן - עמודה הזן הודעת commit. יש להפריד בין subject לתיאור באמצעות שורה ריקה! SUBJECT השווה diff --git a/src/Resources/Locales/id_ID.axaml b/src/Resources/Locales/id_ID.axaml index 0ff7f394c4..a50be71a66 100644 --- a/src/Resources/Locales/id_ID.axaml +++ b/src/Resources/Locales/id_ID.axaml @@ -16,11 +16,6 @@ Jalur untuk worktree ini. Jalur relatif didukung. Nama Branch: Opsional. Standar adalah nama folder tujuan. - Track Branch: - Track remote branch - Yang Akan Di-Checkout: - Buat Branch Baru - Branch Yang Ada Asisten AI Model BUAT ULANG @@ -201,7 +196,6 @@ SHA Penanda Tangan: Buka di Browser - KOL Masukkan pesan commit. Gunakan baris kosong untuk memisahkan subjek dan deskripsi! SUBJEK Perbandingan diff --git a/src/Resources/Locales/it_IT.axaml b/src/Resources/Locales/it_IT.axaml index e595a13df9..3ce0bae2c9 100644 --- a/src/Resources/Locales/it_IT.axaml +++ b/src/Resources/Locales/it_IT.axaml @@ -16,11 +16,6 @@ Percorso per questo worktree. Supportato il percorso relativo. Nome Branch: Facoltativo. Predefinito è il nome della cartella di destinazione. - Traccia Branch: - Traccia branch remoto - Di cosa fare il checkout: - Crea nuovo branch - Branch esistente Assistente AI Modello RIGENERA diff --git a/src/Resources/Locales/ja_JP.axaml b/src/Resources/Locales/ja_JP.axaml index ec73701055..ac9637eea9 100644 --- a/src/Resources/Locales/ja_JP.axaml +++ b/src/Resources/Locales/ja_JP.axaml @@ -16,11 +16,6 @@ この作業ツリーへのパス (相対パスも使用できます) ブランチの名前: 省略可能 - 既定では宛先のフォルダーと同じ名前が使用されます - 追跡するブランチ: - 追跡するリモートブランチを設定 - チェックアウトする内容: - 新しいブランチを作成 - 既存のブランチ AI アシスタント モデル 再生成 @@ -203,7 +198,6 @@ SHA 署名者: ブラウザーで開く - 列 コミットメッセージを入力してください。タイトルと説明は、空行で分けて記述してください! タイトル 比較 diff --git a/src/Resources/Locales/ko_KR.axaml b/src/Resources/Locales/ko_KR.axaml index 939f8a4c1c..e0695553fb 100644 --- a/src/Resources/Locales/ko_KR.axaml +++ b/src/Resources/Locales/ko_KR.axaml @@ -16,11 +16,6 @@ 이 워크트리의 경로입니다. 상대 경로를 지원합니다. 브랜치 이름: 선택 사항. 기본값은 대상 폴더 이름입니다. - 추적할 브랜치: - 원격 브랜치 추적 - 체크아웃할 대상: - 새 브랜치 생성 - 기존 브랜치 AI 어시스턴트 모델 재생성 @@ -196,7 +191,6 @@ SHA 서명자: 브라우저에서 열기 - 열 커밋 메시지를 입력하세요. 제목과 설명은 빈 줄로 구분하세요! 제목 비교 diff --git a/src/Resources/Locales/pt_BR.axaml b/src/Resources/Locales/pt_BR.axaml index 0e1a405bcd..5084f0180b 100644 --- a/src/Resources/Locales/pt_BR.axaml +++ b/src/Resources/Locales/pt_BR.axaml @@ -16,11 +16,6 @@ Caminho para este worktree. Caminho relativo é suportado. Nome do Branch: Opcional. O padrão é o nome da pasta de destino. - Rastrear Branch: - Rastreando branch remoto - O que Checar: - Criar Novo Branch - Branch Existente Assietente IA Modelo Gerar novamente diff --git a/src/Resources/Locales/ru_RU.axaml b/src/Resources/Locales/ru_RU.axaml index 7566fe27f4..f9260cc4f9 100644 --- a/src/Resources/Locales/ru_RU.axaml +++ b/src/Resources/Locales/ru_RU.axaml @@ -16,11 +16,6 @@ Путь к рабочему каталогу (поддерживается относительный путь) Имя ветки: Имя целевого каталога по умолчанию (необязательно) - Отслеживание ветки: - Отслеживание внешней ветки - Переключиться на: - Создать новую ветку - Ветку из списка Помощник OpenAI Модель ПЕРЕСОЗДАТЬ @@ -64,8 +59,10 @@ Расследование Расследование на предыдущей редакции Игнорировать изменения пробелов + Если при нажатии на ревизию SHA удерживать нажатой Ctrl (на Windows/Linux) или ⌘ (на macOS), данные расследования будут перестроены на основе этой ревизии. РАССЛЕДОВАНИЕ В ЭТОМ ФАЙЛЕ НЕ ПОДДЕРЖИВАЕТСЯ!!! Переключиться на ${0}$... + Сделать ${0}$ рабочим деревом... Сравнить две выбранные ветки Сравнить с ... Сравнить с ГОЛОВОЙ @@ -95,6 +92,7 @@ {0} ревизий вперёд, {1} ревизий назад {0} ревизий назад Неверно + АДРЕС ВЫГРУЗКИ УДАЛЁННЫЙ СОСТОЯНИЕ ОТСЛЕЖИВАНИЕ @@ -121,6 +119,14 @@ Подмодулям требуется обновление:{0}Обновить их? Переключиться и перемотать Перемотать к: + Сделать ветку рабочим деревом + Локальная ветка: + Имя новой ветки: + По желанию. Используемое имя целевого каталога по умолчанию. + Удалённая ветка: + Отслеживать эту удалённую ветку. + Путь рабочего дерева: + Путь для данного рабочего дерева. Поддерживается относительный путь. Переключить ветку из отложенного Новая ветка: Отложенный: @@ -185,6 +191,7 @@ Файл LFS Поиск файлов... Подмодуль + ВЫБЕРИТЕ ФАЙЛ ДЛЯ ПРОСМОТРА СОДЕРЖИМОГО ИНФОРМАЦИЯ АВТОР РЕВИЗОР (ИСПОЛНИТЕЛЬ) @@ -201,7 +208,6 @@ SHA Подписант: Открыть в браузере - СТБ Введите сообщение ревизии. Пожалуйста, используйте пустые строки для разделения субъекта и описания! СУБЪЕКТ Сравнить @@ -337,6 +343,7 @@ Простой Удерживайте Ctrl, чтобы сразу начать Вырезать + Обзор Отклонить Ничего не делать Отложить и применить повторно @@ -511,6 +518,7 @@ Отслеживать файлы с именем «{0}» Отслеживать все файлы (*{0}) Выбрать ревизию + Расширенные опции АВТОР ВРЕМЯ АВТОРА ВРЕМЯ РЕВИЗИИ @@ -554,7 +562,10 @@ Загрузить (pull), запускается сразу Выложить (push), запускается сразу Принудительно перечитать репозиторий + Развернуть/Свернуть панель подробностей ревизии + Переключить панель поиска ревизий Переключить на «Изменения» + Переключить на «Обзор» Переключить на «Отложенные» Отклонить Сформировать @@ -656,9 +667,10 @@ {0} лет назад Вчера Параметры - ОТКРЫТЬ ИИ + ИИ Дополнительная подсказка (Для перечисления ваших требований используйте `-`) Ключ API + Дополнительные заголовки (по одному «Имя: Значение» на строку) Модель Автоматическое получение доступных идентификаторов моделей Имя: @@ -771,6 +783,7 @@ Редактировать внешний репозиторий Имя: Имя внешнего репозитория + Установить адрес выгрузки равным адресу этого репозитория Адрес: Адрес внешнего репозитория git Копировать адрес @@ -781,6 +794,7 @@ Извлечь Открыть в браузере Удалить + Установить адрес выгрузки... Подтвердить удаление рабочего каталога Включить опцию (--force) Цель: @@ -834,6 +848,8 @@ Путь SHA Текущая ветка + ИСКАТЬ В + Поиск ревизий Только оформленные ревизии Показывать только первый родительский ПОКАЗЫВАТЬ ФЛАГИ @@ -884,6 +900,10 @@ Дата выпуска новой версии: Обновление ПО Сейчас нет обновлений. + Установить адрес выгрузки на удалённый + Адрес выгрузки: + Удалённый: + Адрес: Установить ветку подмодуля Подмодуль: Текущий: @@ -934,9 +954,15 @@ ИЗМЕНЕНИЯ ОТЛОЖЕННЫЕ Статистика + РЕВИЗИИ ОБЗОР МЕСЯЦ НЕДЕЛЯ + SourceGit проанализирует не более 200 000 ревизий в целевой ветке. + ТОП АВТОРОВ + РЕВИЗИИ + ПРОЦЕНТ + Авторы с долей менее 1% ревизий объединены в группу «Другие». АВТОРЫ: РЕВИЗИИ: ПОДМОДУЛИ @@ -980,6 +1006,11 @@ Влить ${0}$ в ${1}$... Выложить ${0}$... ПРЕКРАТИТЬ + Недоверенный репозиторий + Вы хотите выполнить команду (git config --global --add safe.directory {0}), чтобы разрешить доступ к этому пути? + Отказ гита в доступе к этому репозиторию: + Путь: + Пропущено репозиториев из-за недоверия к ним гитом: {0}. Пожалуйста, откройте их вручную и проверьте, можно ли им доверять. Обновление подмодулей Все подмодули Создавать по необходимости @@ -1016,6 +1047,7 @@ Теперь вы можете сформировать этот файл. Очистить историю Вы действительно хотите очистить всю историю сообщений ревизии? Данное действие нельзя отменить. + Скрыть боковую панель ЗАФИКСИРОВАТЬ ЗАФИКСИРОВАТЬ и ОТПРАВИТЬ Шаблон/Истории @@ -1031,6 +1063,8 @@ КОНФЛИКТЫ ФАЙЛОВ РАЗРЕШЕНЫ ИСПОЛЬЗОВАТЬ МОИ ИСПОЛЬЗОВАТЬ ИХ + ОТКЛОНИТЬ ВСЕ + Показать боковую панель Фильтр изменений... ВКЛЮЧИТЬ НЕОТСЛЕЖИВАЕМЫЕ ФАЙЛЫ НЕТ ПОСЛЕДНИХ ВХОДНЫХ СООБЩЕНИЙ diff --git a/src/Resources/Locales/ta_IN.axaml b/src/Resources/Locales/ta_IN.axaml index f2f12bcfee..3473ff1cab 100644 --- a/src/Resources/Locales/ta_IN.axaml +++ b/src/Resources/Locales/ta_IN.axaml @@ -11,11 +11,6 @@ இந்த பணிமரத்திற்கான பாதை. தொடர்புடைய பாதை ஆதரிக்கப்படுகிறது. கிளை பெயர்: விருப்பத்தேர்வு. இயல்புநிலை இலக்கு கோப்புறை பெயர். - கிளை கண்காணி: - தொலை கிளையைக் கண்காணித்தல் - என்ன சரிபார்க்க வேண்டும்: - புதிய கிளையை உருவாக்கு - ஏற்கனவே உள்ள கிளை செநு உதவியாளர் மாதிரி மறு-உருவாக்கு diff --git a/src/Resources/Locales/uk_UA.axaml b/src/Resources/Locales/uk_UA.axaml index a6e5b89ae5..5f44193e39 100644 --- a/src/Resources/Locales/uk_UA.axaml +++ b/src/Resources/Locales/uk_UA.axaml @@ -11,11 +11,6 @@ Шлях для цього робочого дерева. Відносний шлях підтримується. Назва гілки: Необов'язково. За замовчуванням — назва кінцевої папки. - Відстежувати гілку: - Відстежувати віддалену гілку - Що перемкнути: - Створити нову гілку - Наявна гілка AI Асистент Модель ПЕРЕГЕНЕРУВАТИ diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml index 761cc724a2..d24f14b1e8 100644 --- a/src/Resources/Locales/zh_CN.axaml +++ b/src/Resources/Locales/zh_CN.axaml @@ -16,11 +16,6 @@ 填写该工作树的路径。支持相对路径。 分支名 : 选填。默认使用目标文件夹名称。 - 跟踪分支 - 设置上游跟踪分支 - 检出分支方式 : - 创建新分支 - 已有分支 AI助手 模型 重新生成 @@ -67,6 +62,7 @@ 按住 Ctrl (Windows及Linux平台) 或 ⌘ (macOS平台) 键并点击提交哈希将基于所选的提交重新计算逐行追溯 选中文件不支持该操作!!! 检出(checkout) ${0}$... + 检出 ${0}$ 为新工作树... 比较选中的 2 个分支 与其他分支或标签比较... 与当前 HEAD 比较 @@ -123,6 +119,14 @@ 以下子模块需要更新:{0}是否立即更新? 检出分支并快进 上游分支 : + 检出分支为新的工作树 + 本地分支 : + 新分支名称 : + 选填。默认使用目标文件夹名称。 + 远程分支 : + 新分支跟踪此远程分支 + 工作树路径 : + 必填。可填写相对路径。 从所选贮藏检出分支 新分支 : 所选贮藏 : @@ -204,7 +208,6 @@ 提交指纹 签名者 : 浏览器中查看 - 列 请输入提交的信息。注意:主题与具体描述中间需要空白行分隔! 主题 比较 @@ -951,10 +954,15 @@ 查看变更 贮藏列表 提交统计 + 提交统计图 总览 本月 本周 SourceGit 仅会按所选分支最多取出 200000 条提交记录进行分析 + 主要贡献者 + 提交数量 + 百分比 + 提交占比小于1%的作者会被统计入Others分组 贡献者人数: 提交次数: 子模块 @@ -998,6 +1006,11 @@ 合并 ${0}$ 到 ${1}$... 推送 ${0}$... 终止运行 + 不受信任的仓库 + 是否执行 `git config --global --add safe.directory {0}` 命令以信任该仓库? + Git 拒绝访问该仓库: + 路径 : + 有 {0} 个仓库因 git 的信任检查被跳过,请手动打开它们并确认是否信任。 更新子模块 更新所有子模块 如未初始化子模块,先初始化 diff --git a/src/Resources/Locales/zh_TW.axaml b/src/Resources/Locales/zh_TW.axaml index 135596f6e9..97680c6103 100644 --- a/src/Resources/Locales/zh_TW.axaml +++ b/src/Resources/Locales/zh_TW.axaml @@ -16,11 +16,6 @@ 填寫該工作樹的路徑。支援相對路徑。 分支名稱: 選填。預設使用目標資料夾名稱。 - 追蹤分支 - 設定遠端追蹤分支 - 簽出分支方式: - 建立新分支 - 已有分支 AI 助理 模型 重新產生 @@ -67,6 +62,7 @@ 按住 Ctrl 鍵 (Windows/Linux) 或 ⌘ 鍵 (macOS) 並點擊提交編號,將依據該次提交重新執行逐行溯源 所選擇的檔案不支援該操作! 簽出 (checkout) ${0}$... + 簽出 (checkout) ${0}$ 為工作樹... 比較所選的 2 個分支 與其他分支或標籤比較... 與目前 HEAD 比較 @@ -123,6 +119,14 @@ 以下子模組需要更新: {0},您要立即更新嗎? 簽出分支並快轉 上游分支: + 簽出分支為工作樹 + 本機分支: + 新分支名稱: + 選填。預設使用目標資料夾名稱。 + 遠端分支: + 追蹤此遠端分支 + 工作樹路徑: + 填寫該工作樹的路徑。支援相對路徑。 從所選擱置簽出分支 新分支: 所選擱置: @@ -181,12 +185,13 @@ 另存為修補檔 (patch)... 變更對比 個檔案已變更 - 搜尋變更... + 篩選變更... 收合詳細面板 檔案列表 LFS 檔案 搜尋檔案... 子模組 + 請選擇要檢視內容的檔案 基本資訊 作者 提交者 @@ -203,7 +208,6 @@ 提交編號 簽署人: 在瀏覽器中檢視 - 欄 請輸入提交訊息,標題與詳細描述之間請使用單行空白區隔。 標題 比較 @@ -370,7 +374,7 @@ 標籤名稱: 同時刪除遠端存放庫中的此標籤 二進位檔案 - 查看新內容 + 檢視新內容 空檔案 第一個差異 忽略空白符號變化 @@ -813,7 +817,7 @@ 沒有自訂的動作 捨棄所有變更 在檔案瀏覽器中開啟 - 快速搜尋分支/標籤/子模組 + 篩選分支/標籤/子模組 篩選以顯示或隱藏 摺疊篩選器 取消指定 @@ -950,10 +954,15 @@ 檢視變更 擱置變更列表 提交統計 + 提交統計圖 總覽 本月 本週 SourceGit 僅會依所選分支取出最多 200,000 筆提交記錄進行分析 + 主要貢獻者 + 提交次數 + 百分比 + 提交佔比低於 1% 的貢獻者會被歸入 Others 分組 貢獻者人數: 提交次數: 子模組 @@ -997,6 +1006,11 @@ 合併 ${0}$ 到 ${1}$... 推送 ${0}$... 終止執行 + 不受信任的存放庫 + 您是否要執行 `git config --global --add safe.directory {0}` 命令以信任該存放庫? + Git 拒絕存取該存放庫: + 路徑: + 有 {0} 個存放庫因 git 的信任檢查而被略過,請手動開啟並確認是否信任。 更新子模組 更新所有子模組 如果子模組尚未初始化,則將其初始化 @@ -1021,7 +1035,7 @@ 開啟本機存放庫 開啟終端機 重新掃描預設複製 (clone) 目錄下的存放庫 - 快速搜尋存放庫... + 篩選存放庫... 本機變更 加入至 .gitignore 忽略清單 忽略所有 *{0} 檔案 @@ -1033,6 +1047,7 @@ 現在您已可將其加入暫存區中 清除提交訊息記錄 您確定要清除所有提交訊息記錄嗎 (執行後無法復原)? + 收合側邊欄 提 交 提交並推送 提交訊息記錄/範本 @@ -1049,7 +1064,8 @@ 使用我方版本 (ours) 使用對方版本 (theirs) 捨棄所有變更 - 搜尋變更... + 展開側邊欄 + 篩選變更... 顯示未追蹤檔案 沒有提交訊息記錄 沒有可套用的提交訊息範本 diff --git a/src/Resources/Styles.axaml b/src/Resources/Styles.axaml index 2a605b2bd6..d1ba76c821 100644 --- a/src/Resources/Styles.axaml +++ b/src/Resources/Styles.axaml @@ -21,6 +21,8 @@ + + @@ -174,9 +176,9 @@ - + + - @@ -684,14 +696,10 @@ - - - - - - - - + + CanResize="True"> @@ -134,7 +136,7 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + - - - - - + + + + + diff --git a/src/Views/TrustRepository.axaml b/src/Views/TrustRepository.axaml new file mode 100644 index 0000000000..a78e1a49e0 --- /dev/null +++ b/src/Views/TrustRepository.axaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Views/TrustRepository.axaml.cs b/src/Views/TrustRepository.axaml.cs new file mode 100644 index 0000000000..5f624bc238 --- /dev/null +++ b/src/Views/TrustRepository.axaml.cs @@ -0,0 +1,12 @@ +using Avalonia.Controls; + +namespace SourceGit.Views +{ + public partial class TrustRepository : UserControl + { + public TrustRepository() + { + InitializeComponent(); + } + } +} diff --git a/src/Views/Welcome.axaml.cs b/src/Views/Welcome.axaml.cs index c93c27ebb8..65538875d6 100644 --- a/src/Views/Welcome.axaml.cs +++ b/src/Views/Welcome.axaml.cs @@ -335,10 +335,32 @@ private async void DropOnTreeView(object sender, DragEventArgs e) foreach (var item in items) { - var path = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(item.Path.LocalPath); - if (!string.IsNullOrEmpty(path)) + var root = item.Path.LocalPath; + if (!Directory.Exists(root)) { - await ViewModels.Welcome.Instance.AddRepositoryAsync(path, null, true, false); + if (File.Exists(root)) + root = Path.GetDirectoryName(root); + else + continue; + } + + var rs = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(root); + if (!rs.IsSuccess) + { + if (Models.SafeDirectories.IsUntrustedRepository(rs.StdErr) && + Models.SafeDirectories.TryGetSafeDirectoryValue(root, rs.StdErr, out var safeDirectory)) + { + var pageView = this.FindAncestorOfType(); + if (pageView is { DataContext: ViewModels.LauncherPage page }) + { + page.Popup = new ViewModels.TrustRepository(page.Node.Id, root, rs.StdErr, safeDirectory, null, false, false, 0); + break; // Stop processing further because `SourceGit` only supports processing one popup at a time. + } + } + } + else + { + await ViewModels.Welcome.Instance.AddRepositoryAsync(rs.StdOut.Trim(), null, true, false); refresh = true; } } @@ -394,10 +416,32 @@ private async void DropOnTreeNode(object sender, DragEventArgs e) foreach (var item in items) { - var path = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(item.Path.LocalPath); - if (!string.IsNullOrEmpty(path)) + var root = item.Path.LocalPath; + if (!Directory.Exists(root)) + { + if (File.Exists(root)) + root = Path.GetDirectoryName(root); + else + continue; + } + + var rs = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(root); + if (!rs.IsSuccess) + { + if (Models.SafeDirectories.IsUntrustedRepository(rs.StdErr) && + Models.SafeDirectories.TryGetSafeDirectoryValue(root, rs.StdErr, out var safeDirectory)) + { + var pageView = this.FindAncestorOfType(); + if (pageView is { DataContext: ViewModels.LauncherPage page }) + { + page.Popup = new ViewModels.TrustRepository(page.Node.Id, root, rs.StdErr, safeDirectory, to, false, false, 0); + break; // Stop processing further because `SourceGit` only supports processing one popup at a time. + } + } + } + else { - await ViewModels.Welcome.Instance.AddRepositoryAsync(path, to, true, false); + await ViewModels.Welcome.Instance.AddRepositoryAsync(rs.StdOut.Trim(), to, true, false); refresh = true; } }