Compare commits

...

2945 commits
v8.0 ... master

Author SHA1 Message Date
leo
74d77ab704
Merge branch 'release/v2025.22' 2025-06-16 09:18:41 +08:00
leo
b617181fc5
version: Release 2025.22
Signed-off-by: leo <longshuang@msn.cn>
2025-06-16 09:18:31 +08:00
github-actions[bot]
9dedcacb2f doc: Update translation status and sort locale files 2025-06-16 01:15:05 +00:00
Javier J. Martínez M.
b22733b565
localization: update spanish translations (#1422)
add missing translations
2025-06-16 09:14:52 +08:00
Göran W
28844c59cf
perf: optimize the WorkingCopy.IsChanged() method (#1418)
Some checks failed
Continuous Integration / Build (push) Has been cancelled
Continuous Integration / Prepare version string (push) Has been cancelled
Continuous Integration / Package (push) Has been cancelled
* There's no need to populate a Dictionary just to diff the the "old" and "cur" Lists of Changes.
* If the two lists are of equal length and no change has occurred, we can assume that they are also reported in equal sort-order (by git-status).
* Thus, we only need to compare the two items at each successive index.
2025-06-13 19:23:20 +08:00
leo
f88652ffdd
code_review: PR #1417
Remove unnecessary namespace using

Signed-off-by: leo <longshuang@msn.cn>
2025-06-13 17:12:14 +08:00
Göran W
8dffdef48d
refactor: reduce redundant code in NumericSort (#1417)
* Refactor the 2 do-loops into simpler while-loops and replace the use of "tmp1/2" char-arrays with calls to String.Substring().
* Rename the "loc1/2" variables to "subLen1/2", for clarity, since they represent the lengths of the two extracted Substrings.

These changes make the logic more compact and easier to follow.
2025-06-13 17:06:35 +08:00
leo
158d926189
ux: new style for submodule diff
Signed-off-by: leo <longshuang@msn.cn>
2025-06-13 16:19:04 +08:00
leo
99b7208a54
enhance: prevent to start bisect if it is already running
Signed-off-by: leo <longshuang@msn.cn>
2025-06-13 15:32:31 +08:00
leo
05757ebf40
feature: supports to view .tiff images
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-12 18:15:25 +08:00
leo
cb6d6a233f
feature: show change tooltip in INFORMATION page
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-12 11:42:58 +08:00
leo
79650d1851
feature: supports to view .gif file as static image (not animated)
Signed-off-by: leo <longshuang@msn.cn>
2025-06-12 11:32:24 +08:00
leo
7e2f3bec8c
enhance: clear commit message before merging/cherry-picking/rebasing/reverting to allow SourceGit read it from git (#1414)
Signed-off-by: leo <longshuang@msn.cn>
2025-06-12 10:39:52 +08:00
leo
7de5991ecb
code_review: PR #1415
- Column for hotkey in `Reset` popup should use `Auto` for width
- Add `SelectionBoxItemTemplate` for current selected mode in `Reset` popup

Signed-off-by: leo <longshuang@msn.cn>
2025-06-12 09:54:53 +08:00
Nathan Baulch
ffac71b15f
code_style: general cleanup (#1415)
* code_style:  general cleanup

* code_style: whitespace cleanup
2025-06-12 09:35:37 +08:00
leo
35eda489be
feature: show local branch's track status in CheckoutAndFastForward popup
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-11 21:14:06 +08:00
leo
f59851f454
refactor: case-insensitive sorting
- `ToUpper` is not necessary to compare digit char with non-digit char
- use numeric sorting for commit decorators with same type

Signed-off-by: leo <longshuang@msn.cn>
2025-06-11 20:25:41 +08:00
leo
a128b67bd4
code_review: PR #1412
- Use `ViewModels.StashesPage.SelectedStash` instead of `sender is not ListBox { SelectedValue: Models.Stash stash }`
- In tags view, `SelectedItem` can be `Models.Tag` or `ViewModels.TagTreeNode`
- In logs window, `vm.SelectedLog` may be null

Signed-off-by: leo <longshuang@msn.cn>
2025-06-11 16:13:47 +08:00
Nathan Baulch
196b454ae8
feature: support delete key everywhere (#1412) 2025-06-11 15:35:43 +08:00
leo
5494093261
refactor: now all filesystem related trees/lists are sorted in case-insensitive mode
Signed-off-by: leo <longshuang@msn.cn>
2025-06-11 15:20:50 +08:00
leo
c3c7d32167
refactor: do not change original image aspect ratio and do not up-scale image in BLEND image-diff mode
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-11 10:25:24 +08:00
leo
7c1a894525
refactor: do not change original image aspect ratio and do not upscale image in SWIPE mode
Signed-off-by: leo <longshuang@msn.cn>
2025-06-11 10:12:03 +08:00
leo
bcefb773c1
code_style: remove comment
Some checks failed
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Has been cancelled
Signed-off-by: leo <longshuang@msn.cn>
2025-06-10 17:19:37 +08:00
leo
aa1c8b1cc1
code_style: use combined expr
Signed-off-by: leo <longshuang@msn.cn>
2025-06-10 17:09:57 +08:00
github-actions[bot]
5e303d43d4 doc: Update translation status and sort locale files 2025-06-10 09:04:35 +00:00
leo
7d0536d94b
feature: when trying to checkout a local branch from its tracking upstream and it is behind the upstream, show Checkout & Fast-Forward popup
Signed-off-by: leo <longshuang@msn.cn>
2025-06-10 17:04:06 +08:00
Nathan Baulch
6c04f5390a
feature: double tap commit with tracked remote branch checks out local tracking branch (#1409) 2025-06-10 15:58:57 +08:00
leo
ee4d8a6a0e
code_review: PR #1408
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-10 11:18:20 +08:00
johanw1232
0ea4021a64
feature: update blame data when clicking/navigating commits (#1408)
* initial work on allowing navigation by clicking on commits in the blame window
* cleanup
2025-06-10 09:30:12 +08:00
leo
11a46dbc93
update: built-in github and unreal icons
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-09 17:35:20 +08:00
leo
69792b3262
refactor: do not upscale images
Signed-off-by: leo <longshuang@msn.cn>
2025-06-09 17:22:31 +08:00
leo
1b1dc2f666
code_style: remove unnecessary code
Signed-off-by: leo <longshuang@msn.cn>
2025-06-09 15:42:02 +08:00
leo
4302d7adb5
Merge branch 'master' into develop
Some checks failed
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Has been cancelled
2025-06-09 09:31:46 +08:00
leo
932baeec53
Merge branch 'release/v2025.21' 2025-06-09 09:30:45 +08:00
leo
637e133f47
version: Release 2025.21
Signed-off-by: leo <longshuang@msn.cn>
2025-06-09 09:30:36 +08:00
github-actions[bot]
a1e76e9bea doc: Update translation status and sort locale files 2025-06-09 01:27:28 +00:00
AquariusStar
a8541a780e
localization: update translate Russian (#1404) 2025-06-09 09:27:10 +08:00
Sina Hinderks
d55f19586f
fix: issue tracker rule over keyword in subject (#1403)
Some teams use issue tracker numbers in front of the commit message
subject, followed by a colon.  It was not possible to use an issue
tracker rule in such cases, since the issue tracker number would be
interpreted as a keyword due to the colon and therefore displayed in
bold face instead of as a link into the issue tracker.
2025-06-09 09:26:27 +08:00
leo
a22c39519f
code_style: remove unnecessary code
Some checks failed
Continuous Integration / Build (push) Has been cancelled
Continuous Integration / Prepare version string (push) Has been cancelled
Continuous Integration / Package (push) Has been cancelled
Signed-off-by: leo <longshuang@msn.cn>
2025-06-08 11:54:54 +08:00
leo
84fb39f97a
code_review: PR #1402
- it's unnecessary to implement `IEnumerable` interface
- we should check `IsIntersecting` before creating `InlineElement` to avoid unnecessary works suck as running `git cat-file -t <hash>`
- sort whold list after all elements have been added to avoid unnecessary memmove in `Insert`

Signed-off-by: leo <longshuang@msn.cn>
2025-06-08 11:09:20 +08:00
Sina Hinderks
fe54d30b70
refactor: collecting inlines for subjects (#1402)
Instead of checking intersections of inline elements yourself before adding an inline element, the new class `InlineElementCollector` prevents intersections internally.

Additionally the inline elements are sorted by the new class, so it's no longer necessary to do this after adding the inline elements.
2025-06-08 08:47:03 +08:00
leo
ba4c0f0cd2
enhance: scroll to home when active revision file changed
Some checks are pending
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Continuous Integration / Build (push) Waiting to run
Signed-off-by: leo <longshuang@msn.cn>
2025-06-07 20:53:34 +08:00
leo
2478d2953b
code_style: remove unnecessary code in DiffContext
Signed-off-by: leo <longshuang@msn.cn>
2025-06-07 20:42:45 +08:00
leo
74f52fb266
enhance: only show syntax-highlighting toggle if current revision content is a text file
Signed-off-by: leo <longshuang@msn.cn>
2025-06-07 20:27:52 +08:00
leo
f830b68f6a
ux: change foreground for some labels
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-07 12:20:09 +08:00
leo
d323a2064e
feature: supports RGBA16 pixel format
Signed-off-by: leo <longshuang@msn.cn>
2025-06-07 12:00:16 +08:00
leo
203c50350e
fix: wrong pfim image format
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-06 20:50:37 +08:00
leo
47012e29dc
fix: file extensions are case-insensitive
Some checks failed
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Has been cancelled
Signed-off-by: leo <longshuang@msn.cn>
2025-06-06 18:47:36 +08:00
leo
8db033be99
code_review: PR #1392
- fix the issue that not all channel takes 8 bits
- if `PixelFormatTranscoder.Transcode` supports the same pixel formats, let it converts pixels automatically

Signed-off-by: leo <longshuang@msn.cn>
2025-06-06 18:23:10 +08:00
Henrik Andersson
a2ca071f08
feature: .dds image support (#1392)
* Added Pfim as 3rdparty lib

* Added support for parsing showing dds and tga images using Pfim

---------

Co-authored-by: Snimax <snimax@live.se>
2025-06-06 16:44:40 +08:00
Nathan Baulch
7bba40d03f
typos: (#1397) 2025-06-06 12:10:55 +08:00
leo
0c22409b7b
ux: new sort by time icon (#1393)
Signed-off-by: leo <longshuang@msn.cn>
2025-06-06 11:37:56 +08:00
leo
f63fe8637b
feature: use different icon for sort mode (#1393)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Waiting to run
Signed-off-by: leo <longshuang@msn.cn>
2025-06-06 11:22:30 +08:00
github-actions[bot]
08665e45c1 doc: Update translation status and sort locale files 2025-06-06 02:45:35 +00:00
leo
3bb20868fc
refactor: remove unnecessary sort by name (descending) for tags (#1393)
Signed-off-by: leo <longshuang@msn.cn>
2025-06-06 10:45:18 +08:00
leo
ac55bed812
enhance: revision file viewer
- show current file path
- add a toggle button to use global syntax highlighting setting (sometimes TextMateSharp will crash this app)

Signed-off-by: leo <longshuang@msn.cn>
2025-06-06 10:07:58 +08:00
leo
f003f67129
fix: should use file.SHA instead of _commit.SHA to query submodule's commit
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-05 21:54:09 +08:00
Göran W
f04b0c5d97
fix: prevent exception on repo with no commits/branches
Signed-off-by: leo <longshuang@msn.cn>
2025-06-05 21:28:32 +08:00
Göran W
406ace9e79
enhance: activate TabsDropdownItem on Tapped instead of DoubleTapped
Signed-off-by: leo <longshuang@msn.cn>
2025-06-05 21:28:10 +08:00
leo
464fe74580
code_review: commit b969ac161a
- The return code of `AutoRemoveInvalidNode`  is never used
- It's not necessary to sort all nodes after re-scan default clone dir. Because `FindOrAddNodeByRepositoryPath` makes sure added node is ordered
- Add a new parameter `save` to `FindOrAddNodeByRepositoryPath` method, and disable it while scanning. Instead, we will save it after scan finished.

Signed-off-by: leo <longshuang@msn.cn>
2025-06-05 21:27:19 +08:00
Göran W
b969ac161a
enhance: unify sorting of RepositoryNode tree, unconditional sort & save after rescan 2025-06-05 21:19:25 +08:00
Göran W
88c38b4139
enhance: unified all file-path normalization - use char-replace, trim trailing slash 2025-06-05 21:17:18 +08:00
Göran W
54c05ac35a
fix: remove trailing slash in paths, to avoid failing comparisons.
This is needed since DirectoryInfo.Fullname (and .FullPath) will not "normalize" trailing slashes, so direct equality tests are error-prone.
This fixes a bug in ScanRepositories.GetUnmanagedRepositories(), where not all Git repo folders were added.
(Also, corrected a variable name from 'founded' to 'found'.)
2025-06-05 21:15:28 +08:00
Göran W
75c32c1a01
typo: corrected spelling error in App.GetLauncher() method 2025-06-05 21:15:28 +08:00
leo
a023a9259b
refactor: rewrite lfs pointer detection and image loading
Signed-off-by: leo <longshuang@msn.cn>
2025-06-05 21:06:31 +08:00
leo
eebadd67a1
feature: remember the last active tab index in lfs-image diff view
Some checks are pending
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Continuous Integration / Build (push) Waiting to run
Signed-off-by: leo <longshuang@msn.cn>
2025-06-05 09:18:19 +08:00
leo
f716c5ee1e
refactor: use existing QueryFileContent command
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-04 21:30:08 +08:00
leo
ed496a41fb
feature: supports to view image diff when lfs object points to a image
Signed-off-by: leo <longshuang@msn.cn>
2025-06-04 20:53:42 +08:00
leo
06a77502bc
fix: crash when clicking Previous Difference without visual lines (#1385)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Always scroll to top when the state of `Show All Lines` changed

Signed-off-by: leo <longshuang@msn.cn>
2025-06-04 13:13:28 +08:00
leo
c2187edbe9
fix: running git command in UIThread via context menu entry blocks whole app (#1384)
Some checks failed
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Has been cancelled
Signed-off-by: leo <longshuang@msn.cn>
2025-06-03 23:36:15 +08:00
github-actions[bot]
d85f82e171 doc: Update translation status and sort locale files 2025-06-03 13:38:04 +00:00
leo
f7c10d0b33
feature: supports to load avatar from local image and save it to disk
Signed-off-by: leo <longshuang@msn.cn>
2025-06-03 21:37:47 +08:00
leo
25e272fa55
ux: layout of filter mode toggle buttons
Signed-off-by: leo <longshuang@msn.cn>
2025-06-03 20:28:44 +08:00
leo
98041c803e
feature: supports re-order custom actions (#1346)
Signed-off-by: leo <longshuang@msn.cn>
2025-06-03 20:24:30 +08:00
leo
ee2e7d0127
enhance: ignores $ char when measuring contents in NamedHighlightedTextBlock
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-03 14:12:23 +08:00
leo
6517e78ab6
enhance: enable StaysOpenOnClick for filter mode in graph context menu item
Signed-off-by: leo <longshuang@msn.cn>
2025-06-03 14:06:53 +08:00
leo
bf43dd828a
ux: new style for ref's Visibility in Graph context menu item
Signed-off-by: leo <longshuang@msn.cn>
2025-06-03 12:34:49 +08:00
leo
cd009bda6b
ux: enable Use monospace font only in text editor by default
Signed-off-by: leo <longshuang@msn.cn>
2025-06-03 10:15:58 +08:00
leo
cd8ff2e9bf
Merge branch 'master' into develop
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
2025-06-03 09:27:51 +08:00
leo
0594196dee
Merge branch 'release/v2025.20' 2025-06-03 09:27:03 +08:00
leo
425395da29
version: Release 2025.20
Signed-off-by: leo <longshuang@msn.cn>
2025-06-03 09:26:57 +08:00
leo
6e501b1ee4
feature!: now SourceGit requires git >= 2.25.1
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Waiting to run
Signed-off-by: leo <longshuang@msn.cn>
2025-06-02 22:38:00 +08:00
leo
7b05b011aa
fix: USE THEIRS for AU conflict and USE MINE for UA conflict
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-02 13:03:38 +08:00
leo
f1052c3efc
refactor: use git reset --hard HEAD to discard all changes and use git restore --staged to unstage changes in text diff view
Signed-off-by: leo <longshuang@msn.cn>
2025-06-02 12:50:58 +08:00
leo
78f9ae2fa9
refactor: rewrite git restore integration
Signed-off-by: leo <longshuang@msn.cn>
2025-06-02 12:14:22 +08:00
leo
80df53cf04
ux: move hunk-based operation button away from scrollbar (#1382)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-01 20:04:15 +08:00
leo
57004c4baf
code_style: run dotnet format
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-06-01 11:23:04 +08:00
leo
fa004ce31b
enhance: unstaged renamed file should use git restore --staged <path> <org_path> instead of git restore --staged <path>
Signed-off-by: leo <longshuang@msn.cn>
2025-06-01 11:19:41 +08:00
leo
6620bd193e
ux: remove tooltip for USE THEIRS and USE MINE button
Signed-off-by: leo <longshuang@msn.cn>
2025-06-01 11:09:31 +08:00
leo
26307e2343
refactor: new tooltip for change
Signed-off-by: leo <longshuang@msn.cn>
2025-06-01 10:34:24 +08:00
leo
db5bb0aec9
fix: must convert the relative path to absolute before send it to first instance (#1376)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-05-31 21:26:01 +08:00
leo
dd432c63e8
enhance: when counting commits in Statistics, if the authors have the same e-mail address, the commits are considered to be from the same person (#1380)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-31 18:52:15 +08:00
github-actions[bot]
b94f26a937 doc: Update translation status and sort locale files
Some checks failed
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Has been cancelled
2025-05-31 04:15:23 +00:00
Javier J. Martínez M.
8e5d5b946e
localization: update spanish translations (#1379)
add missing translations
2025-05-31 12:15:06 +08:00
leo
a9734ea8e9
code_style: remove unused code
Signed-off-by: leo <longshuang@msn.cn>
2025-05-31 11:33:22 +08:00
github-actions[bot]
e22f0f8513 doc: Update translation status and sort locale files
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Waiting to run
2025-05-30 10:20:10 +00:00
leo
8b17f3b1f4
localization: change Compare with HEAD to Compare with <current_branch_name>
Signed-off-by: leo <longshuang@msn.cn>
2025-05-30 18:19:46 +08:00
leo
7934496cff
feature: reset non-active branch to selected commit should not depends on upstream
Signed-off-by: leo <longshuang@msn.cn>
2025-05-30 17:56:06 +08:00
leo
188408fdfc
project: remove duplicated attributes in csproj
Signed-off-by: leo <longshuang@msn.cn>
2025-05-30 17:21:49 +08:00
leo
bc5deac9fe
fix: OpenFolderPickerAsync raise exception when selected a drive root such as E:\
Signed-off-by: leo <longshuang@msn.cn>
2025-05-30 17:12:56 +08:00
leo
1bd2044589
ux: show conflict description in change status icon
Some checks are pending
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Continuous Integration / Build (push) Waiting to run
Signed-off-by: leo <longshuang@msn.cn>
2025-05-30 11:20:43 +08:00
leo
f0c77ffeb8
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2025-05-30 11:16:07 +08:00
leo
60cd210b80
fix: using theirs or mine does not work if it is deleted by ours or theirs
Signed-off-by: leo <longshuang@msn.cn>
2025-05-30 11:13:29 +08:00
leo
75015d550c
ux: show conflict short format in changes view
Signed-off-by: leo <longshuang@msn.cn>
2025-05-30 10:42:02 +08:00
leo
e40ca4bbe0
refactor: use git restore instead of git reset to unstage local changes (#1373)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-30 09:43:45 +08:00
leo
46231a759c
code_style: run dotnet format
Some checks failed
Continuous Integration / Build (push) Has been cancelled
Continuous Integration / Prepare version string (push) Has been cancelled
Localization Check / localization-check (push) Has been cancelled
Continuous Integration / Package (push) Has been cancelled
Signed-off-by: leo <longshuang@msn.cn>
2025-05-28 15:17:05 +08:00
leo
fbc8edcc13
feature: show conflict reason
Signed-off-by: leo <longshuang@msn.cn>
2025-05-28 14:20:56 +08:00
github-actions[bot]
3437f5f4a9 doc: Update translation status and sort locale files 2025-05-28 02:19:23 +00:00
leo
40bf69bff3
ux: move some buttons to page switcher (#1370)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-28 10:18:34 +08:00
leo
2aac6779a5
fix: squash should not change the original author
Signed-off-by: leo <longshuang@msn.cn>
2025-05-28 09:50:14 +08:00
cdammanintopix
9affca1fb2
fix: arguments order for checkout command (#1368)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
2025-05-27 17:43:33 +08:00
Gadfly
729e06d5c0
fix: SaveAsPatch for untracked changes in stash (#1366)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
2025-05-26 22:50:29 +08:00
leo
826619e7c9
fix: new added file in stash changes may not come from untracked file but from staged files (#1358)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-05-26 22:13:10 +08:00
github-actions[bot]
056b90a5ae doc: Update translation status and sort locale files
Some checks failed
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Continuous Integration / Build (push) Waiting to run
Localization Check / localization-check (push) Has been cancelled
2025-05-26 04:28:23 +00:00
leo
0641a22230
feature: allow to reset author when --amend is enabled for committing 2025-05-26 12:28:00 +08:00
leo
d3bc85418e
Merge branch 'master' into develop 2025-05-26 09:56:00 +08:00
leo
4887252870
Merge branch 'release/v2025.19' 2025-05-26 09:45:48 +08:00
leo
860f6f2369
version: Release 2025.19
Signed-off-by: leo <longshuang@msn.cn>
2025-05-26 09:45:43 +08:00
leo
cfc80d41a1
fix: sometimes track status is not correct because the local branch name is ambiguous to git
Signed-off-by: leo <longshuang@msn.cn>
2025-05-26 09:42:46 +08:00
leo
ac26d5bb06
fix: can not squash and fixup until first picked/edit/reword commit in interactive rebase exists list (#1362)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Waiting to run
Signed-off-by: leo <longshuang@msn.cn>
2025-05-25 13:46:27 +08:00
github-actions[bot]
d7c3bb7150 doc: Update translation status and sort locale files 2025-05-25 05:05:31 +00:00
AquariusStar
39d955b033
localization: update russian translate (#1363) 2025-05-25 13:05:14 +08:00
leo
0e35c56529
enhance: disable squash and fixup for the first commit in interactive rebase list (#1362)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-25 13:03:36 +08:00
leo
22339ab619
enhance: allow to use arrow keys to select changes up/down after stage/unstage previous selected changes by hotkey (#1361)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-05-24 21:29:48 +08:00
leo
ef53dd0025
refactor: use a new Models.ChangeState.Conflicted to represent all the unmerged file state (#1359)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-24 20:25:05 +08:00
Göran W
30d4c1008a
enhance: don't show unmerged files in STAGED area (#1359)
Unmerged files (i.e unresolved conflicts) should only appear in the Unstaged area, and not "duplicated" in the Staged area.

Motivation:
* The user-friendly git-status command does not show these as "Changes to be committed".
* If they appear in the Staged area, they are quite redundant since the Diff view will just show "No changes or only EOL changes".
* Some other Git UIs (like Fork) don't show these as Staged items either.

NOTE: According to docs for the git-status "Short Format" (and --porcelain=v1), the XY fields for Unmerged paths do NOT actually represent the Index & Working-tree states, instead they represent the states introduced by each HEAD in the merge (i.e Ours & Theirs, relative to Base).
2025-05-24 19:42:10 +08:00
leo
ca33107a45
code_review: PR #1360
Signed-off-by: leo <longshuang@msn.cn>
2025-05-24 19:26:17 +08:00
Göran W
4363b8b6aa
refactor: add new constant Models.Commit.EmptyTreeSHA1 (#1360) 2025-05-24 19:23:28 +08:00
Göran W
f3fe90b2e1
fix: IsConflictResolved check should not be done for submodules (#1356)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
A submodule conflict is not resolved until it's Staged.
2025-05-24 09:40:17 +08:00
leo
e28b75b860
enhance: include stdout in error popup when git process (in Exec mode, we do not need to parse its output) exit with non-zero code
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-05-23 16:12:40 +08:00
leo
3377886bab
enhance: filter hint: blocks
Signed-off-by: leo <longshuang@msn.cn>
2025-05-23 14:13:48 +08:00
leo
4807cd5eb2
fix: if font family name contains '#', make sure we have that built-in font
Signed-off-by: leo <longshuang@msn.cn>
2025-05-23 13:32:02 +08:00
github-actions[bot]
d21b790784 doc: Update translation status and sort locale files
Some checks failed
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Has been cancelled
2025-05-23 04:25:41 +00:00
Javier J. Martínez M.
764ae31239
localization: update spanish translations (#1355)
* localization: update spanish translations

add missing translations

* Update es_ES.axaml

Quickfix for `Text.DeinitSubmodule.Force` translation
2025-05-23 12:25:29 +08:00
github-actions[bot]
38d67d7f17 doc: Update translation status and sort locale files 2025-05-23 03:28:10 +00:00
leo
76a197aae7
feature: supports to overwrite existing branch while creating new branch (#1349)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-23 11:27:45 +08:00
leo
594ffc0d1a
localization: fix typo in en_US for Text.DeinitSubmodule.Force
Signed-off-by: leo <longshuang@msn.cn>
2025-05-23 10:38:44 +08:00
leo
fb1f5638ce
code_style: simpfy context menu creation for blame editor
Signed-off-by: leo <longshuang@msn.cn>
2025-05-23 10:31:11 +08:00
leo
492da8dd57
fix: blame highlight background did not update when using scrollbar (#1354)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-23 10:27:48 +08:00
leo
0ae39faad1
enhance: do not show hint: messages in error popup, but leave it in git command logs (#1348)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-23 10:05:09 +08:00
leo
c112549b69
refactor: query branch head after operation finished to avoid branch head mismatch
Signed-off-by: leo <longshuang@msn.cn>
2025-05-23 09:40:15 +08:00
Göran W
9fb8af51ff
code_style: move hardcoded brush/strings (for outlier Conflict-icon) into named constants (#1350)
This makes code more consistent and gives better overview of all the icons.
(Potentially, this special/outlier icon could be moved into the existing arrays as an extra ChangeState enum-value.)
2025-05-23 09:18:05 +08:00
leo
1ee7d1184e
enhance: only refresh submodules when it is needed (#1344)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-05-22 11:02:54 +08:00
Göran W
44c83ef342
enhance: added more FileSystemWatcher patterns, to improve handling (#1345)
Skip files frequently updated by Git fsmonitor--daemon and Visual Studio, to ease debugging and for early exit.
Check for HEAD and ORIG_HEAD under .git/modules/<submodule>/, to improve handling of submodules.
Check for MERGE_HEAD and AUTO_MERGE under .git/, to improve handling of submodules.
2025-05-22 09:11:28 +08:00
leo
c3ac59ee1a
enhance: refresh submodules after .gitmodules file changed
Some checks failed
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Has been cancelled
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 20:51:29 +08:00
leo
c73f775aa5
enhance: mark submodule having local changes even if there are only untracked files (#1344)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 20:47:10 +08:00
M-L-Ml
afbd0d7135
fix: typo in name SetupExternalTools (#1343) 2025-05-21 20:35:22 +08:00
github-actions[bot]
bf39673b21 doc: Update translation status and sort locale files 2025-05-21 12:34:51 +00:00
leo
b0c0c46441
feature: supports to de-initialize a submodule (#1272)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 20:34:33 +08:00
leo
1fef7a7baa
perf: only update uninited or outdated submodules
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Waiting to run
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 17:51:00 +08:00
github-actions[bot]
1872740265 doc: Update translation status and sort locale files 2025-05-21 09:18:49 +00:00
leo
09d0122e26
refactor: rewrite git pull command
If we do not provide pulling remote branch, it will auto fetch all branches first.

Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 17:18:25 +08:00
github-actions[bot]
7728f4ffbf doc: Update translation status and sort locale files 2025-05-21 08:54:46 +00:00
leo
936160ea5c
feature: supports --recurse-submodules on pull (#1342)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 16:54:23 +08:00
leo
d73ae83b01
feature: supports to use relative path in remote URL (#1339)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 16:29:33 +08:00
leo
5e05c008fc
refactor: simplfy the regex to check remote's URL with HTTP/HTTPS/GIT protocol
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 15:09:36 +08:00
leo
598ba6d9f6
refactor: rewrite Remote.IsValidURL (#1339)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 14:48:21 +08:00
leo
3232e6f313
fix: on Windows, the correct file protocol url format is file:///<driver>:/path/to/file_or_dir (#1339)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 14:18:06 +08:00
leo
0a6b1faa65
feature: support git:// protocol (#1339)
Some checks are pending
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Continuous Integration / Build (push) Waiting to run
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 09:36:41 +08:00
leo
71b90a82b6
refactor: remove validation for relative path while adding submodule (#1339)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 09:27:02 +08:00
leo
d304c50e7f
enhance: show custom action output in popup
Some checks are pending
Localization Check / localization-check (push) Waiting to run
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 00:16:19 +08:00
leo
438aa76695
feature: support to use relative path as submodule's url when adding new submodule (#1339)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-21 00:10:10 +08:00
leo
ece51fbd32
fix: remove binding error in debug mode (#1338)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 23:02:45 +08:00
leo
224f7a949a
fix: since can not been used in HotKey property and ⌘+⌥+D has been used to show Dock, change the hotkey to open external merge tool to Ctrl+Shift+D/⌘+⇧+D
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 23:01:21 +08:00
leo
e6fdc778b7
fix: remove binding error in debug mode (#1338)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 21:48:58 +08:00
leo
53c6fc8999
fix: remove binding error in debug mode (#1338)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 21:44:28 +08:00
leo
f0d1d460a9
fix: remove binding error in debug mode (#1338)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 21:35:14 +08:00
leo
3386cb177b
refactor: rewrite git flow init
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 21:26:41 +08:00
leo
4d5be9f280
refactor: rewrite git-flow integration
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 21:08:00 +08:00
leo
6fa454ace8
fix!: same hotkey for opening external diff tool and discard block (#1337)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Waiting to run
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 17:32:06 +08:00
leo
75b7724d44
refactor: implement IDisposable instead of calling custom Cleanup
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 17:24:00 +08:00
leo
550493b572
enhance: prevent requesting worktree files more than once time
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 16:49:00 +08:00
leo
eb183589f5
enhance: prevent requesting revision files more than once time
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 16:32:57 +08:00
github-actions[bot]
d56c6a5030 doc: Update translation status and sort locale files 2025-05-20 04:24:40 +00:00
leo
f9b6116a76
feature: supports reset branch to selected commit without checkout (#1247) (#1318)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 12:24:07 +08:00
Gadfly
12d2b7721c
fix: Trim and normalize commit message history line endings (#1335)
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
2025-05-20 10:56:02 +08:00
leo
119b0fe95c
feature: log output of custom action if Wait for action exit enabled (#1334)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-20 09:17:00 +08:00
github-actions[bot]
1dfb629cef doc: Update translation status and sort locale files
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Waiting to run
2025-05-19 04:22:07 +00:00
leo
0e2bb1b276
feature: show commit changes count (#1306)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-19 12:21:50 +08:00
leo
57ee1f7dbd
fix: wrong hotkey tip for open Preferences window
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-05-19 10:55:25 +08:00
leo
aaf53ac694
enhance: try to cancel switcher first then other popup
Signed-off-by: leo <longshuang@msn.cn>
2025-05-19 10:08:37 +08:00
leo
736991198f
Merge branch 'master' into develop 2025-05-19 09:45:11 +08:00
leo
7dd1389c25
Merge branch 'release/v2025.18' 2025-05-19 09:43:59 +08:00
leo
341ac26576
version: Release 2025.18
Signed-off-by: leo <longshuang@msn.cn>
2025-05-19 09:43:48 +08:00
leo
aff003fd6d
enhance: cleanup unused resources
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Waiting to run
Signed-off-by: leo <longshuang@msn.cn>
2025-05-18 22:00:35 +08:00
qiufengshe
b78f6b0ea8
perf: minimize temporary strings for better performance (#1332) 2025-05-18 20:52:05 +08:00
leo
5e85f6fefe
enhance: auto-select the first page by default
Signed-off-by: leo <longshuang@msn.cn>
2025-05-18 20:47:38 +08:00
github-actions[bot]
52991351af doc: Update translation status and sort locale files 2025-05-18 12:34:17 +00:00
leo
4b849d9d5c
ux: update workspace/page switcher popup layout
Signed-off-by: leo <longshuang@msn.cn>
2025-05-18 20:33:55 +08:00
github-actions[bot]
6b083dcd3e doc: Update translation status and sort locale files 2025-05-18 11:36:39 +00:00
leo
9614b995d8
refactor: workspace/page switcher (#1330)
- add `Switch Tab` popup
- change hotkey to open `Preferences` to `Ctrl+,/⌘+,`
- change hotkey to open `Switch Workspace` to `Ctrl+Shift+P/⌘+⇧+P`
- change hotkey to open `Switch Tab` to `Ctrl+P/⌘+P`

Signed-off-by: leo <longshuang@msn.cn>
2025-05-18 19:36:17 +08:00
github-actions[bot]
36c2e083cc doc: Update translation status and sort locale files
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Waiting to run
2025-05-18 07:02:46 +00:00
AquariusStar
fd35e0817d
localization: update russian translate (#1331) 2025-05-18 15:02:30 +08:00
github-actions[bot]
d429a6426a doc: Update translation status and sort locale files
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Waiting to run
2025-05-17 12:14:32 +00:00
leo
4c1ba717a7
refactor: rewrite workspace switcher (#1267)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-17 20:14:09 +08:00
github-actions[bot]
bd553405c2 doc: Update translation status and sort locale files 2025-05-17 10:37:25 +00:00
leo
f121975a28
code_review: PR #1328
* remove hotkey to open workspace dropdown menu
* call orignal `ViewModels.Launcher.SwitchWorkspace` directly in view
* add missing translation for Chinese

Signed-off-by: leo <longshuang@msn.cn>
2025-05-17 18:37:02 +08:00
github-actions[bot]
ea320d2cdf doc: Update translation status and sort locale files
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Localization Check / localization-check (push) Waiting to run
2025-05-17 05:17:22 +00:00
popara
01945f231e
Added workspaces shortcuts (#1328)
- added Alt+Space for opening Workspaces context menu (which can then be navigated normally with arrows)
- added Alt+1 through Alt+9 for switching to corresponding workspace
2025-05-17 13:17:10 +08:00
github-actions[bot]
506dbc218c doc: Update translation status and sort locale files 2025-05-17 05:12:20 +00:00
Javier J. Martínez M.
d3a740fb95
localization: update spanish translations (#1329)
add missing translations
2025-05-17 13:12:01 +08:00
leo
d3d0e7b15c
ux: thinner border for default avatar
Some checks are pending
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
Signed-off-by: leo <longshuang@msn.cn>
2025-05-17 08:13:19 +08:00
Gadfly
879b84ac20
enhance: Show the stderr content from QueryLocalChanges (#1327) 2025-05-17 07:58:47 +08:00
github-actions[bot]
7f86ad9f22 doc: Update translation status and sort locale files 2025-05-16 12:08:16 +00:00
Leonardo
0c9cb41e68
localization: new keys translated to italian (#1323) 2025-05-16 20:08:04 +08:00
leo
86f27c5e58
refactor: generate hash based default avatar instead of simple label (#1322)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-16 17:55:02 +08:00
leo
1f0ab2bfec
refactor: simpfy SourceGit.Views.BranchTreeNodeIcon
Signed-off-by: leo <longshuang@msn.cn>
2025-05-16 13:43:41 +08:00
leo
fd935259aa
refactor: build tags view data in viewmodels instead of views
Signed-off-by: leo <longshuang@msn.cn>
2025-05-16 12:22:52 +08:00
github-actions[bot]
f46bbd01cd doc: Update translation status and sort locale files 2025-05-16 03:32:09 +00:00
leo
ed1351b1f7
feature: supports to show submodules as tree or list (#1307)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-16 11:31:53 +08:00
leo
d299469613
ux: show tooltip at right of hovered item in repository's left side bar (#1317)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-16 10:47:38 +08:00
leo
e4490d87dc
code_review: PR #1314
Signed-off-by: leo <longshuang@msn.cn>
2025-05-16 09:45:26 +08:00
Martin Smith
85b223a3d0
Task/UI usability tweaks (#1314)
* Allow About to center in parent
* About closes on Escape
* ConfirmEmptyCommit dialog closes on Escape
* Ignore Dev file
* Missed condition

---------

Co-authored-by: Martin Smith <martin.smith@purplebricks.com>
2025-05-16 09:27:42 +08:00
github-actions[bot]
6c62789c4c doc: Update translation status and sort locale files 2025-05-16 01:20:43 +00:00
AquariusStar
85e08f5eea
localization: update russian localization (#1319) 2025-05-16 09:20:31 +08:00
leo
463d161ac7
refactor: show submodule as tree instead of list (#1307) 2025-05-14 17:55:28 +08:00
github-actions[bot]
5ec51eefb9 doc: Update translation status and sort locale files 2025-05-14 08:02:08 +00:00
leo
bc5c4670de
feature: supports to use Ctrl+D/⌘+D to open in external diff/merge tool (#1312) 2025-05-14 16:01:47 +08:00
leo
d3363429df
ux: new style for submodule tooltip (#1307) 2025-05-14 15:49:42 +08:00
github-actions[bot]
f83b6c24ae doc: Update translation status and sort locale files 2025-05-14 06:27:00 +00:00
leo
61bb0f7dc7
feature: show submodule's URL in tooltip (#1307) 2025-05-14 14:26:33 +08:00
leo
20a239621b
fix: can not open submodule that has not been initialized 2025-05-14 11:48:44 +08:00
github-actions[bot]
9e91494a20 doc: Update translation status and sort locale files 2025-05-14 03:36:15 +00:00
leo
d71189c705
feature: tooltip for submodule list item (#1307) 2025-05-14 11:35:34 +08:00
leo
55232aeddd
project: ignore custom script files
Signed-off-by: leo <longshuang@msn.cn>
2025-05-13 22:55:24 +08:00
leo
6bf930a9e0
feature: show tags count in tags tree (#1306)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-13 22:50:10 +08:00
Göran W
5b72b15cf2
feature: show remote's URL in tooltip for relevant BranchTreeNodes (#1310) 2025-05-13 22:36:10 +08:00
leo
0e61a0196b
fix: right caption buttons should not visible on macOS (#1311)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-13 22:34:53 +08:00
leo
7bb4e355bd
feature: show branches count in branch tree (#1306) 2025-05-13 19:28:52 +08:00
leo
57d15dc6d3
fix: git submodule status may return lines that start as U character (#1307) 2025-05-13 18:11:51 +08:00
leo
65808e5f58
fix: filter with local branch should not include invalid upstream (gone) (#1308) 2025-05-13 17:59:51 +08:00
leo
cf7b61dd71
refactor: new way to display item count 2025-05-13 17:50:47 +08:00
leo
ac1bd7ca85
ux: hide tag message if it's the same with its name (#1305) 2025-05-13 14:22:41 +08:00
leo
142ee5a327
ux: use localized text instead of hard-coded string annotated (#1305) 2025-05-13 13:01:15 +08:00
leo
afc8a772dd
ux: new style for tag's tooltip (#1305) 2025-05-13 12:26:33 +08:00
leo
8a45e25106
refactor: rewrite custom WM_NCHITTEST implementation on Windows 2025-05-13 10:19:51 +08:00
leo
4e41a6207a
enhance: display tag's name instead of nothing while showing tooltip of tag without message 2025-05-13 10:01:41 +08:00
Göran W
a5c25cf9fe
enhance: add border around tag name, makes tooltip work as for branches
(cherry picked from commit 6a5e6d12d70f52e5777cc4edc4022fed870151d4)
2025-05-13 09:38:09 +08:00
leo
11a9d7fdd8
enhance: force using --no-sign to ignore tag.gpgsign configuration while creating lightweight tag
Signed-off-by: leo <longshuang@msn.cn>
2025-05-13 09:24:00 +08:00
leo
ef4b639f8e
code_style: move platform dependent code to initialize window to namespace SourceGit.Native
Signed-off-by: leo <longshuang@msn.cn>
2025-05-12 21:52:50 +08:00
leo
c62b4a031f
perf: return HTCLIENT directly when window is fullscreen or maximized
Signed-off-by: leo <longshuang@msn.cn>
2025-05-12 18:09:25 +08:00
leo
af9cf6ba6a
ux: force using 4 * RenderScaling as resize border size on Windows
Signed-off-by: leo <longshuang@msn.cn>
2025-05-12 17:57:49 +08:00
leo
641098ffb2
ux: better content padding for maximized window on Windows
Signed-off-by: leo <longshuang@msn.cn>
2025-05-12 16:27:54 +08:00
leo
fcad8eeadc
Merge branch 'master' into develop 2025-05-12 09:24:48 +08:00
leo
01625ada1a
Merge branch 'release/v2025.17' 2025-05-12 09:23:46 +08:00
leo
88dc12275a
version: Release 2025.17
Signed-off-by: leo <longshuang@msn.cn>
2025-05-12 09:22:28 +08:00
Bailey Allen
bac21c5714
enhance: added support for kitty terminal on macOS and Linux. (#1300) 2025-05-12 09:17:20 +08:00
github-actions[bot]
19a51f227b doc: Update translation status and sort locale files 2025-05-12 01:13:27 +00:00
Javier J. Martínez M.
b6d618a6d7
localization: update spanish translations (#1302)
* localization: update spanish translations

add missing translations

* localization: update spanish translations

add missing translations
2025-05-12 09:13:13 +08:00
github-actions[bot]
2573553e01 doc: Update translation status and sort locale files 2025-05-12 01:12:59 +00:00
AquariusStar
9dd0beb61f
localization: update russian translate (#1301) 2025-05-12 09:12:49 +08:00
leo
029fd6933f
refactor: new way to discard selected or all local changes
This modification aims to solve the problem that the deleted submodule cannot be discarded.

Signed-off-by: leo <longshuang@msn.cn>
2025-05-09 22:57:46 +08:00
leo
0f6c8976af
refactor: rewrite checkout/create branch with submodules
Signed-off-by: leo <longshuang@msn.cn>
2025-05-09 18:12:30 +08:00
leo
e446e97f28
fix: remove testing code for git checkout command
Signed-off-by: leo <longshuang@msn.cn>
2025-05-09 17:22:17 +08:00
leo
3e530de9cc
enhance: update submodules individually (#1272)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-09 17:12:12 +08:00
leo
6cf1b20ea6
refactor: context menu for commit change and revision file
Signed-off-by: leo <longshuang@msn.cn>
2025-05-09 14:11:15 +08:00
github-actions[bot]
321ccf9622 doc: Update translation status and sort locale files 2025-05-09 02:47:52 +00:00
leo
ebe0e61367
feature: support to enable --squash and --push option while finishing git-flow branches (#1290)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-09 10:47:36 +08:00
leo
e8bf58f6c3
code_review: PR #1292
Use syntax `String.AsSpan(int start, int len)` instead of `String.AsSpan().Slice(int start, int len)`

Signed-off-by: leo <longshuang@msn.cn>
2025-05-09 09:30:00 +08:00
qiufengshe
15ee2dac91
perf: minimize temporary strings for better performance (#1292) 2025-05-09 09:19:33 +08:00
github-actions[bot]
5d1601086f doc: Update translation status and sort locale files 2025-05-09 01:16:10 +00:00
AquariusStar
3eaa24a993
localization: update and fix translation russian (#1291) 2025-05-09 09:15:59 +08:00
leo
6986e1ac24
code_style: calculate bounds only when it is needed
Signed-off-by: leo <longshuang@msn.cn>
2025-05-08 13:42:21 +08:00
leo
2c8370fa92
refactor: get graph clip width from grid column definition directly
Signed-off-by: leo <longshuang@msn.cn>
2025-05-08 13:39:27 +08:00
leo
008708f07c
ux: use larger font size for commit ref label
Signed-off-by: leo <longshuang@msn.cn>
2025-05-08 13:13:22 +08:00
leo
832fcd7487
fix: offset of commit graph does not look quite right (#1287)
This is because that when using `VirtualizingStackPanel`, the `Bounds.Height` of `ListBoxItem` may not be the same with its `Height` setted in axaml.

Signed-off-by: leo <longshuang@msn.cn>
2025-05-08 12:22:23 +08:00
leo
6df38ad970
ux: new style for inline code in commit subject
Signed-off-by: leo <longshuang@msn.cn>
2025-05-07 20:23:06 +08:00
github-actions[bot]
0a7b973388 doc: Update translation status and sort locale files 2025-05-07 11:08:51 +00:00
Christopher Göttfert
6b050fa557
localization: updated german translations (#1284) 2025-05-07 19:08:39 +08:00
leo
417ab3ecc2
ux: layout for revision compare targets
Signed-off-by: leo <longshuang@msn.cn>
2025-05-07 09:52:26 +08:00
leo
a413df6f89
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2025-05-06 20:56:45 +08:00
leo
ddf643c081
ux: new style for revision/branch compare targets
Signed-off-by: leo <longshuang@msn.cn>
2025-05-06 20:52:43 +08:00
leo
bbc840a5cb
perf: set/update TimeToSort while creating branch nodes
Signed-off-by: leo <longshuang@msn.cn>
2025-05-06 19:26:06 +08:00
github-actions[bot]
c8e21673e4 doc: Update translation status and sort locale files 2025-05-06 10:24:59 +00:00
leo
e45e37d305
feature: supports sort branches by committer date (#1192)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-06 18:24:34 +08:00
github-actions[bot]
b7fa04d141 doc: Update translation status and sort locale files 2025-05-06 07:52:23 +00:00
leo
93a5d7baea
feature: supports to visit remote repository in web browser (#1265)
- combine `Open in File Manager`, `Open in Terminal` and `Open with external editor` into one dropdown menu
- add `Visit $REMOTE in Browser`

Signed-off-by: leo <longshuang@msn.cn>
2025-05-06 15:51:57 +08:00
leo
e4e2f7b3a7
ux: use smaller font size for inline code in commit subject
Signed-off-by: leo <longshuang@msn.cn>
2025-05-06 14:49:54 +08:00
leo
eae6d10784
enhance: only log exception in popup task (#1281)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-06 12:17:48 +08:00
github-actions[bot]
4bc5b90e6b
doc: Update translation status and sort locale files
(cherry picked from commit 15445d02379020144239886bc87380ae38c2018a)
2025-05-06 12:02:19 +08:00
leo
df29edd8f0
feature: make --recurse-submdoules an option while trying to checkout branch with submodules (#1272)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-06 12:01:58 +08:00
leo
054bbf7e0c
enhance: do not override core.autocrlf configure while reading file diff (#1278)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-06 09:39:03 +08:00
leo
ce00fa6c88
Merge branch 'master' into develop 2025-05-06 09:23:20 +08:00
leo
a960e14368
Merge branch 'release/v2025.16' 2025-05-06 09:22:58 +08:00
leo
867edd9453
version: Release 2025.16
Signed-off-by: leo <longshuang@msn.cn>
2025-05-06 09:22:49 +08:00
github-actions[bot]
aee4ce6387 doc: Update translation status and sort locale files 2025-05-06 01:17:55 +00:00
Javier J. Martínez M.
d92d279fbe
localization: update spanish translations (#1279)
add missing translations
2025-05-06 09:17:45 +08:00
github-actions[bot]
5e080279ce doc: Update translation status and sort locale files 2025-05-04 09:36:42 +00:00
AquariusStar
704c6f589d
localization: update and fix translation russian (#1276) 2025-05-04 17:36:30 +08:00
broknecho
666275c747
feature: add Meld as an option for external merge tool on Windows (#1275) 2025-05-04 11:24:11 +08:00
leo
c0c52695a3
code_style: remove unused code
Signed-off-by: leo <longshuang@msn.cn>
2025-05-03 21:31:10 +08:00
Alen Šiljak
c529fab869
feature: close repository configuration dialog when user pressed Esc (#1269) 2025-05-03 21:18:24 +08:00
leo
4b2983b330
fix: commit detail panel is overlapping history when resizing (#1273)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-03 21:09:43 +08:00
leo
8c1d397480
fix: inline blocks is not sorted in order (#1274)
Signed-off-by: leo <longshuang@msn.cn>
2025-05-03 20:52:40 +08:00
leo
007acb3fa6
project: remove unused scripts
Signed-off-by: leo <longshuang@msn.cn>
2025-04-30 21:40:01 +08:00
leo
3b0c57be84
feature: supports to re-order workspaces (#1261)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-30 21:39:03 +08:00
github-actions[bot]
61bc42612e doc: Update translation status and sort locale files 2025-04-30 13:06:53 +00:00
leo
fe677d40c1
feature: supports search commits by change content (#1263)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-30 21:05:53 +08:00
leo
9bde797b24
fix: make sure the new pattern is appended as a new line (#1264)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-30 20:41:00 +08:00
leo
7501588c95
enhance: quit application after main window has been closed
Signed-off-by: leo <longshuang@msn.cn>
2025-04-30 15:03:14 +08:00
leo
80aead3a17
feature: add dirty state indicator icon to repository tab (#1227)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-30 11:01:39 +08:00
leo
847a1e727b
refactor: enable --ignore-cr-at-eol in diff by default
Signed-off-by: leo <longshuang@msn.cn>
2025-04-30 09:26:34 +08:00
leo
98dd37a9bc
localization: update tranlation for Text.Diff.IgnoreWhitespace
This is because that in `git diff` command the `--ignore-all-space` option will also ignore line-ending changes (`--ignore-cr-at-eol`)

Signed-off-by: leo <longshuang@msn.cn>
2025-04-29 22:49:20 +08:00
leo
95ea0a6ba6
ux: Ignore Whitespace and EOL Changes should always be visible (#1260)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-29 22:21:38 +08:00
leo
b9dc5a8164
feature: parse url in commit message (#1133)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-29 18:08:35 +08:00
leo
63803c9b88
feature: show command running time in logs window (#1253)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-29 16:36:05 +08:00
leo
825b74c2a3
refactor: use String.AsSpan(int, int) instead of String.AsSpan().Slice(int, int)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-29 09:44:06 +08:00
qiufengshe
48bb8e91de
perf: minimize temporary strings for better performance (#1255) 2025-04-29 09:33:14 +08:00
leo
53a55467f1
enhance: ignore submodule changes when deal with local changes before pull/checkout/create branch (#1256)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-29 09:27:09 +08:00
leo
5681bf489d
fix: empty dialog when generating commit message with AI (#1257)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-29 09:14:24 +08:00
leo
226bc434f5
ux: make log window resizable (#1253)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-28 16:53:51 +08:00
leo
30d42b11e2
enhance: wait a while after branch changed (#1254)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-28 16:19:40 +08:00
leo
2698427cd0
fix: popup running animation did not update after switch back from another page
Signed-off-by: leo <longshuang@msn.cn>
2025-04-28 11:57:36 +08:00
leo
b4f1f35e67
Merge branch 'master' into develop 2025-04-28 09:17:40 +08:00
leo
92f215d039
Merge branch 'release/v2025.15' 2025-04-28 09:16:44 +08:00
leo
2e1cf76c82
version: Release 2025.15
Signed-off-by: leo <longshuang@msn.cn>
2025-04-28 09:16:37 +08:00
leo
951ea8f088
fix: use subject as context menu item header to fix vertical alignment (#1251)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-27 11:20:44 +08:00
Chiahong
21cb87cec5
localization: update zh_TW.axaml (#1249) 2025-04-27 09:38:28 +08:00
github-actions[bot]
f39048df77 doc: Update translation status and sort locale files 2025-04-27 01:38:20 +00:00
AquariusStar
bbdeecdcc6
locallization: update russian translate (#1248) 2025-04-27 09:38:09 +08:00
leo
d2e688908c
ux: use different inline code background for different themes
Signed-off-by: leo <longshuang@msn.cn>
2025-04-25 21:26:21 +08:00
leo
91acf0a32a
enhance: fore invalidate measure after data context of BisectStateIndicator changed
Signed-off-by: leo <longshuang@msn.cn>
2025-04-25 20:55:11 +08:00
leo
d44d2b9770
ux: use a outer border to hold tooltip of commit message in FileHistories view (#1232)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-25 18:50:56 +08:00
cdammanintopix
f09367a614
fix: Append UserName to the SourceGitIPCChannel NamedPipeServerStream to allow multiple users usage on the same server (#1244) (#1246) 2025-04-25 16:56:28 +08:00
leo
00e56ce9d1
fix: System.NullReferenceException raised after popup stop (success or not) running
Signed-off-by: leo <longshuang@msn.cn>
2025-04-25 15:56:37 +08:00
leo
22d4f26bc3
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2025-04-25 14:31:14 +08:00
leo
a94c7f55ce
ux: remove tips in commit list
Signed-off-by: leo <longshuang@msn.cn>
2025-04-25 13:37:11 +08:00
leo
1d16925e74
enhance: stop render next inline elements when it is out of bounds
Signed-off-by: leo <longshuang@msn.cn>
2025-04-25 13:30:00 +08:00
leo
8c4362a98d
feature: subject presenter supports inline codeblock
Signed-off-by: leo <longshuang@msn.cn>
2025-04-25 13:24:13 +08:00
leo
9efbc7dd7a
localization: update translations for Chinese
Signed-off-by: leo <longshuang@msn.cn>
2025-04-24 10:04:57 +08:00
github-actions[bot]
c519381645 doc: Update translation status and sort locale files 2025-04-24 02:00:26 +00:00
leo
6590812634
localization: update translations for Chinese
Signed-off-by: leo <longshuang@msn.cn>
2025-04-24 10:00:07 +08:00
github-actions[bot]
ad6ed1512b doc: Update translation status and sort locale files 2025-04-24 01:22:43 +00:00
Javier J. Martínez M.
f73e0687a1
localization: update spanish translations (#1241)
add missing translations. `Bisect`/`Bisecting` stays the same because they reference command names.
2025-04-24 09:22:32 +08:00
qiufengshe
ea680782fe
perf: minimize temporary strings for better performance (#1240)
(cherry picked from commit f4dad2bf551ead5640a500297a4a6f408aef1350)
2025-04-23 21:15:58 +08:00
leo
7e282b13fa
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2025-04-23 20:59:39 +08:00
leo
1386ca30e3
fix: typo in conventional commit type (#1239)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-23 20:52:41 +08:00
github-actions[bot]
2107676058 doc: Update translation status and sort locale files 2025-04-23 07:34:37 +00:00
leo
f72f1894c3
feature: supports to enable --ignore-cr-at-eol in diff by default
Signed-off-by: leo <longshuang@msn.cn>
2025-04-23 15:34:21 +08:00
github-actions[bot]
586ff39da1 doc: Update translation status and sort locale files 2025-04-23 02:39:41 +00:00
AquariusStar
9bdbf47522
localization: update russian localization (#1233) 2025-04-23 10:39:30 +08:00
leo
17c08d42a0
enhance: ignore all sub-directories those names start with '.' (#1234)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-23 10:38:01 +08:00
leo
fafa2a53ae
enhance: show commit full message tooltip when hover commit subject in FileHistories view (#1232)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-23 10:33:49 +08:00
leo
7890f7abbf
refactor: use PointerPressed event instead of ListBox.SelectionChanged event to navigate to commit (#1230)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-23 10:17:14 +08:00
leo
345ad06aba
refactor: diff for staged file with --amend enabled (#1231)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-22 19:20:27 +08:00
leo
78f4809875
fix: no changes were displayed when try to amend a commit without parent (branch first commit) (#1231)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-22 19:04:40 +08:00
leo
87ebe3741d
fix: for init-commit, app will crash with COMMIT & PUSH due to local branch has not been updated (#1229)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-22 18:45:14 +08:00
leo
f2000b4a84
enhance: show git log without command itself for git bisect
Signed-off-by: leo <longshuang@msn.cn>
2025-04-22 17:51:55 +08:00
leo
9a6c671a96
refactor: --ignore-cr-at-eol is not necessary when --ignore-all-space is enabled
Signed-off-by: leo <longshuang@msn.cn>
2025-04-22 16:50:46 +08:00
leo
34e0ea3bcb
enhance: raise bisect error manually
Signed-off-by: leo <longshuang@msn.cn>
2025-04-22 16:07:23 +08:00
leo
7be37424e1
fix: modal dialog did not take focus after show (#1225)
Co-authored-by: Gadfly <gadfly@gadfly.vip>
Signed-off-by: leo <longshuang@msn.cn>
2025-04-22 16:02:27 +08:00
github-actions[bot]
a42df87b9c doc: Update translation status and sort locale files 2025-04-22 07:45:38 +00:00
leo
df5294bcb7
feature: git bisect support
Signed-off-by: leo <longshuang@msn.cn>
2025-04-22 15:45:15 +08:00
leo
9eae1eeb81
ux: add InputGesture for hotkeys dialog
Signed-off-by: leo <longshuang@msn.cn>
2025-04-22 11:05:39 +08:00
leo
4c3698b171
feature: use F1 to quick open the Keyboard Shortcuts Reference dialog (#1225)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-22 10:30:19 +08:00
qiufengshe
9f18cbca5b
minimize temporary strings for better performance (#1224)
* minimize temporary strings for better performance

* minimize temporary strings for better performance

(cherry picked from commit c9e6a8d4c2d7b5fe03ee13af0a79c5334c23b1c0)
2025-04-22 10:23:20 +08:00
leo
6882ae069f
enhance: do not show tooltip if the ower window is deactived (#1218)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-22 10:22:02 +08:00
leo
9c53894cb4
ux: add an empty icon if there are no git command logs available
Signed-off-by: leo <longshuang@msn.cn>
2025-04-21 18:48:01 +08:00
leo
06d033464d
code_style: move commit link parser to Models.CommitLink.Get
Signed-off-by: leo <longshuang@msn.cn>
2025-04-21 17:27:07 +08:00
leo
750ca8ec61
refactor: use custom view locator to create new window/dialog (#1216)
Signed-off-by: leo <longshuang@msn.cn>
(cherry picked from commit 3e6f2b25f15b263e2b84922abc5cf6d621d62a83)
2025-04-21 15:32:21 +08:00
leo
86113701f3
Merge branch 'master' into develop 2025-04-21 09:49:51 +08:00
leo
387b68cdfe
Merge branch 'release/v2025.14' 2025-04-21 09:49:02 +08:00
leo
550c108f84
version: Release 2025.14
Signed-off-by: leo <longshuang@msn.cn>
2025-04-21 09:48:52 +08:00
qiufengshe
232482ca92
minimize temporary strings for better performance (#1215)
(cherry picked from commit b4fa80c0939ca198bff8e858a4dc241efd31d558)
2025-04-21 09:44:26 +08:00
heartacker
b4db88a663
chore: update Avalonia package references to version 11.2.8 (#1220) 2025-04-21 09:43:44 +08:00
leo
41416a6bed
refactor: use DataTemplates instead of create NamedHighlightedTextBlock manually for menu item (#1216)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-20 11:05:24 +08:00
leo
5fd074a9b6
refactor: use view locator instead of creating views manually in viewmodels (#1213)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-19 11:14:19 +08:00
leo
413669741d
enhance: ensure sourcegit_rebase_jobs.json only being used when orig-head and onto are both matched
Signed-off-by: leo <longshuang@msn.cn>
2025-04-18 12:49:19 +08:00
leo
75b4a4b294
enhance: record more git command logs
Signed-off-by: leo <longshuang@msn.cn>
2025-04-18 11:29:59 +08:00
leo
d254b557a9
docs: update README.md
Signed-off-by: leo <longshuang@msn.cn>
2025-04-18 10:25:53 +08:00
leo
892f3b8032
code_style: move SourceGit.CommandExtensions to SourceGit.ViewModels.CommandExtensions
Signed-off-by: leo <longshuang@msn.cn>
2025-04-18 10:24:20 +08:00
leo
afe5d4b969
ux: show an icon to draw user's attention to LOCAL CHANGES when there is an in-progress operation (#1210)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-18 09:59:34 +08:00
lwray-renesas
4d31392085
Fixed tooltip
Tooltip for chosing mine was wrong.
Was --theirs when should be --ours.

(cherry picked from commit 26a471933c)
2025-04-18 09:47:31 +08:00
leo
de31d4bad4
ux: layout of git command log item
Signed-off-by: leo <longshuang@msn.cn>
2025-04-17 21:17:54 +08:00
github-actions[bot]
5bd7dd428d doc: Update translation status and sort locale files 2025-04-17 12:04:02 +00:00
leo
4c1a04477e
refactor: enhanced copy commit information context menu (#1209)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-17 20:03:46 +08:00
leo
090b64d68d
refactor: notification popup uses the same text presenter with git command log viewer (#1149)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-17 18:21:55 +08:00
leo
231010abc6
ux: custom style for command line in git command log
Signed-off-by: leo <longshuang@msn.cn>
2025-04-17 17:45:49 +08:00
leo
3358ff9aee
enhance: disable hyper link and email link in git command logs
Signed-off-by: leo <longshuang@msn.cn>
2025-04-17 17:24:56 +08:00
leo
104a3f0bbf
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2025-04-17 16:35:18 +08:00
github-actions[bot]
a06d1183d7 doc: Update translation status and sort locale files 2025-04-17 08:32:08 +00:00
leo
9f493abd1a
enhance: add context menu for selected log
Signed-off-by: leo <longshuang@msn.cn>
2025-04-17 16:31:30 +08:00
github-actions[bot]
349844cf2a doc: Update translation status and sort locale files 2025-04-17 08:07:57 +00:00
leo
021aab8408
enhance: add a button to clear all git command logs
Signed-off-by: leo <longshuang@msn.cn>
2025-04-17 16:07:40 +08:00
leo
c1e31ac4e3
ci: try to remove zlib1g-dev:arm64
Signed-off-by: leo <longshuang@msn.cn>
2025-04-17 15:48:02 +08:00
github-actions[bot]
2a43efde07 doc: Update translation status and sort locale files 2025-04-17 05:34:40 +00:00
Javier J. Martínez M.
33ae6a9989
localization: update spanish translations (#1206)
add missing translations
modify instances of `stagear` with `hacer stage`
2025-04-17 13:34:27 +08:00
leo
0e967ffc8e
fix: pressing Alt+Enter to commit and push in a repository that has no remotes will crash (#1205)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-17 13:30:41 +08:00
github-actions[bot]
c231772298 doc: Update translation status and sort locale files 2025-04-17 05:24:26 +00:00
leo
8b39df32cc
feature: git command logs
Signed-off-by: leo <longshuang@msn.cn>
2025-04-17 13:23:56 +08:00
leo
928a0ad3c5
feature: add wip (work in progress) type (#1200)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-16 19:39:24 +08:00
leo
9606f128e4
enhance: remember commit message when exiting (#1166)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-16 16:36:23 +08:00
leo
67255a5529
ux: reduce combobox item height
Signed-off-by: leo <longshuang@msn.cn>
2025-04-16 15:42:44 +08:00
leo
cac4b7edf6
enhance: conventional commit message helper (#1200)
- add `build`, `ci`, `pref`
- re-design helper dialog

Signed-off-by: leo <longshuang@msn.cn>
2025-04-16 15:40:26 +08:00
leo
fa44fa773c
ux: re-design welcome (repositories manager) page (#1202)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-16 11:54:50 +08:00
leo
db46de0261
enhance: append character U+26D4 to line when \ No newline at end of file is found in git diff output (#1197)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-16 11:41:40 +08:00
leo
e9036b5fb9
ux: re-design commit message input box
Signed-off-by: leo <longshuang@msn.cn>
2025-04-16 10:22:54 +08:00
leo
9ba0b595d9
enhance: remember the last state of Ignore Whitespace Change and EOF in text diff view (#1198)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 17:58:26 +08:00
github-actions[bot]
cf763b47c6 doc: Update translation status and sort locale files 2025-04-15 09:47:30 +00:00
leo
539d3f6eca
ux: re-design commit message input box (#1169)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 17:47:12 +08:00
leo
03216fc31e
code_style: run dotnet format and re-order codes
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 16:30:50 +08:00
leo
3cc463d24b
enhance: use Environment.Exit(0) instead of IClassicDesktopStyleApplicationLifetime.Shutdown to stop for non-first instance of SourceGit
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 16:24:48 +08:00
leo
33a463ce59
feature: allow to view contribution chart based on selected author (#1196)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 16:08:38 +08:00
leo
90b37663ed
refactor: use lock file instead of named mutex since the second one may not work on other platforms
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 14:36:12 +08:00
leo
9ebde1943e
project: downgrade AvaloniaUI to 11.2.6 to fix duplicated characters when input to textbox (#1195)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 11:15:13 +08:00
leo
be3f418680
fix: no diff content shows with new files (#1193)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 11:03:34 +08:00
leo
a97f163860
readme: update translation tips
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 10:53:53 +08:00
github-actions[bot]
c1839199ee doc: Update translation status and sort locale files 2025-04-15 02:42:33 +00:00
leo
7d5ffaf867
code_style: keep all translations ordered by key
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 10:42:16 +08:00
github-actions[bot]
f0d4cfc9f9 doc: Update translation status and sort locale files 2025-04-15 02:30:43 +00:00
Oleksii Borovyk
70494485ab
Added ukrainian translation (#1191)
(cherry picked from commit b40bfeb98f35da080a1b3935e801e422858faf14)
2025-04-15 10:30:24 +08:00
leo
c4c04b8b01
enhance: bring window into view after receive IPC message
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 10:19:57 +08:00
leo
e2da44c8fd
enhance: use Mutex to force running SourceGit in singleton mode
Signed-off-by: leo <longshuang@msn.cn>
2025-04-15 09:35:16 +08:00
leo
0acbe3e487
enhance: use PipeOptions.FirstPipeInstance to create NamedPipeServerStream
Signed-off-by: leo <longshuang@msn.cn>
2025-04-14 23:55:42 +08:00
leo
05982e6dc0
style: re-design style for disabled primary button
Signed-off-by: leo <longshuang@msn.cn>
2025-04-14 23:23:40 +08:00
leo
e5dc211c35
refactor: simpfy IPC code
Signed-off-by: leo <longshuang@msn.cn>
2025-04-14 23:17:04 +08:00
Gadfly
1e0fd63543
localization: add translation sorting and formatting (#1186)
* doc: Update translation status and missing keys

* localization: add translation sorting and formatting

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-14 22:07:24 +08:00
Gadfly
3b1018e0e2
fix: update visible staged changes retrieval in WorkingCopy (#1187)
* doc: Update translation status and missing keys

* fix: update visible staged changes retrieval in WorkingCopy

* fix: prevent unintended amend behavior when changing current branch

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-14 22:05:05 +08:00
leo
7d20f97f4e
code_review: PR #1185
- make `SourceGit` running in singleton mode
- `TrySendArgsToExistingInstance` should not be called before `BuildAvaloniaApp().StartWithClassicDesktopLifetime(args)` since we may want to launch `SourceGit` as a core editor.
- avoid `preference.json` to be saved by multiple instances.
- move IPC code to models.

Signed-off-by: leo <longshuang@msn.cn>
2025-04-14 22:03:51 +08:00
Massimo
09c0edef8e
feat: implement IPC for opening repositories in new tabs (#1185)
* refactor: improve diff handling for EOL changes and enhance text diff display

- Updated `Diff.cs` to streamline whitespace handling in diff arguments.
- Enhanced `DiffContext.cs` to check for EOL changes when old and new hashes differ, creating a text diff if necessary.
- Added support for showing end-of-line symbols in `TextDiffView.axaml.cs` options.

* localization: update translations to include EOF handling in ignore whitespace messages

- Modified the ignore whitespace text in multiple language files to specify that EOF changes are also ignored.
- Ensured consistency across all localization files for the patch application feature.

* revert: Typo in DiffResult comment

* revert: update diff arguments to ignore CR at EOL in whitespace handling (like before changes)

* revert: update translations to remove EOF references in Text.Apply.IgnoreWS and fixed typo in Text.Diff.IgnoreWhitespace (EOF => EOL)

* feat: add workspace-specific default clone directory functionality

- Implemented logic in Clone.cs to set ParentFolder based on the active workspace's DefaultCloneDir if available, falling back to the global GitDefaultCloneDir.
- Added DefaultCloneDir property to Workspace.cs to store the default clone directory for each workspace.
- Updated ConfigureWorkspace.axaml to include a TextBox and Button for setting the DefaultCloneDir in the UI.
- Implemented folder selection functionality in ConfigureWorkspace.axaml.cs to allow users to choose a directory for cloning.
- This closes issue #1145

* feat: implement IPC for opening repositories in new tabs

- Added functionality to send repository paths to an existing instance of the application using named pipes.
- Introduced a new preference option to open repositories in a new tab instead of a new window.
- Updated UI to include a checkbox for the new preference.
- Enhanced the handling of IPC server lifecycle based on the new preference setting.
- This closes issue #1184

---------

Co-authored-by: mpagani <massimo.pagani@unitec-group.com>
2025-04-14 19:16:15 +08:00
github-actions[bot]
558eb7c9ac doc: Update translation status and missing keys 2025-04-14 09:03:23 +00:00
leo
b7aa49403b
code_review: PR #1183
- code style in `Clone` constructor
- re-design workspace configuration dialog

Signed-off-by: leo <longshuang@msn.cn>
2025-04-14 17:03:08 +08:00
Massimo
f14a666091
feat: add workspace-specific default clone directory functionality (#1183)
* refactor: improve diff handling for EOL changes and enhance text diff display

- Updated `Diff.cs` to streamline whitespace handling in diff arguments.
- Enhanced `DiffContext.cs` to check for EOL changes when old and new hashes differ, creating a text diff if necessary.
- Added support for showing end-of-line symbols in `TextDiffView.axaml.cs` options.

* localization: update translations to include EOF handling in ignore whitespace messages

- Modified the ignore whitespace text in multiple language files to specify that EOF changes are also ignored.
- Ensured consistency across all localization files for the patch application feature.

* revert: Typo in DiffResult comment

* revert: update diff arguments to ignore CR at EOL in whitespace handling (like before changes)

* revert: update translations to remove EOF references in Text.Apply.IgnoreWS and fixed typo in Text.Diff.IgnoreWhitespace (EOF => EOL)

* feat: add workspace-specific default clone directory functionality

- Implemented logic in Clone.cs to set ParentFolder based on the active workspace's DefaultCloneDir if available, falling back to the global GitDefaultCloneDir.
- Added DefaultCloneDir property to Workspace.cs to store the default clone directory for each workspace.
- Updated ConfigureWorkspace.axaml to include a TextBox and Button for setting the DefaultCloneDir in the UI.
- Implemented folder selection functionality in ConfigureWorkspace.axaml.cs to allow users to choose a directory for cloning.
- This closes issue #1145

---------

Co-authored-by: mpagani <massimo.pagani@unitec-group.com>
2025-04-14 16:41:34 +08:00
leo
e89dbd8f43
code_review: PR #1177
- use `Command.ReadToEnd` instead of `Command.Exec` to avoid git trims line endings.
- use `StringBuilder.Append('\n')` instead of `StringBuilder.AppendLine()` to restore original line endings (we split the original diff output by `\n` not `\r')
- there's no need to show file content (the `StreamReader.ReadLine()` will trim line endings)

Signed-off-by: leo <longshuang@msn.cn>
2025-04-14 16:06:52 +08:00
Massimo
81820e7034
refactor: improve diff handling for EOL changes and enhance text diff… (#1177)
* refactor: improve diff handling for EOL changes and enhance text diff display

- Updated `Diff.cs` to streamline whitespace handling in diff arguments.
- Enhanced `DiffContext.cs` to check for EOL changes when old and new hashes differ, creating a text diff if necessary.
- Added support for showing end-of-line symbols in `TextDiffView.axaml.cs` options.

* localization: update translations to include EOF handling in ignore whitespace messages

- Modified the ignore whitespace text in multiple language files to specify that EOF changes are also ignored.
- Ensured consistency across all localization files for the patch application feature.

* revert: Typo in DiffResult comment

* revert: update diff arguments to ignore CR at EOL in whitespace handling (like before changes)

* revert: update translations to remove EOF references in Text.Apply.IgnoreWS and fixed typo in Text.Diff.IgnoreWhitespace (EOF => EOL)

---------

Co-authored-by: mpagani <massimo.pagani@unitec-group.com>
2025-04-14 15:18:45 +08:00
leo
e7f0217a7b
refactor: move binding for ToolTip.IsOpen from code to axaml
Signed-off-by: leo <longshuang@msn.cn>
2025-04-14 11:51:40 +08:00
leo
0cb2ca78fe
code_review: PR #1180
- replace `SetNeedNavigateToUpstreamHead` with `NavigateToBranchDelayed`
- navigate to current HEAD instead of original source HEAD after merge

Signed-off-by: leo <longshuang@msn.cn>
2025-04-14 11:35:50 +08:00
Gadfly
17cf402c78
enhance: navigate to upstream head after fetch, pull, and merge (#1180) 2025-04-14 10:42:34 +08:00
leo
245de9b458
fix: tooltip did not hide after pointer move out (#1178)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-14 10:40:24 +08:00
leo
e76328ff38
Merge branch 'master' into develop 2025-04-14 09:56:48 +08:00
leo
61a1b130f2
Merge branch 'release/v2025.13' 2025-04-14 09:55:55 +08:00
leo
69d8d963ea
version: Release 2025.13
Signed-off-by: leo <longshuang@msn.cn>
2025-04-14 09:55:49 +08:00
leo
48835ca043
project: upgrade AvaloniaUI to 11.2.7
Signed-off-by: leo <longshuang@msn.cn>
2025-04-14 09:53:59 +08:00
github-actions[bot]
241f92a290 doc: Update translation status and missing keys 2025-04-14 01:47:39 +00:00
AquariusStar
12b1204809
update russian localization (#1181) 2025-04-14 09:47:23 +08:00
leo
cd5a682194
refactor: directly use --exclude=HEAD instead of --exclude=HEA[D]
Signed-off-by: leo <longshuang@msn.cn>
2025-04-11 15:44:02 +08:00
leo
18888de081
refactor: rewrite histories filter to support ref name that contains non-ascii characters (#1175)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-11 15:39:51 +08:00
github-actions[bot]
13af0a43ed doc: Update translation status and missing keys 2025-04-11 04:31:25 +00:00
leo
af350c2fcd
code_review: PR #1174
- keeps all keys in locale files in order
- add தமிழ் (Tamil)

Signed-off-by: leo <longshuang@msn.cn>
2025-04-11 12:31:09 +08:00
தமிழ் நேரம்
accccb5ea3
தமிழ் (Tamil) translation file added (#1174)
* Tamil file added

220

* 0

* Tamil file added

220

0

(cherry picked from commit 355db34db382d17e0b8f0bb6f05b8e2e2f2963d9)
2025-04-11 12:22:48 +08:00
github-actions[bot]
cfabfb7368 doc: Update translation status and missing keys 2025-04-11 02:02:56 +00:00
leo
1799de4907
code_review: PR #1173
- rename c-style `file_arg` to `fileArg`
- add missing translations for zh_CN and zh_TW
- re-design conflict view and add tooltip for `USE THEIRS` and `USE MINE`
- re-order unstaged toolbar buttons

Signed-off-by: leo <longshuang@msn.cn>
2025-04-11 10:02:33 +08:00
github-actions[bot]
a99ab37797 doc: Update translation status and missing keys 2025-04-11 01:33:18 +00:00
Göran W
47824dc27a
Add button for running external mergetool on ALL conflicts (#1173)
* Make a few non-translated strings localizable (in Conflict view)

* Add button and wiring to run mergetool on all conflicts

* Corrected spelling and wording in related code and exception msg
2025-04-11 09:33:07 +08:00
leo
3b18ee0b37
code_style: remove unused code
Signed-off-by: leo <longshuang@msn.cn>
2025-04-08 20:20:20 +08:00
github-actions[bot]
5d90c2ed60 doc: Update translation status and missing keys 2025-04-08 12:06:21 +00:00
leo
768b324356
ux: if there are no local changes, show different confirm message (#1143)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-08 20:06:00 +08:00
github-actions[bot]
8b5f491e34 doc: Update translation status and missing keys 2025-04-08 12:01:06 +00:00
leo
506af95963
enhance: new confirm empty commit dialog (#1143)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-08 20:00:42 +08:00
leo
898a8bc69a
ux: resize confirm commit dialog
Signed-off-by: leo <longshuang@msn.cn>
2025-04-08 18:05:53 +08:00
leo
da38b72ee5
ux: disable commit button when commit message is empty
Signed-off-by: leo <longshuang@msn.cn>
2025-04-08 18:03:40 +08:00
leo
7cda7211f1
refactor: statistics dialog
- use `%aN+%aE` instead of `%aN` to get commit author
- show user avatar in statistics dialog

Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 21:20:59 +08:00
Göran W
1555abd027
Added new ExternalMerger - Plastic SCM (#1162)
Motivation:
https://m-pixel.com/how-to-use-plastic-scms-merge-tool-with-p4v/
2025-04-07 20:22:53 +08:00
github-actions[bot]
7fedef396f doc: Update translation status and missing keys 2025-04-07 12:19:19 +00:00
leo
2c5ee4fa99
localization: add keys deleted by sorter tools back
Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 20:19:00 +08:00
github-actions[bot]
f29402ceec doc: Update translation status and missing keys 2025-04-07 12:05:43 +00:00
leo
f5c213060e
localization: keep all keys in order and remove duplicated keys in fr_FR (#1161)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 20:05:24 +08:00
leo
3275dd07d2
enhance: auto stash and re-apply local changes before squashing (#1141)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 16:04:10 +08:00
github-actions[bot]
67fb0b300f doc: Update translation status and missing keys 2025-04-07 06:43:08 +00:00
leo
3049730dd5
feature: add Preferred Merge Mode in repository configure (#1156)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 14:42:46 +08:00
leo
ad9021e892
enhance: allow using + character in branch name (#1152)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 14:07:58 +08:00
leo
39f7f119dd
doc: always show current translation status in develop branch
Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 12:06:06 +08:00
leo
3431ed4bab
Merge branch 'master' into develop 2025-04-07 12:02:24 +08:00
leo
f3d99d64bf
Merge branch 'release/v2025.12' 2025-04-07 12:00:59 +08:00
leo
b65c697e5b
version: Release 2025.12
Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 12:00:45 +08:00
github-actions[bot]
48f8b6116a doc: Update translation status and missing keys 2025-04-07 03:48:59 +00:00
leo
fa02c65da5
code_review: PR #1153
- use a single filter for both unstage and staged files
- show confirm dialog if staged files are displayed partially

Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 11:48:38 +08:00
Göran W
a37c6b29ec
In Local Changes, added filter-box in Staged area, to match Unstaged area (#1153)
Also added minimal handling (RaiseException) if trying to commit with active filter (might commit more changes than visible, so disallow).
Minor unification in unstageChanges() to make it more similar to StageChanges().
2025-04-07 10:37:58 +08:00
leo
ac7b02590b
enhance: add comma between date and time (#1150)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 10:23:37 +08:00
leo
8c9cf05c1d
fix: renamed files are missing in commit changes and stash changes (#1151)
Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 10:14:02 +08:00
leo
c615d04038
doc: update README.md for Japanese support
Signed-off-by: leo <longshuang@msn.cn>
2025-04-07 09:54:48 +08:00
github-actions[bot]
17d285d9bf doc: Update translation status and missing keys 2025-04-07 01:53:35 +00:00
Sousi Omine
ef106e6909
Add Japanese localization (#1157)
* Initial Japanese translation

Only a small part was translated

* Unspecified words will be in English

When new words are added, they will be displayed in English even if Japanese support is delayed.

* Expanded translation scope

* Expanded translation scope

* Proceed with translation with a focus on overall settings

* Re-translated the outdated settings screen

* Add items that only exist in the latest en_US and remove items that do not exist in en_US

* A lot of translation work done

* A lot more translation work has been done

* ja_JP.axaml has been translated into Japanese

* Fixed three incomplete parts of the Japanese translation
2025-04-07 09:53:20 +08:00
github-actions[bot]
cbc7079e59 doc: Update translation status and missing keys 2025-04-07 01:45:21 +00:00
UchiTesting
904432a8f1
style(locale): Add a few translations to the French locale (#1158) 2025-04-07 09:45:02 +08:00
github-actions[bot]
7ef4cca1f5 doc: Update translation status and missing keys 2025-04-02 09:20:43 +00:00
Javier J. Martínez M.
2deb79f8ce
localization: update spanish translations (#1142)
add literal translation for 'CopyFullPath' string
2025-04-02 17:20:33 +08:00
leo
8e55ba1b47
enhance: avoid unhandled exceptions in timer
Signed-off-by: leo <longshuang@msn.cn>
2025-03-31 19:06:10 +08:00
leo
55be1ad1ca
Merge branch 'master' into develop 2025-03-31 09:30:56 +08:00
leo
1138ba304d
Merge branch 'release/2025.11' 2025-03-31 09:30:18 +08:00
leo
ae5fa6a793
version: Release 2025.11
Signed-off-by: leo <longshuang@msn.cn>
2025-03-31 09:29:56 +08:00
leo
0045e06d78
project: upgrade AvaloniaUI to 11.2.6
Signed-off-by: leo <longshuang@msn.cn>
2025-03-31 09:29:07 +08:00
qiufengshe
07d99f5fd2
enhance: get email hash code opimization (#1137)
(cherry picked from commit 839b92a284d6b103894f6a8a39e5ce1f99bb12fa)
2025-03-31 09:22:57 +08:00
github-actions[bot]
9ee3a00fba doc: Update translation status and missing keys 2025-03-31 01:21:15 +00:00
AquariusStar
1482a005bb
localization: update and fix translation russian (#1136) 2025-03-31 09:20:54 +08:00
github-actions[bot]
ce7196490a doc: Update translation status and missing keys 2025-03-28 10:02:16 +00:00
leo
276d000bcf
refactor: change Copy File Name to Copy Full Path for selected file or change (#1132)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-28 18:01:53 +08:00
github-actions[bot]
b26c8a64ad doc: Update translation status and missing keys 2025-03-28 04:20:55 +00:00
leo
56ebc182f2
enhance: try to reinstate not onl the working tree's change, but also the index's ones (#1135)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-28 12:20:36 +08:00
Gadfly
1575ae977e
fix: improve font family name handling by collapsing multiple spaces (#1131) 2025-03-27 20:22:46 +08:00
Gadfly
4153eec1a8
chore: Update DEB package configuration with installed size (#1130) 2025-03-26 12:15:15 +08:00
github-actions[bot]
fc37677546 doc: Update translation status and missing keys 2025-03-26 01:30:58 +00:00
leo
4fb853d1fd
localization: add translation Text.Configure.IssueTracker.AddSampleAzure for Chinese (#1128)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-26 09:30:41 +08:00
github-actions[bot]
dccf53e518 doc: Update translation status and missing keys 2025-03-26 01:27:21 +00:00
Iacopo Sbalchiero
ca0fb7ae10
Adding template for Azure DevOps workitems (#1128)
* feat: add Azure DevOps issue tracker integration

* localization: add Azure DevOps sample rule to issue tracker in multiple languages
2025-03-26 09:27:10 +08:00
leo
f37ac904b9
enhance: do not create crash log for unobserved task exceptions (#1121)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-25 10:33:39 +08:00
github-actions[bot]
467089aec5 doc: Update translation status and missing keys 2025-03-25 01:51:33 +00:00
Javier J. Martínez M.
380e6713b5
localization: update spanish translations (#1124) 2025-03-25 09:51:22 +08:00
leo
fc85dd3269
enhance: improve Repository.Open() performance (#1121)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-24 19:37:39 +08:00
leo
0a877c6730
project: upgrade OpenAI and Azure.AI.OpenAI to 2.2.0-beta.4
Signed-off-by: leo <longshuang@msn.cn>
2025-03-24 10:03:27 +08:00
leo
166c925eee
Merge branch 'master' into develop 2025-03-24 09:45:30 +08:00
leo
7581d761cc
Merge branch 'release/v2025.10' 2025-03-24 09:44:50 +08:00
leo
88bb603dc9
version: Release 2025.10
Signed-off-by: leo <longshuang@msn.cn>
2025-03-24 09:44:41 +08:00
leo
d335cac167
enhance: only raise BlockNavigationChangedEvent when UseBlockNavigation enabled
Signed-off-by: leo <longshuang@msn.cn>
2025-03-21 18:00:46 +08:00
leo
9590f96a44
enhance: clear highlight chunk while scrolling out of TextArea.TextView
Signed-off-by: leo <longshuang@msn.cn>
2025-03-21 17:46:11 +08:00
leo
03f49ccff0
refactor: text diff view block navigation
Signed-off-by: leo <longshuang@msn.cn>
2025-03-21 17:35:59 +08:00
leo
39f4cd1732
ci: move all translation status to TRANSLATION.md and do not modify README.md while checking localization
Signed-off-by: leo <longshuang@msn.cn>
2025-03-21 10:54:47 +08:00
leo
cdc0fbb753
doc: update README.md
Signed-off-by: leo <longshuang@msn.cn>
2025-03-21 10:23:52 +08:00
leo
8c1e1a3e6a
fix: text diff view scrolling issue introduced by AvaloniaEdit 11.2.0 (commit 7caa03a09b)
- `SyncScrollOffset` does not update in `side-by-side` mode while scrolling
- Highlighted chunk is not cleared when scroll by drag scrollbar

Signed-off-by: leo <longshuang@msn.cn>
2025-03-21 10:09:43 +08:00
github-actions[bot]
56253e95c3 doc: Update translation status and missing keys 2025-03-21 01:31:07 +00:00
Ilian Delagrange
5467703a6e
localization: add missing french translations (#1113)
Co-authored-by: Ilian Delagrange <ilian@MacBook-Air-de-Ilian.local>
2025-03-21 09:30:57 +08:00
leo
7cd5814410
enhance: better regex for output of Commands.CompareRevisions
Signed-off-by: leo <longshuang@msn.cn>
2025-03-20 21:18:51 +08:00
leo
38d87fa1a1
feature: use git stash show -u --name-status <stash_name> command to query changes in selected stash if git >= 2.32.0
Signed-off-by: leo <longshuang@msn.cn>
2025-03-20 21:12:08 +08:00
leo
65dbfd336d
refactor: it's not necessary to store untracked file list for selected stash
Signed-off-by: leo <longshuang@msn.cn>
2025-03-20 20:53:30 +08:00
leo
891e1b2ec8
ux: show name of stash instead of SHA which is useless to user
Signed-off-by: leo <longshuang@msn.cn>
2025-03-20 19:56:06 +08:00
github-actions[bot]
c349ac10f3 doc: Update translation status and missing keys 2025-03-20 03:11:14 +00:00
leo
145273b4a7
refactor: move Show tags in commit graph to Preferences (#1109)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-20 11:10:48 +08:00
leo
a5bdcab341
code_style: move dynamic context menu creation to view models
Signed-off-by: leo <longshuang@msn.cn>
2025-03-20 09:38:02 +08:00
github-actions[bot]
673b335a2a doc: Update translation status and missing keys 2025-03-20 01:14:21 +00:00
AquariusStar
f7197e08eb
localization: update russian localization (#1111) 2025-03-20 09:14:07 +08:00
github-actions[bot]
f02a7b9858 doc: Update translation status and missing keys 2025-03-18 13:40:50 +00:00
leo
2512d3be7a
feature: allow to hide tags in graph (#1109)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-18 21:40:31 +08:00
leo
ae1e46b586
fix: layout horizontal not working since 2025.9 after switching away from history screen (#1108)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-18 19:47:54 +08:00
leo
822452a20c
enhance: show inner exception message if possible when check update failed
Signed-off-by: leo <longshuang@msn.cn>
2025-03-18 15:55:32 +08:00
leo
760e44877b
fix: wrong split char
Signed-off-by: leo <longshuang@msn.cn>
2025-03-18 12:15:00 +08:00
leo
695db2a319
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 20:57:18 +08:00
leo
8d47bd5cd9
refactor: use --format=<format> instead of --pretty=format:<format>
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 20:46:01 +08:00
leo
808302ce84
code_review: PR #1106
- Use new syntex `[...]` instead of `new char[] {...}` to create char arrays
- Use `string.ReplaceLineEndings('\n').Split('\n')` instead of `string.Split(['\n', '\r'], StringSplitOptions.RemoveEmptyEntries)` because that the `Signer` part may be missing

Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 20:35:31 +08:00
Gadfly
b930066b5a
fix: improve line splitting to handle both LF and CRLF line endings (#1106) 2025-03-17 19:59:28 +08:00
leo
a0cddaea80
feature: support --ff-only option for git merge command
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 19:53:47 +08:00
github-actions[bot]
2b95ea2ab1 doc: Update translation status and missing keys 2025-03-17 09:15:30 +00:00
Leonardo
c9fe373dda
add missing key and fix untranslated one (#1104) 2025-03-17 17:15:17 +08:00
leo
398b14695c
enhance: the git dir of worktree's owner repository may not named .git
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 17:10:59 +08:00
github-actions[bot]
5845ef3eb6 doc: Update translation status and missing keys 2025-03-17 09:06:42 +00:00
leo
3e8bba0d0b
ux: re-design About page
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 17:06:26 +08:00
leo
7031693489
refactor: pass dirs to watcher directly
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 16:30:16 +08:00
leo
b4ab4afd3a
code_review: PR #1103
Since we only use `$GIT_COMMON_DIR` in filesystem watcher, it is unnecessary to store this value in `Repository`, and we can query the `$GIT_COMMON_DIR` only when it looks like a worktree

Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 16:19:59 +08:00
Gadfly
cea8a90680
refactor: use $GIT_COMMON_DIR instead of cut $GIT_DIR/worktrees (#1103) 2025-03-17 15:56:13 +08:00
github-actions[bot]
265aaa1d67 doc: Update translation status and missing keys 2025-03-17 07:30:48 +00:00
leo
cdd1926e2f
refactor: rewrite git apply implementation
- Do not translate commandline options for `git`
- Re-design combox layout for `git apply` popup

Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 15:30:32 +08:00
leo
ddfc868df3
ux: re-design merge option style
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 15:08:49 +08:00
leo
10fd0f9d15
doc: fix typo
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 12:02:32 +08:00
leo
99a45335fe
doc: group third-party components by types
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 12:01:29 +08:00
leo
8f8385072c
doc: add third-party components
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 11:56:38 +08:00
Gadfly
a480ba0139
docs: Add third-party components and licenses section
(cherry picked from commit 95c697248755f7b6de4d2d0bfdaa9de1e572c9f6)
2025-03-17 11:47:51 +08:00
Gadfly
4b41029768
fix: use better JSP grammar file and add licensing information (#1102) 2025-03-17 11:31:50 +08:00
leo
6273c01d71
fix: git rev-list raises errors after selected commit in Histories page (#1101)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 10:55:54 +08:00
Gadfly
450dadf76c
feat: Add JSP grammar support and improve TextMateHelper file type handling (#1100)
- Extend grammar support by allowing multiple file extensions per grammar and adding JSP file type handling.
- Add a new JSON grammar file for JavaServer Pages (JSP) syntax highlighting.
2025-03-17 10:12:44 +08:00
leo
7caa03a09b
project: upgrade AvaloniaEdit to 11.2.0
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 09:57:52 +08:00
leo
d9cf849b9f
Merge branch 'master' into develop 2025-03-17 09:38:30 +08:00
leo
6fd6bbb6b5
Merge branch 'release/v2025.09' 2025-03-17 09:37:49 +08:00
leo
34f8618989
version: Release 2025.09
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 09:37:40 +08:00
leo
84979b20b3
ux: force using VertialAlignment="Center" for sign info of commit (#1098)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-17 09:32:31 +08:00
Gadfly
66517fd4bf
enhance: add tooltips to various UI elements for better accessibility (#1097)
* enhance: add tooltips to various UI elements for better accessibility

* refactor: simplify user string conversion
2025-03-16 11:23:42 +08:00
github-actions[bot]
a46e52582f doc: Update translation status and missing keys 2025-03-14 08:57:15 +00:00
Asurada
db504241ea
feat: add translation for "1 hour ago" in multiple languages (#1096) 2025-03-14 16:57:03 +08:00
leo
c3e1fb93b6
refactor: fix maxOS PATH env
Signed-off-by: leo <longshuang@msn.cn>
2025-03-14 10:54:09 +08:00
leo
c8bee2f6ba
code_review: PR #1093
Merge deleting branch and tag on remote into `SourceGit.Commands.Push(repo, remote, refname, isDelete)`

Signed-off-by: leo <longshuang@msn.cn>
2025-03-14 09:36:34 +08:00
Michael Pakhantsov
9645b65db6
Explicitly provided fully qualified reference for the git branch, becase can be exists a tag and a branch with identical names (#1093)
Fix push command for branch deletion

Updated the `push` command to use `--delete refs/heads/{name}` instead of `--delete {name}` for clearer branch reference when deleting a remote branch.

Co-authored-by: Michael Pakhantsov <michae.pakhantsov@gmail.com>
2025-03-14 09:26:59 +08:00
leo
67f4330dd4
code_style: arrange methods in App.axaml.cs
Signed-off-by: leo <longshuang@msn.cn>
2025-03-13 15:23:43 +08:00
leo
9560496c7b
code_review: PR #1092
- Remove `SourceGit.ViewModels.Preference.FixFontFamilyName` (it is not necessary any more)
- Use `string.Join` instead of `StringBuilder` to make the logic more clear

Signed-off-by: leo <longshuang@msn.cn>
2025-03-13 15:17:20 +08:00
Gadfly
b9b684a83d
fix: improve font string processing in SetFonts method (#1092) 2025-03-13 15:05:30 +08:00
github-actions[bot]
519bdf1ddc doc: Update translation status and missing keys 2025-03-13 02:22:09 +00:00
leo
0e261cffd2
refactor: rewrite the way to deal with uncommitted local changes when checkout/pull/create branch (#1085)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-13 10:21:54 +08:00
leo
e430e847ff
enhance: auto convert spaces with dashes while renaming a branch (#1088)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-13 09:50:42 +08:00
Gadfly
7331167be2
fix: schedule DWM frame extension to next render frame on Windows 10 (#1087)
The DwmExtendFrameIntoClientArea call needs to be posted to the next render frame to ensure the window handle is fully initialized and avoid potential race conditions.
2025-03-13 09:38:08 +08:00
Morgan Courbet
f07832c385
docs: fix typo in README.md
(cherry picked from commit 59fd2aaab1)
2025-03-13 09:24:43 +08:00
leo
e4f5c34e0c
code_style: remove whitespaces
Signed-off-by: leo <longshuang@msn.cn>
2025-03-12 17:58:57 +08:00
leo
eaa322dfab
enhance: re-design commit search result display (#1083)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-12 17:57:31 +08:00
leo
77d8afe056
refactor: reduce the times to call RefreshLayout
Signed-off-by: leo <longshuang@msn.cn>
2025-03-12 15:10:43 +08:00
leo
0476a825ef
code_style: move some code from Histories.axaml to separate files
Signed-off-by: leo <longshuang@msn.cn>
2025-03-12 14:58:59 +08:00
leo
bb2284c4c9
refactor: re-write commit searching (part 3)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-12 11:53:24 +08:00
leo
ee7ccc0391
refactor: re-write commit searching (part 2)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-12 11:05:19 +08:00
leo
231f3bf668
enhance: use --ancestry-path=<commit_oid> to reduce unnecessary outpus while querying children commits
Signed-off-by: leo <longshuang@msn.cn>
2025-03-12 10:11:00 +08:00
leo
f5d6e1264d
refactor: use List<T> instead of AvaloniaList<T> since it is not used for bindings
Signed-off-by: leo <longshuang@msn.cn>
2025-03-11 23:01:34 +08:00
leo
64a41dce39
refactor: rewrite searching commit by file path
Signed-off-by: leo <longshuang@msn.cn>
2025-03-11 20:55:39 +08:00
leo
fa4d9d24e9
enhance: hide suggestion popups when window is deactived (#963)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-11 20:22:32 +08:00
leo
91c5c96afc
fix: accessing dummy in multi-threads throws exception
Signed-off-by: leo <longshuang@msn.cn>
2025-03-11 20:05:34 +08:00
leo
2fc03025ee
fix: file suggestion popup did not show while searching commit by file path
Signed-off-by: leo <longshuang@msn.cn>
2025-03-11 19:52:50 +08:00
leo
471452646b
refactor: use System.Threading.CancellationToken instead of SourceGit.Commands.Command.CancelToken to cancel fetching information of selected commit
Signed-off-by: leo <longshuang@msn.cn>
2025-03-11 16:53:51 +08:00
leo
f23e3478e6
fix: do not save preference in design mode
Signed-off-by: leo <longshuang@msn.cn>
2025-03-11 11:41:37 +08:00
leo
54d49a9eda
fix: app crashes when close a repository on read-only drive (#1080)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-11 09:36:13 +08:00
leo
5f2bd8ad94
ux: layout for Preferences window
Signed-off-by: leo <longshuang@msn.cn>
2025-03-11 09:27:32 +08:00
leo
f54c8877d7
Merge pull request #1079 from AquariusStar/develop_translation_russian
update russian localization
2025-03-11 09:21:20 +08:00
Михаил Усоцкий
f496d15f70 update russian localization 2025-03-10 20:15:29 +03:00
leo
cf8cff6b64
code_style: add ViewModels.Repository.GetCustomAction(scope)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-10 21:30:04 +08:00
leo
5c279b4b56
feature: add global configuration for custom action (#1077)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-10 21:19:38 +08:00
leo
0f9087fac6
code_review: PR #1078
- Remove `ForceEnglishLocale` because we want all `git` outputs in English
- Remove locale settings for `ExecuteCustomAction`

Signed-off-by: leo <longshuang@msn.cn>
2025-03-10 20:08:42 +08:00
Gadfly
860f52153b
fix: Force English locale in branch query command. (#1078) 2025-03-10 20:05:37 +08:00
leo
b4fbc2372b
enhance: show commit info tip when hover SHA in conflict view
Signed-off-by: leo <longshuang@msn.cn>
2025-03-10 20:02:09 +08:00
leo
2b2f070c4a
enhance: use --no-optional-locks parameter for git status command
Signed-off-by: leo <longshuang@msn.cn>
2025-03-10 18:29:11 +08:00
leo
e65cb50495
fix: use \ as path delim on Windows when executing custom actions (#1077)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-10 17:48:02 +08:00
Gadfly
cdae9168ed
ci(windows): maintain SourceGit folder structure (#1076) 2025-03-10 15:44:39 +08:00
leo
2e51e8939b
Merge branch 'master' into develop 2025-03-10 12:34:34 +08:00
leo
e3cc987682
Merge branch 'develop' 2025-03-10 12:33:20 +08:00
Gadfly
c1c0e7b2a0
enhance: Save Preferences after switched Workspace and closed Preferences (#1073) 2025-03-10 12:04:19 +08:00
leo
df6cbcaa28
fix: app crashed after enable Show children in the commit details (#1072)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-10 11:33:38 +08:00
leo
855466686d
ux: show conflict sources when it comes from a stash or patch (#1067)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-10 10:22:49 +08:00
leo
bfc3f37e47
Merge branch 'master' into develop 2025-03-10 09:37:40 +08:00
leo
18d3b9560b
Merge branch 'release/v2025.08' 2025-03-10 09:36:44 +08:00
leo
82fdd2e9d4
version: Release 2025.08
Signed-off-by: leo <longshuang@msn.cn>
2025-03-10 09:36:36 +08:00
Gadfly
6ba26770c4
ci: enhance Linux and Windows package workflow (#1071)
* ci: fix Linux packaging workflow with specific Ubuntu 20.04 image

* ci: use Compress-Archive in Windows try to prevent Defender false positives
2025-03-10 09:28:13 +08:00
github-actions[bot]
978801c9ff doc: Update translation status and missing keys 2025-03-10 01:27:39 +00:00
AquariusStar
2fb1d7e14a
update and fix translation russian (#1070) 2025-03-10 09:27:25 +08:00
Gustav Andersson
89f655c84d
fix: Show detached HEAD (#1060) 2025-03-07 16:16:15 +08:00
leo
0860245674
code_style: simple window do not using DataContext
Signed-off-by: leo <longshuang@msn.cn>
2025-03-07 15:44:50 +08:00
leo
43fed8e04d
refactor: re-write About window
Signed-off-by: leo <longshuang@msn.cn>
2025-03-07 15:15:47 +08:00
leo
83f23583be
enhance: supports to navigate to target commit while resolving conflicts
Signed-off-by: leo <longshuang@msn.cn>
2025-03-07 12:22:47 +08:00
leo
ca6d41ee60
enhance: try to get stopped at revision info from .git/rebase-merge/head
Signed-off-by: leo <longshuang@msn.cn>
2025-03-07 11:39:15 +08:00
github-actions[bot]
773e27fda7 doc: Update translation status and missing keys 2025-03-07 01:32:14 +00:00
Javier J. Martínez M.
14877d4d63
localization: update spanish translations (#1061)
add missing spanish translations
update previous references of `patch` as `parche`
2025-03-07 09:32:05 +08:00
leo
92fa25ae8d
ux: disable scrollbar in NumericUpDown control (#1023)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-06 15:14:05 +08:00
leo
aa0d4b4296
ux: adjust column width of commit hash and time after font size changed (#994)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-06 11:50:22 +08:00
leo
78c0d8d334
fix: both --tags and --no-tags are used in git pull command
Signed-off-by: leo <longshuang@msn.cn>
2025-03-06 10:37:50 +08:00
leo
81bbe11345
code_style: rename some variables in ParseLinksInMessage
Signed-off-by: leo <longshuang@msn.cn>
2025-03-05 17:06:45 +08:00
Gadfly
991ebe4082
ci: set ubuntu:20.04 (#1056) 2025-03-05 09:55:55 +08:00
leo
fb8d4a2542
code_review: PR #1055
- since the author and time are already shown in the blame view, use the full message as tooltip is better.
- cache the commit message in `ViewModels.Blame` since the `Tooltip` of control may change.
- querying commit message synchronously (it's very fast) to avoid similar issues in commit details panel.

Signed-off-by: leo <longshuang@msn.cn>
2025-03-05 09:54:23 +08:00
GadflyFang
269903503f
feat: Add commit Tooltip in Blame (#1055)
Fixes #993
2025-03-05 09:36:32 +08:00
leo
5e898a809e
enhance: check commit hash after intersect testing
Signed-off-by: leo <longshuang@msn.cn>
2025-03-05 09:30:55 +08:00
GadflyFang
71d0b69eee
fix: prevent kill apt process by accident (#1054) 2025-03-04 19:51:36 +08:00
leo
792e61b24f
ux: re-design the layout for Interactive Rebase window that tries to fix issue #1037
Signed-off-by: leo <longshuang@msn.cn>
2025-03-04 18:23:13 +08:00
leo
e884f27f67
code_style: re-order CommitDetail properties
Signed-off-by: leo <longshuang@msn.cn>
2025-03-04 18:02:29 +08:00
leo
e28f8611ef
ux: re-design the layout for Interactive Rebase window that tries to fix issue #1037
Signed-off-by: leo <longshuang@msn.cn>
2025-03-04 17:39:21 +08:00
github-actions[bot]
5af856b9da doc: Update translation status and missing keys 2025-03-04 09:26:48 +00:00
leo
2137ad9ec9
enhance: allow to configure editor tab width in preferences window (#1048)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-04 17:26:27 +08:00
leo
11af5d9b29
code_style: use ?: operator instead of if ... else statement
Signed-off-by: leo <longshuang@msn.cn>
2025-03-04 16:42:32 +08:00
GadflyFang
68e96f428e
fix: validate result not update #1052 (#1053) 2025-03-04 16:34:51 +08:00
GadflyFang
25e6e261a6
refactor: Improve key modifier checks and AltGr detection (#1051) 2025-03-04 16:33:43 +08:00
leo
96538b9a62
fix: there's an extra line-ending while copy multiple lines from text diff view (#1049)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-04 16:26:14 +08:00
leo
b75676a7f8
refactor: commit message
- move issue tracker and commit hash links parsing to view models
- parsing links async
- make sure matched hash is a valid commit oid
- disable `CHILDREN` row in submodule info panel

Signed-off-by: leo <longshuang@msn.cn>
2025-03-04 16:04:19 +08:00
leo
5301a368e0
ux: re-design the layout for Interactive Rebase window that tries to fix issue #1037
Signed-off-by: leo <longshuang@msn.cn>
2025-03-04 09:46:02 +08:00
leo
d4bcc60113
enhance: disable CONTINUE button while it is running (#1046)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-04 09:29:07 +08:00
leo
35ee4a47db
fix: the last selected line is missing while trying to copy multiple lines in text diff view (#1044)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-03 15:39:59 +08:00
leo
598bba5210
code_review: PR #1043
`FileModeChange` should not be changed out of UIThread

Signed-off-by: leo <longshuang@msn.cn>
2025-03-03 14:25:49 +08:00
GadflyFang
72c7f24e2f
fix: set FileModeChange after RefreshAll (#1043) 2025-03-03 14:17:03 +08:00
GadflyFang
9dffd55c2b
build: Add pre-install and pre-removal scripts for DEBIAN package (#1041)
kill sourcegit before install
2025-03-03 10:39:57 +08:00
GadflyFang
7f8372f6b5
enhance: Handle file mode changes for new/deleted file (#1040) 2025-03-03 10:38:58 +08:00
leo
4c63c4c90d
Merge branch 'master' into develop 2025-03-03 09:28:02 +08:00
leo
4418214d38
Merge branch 'release/v2025.07' 2025-03-03 09:27:04 +08:00
leo
8c48b9623e
version: Release 2025.07
Signed-off-by: leo <longshuang@msn.cn>
2025-03-03 09:26:49 +08:00
leo
25fa223c6b
enhance: better regex for remote URL (#1039)
Signed-off-by: leo <longshuang@msn.cn>
2025-03-02 10:39:04 +08:00
heartacker
8423f53ace
chore: 升级Avalonia和CommunityToolkit.Mvvm包 (#1038)
- Upgrade Avalonia packages to version 11.2.5 and CommunityToolkit.Mvvm to version 8.4.0.
2025-03-01 19:20:37 +08:00
leo
8dd0274bdd
enhance: only write MERGE_MSG when commit message is not null
Signed-off-by: leo <longshuang@msn.cn>
2025-03-01 09:21:52 +08:00
leo
5199fb2b74
enhance: do NOT remember the last selected handling method of uncommitted local changes (#977)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-28 22:14:21 +08:00
leo
c90b7afac1
feature: makes the base on branch name selectable (#1036)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-28 19:18:10 +08:00
leo
88c7d5bbc9
fix: app crashes when Return key is pressed while current action is already running (#1035)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-28 19:15:02 +08:00
leo
9cf1cba9b7
feature: apply commit message while continue merge/revert (#1027)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-28 19:08:27 +08:00
leo
639bff9ad8
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2025-02-28 17:27:17 +08:00
leo
3e70ff94b0
fix: should not use ... to get revision range for rebasing (#1033)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-28 17:06:07 +08:00
Andre Greeff
f930967698
feat: remove IsMerged check from "Interactive Rebase" context menu conditional (#1033) 2025-02-28 17:05:49 +08:00
github-actions[bot]
109eee5668 doc: Update translation status and missing keys 2025-02-27 13:14:38 +00:00
GadflyFang
57cb9d0909
fix: Dynamic load copyright (#1030) 2025-02-27 21:14:24 +08:00
github-actions[bot]
caca1dcaaf doc: Update translation status and missing keys 2025-02-27 13:12:27 +00:00
Leonardo
337ee1a55d
localization: update italian translation (#1029) 2025-02-27 21:12:14 +08:00
leo
fc3043b93c
fix: double-clicking button trigger binded command twice (#1032)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-27 21:10:41 +08:00
leo
61d7f36be4
enhance: reset diff view context for empty commit
Signed-off-by: leo <longshuang@msn.cn>
2025-02-27 10:59:00 +08:00
leo
bdf439a742
enhance: do not show error message if it is empty
Signed-off-by: leo <longshuang@msn.cn>
2025-02-26 16:33:11 +08:00
leo
7bfb95f7ce
fix: ptyxis does not start with given working directory (#1005)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-26 16:07:18 +08:00
github-actions[bot]
c849c13fcb doc: Update translation status and missing keys 2025-02-26 07:45:04 +00:00
Javier J. Martínez M.
8f7db4e874
localization: add missing spanish translations (#1024)
* localization: add missing spanish translations

* localization: add missing spanish translations
2025-02-26 15:44:51 +08:00
leo
a7e254cac6
fix: multiple bindings for IsVisible property of Button
Signed-off-by: leo <longshuang@msn.cn>
2025-02-26 09:50:54 +08:00
leo
79306ad73b
fix: ptyxis does not start with given working directory (#1005)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-25 19:50:09 +08:00
leo
a0786bf9cc
fix: pulling with empty repository (no local branch) crashes this app (#1020)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-25 14:37:03 +08:00
leo
4d740f4731
feature: auto-select the first change when selected stash changed (#1019)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-25 11:09:12 +08:00
leo
c6747f72f9
feature: auto-select first change in commit details panel and revision/branch compare panel (#1019)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-25 10:53:42 +08:00
github-actions[bot]
1f35e83799 doc: Update translation status and missing keys 2025-02-24 13:25:13 +00:00
leo
1d037c7c57
feature: add context menu Save As Patch... for selected stash (#1018)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-24 21:24:53 +08:00
leo
4868ea1a0b
Merge branch 'master' into develop 2025-02-24 09:50:24 +08:00
leo
fb6b57bdf5
Merge branch 'release/v2025.06' 2025-02-24 09:49:41 +08:00
leo
0b7805b2ee
version: Release 2025.06
Signed-off-by: leo <longshuang@msn.cn>
2025-02-24 09:49:30 +08:00
github-actions[bot]
89e09d842d doc: Update translation status and missing keys 2025-02-24 01:45:49 +00:00
Javier J. Martínez M.
d4341c1195
localization: add missing spanish translations (#1017) 2025-02-24 09:45:39 +08:00
github-actions[bot]
74e5bcb704 doc: Update translation status and missing keys 2025-02-24 01:37:52 +00:00
leo
124bdc97f9
localization: add missing keys for zh_CN and zh_TW
Signed-off-by: leo <longshuang@msn.cn>
2025-02-24 09:37:34 +08:00
github-actions[bot]
52a53cc697 doc: Update translation status and missing keys 2025-02-24 01:32:32 +00:00
Göran W
fa4caa2186
enhance: add first/last buttons for block-nav, no wrapping (#1015) (#1016)
Added 2 new buttons (only visible in block-nav mode), with new icons and new (en_US) strings (First/Last Difference).
Implemented these new buttons, and disabled the automatic wrap-around for the prev/next buttons in block-nav mode.
2025-02-24 09:32:19 +08:00
Ikko Eltociear Ashimine
9ab602788a
docs: update README.md (#1014)
comaptible -> compatible
2025-02-24 09:28:00 +08:00
github-actions[bot]
b2ab62825e doc: Update translation status and missing keys 2025-02-21 02:48:21 +00:00
saxc
841276852a
localization: add german translations (#1011)
(cherry picked from commit fcc720480c85fe01120e555c22b6aec286ee717b)
2025-02-21 10:47:48 +08:00
leo
2b4fc64c73
fix: resolve conflict with deleted files does not work (#1009)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-21 10:26:14 +08:00
leo
9da2c787db
enhance: supports to configure fetch.prune for selected repository (#995)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-21 09:44:51 +08:00
leo
b5feabfd37
enhance: auto-set commit message while rebasing is inprogress (#1003)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-20 15:42:11 +08:00
leo
08da3ac5d8
enhance: prefer to use Default Remote in repository settings while fetching remote changes (#1008)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-20 11:12:29 +08:00
leo
731f1055bc
feat!: add ptyxis support (#1005)
BREAKING CHANGE: Index of `Custom` shell/terminal

Signed-off-by: leo <longshuang@msn.cn>
2025-02-20 11:04:57 +08:00
leo
507e502874
fix: Custom Action height is not large enough to display all contents (#1004)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-20 10:19:00 +08:00
github-actions[bot]
b57c0158c1 doc: Update translation status and missing keys 2025-02-20 02:14:51 +00:00
leo
53f591bdad
ux: add a warning icon when the tracking upstream of a local branch is gone (#1006)
Co-authored-by: Davide Tentori <dtentori@softeam.it>
2025-02-20 10:14:25 +08:00
leo
0e1dfba7ef
code_review: PR #1007
Signed-off-by: leo <longshuang@msn.cn>
2025-02-20 09:34:03 +08:00
Oleg Kosmakov
cbc2e46beb
fix: Update unstaged filed counter when unstaged files change (#1007)
* Add missing OnPropertyChanged in Cleanup

* Force unstaged count to refresh
2025-02-20 09:31:07 +08:00
leo
ce16ac63eb
enhance: submodule bookmark inherts from parent repo (#1001)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-19 19:22:36 +08:00
github-actions[bot]
68946d2140 doc: Update translation status and missing keys 2025-02-19 10:01:37 +00:00
leo
c3eca0d7fd
refactor: OpenAI integration (#996)
- Add `OpenAIResponse` to trim the `<think>...</think>` block
- Add an `Enable Streaming` option to fix the issue that some services do not support streaming output

Signed-off-by: leo <longshuang@msn.cn>
2025-02-19 18:01:16 +08:00
leo
69d107430a
project: upgrade OpenAI and Azure.AI.OpenAI to 2.2.0-beta.2
Signed-off-by: leo <longshuang@msn.cn>
2025-02-19 10:44:51 +08:00
leo
59638eb731
enhance: tag push behavior while creating and deleting (#999)
- Remember the state of `Push to all remotes after created` checkbox while creating tag
- Remember the state of `Delete from remote repositories` checkbox while deleting tag
- Change default state of `Delete from remote repositories` to `false`

Signed-off-by: leo <longshuang@msn.cn>
2025-02-19 10:35:34 +08:00
leo
5d2cd8b2fa
ux: new style for current branch (#998)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-18 18:19:19 +08:00
leo
3d4a9b86b4
ux: use bold font weight for current branch name (#997)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-18 16:54:00 +08:00
leo
af4645a4ad
project: upgrade LiveChartsCore.SkiaSharpView.Avalonia to 2.0.0-rc5.4
Signed-off-by: leo <longshuang@msn.cn>
2025-02-18 16:27:19 +08:00
leo
cf42381802
Merge branch 'master' into develop 2025-02-18 11:00:25 +08:00
leo
ed37b42a4a
Merge branch 'release/v2025.05' 2025-02-18 10:58:58 +08:00
leo
d401e898a2
version: Release 2025.05
Signed-off-by: leo <longshuang@msn.cn>
2025-02-18 10:58:30 +08:00
leo
e28abf8119
enhance: supports remove single histories filter (#987)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-18 10:04:56 +08:00
leo
14f47a9007
ux: style for current branch in branch tree (#991)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-18 09:50:01 +08:00
Arun
7ae5100fcf
chore: Convey the usage of monospace font only in text editor (#990)
Signed-off-by: Arun <visionofarun@gmail.com>
(cherry picked from commit 7ec7de7b4a933a599cfffc79382a6edd13582c85)
2025-02-18 09:32:15 +08:00
Chiahong
36178d5ecf
localization: update zh_TW.axaml (#989) 2025-02-18 09:26:44 +08:00
leo
bc66e24407
project: upgrade AvaloniaUI to 11.2.4
Signed-off-by: leo <longshuang@msn.cn>
2025-02-15 17:43:47 +08:00
github-actions[bot]
e39351b4a7 doc: Update translation status and missing keys 2025-02-14 02:43:26 +00:00
leo
9104060d79
feature: support add custom actions for selected branch (#980)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-14 10:43:08 +08:00
leo
9b07034846
code_review: PR #978
* Remove unnecessary parentheses since the name of relative path uses secondary foreground color already

Signed-off-by: leo <longshuang@msn.cn>
2025-02-13 10:46:28 +08:00
Dmitrij D. Czarkoff
588879eb7f
feat: change worktree presentation (#978)
Present the worktree name first, then relative path to the main repo.

This is more aligned with Git's own UI,  and works better with UI size constrains.
2025-02-13 10:41:08 +08:00
leo
c6aedf1193
ux: right margin of main tab bar on macOS
Signed-off-by: leo <longshuang@msn.cn>
2025-02-12 21:29:17 +08:00
leo
3302bdeb26
localization: remove duplicated keys in de_DE
Signed-off-by: leo <longshuang@msn.cn>
2025-02-12 21:25:57 +08:00
github-actions[bot]
21e4dcffd0 doc: Update translation status and missing keys 2025-02-12 02:59:19 +00:00
Christopher Göttfert
9757678dcf
localization: added missing german translations (#973)
Co-authored-by: Christopher Göttfert <Christopher.Goettfert@.uni-wuerzburg.de>
2025-02-12 10:59:00 +08:00
github-actions[bot]
19e72f8650 doc: Update translation status and missing keys 2025-02-12 02:51:20 +00:00
AquariusStar
eea55ec56f
localization: update russian localization (#971) 2025-02-12 10:51:06 +08:00
leo
21cfd17cdb
fix: do NOT quit when try to input @ via Alt Gr+Q with German ISO keyboard layout (#970)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-11 18:57:54 +08:00
leo
e9d16a5102
project: upgrade TextMateSharp to 1.0.66 (#969)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-11 16:58:32 +08:00
github-actions[bot]
1bfe1a2755 doc: Update translation status and missing keys 2025-02-11 07:15:47 +00:00
leo
011a415949
enhance: add a button to clear all notifications (#950)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-11 15:15:27 +08:00
leo
37e5926388
code_style: keep translation ordered
Signed-off-by: leo <longshuang@msn.cn>
2025-02-11 14:41:56 +08:00
leo
06df27780f
localization: update Text.Configure.CustomAction.WaitForExit for en_US
Signed-off-by: leo <longshuang@msn.cn>
2025-02-11 14:36:46 +08:00
github-actions[bot]
37fed93589 doc: Update translation status and missing keys 2025-02-11 06:34:33 +00:00
leo
af20ab2448
feature: add Wait for action done option to control whether or not to wait for the custom action execution to complete (#951)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-11 14:34:14 +08:00
leo
10fba08e43
code_review: PR #949
Signed-off-by: leo <longshuang@msn.cn>
2025-02-11 11:07:33 +08:00
Doodeletion
821063e3ec
Swap selection start and end index if selection is created from bottom to top (#967) 2025-02-11 10:57:20 +08:00
leo
aebfffee00
fix: GUI stops refreshing after manually refresh while merge tool is open (#949)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-10 20:51:36 +08:00
leo
0c8179b934
enhance: add a opened tabs selector popup (#958)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-10 20:06:44 +08:00
leo
e757e63bf7
refactor: launcher tab bar scroller visibility
Signed-off-by: leo <longshuang@msn.cn>
2025-02-10 16:42:42 +08:00
leo
59e4f0d388
refactor: update submodules when branch status changed
Signed-off-by: leo <longshuang@msn.cn>
2025-02-10 14:28:20 +08:00
GadflyFang
bead749c57
enhance: async refresh operations in Watcher (#961) 2025-02-10 14:05:27 +08:00
leo
c61ecb0bb0
Merge branch 'master' into develop 2025-02-10 10:05:55 +08:00
leo
7fc7c8fdb6
Merge branch 'release/v2025.04' 2025-02-10 10:05:23 +08:00
leo
3b76a30948
version: Release 2025.04
Signed-off-by: leo <longshuang@msn.cn>
2025-02-10 10:05:10 +08:00
GadflyFang
ef2e0a8a56
fix: Ignore the Chain-of-Thought in AI response (#952)
- Improve chat response processing to handle thinking patterns using regular expressions.
- Migrate server value by removing trailing '/chat/completions' path.
2025-02-08 17:30:27 +08:00
leo
8cc056d2af
enhance: supports searching/filtering unstaged changes (#960)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-08 17:16:56 +08:00
leo
35abeae758
project: upgrade Azure.AI.OpenAI to 2.2.0-beta.1
Signed-off-by: leo <longshuang@msn.cn>
2025-02-08 16:20:45 +08:00
leo
aa0d066944
enhance: move Create New Page button out of tab list if scroll arrow is visible (#958)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-08 14:55:55 +08:00
leo
2495911bd8
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2025-02-08 12:08:06 +08:00
leo
1f0dd15192
fix: only o1-mini does not supports system prompt
Signed-off-by: leo <longshuang@msn.cn>
2025-02-08 11:57:10 +08:00
github-actions[bot]
6a80e54b47 doc: Update translation status and missing keys 2025-02-08 02:17:16 +00:00
leo
a915708db3
refactor: rewrite OpenAI integration
- use `OpenAI` and `Azure.AI.OpenAI`
- use `developer` role instead of `system` for OpenAI's `o1` series models
- use streaming response
- re-design `AIAssistant`

Signed-off-by: leo <longshuang@msn.cn>
2025-02-08 10:03:11 +08:00
github-actions[bot]
cf90e51887 doc: Update translation status and missing keys 2025-02-07 10:08:27 +00:00
leo
f8bc022813
ux: clarify Delete operation for tree node in welcome page (#957)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-07 18:08:07 +08:00
leo
12597fd3e3
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2025-02-07 12:06:29 +08:00
leo
9a36e652e6
fix: add a new interface CanStartDirectly and move this check to StartPopup (#956)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-07 11:56:30 +08:00
leo
8ed7a99923
fix: COMMIT & PUSH should hide when there's no remotes available (#956)
Signed-off-by: leo <longshuang@msn.cn>
2025-02-07 11:45:18 +08:00
leo
8edd955370
code_review: PR #956
* Just use `Check` instead of a new one `AutoCheck`

Signed-off-by: leo <longshuang@msn.cn>
2025-02-07 11:36:30 +08:00
GadflyFang
2105fd450d
fix: when upstream is null show CommitAndPush and stop auto push (#955) (#956) 2025-02-07 11:30:14 +08:00
github-actions[bot]
d1f3469250 doc: Update translation status and missing keys 2025-02-06 08:34:27 +00:00
leo
7089f29b85
refactor: re-implement git stash apply
* supports `--index` option
* add an option to drop selected stash after applying
* remove `Pop` context menu for stash

Signed-off-by: leo <longshuang@msn.cn>
2025-02-06 16:33:55 +08:00
leo
dbb1df5f8b
fix: single _ will be traited as a space by image shields
Signed-off-by: leo <longshuang@msn.cn>
2025-02-06 15:34:12 +08:00
leo
e9297096df
enhance: remember last view mode in file histories view
Signed-off-by: leo <longshuang@msn.cn>
2025-02-06 13:30:56 +08:00
leo
dacbd2a791
enhance: auto-select the first revision in file histories view
Signed-off-by: leo <longshuang@msn.cn>
2025-02-06 13:13:45 +08:00
leo
38a8490d16
code_review: PR #946
Signed-off-by: leo <longshuang@msn.cn>
2025-02-06 13:07:58 +08:00
GadflyFang
9aba737d9e
feat: support compare both revision in FileHistories (#786) (#946) 2025-02-06 11:33:55 +08:00
GadflyFang
65a9406c9a
fix: adjust SHA regex pattern to min 6 chars (#944)
- Adjust the SHA regex pattern to match commit hashes with a minimum length of 6 characters instead of 10.
2025-02-06 10:55:07 +08:00
github-actions[bot]
2ee5b4707a doc: Update translation status and missing keys 2025-02-06 02:32:00 +00:00
GadflyFang
3ca4dc488c
feat: Add stash auto-restore functionality (#947) (#948) 2025-02-06 10:31:46 +08:00
GadflyFang
942f349275
enhance: enhance crash logging with detailed system info (#943)
- Enhance crash logging by adding detailed system and process information, including thread name, user, app start time, exception time, and memory usage.
2025-02-06 10:22:34 +08:00
GadflyFang
84533599f1
fix: support encoded url in remote (#938) 2025-02-06 10:22:01 +08:00
github-actions[bot]
018a32b95b doc: Update translation status and missing keys 2025-02-06 02:20:06 +00:00
leo
e784696058
enhance: add a checkbox to toggle Initialize & update submodules after clone
Signed-off-by: leo <longshuang@msn.cn>
2025-02-06 10:19:43 +08:00
GadflyFang
3af6012561
refactor: Update submodules individually to avoid failures (#925) (#936)
* refactor: Update submodules individually to avoid failures (#925)

- Remove `--recurse-submodules` flag from the clone command to simplify the cloning process.
- Refactor submodule update logic to handle updating all submodules in a loop and improve progress description handling.

* fix: Parse submodule list even if submodule status fails (#935)
2025-02-06 10:08:12 +08:00
GadflyFang
a4157e11e6
fix: Improve in-progress rebase handling (#933)
* fix: Improve in-progress rebase handling

* fix: Close merge popup even if there are conflicts (#941)
2025-02-06 10:00:35 +08:00
github-actions[bot]
c2950ad209 doc: Update translation status and missing keys 2025-02-06 02:00:25 +00:00
Leonardo
9a9f63a787
Add missing keys and general reviewing of the Italian translation (#932)
* update italian translation

* ordered italian translation and removed from md file

* revert edits in translations.md
2025-02-06 10:00:12 +08:00
GadflyFang
4f41f44a9f
fix: add --include-untracked to stash push for specific changes (#931) 2025-02-06 09:51:03 +08:00
GadflyFang
92065dee12
fix: Ensure each ImageView instance calculates its own aspect ratio (#929)
* fix: Ensure each ImageView instance calculates its own aspect ratio

- Modified ArrangeOverride methods in ImageView class to independently calculate and apply the aspect ratio based on the instance's image.

Signed-off-by: Gadfly <gadfly@gadfly.vip>

* fix: Make IgnoredWhitespace toggle button visible based on IsTextDiff

---------

Signed-off-by: Gadfly <gadfly@gadfly.vip>
2025-02-06 09:49:45 +08:00
leo
dd254ebf4f
ux: new attached property MenuItemExtension.Command for MenuItem
Signed-off-by: leo <longshuang@msn.cn>
2025-01-26 14:55:44 +08:00
Erica Buckmann
6a1026c992
feature: Add Ghostty to macOS terminals. (#928) 2025-01-26 10:42:13 +08:00
leo
fa07bb5b5a
refactor: move per-repository config Enable --prune on fetch to global git config fetch.prune (#908)
Signed-off-by: leo <longshuang@msn.cn>
2025-01-25 12:06:48 +08:00
leo
aad42a8297
feature: select the cursor line by triple-click (#927)
Signed-off-by: leo <longshuang@msn.cn>
2025-01-25 11:14:15 +08:00
leo
733ffe1af2
localization: update Text.WorkingCopy.Amend since we already add --amend as tooltip
Signed-off-by: leo <longshuang@msn.cn>
2025-01-24 17:15:05 +08:00
github-actions[bot]
4f6a878177 doc: Update translation status and missing keys 2025-01-24 06:46:07 +00:00
leo
49ee9c8e33
ux: move --signoff toggle from repository configuration window to commit options bar
Signed-off-by: leo <longshuang@msn.cn>
2025-01-24 14:45:49 +08:00
github-actions[bot]
0192e941f0 doc: Update translation status and missing keys 2025-01-24 04:11:14 +00:00
leo
37c4545875
feature: branch name allows spaces and auto replace spaces with dashes (#917) 2025-01-24 12:10:56 +08:00
leo
ab080b53b1
enhance: exclude indicators or empty blocks in diff text view while copying text (#924) 2025-01-24 11:41:11 +08:00
github-actions[bot]
cc111baf01 doc: Update translation status and missing keys 2025-01-23 08:11:28 +00:00
leo
e242119a03
fix: searching by Author & Committer does not work when the committer is different with author 2025-01-23 16:11:07 +08:00
leo
620f411e99
code_style: move RevisionTextFileView 2025-01-22 11:42:14 +08:00
leo
e033a93dd8
localization: update Text.Fetch.Force 2025-01-22 11:36:53 +08:00
github-actions[bot]
cce08fb086 doc: Update translation status and missing keys 2025-01-22 03:23:54 +00:00
leo
cd0b2326f5
localization: update en_US 2025-01-22 11:23:38 +08:00
leo
75288e7a31
ci: replacing 100% and 100.00% with for translation progress in README.md 2025-01-22 11:21:24 +08:00
leo
6ae66095c2
project: upgrade LiveChartsCore.SkiaSharpView.Avalonia to 2.0.0-rc5.1 2025-01-22 10:55:38 +08:00
leo
cb4ad63ba3
fix: discarding changes with selected changes should never be traited as Discard all changes (#904) 2025-01-22 10:52:01 +08:00
aikawayataro
90c04f1db2
fix: _ is not parsed in template variable name (#920) 2025-01-21 20:01:09 +08:00
GadflyFang
6482ef227a
fix: prevent target branch HEAD from being changed when adding worktree (#919)
* fix: prevent target branch HEAD from being changed when adding worktree

Signed-off-by: Gadfly <gadfly@gadfly.vip>

* fix: worktree path validator trigger error

Signed-off-by: Gadfly <gadfly@gadfly.vip>

---------

Signed-off-by: Gadfly <gadfly@gadfly.vip>
2025-01-21 13:58:07 +08:00
leo
38e7b69450
Merge branch 'master' into develop 2025-01-20 10:06:59 +08:00
leo
0f13c002f5
Merge branch 'release/v2025.03' 2025-01-20 10:06:00 +08:00
leo
b00c81c996
version: Release 2025.03 2025-01-20 10:05:43 +08:00
leo
8a472cb472
fix: sometimes tags did not update after deleting selected tag (#908) 2025-01-15 10:42:35 +08:00
leo
53ec53a6ee
project: upgrade LiveChartsCore.SkiaSharpView.Avalonia to 2.0.0-rc5 2025-01-14 21:26:31 +08:00
leo
1c8d4d312a
fix: SelectableTextBlock does not re-draw after Text property changed (#906) 2025-01-14 21:02:32 +08:00
leo
c8aecc00cc
ux: use Grid instead of DockPanel 2025-01-14 20:39:56 +08:00
github-actions[bot]
5b425c4ed0 doc: Update translation status and missing keys 2025-01-14 10:11:25 +00:00
Nils van Rijsinge
765286ec0b
localization: add missing de_DE keys (#905)
Configure.IssueTracker Gittee 22ba8b3acf
General.DateFormat c058b4744b
Git.SSLVerify 1596ca71a5
Repository.HistoriesLayout 26ebd5ae7e 6b5e8c588d
OnlyHighlightCurrentBranchInHistories, UseRelativeTimeInHistories 26ebd5ae7e
Tags.Order..., Tags.Sort 08a128cd87
SetUpstream 6fe4d8162b
2025-01-14 18:11:11 +08:00
leo
8ea17e57da
Merge branch 'feat-bare-repository' into develop 2025-01-14 18:08:46 +08:00
leo
6f407fb086
enhance: enable --index option in git stash pop command by default (#903) 2025-01-14 18:07:55 +08:00
leo
f2b1c06bb8
enhance: disable checkout branch via double-clicking branch tree node (#899) 2025-01-14 17:57:31 +08:00
leo
766b60d05e
enhance: disable unused context menus for bare repository (#899) 2025-01-14 17:53:26 +08:00
leo
a9327274c6
enhance: disable LOCAL CHANGES and STASHES for bare repository (#899) 2025-01-14 17:26:01 +08:00
leo
5acc6e6928
enhance: double-click commit in histories of a bare repository 2025-01-14 17:26:01 +08:00
leo
a112d212dc
enhance: disable pull/stash/apply/git-flow/git-lfs buttons in bare repository 2025-01-14 17:26:01 +08:00
leo
b9b5220590
feature: bare repository support 2025-01-14 17:26:01 +08:00
leo
cc5f3ebfa5
refactor: do not run git add for untracked file while stashing local changes (#903) 2025-01-14 17:10:06 +08:00
leo
d8168c3ba6
ux: submodule alignment 2025-01-14 16:14:19 +08:00
Vixb
99b7086cd0
doc: update default path for windows (#901)
(cherry picked from commit 4456366ea63b277665d7250709928deb1e563675)
2025-01-14 10:20:51 +08:00
Mat
011f5258ad
fix: LFS locks do not show if user name contains . character (#902) 2025-01-14 10:18:56 +08:00
leo
5f4c1bb984
enhance: do not show Initialize Repository popup for bare repositories (#891) 2025-01-13 17:42:41 +08:00
leo
632222a776
ux: add icon for quit menu item 2025-01-13 15:37:55 +08:00
wl2776
458a1ea83c
feature: Exit on Ctrl+Q (#898) 2025-01-13 15:33:13 +08:00
leo
b10e084c54
ux: context menu separator 2025-01-13 14:47:32 +08:00
github-actions[bot]
88e64a4f31 doc: Update translation status and missing keys 2025-01-13 06:42:23 +00:00
leo
10d8d3b2ef
refactor: branch compare 2025-01-13 14:42:07 +08:00
GadflyFang
59e3e4c635
docs: Update README.md with APT source config changes (#897)
- Update APT source configuration to include architecture-specific settings.

Signed-off-by: Gadfly <gadfly@gadfly.vip>
2025-01-13 12:07:24 +08:00
leo
f87bf8b4c6
Merge branch 'master' into develop 2025-01-13 10:30:08 +08:00
leo
4f3e6398b0
Merge branch 'release/v2025.02' 2025-01-13 10:29:01 +08:00
leo
001e813b7e
version: Release 2025.02 2025-01-13 10:28:31 +08:00
leo
6e6cd7a7f3
enhance: do not show Initialize Repository popup for bare repositories (#891) 2025-01-13 10:25:58 +08:00
github-actions[bot]
a205e17bf2 doc: Update translation status and missing keys 2025-01-13 02:11:41 +00:00
wl2776
6e5626f267
fix: several typos in source code (#895) 2025-01-13 10:11:28 +08:00
github-actions[bot]
91883c9f11 doc: Update translation status and missing keys 2025-01-13 02:07:46 +00:00
UchiTesting
f8e7976ec2
style(locale): Translate French locale further (#896)
- Picked a few of the 1st lines from TRANSLATION.md
- Updated a few others. Prune to Elaguer for instance.
2025-01-13 10:07:32 +08:00
leo
b26838ff68
refactor: git version related commands
* use `--pathspec-from-file=<FILE>` in `git add` command if git >= 2.25.0
* use `--pathspec-from-file=<FILE>` in `git stash push` command if git >= 2.26.0
* use `--staged` in `git stash push` command only if git >= 2.35.0
2025-01-11 17:29:38 +08:00
aikawayataro
c939308e4c
readme: add package repository instructions (#893) 2025-01-11 15:06:42 +08:00
leo
275a52eb5c
refactor: add repository 2025-01-11 11:28:37 +08:00
leo
52fba29613
readme: add doc for Linux RPM/DEB packages 2025-01-10 14:32:01 +08:00
GadflyFang
d7ba310a24
build: Update package dependencies to include broader range of ICU libraries (#890)
Signed-off-by: Gadfly <gadfly@gadfly.vip>
(cherry picked from commit d340584249b771f497f818f45a3bc542bc473cc5)
2025-01-10 12:24:37 +08:00
aikawayataro
f1acc96a72
ci: remove Buildkite, add missing dependencies, README edits (#885)
* build: add libicu dependency for deb package

* ci: remove obsolete Buildkite publish workflow

* build: add xdg-utils dependency

* readme: update Linux notes

Remove Buildkite repo instructions and fix some typos.
2025-01-10 09:29:19 +08:00
github-actions[bot]
7361b3d403 doc: Update translation status and missing keys 2025-01-10 01:25:28 +00:00
Bernat Borràs Civil
eca5639e31
localization: add missing translations for Spanish (#886) 2025-01-10 09:25:16 +08:00
github-actions[bot]
dd15f3aa45 doc: Update translation status and missing keys 2025-01-10 01:24:30 +00:00
AquariusStar
afe55a5ff5
localization: update russian localization (#887) 2025-01-10 09:24:18 +08:00
leo
810568e179
fix: typo 2025-01-09 18:14:11 +08:00
leo
b06d14fec7
refactor: SourceGit.App 2025-01-09 18:12:11 +08:00
leo
495b3a9296
refactor: issue tracker configuration (#884) 2025-01-09 12:28:07 +08:00
github-actions[bot]
f74dbdf8ed doc: Update translation status and missing keys 2025-01-09 04:04:52 +00:00
leo
22ba8b3acf
feature: add issue/pr tracker for Gitee.com (#884) 2025-01-09 12:04:36 +08:00
leo
9baa2c9fad
refactor: get owner page of repsitory dynamically 2025-01-09 09:21:58 +08:00
leo
f07e838e6f
code_style: remove used code 2025-01-08 21:46:35 +08:00
leo
a3d744f426
code_style: run dotnet format 2025-01-08 21:44:35 +08:00
leo
f06b1d5d51
refactor: merge ViewModels.PopupHost into ViewModels.LauncherPage 2025-01-08 21:36:49 +08:00
leo
0e34a77add
enhance: threadsafe way to accessing _remotes (#882) 2025-01-08 19:20:27 +08:00
leo
94c532889b
fix: auto fetch does not work if use ssh (#882) 2025-01-08 19:09:52 +08:00
leo
8018abe0a2
code_style: remove unused namespace using 2025-01-08 16:10:16 +08:00
leo
5d791b63bf
fix: crach while submodule changed (#881) 2025-01-08 12:42:30 +08:00
leo
eea3d5db6c
ux: right margin of filter toggle button (#875) 2025-01-08 11:14:17 +08:00
leo
df422b2219
fix: missing popup window shadows on Windows 10 (#879) 2025-01-08 09:40:23 +08:00
github-actions[bot]
5f7b6c3c66 doc: Update translation status and missing keys 2025-01-07 11:51:52 +00:00
leo
1596ca71a5
feature: add checkbox to enable/disable global http.sslVerify configuration (#877) 2025-01-07 19:51:27 +08:00
leo
7a217336dc
enhance: graph color allocation 2025-01-07 15:24:11 +08:00
github-actions[bot]
0391ec99b4 doc: Update translation status and missing keys 2025-01-07 04:06:26 +00:00
leo
6fe4d8162b
refactor: use popup to change tracking branch 2025-01-07 12:05:52 +08:00
leo
25a2bf603f
ux: conventional commit message builder layout 2025-01-07 10:40:35 +08:00
leo
903a3b9660
feature: add Ctrl+Enter/⌘+Enter hotkey to submit conventional commit (#874) 2025-01-07 10:36:07 +08:00
leo
85504b1487
enhance: enable text search for branch ComboBox (#784) 2025-01-07 10:29:55 +08:00
leo
8b04ab52d6
fix: Height can not be negative (#869) 2025-01-07 09:48:44 +08:00
AquariusStar
7f9be03e5c
localization: update translation russian (#872)
fix
2025-01-06 20:18:31 +08:00
github-actions[bot]
999c19052c doc: Update translation status and missing keys 2025-01-06 12:17:41 +00:00
leo
6b5e8c588d
ux: add a group header for advanced histories options 2025-01-06 20:17:20 +08:00
leo
a00e62233f
ux: reduce width of buttons in Histories toolbar 2025-01-06 17:58:43 +08:00
leo
68cfb092fc
ux: use a transparent brush for non relatives paths (#848) 2025-01-06 17:52:59 +08:00
github-actions[bot]
fffa4f9bea doc: Update translation status and missing keys 2025-01-06 09:24:41 +00:00
AquariusStar
108a212108
localization: update russian translate (#870) 2025-01-06 17:24:27 +08:00
github-actions[bot]
03b06de907 doc: Update translation status and missing keys 2025-01-06 08:16:48 +00:00
leo
08a128cd87
feature: add a button to switch tag sort method (creatordate/name asc/name des) (#865) 2025-01-06 16:16:27 +08:00
leo
84721a7258
update: icon for --reflog 2025-01-06 15:21:15 +08:00
github-actions[bot]
702e8ec34f doc: Update translation status and missing keys 2025-01-06 06:59:46 +00:00
leo
26ebd5ae7e
feature: add option to only highlight current branch in commit graph (#848)
- add a toggle button to only highlight current branch in commit graph
- re-order buttons in histories toolbar
- remove unused icons and styles
2025-01-06 14:59:27 +08:00
leo
65e820e4d5
fix: new created branch expanded state is not remembered 2025-01-06 10:41:41 +08:00
leo
68210d8a3e
ci: release title 2025-01-06 10:23:58 +08:00
leo
a5e1e5ebc8
Merge branch 'master' into develop 2025-01-06 09:55:38 +08:00
leo
0aa2aaaf9d
Merge branch 'release/v2025.01' 2025-01-06 09:54:31 +08:00
leo
1898385086
version: Release 2025.01 2025-01-06 09:54:18 +08:00
leo
0628e3d3f7
feature: clear commit message when toggle off Amend 2025-01-03 14:27:54 +08:00
leo
8ebf4d76d6
ux: use AvaloniaEdit.TextEditor to display release update detail info 2025-01-03 14:13:57 +08:00
leo
c6afc6a205
doc: add tips for translation 2025-01-03 09:31:04 +08:00
leo
4e06944c9f
fix: auto-filter does not work well (#855) 2025-01-02 20:05:04 +08:00
leo
127315528a
feature: auto-change filter branches after checkout (#855) 2025-01-02 14:19:10 +08:00
leo
2a55ba6d07
fix: Avalonia designer does not work (#858) 2025-01-02 11:19:52 +08:00
Juga Paazmaya
554ffc728d
Short list of commands needed when nothing has not yet been done (#859) 2025-01-02 09:14:19 +08:00
UchiTesting
1e75a518a6
style(locale): Translate French locale further (#857)
- "Checkout" translates to "Récupérer". Updating lines that match
- "Push" translates to "Pousser". Updating lines that match.
- Staged translates to "Présent dans l'index" but it is too long to I go simply for "Indexé".
- Translating a few extra lines
- Some of the terms mentioned above remain untranslated because it is not appropriate provided their respective context
2025-01-02 01:52:58 +08:00
github-actions[bot]
70fa80bab9 doc: Update translation status and missing keys 2025-01-01 17:52:14 +00:00
AquariusStar
4b02199c9b
update russian translate (#853)
fix and update
2025-01-02 01:52:01 +08:00
leo
4f350c84c3
ux: use Auto for commit time column 2024-12-31 14:44:19 +08:00
leo
7a02854e2d
fix: bad output file name while creating archive by tag 2024-12-31 11:19:05 +08:00
leo
87e7b792bb
refactor: date time format
- generate example dynamically
- update commit/author time in histories immediately after data time format changed
2024-12-31 10:43:00 +08:00
leo
a6420aff9b
fix: crash if the executable file can not be found 2024-12-31 09:38:46 +08:00
wl2776
addc756fbf
feature: support several more variants of git installation on MacOS (#852) 2024-12-31 09:28:00 +08:00
leo
ced1737bdc
fix: typo in DataTimeFormat 2024-12-30 20:29:50 +08:00
leo
82fc261743
feature: shows the git configured commit template in Template/Histories popup (#846) 2024-12-30 19:40:58 +08:00
leo
8d12227227
ux: show date time format string 2024-12-30 17:47:55 +08:00
leo
7d0fa3b86d
Revert "feature: ignore remote.{REMOTE}.mirror settings (#844)"
This reverts commit 093176d10b.
2024-12-30 17:34:58 +08:00
github-actions[bot]
418897c5de doc: Update translation status and missing keys 2024-12-30 09:20:17 +00:00
leo
c058b4744b
feature: allows to change DateTime format (#755) 2024-12-30 17:19:55 +08:00
leo
dc649e6142
refactor: rewrite the portable mode (#851) 2024-12-30 15:12:23 +08:00
leo
093176d10b
feature: ignore remote.{REMOTE}.mirror settings (#844)
(cherry picked from commit 9164f1b7340f68e00fea99bf9bac67734062f930)
2024-12-30 14:54:04 +08:00
leo
7f268a6557
Merge branch 'master' into develop 2024-12-30 09:22:26 +08:00
leo
2d500fc35a
Merge branch 'release/v8.45' 2024-12-30 09:21:39 +08:00
leo
bb8e66e479
version: Release 8.45 2024-12-30 09:21:25 +08:00
github-actions[bot]
cdda418c2d doc: Update translation status and missing keys 2024-12-30 01:19:01 +00:00
Bernat Borràs Civil
1f316708fd
Update spanish translation (#849)
* Add missing translations

* Add missing keys after merge

* Remove duplicated string

* Sort unsorted strings
2024-12-30 09:18:49 +08:00
AquariusStar
03d3cbe11e
update translation russian (#850)
fix
2024-12-30 09:18:12 +08:00
AquariusStar
fa46586417
localization: update (#845)
fix incorrected translated
2024-12-28 12:17:36 +08:00
Martin Garstenauer
12e8a212d4
fix: Enter key does not stage/unstage all selected items (#843) 2024-12-27 20:26:18 +08:00
leo
5081d2fba2
fix: error occurs while using WinMerge as external diff tool with Single instance mode enabled (#842) 2024-12-27 17:40:34 +08:00
wl2776
e407399d03
Fix some more messages in russian and english (#839) 2024-12-26 09:23:41 +08:00
wl2776
4254a22d79
Fix grammar in tip (#838) 2024-12-25 18:17:06 +08:00
leo
c9b00d7bfe
ci: do not use portable for windows actions 2024-12-24 14:48:04 +08:00
leo
f53b71bfe7
feature: add -p:EnablePortable=true option for dotnet publish command to store app data portable (#834) 2024-12-24 09:23:50 +08:00
leo
7028e08390
enhance: remove invalid expanded node records in repository's settings 2024-12-23 16:56:49 +08:00
leo
ec94c8c1b4
Merge branch 'master' into develop 2024-12-23 09:21:06 +08:00
leo
f3adb25c82
Merge branch 'release/v8.44' 2024-12-23 09:20:23 +08:00
leo
9603f2b5aa
version: Release 8.44 2024-12-23 09:20:00 +08:00
leo
ae2ffd5b40
fix: wrong text trimming position 2024-12-20 15:31:33 +08:00
leo
2e838840e0
localization: update Text.OpenAppDataDir 2024-12-20 14:57:33 +08:00
leo
dbf12ff88e
ux: layout of commit message template 2024-12-20 14:11:22 +08:00
leo
1862428a0f
feature: supports Warp terminal on macOS (#829)
Signed-off-by: leo <longshuang@msn.cn>
2024-12-20 10:44:06 +08:00
leo
50892f7401
ux: re-order context menu items for selected multiple branches 2024-12-20 10:00:10 +08:00
leo
fec13cdc87
ux: layout of INFORMATION page 2024-12-20 09:56:53 +08:00
leo
ed229166ee
enhance: allow wrap commit refs in INFORMATION page (#807) 2024-12-20 09:51:25 +08:00
leo
6c795e1238
project: upgrade TextMateSharp to 1.0.65 2024-12-19 19:30:17 +08:00
leo
7ee7964799
ux: use trimmed error message 2024-12-19 17:38:53 +08:00
leo
7acd6e42fe
project: upgrade Avalonia to 11.2.3 2024-12-19 17:09:20 +08:00
leo
9a6d6bb68a
ux: enable text wrap in notification panel 2024-12-19 10:01:36 +08:00
leo
37bf6dec5e
feature: remember --reflog, --first-parent, --topo-order and --date-order toggle states 2024-12-18 19:49:08 +08:00
leo
ed3e7cbfaf
ux: update unreal icon 2024-12-18 19:03:59 +08:00
github-actions[bot]
df6f2f3585 doc: Update translation status and missing keys 2024-12-18 10:54:50 +00:00
wl2776
b2ca6480b8
localization: Russian translation (#827)
add missing keys, based on TRANSLATION.md

reword some existing keys that seemed incorrect
2024-12-18 18:54:38 +08:00
leo
a899de2b98
enhance: ignore refs/*/HEAD when query refs those contains given commit 2024-12-18 17:50:19 +08:00
leo
31ad317a57
feature: remember the Include Untracked Files toggle state in local changes 2024-12-18 17:30:04 +08:00
leo
5ec8279d38
feature: remember the state of repository sidebar (#823) 2024-12-18 15:33:09 +08:00
leo
7526def448
project: rename dotnet publish option -p:SourceGitNoAot=true|false to -p:DisableAOT=true|false 2024-12-18 10:17:00 +08:00
leo
e4fb9eeb52
refactor: built-in default avatar 2024-12-18 10:00:25 +08:00
leo
cb3727b524
feature: remember --force check state in git fetch popup (#824) 2024-12-18 09:36:25 +08:00
Martin Garstenauer
39dff8a93f
ux: change text selection brush to improve readability (#825) 2024-12-18 09:25:56 +08:00
leo
23326d179a
refactor: commit hash detection in message 2024-12-17 14:39:18 +08:00
leo
6768a2c1fe
ux: new notification theme 2024-12-17 12:08:25 +08:00
leo
1c345df37d
ux: add some tooltips to checkboxes 2024-12-17 11:24:59 +08:00
leo
c768b1750e
feature: use -p:DisableUpdateDetection=true to disable built-in update detection feature (#819) 2024-12-17 10:26:35 +08:00
leo
707a227aca
ux: make Welcome page responsive (#821) 2024-12-17 09:36:06 +08:00
leo
f418b72c64
feature: use [$workspace] $repo_name ($repo_path) as main window's title (#818) 2024-12-16 15:47:33 +08:00
leo
5425fa64fe
refactor: use another way to open tooltip of SHA after getting commit info (#810) 2024-12-16 13:29:46 +08:00
github-actions[bot]
e4cfca0ffd doc: Update translation status and missing keys 2024-12-16 01:51:11 +00:00
Nils van Rijsinge
dd85760b7a
localization: add missing de_DE keys (#817)
* localization: add missing de_DE keys

BranchCM.MergeMultiBranches, CommitCM.MergeMultiple, MergeMultiple #793
CommitCM.Merge 2053ce033d
CommitDetail.Files.Search 894f3e9b03
Diff.UseBlockNavigation #703
FileCM.ResolveUsing 3b5d87391d
Hotkeys.Global.Clone bea2a39feb
InProgress.CherryPick.Head e1df5c52f1
InProgress.Merge.Operating ef40e4b738
InProgress.Rebase.StoppedAt, Repository.Skip #790
InProgress.Revert.Head 93d9a04460
Merge.Source 2504a52398
WorkingCopy.CommitToEdit c1368212df

* localization: consistently use clone with 'k'

for most other keys a more "germanized" version with a k is used rather than a c
2024-12-16 09:50:59 +08:00
leo
819602f77c
Merge branch 'master' into develop 2024-12-16 09:30:14 +08:00
leo
0e37e018ef
Merge branch 'release/v8.43' 2024-12-16 09:29:17 +08:00
leo
e1fb799fd4
version: Release 8.43 2024-12-16 09:29:06 +08:00
leo
f986e59a94
fix: tag filter hidden behind the scroll bar (#815)
Signed-off-by: leo <longshuang@msn.cn>
2024-12-14 20:25:25 +08:00
leo
0a0e2bc044
enhance: only create squash menu item if it is needed 2024-12-13 16:24:39 +08:00
leo
24b6153226
ux: context menu of selected commits
* update English translation
* re-order the menu items
2024-12-13 16:02:10 +08:00
leo
751991c816
refactor: rewrite the way reading full message of commit 2024-12-13 11:00:03 +08:00
leo
a99bd2e973
enhance: only dispatch error message if it contains valid data 2024-12-13 10:43:39 +08:00
Ezra
26923435e7
enhance: improve readability of default clone dir errors. (#813) 2024-12-13 10:08:47 +08:00
leo
02658839c2
enhance: notification popup 2024-12-13 10:08:26 +08:00
leo
6eb226eb44
fix: wrong whitespace at start of the last commit message while interactive rebasing (#790) 2024-12-12 20:01:10 +08:00
leo
59f11e9aca
fix: original FullMessage missing line-endings (#790) 2024-12-12 19:38:02 +08:00
leo
c4c7bef93c
ux: update Icons.Commit 2024-12-12 17:14:04 +08:00
leo
27afe1871f
fix: tooltip of commit sha did not close properly (#810) 2024-12-12 14:40:47 +08:00
github-actions[bot]
0ac1031c4c doc: Update translation status and missing keys 2024-12-12 02:03:49 +00:00
leo
2053ce033d
feature: supports merge selected commit to current branch (#800) 2024-12-12 10:03:34 +08:00
leo
e17b53da42
enhance: block-navigation in text diff view
* It is not necessary to re-calculate all the contents when `UseBlockNavigation` changed
* Redraw the text view after `block-navigation` has turned off
2024-12-12 09:44:55 +08:00
leo
9dd4166009
refactor: use MultiBinding instead of code to control visibility of Commit & Push button 2024-12-11 16:08:23 +08:00
leo
a10f9e0dd0
enhance: popup will be closed when cherry-pick or revert failed 2024-12-11 15:27:00 +08:00
leo
0dd6692cd8
enhance: supports --skip while reverting commits 2024-12-11 15:12:25 +08:00
leo
dcaeaef48a
refactor: re-design conflict panel 2024-12-11 11:33:20 +08:00
leo
36ecbcc4e0
enhance: supports self-host git server (#733) 2024-12-10 21:38:06 +08:00
leo
55ad194e0e
code_style: remove unused code 2024-12-10 21:09:26 +08:00
github-actions[bot]
9b88db290d doc: Update translation status and missing keys 2024-12-10 12:57:28 +00:00
leo
93d9a04460
enhance: show reverting commit in banner while reverting is in-progress 2024-12-10 20:57:10 +08:00
leo
2dd9cab695
enhance: try to use friendly name instead of commit hash 2024-12-10 20:23:46 +08:00
leo
3b5d87391d
ux: use Views.NameHighlightedTextBlock instead of plan text for FileCM.ResolveUsing 2024-12-10 16:56:05 +08:00
github-actions[bot]
767de75512 doc: Update translation status and missing keys 2024-12-10 08:44:55 +00:00
leo
feb7e96b2c
enhance: show friendly name instead of --theirs or --mine while resolving conflicts 2024-12-10 16:44:37 +08:00
leo
c8cdda3477
ux: color for in processing target 2024-12-10 16:17:12 +08:00
github-actions[bot]
3cecb3f888 doc: Update translation status and missing keys 2024-12-10 07:38:27 +00:00
leo
2504a52398
fix: wrong display when merge tag
* remove `Text.Merge.Source`  translations from `de_DE`/`es_ES`/`fr_FR`/`it_IT`/`pt_BR`/`ru_RU` because its content has been changed
2024-12-10 15:38:06 +08:00
github-actions[bot]
4dd3b7f412 doc: Update translation status and missing keys 2024-12-10 07:18:11 +00:00
leo
ef40e4b738
enhance: show source branch/tag/commit in banner while merging request in progress 2024-12-10 15:17:54 +08:00
leo
e1df5c52f1
localization: update Text.InProgress.CherryPick.Head 2024-12-10 14:13:44 +08:00
leo
33ef9a612d
fix: avoid crash if fontfamily contains consecutive whitespace (#799) 2024-12-10 12:06:36 +08:00
github-actions[bot]
0a486a90d9 doc: Update translation status and missing keys 2024-12-10 03:17:52 +00:00
leo
aee3abfffb
enhance: redesign in-progress banner (#790)
* show head for cherry-pick
* show stopped at for rebase
* supports `--skip` for cherry-pick and rebase
2024-12-10 11:17:30 +08:00
leo
1644b4c8ce
readme: remove unnecessary tips 2024-12-10 09:28:35 +08:00
Bernat Borràs Civil
967429cea6
doc: add repository instructions to readme (#797) 2024-12-10 09:27:26 +08:00
Данил Бизимов
33625b58da
readme: added appimagehub link (#798) 2024-12-10 09:26:15 +08:00
leo
64bedd2ae9
ux: layout for Views.MergeMultiple 2024-12-09 21:21:16 +08:00
github-actions[bot]
2b6210e61c doc: Update translation status and missing keys 2024-12-09 13:13:16 +00:00
leo
94daa46db9
code_review: PR #793
* do NOT modify the existing merge, and add a new constructor for `Commands.Merge` instead
* rewrite `ViewModels.MergeMultiple`
  - since `_histories.Commits.Find` may returns null, use `List<object>` instead of `List<Models.Commits>`
  - supports display merge target as both `Models.Commit` and `Models.Branch`
* rename translation key `Text.MergeMultiple.Commit` to `Text.MergeMultiple.Targets`, and add translations for zh_CN and zh_TW
* some UI/UX changes
2024-12-09 21:12:58 +08:00
github-actions[bot]
4eed9674b4 doc: Update translation status and missing keys 2024-12-09 13:04:39 +00:00
Dmitrij D. Czarkoff
dce33fdf60
feature: merge multiple heads (#793)
* feature: allow merging multiple heads
* feature: allow merging multiple branches from branch tree
2024-12-09 21:04:25 +08:00
github-actions[bot]
c9c7fb5d5b doc: Update translation status and missing keys 2024-12-09 08:44:36 +00:00
leo
ee3942fec6
code_review: PR #795
* update zh_CN and zh_TW translations
* simplify calling `Welcome.Clone`
2024-12-09 16:44:16 +08:00
github-actions[bot]
3990cc9452 doc: Update translation status and missing keys 2024-12-09 08:36:52 +00:00
Luigi Grilli
bea2a39feb
feature: added Ctrl+N/⌘+N shortcut (#795)
(cherry picked from commit 726cf0d376a9af9167145560977ec6e1bf748277)
2024-12-09 16:36:19 +08:00
leo
19307cebc0
ux: update icon for Block-Navigation 2024-12-09 16:11:20 +08:00
leo
a9011ddc2c
readme: update tooltips for Linux users 2024-12-09 10:24:59 +08:00
leo
9f5cbaba09
fix: publish-packages should depends on package and version 2024-12-09 09:56:07 +08:00
leo
a263002c83
Merge branch 'master' into develop 2024-12-09 09:36:03 +08:00
leo
4a3ef6267f
Merge branch 'release/v8.42' 2024-12-09 09:35:18 +08:00
leo
3196bd41a6
version: Release 8.42 2024-12-09 09:35:08 +08:00
github-actions[bot]
076ab95614 doc: Update translation status and missing keys 2024-12-09 01:31:58 +00:00
AquariusStar
33ff191212
localization: update (#794) 2024-12-09 09:31:45 +08:00
leo
962055dd2a
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2024-12-08 21:51:33 +08:00
leo
723263d099
fix: wrong binding modes
Signed-off-by: leo <longshuang@msn.cn>
2024-12-08 21:47:20 +08:00
github-actions[bot]
ea130967fb doc: Update translation status and missing keys 2024-12-08 13:02:51 +00:00
leo
15d3ad355d
code_review: PR #703
* change the name of this feature to `Enable Block-Navigation`
* change the icon of the toggle button used to enable this feature
* use a new class `BlockNavigation` to hold all the data about this feature
* create `BlockNavigation` data only when it is enabled

Signed-off-by: leo <longshuang@msn.cn>
2024-12-08 21:02:30 +08:00
github-actions[bot]
0c04cccd52 doc: Update translation status and missing keys 2024-12-08 09:50:45 +00:00
Göran W
655d71b0bc
Add navigation and highlighting of change-blocks in Text Diff (#616, #717) (#703)
* Corrected misspelled local variable nextHigh(t)light

* Implemented change-block navigation

* Modified behavior of the Prev/Next Change buttons in DiffView toolbar.
* Well-defined change-blocks are pre-calculated and can be navigated between.
* Current change-block is highlighted in the Diff panel(s).
* Prev/next at start/end of range (re-)scrolls to first/last change-block
(I.e when unset, or already at first/last change-block, or at the only one.)
* Current change-block is unset in RefreshContent().

* Added safeguards for edge cases

* Added indicator of current/total change-blocks in DiffView toolbar

* Added new Icon and String (en-US) for Highlighted Diff Navigation

* Added Preference and ToggleButton for diff navigation style
2024-12-08 17:50:33 +08:00
GadflyFang
c062f27081
fix: Dispose _autoFetchTimer before _setting set to null (#792)
Signed-off-by: Gadfly <gadfly@gadfly.vip>
2024-12-06 15:09:14 +08:00
Bernat Borràs Civil
c2252266ce
Update Spanish translation (#791)
* Update spanish translation

* doc: Update translation status and missing keys

* Add missing key

(cherry picked from commit 2bf0641323325bf97d1fac9ed225228e5015a3ba)

* doc: Update translation status and missing keys

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-12-06 09:13:45 +08:00
leo
e18d6d65e8
ux: style of MenuItem 2024-12-05 20:43:31 +08:00
leo
75e9f1e9a4
feature: show track status in Delete Multiple Branches panel (#785) 2024-12-04 19:14:48 +08:00
leo
1ddd348a40
feature: show tracking status in Delete Branch panel if possible (#785) 2024-12-04 18:04:57 +08:00
leo
d616d0897b
refactor: relative time display mode (#777) 2024-12-04 11:25:25 +08:00
stone-w4tch3r
43928936bc
Added repositories for deb/rpm packages on buildkite (#780)
* added and used new github action for publishing packages to packagecloud

* publish-packages.yml WIP

* publish-packages.yml now uses curl push

* fix naming from packagecloud to buildkite

* Add debug logs to publish-packages.yml

* fix package path

* change repo name to sourcegit

* fixed unused code

* added --fail to curl pushes

* Remove leftowers from release.yml
2024-12-04 09:57:30 +08:00
stone-w4tch3r
abacccab00
feat: Add libicu dependency to RPM spec file (#781)
(cherry picked from commit f312895ef8c77098612645a54420539fef70a849)
(cherry picked from commit 662149045f9b37e8b8842125c82d835625055150)
2024-12-04 09:48:30 +08:00
leo
ca29a232e4
enhance: call gc after viewing commit changed 2024-12-03 10:44:27 +08:00
leo
ea0bec16da
refactor: use control instead of DataContext to get input string 2024-12-03 09:35:32 +08:00
leo
0160600c75
revert: changes about SystemAccentColor (#776)
This reverts commit db8ee3410b.
2024-12-03 09:27:16 +08:00
leo
d1a1b4b2b9
enhance: do NOT show search suggestion if input string is empty (#775) 2024-12-02 21:51:05 +08:00
github-actions[bot]
a52977baf3 doc: Update translation status and missing keys 2024-12-02 13:44:50 +00:00
leo
894f3e9b03
feature: supports searching revision files (#775) 2024-12-02 21:44:15 +08:00
leo
536f225867
feature: allow using Amend while rebasing (#773) 2024-12-02 10:38:40 +08:00
leo
f9c55a94c9
Merge branch 'master' into develop 2024-12-02 09:34:19 +08:00
leo
790e1f6c4b
Merge branch 'release/v8.41' 2024-12-02 09:31:46 +08:00
leo
dc5cbd05ef
version: 8.41 2024-12-02 09:31:38 +08:00
github-actions[bot]
e5ba097141 doc: Update translation status and missing keys 2024-12-02 01:27:03 +00:00
AquariusStar
d4c5306333
localiztion: update (#772) 2024-12-02 09:26:49 +08:00
Alberto de la Cruz
22de6673bc
fix: onSHAPressed avoid right click nav (#770)
- When the right click button is pressed it should not navigate to the parent. Navigation actions only should execute with the left button.
2024-11-30 19:31:13 +08:00
github-actions[bot]
0b73f7b483 doc: Update translation status and missing keys 2024-11-30 11:25:39 +00:00
leo
c1368212df
feature: change the CONTINUE button to SplitButton to support editing/splitting original commit (#767)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-30 19:25:20 +08:00
github-actions[bot]
941ea4a695 doc: Update translation status and missing keys 2024-11-30 09:23:35 +00:00
Nils van Rijsinge
58d1122046
localization: add de_DE key for FilterCommits (#769)
8bd5bd864e
2024-11-30 17:23:23 +08:00
leo
6e69c0567a
refactor: do not use key to start fetch/pull/push/stash directly on macOS (#766)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-29 21:15:12 +08:00
leo
7d857a49f7
ux: add margins for ListItem in InteractiveRebase window (#764)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-29 21:03:11 +08:00
leo
938876e924
fix: wrong column indentation on right side of Interactive Rebase window, for wide commit messages (#764) 2024-11-29 19:12:27 +08:00
leo
e65ac18afc
fix: wrong column indentation on right side of Interactive Rebase window, for wide commit messages (#764) 2024-11-29 19:04:58 +08:00
leo
f028513d49
doc: update tips for manually build 2024-11-29 11:46:27 +08:00
leo
4cb9dbfd14
code_style: remove unused namespace using 2024-11-29 10:35:23 +08:00
leo
4aad6a7f86
fix: System.ArgumentException when hover the commit link multiple times before the first time tooltip shows (#765) 2024-11-29 10:26:36 +08:00
leo
db8ee3410b
refactor: users should change the SystemAccentColor from system-wide settings 2024-11-29 09:59:07 +08:00
leo
dfc03d7a8f
feature: allows to copy branch/tag name from the context menu of selected commit 2024-11-29 09:51:50 +08:00
leo
400aaacf18
fix: wrong column indentation on right side of Interactive Rebase window, for wide commit messages (#764) 2024-11-29 09:21:53 +08:00
leo
58eeeab67b
enhance: set core.autocrlf to false when run git diff to get detail changes of selected file (#761) 2024-11-28 19:36:23 +08:00
github-actions[bot]
8f4d3fd957 doc: Update translation status and missing keys 2024-11-28 05:57:58 +00:00
Efrem Ropelato
ccf03ce2de
fix ita locale: add ResourceInclude en_US.axaml (#762)
* Italian translation

* fix ita locale: add ResourceInclude en_US.axaml
2024-11-28 13:57:46 +08:00
leo
315a226365
code_review: PR #759
* code indent
* update README.md
2024-11-28 09:48:07 +08:00
github-actions[bot]
ba0bb35ca6 doc: Update translation status and missing keys 2024-11-28 01:45:10 +00:00
Efrem Ropelato
e66179aeb8
Italian translation (#759) 2024-11-28 09:44:59 +08:00
leo
e224f59ea7
enhance: clear unhandled key modifer before running command (#748) 2024-11-27 20:21:01 +08:00
leo
1872148d98
fix: the way to deal with local changes did not update after radio toggle changed (#748) 2024-11-27 18:31:50 +08:00
leo
1c0d8a2697
fix: git rev-list do not support --decorate-refs-exclude (#746)
Do not use histories filters to query commit children
2024-11-27 17:06:44 +08:00
leo
d38d1b11e8
fix: typo in Text.Preference.General.ShowChildren 2024-11-27 15:27:57 +08:00
leo
c5d82eb719
ux: new style for ToggleButton.toggle_untracked 2024-11-27 11:10:44 +08:00
leo
c70f94cba1
ux: change Height of repository search bar 2024-11-27 10:08:20 +08:00
leo
cb9110baef
ux: new style for repository sub-view switcher 2024-11-27 10:02:26 +08:00
leo
4fc32b2b59
fix: crash due to font family name is an empty space (#745) 2024-11-27 09:17:18 +08:00
leo
bb41fcea3e
fix: DisplayRange is not updated when text diff view is opened for the first time 2024-11-26 19:52:13 +08:00
leo
a1c48dd11b
project: upgrade AvaloniaUI to 11.2.2 2024-11-26 14:39:58 +08:00
leo
78fcc0117e
ux: style for tooltip
Signed-off-by: leo <longshuang@msn.cn>
2024-11-25 11:42:48 +08:00
leo
7d3b996de0
Merge branch 'master' into develop 2024-11-25 09:38:28 +08:00
leo
ee82067940
Merge branch 'release/8.40' 2024-11-25 09:37:44 +08:00
leo
12deb1d2c3
version: Release 8.40
Signed-off-by: leo <longshuang@msn.cn>
2024-11-25 09:37:02 +08:00
Chiahong
57d4842435
localization: update zh_TW.axaml (#739) 2024-11-25 09:28:55 +08:00
github-actions[bot]
d0f9e994bb doc: Update translation status and missing keys 2024-11-25 01:28:48 +00:00
AquariusStar
772f1a93b4
localiztion: update (#738) 2024-11-25 09:28:36 +08:00
github-actions[bot]
55e3bfa2d4 doc: Update translation status and missing keys 2024-11-25 01:28:22 +00:00
Nils van Rijsinge
831462b594
Add missing de_DE keys (#737)
* localization: add missing de_DE keys

- CommitDetail.Info.Children, General.ShowChildren were added in cc5bb5f
- Text.Fetch.Force was added in 153a1f3
- Repository.HistoriesOrder... were added in b25f9bd
- SHALinkCM.NavigateTo was added in 12f7531

* localization: fix invalid XAML
2024-11-25 09:28:09 +08:00
Nils van Rijsinge
bf4080b773
fix: crash on goto to SHA, NullReferenceException (#741) 2024-11-25 09:24:16 +08:00
leo
4160f8ab9c
fix: only set tooltip if commit exists
Signed-off-by: leo <longshuang@msn.cn>
2024-11-24 21:43:31 +08:00
leo
b2e01f0d3e
feature: add tooltip for SHA in commit message presenter (#734)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-24 21:22:04 +08:00
leo
637f138d63
code_style: remove Rider warning
Signed-off-by: leo <longshuang@msn.cn>
2024-11-24 20:28:32 +08:00
github-actions[bot]
f820c0ccac doc: Update translation status and missing keys 2024-11-24 03:06:15 +00:00
leo
457a1e79c7
code_review: PR #734
* remove unnecessary namespace using
* do NOT set tooltip currently, because CommitDetail.GetParent may cause UI lags and the tooltip DataTemplate is not provided.
* add translations for zh_CN and zh_TW

Signed-off-by: leo <longshuang@msn.cn>
2024-11-24 11:05:55 +08:00
github-actions[bot]
53220f9a36 doc: Update translation status and missing keys 2024-11-24 02:53:30 +00:00
Dmitrij D. Czarkoff
12f75315bd
feat: context menu for a commit in commit message (#734)
* feat: context menu for a commit in commit message

When a commit message happens to contain a commit link and the user elects to right-click it, instead of navigating them to the commit,  present a menu with options to navigate to it or to copy SHA.

* feat: show commit tooltip as well

`_lastHover` in the `if` is also swapped for `match`for consistency with the block body
2024-11-24 10:53:16 +08:00
leo
693940368b
code_style: remove unused variable
Signed-off-by: leo <longshuang@msn.cn>
2024-11-24 10:20:40 +08:00
Dmitrij D. Czarkoff
e3d6ee0f40
fix: better https regex (#735)
Fixes #733
2024-11-24 10:15:17 +08:00
Dmitrij D. Czarkoff
546f628470
fix: don't reverse commit order when cherry-picking (#736)
Fixes #726.  Looks like a980cc987d isn't sufficient.  It sorts the commits according to the ordering in history,  but then CherryPick ViewModel reverses the order.

This commit changes CherryPick ViewModel to use string.Join on the commit list without reordering,  so that the ordering is controlled entirely by the caller.
2024-11-24 09:32:47 +08:00
leo
cd96a28545
fix: typo in English (#731)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-22 18:47:06 +08:00
Martin Garstenauer
3ae3c587d8
fix: typo in English (#731) 2024-11-22 18:43:45 +08:00
leo
c78e2e59d9
enhance: git format-patch
* use `--output=<file>` instead of `-o <dir>` to avoid failure because the directory cannot be created
* make generated patches in order when format multiple commits

Signed-off-by: leo <longshuang@msn.cn>
2024-11-22 18:40:59 +08:00
leo
c50508d4ac
fix: try to fix the issue that the branch tree did not update after deleting multiple branches (#729)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-22 10:42:53 +08:00
github-actions[bot]
378e8d3ea3 doc: Update translation status and missing keys 2024-11-22 01:40:15 +00:00
leo
153a1f30b2
feature: supports toggle --force option for git fetch command (#721)
* Background auto fetch will always disable this option
* This option is not add to pull operation

Signed-off-by: leo <longshuang@msn.cn>
2024-11-22 09:39:50 +08:00
leo
c1c743f2ff
readme: add tips for Linux users
Signed-off-by: leo <longshuang@msn.cn>
2024-11-22 09:17:56 +08:00
leo
1e148c032d
localization: update English translations
Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 21:10:15 +08:00
leo
13504d1831
ux: make sure Icons.Eye center aligned
Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 21:01:06 +08:00
leo
8a95a17b0e
ux: re-order menu items
Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 20:55:59 +08:00
github-actions[bot]
f545ceeb70 doc: Update translation status and missing keys 2024-11-21 12:51:19 +00:00
leo
8bd5bd864e
feature: add context menu to switch histories filter mode to selected commit
Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 20:50:51 +08:00
leo
e6e1e4e82e
fix: can not type characters with accent (#716)
Leaves the `X11PlatformOptions.EnableIme` unsetted, since Avalonia will auto enable it when `LANG` contains `zh`/`ja`/`vi`/`ko`

Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 19:23:59 +08:00
leo
f0d8285416
enhance: only supports using local bare repository as remote (#706)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 14:53:43 +08:00
leo
d98765364d
feature: supports using local repository as remote (#706)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 14:49:32 +08:00
leo
b407dd97a1
enhance: reduce repository scanning time (#728)
* skip special folders, such as `node_modules`, `.svn`, `.vs` .etc.
* change max scanning depth to 5

Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 14:18:41 +08:00
leo
069dc255d1
enhance: skip scanning sub folders if current is not a git repository but has .git subfolder/file (#728)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 12:56:12 +08:00
leo
d3eca59036
refactor: rewrite the way to make sure scan repositories panel shows at least 0.5s (#728)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 12:14:11 +08:00
leo
8342702103
feature: add save as path menu item for commit change (#724)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 10:19:00 +08:00
leo
22157a5c98
fix: tooltip of parent SHA textblock is not closed properly (#727)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 10:06:16 +08:00
leo
a980cc987d
fix: wired ordering when cherry-pick multiple commits (#726)
Since the items in `ListBox.SelectedItems`  are not ordered by their position in the list, but in the order user selected, it need be sorted before `cherry-pick`

Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 09:57:43 +08:00
leo
142987f73d
enhance: use user instead of system to supports OpenAI's o1-preview and o1-mini model (#725)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-21 09:31:38 +08:00
leo
b3ebd84af5
enhance: outputs the response body if OpenAI fails
Signed-off-by: leo <longshuang@msn.cn>
2024-11-20 19:44:58 +08:00
leo
efac161b12
refactor: update Repository.HistoriesFilterMode in Repository.RefreshHistoriesFilters
Signed-off-by: leo <longshuang@msn.cn>
2024-11-20 16:52:30 +08:00
leo
839dab494b
ux: expand height of commit message box in commit template settings (#720)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-20 14:39:53 +08:00
leo
86d7541a7c
enhance: histories filter
* set upstream branch using the same filter mode when change the filter mode of local branch
* also excludes the decorators when current filter mode is excluding.

Signed-off-by: leo <longshuang@msn.cn>
2024-11-20 11:27:43 +08:00
leo
4796024483
fix: modified the translation of Text.CommitDetail.Info.Committer by mistake
Signed-off-by: leo <longshuang@msn.cn>
2024-11-20 10:21:59 +08:00
github-actions[bot]
892c74406f doc: Update translation status and missing keys 2024-11-20 01:57:08 +00:00
leo
71e09ee045
localization: add missing translations for zh_CN and zh_TW (#710)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-20 09:56:51 +08:00
github-actions[bot]
15eaa9eeab doc: Update translation status and missing keys 2024-11-20 01:43:12 +00:00
leo
ab2156bfc2
code_review: PR #710
* SourceGit.Commands.* should not reference SourceGit.ViewModels.*
* remove unused namespace using
* update translations for zh_CN and zh_TW
* use WrapPanel instead of inner ScrollViewer
* some other UI/UX changes

Signed-off-by: leo <longshuang@msn.cn>
2024-11-20 09:42:48 +08:00
github-actions[bot]
dd0580d0f5 doc: Update translation status and missing keys 2024-11-20 01:17:50 +00:00
Dmitrij D. Czarkoff
cc5bb5f6d4
Show the list of children in the commit details (#710)
* feature: add children list to the commit base info view

Useful for navigation between the commits.

* feature: use repository filters to limit children search
* feature: execute children search asynchronously
* feature: respect global commit limit for a good measure
* fix: input lines may contain several commits

The first commit is always the immediate child, so take only 40 initial characters of the line

* fix: hide children behind the preference
* feature: make parents and children scrollable
2024-11-20 09:17:36 +08:00
Jean Franz
cc1eb55cf0
update pt-BR strings (#722)
* fix: update pt-BR strings
* doc: Update translation status and missing keys

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-20 09:16:44 +08:00
leo
7a9c8d7444
ux: enable TextTrimming for author name in FileHistories
Signed-off-by: leo <longshuang@msn.cn>
2024-11-19 20:07:49 +08:00
aikawayataro
8021cd8566
enhance: introduce template engine for commit templates (#704) (#719) 2024-11-19 19:46:44 +08:00
leo
73687689ce
ux: min height of change block in minimap
Signed-off-by: leo <longshuang@msn.cn>
2024-11-19 16:45:07 +08:00
leo
b452e13453
localization: update Text.Repository.HistoriesOrder.ByDate
Signed-off-by: leo <longshuang@msn.cn>
2024-11-19 14:42:59 +08:00
leo
814529a690
feature: add hotkeys to stage/unstage/discard block or selected lines in text diff view (#718)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-19 12:12:54 +08:00
github-actions[bot]
00804e453e doc: Update translation status and missing keys 2024-11-19 03:33:55 +00:00
leo
b25f9bdb6c
feature: supports switch histories order mode (#705)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-19 11:32:13 +08:00
leo
f45bed6f92
fix: avoid NRE
Signed-off-by: leo <longshuang@msn.cn>
2024-11-19 10:31:17 +08:00
leo
3be90b2ef6
Merge branch 'master' into develop 2024-11-19 09:53:24 +08:00
leo
f7ef61f1ce
Merge branch 'release/8.39' 2024-11-19 09:53:03 +08:00
leo
0da46cb90b
version: Release 8.39
Signed-off-by: leo <longshuang@msn.cn>
2024-11-19 09:52:52 +08:00
leo
8b3d129890
code_review: PR #711
* SourceGit.Commands.* should not reference code in SourceGit.ViewModels.

Signed-off-by: leo <longshuang@msn.cn>
2024-11-19 09:46:06 +08:00
Dmitrij D. Czarkoff
309db6e362
enhance: slightly improve statistics (#711)
* use preference MaxHistoryCommits
* use current culture to adjust first days of the week
2024-11-19 09:35:32 +08:00
leo
5b55e3530d
ux: better drop shadow effect for notifications
Signed-off-by: leo <longshuang@msn.cn>
2024-11-19 09:34:09 +08:00
leo
d07a664166
code_review: PR #714
* remove `string.ToLower` warning
* override `OnLoaded` method directly
* clean namespace using

Signed-off-by: leo <longshuang@msn.cn>
2024-11-19 09:27:31 +08:00
Enner Pérez
ea1d966d27
feat: Reset Mode Hotkey (#714) 2024-11-19 09:14:53 +08:00
Dmitrij D. Czarkoff
f4618afee6
feature: switch WinMerge from 3-way to 2-way UI (#712) 2024-11-18 09:03:27 +08:00
leo
3b09ea45f5
feature: add change minimap for text diff view
Signed-off-by: leo <longshuang@msn.cn>
2024-11-17 21:49:33 +08:00
github-actions[bot]
b7abf2ee50 doc: Update translation status and missing keys 2024-11-17 03:16:44 +00:00
Nils van Rijsinge
6f256f6f5b
Add and improve de_DE keys (#709)
* localization: add missing de_DE keys

added for #690

* localization: improve de_DE keys

- mostly code review suggestions from #664
- ClearAllCommitsFilter is not an action of deleting (löschen)
2024-11-17 11:16:31 +08:00
Dmitrij D. Czarkoff
5301645f8b
fix: in commit view get file histories by commit (#708)
When file histories are accessed from the commit details view, run git log for the inspected commit.  Previously the log was ran against current branch regardless whether the inspected commit belongs to that branch.
2024-11-17 11:14:56 +08:00
leo
882878dbe5
refactor: text diff view go to next/prev change
Signed-off-by: leo <longshuang@msn.cn>
2024-11-16 18:24:37 +08:00
leo
52c7388a38
project: upgrade to .NET 9 (#694)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-16 16:06:30 +08:00
leo
134c71064e
feature: add buttons to go to prev/next change in text diff view (#616)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-16 15:17:29 +08:00
leo
cd137e222c
feature: enable --no-ext-diff for git diff command
Signed-off-by: leo <longshuang@msn.cn>
2024-11-16 09:26:13 +08:00
leo
8d84d0f6a1
enhance: improve update filter mode performance
Signed-off-by: leo <longshuang@msn.cn>
2024-11-16 09:14:57 +08:00
leo
4b6bb70f20
fix: parent commit's tooltip does not close when move mouse out of bound fast
Signed-off-by: leo <longshuang@msn.cn>
2024-11-15 16:04:42 +08:00
leo
bd85b41da7
ux: clear histories filter button style
Signed-off-by: leo <longshuang@msn.cn>
2024-11-15 14:50:18 +08:00
leo
5861482455
fix: wrong format
Signed-off-by: leo <longshuang@msn.cn>
2024-11-15 11:55:18 +08:00
leo
30741b0f25
project: upgrade dependencies
* upgrade Avalonia to 11.1.4
* upgrade LiveChartsCore.SkiaSharpView.Avalonia to 2.0.0-rc4.5
* upgrade TextMateSharp to 1.0.64

Signed-off-by: leo <longshuang@msn.cn>
2024-11-15 11:51:13 +08:00
leo
e78b58cb81
localization: remove duplicated keys
Signed-off-by: leo <longshuang@msn.cn>
2024-11-15 11:49:49 +08:00
leo
a5f37800f6
code_style: remove unused var
Signed-off-by: leo <longshuang@msn.cn>
2024-11-15 10:52:39 +08:00
leo
4835c3f1e9
enhance: do NOT trigger double clicking events when user click the blank area of ListBox
Signed-off-by: leo <longshuang@msn.cn>
2024-11-15 10:50:52 +08:00
leo
a5606e80d4
refactor: move codes from Views.FilterModeSwitchButton to ViewModels.Repository
Signed-off-by: leo <longshuang@msn.cn>
2024-11-15 10:19:39 +08:00
github-actions[bot]
66842b1d0d doc: Update translation status and missing keys 2024-11-15 01:19:12 +00:00
AquariusStar
63dfde7cb8
localization: update translation for russian (#700) 2024-11-15 09:18:55 +08:00
leo
a824adf6d3
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2024-11-14 21:15:40 +08:00
leo
28c93da73b
ux: show Unset menu item only if it is necessary (#690)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-14 21:12:18 +08:00
leo
04697093a8
localization: update Text.Repository.FilterCommits.Default (#690)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-14 20:56:49 +08:00
leo
1298a22b00
ux: use dynamic icon for filter tips.
Signed-off-by: leo <longshuang@msn.cn>
2024-11-14 20:53:59 +08:00
leo
44557c066c
enhance: clear histories filter if there's a filter that has different modes with the new one (#690)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-14 20:22:08 +08:00
leo
a53787c754
fix: git rebase --continue fail (#693)
* fix the exit code when start `SourceGit` as core editor (rebasing).
* redesign the layout of working copy page for in-progress states.

Signed-off-by: leo <longshuang@msn.cn>
2024-11-14 19:19:58 +08:00
github-actions[bot]
bb90c86649 doc: Update translation status and missing keys 2024-11-14 07:21:47 +00:00
leo
ca5bc4b4df
refactor: rewrite the histories filter function to supports both include and exclude modes (#690)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-14 15:15:48 +08:00
leo
e3ffe3ef6c
enhance: supports Azure OpenAI REST API (#695)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-14 14:56:21 +08:00
github-actions[bot]
3c5a4741bf doc: Update translation status and missing keys 2024-11-14 01:18:29 +00:00
TheGthr
7ffebec8a6
Add missing fr_FR keys (#696)
* localization: add missing fr_FR keys

---------

Co-authored-by: Theo GAUTHIER <theo.gauthier@soprasteria.com>
2024-11-14 09:18:09 +08:00
leo
ea4e968404
ux: repository left panel layout
Signed-off-by: leo <longshuang@msn.cn>
2024-11-13 11:35:48 +08:00
leo
fd5c1f5105
code_review: PR #692
* remove unnecessary namespace using
* move `Commands.Branch.HasRemote` to `Commands.Remote.HasBranch`
* remove `Commands.Branch.DeleteRemoteTracking` and check branch in `Commands.Branch.DeleteRemote` directly

Signed-off-by: leo <longshuang@msn.cn>
2024-11-13 10:04:28 +08:00
Alberto de la Cruz
8935bdd4c9
feat: delete orphan remote tracking branches (#692)
* feat: remove orphan remote-tracking branches

- Allow user remove local remote-tracking branches without remotes (ie. remote was removed on merge request).
- Included 'DeleteRemoteTracking' and 'HasRemote' util methods to handle this case.

* fix: delete both case (local & remote-tracking)

- We have local and remote-tracking but not a remote branch. We need to remove both or only the tracking based on the checkbox and on the 'hasRemote' condition
2024-11-13 09:33:35 +08:00
aikawayataro
c16a412aa3
fix: SourceGit misspelled as "Source Git" (#689) 2024-11-12 19:55:42 +08:00
aikawayataro
146f383aae
enhance: depend on SO in rpm package (#688)
* enhance: ensure LF line endings used with package manifests
* enhance: depend on shared object instead of package

Back in 211c263, I changed the dependencies to depend on package instead of shared object. This worked well, but introduced some problems for distros other than Fedora (81f76f0). I did this because of problems with the arm64 package, but now I think `__isa_bits` is a reasonable workaround.

* refactor: remove pointless variable checks

`set -u` was introduced in 6461765
2024-11-12 19:50:16 +08:00
leo
5e60780c9f
ux: new tooltip style
Signed-off-by: leo <longshuang@msn.cn>
2024-11-12 18:28:35 +08:00
leo
f66e9c828a
ux: layout for parent commit tooltip
Signed-off-by: leo <longshuang@msn.cn>
2024-11-12 18:14:00 +08:00
Nils van Rijsinge
b0a5a033c6
Add missing de_DE keys (#687)
* localization: add missing de_DE keys

- SaveAsPatch: 6486095
- VisualLine: 1a8acbf
- Hotkeys (Fetch, Pull, Push, CreateBranchOnCommit): d50b2c0
- IssueLinkCM: 163e8cc
- Appearance.FontSize: 774ec65

* doc: Update translation status and missing keys
2024-11-12 18:09:28 +08:00
leo
6e4f971733
feature: show tooltip of parent commit when hover the parent SHA
Signed-off-by: leo <longshuang@msn.cn>
2024-11-12 17:59:50 +08:00
leo
1f158eeded
refactor: use --tags instead of --force for git fetch command if Fetch without tags is turned off (#684)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-12 09:43:24 +08:00
leo
503f700fc2
refactor: open selected revision file (#681)
* Instead of opening the file from current worktree, save the selected revision file to the temp dir and the open it with default editor
* Do NOT set the `IsEnable` property, since the revision file is always available

Signed-off-by: leo <longshuang@msn.cn>
2024-11-11 20:24:17 +08:00
github-actions[bot]
db66ba82a6 doc: Update translation status and missing keys 2024-11-11 06:22:28 +00:00
AquariusStar
d3e1796492
localization: update translation for russian (#680) 2024-11-11 14:22:16 +08:00
leo
050b1d1188
enhance: supports issue link in keywords (#678)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-11 12:16:29 +08:00
github-actions[bot]
0842beb51d doc: Update translation status and missing keys 2024-11-11 03:01:20 +00:00
leo
774ec65ef6
ux: layout for font size settings
Signed-off-by: leo <longshuang@msn.cn>
2024-11-11 11:01:02 +08:00
leo
13805f794a
Merge branch 'develop' 2024-11-11 10:29:09 +08:00
github-actions[bot]
79c1fb63d0 doc: Update translation status and missing keys 2024-11-11 02:26:54 +00:00
leo
82320f3494
revert: PR #673
* the `Commands.QueryCommitChildren` takes too much time when executes in a large repo

Signed-off-by: leo <longshuang@msn.cn>
2024-11-11 10:26:34 +08:00
leo
a969bd9c99
Merge branch 'master' into develop 2024-11-11 09:56:14 +08:00
leo
3ee56ddd29
Merge branch 'release/v8.38' 2024-11-11 09:55:55 +08:00
leo
7df6d32ad2
version: release 8.38
Signed-off-by: leo <longshuang@msn.cn>
2024-11-11 09:55:40 +08:00
leo
67cf23267a
feature: supports open selected revision file with default editor (#674)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-11 09:37:42 +08:00
github-actions[bot]
06656f625e doc: Update translation status and missing keys 2024-11-11 01:31:18 +00:00
leo
bbac6c1478
code_review: PR #673
* add translations for zh_CN and zh_TW
* hide `CHILDREN` line if it is empty

Signed-off-by: leo <longshuang@msn.cn>
2024-11-11 09:31:04 +08:00
github-actions[bot]
055835cac2 doc: Update translation status and missing keys 2024-11-11 01:25:03 +00:00
Dmitrij D. Czarkoff
03f96cc9f8
feature: add children list to the commit base info view (#673) 2024-11-11 09:24:49 +08:00
github-actions[bot]
e2e79fe1b3 doc: Update translation status and missing keys 2024-11-11 01:19:53 +00:00
Bernat Borràs Civil
8b3212e287
localization: update spanish translation (#676) 2024-11-11 09:19:41 +08:00
leo
8de37720fa
code_style: remove Rider warnings
Signed-off-by: leo <longshuang@msn.cn>
2024-11-10 13:19:25 +08:00
leo
daba8e5064
code_review: PR #672
* use formatted string instead of `CommitUrlTitle`

Signed-off-by: leo <longshuang@msn.cn>
2024-11-10 13:19:05 +08:00
Dmitrij D. Czarkoff
bbfc94d624
enhance: several commit links improvements (#672)
* Codeberge (https://codeberg.org/)
* Gitea (https://gitea.org/)
* sourcehut (https://git.sr.ht/)
2024-11-10 12:56:08 +08:00
github-actions[bot]
96c2d0b3ca doc: Update translation status and missing keys 2024-11-10 04:51:30 +00:00
Dmitrij D. Czarkoff
4924e960bf
feature: allow merging tags into branches (#671)
Adds "Merge {tag} into {branch}" menu item to tag menu in histories.
The rest is handled by already existing merge code.
2024-11-10 12:51:15 +08:00
github-actions[bot]
b974436c8a doc: Update translation status and missing keys 2024-11-08 13:25:59 +00:00
Katharina Sternbauer
3b4e037547
add missing german localization for v8.37 (#664)
Add the missing keys in the German translation file.
2024-11-08 21:25:47 +08:00
github-actions[bot]
467371d585 doc: Update translation status and missing keys 2024-11-08 13:25:36 +00:00
Fernando Medeiros
f47f1ac070
Adding missing pt_BR translation keys (#668) 2024-11-08 21:25:20 +08:00
Nils van Rijsinge
1877e37c9c
localization: adjust 4 DE translations (#665)
- use formulation of conventionalcommits.org
- "Aktiviere" was also used for other keys instead of "einschalten"
2024-11-08 19:24:51 +08:00
github-actions[bot]
f3d377fa59 doc: Update translation status and missing keys 2024-11-08 11:24:12 +00:00
AquariusStar
bfe824bbfc
update translation for russian (#666) 2024-11-08 19:23:59 +08:00
github-actions[bot]
9d054a3dbf doc: Update translation status and missing keys 2024-11-07 09:52:43 +00:00
leo
ef84891df1
feature: add new Editor Font Size configuration for all text editors (#661)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-07 17:52:23 +08:00
leo
ffeb63613c
fix: ignoring new files under folder creates invalid .gitignore entries (#663)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-07 17:18:04 +08:00
leo
243ce8b06d
project: use default optimization settings
Signed-off-by: leo <longshuang@msn.cn>
2024-11-07 11:31:51 +08:00
github-actions[bot]
4675b6edb8 doc: Update translation status and missing keys 2024-11-07 03:11:52 +00:00
leo
a919da6b4a
code_style: remove unused code and resources
Signed-off-by: leo <longshuang@msn.cn>
2024-11-07 11:11:35 +08:00
leo
45f4a5a4b1
ux: layout of floating panels (commands and notifications) (#659)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-07 11:07:47 +08:00
leo
88cec05e67
ux: do not use OpenAI logo
Signed-off-by: leo <longshuang@msn.cn>
2024-11-06 14:50:25 +08:00
github-actions[bot]
a715143a16 doc: Update translation status and missing keys 2024-11-06 04:36:13 +00:00
leo
9cb85081ab
feature: saving as patch supports multiple commits (#658)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-06 12:35:55 +08:00
leo
c72506d939
code_style: simplify the way detacting system preferred command key
Signed-off-by: leo <longshuang@msn.cn>
2024-11-06 10:36:10 +08:00
leo
d50b2c0298
code_review: PR #657
* add hotkey `Ctrl+Down/⌘+Down` to fetch directly
* keep translation keys of en_US in order
* add translations for zh_CN and zh_TW
* do NOT using namespace under `SourceGit`
* use `⇧` instead of `Shift` in hotkey tips
* hotkey mismatch on macOS
* hotkeys to start fetch/pull/push directly not work on macOS
* remove the hotkey of `Create Branch` context menu item
   - there are other objects (such as branch and tag) also have the `Create Branch` context menu item without hotkeys
   - on macOS, we already use `⌘+B` to create branch with selected commit, not `Ctrl + B`

Signed-off-by: leo <longshuang@msn.cn>
2024-11-06 10:25:44 +08:00
github-actions[bot]
dc49c1bf76 doc: Update translation status and missing keys 2024-11-06 01:15:14 +00:00
Fernando Medeiros
2e6eca26f7
Adding hotkeys for creating branch, pushing and pulling (#657) 2024-11-06 09:14:56 +08:00
leo
fdf30aa7cc
fix: custom action error message format
Signed-off-by: leo <longshuang@msn.cn>
2024-11-05 12:24:33 +08:00
leo
680cdca28d
feature: handle custom action error output
Signed-off-by: leo <longshuang@msn.cn>
2024-11-05 12:15:20 +08:00
leo
9d2c2df6b3
ux: issue link tooltip max width
Signed-off-by: leo <longshuang@msn.cn>
2024-11-05 11:00:04 +08:00
github-actions[bot]
c337d67bbe doc: Update translation status and missing keys 2024-11-05 01:48:51 +00:00
Bernat Borràs Civil
8f5dfcc209
Add missing translations in spanish (#655) 2024-11-05 09:48:37 +08:00
leo
dcf5093406
enhance: avoid that diff view refresh more than one times
Signed-off-by: leo <longshuang@msn.cn>
2024-11-04 18:21:07 +08:00
github-actions[bot]
a5aa2254f6 doc: Update translation status and missing keys 2024-11-04 08:49:32 +00:00
leo
6209326fe0
code_review: PR #652
* update localization for zh_CN and zh_TW
* change the icon for `Icons.Lines.All`
* reorder diff view toolbar buttons
* move private methods after protected

Signed-off-by: leo <longshuang@msn.cn>
2024-11-04 16:49:15 +08:00
github-actions[bot]
8d4afafd2d doc: Update translation status and missing keys 2024-11-04 08:33:05 +00:00
Göran W
1a8acbf934
feature: diff - toggle show all lines (#615) (#652)
* Renamed 1 of 2 SyncScrollOffset props, for clarity

The property "SyncScrollOffset" in TextDiff is distinct from the one with the same name in TwoSideTextDiff. These two properties are used in separate (though slightly related) ways and are not really connected.

The one in TwoSideTextDiff is mainly used to keep the scroll-pos of the two SingleSideTextDiffPresenter views in sync (aligned), while the one in TextDiff is used only to preserve/reset the scroll-pos in the single CombinedTextDiffPresenter view when (re)loading Diff Content (so not really syncing anything).

To clarify this and to make the two properties more distinguishable, I renamed the one in TextDiff to simply "ScrollOffset".

* Added icon and string for "Show All Lines"

New StreamGeometry "Icons.Lines.All" using SVG path from "text_line_spacing_regular" at https://avaloniaui.github.io/icons.html.
New String "Text.Diff.VisualLines.All" for en_US locale (no translations yet).

* Implemented new TextDiff feature "Show All Lines" (toggle)

* Added new ToggleButton in DiffView toolbar, visible when IsTextDiff, disabling the buttons "Increase/Decrease Number of Visible Lines" when on.

* Added new Preference property "UseFullTextDiff".

* Added StyledProperty "UseFullTextDiffProperty" in TextDiffView, with a DataTemplate binding to the corresponding preference property.

* When changed, UseFullTextDiffProperty is handled identically as UseSideBySideDiffProperty (via new helper method RefreshContent(), for unification with OnDataContextChanged()).

* Added new method DiffContext.ToggleFullTextDiff() for changing the preference property and reloading the diff content.

* Implemented the new feature by overriding the "unified" (number of context lines) for Commands.Diff() with a very high number.

NOTE: The number used (~1 billion) is supposed to be the highest one working on Mac, according to this forum comment: https://stackoverflow.com/questions/28727424/for-git-diff-is-there-a-uinfinity-option-to-show-the-whole-file#comment135202820_28846576
2024-11-04 16:32:51 +08:00
leo
779b38be28
localization: change OpenAI to AI
Signed-off-by: leo <longshuang@msn.cn>
2024-11-04 16:04:19 +08:00
leo
ad01eb442d
localization: change OpenAI to AI
Signed-off-by: leo <longshuang@msn.cn>
2024-11-04 16:00:40 +08:00
leo
635396008d
fix: clicking Open in Browser context menu item of issue link does not work (#651)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-04 15:48:28 +08:00
github-actions[bot]
2f628b0f06 doc: Update translation status and missing keys 2024-11-04 07:35:07 +00:00
leo
fb9e342ee0
localization: add translations for zh_CN and zh_TW
Signed-off-by: leo <longshuang@msn.cn>
2024-11-04 15:34:50 +08:00
github-actions[bot]
25028efa4d doc: Update translation status and missing keys 2024-11-04 07:32:24 +00:00
leo
163e8cc0a4
feature: add context menu for issue link in commit details panel (#651)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-04 15:31:55 +08:00
leo
64860950c7
localization: update en_US
Signed-off-by: leo <longshuang@msn.cn>
2024-11-04 12:03:47 +08:00
leo
310c786693
feature: ignore case when finding visual studio solution file
Signed-off-by: leo <longshuang@msn.cn>
2024-11-04 11:54:18 +08:00
leo
921b8599df
Merge branch 'master' into develop 2024-11-04 10:07:37 +08:00
leo
9452b796a5
Merge branch 'release/v8.37' 2024-11-04 10:07:12 +08:00
leo
5966b8ac08
version: Release 8.37
Signed-off-by: leo <longshuang@msn.cn>
2024-11-04 10:06:51 +08:00
leo
6b348fbd1a
code_review!: PR #648
* rewrite `Models.ExternalTool` to use `_execArgsGenerator` instead of `OpenCmdArgs` and `ArgTransform`
* remove dependency of `System.Linq` due to AOT limitations
* since the `Visual Studio` is only available on Windows, use `TryAdd` directly.
* update `README.md`

BREAKING CHANGE: now the key in `external_editors.json` uses the same name with external tool.

Signed-off-by: leo <longshuang@msn.cn>
2024-11-04 10:02:20 +08:00
Dmitrij D. Czarkoff
1d0098703e
feature: add support for Visual Studio as external tool (#648)
* feature: support Visual Studio external tool on Windows
* feature: when opening in Visual Studio, try to locate solution file
2024-11-04 09:22:16 +08:00
Chiahong
fba84c8297
fix: prevent crash in Custom Action when executable path is missing (#646) 2024-11-03 17:00:17 +08:00
Chiahong
06762615b6
localization: update zh_TW.axaml (#645) 2024-11-03 14:45:19 +08:00
leo
58fbb16347
code_review: PR #644
- use `AutoFocusBehaviour.IsEnable` instead of toggle focus by code in `OnOpened `

Signed-off-by: leo <longshuang@msn.cn>
2024-11-03 10:58:50 +08:00
Aliaksandr Liakhavets
794163fe1c
Set default focus on password text box (#644)
Co-authored-by: AleksandrLiakhavetsEPAM <97155822+AleksandrLiakhavetsEPAM@users.noreply.github.com>
2024-11-03 09:25:32 +08:00
github-actions[bot]
1fecbbb37f doc: Update translation status and missing keys 2024-11-02 03:12:01 +00:00
AquariusStar
174430338c
localiztion: update (#641) 2024-11-02 11:11:48 +08:00
leo
2f9e825b63
refactor: pass Models.Commit instead of just sha of it
Signed-off-by: leo <longshuang@msn.cn>
2024-11-01 18:10:22 +08:00
leo
ba3c72585d
enhance: use Inter as default font for all platforms (#639)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-01 17:54:21 +08:00
github-actions[bot]
26fe56e065 doc: Update translation status and missing keys 2024-11-01 09:25:17 +00:00
leo
a36058ec51
feature: supports custom actions (#638)
Signed-off-by: leo <longshuang@msn.cn>
2024-11-01 17:23:31 +08:00
leo
7c5de7e48c
enhance: do NOT restore fullscreen window on macOS
Signed-off-by: leo <longshuang@msn.cn>
2024-11-01 12:22:47 +08:00
leo
98612b0024
code_style: remove unused code
Signed-off-by: leo <longshuang@msn.cn>
2024-11-01 10:00:37 +08:00
leo
e3c0f7d496
refactor: rewrite chromeless window (#634)
* use system chrome instead of custom caption button on macOS
* move `BeginMoveWindow` and `MaximizeOrRestoreWindow` to `ChromelessWindow`
* better supports for fullscreen mode on macOS
* redesign the layout of title bar for all windows

Signed-off-by: leo <longshuang@msn.cn>
2024-11-01 09:38:42 +08:00
leo
1999e4bf47
ux: remove button padding and use content alignment to center text
Signed-off-by: leo <longshuang@msn.cn>
2024-10-31 20:02:31 +08:00
github-actions[bot]
39250466d5 doc: Update translation status and missing keys 2024-10-30 21:56:22 +00:00
AquariusStar
9b2e0bc5cf
localization: update (#632) 2024-10-31 05:56:06 +08:00
GadflyFang
cffcf3448e
fix: query file size quote filename (#629)
Signed-off-by: Gadfly <gadfly@gadfly.vip>
2024-10-30 18:48:41 +08:00
Masgalor
9816a5e8ba
fix: Make RPM builds compatible with OpenSUSE (libX11) (#628) 2024-10-30 18:45:25 +08:00
github-actions[bot]
0228bef1db doc: Update translation status and missing keys 2024-10-30 10:40:00 +00:00
leo
3cbffa6ff9
feature: add an option in repository configuration to enable --prune on fetch (#590)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 18:39:38 +08:00
leo
a4befd010a
code_review: PR #627
* add minimal height for both unstaged and staged changes view

Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 18:10:53 +08:00
yindf
2d7ea561e2
fix bug that stuck auto fetch when pull failed & make stage area resizeable (#627)
* fix watcher stuck by pull
* make stage area resizeable

---------

Co-authored-by: yindf <yindf@mail.jj.cn>
(cherry picked from commit a842aca042a73cb5fa3995794aae2a2e3540b37f)
2024-10-30 17:59:59 +08:00
leo
fe03512c5c
ux: tooltip of commit signing status icon
Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 15:10:26 +08:00
leo
195325187d
ux: tooltip of commit signing status icon
* do NOT show signer if it is not available
* new tooltip style

Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 15:01:08 +08:00
GadflyFang
4e87b25765
enhance: show commit signer (#626)
Signed-off-by: Gadfly <gadfly@gadfly.vip>
2024-10-30 14:48:37 +08:00
leo
e680f8477e
readme: contributor image
Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 13:07:30 +08:00
leo
f8f169d23a
fix: typo in commit signing status info
Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 12:58:46 +08:00
leo
9abda2c6ab
ux: move the commit signing status icon to the last
Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 10:27:14 +08:00
leo
81fc859a37
readme: keep the same order for locales
Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 10:17:44 +08:00
leo
df3b4e424a
localization: add fallback locale for es_ES (#623)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 10:13:52 +08:00
leo
1adcf4dd80
enhance: do NOT query gpg.ssh.allowedSignersFile every time while getting commit's signing status
Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 10:10:17 +08:00
leo
c2e83778cc
readme: keep the same order for locales
Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 09:56:57 +08:00
leo
4a6cbddeac
refactor: select the previous tab while closing the actived one (#621)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 09:53:58 +08:00
leo
b175ab3a3e
code_review: PR #623
* keep locales in order
* update README.md

Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 09:47:33 +08:00
Masgalor
81f76f0771
fix: Make RPM builds compatible with OpenSUSE (#622) 2024-10-30 09:45:41 +08:00
leo
28fad000ab
project: add missing scripts to solution file
Signed-off-by: leo <longshuang@msn.cn>
2024-10-30 09:44:05 +08:00
github-actions[bot]
0474441240 doc: Update translation status and missing keys 2024-10-30 01:43:21 +00:00
jmmanzano
ca5f2f92ba
localization: added es_ES.axaml (#623)
localization: added es_ES.axaml
2024-10-30 09:43:10 +08:00
github-actions[bot]
30e0e84b63 doc: Update translation status and missing keys 2024-10-30 01:33:23 +00:00
AquariusStar
8f68e96607
loacaliztion: update translate (#624) 2024-10-30 09:33:10 +08:00
leo
279b1819a3
feature: show commit gpg sign status (#614)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-29 21:03:45 +08:00
leo
5c92fbdb37
fix: MinWidth not work while manually resizing window (#619)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-29 19:59:22 +08:00
leo
ee20eba047
ux: limit the minimal width/height of resizable panels (#619)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-29 16:51:54 +08:00
github-actions[bot]
acd61f49a8 doc: Update translation status and missing keys 2024-10-29 01:59:40 +00:00
leo
1442dcfe00
feature: allow fetch the latest remote changes into local branch which is not current branch (#617)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-29 09:59:13 +08:00
leo
489b57858f
enhance: improve NumericSort.Compare performance
Signed-off-by: leo <longshuang@msn.cn>
2024-10-29 09:36:26 +08:00
github-actions[bot]
651d313496 doc: Update translation status and missing keys 2024-10-28 13:37:13 +00:00
leo
498d2b54ae
feature: add per-repository setting for prefered OpenAI service
* If there is only one OpenAI service available, discard the setting of prefered OpenAI service. Instead, use it directly
* If there are multiple OpenAI service available, try to find the prefered one or show a context menu for users to choose the one they want to use

Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 21:36:10 +08:00
leo
48725a7937
code_review: PR #612
Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 19:42:54 +08:00
ybeapps
a363f67f31
bug: fix int out of bounds for branch names with long numbers (#612) 2024-10-28 19:24:43 +08:00
leo
6c390d2f04
ux: layout of stage page
Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 18:06:27 +08:00
leo
6cc0c54ac1
enhance: remember last selection of some options while stashing changes (#610)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 17:55:32 +08:00
leo
1418591b0b
refactor: rewrite command git stash push
Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 16:58:53 +08:00
github-actions[bot]
a7cccd5c1d doc: Update translation status and missing keys 2024-10-28 08:52:00 +00:00
leo
566d36ca59
feature: add option to enable --keep-index option of git stash push command (#610)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 16:51:42 +08:00
leo
3e6e0befaa
readme: update macOS usage (#609)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 16:37:57 +08:00
github-actions[bot]
216d2d02bd doc: Update translation status and missing keys 2024-10-28 07:56:57 +00:00
leo
134d69d403
feature: supports generate commit message by OpenAI with selected staged changes (#608)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 15:56:38 +08:00
github-actions[bot]
9d1840f78c doc: Update translation status and missing keys 2024-10-28 03:55:59 +00:00
leo
bb47dc28ef
localization: copy Text.Preference.AI.Name from Text.Name for ru_RU
Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 11:55:39 +08:00
github-actions[bot]
f1dc46c251 doc: Update translation status and missing keys 2024-10-28 03:27:59 +00:00
leo
148e2fa1e5
fix: delete wrong key by mistake
Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 11:27:38 +08:00
github-actions[bot]
3490d62f3c doc: Update translation status and missing keys 2024-10-28 03:00:34 +00:00
leo
1044915be1
refactor: OpenAI integration
* supports configure multiple services
* supports select service when generate commit message by OpenAI

Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 11:00:11 +08:00
GadflyFang
8280287362
doc: add link on badges (#607)
Signed-off-by: Gadfly <gadfly@gadfly.vip>
2024-10-28 09:45:16 +08:00
leo
ff0354d606
Merge branch 'master' into develop 2024-10-28 09:33:41 +08:00
leo
bb29476a80
Merge branch 'release/v8.36' 2024-10-28 09:33:22 +08:00
leo
9caa20cef0
version: Release 8.36
Signed-off-by: leo <longshuang@msn.cn>
2024-10-28 09:33:10 +08:00
github-actions[bot]
6447590491 doc: Update translation status and missing keys 2024-10-28 01:28:10 +00:00
AquariusStar
bde648eae8
Localization: updating the translation (#606) 2024-10-28 09:27:58 +08:00
leo
a8ae887320
fix: wrong merge command for Meld (#603)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-27 16:56:38 +08:00
github-actions[bot]
34c3dd4df5 doc: Update translation status and missing keys 2024-10-27 08:40:10 +00:00
Chiahong
11bdfcdd79
localization: update zh_TW.axaml (#604) 2024-10-27 16:39:57 +08:00
GadflyFang
28773f0e2d
doc: Make the badges clickable and redirect to the TRANSLATION.md (#601)
* Make the badges clickable and redirect to the TRANSLATION.md
* Move localization check script file position

---------

Signed-off-by: Gadfly <gadfly@gadfly.vip>
2024-10-25 14:51:49 +08:00
github-actions[bot]
7e1624c2d6 doc: Update translation status and missing keys 2024-10-25 06:24:15 +00:00
leo
398b000136
localization: remove unused translations
Signed-off-by: leo <longshuang@msn.cn>
2024-10-25 14:23:53 +08:00
github-actions[bot]
b90a2b05f1 doc: Update translation status and missing keys 2024-10-25 06:22:50 +00:00
GadflyFang
32de28c16e
ci: add Localization Check CI (#600)
Signed-off-by: Gadfly <gadfly@gadfly.vip>
2024-10-25 14:22:38 +08:00
leo
fa4f0a6bd4
ux: move prompt settings to advanced
Signed-off-by: leo <longshuang@msn.cn>
2024-10-25 09:51:51 +08:00
Douglas Cunha
63f75dc589
refactor: improve pt_BR localization clarity and consistency
- Refactor pt_BR localization strings for improved clarity and consistency in UI text across various components.
- Add password masking to the API key input field.
2024-10-24 10:17:35 -03:00
GadflyFang
c08c307c7a
enhance: add GitLab Issue/MR sample rules (#598)
* enhance: add GitLab Issue/MR sample rules
* fix: remove blank in zh_CN

---------

Signed-off-by: Gadfly <gadfly@gadfly.vip>
2024-10-24 18:07:04 +08:00
leo
d3d71af0e8
enhance: only alloc temp buffer once time (#597)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-24 17:07:30 +08:00
leo
339bceef3d
fix: files should be displayed after folders (#597)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-24 17:00:03 +08:00
leo
76a7a2228f
feature: use numeric sorting for all trees (#597)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-24 15:11:10 +08:00
leo
12bb915bd8
code_review: PR #596
- Add `ViewModels.Preference.PrepareOpenAIPrompt()` method to generate default prompt instead of a const fallback value. Therefore, it is more convenient for us to modify the default value in the Preference dialog.
- Modify the default prompts. Rename `SubjectPrompt` to `GenerateSubjectPrompt`. Rename `SummaryPrompt` to `AnalyzeDiffPrompt`.
- Rewrite the way to build OpenAI user content for subject generation

Signed-off-by: leo <longshuang@msn.cn>
2024-10-24 10:22:06 +08:00
Douglas Cunha
2f68aed817
feat: improve commit message generation with AI prompts (#596)
- Refactor the commit message generation process to utilize default prompts and enhance clarity while eliminating redundancy.
- Added new properties for subject and summary prompts, while improving cancellation support in async task handling.
- feat: add AI prompts for commit message generation.
- Updated the formatting of the package reference for consistency in the project file.
- Add properties for managing OpenAI subject and summary prompts in the Preference view model.
- Refactor layout and add new input fields for AI subject and summary prompts in the preferences view.
2024-10-24 09:31:05 +08:00
leo
547c28adb8
fix: locks list does not update after unlock
Signed-off-by: leo <longshuang@msn.cn>
2024-10-23 16:55:22 +08:00
leo
a5594130ed
code_style: run dotnet format
Signed-off-by: leo <longshuang@msn.cn>
2024-10-23 15:28:09 +08:00
leo
d4302b4faa
refactor: render +/- marks after line number
Signed-off-by: leo <longshuang@msn.cn>
2024-10-23 15:19:59 +08:00
Katharina Sternbauer
5707d0b79a
translation: Add missing DE keys, fix misspelling (#594)
- Fix one misspelling where a "c" was missing before a "c" in the work Auschecken
- Add missing DE translations for new feature items
2024-10-23 14:27:22 +08:00
leo
d21a8f2449
refactor: rewrite OpenAI integration
Signed-off-by: leo <longshuang@msn.cn>
2024-10-23 14:05:40 +08:00
leo
f6e1e65a53
feature: add +/- in line number to indicate type of change (#593) 2024-10-23 12:03:22 +08:00
leo
06fd49ba92
feature: support --signoff for git commit command (#591)
Signed-off-by: leo <longshuang@msn.cn>
2024-10-23 09:46:27 +08:00
leo
b9d7f908c9
refactor: do NOT use the --prune parameter for git fetch command (#590) 2024-10-22 16:54:21 +08:00
leo
077e35b860
code_style: allowEmpty is not needed any more 2024-10-22 15:01:20 +08:00
leo
93e964dcb6
readme: add badges 2024-10-22 11:21:07 +08:00
leo
728d003717
code_review: PR #589
* do not using namespace `SourceGit.*`
* should use branch instead of repository
2024-10-22 10:06:53 +08:00
leo
1855b43750
feature: allow empty commit (#587) 2024-10-22 10:03:43 +08:00
Luis Frey
a8a7775b83
feature: add ${branch_name} option to commit templates (#589) 2024-10-22 09:44:53 +08:00
leo
6dac26d525
refactor: since there is a hotkey to stage and commit, remove the unsafe auto-stage configure 2024-10-22 09:29:49 +08:00
leo
31e7bef01d
docs: typo in readme 2024-10-21 20:28:49 +08:00
leo
bb45a5af8e
enhance: use \S instead of \w to supports emoji character 2024-10-21 17:07:56 +08:00
leo
3296f90feb
enhance: only show two chars when they are all ascii letters or digits (#585) 2024-10-21 16:58:15 +08:00
leo
a5e783da08
enhance: disable Fast-Forward for worktree which is not current branch 2024-10-21 16:39:57 +08:00
leo
3b1a54dffd
refactor: use git update-ref $LOCAL_BRANCH $REMOTE_BRANCH instead of git fetch $REMOTE $LOCAL_BRANCH $REMOTE_BRANCH to fast-forward local branch without checkout it first. 2024-10-21 16:20:34 +08:00
leo
00a2ec5abe
enhance: conventional commit message builder supports breaking changes prefix (#584) 2024-10-21 15:47:54 +08:00
Antony David
3804b0a828
fix(histories): handle commits with breaking changes (#584) 2024-10-21 15:41:31 +08:00
Dmitrij D. Czarkoff
bb6ceb03b9
fix: Display all parents even if there are more then 2 (#583) 2024-10-21 15:38:30 +08:00
leo
67b6a6d9d5
refactor: using custom PATH instead of reading it from zsh (#581)
* run `echo $PATH > ~/Library/Application\ Support/SourceGit/PATH` to generate to custom PATH file for SourceGit
2024-10-21 15:31:13 +08:00
leo
188bf02349
Merge branch 'master' into develop 2024-10-21 09:15:22 +08:00
leo
0bb502c7cf
Merge branch 'release/v8.35' 2024-10-21 09:15:03 +08:00
leo
f633c5260e
version: Release 8.35 2024-10-21 09:14:49 +08:00
AquariusStar
67b9d7a305
work on translation (#579) 2024-10-21 09:13:34 +08:00
Chiahong
204d5cecec
localization: update zh_TW.axaml (#578) 2024-10-20 22:41:16 +08:00
leo
0539a94cbe
feature: mark deleted repository and auto remove it after scan default clone dir (#576) 2024-10-20 20:42:14 +08:00
leo
9668efbd8c
code_style: remove Rider warnings 2024-10-20 20:16:54 +08:00
leo
45869c27b8
enhance: ignore untracked files when staging all changes with INCLUDE UNTRACKED FILES turned off (#577) 2024-10-20 18:32:05 +08:00
leo
7c253637fc
enhance: supports escaped remote url (#575) 2024-10-18 18:02:40 +08:00
leo
07cc0b7423
fix: Simplified and Traditional Chinese content is reversed 2024-10-18 16:48:42 +08:00
leo
d3bca20034
ux: using Grid instead of StackPanel to layout convertional commit change type 2024-10-18 16:33:13 +08:00
leo
72b46a6e16
ux: use the same icon for conventional commit message generator (#574) 2024-10-18 16:28:07 +08:00
leo
9153bbe07f
feature: add conventional commit message generator (#574) 2024-10-18 16:20:45 +08:00
leo
2821bab77c
ux: layout of histories toggle buttons 2024-10-18 14:48:15 +08:00
leo
62ac4290ca
feature: add a toggle button to enable --reflog when query commits 2024-10-18 14:27:20 +08:00
leo
f2de7a0c21
refactor: new avatar fallback string generator 2024-10-18 11:51:34 +08:00
leo
a3b0fec67a
localization: remove unused keys 2024-10-18 11:20:14 +08:00
leo
1e11a74a49
localization: remove unused keys 2024-10-18 11:01:24 +08:00
leo
2cfa2bf6c5
enhance: show suggestion popup after search commit filter type changed 2024-10-18 10:43:04 +08:00
AquariusStar
1277112a5e
work on translation (#573) 2024-10-18 07:58:09 +08:00
leo
3da52208ba
enhance: force enable --patch option 2024-10-17 19:20:14 +08:00
leo
9e14327f3c
feature: add context menu to copy message of an annotated tag (#567) 2024-10-17 17:38:29 +08:00
leo
fa2eb0cd26
enhance: use --prune=now instead of --prune for git gc command 2024-10-17 15:50:42 +08:00
leo
b23f284e21
feature: add context menu for selected change in stashes page 2024-10-17 15:37:14 +08:00
leo
d0ae24b0b7
localization: update tips 2024-10-17 15:20:16 +08:00
leo
f6e0b0b1c0
feature: hover on tag view shows the message of it (#567) 2024-10-17 14:57:05 +08:00
leo
9ed5226eab
ux: change the width of notification popup to 480px (#556) 2024-10-16 16:23:59 +08:00
leo
573db575b6
enhance: update keyword regex for commit subject 2024-10-16 16:01:52 +08:00
leo
aae5f10f66
enhance: update REG_KEYWORD_FORMAT2 2024-10-16 15:49:06 +08:00
leo
7d800dc0bf
enhance: update REG_KEYWORD_FORMAT2 2024-10-16 15:43:20 +08:00
leo
7779b05680
ux: change max width of left panel in repository view to 500px (#569) 2024-10-16 15:27:18 +08:00
leo
6abb6c6469
ux: style for HEAD decorator 2024-10-16 15:18:08 +08:00
leo
0621ed950e
enhance: update keywords prefix regex 2024-10-16 14:57:45 +08:00
leo
8f9e2cefe9
feature: use bold font for keyword prefix of commit subject
Regexes to detect `keyword`
* ^(\[[\w\s]+\])
* ^(\w+\s?:)
2024-10-16 14:48:52 +08:00
leo
7f8a1c384a
ux: add tips for selecting multiple commits in histories view 2024-10-16 11:58:31 +08:00
leo
7df96377b8
ux: new remote icon 2024-10-15 20:03:36 +08:00
leo
9bccb34ca7
ux: re-order built-in graph colors 2024-10-15 19:46:44 +08:00
leo
811d5568bf
code_review: PR #568
* keeps all keys in order
2024-10-15 17:45:41 +08:00
Nils van Rijsinge
0e812f548e
Add DE keys for new features (stash, author time, chart and cherry-pick) (#568)
* localization: add new DE keys

OnlyStagedChanges and TipForSelectedFiles added in 68519c7
AuthorTime and ShowAuthorTime added in 21e15a1
Chart added in d9db7eb
AppendSourceToMesssage, Mainline and Mainline.Tips added in 5fef6e9

* localization: improve DE grammar for english words
2024-10-15 17:44:01 +08:00
leo
b6468e310b
code_style: rewrite Commands.QueryTags.ParseLine 2024-10-15 16:41:25 +08:00
leo
5bad969bb7
refactor: use '\0' instead of '$' to split fields 2024-10-15 16:26:44 +08:00
leo
2aa6383f41
project: update package dependencies
* upgrade `AvaloniaUI` to 11.1.4
* upgrade `CommunityToolkit` to 8.3.2
2024-10-15 15:27:32 +08:00
leo
1ec7123584
ux: add Background property to avoid unclear display for selected state 2024-10-15 14:48:29 +08:00
leo
9dcb46603d
screenshots: update 2024-10-15 11:23:57 +08:00
leo
f5912c655f
ux: default graph colors 2024-10-15 10:23:41 +08:00
leo
85e4f38654
ux: head ref style in commit details panel 2024-10-15 10:00:24 +08:00
leo
b44d4d26c9
ux: do not use graph color for commit refs (decorators) in commit details panel 2024-10-15 09:53:22 +08:00
leo
07c2e9f927
fix: decorator do not redraw after tag background property changed 2024-10-15 09:43:09 +08:00
leo
ccdc849baa
code_style: run dotnet format 2024-10-15 09:39:01 +08:00
leo
4c60818d68
ux: new style for current HEAD 2024-10-15 09:18:24 +08:00
leo
6908216de5
ux: new commit graph decorator style (#564) 2024-10-14 21:09:03 +08:00
leo
207bcf0fbf
ux: download button icon color 2024-10-14 17:18:40 +08:00
leo
010eb65edb
readme: remove tips for start app from commandline 2024-10-14 17:04:39 +08:00
leo
a232f50755
feature: try to read PATH from zsh 2024-10-14 16:59:20 +08:00
leo
1a4055ee97
localization: update Text.CherryPick.Mainline 2024-10-14 16:02:39 +08:00
leo
cc66afe5e2
fix: ${files:N} will always be replaced with the first change path (#487)
* wrong loop index passed to `changes`
2024-10-14 15:31:29 +08:00
leo
5fef6e93b9
enhance: cherry-pick (#563)
* supports to cherry-pick a merge commit
* add option to enable the `-x` parameter
2024-10-14 15:20:02 +08:00
leo
688f10e02f
Merge branch 'master' into develop 2024-10-14 09:27:53 +08:00
leo
efc14fed36
Merge branch 'release/v8.34' 2024-10-14 09:27:32 +08:00
leo
49e769b025
version: Release 8.34 2024-10-14 09:27:24 +08:00
AquariusStar
84e724f014
Work on translate: update (#562) 2024-10-14 09:26:03 +08:00
leo
95a63eb98d
ux: dropshadow effect for selected chunk buttons in text diff view 2024-10-12 15:28:30 +08:00
leo
d9db7eb1d4
update: add LiveChart2 links to about page 2024-10-12 11:27:47 +08:00
leo
ba307189e7
readme: update highlights 2024-10-12 10:56:10 +08:00
leo
c2f68daaf5
readme: add tooltip for macOS users 2024-10-12 10:52:39 +08:00
leo
b9a24ceb53
feature: add hotkeys to move interactive rebase item up and down (#557) 2024-10-12 10:28:54 +08:00
leo
adca61c538
ux: re-order items in preference panel 2024-10-12 09:59:19 +08:00
leo
21e15a1af4
feature: add a toggle in perference to show author time instead of committer time in graph (#558) 2024-10-12 09:56:33 +08:00
AquariusStar
1f7a54e61e
Work on translation (#559) 2024-10-12 09:21:04 +08:00
leo
c67cdb931f
enhance: stop switching workspace when one or more tasks are running in opened pages 2024-10-11 17:37:34 +08:00
leo
6ca6399bd3
enhance: re-run searching after search option changes 2024-10-11 11:29:33 +08:00
leo
b5000f920f
enhance: highlight selected search commits 2024-10-11 11:04:27 +08:00
leo
c2b17ef9d0
fix: changing the repository URL only changes the fetch URL if push URL using a different URL (#553) 2024-10-11 10:03:42 +08:00
leo
93706449be
enhance: only update grammar if it is necessary 2024-10-10 15:42:26 +08:00
leo
68519c76ca
refactor: stash local changes (#550)
* when try to stash all the local changes, add a option to only stash the staged changes
* stash changes in selected files will prompt user - both staged and unstaged changes of selected file(s) will be stashed
2024-10-10 11:54:59 +08:00
leo
ac74e4ba32
enhance: change the default reset mode to --mixed which is the default action in git commandline (#551) 2024-10-10 09:17:31 +08:00
leo
14334b08d2
enhance: do not save gpg.openpgp.program if gpg.program exists and the value has not been changed (#544) 2024-10-09 17:29:53 +08:00
leo
c8a13bc4e9
enhance: returns the instance of ViewModels.Preference directly if it exists 2024-10-09 15:58:44 +08:00
leo
bfb97dff72
ux: warning text style 2024-10-09 15:30:25 +08:00
leo
4d14302929
refactor: remove scope parameter while getting git configuration (#544) 2024-10-09 14:20:43 +08:00
leo
249706c1ef
fix: turn off GPG Signing when create a new tag does not work if tag.gpgsign is enabled 2024-10-09 11:55:24 +08:00
leo
857ba85d9f
ux: do not use small font size for branches/tags/submodules search box 2024-10-09 09:41:37 +08:00
leo
fb62732a92
code_review: PR #547
* syntax error at line 523
* keep keys in order
2024-10-09 09:18:30 +08:00
Nils van Rijsinge
eab36f08b3
localization: add DE keys for new features (#547)
InCurrentBranch added in 130c98a
Repo.CommitWithAutoStage added in 9a8f4e2
Workingcopy.CommitWithAutostage added in 9a8f4e2 and updated in 19e930e, 99c2ffe
CommitTip updated in 99c2ffe
IgnoreWhitespace added in d2a005c
DefaultRemote added in d746e35
IncludeIgnored added in 4e57cd5
2024-10-09 09:15:57 +08:00
leo
8ddf6e87e9
enhance: set GIT_SSH_COMMAND only if it has not been provided (#544) 2024-10-08 16:19:03 +08:00
aikawayataro
3951549e5c
enhance: append to PATH on MacOS instead of overriding it (#546) 2024-10-08 16:07:50 +08:00
leo
9a2ea71f41
Merge branch 'master' into develop 2024-10-08 09:28:55 +08:00
leo
af888e17de
Merge branch 'release/v8.33' 2024-10-08 09:25:04 +08:00
leo
6ccdf47f99
version: Release 8.33 2024-10-08 09:24:25 +08:00
leo
3dcb32aec9
ux: new style for discard confirm popup 2024-10-06 22:38:13 +08:00
leo
029f56cb28
feature: the default merge option supports reading branch.<name>.mergeoptions configuration (#540) 2024-10-06 22:21:18 +08:00
leo
7262437385
ux: new style for pushing a new branch to remote 2024-10-06 21:48:26 +08:00
AquariusStar
9d3a87469f
Work on the translation (#541) 2024-10-05 10:44:55 +08:00
leo
3ce06cc6b5
ux: add tooltip for change status icon (#537) 2024-10-03 19:01:49 +08:00
leo
5005b62eea
project: remove unused folder 2024-10-03 18:32:13 +08:00
leo
af099af4d0
refactor: stash selected changes in staged group will apply --staged paramter for git stash push (#535) 2024-10-03 18:28:01 +08:00
leo
ad3eec99cf
project: remove file that not exists any more 2024-10-03 17:49:02 +08:00
leo
6fe7dfad7f
enhance: update filters after a filtered branch renamed (#536) 2024-10-03 09:25:56 +08:00
leo
4e57cd50cd
feature: add an option to clean up ignored files when discard all changes in repo (#531) 2024-10-02 21:46:48 +08:00
leo
a59600ce18
enhance: supports default remote in Pull if current branch has no upstream (#534) 2024-10-02 15:27:09 +08:00
leo
d746e352a7
feature: supports to set default remote to push local branches without any tracking remotes (#534) 2024-10-02 15:13:27 +08:00
leo
6d1dfad8a1
ux: changes view mode style (#533)
* move changes view mode switch button to right button group
* change the style for ChangeViewModeSwitcher
* remove used code
2024-10-01 23:16:32 +08:00
leo
2d24244ee2
enhance: auto-update submodules if possible after checking out a branch (#531)
* add `--recurse-submodules` to checkout branch command
* remove unused method `Commands.Checkout.Files`
* code style
2024-10-01 22:10:10 +08:00
leo
d3991c6535
fix: use --no-ff --no-commit for Don't Commit option in merge popup to ensure branch is not changed or updated with fast-forward commits (#532) 2024-10-01 20:44:14 +08:00
leo
2670bd89d6
ux: add icons for group 2024-10-01 09:26:50 +08:00
leo
d2a005c532
feature: add a button in diff view to ignore all whitespace changes (--ignore-all-space) 2024-09-30 11:34:09 +08:00
leo
c1f6da1b31
Merge branch 'master' into develop 2024-09-30 09:30:47 +08:00
leo
6099d54c7b
Merge branch 'release/v8.32' 2024-09-30 09:30:21 +08:00
leo
b1edbc6334
version: Release 8.32 2024-09-30 09:28:56 +08:00
leo
f2f8a64b84
refactor: read git output once time instead of line-by-line 2024-09-30 09:27:15 +08:00
leo
986c27e1cb
code_style: code style of Models.CommitGraph 2024-09-29 22:44:50 +08:00
AquariusStar
53c79303b0
localization: ru_RU translation (#529) 2024-09-29 22:11:39 +08:00
leo
268dd9849d
enhance: better margin of commit subject (#528) 2024-09-29 19:56:16 +08:00
leo
fbfca7b4a5
enhance: better graph for ended orphan branch (#528) 2024-09-29 18:41:50 +08:00
leo
4b5d65cdb7
refactor: rewrite Models.CommitGraph.PathHelper (#528) 2024-09-29 18:16:28 +08:00
leo
fe015f9bfd
fix: endpoint of a graph path has been added twice (#528) 2024-09-29 16:45:50 +08:00
GadflyFang
c7332aff03
fix: avoid NRE in ContextMenuExtension (#526) 2024-09-29 16:05:02 +08:00
GadflyFang
18e0479288
enhance: reduce Minimum of History Commits setting (#527) 2024-09-29 15:23:38 +08:00
leo
3af30f54b6
enhance: avoid flicker at the first time clicking on text diff view 2024-09-29 14:16:42 +08:00
leo
d5671ea8df
enhance: only re-calculate highlight chunk when it is needed 2024-09-29 13:48:48 +08:00
leo
e945367b28
enhance: avoid re-calcuting highlight chunk when move mouse from stage/unstage buttons to text area 2024-09-29 12:11:09 +08:00
leo
99c2ffeef4
ux: change style of commit button's tooltip 2024-09-29 10:14:44 +08:00
UchiTesting
fad875c773
locale: Add legit enhancements to French locale (#525)
Co-authored-by: Thomas Champagne <th.champagne@gmail.com>
2024-09-29 09:31:05 +08:00
leo
ae5a94fd8a
fix: Flyout should not inherits the style of its PlacementTarget (#524) 2024-09-29 09:28:52 +08:00
leo
4d6ecd2396
fix: can not select the last line in blame (#523) 2024-09-29 09:20:40 +08:00
leo
19e930ef40
refactor: change hotkeys of commit buttons (#521)
* Ctrl+Shift+Enter to stage all changes then commit
* Alt+Enter to commit and push
2024-09-28 11:40:15 +08:00
leo
841a009a56
ux: change cursor to Hand when hover a commit hash link (#522) 2024-09-28 11:25:17 +08:00
leo
bb907deddb
code_style: correct the comment of invisible commit button 2024-09-27 23:02:25 +08:00
leo
9768b21859
code_style: use Windows, Linux instead of Default in On.Options 2024-09-27 22:58:30 +08:00
leo
f0e35b2563
ux: style for commit search box and invisible commit button 2024-09-27 22:49:46 +08:00
leo
c14c645bb9
ux: add tooltips for commit message template parameters 2024-09-27 22:33:21 +08:00
leo
9a8f4e20fb
feature: add hotkey Alt+Enter/⌥+Enter to auto stage all local changes and then commit (#521) 2024-09-27 22:21:56 +08:00
leo
2346082228
ux: style of tab switch in file histories view 2024-09-27 18:23:55 +08:00
leo
699bfe8208
code_style: remove unnecessary margins 2024-09-27 17:14:29 +08:00
leo
a78cf611c0
ux: style for left panel of repository view 2024-09-27 17:12:13 +08:00
leo
a7f609d479
readme: add description for build 2024-09-27 13:52:39 +08:00
leo
bcc43e167c
ux: remove bottom line of selected tab in main tabbar 2024-09-27 11:34:47 +08:00
leo
5a536fae06
ux: auto-fetch interval input size 2024-09-27 11:25:36 +08:00
leo
130c98ad40
feature: supports search commit only in current branch 2024-09-27 11:17:02 +08:00
leo
027844f4c5
ux: reorder reset modes by safety 2024-09-27 09:53:04 +08:00
leo
304b175b4b
refactor: remove context menu items about LFS tracking from changes and revision files 2024-09-27 09:46:02 +08:00
leo
9ff28dff72
feature: add git LFS context menu items for changes and revision files in commit details view 2024-09-27 09:39:25 +08:00
leo
05c135a89d
feature: auto add checkout target branch to history filters if the filter list is not empty (#518) 2024-09-26 20:37:48 +08:00
Katharina Sternbauer
4925e56dfb
localization: add missing german text entries (#519) 2024-09-26 19:50:40 +08:00
leo
d34aa8cb7e
localization: use localized text for Show only my locks checkbox (#515) 2024-09-26 15:43:31 +08:00
leo
5d2a442144
code_review: PR #515
* remove Linq expressions due to AOT limitations. See https://learn.microsoft.com/zh-cn/dotnet/core/deploying/native-aot/?tabs=windows%2Cnet8#limitations-of-native-aot-deployment
* rename `FilteredLocks` to `VisibleLocks`
* use `Commands.Config.Get` instead of `Commands.Config.ListAll`
* disable checkbox if user name is not valid
2024-09-26 15:36:20 +08:00
Mat
21498f7009
Show only my locks (#515)
* Added a checkbox in the LFSLocks window to only show the ones locked by "Mat"
* Waits for the locks list to finish loading before making the checkbox clickable
* Now uses correct username for lock filtering.
   WIP: needs an error popup if user is misconfigured
* Added an error popup if username is empty on lfs locks
* Replaced an IEnumerable with a AvaloniaList for consistency
2024-09-26 15:00:31 +08:00
leo
4a08caddad
update: description for git reset --merge 2024-09-26 14:49:15 +08:00
leo
1cda5d858e
feature: add --merge and --keep support to git reset command (#514) 2024-09-26 11:29:32 +08:00
leo
1ba294a07b
refactor: move auto-fetch from global preference to repository settings 2024-09-26 10:50:21 +08:00
leo
8e31ea9140
enhance: use Click event instead of IsCheckedChanged to reduce the times of calling update filter (#513) 2024-09-25 20:44:25 +08:00
leo
a8ce4e6d95
feature: when toggle a local branch filter, if it has a tracked upstream branch, do the same for the upstream branch (#513) 2024-09-25 20:30:48 +08:00
leo
85b83990a8
code_style: run dotnet format 2024-09-25 16:24:04 +08:00
leo
acf71a30b8
enhance: re-calculate the opened repositories in active workspace (#511) 2024-09-25 15:07:23 +08:00
leo
28c59ee0ab
code_style: move the code to initialize informations to spawn git sub-process to function Models.Command.CreateGitStartInfo 2024-09-25 10:57:37 +08:00
leo
a8685f2047
refactor: rewrite the way to support HomeBrew pathes on macOS (#507) 2024-09-25 10:35:07 +08:00
leo
a52ebffbf3
ux: layout for Statistics window 2024-09-24 20:50:53 +08:00
leo
bc8a2cb162
ux: color picker button theme in Statistics window 2024-09-24 20:34:52 +08:00
leo
6b44fd4416
code_style: remove unused codes 2024-09-24 18:22:18 +08:00
leo
d1d913aa45
fix: do NOT delete .git/rebase-merge and .git/rebase-apply folders (#509) 2024-09-24 18:19:22 +08:00
leo
b9597dc92a
ux: new layout for Staticstics window 2024-09-24 17:06:16 +08:00
leo
6151f4dc5f
refactor: a new way to test if this app should be launched as a SSH askpass client 2024-09-24 15:53:36 +08:00
leo
b6ce2bcc85
git: simplify .gitattributes used by this project 2024-09-24 14:23:54 +08:00
leo
7c176744aa
git: update ignore files/folders 2024-09-24 14:20:15 +08:00
leo
c0f59c441b
feature: allow user to select the chart fill color 2024-09-24 12:14:51 +08:00
leo
de15cb1ff2
ux: use column series instead of line series because change between samples is not linear 2024-09-24 11:02:49 +08:00
leo
1dd1e41b7b
ux: workspace button margin 2024-09-24 10:09:54 +08:00
leo
94a8139578
enhance: increase the number of commits to analyze in OVERVIEW tab to 40K 2024-09-24 10:00:31 +08:00
leo
1b63da45e5
ux: disable line smoothness in Statistics 2024-09-24 09:40:55 +08:00
leo
0bc7208230
ux: remove the MaxWidth limitation for file tree view in CHANGES page and FILES page (#503) 2024-09-24 09:28:30 +08:00
Михаил Усоцкий
deb8789178
Updating the localization with the latest changes. 2024-09-24 09:19:01 +08:00
leo
0d565f84c3
Merge pull request #504 from Gama11/feature/statistics-mailmap
Respect .mailmap files in statistics
2024-09-23 22:54:52 +08:00
Jens Fischer
49d5b679fc Respect .mailmap files in statistics
see https://git-scm.com/docs/gitmailmap
2024-09-23 16:28:07 +02:00
leo
308445fa81
ux: fill brush for line chart (#493) 2024-09-23 21:54:02 +08:00
leo
af57c56cd7
feature: enhanced statistics panel (#493)
* replace the `YEAR` tab with `OVERVIEW` tab, which will analyze most recent 20K commits
* use `LiveChartsCore.SkiaSharpView.Avalonia` instead of a custom chart view
2024-09-23 21:45:44 +08:00
leo
983607e708
fix: minimize window button not work on Windows 10 (#501) 2024-09-23 14:44:23 +08:00
leo
f77e06cc61
Merge branch 'master' into develop 2024-09-23 09:31:00 +08:00
leo
718dd322cf
Merge branch 'release/v8.31' 2024-09-23 09:30:12 +08:00
leo
517cb6310e
version: Release 8.31 2024-09-23 09:29:38 +08:00
leo
b6770ca36a
Merge pull request #498 from xgqt/2024-refactor-scripts-bash
build: minor tweaks
2024-09-23 09:24:12 +08:00
leo
c6b05c463c
Merge pull request #499 from 'AquariusStar/master' 2024-09-23 09:12:52 +08:00
Михаил Усоцкий
10d8c8112b
Поправка перевода, упрощение перевода под интерфейс. 2024-09-23 09:11:03 +08:00
Михаил Усоцкий
31dc060b5b
Поправка перевода. 2024-09-23 09:10:59 +08:00
Михаил Усоцкий
dd38987803
Поправка перевода. 2024-09-23 09:10:53 +08:00
Maciej Barć
6461765cf7
build: minor tweaks
* call bash through env progrem
* add more strict defaults
* [ -> [[

Signed-off-by: Maciej Barć <xgqt@gentoo.org>
2024-09-22 16:16:12 +02:00
leo
dd6ee6b8e6
enhance: use SelectedItem instead of SelectedItems since the selection mode is Single 2024-09-22 20:53:11 +08:00
leo
07cba1cf5f
feature: support using left/right arrow to expand/collapse tree node (#463) 2024-09-22 20:48:36 +08:00
leo
01380ff194
code_review: PR #497
* remove unused file
* update readme
2024-09-22 19:03:55 +08:00
leo
068ae44b25
Merge pull request #497 from AquariusStar/master into develop
Added locale file
2024-09-22 19:00:34 +08:00
Михаил Усоцкий
45ad1363fa
Поправка перевода. 2024-09-22 18:56:33 +08:00
Михаил Усоцкий
977b800c89
Added locale file 2024-09-22 18:56:27 +08:00
leo
81b72f7c1c
enhance: use ~ to represent the home dir of current user 2024-09-22 11:00:30 +08:00
leo
0b6ecc0388
code_style: typo in s_extraGrammars 2024-09-21 22:04:50 +08:00
leo
80017d8bd0
code_style: simplify Models.TextMateHelper 2024-09-21 22:02:50 +08:00
leo
4a3620db5e
refactor: rewrites the built-in grammar extension 2024-09-21 16:34:00 +08:00
leo
0a4d5b8429
Merge pull request #496 from Gama11/feature/haxe-syntax-highlighting
Add syntax highlighting for Haxe
2024-09-21 15:40:54 +08:00
Jens Fischer
0dbca4fe47 Add syntax highlighting for Haxe 2024-09-20 16:30:40 +02:00
leo
30765cf7b3
code_review: PR #495
* correct the path passed to `--cwd`
2024-09-20 22:02:10 +08:00
leo
e011b1807a
Merge pull request #495 from Gama11/feature/wezterm
Add support for WezTerm
2024-09-20 21:51:59 +08:00
leo
d48a27183d
Merge pull request #494 from Gama11/feature/kotlin-syntax-highlighting
Add syntax highlighting for Kotlin
2024-09-20 21:46:40 +08:00
Jens Fischer
a8a85613fc Add support for WezTerm 2024-09-20 14:13:02 +02:00
Jens Fischer
535dc1ef49 Add syntax highlighting for Kotlin 2024-09-20 13:51:05 +02:00
leo
094b07b03a
ux: new icon for remotes 2024-09-20 14:41:27 +08:00
leo
5f567460e2
fix: missing -d ${WORKDIR} parameter for wt.exe (#490) 2024-09-20 14:15:19 +08:00
leo
cb2caa0930
ux: icons for group header 2024-09-20 10:12:21 +08:00
leo
6a0cf30db2
fix: wrong width for commit graph 2024-09-19 15:59:34 +08:00
leo
a690f77468
readme: update OpenAI usage (#489) 2024-09-19 14:42:19 +08:00
leo
0ed1f369e9
feature: display commit's detail info even if the commit is not shown in histories 2024-09-19 14:38:11 +08:00
leo
5574dd2c38
refactor: a better way to fix window drop shadow effect on Win10 2024-09-19 09:50:27 +08:00
leo
687b58576d
code_style: use readonly property instead of responsive property for Workspace.Brush 2024-09-19 09:21:04 +08:00
leo
33f9ae0cd6
fix: wrong executable file name for Zed editor on Linux (#477) 2024-09-19 09:12:38 +08:00
leo
e4870759f7
ux: workspace configuration window 2024-09-18 21:46:04 +08:00
leo
84fda6a8db
feature: add property RestoreOnStartup property to ViewModels.Workspace (#488) 2024-09-18 21:35:33 +08:00
leo
900ebd8282
feature: supports parameters in commit template (#487)
- ${files_num} will be replaced with staged changes count
- ${files} will be replaced with changed file paths
- ${files:N} will be replaced with top N changes file paths and with `and {TOTAL - N} other files` at end of replaced string.
2024-09-18 20:11:34 +08:00
leo
6932ce44a9
fix: new window opened on failing fetch due to missing StrictHostKeyChecking=accept-new for repo remote without private ssh key (#485) 2024-09-18 17:19:55 +08:00
leo
bbd4012bc5
enhance: do NOT create sub-nodes for detached HEAD 2024-09-18 16:02:38 +08:00
leo
69b39dac6c
code_style: simpfy FindTerminal
* [macOS] should return `string.Empty` when failed to find terminal path
* [Linux] use `shell.Type` instead of `shell.Exec` to skip custom terminal detection
2024-09-18 15:26:28 +08:00
leo
9c6745c271
enhance: skip auto fetching when index.lock file exists in the repository's git dir 2024-09-18 14:49:53 +08:00
leo
ba9c3058ed
feature: supports Zed editor as an external editor (#477) 2024-09-18 10:00:32 +08:00
leo
a00cf4f009
ux: add custom terminal icon 2024-09-17 22:58:28 +08:00
leo
934d784d40
fix: unable to access the Stage/Unstage buttons in diff viewer when line wrap is enabled (#481)
* disable line wrap in side-by-side diff mode
2024-09-17 22:26:35 +08:00
leo
bc633e4085
code_review: PR #480
* remove `string.IsNullOrEmpty(OS.ShellOrTerminal)` checking from detail backend since it has been checked by `Native.OS.OpenTerminal`
* remove `ViewModels.Preference.IsTerminalConfigured` because it is only used by itself (Unlike `IsGitConfigured`).
* add `Native.OS.TestShellOrTerminal` and use it instead of setting `Preference.ShellOrTerminal` directly, because we have binded a callback that will save preference into file when its property changed. It may cause lag in some enviroments if we saving preference into file too frequently (see PR #436).
* run `dotnet format`
2024-09-17 22:09:51 +08:00
leo
65c2087f6b
Merge pull request #480 from aikawayataro/terminal-fixes
Few terminal fixes
2024-09-17 21:21:40 +08:00
Aikawa Yataro
54ab625931
enhance: select any terminal when none is set 2024-09-17 07:20:17 +00:00
Aikawa Yataro
736ad02991
enhance: allow to specify custom terminal 2024-09-16 12:06:33 +00:00
Aikawa Yataro
53c915578e
enhance: allow terminal without full path and adjust error message 2024-09-16 11:55:50 +00:00
Aikawa Yataro
4deac98c4e
fix: crash when trying to open terminal from the Welcome screen 2024-09-16 08:51:39 +00:00
leo
67b3952080
hotfix: Release 8.30.1 2024-09-16 15:48:23 +08:00
leo
4b182e6ecd
fix: http System.InvalidOperationException (#476) 2024-09-16 15:41:49 +08:00
leo
82ae44ff8b
Merge branch 'master' into develop 2024-09-16 10:57:16 +08:00
leo
94f75d7017
Merge branch 'release/v8.30' 2024-09-16 10:55:40 +08:00
leo
8393d7eb91
version: Release 8.30 2024-09-16 10:55:16 +08:00
leo
74a9be0667
Merge pull request #475 from NilsPvR/develop
Add DE keys for new OpenAI commit message generation
2024-09-16 10:49:47 +08:00
leo
80366f90ca
Merge pull request #474 from ChiahongHong/traditional-chinese
localization: update zh_TW.axaml
2024-09-16 10:49:07 +08:00
NilsPvR
0055ddbaa7 localization: add DE keys for OpenAI msg gen
- were added in 16f8e2f
2024-09-15 20:18:22 +02:00
Chiahong Hong
fd116914d5
localization: update zh_TW.axaml 2024-09-15 22:11:23 +08:00
leo
1a4d3d0086
enhance: remember the height/width of commit list and detail panel in histories page (#472) 2024-09-14 17:22:29 +08:00
leo
6d92b7fc8c
ux: image info text layout 2024-09-14 16:15:53 +08:00
leo
d6b21bad17
feature: now image file previewer shows the image size and file size 2024-09-14 16:13:40 +08:00
leo
7f87ce3431
ux: move some configuration from GIT to GENERAL tab 2024-09-14 12:31:31 +08:00
leo
2bea686436
fix: wrong name for iTerm2 icon 2024-09-14 12:18:22 +08:00
leo
fb0120d338
refactor: terminal/shell integration (#471) 2024-09-14 12:09:50 +08:00
leo
817f8919fd
enhance: add Content-Type to OpenAI request headers 2024-09-13 20:50:11 +08:00
leo
ab54ecee42
enhance: API Key is now optional
- Update README.md by adding tips for using OpenAI in this project
2024-09-13 20:46:00 +08:00
leo
6fc972cc24
Merge pull request #470 from gadfly3173/fix/ai-window
fix: AIAssistant window height sometimes wrong
2024-09-13 18:02:12 +08:00
Gadfly
4f47658e70
fix: AIAssistant window height sometimes wrong 2024-09-13 17:59:29 +08:00
leo
1ec5cc416d
enhance: leave remote branch to empty when the local branch tracks no branch in the remote while pulling changes (#469) 2024-09-13 17:29:24 +08:00
leo
ab8b27c1f8
Merge pull request #468 from aikawayataro/aot-switch
Allow to disable native AOT deployment
2024-09-13 16:07:21 +08:00
Aikawa Yataro
79d3083b0d
project: allow to disable native AOT deployment 2024-09-13 07:33:31 +00:00
leo
5c2583db67
enhance: notify user when try to generate commit message by OpenAI but not files are added to commit 2024-09-13 15:26:12 +08:00
leo
cc6e486663
enhance: do NOT modify repository's local configuration if it is equals to default value 2024-09-13 15:20:52 +08:00
leo
886b242b66
enhance: added cancellation logic to the OpenAI chat response API call. 2024-09-13 14:25:38 +08:00
leo
f7f549f86d
enhance: change tooltip's alignment to Top to avoid issue #467 2024-09-12 17:40:25 +08:00
leo
8a20a7a542
ux: set Focusable by XAML instead of hard coded 2024-09-12 17:05:05 +08:00
leo
ea3a6a4755
feature: auto focus the next change after stage/unstage selected changes (#464) 2024-09-12 16:33:56 +08:00
leo
dcddc5a2f2
ux: OpenAI button layout 2024-09-12 11:51:07 +08:00
leo
b09d1d46c9 fix: openpgp typo (#465) 2024-09-12 11:03:56 +08:00
leo
676835dee5
enhance: do NOT modify global .gitconfig if value equals git default (#465) 2024-09-12 10:33:52 +08:00
leo
86c6254fb2
Merge branch 'feature/openai-support' into develop 2024-09-12 09:50:13 +08:00
leo
16f8e2fd0b
feature: simple implementation for generating commit message by OpenAI (#456) 2024-09-12 09:42:47 +08:00
leo
84b3de657f
read: add scale factor tips for Linux users 2024-09-11 20:32:10 +08:00
leo
a63450f73f
Merge pull request #460 from gadfly3173/fix/configure-workspace
fix: ConfigureWorkspace window width (#458)
2024-09-11 11:09:14 +08:00
Gadfly
f6fa31f287
fix: ConfigureWorkspace window width (#458) 2024-09-11 11:08:04 +08:00
leo
0c31c982be
enhance: ColorPicker performance improvement 2024-09-11 10:34:27 +08:00
leo
f4f0fe788b
fix: vertical grid line over-draw 2024-09-11 10:23:20 +08:00
leo
2d611cf988
fix: repository settings did not saved correctly when closing app (#459) 2024-09-11 10:20:12 +08:00
leo
9b47198229
fix: the width of ConfigureWorkspace window sometimes tool small (#458) 2024-09-11 10:08:31 +08:00
leo
f314da54aa
code_style: add comment for ColorPicker.COLOR_TABLE 2024-09-11 09:38:32 +08:00
leo
3cebff6722
enhance: when open sourcegit with repository from commandline disable all workspaces 2024-09-10 17:47:08 +08:00
leo
6d54b43ee3
ux: layout of ConfigureWorkspace window 2024-09-10 17:17:02 +08:00
leo
7b2da25c0b
enhance: do NOT save preference.json while loading 2024-09-10 16:37:39 +08:00
leo
88fb43e4fb
ux: new style for ColorPicker 2024-09-10 16:31:16 +08:00
leo
e5c2c81328
Merge pull request #457 from NilsPvR/develop
Add DE keys for new features
2024-09-10 15:58:54 +08:00
NilsPvR
edcf67b3d6 localization: add DE keys for new features
- Hotey DiscardSelected was added in c22ba75
- ScanRepos were added in 0d67fa3
- MoveRepos were added in dfffd9d
- RepoFilter was updated in b1457e
- Workspaces were added in ebc112a and 0190c21, and updated in 2e2c443
2024-09-10 09:36:52 +02:00
leo
f5b8bc472a
fix: hightlight not working the first time clicking the first line (#448) 2024-09-10 12:03:07 +08:00
leo
f42ddd8cee
fix: hightlight background not updated (#448) 2024-09-10 11:50:32 +08:00
leo
2e2c443b5d
localization: Text.Workspace.Configure translation 2024-09-10 11:30:26 +08:00
leo
22f0fb3854
ux: rounded rect in ColorPicker 2024-09-10 11:26:07 +08:00
leo
33e4404222
code_style: remove unused converters 2024-09-10 11:22:12 +08:00
leo
853d5ce20e
code_style: remove debug code 2024-09-10 11:20:59 +08:00
leo
69117e8ee9
refactor: use custom color picker instead of Avalonia.Controls.ColorPicker 2024-09-10 11:02:34 +08:00
leo
bede3663ec
code_review: PR #453
* remove Visual Studio ENC0004 warning
2024-09-10 09:22:35 +08:00
leo
28f83e12fd
Merge pull request #453 from ChiahongHong/mac-terminal
refactor: terminal launch on macOS without temporary AppleScript
2024-09-10 09:18:34 +08:00
Chiahong Hong
6d18839237
refactor: terminal launch on macOS without temporary AppleScript 2024-09-10 01:02:41 +08:00
leo
b1ce8c5451
enhance: do NOT auto focus the text editor when there's no highlighted commit (#448) 2024-09-09 21:06:44 +08:00
leo
32c0aa61cd
fix: the highlight background not updated while scrolling using mouse wheel without focus the text editor control (#448) 2024-09-09 21:01:10 +08:00
leo
24301751d3
readme: add workspace 2024-09-09 19:46:14 +08:00
leo
9934586ee0
enhance: remember the active page index for each workspace (#445) 2024-09-09 19:40:44 +08:00
leo
e63034acd5
enhance: when open repository from commandline, create a new workspace Unnamed for it, and never add it to preference (#445) 2024-09-09 19:14:44 +08:00
leo
0190c2111d
enhance: workspace tooltip (#445) 2024-09-09 18:47:53 +08:00
leo
ebc112a627
feature: workspace support (#445) 2024-09-09 18:26:43 +08:00
leo
acd6171350
refactor: remove Caret.PositionChanged event listener since TextArea.LayoutUpdated will also triggered when caret position changed (#448) 2024-09-09 12:22:26 +08:00
leo
4be7710336
feature: highlight lines those come from the same change with current line (#448) 2024-09-09 11:45:02 +08:00
leo
0d7999027b
Merge branch 'master' into develop 2024-09-09 10:05:45 +08:00
leo
86300965a2
Merge branch 'release/8.29' 2024-09-09 10:05:18 +08:00
leo
f3714cdc56
version: Release 8.29 2024-09-09 10:04:55 +08:00
leo
17dd32456b
refactor: add Avalonia.Fonts.Inter as built-in default font (#447) 2024-09-09 10:01:41 +08:00
leo
6688319714
fix: failed get default font on some Linux distro (#447) 2024-09-08 18:29:05 +08:00
leo
2a59cdbe92
Merge pull request #430 from UchiTesting/locale-fr-b2
style(locale): Translate to French Batch 2
2024-09-08 12:04:00 +08:00
UchiTesting
a77c6dba67 Fix case for Text.Configure.IssueTracker.RuleName
Capital letter in the beginning was missing.
2024-09-07 20:27:05 +02:00
UchiTesting
6631611fa9 style(locale): Translate a few sections
Diff.SyntaxHighlight
RevealFile
Revert
Reword
Running
Save
Stash
URL
UpdateSubmodules
Warn
WorkingCopy
Worktree

Some extra sentences

Include small fixes for
CodeEditor : missing accent
2024-09-07 15:21:29 +02:00
UchiTesting
74bffc39b4 style(locale): Translate Text.Histories section to French 2024-09-07 15:21:28 +02:00
UchiTesting
ea164bfdf4 style(locale): Fix mistake in French translation
Text.DeleteMultiBranch.Tip had the term branch in singular instead of plural
2024-09-07 15:21:28 +02:00
leo
b1457fe39d
feature: supports filter submodules (#443) 2024-09-06 09:57:22 +08:00
leo
0e774ee035
ux: window caption button (#442) 2024-09-04 15:54:12 +08:00
leo
998230edff
code_style: simplify static commands used by styles and main menu; run dotnet format 2024-09-02 20:27:12 +08:00
leo
e27d2d6a3f
enhance: change default search commit method to Message 2024-09-02 19:51:42 +08:00
leo
b85c2a1754
ux: re-arrange context menu items of RepositoryNode in welcome page 2024-09-02 17:44:02 +08:00
leo
72fbab3b2e
ux: new icon for Move to Anthor Group 2024-09-02 17:33:00 +08:00
leo
dffd9d7676
feature: add context menu item to move repository node (#437) 2024-09-02 17:05:43 +08:00
leo
837e3889b7
ux: column width in histories (#438) 2024-09-02 15:28:30 +08:00
leo
fe7972684c
ux: change the icon for Check refs that contains this commit button 2024-09-02 14:44:42 +08:00
leo
de86890012
ux: make it easier to change the width of column AUTHOR 2024-09-02 14:34:51 +08:00
leo
931831431b
enhance: reduce the times calling Save() (#436) 2024-09-02 14:14:52 +08:00
leo
9fe8ffcea9
code_review: PR #436
It's ok to call `Save()` multiple times after property of `ViewModels.Preference` changed immediately. If we delay the saving operation 3 seconds after the property changed event, we reduce the times calling `Save`, but the issue metioned in #436 may still exists.
2024-09-02 12:20:11 +08:00
leo
9ee9f921f4
Merge pull request #436 from gadfly3173/feat/save-preference
enhance: save preference.json instantly
2024-09-02 12:09:58 +08:00
Gadfly
c85293c86a
enhance: support save RepositoryNode changes instantly 2024-09-02 12:05:24 +08:00
Gadfly
28b6ce4993
enhance: save preference.json instantly 2024-09-02 10:51:48 +08:00
leo
fefcda7246
Merge branch 'master' into develop 2024-09-02 09:55:54 +08:00
leo
775e4cfecc
Merge branch 'release/v8.28' 2024-09-02 09:55:29 +08:00
leo
050ce4102a
version: Release 8.28 2024-09-02 09:55:14 +08:00
leo
a2c6afc5cc
enhance: add file histories context menu item for staged changes and deleted files (#432) 2024-09-02 09:41:00 +08:00
leo
b0b55c989a
Merge pull request #433 from ChiahongHong/traditional-chinese
Update Traditional Chinese translation
2024-09-02 09:28:32 +08:00
leo
eca37e8d70
fix: crash when drag & drop on macOS 2024-09-02 09:26:06 +08:00
leo
f586979ac5
fix: crash when scan repositories under default clone dir (#434) 2024-09-02 07:54:46 +08:00
Chiahong Hong
595e243ab9
localization: update zh_TW.axaml 2024-09-01 22:10:54 +08:00
leo
e4f95745ce
fix: IsCloseButtonOnly is not work on Windows (#431) 2024-09-01 17:01:24 +08:00
leo
e19d025572
code_review: PR #431
* move resources and styles for macOS caption button to `CaptionButtonsMacOS` because it is never used by others and should not been changed
* add `IsCloseButtonOnly` property to `CaptionButtons` and `CaptionButtonsMacOS` and replace the controls in windows
2024-09-01 16:54:20 +08:00
leo
e3ee07be70
Merge pull request #431 from ChiahongHong/macos-buttons
Improve macOS window control button colors for native appearance
2024-09-01 15:47:11 +08:00
Chiahong Hong
2b056ee644
ux: improve macOS window control button colors for a more native look 2024-09-01 13:47:13 +08:00
leo
ef9396bf57
code_review: PR #428
* remove unused namespace using
* remove the duplicated menu seperator between `Open in Merge Tool` and `Reveal in File Explorer`
* keep the same menu item orders both in changes and revision files
2024-08-30 21:38:43 +08:00
leo
62c3afb209
Merge pull request #428 from ybeapps/reset-file-to-parent
Reset file to parent revision - improvements
2024-08-30 21:27:34 +08:00
Yitzchak Ben-Ezra
8c9e8e5dbc Reset to Parent Revision
* support reset to parent revision for Added files too
* support reset to parent revision in Files tab
* support reset to parent revision in Changes - now supports Renamings too

now it behaves more like git-extensions
2024-08-30 15:42:24 +03:00
leo
089f24b0d2
fix: can not create subgroups (#427) 2024-08-30 16:59:51 +08:00
leo
bb749f225d
enhance: auto create group by relative path when scanning repositories under default clone dir (#427) 2024-08-30 16:45:45 +08:00
leo
0d676fa3fb
feature: add a button to scan repositories under default clone dir (#427) 2024-08-30 16:14:10 +08:00
leo
aab14784fc
project: upgrade TextMateSharp to 1.0.63 2024-08-29 20:56:07 +08:00
leo
1f4bf92642
ux: remove margins for column 'AUTHOR' in histories view 2024-08-29 15:02:06 +08:00
leo
93304a39d2
localization: mistake 2024-08-29 11:25:33 +08:00
leo
4dadf7afb6
ux: style for branch tree node 2024-08-29 11:20:44 +08:00
leo
d794a61196
enhance: remember the width of author name column in histories view (#425) 2024-08-29 10:17:22 +08:00
leo
c22ba75780
enhance: supports using Delete or Backspace to discard selected changes (#423) 2024-08-29 10:10:28 +08:00
leo
9c40b76577 code_style: use the same syntax to specify platform dependent text 2024-08-28 22:07:26 +08:00
leo
987152869c code_review: PR #422
* add unstage/stage button tooltip for hotkeys
* add description for new hotkeys in `Keyboard Shortcuts Reference` window
2024-08-28 22:00:18 +08:00
leo
69b9d62e57
Merge pull request #422 from hannesbraun/staging-with-enter
Add Enter as keybinding for staging/unstaging
2024-08-28 21:54:49 +08:00
Hannes Braun
bb54c14566 Add Enter as keybinding for staging/unstaging 2024-08-28 15:17:07 +02:00
leo
a573436b67
feature: add supports for .webp image format (#421) 2024-08-28 18:58:01 +08:00
leo
3d57398d15
refactor: show statistics data by authors intead of committers 2024-08-28 18:38:29 +08:00
leo
83b802e357
refactor: collect the commits for the most recent year instead of just the current year (#414) 2024-08-28 18:16:57 +08:00
leo
c90abd0ca2
refactor: commit search
* no longer depends on the commits displayed in histories view
* limit the number of commits returned by all search methods to a maximum of 1000
2024-08-28 16:56:43 +08:00
leo
48e1de809b
ux: style for commit info row in histories view 2024-08-28 14:38:06 +08:00
leo
3ea80d99f1
code_style: remove unused namespace using and run dotnet format 2024-08-28 13:42:25 +08:00
leo
4bcdd0ade4
fix: commit graph clip bounds 2024-08-28 13:36:09 +08:00
leo
45212ebc28
refactor: rewrite Views.CommitGraph.Render 2024-08-28 13:26:46 +08:00
leo
ddcab64940
enhance: do NOT redraw commit graph if vertical scroll of commit list not changed 2024-08-28 13:19:44 +08:00
leo
ce2340456e
feature: cherry-pick multiple commits (#418) 2024-08-28 11:26:00 +08:00
leo
b2bbbb191c
fix: copy multiple commits info not working anymore 2024-08-28 10:17:12 +08:00
leo
9f9cea34f8
Merge pull request #420 from hannesbraun/foot-support
Add support for foot
2024-08-28 10:11:55 +08:00
leo
d908198214
Merge pull request #419 from NilsPvR/develop
Fix and add DE localization keys
2024-08-28 10:06:46 +08:00
leo
bd6228bb26
refactor: using ListBox instead of DataGrid for commit list and remove dependency of Avalonia.Controls.DataGrid 2024-08-28 10:02:14 +08:00
Hannes Braun
3b44616aba Add support for foot
foot is a terminal emulator for Wayland.
2024-08-28 01:05:08 +02:00
NilsPvR
9337b2bead localization: enhance "OnlyUseMonoFontInEditor" 2024-08-27 22:20:29 +02:00
NilsPvR
a5dad23ad9 localization: add DE keys for new features
- SquashCommitsSinceThis was added in 184c89e and updated in 6b90a11
- FileContent and FileChange were added in db8de81
- CopyAllText was added in 7a2722e
2024-08-27 22:09:53 +02:00
NilsPvR
31ac1c832f localization: fix incorrect key updated for DE in:
184c89ea1d
2024-08-27 21:56:35 +02:00
leo
7776cda475
enhance: using lightweight ListBox instead of DataGrid to improve performance 2024-08-27 21:28:48 +08:00
leo
1f07c1bdf0
ux: force enable horizontal stretch for commit message (#400) 2024-08-27 16:40:46 +08:00
leo
64943044aa
ux: new style for Flyout 2024-08-27 16:28:20 +08:00
leo
b16d267c9b
enhance: show git errors when failed to get the repository root dir of given path (#397) 2024-08-27 15:35:10 +08:00
leo
963916219f
Merge pull request #416 from gadfly3173/fix/head-refs-presenter
enhance: make HEAD commit badge highlight
2024-08-27 15:07:54 +08:00
Gadfly
208dd9a5e0
enhance: make HEAD commit badge highlight 2024-08-27 14:54:28 +08:00
leo
959805d63c
feature: auto scrolling while seleting text in commit message (#394) 2024-08-27 14:47:20 +08:00
leo
551ea883ff
code_style: remove unnecessary call 2024-08-27 14:15:20 +08:00
leo
e0b09d4dd4
feature: using TextBlock instead of SelectableTextBlock for commit SHA and add a button to copy it 2024-08-27 12:20:36 +08:00
leo
6cf9448313
Merge pull request #415 from gadfly3173/fix/file-ops
enhancement: Some file operation optimizations
2024-08-27 11:00:50 +08:00
Gadfly
5e02b08d48
fix: avoid crash when closing a repo which is deleted in file system 2024-08-27 10:51:15 +08:00
Gadfly
80559ce199
fix: try-catch OpenFolderPickerAsync to avoid crash when select a directory is NOT exist 2024-08-27 10:40:49 +08:00
leo
492f22fcfa
enhance: add inlines once time and mark text layout dirty (#400) 2024-08-26 21:46:43 +08:00
leo
27a68f0d4d
enhance: add inlines once time and mark text layout dirty (#400) 2024-08-26 21:41:48 +08:00
leo
916d376c93
screenshots: update to latest 2024-08-26 21:14:37 +08:00
leo
6e418300ab
readme: add language Français 2024-08-26 19:23:53 +08:00
leo
110858eaa2
enhance: mark working copy dirty after stash changes (#411) 2024-08-26 18:05:57 +08:00
leo
0074ea3c60
enhance: after commit mark branch dirty instead of only workcopy changes dirty (#411) 2024-08-26 18:03:17 +08:00
leo
ad0773be2f
enhance: avoid crashing when failed to create filesystem watcher for repository (#411) 2024-08-26 17:50:13 +08:00
leo
1dd782bc42
fix: wrong graph when there's only one commit 2024-08-26 17:26:02 +08:00
leo
ead2af7d65
enhance: clear unhandled modifiers at begining of OnKeyDown 2024-08-26 11:00:03 +08:00
leo
ac95fac443
Merge branch 'master' into develop 2024-08-26 10:19:48 +08:00
leo
cead68145a
Merge branch 'release/8.27' 2024-08-26 10:19:14 +08:00
leo
e9d79f03a7
version: Release 8.27 2024-08-26 10:18:57 +08:00
leo
6b90a116a5
localization: change translation for Text.CommitCM.SquashCommitsSinceThis (#408)
* Thanks to @thomaschampagne
2024-08-25 22:35:11 +08:00
leo
a42412c732
ux: style for squash popup 2024-08-25 21:45:37 +08:00
leo
184c89ea1d
feature: supports squash multiple commits into selected commit (#408) 2024-08-25 21:39:59 +08:00
leo
4f8ccc4563
enhance: clean search filter when open Welcome page by closing the last opened repository tab 2024-08-25 20:51:53 +08:00
leo
d9ba6bc5ec
Merge pull request #409 from ChiahongHong/traditional-chinese
Update Traditional Chinese translation
2024-08-25 20:41:16 +08:00
Chiahong Hong
e8b0aa9a7d
localization: update zh_TW.axaml 2024-08-25 20:01:07 +08:00
leo
585cf14162
enhance: new welcome page will clear the search filter before 2024-08-25 18:31:05 +08:00
leo
2b7b1e81e0
ux: force using arrow cursor when hover a menu item 2024-08-25 18:17:45 +08:00
leo
7a2722e928
feature: add a context menu to copy entire content of SelectableTextBlock (#394) 2024-08-25 15:11:31 +08:00
leo
5dc4ed6f54
localization: en_US translation for Text.CommitDetail.Info.ContainsIn.Title 2024-08-25 11:48:56 +08:00
leo
8f7567a060
feature: do NOT save visual diff context lines 2024-08-25 11:33:38 +08:00
leo
e9eb433471
ux: change default view mode in FileHistories to CHANGES 2024-08-25 11:20:10 +08:00
leo
118dccbeb5
ux: decorator colors 2024-08-24 22:57:02 +08:00
leo
e136d05789
enhance: using -- <pathspec>... instead of --pathspec-from-file=<file> (#404) 2024-08-24 20:58:35 +08:00
leo
9a69f972a3
Merge pull request #405 from UchiTesting/locale-fr
style(locale): Translate to French  Batch 1
2024-08-24 20:18:44 +08:00
UchiTesting
84b7c487df
style(locale): Fix mistake in French translation
Text.CreateBranch.Name had non instead of nom

Co-authored-by: Antony David <antonydavid945@gmail.com>
2024-08-24 14:16:39 +02:00
UchiTesting
6a2eca36c8 style(locale): Translate preferences to French 2024-08-24 13:39:32 +02:00
UchiTesting
63e238f796 style(locale): Translate keyboard shortcuts dialog to French 2024-08-24 13:39:32 +02:00
UchiTesting
257ae7dcd8 style(locale): Add missing fallback in French locale 2024-08-24 13:39:32 +02:00
UchiTesting
d7cfc34fbd style(locale): Translate 1st level items to French
Some elements close to the 1st level are not translated yet.
Preferences and keyb. shortcuts are comming with the next commits.
2024-08-24 13:39:32 +02:00
UchiTesting
847a355a3e style(locale): Add French locale
Added resource file and updated the code to declare the new French resource.
Include a 1st batch of translation.
2024-08-24 13:39:31 +02:00
leo
9a68d70b29
feature: add a button in file histories view to reset selected file to selected commit 2024-08-24 12:06:38 +08:00
leo
db8de81120
refactor: rewrite file histories page to only focus on selected file (#403) 2024-08-24 11:36:02 +08:00
leo
1caf02ff06
code_style: remove unused namespace using and run dotnet format 2024-08-23 22:26:17 +08:00
leo
43e8c5e8a0
ux: new decorator colors for light theme (#395) 2024-08-23 21:19:30 +08:00
leo
bfc4acd601
fix: duplicated key 2024-08-23 21:00:31 +08:00
leo
a717dc1876
ux: add Color.DecoratorHead for current branch head (#395) 2024-08-23 19:22:04 +08:00
leo
3569e1696f
ux: larger font size for HEAD decorator (#395) 2024-08-23 18:47:08 +08:00
leo
f65ee1f0f6
Merge pull request #399 from NilsPvR/develop
Add German NativeWindowFrame + FirstParentOption key
2024-08-23 18:31:43 +08:00
NilsPvR
e9a269f4c1 localization: Add DE keys for commit tracking
were added in 6ab0900 and c76d521
2024-08-23 12:19:44 +02:00
leo
07e3c30535
ux: remove the highlighted border for search text box in Welcome page (#398) 2024-08-23 18:05:09 +08:00
leo
8f114e8a32
ux: change style for commit ref decorators (#395)
* change font from `Fonts.Monospace` to `Fonts.Primary`
* increase the font size
2024-08-23 17:41:38 +08:00
leo
854563ef41
enhance: support search repository path 2024-08-23 17:25:21 +08:00
Nils van Rijsinge
aec8c0ddc4
Merge branch 'sourcegit-scm:develop' into develop 2024-08-23 11:12:49 +02:00
leo
a223ec1fc6
ux: smaller loading icon 2024-08-23 17:07:11 +08:00
leo
e845c270cd
fix: Ctrl+F is not working when Welcome page is not focused (#398) 2024-08-23 17:05:13 +08:00
leo
c76d521f12
localization: title for commit relation tracking popup 2024-08-23 16:58:18 +08:00
leo
6ab0900b20
feature: add a button to see which branches and tags that contains selected commit (#388) 2024-08-23 16:52:55 +08:00
NilsPvR
838c503afa localization: add DE WindowFrame + FirstParent key
were added in d21cc2c and d5e51d1
2024-08-23 10:18:43 +02:00
leo
fcc8a41ad1
readme: welcome everyone to share their own themes 2024-08-23 11:57:17 +08:00
leo
c6b26517c0
ux: style for branch/tag filter toggle button 2024-08-23 11:35:57 +08:00
leo
4120331eda
refactor: there's no need to use AvaloniaList since we have replaced the TreeView with custom control 2024-08-23 11:24:31 +08:00
leo
9bcadf3523
ux: using WrapPanel instead of StackPanel to prevent content out of bounds (#396) 2024-08-23 10:57:33 +08:00
leo
c3f2c5836a
feature: handle ESC key to clear search in Welcome page 2024-08-23 10:39:09 +08:00
leo
729e0d6cc8
ux: new style for current HEAD 2024-08-23 10:29:43 +08:00
leo
c1ee47a79d
code_style: remove unused code and run dotnet format 2024-08-23 10:28:16 +08:00
leo
e6f3ab5e68
ux: different node in graph (#395) 2024-08-23 10:22:53 +08:00
leo
7389f5d521
revert: item should fill the height of tree node 2024-08-22 21:57:39 +08:00
leo
c2549869ce
code_style: clean up unused styles 2024-08-22 21:46:06 +08:00
leo
38770af13d
ux: vertical align center 2024-08-22 21:23:05 +08:00
leo
38e2e0f3f4
refactor: rewrite the welcome page since the original TreeView has many limitations (#391) 2024-08-22 21:10:23 +08:00
leo
af6d2cc725
fix: TreeView do NOT support NavigationMethod.Direction with invisible nodes (#391) 2024-08-22 18:11:25 +08:00
leo
71d36698f8
feature: select and open repository by keyboard in Welcome page (#391) 2024-08-22 15:45:50 +08:00
leo
10e5c7aa6c
refactor: window chrome style 2024-08-22 15:06:30 +08:00
leo
8b469e7778
enhance: show untracked submodules in unstaged (#393) 2024-08-22 14:10:32 +08:00
leo
d5e51d1f32
feature: supports using native window frame on Linux (#390) 2024-08-22 12:37:26 +08:00
leo
eaf5eba0e7
ux: using Brush.Popup for menu flyouts 2024-08-22 10:20:18 +08:00
leo
e84d28b7b6
Merge pull request #392 from ChiahongHong/file-explorer
Prevent executing an executable file with the same name as the directory
2024-08-22 10:06:37 +08:00
Chiahong Hong
9a1e95b7e5
fix: handle file paths with spaces 2024-08-22 02:09:34 +08:00
Chiahong Hong
fd7bc8b122
fix: prevent executing an executable file with the same name as the directory 2024-08-22 00:57:23 +08:00
leo
323dc2e87f
code_review: PR #386
* rename `FirstParentFilterToggled` to `EnableFirstParentInHistories`
* remove `FirstParentFilterEnabled` from repo settings - it should not been saved
* move toggle button from repository toolbar to histories switcher
* tooltip translations
* new icon for `Icons.FirstParentFilter`
* extends commit graph to support `--first-parent` option
2024-08-21 19:45:32 +08:00
leo
acf0a486d7
Merge pull request #386 from ybeapps/feature/first-parent-filter
first-parent-filter
2024-08-21 19:28:52 +08:00
leo
aae8628dc2
Merge pull request #389 from NilsPvR/develop
Add CheckSubmodule key for German
2024-08-21 18:43:19 +08:00
NilsPvR
854331051a localization: add CheckSubmodule key for German
was added with d4a9343
2024-08-21 12:28:52 +02:00
leo
2ce41fe546
Merge pull request #387 from gadfly3173/ux/preference
ux: Preference fit to content width
2024-08-21 17:37:42 +08:00
Gadfly
5575adf849
ux: Preference fit to content width 2024-08-21 17:31:27 +08:00
leo
be54361e9d
ci: revert macOS package signing and remove temp artifacts 2024-08-21 16:41:05 +08:00
leo
9b6fd3b147
ci: use macos-lastest to package macOS app 2024-08-21 16:24:15 +08:00
leo
e1ac596261
ci: try to sign macOS package locally 2024-08-21 16:17:19 +08:00
Yitzchak Ben-Ezra
d21cc2c96a first-parent-filter
need help in two issues:
1. use better icon - I just reused the Filter icon
2. lines of merge commits are still rendered - need to skip them since they don't link to any commit when filter enabled. I didn't manage to solve by my own right now
2024-08-21 09:04:35 +03:00
leo
7e4eca9691
code_style: remove unused namespace using 2024-08-21 12:49:55 +08:00
leo
191763e1d8
refactor: commit sha link in message (#382)
* remove the built-in commit issue tracker rule
* hyperlink in commit message now supports commit sha
2024-08-21 12:46:36 +08:00
leo
6485a6f93a
ux: use JetBrains Mono font for change status icon (#384) 2024-08-21 11:50:17 +08:00
leo
19924930bc
Merge pull request #383 from gadfly3173/fix/counter-visual
fix: invalidate counter visual (#338)
2024-08-21 11:28:06 +08:00
Gadfly
3b9e781b0a
fix: remove unused AffectsRender 2024-08-21 11:23:27 +08:00
Gadfly
9c0b9608dc
fix: invalidate counter visual (#338) 2024-08-21 11:08:50 +08:00
leo
48adad53b4
feature: supports the commit hash issue tracker (#382)
Using issue tracker instead of built-in supported commit web link is based on the following reasons

* repo may have multiple remotes
* it is not good to open an context menu to choose which web to visit with multiple remotes
* some remote servers are not supported by this app
2024-08-21 10:44:07 +08:00
leo
7b26589485
fix: button tooltip foreground (#381)
* TextBlock may not be the direct child of Button, for example, it may wrapped by a StackPanel with icons.
* Introduce another way to solve this problem
2024-08-21 10:18:28 +08:00
leo
a99f075c64
Merge pull request #381 from ChiahongHong/tooltip-color
Fix foreground color in tooltip on primary button
2024-08-21 10:09:19 +08:00
Chiahong Hong
1dfa7aa1a7
fix: correct selector for foreground color in tooltip on primary button 2024-08-21 01:28:13 +08:00
leo
ad21d2f6bf
readme: remove unnecessary tips for Linux users 2024-08-20 21:27:41 +08:00
leo
04a187203a
refactor: detect terminal before it is needed 2024-08-20 21:05:20 +08:00
leo
f4f5ae7430
ux: remove rounded corner when window is maximized using TemplateBinding (#378) 2024-08-20 20:59:57 +08:00
leo
66b28621d1
fix: wrong path to find iTerm2 2024-08-20 20:55:41 +08:00
leo
c1c1e1f0c8
ux: remove rounded corner when window is maximized (#378) 2024-08-20 20:48:44 +08:00
leo
05db9e429d
code_review: PR #377
* simplify the implementation
2024-08-20 20:44:54 +08:00
leo
34e4d7fed6
Merge pull request #377 from ybeapps/macos-iterm2-support
Support iTerm2 in MacOS
2024-08-20 20:36:03 +08:00
Yitzchak Ben-Ezra
f53b35243d Support iTerm2 in MacOS 2024-08-20 14:32:52 +03:00
leo
5370526fcc
ux: selected style for repo dashboard contents 2024-08-20 17:11:51 +08:00
leo
9844043c7f
ux: use ListBox with VirtualizingStackPanel instead of DataGrid since height of DataGridRow is not equal with the RowHeight value 2024-08-20 16:55:28 +08:00
leo
d4a9343eaf
feature: add an option to enable --recurse-submodules=check on push (#345) 2024-08-20 15:20:58 +08:00
leo
d66053a42d
code_style: run dotnet format 2024-08-20 11:53:37 +08:00
leo
b0d3d302bb
Merge pull request #373 from aikawayataro/fix-macos-app
Fix missing permissions for OSX app
2024-08-20 10:32:56 +08:00
Aikawa Yataro
c38760883f
ci: also build packages in the CI workflow 2024-08-19 14:14:29 +00:00
Aikawa Yataro
8dafe176df
fix: missing OSX app permissions 2024-08-19 13:41:51 +00:00
leo
55d2657799
ux: better line number layout 2024-08-19 19:54:46 +08:00
leo
ecc1414006
fix: empty monospace font with non-empty default font fallback issue 2024-08-19 19:18:31 +08:00
leo
50d742e1eb
Merge pull request #371 from NilsPvR/develop
New keys for german translation
2024-08-19 17:44:30 +08:00
NilsPvR
ef0c04fe20 localization: add new keys for German translation
the keys were originally added in b3327eb and addbb19
2024-08-19 11:31:15 +02:00
leo
8bd8787d25
feature: auto-focus when open a new page (#368) 2024-08-19 17:24:39 +08:00
leo
3369cc00f3
Merge pull request #370 from aikawayataro/fix-packages
Fix aarch64 package dependencies
2024-08-19 17:16:04 +08:00
leo
9057b71f2d
refactor: rewrite the font configuration (#366)
* input font name directly instead of a font picker because localized font family name is not supported by Avalonia
* fallback monospace font to default font
* remove unused code
2024-08-19 17:14:41 +08:00
Aikawa Yataro
6267101eaf
refactor: instead of a hardcoded path, use the -r when creating a relative link 2024-08-19 08:22:47 +00:00
Aikawa Yataro
90edabeb32
fix: update RPM dependencies 2024-08-19 08:22:38 +00:00
Aikawa Yataro
211c263043
fix: failed to resolve dependencies with aarch64 RPM package
dependencies on aarch64 will not be resolved if library names are specified without architecture
we could use `%{?_isa}` macro, however it looks like specifying library names as dependencies is generally avoided
2024-08-19 07:36:51 +00:00
leo
24dde77548
refactor: rewrite SourceGit.App 2024-08-19 12:49:29 +08:00
leo
32e59c4048
Merge branch 'master' into develop 2024-08-19 10:27:23 +08:00
leo
f3d56ffb20
Merge branch 'release/v8.26' 2024-08-19 10:26:57 +08:00
leo
8589bf880d
version: Release 8.26 2024-08-19 10:26:45 +08:00
leo
84b8735d6c
code_style: run dotnet format 2024-08-18 23:14:44 +08:00
leo
7fe1df20cc
refactor: delay starting background tasks
* start background task only it is needed
* solve the problem that we can not use `ViewModels.Preference.Instance` until resource ready
* remove avatar sever settings
2024-08-18 23:10:54 +08:00
leo
e7921db339
fix: can not open app dir on macOS 2024-08-18 15:53:54 +08:00
leo
2934ad72d4
project: upgrade TextMateSharp to 1.0.62 2024-08-18 14:41:28 +08:00
leo
fe9f4f5743
refactor: rewrite the way using extension to get custom grammars 2024-08-18 09:33:40 +08:00
leo
39fba17648
enhance: text editor (#365)
* support extra grammars.
* avoid crashing on text editor detached from visual tree
2024-08-18 00:18:18 +08:00
leo
a3496a9d2f
fix: virtual space not include (#364) 2024-08-16 19:21:48 +08:00
leo
ed7465def5
enhance: render highlight background manually instead of using TextRunProperties.SetBackgroundBrush(IBrush) (#364) 2024-08-16 18:59:48 +08:00
leo
9f39a9b295
fix: background not fill entire text line (#364) 2024-08-16 17:28:00 +08:00
leo
6d11296eae
enhance: update selected chunk after stage/discard/unstage previous chunk (#361) 2024-08-16 15:11:35 +08:00
leo
6ac7ff2882
feature: add context menu item to checkout file with revision 2024-08-16 14:49:26 +08:00
leo
b6b52c14e5
ux: change icon for checking out file with revision 2024-08-16 14:18:29 +08:00
leo
f71cd237cb
enhance: disable reset file to parent revision when it has been renamed
* new icon for checkout file
2024-08-16 11:55:36 +08:00
leo
f7e0cbf989
ux: style for disabled menu item 2024-08-16 10:14:08 +08:00
leo
ba1ab40eb0
Merge pull request #363 from JeanFranz73/develop
fix: update pt-BR locale w/ new strings
2024-08-16 09:38:07 +08:00
Jean
dd66e68ecd fix: update pt-BR locale w/ new strings 2024-08-15 19:02:09 -03:00
leo
addbb19728
feature: add context menu items to revision changes to reset (checkout) selected file to this revision or to it's first parent file version (#359) 2024-08-15 22:13:20 +08:00
leo
eb56de2d6f
ux: change min height of DataGridCell's from 32 (default) to 24 2024-08-15 21:34:24 +08:00
leo
2ffc1b7178
enhance: manually stage all changes instead of using --all parameter in git commit 2024-08-15 20:09:38 +08:00
leo
3bcea2a4f0
ux: style of commit message picker button 2024-08-15 19:52:05 +08:00
leo
b3327ebeb5
feature: supports commit template (#264) 2024-08-15 18:59:35 +08:00
leo
9acd8519f6
readme: github note format 2024-08-15 16:02:38 +08:00
leo
c8db2fd8ea
code_style: format axaml 2024-08-15 15:59:10 +08:00
leo
96d121999b
Merge pull request #358 from NilsPvR/develop
Add German translation 'open app data dir'
2024-08-15 15:27:55 +08:00
NilsPvR
6a48ab05a4 feat: add German translation 'open app data dir' 2024-08-15 09:18:03 +02:00
leo
612c5e3874
readme: add tips 2024-08-15 14:39:41 +08:00
leo
f3cbb7adb0
project: change optimization mode from Size to Speed 2024-08-15 12:05:28 +08:00
leo
ff3d841d12
feature: add a menu item to open app data dir 2024-08-15 11:47:04 +08:00
leo
0c6af27b40
refactor: rewrite the way to find external editors (#347)
* do not find tools from environment variables since it needs a lot of works on some platforms, such as macOS
* add `external_editors.json` to allow user configure paths directly
2024-08-15 11:32:26 +08:00
leo
eaad685d06
fix: typo 2024-08-15 10:43:38 +08:00
leo
bf6ac4d20d
refactor: rewrite commit web link
* add support for Bitbucket
2024-08-15 10:39:31 +08:00
leo
48de509c63
ux: change cursor to hand when hover links 2024-08-14 17:27:37 +08:00
leo
18cf258201
project: update solution
* add github workflow files
* add build scripts
2024-08-14 16:41:15 +08:00
leo
f544333418
project: cleanup
* remove unused build scripts since we use github CI to automate releases
* rename build/ci to build/scripts
* cleanup solution file
2024-08-14 16:34:43 +08:00
leo
db40a3f368
feature: try to enable DBus file picker on Linux platforms (#289) 2024-08-14 16:09:55 +08:00
leo
f5d4f61c8a
ux: change cursor to Hand when mouse is hovered the commit web link 2024-08-14 11:14:21 +08:00
leo
55da40f8dc
fix: sometimes textblock with issue link will render nothing 2024-08-14 11:06:37 +08:00
leo
ec14d9d533
refactor: remove binding errors 2024-08-13 20:40:05 +08:00
leo
abdf9d7e75
refactor: rewrite commit web links 2024-08-13 19:30:10 +08:00
leo
59a7c74fd1
fix: try to fix issue #338
* use custom control to draw badges
2024-08-13 18:24:28 +08:00
leo
f3406e93fc
fix: try to fix issue #338
* upgrade Avalonia to `11.1.3`
* use reactive property instead of simple getter
2024-08-13 17:38:58 +08:00
leo
34a598d421
feature: add commit web links (#357) 2024-08-13 17:15:17 +08:00
leo
a145d6e4c3
revert: remove issue link support in commit list
* improve render performance
* the links in commit list are very easy to click by mistake
2024-08-13 15:58:34 +08:00
leo
d601ca6b23
enhance: force InvalidateVisual 2024-08-13 14:57:05 +08:00
leo
70f2bda097
revert:ci: disable unsupported platforms
This reverts commit f1d43d94a4.
2024-08-13 14:48:21 +08:00
leo
c60751de9a
Merge pull request #356 from aikawayataro/ci-release
Automatic CI releases
2024-08-13 14:12:10 +08:00
leo
435c12b340
ux: add style for issue link hovered 2024-08-13 12:25:06 +08:00
leo
08fc069281
enhance: disable selection while click issue link 2024-08-13 12:18:26 +08:00
leo
202aa379f8
fix: can not select the entire content of commit message 2024-08-13 12:08:33 +08:00
leo
d1b236b090
enhance: usually we create hidden sub-directories in $HOME with lowercase names 2024-08-13 10:19:16 +08:00
leo
19cb5678a7
project: upgrade TextMateSharp to 1.0.61 to support arm64 platforms (#312) 2024-08-13 10:08:44 +08:00
leo
38665a61cb
fix: Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) returns an empty string on some linux distro
* fallback the storage folder to `~/.sourcegit`
2024-08-12 21:38:11 +08:00
Aikawa Yataro
f1d43d94a4
ci: disable unsupported platforms 2024-08-12 13:35:55 +00:00
leo
9561f7ef64
Merge pull request #353 from NilsPvR/develop
Code review suggestions for German translation
2024-08-12 19:59:56 +08:00
leo
760fd5a3f0
Merge pull request #355 from gadfly3173/fix/edit-remote
fix: remove null-check of sshKey in EditRemote
2024-08-12 19:41:00 +08:00
Gadfly
04c9214fc0
fix: remove null-check of sshKey in EditRemote 2024-08-12 19:28:01 +08:00
leo
69178838be
fix: always trait Atl/Ctrl/Shift as key modifers (#351) 2024-08-12 16:51:37 +08:00
leo
0646db36a4
fix: KeyDown event won't be triggered unless toolbar got focus (#351) 2024-08-12 16:14:39 +08:00
van Rijsinge
d98ec5db75 feature: add German translations for new features 2024-08-12 09:33:25 +02:00
leo
429e037adb
feature: use Ctrl + click to stash all changes automatically with default options (#351) 2024-08-12 15:11:49 +08:00
leo
965a4b21ae
feature: use Ctrl + click to start fetch/pull/push automatically with default options (#351) 2024-08-12 15:01:00 +08:00
NilsPvR
9c6bd87dd6 enhance: review suggestions for German translation 2024-08-12 08:59:40 +02:00
leo
2e12717235
ux: removes padding when calculate layouts 2024-08-12 12:03:30 +08:00
leo
c9721c9fc1
Merge branch 'master' into develop 2024-08-12 10:13:47 +08:00
leo
2e7d742851
Merge branch 'release/v8.25' 2024-08-12 10:13:16 +08:00
leo
733045c8f0
version: Release 8.25 2024-08-12 10:13:01 +08:00
Aikawa Yataro
05ddd42604
ci: use new AppImage runtime 2024-08-11 15:51:31 +00:00
leo
dabdd0b06a
code_style: remove empty lines 2024-08-11 18:41:59 +08:00
leo
de2f70b8ea
feature: supports display tags in a tree (#350) 2024-08-11 18:12:58 +08:00
leo
f59af0afcf
enhance: only when the repository has submodules will the submodule information be updated at the same time after the branch information changes 2024-08-11 10:15:43 +08:00
leo
e2da0d3643
project: downgrade AvaloniaUI to 11.0.13 2024-08-11 09:18:06 +08:00
leo
492859f470
Merge pull request #349 from NilsPvR/develop
Enhance German translation (2)
2024-08-11 08:27:22 +08:00
NilsPvR
116a1bcca3 fix: accidently whitespace + capizalization 2024-08-09 21:04:19 +02:00
NilsPvR
27d0aed516 enhance: german translation for more consistency
+ fix some typos and add missing translations
2024-08-09 20:18:05 +02:00
leo
6881837c80
ux: increase max font size to 18 (#346) 2024-08-09 21:21:28 +08:00
leo
747c8054f5
fix: submodule status is not updated when branch changed (#339) 2024-08-09 18:29:04 +08:00
leo
e05264e35d
fix: can not create branch when detached head has extra commits (#344) 2024-08-09 16:59:48 +08:00
leo
ed2d3279e1
enhance: create branch on detached HEAD (#344) 2024-08-09 16:06:28 +08:00
leo
c596427380
fix: ahead/behind indicator of commit in histories view not updated after upstream changed 2024-08-09 15:17:04 +08:00
leo
ce7420354d
fix: local changes do not updated after submodule changed (#339) 2024-08-09 14:34:19 +08:00
leo
d37f53a4f3
fix: local changes do not updated after submodule changed (#339) 2024-08-09 14:28:10 +08:00
leo
905664c5e2
fix: can not select issue rules after remove one in last two (#343) 2024-08-09 14:22:30 +08:00
leo
3a54471ea5
refactor: rewrite branch auto-select after remote changed while pulling (#342) 2024-08-09 14:08:25 +08:00
leo
f98423b4c7
enhance: auto-select branch after remote changed while pulling (#342) 2024-08-09 14:03:31 +08:00
leo
a75d50bf97
refactor: rename Models.Watcher.UpdateSubmodules to Models.Watcher.SetSubmodules
* run `dotnet format`
2024-08-09 11:33:37 +08:00
leo
71d2b295da
refactor: combine Commands.UpdateSubmoduleStatus into Commands.QuerySubmodules 2024-08-09 09:41:24 +08:00
leo
3969111393
ux: force datagrid row height to 24 2024-08-08 21:21:30 +08:00
leo
1fe2be11a7
refactor: rewrite submodule to support IsDirty state (#339) 2024-08-08 21:11:10 +08:00
leo
eb441852b0
enhance: allow edit commit message only with Amend (#336) 2024-08-08 15:18:35 +08:00
leo
97d5ecdfe9
code_style: remove IDE warnings 2024-08-08 15:10:08 +08:00
leo
6c08ee1b05
ux: use smaller fontsize for launcher tabbar 2024-08-08 14:04:48 +08:00
leo
3866b2513b
Merge pull request #335 from gadfly3173/fix/open-local-repo
fix: do NOT change parent of RepositoryNode if it exists when open it from FolderPicker
2024-08-08 10:43:59 +08:00
Gadfly
4c471c6bb9
fix: do NOT change parent of RepositoryNode if it exists when open it from FolderPicker 2024-08-08 10:34:30 +08:00
leo
6bd0920d71
feature: enable syntax highlighting in revision files view (#333) 2024-08-08 10:12:39 +08:00
leo
1ab0ea27df
enhance: remove fixed fontsize in launcher's tabbar (#332) 2024-08-08 09:38:11 +08:00
leo
f8bc48c49c
enhance: exec git command directly instead of call methods from WorkingCopy (#330) 2024-08-08 09:33:46 +08:00
leo
dc32c3e95d
project: upgrade AvaloniaUI to 11.1.2 2024-08-07 19:52:40 +08:00
leo
7ff92c4e1d
ux: stage/unstage/discard button aligment in TextDiffView 2024-08-07 19:42:41 +08:00
leo
d4b0958f67
ux: new style of tab switcher in statistics window 2024-08-07 17:07:39 +08:00
leo
3609d46c1f
enhance: pop stash directly instead of apply+drop 2024-08-07 15:59:35 +08:00
leo
3bcf4e128e
enhance: get count of changed file (without untracked) directly (#316) 2024-08-07 15:52:58 +08:00
leo
8c16ded6bd
enhance: ignore untracked files when calculate local changes in checkout/create branch/pull (#316) 2024-08-07 15:38:18 +08:00
leo
71c2ad989b
enhance: do not call git add before git stash push when enable auto stash in checkout/create branch/pull (#316) 2024-08-07 15:20:21 +08:00
Aikawa Yataro
00a11fbd02
ci: use relative link for AppImage's AppRun 2024-08-07 03:26:57 +00:00
leo
6c5175704e
Merge pull request #323 from warappa/bugfixes/enhance-german-translation
Enhance German translation
2024-08-07 08:17:49 +08:00
warappa
8a7ec4840f #322: Add German translation for issue tracker integration 2024-08-06 21:24:50 +02:00
warappa
67ebc5ae03 Merge branch 'develop' into bugfixes/enhance-german-translation 2024-08-06 21:05:27 +02:00
leo
3506df40e0
refactor: rewrite SetDetail for selected working copy changes (#328) 2024-08-06 17:17:41 +08:00
leo
e50db02ea8
fix: SelectedUnstaged and SelectedStaged should always be re-calculated (#328) 2024-08-06 17:08:01 +08:00
leo
f41f8266d2
ux: rebase popup should always be closed after started (#327) 2024-08-06 16:39:54 +08:00
leo
0450931655
enhance: avoid refetch avatar for noreply@github.com 2024-08-06 15:40:07 +08:00
leo
a7ea61f9af
refactor: remove binding null warnings 2024-08-06 15:33:23 +08:00
leo
1d15c4c95f
fix: drag window won't stop (#326) 2024-08-06 15:12:44 +08:00
leo
2e433aa278
refactor: set detail directly instead of reset selected changes 2024-08-06 14:36:58 +08:00
leo
fe0e969f0d
Merge pull request #325 from gadfly3173/fix/commit-staged
fix: clean SelectedStaged after commit
2024-08-06 14:33:01 +08:00
Gadfly
519d9c770c
fix: clean SelectedStaged after commit 2024-08-06 14:23:47 +08:00
leo
15661037cd
Merge pull request #324 from heartacker/heartacker/develop
update AvaloniaEdit nuget
2024-08-06 14:11:32 +08:00
heartacker
5e85ce8f8b update AvaloniaEdit nuget package to 11.1.0
- AvaloniaEdit
- TextMate
- Grammars
2024-08-06 14:03:24 +08:00
David Rettenbacher
e29e8c2990
Fix about texts 2024-08-06 07:58:20 +02:00
leo
a2749d3c4f
ux: add Color.Link for issue links (#315) 2024-08-06 13:57:51 +08:00
leo
538cdc2764
readme: update 2024-08-06 11:53:33 +08:00
leo
9bee51686a
feature: show issue link on commit list of histories view (#315) 2024-08-06 11:02:52 +08:00
leo
90e3abed8d
enhance: keep selection after unstaging (#320) 2024-08-06 10:42:55 +08:00
leo
4ba7c879c5
feature: use Ctrl+C to copy selected commits in histories (#321) 2024-08-06 10:04:08 +08:00
warappa
6d9613945e Fixes and tweaks German translation 2024-08-05 23:13:36 +02:00
leo
b059423391
feature: enable using drag-drop to re-order commits (#319) 2024-08-05 22:10:43 +08:00
leo
85d3f0993c
refactor: load default github avatar 2024-08-05 20:12:41 +08:00
leo
91daa42c08
ux: margins between textbox and its label in issue tracker configure page 2024-08-05 19:32:50 +08:00
leo
dfd098e131
refactor: merge sourcegit.issuetracker.setting to sourcegit.settings. 2024-08-05 18:18:57 +08:00
leo
f754b2c63a
feature: supports issue tracker in commit message (#315) 2024-08-05 17:34:49 +08:00
Aikawa Yataro
822d6ec88e
ci: tar artifact to keep permissions 2024-08-05 07:05:42 +00:00
Aikawa Yataro
073b5aaf9e
ci: add automatic releases 2024-08-05 07:05:35 +00:00
leo
fa1f4155da
Merge branch 'master' into develop 2024-08-05 10:21:41 +08:00
leo
36e035df75
Merge branch 'release/v8.24' 2024-08-05 10:21:22 +08:00
leo
f02642bb61
version: Release 8.24 2024-08-05 10:21:09 +08:00
leo
55dedcfb5f
Merge pull request #317 from hikmet517/master
Register to directory MimeType to open folders in unix systems
2024-08-05 10:18:22 +08:00
Hikmet Altıntaş
521dcf35a4 Register to directory MimeType to open folders in unix systems
This will automatically add sourcegit to right-click menu for folders in file managers.
2024-08-05 01:04:24 +03:00
warappa
b88031f09d Enhance German translation 2024-08-04 16:47:59 +02:00
Aikawa Yataro
455ad657a7
build: force root owner for deb package 2024-08-03 12:59:02 +00:00
Aikawa Yataro
97d622a8b7
build: fix some AppStream metadata warnings 2024-08-03 12:59:02 +00:00
Aikawa Yataro
6bea4b42a2
build: refactor build scripts
use right way to include symlinks and some other minor changes
2024-08-03 12:58:57 +00:00
Aikawa Yataro
646f7f90cf
ci: allow build to be triggered by call 2024-08-02 19:22:38 +00:00
Aikawa Yataro
08aa96f1c5
ci: don't tar the artifacts since GitHub will archive it anyway 2024-08-02 16:06:06 +00:00
leo
281ef8b490
fix: first '_' character not shown in menu item (#313) 2024-08-02 22:53:55 +08:00
Aikawa Yataro
0492f8e75e
ci: add win-arm64 job 2024-08-02 14:25:25 +00:00
Aikawa Yataro
a76d18c668
ci: refactor jobs into a single job with matrix 2024-08-02 14:24:57 +00:00
leo
b5d7f6d7ce
Merge remote-tracking branch 'origin/develop' into develop 2024-08-02 18:13:51 +08:00
leo
46d2597061
Merge pull request #311 from aikawayataro/arm64
enhance: add CI for arm64
2024-08-02 18:08:08 +08:00
leo
cd9196bb84
feature: supports get avatar from avatars.githubusercontent.com
* move all images to `src/Resources/Images` folder
2024-08-02 18:06:45 +08:00
Aikawa Yataro
f19956efca
enhance: add CI for arm64 2024-08-02 09:58:40 +00:00
leo
1729a64788
Merge pull request #310 from liugangnhm/fix_typo
Fix some typos
2024-08-02 15:51:54 +08:00
jacky
12451a21c4 fix: fix some typos 2024-08-02 15:40:00 +08:00
leo
f3aff65d03
ux: reduce change list row height in commit detail panel 2024-08-02 15:16:19 +08:00
leo
eb437df9fe
enhance: reduce commits loading time for interactive rebase 2024-08-01 18:05:58 +08:00
leo
7891b1124e
feature: asking to create local branch instead of checkout commit if some remote branch's HEAD is selected commit (#295) 2024-08-01 16:59:39 +08:00
leo
57e9c44754
ux: new icon for changes 2024-08-01 15:12:00 +08:00
leo
af8543a4b8
ux: add icon Icons.Clone 2024-08-01 15:02:53 +08:00
leo
58357f031d
ux: add a new icon Icons.Stashes.Add 2024-08-01 11:45:20 +08:00
leo
ba94f017cd
Merge pull request #308 from gadfly3173/fix/revert-merge
fix: support revert merge commit
2024-08-01 10:16:42 +08:00
Gadfly
2a09ae64a4
fix: support revert merge commit 2024-08-01 10:02:09 +08:00
leo
425b713d1e
code_review: PR (#307)
* locale selection is sorted by name
* add en_US fallback for de_DE
2024-08-01 09:57:03 +08:00
leo
c8c881c38a
Merge pull request #307 from warappa/features/305-add-german-translation
Add German translation
2024-08-01 09:49:36 +08:00
warappa
edf09234c8 #305: Add German translation 2024-07-31 23:32:41 +02:00
leo
2a05ffa30f
enhance: trim description of commit message while pasting on subject 2024-07-31 21:36:23 +08:00
leo
ff8456bcba
Merge pull request #304 from JeanFranz73/ptbr-locale
feat: Add portuguese (pt_BR) locale
2024-07-31 21:20:21 +08:00
Jean Franz
658277afc3
add Portuguese to README.md 2024-07-31 10:11:06 -03:00
Jean Franz
177450fffd
feat: Add portuguese (pt_BR) locale 2024-07-31 10:08:59 -03:00
leo
ec6fe25e87
code_style: run dotnet format 2024-07-31 16:26:58 +08:00
leo
2e87f83a38
feature: add tooltip for page tab (#302) 2024-07-31 15:42:13 +08:00
leo
f55a576013
refactor: rewrite amend behaviour (#300)
* toggle amend will show changes in HEAD commit
* since discard is not compatible with staged changes in `amend` mode, we only allows user to discard unstaged changes
2024-07-31 12:04:52 +08:00
leo
3c5a661fa0
feature: supports type change 2024-07-30 21:32:23 +08:00
leo
7f8b8a19a0
feature: add auto complete box for searching commits by file path 2024-07-30 15:59:54 +08:00
leo
addfb449cc
feature: double click on commit (#295)
* when commit is current branch head, do nothing
* when commit is head of some local branch which is not current, try to checkout this branch
* otherwise, ask user should checkout selected commit as deteched
2024-07-30 11:47:58 +08:00
leo
b18f86dde9
fix: ui not updated after font changed 2024-07-30 10:29:07 +08:00
leo
9aa5787ce9
enhance: unchange global core.autocrlf is user do NOT set it yet (#297) 2024-07-30 09:53:04 +08:00
leo
5c6e4a5d48 Merge branch 'KiserDesigns/patch-1' into develop (#296) 2024-07-29 22:15:02 +08:00
leo
327b8033b6
rename: rename monospace style to primary 2024-07-29 20:48:04 +08:00
Noah Kiser
d23134bdc5
Reduce Minimum window size
From 1280x720 to 1000x600
To fit window in top-half / top-third of portrait 1920x1080 monitor:

+------------+
| SourceGit  | 
|            |
+------------+
|File Browser|
|            |
+------------+
| Web Browser|
|            |
+------------+
2024-07-29 07:40:53 -05:00
leo
aea61e0067
feature: add a toggle button in Preference dialog to only use monospace font in code editor (#292) 2024-07-29 20:20:27 +08:00
leo
d2d95e09b7
fix: NRE on commit filters 2024-07-29 19:40:35 +08:00
leo
20744d09bd
enhance: set SuggestedStartLocation to default clone dir when open local repository (#293) 2024-07-29 16:19:35 +08:00
leo
efa02d9e96
ux: remove unnecessary controls 2024-07-29 15:07:41 +08:00
leo
29ce95e81e
enhance: new regex for tag name (#290)
* `(?!\.)` should not starts with `.`
* `(?!/)` should not starts with `/`
* `(?!.*\.$)` should not end with `.`
* `(?!.*/$)` should not end with '/`
* `(?!.*\.\.)` should not contains `..`
2024-07-29 14:38:09 +08:00
leo
7a3a4070a3
Merge branch 'master' into develop 2024-07-29 10:25:56 +08:00
leo
b7c6d62c6d
Merge branch 'release/v8.23' 2024-07-29 10:25:32 +08:00
leo
aec621b4f9
version: Release 8.23 2024-07-29 10:25:09 +08:00
leo
2c9c36d832
enhance: support character '/' in tag name (#290) 2024-07-29 10:23:29 +08:00
leo
c8b688c52d
ux: DataGrid header style in histories page 2024-07-28 11:10:43 +08:00
leo
a3a3a0e4e9
enhance: add a button to clear git.http.proxy configuration 2024-07-28 10:11:10 +08:00
leo
20b45a1cf4
fix: when base is current worktree, the diff content of selected change is wrong
* remove warnings in JetBrains Rider (it seems JetBrains can NOT recognize Binding.TargetNullValue)
2024-07-27 21:35:57 +08:00
leo
4612cecf10
code_review: PR (#288)
* add missing translations and it's no need to add `OnPull` suffix since it already has a prefix `Text.Pull.`
* when enable fetching all branches of selected remote, use merge/rebase command instead of pull
* re-arrange orders of options in pull popup panel
* default enable `Fetch all branches`
2024-07-27 20:35:19 +08:00
leo
924a2ce935
Merge pull request #288 from RevenantX/fetch_all_on_pull_option
Add fetch all branches on pull option (acts like fetch+pull)
2024-07-27 19:58:03 +08:00
RevenantX
8a38b6afac Add fetch all branches on pull. (acts like fetch+pull) 2024-07-27 12:52:01 +03:00
leo
0b6cab41cf
enhance: refresh braches immediately after a branch has been added/deleted 2024-07-27 17:27:24 +08:00
leo
7bfb684bde
refactor: update submodule (#287) 2024-07-26 18:49:07 +08:00
leo
58c685627f
fix: AvaloniaVS designer doesn't work 2024-07-26 17:47:22 +08:00
leo
206de8681f
project: upgrade Avalonia to 11.1.1 2024-07-26 17:35:13 +08:00
leo
b084ee5168
fix: left side by layout did not update after size changed 2024-07-26 16:32:48 +08:00
leo
c83b1fb145
ux: tab bottom corner 2024-07-26 15:14:05 +08:00
leo
bab1a57480
refactor: using x:Int32 and x:String instead of custom types 2024-07-26 15:02:23 +08:00
leo
81331d10c7
project: add build files 2024-07-26 12:01:31 +08:00
leo
d3be3e938f
fix: wrong window margin and border if window is started as maximized 2024-07-26 12:01:09 +08:00
leo
17b0d7ddcb
build: update build scripts 2024-07-26 11:43:59 +08:00
leo
5f02f95e62
ux: use Classes instead of set FontFamily directly 2024-07-26 10:38:55 +08:00
leo
85ce2f9cab
enhance: prevent property changed event if it is unchanged 2024-07-26 10:23:19 +08:00
leo
aae1c41dcd
enhance: extends highlight area of selected/detected chunk to line number area 2024-07-26 10:18:28 +08:00
leo
1bff77cfcf
fix: TextDiffViewChunk render issue 2024-07-25 17:57:28 +08:00
leo
1d5331cf73
code_style: remove unused converters 2024-07-25 15:33:41 +08:00
leo
e9fa9a42ca
enhance: add Views.CommitRefsPresenter to draw commit's decorators (refs) directly 2024-07-25 15:31:16 +08:00
leo
3ddaba1c28
ux: change the icon for clear stashes 2024-07-25 12:05:12 +08:00
leo
1d249a0216
ux: remove vertical seperator 2024-07-25 11:49:54 +08:00
leo
31f918071f
refactor: repository configure
* move button to the left
* change view type from Popup to ChromelessWindow
2024-07-25 10:59:06 +08:00
leo
0fb121e6ed
ux: toolbar icon size 2024-07-24 19:22:45 +08:00
leo
dd55270634
ux: move toolbar buttons those will show popups to center 2024-07-24 19:18:04 +08:00
leo
efe6d743cf
enhance: allow to compile with dotnet 8.0.106 (#281) 2024-07-24 19:07:31 +08:00
leo
8e60ec619e
fix: %(refname:short) sometimes return a wrong tag name that contains the prefix tags/ 2024-07-24 18:52:12 +08:00
leo
869ba7a471
ux: improve tooltip recognition 2024-07-24 17:45:30 +08:00
leo
537ac3e2df
ux: toolbar button icon size 2024-07-24 17:09:30 +08:00
leo
013b4285e4
ux: text displayed when current branch is valid 2024-07-24 16:39:18 +08:00
leo
e29d78e2ae
feature: show current branch on toolbar (#283)
* re-arrange toolbar buttons
* move `Navigate to HEAD` button to toolbar
2024-07-24 16:36:34 +08:00
leo
6f317039ab
feature: add CurrentBranch property to ViewModels.Repository 2024-07-24 15:36:26 +08:00
leo
f8caeceade
refactor: remove unnecessary memebers 2024-07-24 14:32:27 +08:00
leo
ad3eeabb83
feature: allow swap in branch compare 2024-07-24 12:17:44 +08:00
leo
3ef703c65d
code_style: run dotnet format 2024-07-24 11:45:16 +08:00
leo
9e048751ae
refactor: move non-observable object from ViewModels to Models
* ViewModels.MergeMode -> Models.MergeMode
* ViewModels.Notification -> Models.Notification
* ViewModels.ResetMode -> Models.ResetMode
* use `int` instead of `ViewModels.CountSelectedCommits`
2024-07-24 11:44:13 +08:00
leo
0dee3a1969
refactor: use Binding.TargetNullValue instead of empty class Models.CompareTargetWorktree 2024-07-24 11:16:28 +08:00
leo
6038fecab4
code_review: PR (#282)
* add translations for `Text.CommitCM.CopyInfo`
* unify length of commit's short SHA
2024-07-24 10:42:58 +08:00
leo
114e5f8c1a
Merge pull request #282 from RevenantX/copy_commit_info
Add copy info that copies "{Short SHA} - {commit subject}" into clipboard
2024-07-24 10:35:58 +08:00
RevenantX
300c1c99bf
Add copy info that copies "{Short SHA} - {commit subject}" into clipboard 2024-07-24 10:34:35 +08:00
leo
b160f4e47a
enhance: clear selection after swap compare targets 2024-07-23 19:30:16 +08:00
leo
1583b08892
code_review: PR (#280)
* tooltip for swap button
* move `Views.CompareTargetWorktree` to `Models.CompareTargetWorktree`
* remove unused `Models.IObjectId`
* fix swap not working when target is Worktree, because Commands.CompareRevisions's Args do not changed after swapping
2024-07-23 19:26:04 +08:00
leo
8d4e010fc2
Merge pull request #280 from workgroupengineering/feature/RevisionCompare-Swap-Commits
feat: Allow Swap Commits in Revision Compare
2024-07-23 18:38:26 +08:00
Giuseppe Lippolis
5cc30f7d10 feat: Allow Swap Commits in Revision Compare 2024-07-23 11:41:33 +02:00
leo
cd1eed4356
fix: column header vertical seperator missing in some cases 2024-07-23 15:14:52 +08:00
leo
fa9990c38c
code_style: move SourceGit.ViewModels.RepositorySettings to SourceGit.Models.RepositorySettings 2024-07-23 14:52:25 +08:00
leo
183cb8a658
enhance: supports checking updates with hotfix version 2024-07-23 14:36:27 +08:00
leo
40d5a7c7f3
code_style: run dotnet format to apply rules 2024-07-23 13:58:57 +08:00
leo
e0319e3f9b
fix: ssh-askpass not working (#272) 2024-07-23 13:48:52 +08:00
leo
d4b262248a
fix: IntelliJ IDEA Ultimate and IntelliJ IDEA Community fallbacks to JetBrains common icon (#279) 2024-07-23 12:07:39 +08:00
leo
ef0cf76571
project: upgrade AvaloniaUI to 11.1.0 2024-07-23 11:45:54 +08:00
leo
eecea3529a
ux: lower contrast colors in diff view 2024-07-23 10:22:33 +08:00
leo
d8af6bd75f
feature: change minimal system requirement for macOS to 11.0 (#275) 2024-07-22 18:24:52 +08:00
leo
888bf54303
code_style: remove unused code 2024-07-22 16:41:35 +08:00
leo
5b5fc104e5
Merge branch 'master' into develop 2024-07-22 16:13:13 +08:00
leo
41dfbb3754
Merge branch 'hotfix/v8.22.1' 2024-07-22 16:08:44 +08:00
leo
75dcd16305
hotfix: Release 8.22.1 2024-07-22 16:08:24 +08:00
leo
b972bfd5f1
fix: missing empty check for %(upstream:trackshort) (#273) 2024-07-22 16:01:26 +08:00
leo
720b2b65f3
code_style: change static methods of ViewModels.Preference to member function 2024-07-22 15:34:31 +08:00
leo
1e0a2ab5f7
enhance: add -o StrictHostKeyChecking=accept-new option to ssh command 2024-07-22 11:33:34 +08:00
leo
5fed050400
Merge branch 'master' into develop 2024-07-22 09:16:30 +08:00
leo
a1235862f1
Merge branch 'release/v8.22' 2024-07-22 09:16:07 +08:00
leo
0cbb8fce8f
version: Release 8.22 2024-07-22 09:15:20 +08:00
leo
d6dc5e30e9 readme: alignment 2024-07-21 18:08:55 +08:00
leo
ec224bebcb readme: add tips for Windows users to install this app 2024-07-21 18:05:50 +08:00
leo
9f09b8e326 enhance: allow # character in branch name (#271) 2024-07-21 17:44:38 +08:00
leo
91801cff69
enhance: only trigger UpdateSelectedChunk if needed 2024-07-19 11:01:31 +08:00
leo
5b95344453
code_style: move commit methods to base class 2024-07-19 10:43:19 +08:00
leo
b2e6de3afa
ux: move ahead/behind indicator to front of refs 2024-07-19 10:08:41 +08:00
leo
9a15ff59d4
enhance: remove code not needed to improve performance 2024-07-19 09:47:59 +08:00
leo
f0649c95b5
feature: add an indicator that shows those commits the current branch ahead/behind its upstream 2024-07-19 09:29:16 +08:00
leo
9de2853003
enhance: unify selection mode and hunk mode 2024-07-18 16:26:39 +08:00
leo
42f8e41985
ux: lower background opacity for selected hunk 2024-07-18 12:16:36 +08:00
leo
dbc95e7209
refactor: move some method from view to its data source class 2024-07-18 11:40:56 +08:00
leo
e64026d44c
fix: MakeSelection should not use UseSideBySideDiff directly 2024-07-18 11:26:47 +08:00
leo
14469b1399
theme: add ThemeOverrides.OpacityForNotMergedCommits to customize the opacity of commits that not belongs (haven't been merged) to current branch in histories (#268) 2024-07-18 10:46:39 +08:00
leo
b2ed1b283a
enhance: only replace hunk data if needed 2024-07-18 10:18:02 +08:00
leo
4b07a38e97
Merge pull request #269 from gadfly3173/ci/downgrade-system
ci: downgrade ci system
2024-07-18 09:59:15 +08:00
Gadfly
c0d0414ba2
ci: downgrade ci system 2024-07-18 09:28:05 +08:00
leo
d09866e2c3
enhance: commit search (#268)
* add `-i` parameter to ignore case while searching commit message
* add `--branches --remotes` to search commits from all branches
2024-07-17 20:54:09 +08:00
leo
a68b61da94
ux: background highlight margin 2024-07-17 17:14:46 +08:00
leo
26c59bfd0d
code_style: move common funtion to base class 2024-07-17 17:10:32 +08:00
leo
b7e0e38de3
feature: stage/unstage hunk (#265) 2024-07-17 16:56:16 +08:00
leo
b9ed0987eb
enhance: gc will use --prune argument 2024-07-16 18:04:16 +08:00
leo
6d888f8007
code_style: remove unused namespace using 2024-07-16 17:03:36 +08:00
leo
ef0c904e91
ux: improve change list selection 2024-07-16 17:00:08 +08:00
leo
2f5f98770f
enhance: expand tree for current branch (#262) 2024-07-16 15:02:47 +08:00
leo
72ca571c00
localization: add translations for commit time period 2024-07-16 14:06:02 +08:00
leo
80a7b73dd4
ux: style for commit time display mode toggle 2024-07-16 13:26:04 +08:00
leo
f9c8e4c699
code_style: remove unused code 2024-07-16 12:19:58 +08:00
leo
1eb77a5e49
feature: add a toggle button to change the commit time display mode to time period it is passed from now (#259) 2024-07-16 12:16:08 +08:00
leo
9b21269844
update: unify external tool icons to 64x64 pixels 2024-07-15 21:30:00 +08:00
leo
950083df34
enhance: exit loop on the first path that out of canvas bound 2024-07-15 21:16:55 +08:00
leo
3b0f481e4b
ux: welcome toolbar button layout 2024-07-15 20:28:00 +08:00
leo
f15dd52fdd
code_style: use ?: instead of if...else branches 2024-07-15 17:20:55 +08:00
leo
dc407b6033
feature: add tooltip for commit time that shows how much time it is from now (#259)
* this tooltip does NOT update until it's owner row recreated or the DataContext of that row changed. You can scroll it out of bounds to force refresh the tooltip
2024-07-15 16:58:45 +08:00
leo
684fedb9bd
ux: icons 2024-07-15 15:47:28 +08:00
leo
a597845bb4 version: Release 8.21
-----BEGIN SSH SIGNATURE-----
 U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
 MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
 AAAAQPLcdIpPQXIviP08d0CSE21oS4GNmQfXsfyyhGX2dEGIbqdM39TCN9jxJz5RTJA6i0
 lhJ5hi6zz/N0rqcvqTNQ0=
 -----END SSH SIGNATURE-----
gpgsig -----BEGIN SSH SIGNATURE-----
 U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
 MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
 AAAAQBFonCDwl7/QCsgH/7mQ53BGFwIvtP+eUt4e7mzPnd8Q9HWBmisxFKnZCCHgPEWJtz
 0oVSsRQn5jQf7iu6n9Kww=
 -----END SSH SIGNATURE-----

Merge tag 'v8.21' into develop

version: Release 8.21

# -----BEGIN SSH SIGNATURE-----
# U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
# MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
# AAAAQPLcdIpPQXIviP08d0CSE21oS4GNmQfXsfyyhGX2dEGIbqdM39TCN9jxJz5RTJA6i0
# lhJ5hi6zz/N0rqcvqTNQ0=
# -----END SSH SIGNATURE-----
# gpg verification failed.
2024-07-15 10:29:01 +08:00
leo
791b5bd6f8
Merge branch 'release/v8.21' 2024-07-15 10:28:47 +08:00
leo
19c42fb1a5
version: Release 8.21 2024-07-15 10:28:33 +08:00
leo
d3095d44c4
ux: macOS close window button icon 2024-07-15 10:27:10 +08:00
leo
8e7bfc43e0
enhance: search commits by message (#256) 2024-07-15 10:17:26 +08:00
leo
3aad24a64e
enhance: secure exit 2024-07-15 09:54:46 +08:00
leo
f4eca45754
code_style: remove all IDE warnings 2024-07-15 00:30:31 +08:00
leo
24ca3eaf8c
ux: tree folder icon margin 2024-07-14 16:06:40 +08:00
leo
a807aa9e12
code_style: remove all IDE warnings 2024-07-14 15:55:15 +08:00
leo
9ac550242e
readme: format tables 2024-07-13 23:04:21 +08:00
leo
6a8527a394
refactor: commit search (#256) 2024-07-13 22:36:59 +08:00
leo
38c6c7713e
ux: macOS close window icon 2024-07-13 10:03:45 +08:00
leo
fd5ec5ee46
ux: toggle change tree node should trigger rows selection changed event 2024-07-13 09:51:57 +08:00
leo
6206c6abbc
ux: remove unused styles 2024-07-12 17:42:03 +08:00
leo
1c204e72a1
refactor: remove dependency on Avalonia.Controls.TreeDataGrid 2024-07-12 17:14:52 +08:00
leo
7f228385f9
refactor: use cutom RevisionFileTreeView instead of TreeDataGrid 2024-07-12 13:54:38 +08:00
leo
b07aa9e63f
Merge pull request #254 from gadfly3173/fix/log-exception
fix: log UnobservedTaskException
2024-07-12 11:38:28 +08:00
leo
f53e16b6a1
ux: new node should not be selected 2024-07-12 11:11:15 +08:00
Gadfly
ce11c08aba
fix: log UnobservedTaskException 2024-07-12 11:09:46 +08:00
leo
3c770e2525
ux: tree toggle button 2024-07-12 11:01:02 +08:00
leo
67d0167278
fix: commits not marked as merged (#253) 2024-07-11 10:55:48 +08:00
leo
e5462f0086
code_style: run dotnet format to apply code style rules 2024-07-10 12:12:14 +08:00
leo
0ba58a6e9b
fix: ItemsPanel assign more than once 2024-07-10 12:04:01 +08:00
leo
4e13703b9d
fix: should not set DISPLAY env on Linux platform 2024-07-10 11:57:02 +08:00
leo
ca461d1926
fix: SSH_ASKPASS can NOT use parameter 2024-07-10 10:47:43 +08:00
leo
7febac5843
ux: reduce datagride column header height 2024-07-09 19:15:02 +08:00
leo
c94f5877e3
fix: Ctrl+V trigger twice due to async operation (#249) 2024-07-09 18:53:36 +08:00
leo
446445ee73
refactor: base command 2024-07-09 18:13:15 +08:00
leo
dda1e79c6f
code_style: remove unused namespace using 2024-07-09 17:58:17 +08:00
leo
9db050e8c2
fix: commit stucks when using SSH formatted GPG signing with a key contains non-empty passphrase 2024-07-09 17:56:23 +08:00
leo
386c92fa28
localization: add translations for histories datagrid column header 2024-07-09 16:42:07 +08:00
leo
06ba2fd733
feature: allow to resize the width of AUTHOR column in histories (#203) 2024-07-09 16:29:41 +08:00
leo
738189393e
enhance: refresh working copy changes immediately after discard finished 2024-07-09 15:30:40 +08:00
leo
51a68027c8
ux: add a toggle button to reveal password 2024-07-09 15:26:46 +08:00
leo
c16bed1d9f
enhance: run commit search in background 2024-07-09 15:15:31 +08:00
leo
d3f7c31caf
fix: crash when clipboard is empty 2024-07-09 15:02:34 +08:00
leo
22d5927aa5
ux: default commit graph thickness 2024-07-09 13:04:39 +08:00
leo
6930b51c64
refactor: commandline parsing
* `--rebase-todo-editor` launches this app as a git `sequence.editor`
* `--rebase-message-editor` launches this app as a git `core.editor` which runs on background by reading rebasing jobs
* `--core-editor` launches this app as a git `core.editor`
* `--askpass` launches this app as a SSH askpass program
2024-07-09 12:20:52 +08:00
leo
cbe4c36525
feature: support git.core.askpass (#239) 2024-07-08 22:07:00 +08:00
leo
8fa19ecd0c
enhance: better commit graph 2024-07-08 18:10:26 +08:00
leo
7ee3db500a
refactor: json serialization
* move all converters to `App.JsonCodeGen.cs`
* use `ColorConverter` instead of parsing colors manually
2024-07-08 16:45:51 +08:00
leo
16d9b627f0
refactor: rename Models.CustomColorSchema to Models.ThemeOverrides because it do NOT contains only colors currently. 2024-07-08 16:21:57 +08:00
leo
af388bad60
Merge pull request #247 from ghiboz/develop
Graph Tickness
2024-07-08 15:30:28 +08:00
ghiboz
cad118b3e6 Merge branch 'develop' into graph_thickness 2024-07-08 09:17:11 +02:00
leo
99ca1ea3e9 version: Release 8.20
-----BEGIN SSH SIGNATURE-----
 U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
 MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
 AAAAQEEmJntGAipN7IauORAMFRwjEVemqUy7unsf9D2Mq+S8hnBSiKGY6tSJY5m/ShUPba
 2Zn/nZI54W4TAGqaquJws=
 -----END SSH SIGNATURE-----
gpgsig -----BEGIN SSH SIGNATURE-----
 U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
 MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
 AAAAQMPr450LOzdXM1JTS1U+1klv+aMvwZCE+KdHjXXZbqC7/qTbkmd23SzcNF8Oa228E/
 4KTmewzOB7S8zAc2UbQAE=
 -----END SSH SIGNATURE-----

Merge tag 'v8.20' into develop

version: Release 8.20

# -----BEGIN SSH SIGNATURE-----
# U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
# MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
# AAAAQEEmJntGAipN7IauORAMFRwjEVemqUy7unsf9D2Mq+S8hnBSiKGY6tSJY5m/ShUPba
# 2Zn/nZI54W4TAGqaquJws=
# -----END SSH SIGNATURE-----
# gpg verification failed.
2024-07-08 10:24:00 +08:00
leo
7d3f228e0c
Merge branch 'release/v8.20' 2024-07-08 10:23:50 +08:00
leo
212c9e0f9e
version: Release 8.20 2024-07-08 10:23:37 +08:00
ghiboz
2c310e8cd4 Merge branch 'develop' into graph_thickness 2024-07-07 10:54:54 +02:00
leo
09b418374a feature: add an option to enable -a,--all in commit command (#244) 2024-07-07 10:28:14 +08:00
leo
fda13468c4 enhance: supports virtualization in sub context menu 2024-07-07 09:56:22 +08:00
leo
1d7b77e45f fix: virtualization not working 2024-07-07 00:17:36 +08:00
leo
294f856150 fix: bounds not updated after left side bar layout updated 2024-07-06 23:50:54 +08:00
leo
b03ee19e54
refactor: trigger nagivation in BranchTree 2024-07-06 20:46:26 +08:00
leo
36b8472d02
enhance: improve selection changed event handler performance 2024-07-06 17:29:24 +08:00
leo
3197b4bfe8
refactor: use custom BranchTree instead of TreeView to improve performance 2024-07-06 17:17:41 +08:00
ghiboz
c0348b73bd set pen thickness
"General": {
    "Pen.Thickness": "4.4"
  }
2024-07-05 14:02:30 +02:00
leo
1c524cf310
enhance: better sidebar layout 2024-07-05 10:46:00 +08:00
leo
3193693d77
ux: force using double-click to expand/collapse item in TreeView (not TreeDataGrid) 2024-07-04 20:08:37 +08:00
leo
91d73e2aa4
fix: layout do not updated after group was collapsed 2024-07-04 19:41:38 +08:00
leo
f904b3b71a
enhance: improve performance 2024-07-04 19:12:22 +08:00
leo
c03cc85232
enhance: skip update layout after detached from visual tree 2024-07-04 18:18:35 +08:00
leo
6553e27d36
refactor: rewrite the way to get local & remote branch tree height 2024-07-04 18:14:10 +08:00
leo
8faa8c7378
ux: more flex layout for left siderbar groups 2024-07-04 17:59:32 +08:00
leo
3ce580b682
fix: when the remote branch is deleted, deleting the local branch will throw NRE (#238) 2024-07-04 16:47:28 +08:00
leo
15e7df6085
ux: disable WordWrap in side-by-side diff because it may lead to alignment issue between two sides 2024-07-04 14:12:39 +08:00
leo
ace6eccfd3 build: build AppImage as generic linux package 2024-07-04 13:11:16 +08:00
leo
d822afc4ec
ux: trim text in diff editor if length of line is greater than 10000 (#234)
* ignore WordWrap while trimming text, because displaying the full content content with a length greater than 10000 is meaningless
2024-07-03 15:34:29 +08:00
leo
f4f4a26a64
enhance: remember last selected on common actions (#231)
* the way to deal with local changes on checkout branch page
* the way to deal with local changes and should checkout after created on new branch page
* should fetch without tags on fetch page
* the way to deal with local changes and should fetch without tags on pull page
* should push all tags on push
2024-07-03 14:42:21 +08:00
leo
7e16058148
ux: trim change path in information page 2024-07-03 01:15:36 +08:00
leo
b85958214f
enhance: supports customize system accent color (#232) 2024-07-03 00:17:41 +08:00
leo
997edae858
fix: tooltip not updated after theme changed (#233) 2024-07-03 00:03:24 +08:00
leo
54fb25257e
fix: binding error 2024-07-02 23:14:49 +08:00
leo
80f72676ec
ux: new custom theme configuration format
* supports customize the commit graph
2024-07-02 22:54:26 +08:00
leo
c170f261db
ux: re-design commit detail information page to avoid commit message hidden in scoll view 2024-07-02 20:59:28 +08:00
leo
50fe25a631
enhance: only load repository settings if file exists 2024-07-02 14:17:21 +08:00
leo
21ec16b4cc
readme: add winget install tips 2024-07-02 12:35:09 +08:00
leo
57a2144777
fix: try to fix the timezone issue (#229) 2024-07-02 12:30:12 +08:00
leo
4ef0f1180f
feature: add tooltip for branches (#228) 2024-07-02 10:23:21 +08:00
leo
7965338d7c
readme: move custom theme to another repo sourcegit-themes (#227) 2024-07-02 09:42:49 +08:00
leo
68abb2d78b
fix: crash when clipboard is empty 2024-07-01 21:08:37 +08:00
leo
254eac11a1
enhance: paste text on subject
* for single line text, all text will be pasted in subject text box
* if paste in the middle of subject content, multi-line text will be transformed into single line text by `ReplaceLineEndings(" ")`
* if paste in the end of subject content, multi-line text will be split into two parts.
    - first line will be pasted in the subject box
    - remains will be pasted in the start of description box
2024-07-01 21:02:01 +08:00
leo
4998f14547
ux: option order 2024-07-01 20:31:43 +08:00
leo
6e724d2557
readme: description of colors 2024-07-01 20:29:52 +08:00
leo
366e467578
feature: add new color key Color.DecoratorFG to customize foreground color of commit refs (#225) 2024-07-01 20:28:30 +08:00
leo
fb5a7111c6
readme: remove blockquote in external editors tips 2024-07-01 17:19:26 +08:00
leo
fca20965f8
feature: add two color keys Color.DecoratorBranch and Color.DecoratorTag (#225) 2024-07-01 16:32:17 +08:00
leo
6dad466eef
feature: supports --no-tags on fetch and pull operation (#226) 2024-07-01 16:19:29 +08:00
leo
de1a4d14e8
enhance: disable blame on submodules 2024-07-01 13:45:48 +08:00
leo
0da30b6b89
enhance: better LFS file detect method 2024-07-01 13:30:57 +08:00
leo
f08acebb5e
enhance: better implementation to diff submodule changes while repository is not opened 2024-07-01 13:13:18 +08:00
leo
7f389b2e6f
refactor: move settings of repository, such as filters, commit message, from Preference to each repository's gitdir.
* avoid invalid repository setting remains in preference.json
* supports to restore tabs that not added to the Welcome page
2024-07-01 11:57:13 +08:00
leo
56a42dd6e8 version: Release 8.19
-----BEGIN SSH SIGNATURE-----
 U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
 MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
 AAAAQC/4VD7N+H+atifDo6fXMf152B4pV+BULQKZ7GxcxifP6N37WoTqcDaqPvF9xqp+m7
 h9CSJSzhUVidyUFHdZAgo=
 -----END SSH SIGNATURE-----
gpgsig -----BEGIN SSH SIGNATURE-----
 U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
 MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
 AAAAQHK7P3eMR2KS1LtrOUHQH44amL92yCsVfk30Inu6D71TLafNxw2o5IGTsGSFGchKzN
 7NY7mcy3kCPYUO52B1FQY=
 -----END SSH SIGNATURE-----

Merge tag 'v8.19' into develop

version: Release 8.19

# -----BEGIN SSH SIGNATURE-----
# U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
# MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
# AAAAQC/4VD7N+H+atifDo6fXMf152B4pV+BULQKZ7GxcxifP6N37WoTqcDaqPvF9xqp+m7
# h9CSJSzhUVidyUFHdZAgo=
# -----END SSH SIGNATURE-----
# gpg verification failed.
2024-07-01 09:31:36 +08:00
leo
b193579d3c
Merge branch 'release/v8.19' 2024-07-01 09:31:24 +08:00
leo
b10928d389
version: Release 8.19 2024-07-01 09:31:13 +08:00
leo
705f6537af ux: bottom corner for launcher page tab 2024-06-30 19:03:23 +08:00
leo
3ba027bd16
ux: prevents the top border from being cropped 2024-06-29 17:15:10 +08:00
leo
1241539260
refactor: custom renderer for launcher tab bar 2024-06-29 17:04:39 +08:00
leo
bfea573d4b
feature: supports mate-terminal on Linux 2024-06-29 11:53:12 +08:00
leo
1972e26da1
ux: margins for group_expander 2024-06-29 11:02:05 +08:00
leo
4fa388501a
ux: add a new color Color.BadgeFG for text in badge 2024-06-29 10:47:09 +08:00
leo
fa366568cf
fix: badge typo 2024-06-29 10:38:13 +08:00
leo
aee6df4132
feature: supports to search stashes (#213) 2024-06-28 18:57:56 +08:00
leo
3e54ab0227
enhance: makes Create New Branch option as the default selected mode for adding new worktree 2024-06-28 14:11:13 +08:00
leo
db8e534a0a
refactor: rewrite & redesign the ux for AddWorktree popup (#205) 2024-06-28 12:07:33 +08:00
leo
a260c89c0d
Merge pull request #219 from gadfly3173/fix/log-inner-exception
fix: log InnerException to crash log
2024-06-28 11:23:47 +08:00
leo
f455df0937 build: use symbolic link instead of custom script file to add command line for this software on Linux 2024-06-28 11:21:58 +08:00
Gadfly
8bb3bc2316
fix: log InnerException to crash log 2024-06-28 10:11:26 +08:00
leo
8dfe882455
enhance: use -B instead of -b to support creating worktree with existed branch (#205) 2024-06-28 09:38:11 +08:00
leo
ac00d1a221
fix: window border artifacts when drag maximized window to another monitor 2024-06-27 22:06:05 +08:00
leo
f8c4137c78
feature: supports to search/filter tags (#215) 2024-06-27 21:43:15 +08:00
leo
575f902a5d
ux: add minimal height limitation for commit message textbox 2024-06-27 19:34:24 +08:00
leo
fa2c7c0e18
enhance: simpfy the way to lock a worktree 2024-06-27 19:19:21 +08:00
leo
8a8aabede3
feature: add worktree support (#205) 2024-06-27 18:25:16 +08:00
leo
43af8c49a1
enhance: supports use Shift+Enter on popups 2024-06-27 11:38:51 +08:00
leo
40cf5608d3
refactor: rewrite CommitMessageTextBox 2024-06-27 11:24:40 +08:00
leo
91ba181e02
localization: update Text.Preference.General.RestoreTabs 2024-06-26 21:30:03 +08:00
leo
e330862ec9
refactor: rewrite Launcher
* move main tabbar to a standalone control
* simpfy notification
2024-06-26 20:56:29 +08:00
leo
1ce0d0f7bf
fix: crash when using Ctrl to unselect active tab 2024-06-26 16:47:43 +08:00
leo
d2e3b683f1
code_style: make geometry icon resources list in order 2024-06-26 15:51:49 +08:00
leo
773eb9501f
ux: default light theme window border color on Linux 2024-06-26 15:08:43 +08:00
leo
0c21bcd06a
enhance: Git LFS supports (#209)
* add a new context menu to push local LFS object to selected remote
* supports to choose remote for fetch/pull/push/lock/unlock actions
* auto select remote if there's only one remote
2024-06-26 11:50:22 +08:00
leo
f18ecf53eb
screenshot: update 2024-06-26 10:30:09 +08:00
leo
c53aad7142
fix: selected color in TreeDataGrid not updated after system accent color changed 2024-06-26 10:06:03 +08:00
leo
51e05dcddc
enhance: add hotkey Ctrl+Shift+H (Windows/Linux) and ⌘+⇧+H (macOS) to switch left side bar back to dashboard mode 2024-06-26 09:31:58 +08:00
leo
6206626687
ux: group label layout 2024-06-25 21:32:05 +08:00
leo
58be0b7dad
ux: move left siderbar mode switcher top 2024-06-25 20:16:13 +08:00
leo
24bf8811b8
screenshots: update 2024-06-25 19:39:25 +08:00
leo
faabfd6b80
enhance: save last visual line numbers in diff view (#207) 2024-06-25 18:15:31 +08:00
leo
d43f88da03
code_review: PR #208
* make sure there's only one radio button that will change the binding value
* remove unused code
2024-06-25 17:57:21 +08:00
leo
b50ae21699
Merge pull request #208 from gadfly3173/fix/search-btn
fix: SearchFilter radio button checked status
2024-06-25 17:53:55 +08:00
leo
54de6dfa66
ux: layout for tags and submodules 2024-06-25 17:40:02 +08:00
Gadfly
ef64c44142
fix: SearchFilter radio button checked status 2024-06-25 17:33:09 +08:00
leo
b5393c5ace
fix: selected color of ListBoxItem not work on Debain 12 Wayland 2024-06-25 16:08:27 +08:00
leo
432f5a98da
ux: new design for repository left side bar 2024-06-25 15:03:21 +08:00
leo
414f7fad2c
ux: default fontsize for TabItem.Header 2024-06-25 12:12:58 +08:00
leo
d767fc9f6e
fix: TextBlock does not using default font size in preference 2024-06-25 11:58:04 +08:00
leo
8b56c03d87
ux: unify content height of page switcher (exclude borders) 2024-06-25 11:51:02 +08:00
leo
11c687538e
ux: new style for page switcher 2024-06-25 11:44:39 +08:00
leo
8acc0f1104
localization: remove unused resources 2024-06-25 10:37:14 +08:00
leo
bf44c0d8cc
enhance: forbid to rebase interactively if there're local changes 2024-06-25 10:32:53 +08:00
leo
2d4f8709ca
enhance: forbid to reword or squash when there're local changes 2024-06-25 10:26:31 +08:00
leo
3b7545e4fb
fix: ignore all whitespace before real content when calculate subject/total message length 2024-06-24 20:40:47 +08:00
leo
885dccb52b
ux: multiple layout style changes 2024-06-24 19:52:00 +08:00
leo
989e359a5a
fix: pwsh (PowerShell) typo 2024-06-24 19:15:26 +08:00
leo
0a4723db74
localization: translations for reward input tip 2024-06-24 16:15:36 +08:00
leo
0d03d08bf0
ux: use CommitMessageTextBox in Reword popup panel 2024-06-24 16:07:57 +08:00
leo
4f61cd1b38
enhance: add a toolbar button to create top-level group 2024-06-24 12:10:53 +08:00
leo
cac6b2002f
ux: labels in BLEND mode of image diff view 2024-06-24 11:51:41 +08:00
leo
4b027f4349 version: Release 8.18
-----BEGIN SSH SIGNATURE-----
 U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
 MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
 AAAAQGsO+nLw3ciSfIHOHYDrbmK8xFgBpahUz7qhp1TD8/tVtvFuvfpurx/AFeLkYekLAh
 21qrO/7rexwgUkGNZ/ago=
 -----END SSH SIGNATURE-----
gpgsig -----BEGIN SSH SIGNATURE-----
 U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
 MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
 AAAAQMAVswMt5bi6E77K0bFAv/mHeFvD9AJ/6/ykAedX33Xuh3j/ENjZ4vWHeiWaTA/S/M
 M5c0IdQ8BEOEJjGWJGVAs=
 -----END SSH SIGNATURE-----

Merge tag 'v8.18' into develop

version: Release 8.18

# -----BEGIN SSH SIGNATURE-----
# U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAget8v1yGxg5dZtylcT3YtxVVCtT
# MbUsWCvnB3Cr6tIEsAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
# AAAAQGsO+nLw3ciSfIHOHYDrbmK8xFgBpahUz7qhp1TD8/tVtvFuvfpurx/AFeLkYekLAh
# 21qrO/7rexwgUkGNZ/ago=
# -----END SSH SIGNATURE-----
# gpg verification failed.
2024-06-24 10:09:31 +08:00
leo
9a82d04b18
Merge branch 'release/v8.18' 2024-06-24 10:09:03 +08:00
leo
bcd2a96f4b
version: Release 8.18 2024-06-24 10:08:43 +08:00
leo
217bc03581
ux: remove the MaxWidth for user name column in histories (#194) 2024-06-24 10:07:03 +08:00
leo
39eecd66d7
ux: allows users to adjust the height of the commit message input box (#201) 2024-06-24 09:40:39 +08:00
leo
907e009275
ux: subject length tooltip font size and color 2024-06-23 21:35:28 +08:00
leo
ee6c360dc9
ux: z order of horizontal indicator line 2024-06-23 17:30:47 +08:00
leo
dca8f8b39b
feature: warn when commit subject line goes beyond a certain number of characters (#201) 2024-06-23 15:45:54 +08:00
leo
d3042bbe8d
ux: style for buttons in conflict bar 2024-06-22 19:35:15 +08:00
leo
bfd364752b
fix: crash while running WorkingCopy.Clear 2024-06-22 19:05:34 +08:00
leo
dbce8eebde
refactor: use the same control between image preview view and image diff view 2024-06-22 18:56:49 +08:00
leo
45b93a117e
ux: foreground for primary button 2024-06-22 18:38:18 +08:00
leo
4e8e39d2fe
enhance: do NOT use render target when there's only added or delete image. 2024-06-22 14:00:49 +08:00
leo
dde5d4a2a8
ux: margins for FileHistories content 2024-06-22 12:07:28 +08:00
leo
24590a0e43
readme: add image diff view mode tips 2024-06-22 11:51:58 +08:00
leo
209f51da9e
enhance: new image alpha blend implementation 2024-06-22 11:25:19 +08:00
leo
7a5279f717 ux: hide if image not exists 2024-06-21 23:52:40 +08:00
leo
d23740d9e8 ux: tab item font size for image diff view 2024-06-21 23:18:46 +08:00
leo
73e450c684 enhance: new image blend algorithm 2024-06-21 23:07:11 +08:00
leo
2a85f26754 fix: openpgp typo 2024-06-21 23:02:28 +08:00
leo
e1cdbae0ab
fix: wrong percentage for both old and new 2024-06-21 18:49:17 +08:00
leo
1f0c4be625
enhance: update GPG program path after type changed 2024-06-21 18:38:32 +08:00
leo
16b6e90656
fix: configuration of gpg.ssh.program was cleared on Preference windows closing. 2024-06-21 18:23:32 +08:00
leo
c713210a9e
Merge pull request #200 from gadfly3173/fix/working-copy
fix: NRE in WorkingCopy (#199)
2024-06-21 17:56:22 +08:00
leo
8e88df92b3
feature: add two view mode for image diff - side-by-side and blend 2024-06-21 17:48:19 +08:00
Gadfly
0ffc30d58f
fix: print Type Name in crash log 2024-06-21 17:37:04 +08:00
Gadfly
aad91ea834
fix: NRE in WorkingCopy (#199) 2024-06-21 17:22:28 +08:00
leo
d3d6889e25
feature: supports P4Merge as external merge/diff tool (#181) 2024-06-21 10:29:01 +08:00
leo
280df7377e
code_style: remove useless code 2024-06-20 20:58:14 +08:00
leo
b39d33a897
ux: style change for InteractiveRebase 2024-06-20 20:03:01 +08:00
leo
8c8e09aa67
fix: crash when de-select commit using Ctrl 2024-06-20 17:32:14 +08:00
leo
376f775078
fix: remove code for debug 2024-06-20 17:11:23 +08:00
leo
a2866a8789
readme: add description for interactive rebase 2024-06-20 17:08:29 +08:00
leo
7070a07e15
feature: simple interactive rebase support (#188)
* Only allow to start interactive rebase from merged commit in current branch
* The order of commits in the interactive rebase window is as same as it's in histories page.
* Unlike anthor git frontend app `Fork`, you should edit the final message on the last commit rather than the  previous commit that will be meld into while squashing commits
2024-06-20 17:02:12 +08:00
leo
6c9f7e6da3
Merge pull request #193 from gadfly3173/ci/package-tar
ci: Remove the publish directory when packaging tarball
2024-06-20 12:43:20 +08:00
Gadfly
d0ca40bf58
ci: Remove the publish directory when packaging tarball 2024-06-20 11:17:14 +08:00
leo
c1c27be39a
fix: crash when click blank area of change list in Information page of CommitDetail (#192) 2024-06-20 11:11:09 +08:00
leo
02ace694d0
Merge pull request #191 from ennerperez/feature/q-open-submodule
Quick open submodule
2024-06-20 09:27:48 +08:00
leo
7241879f5a
code_review: PR #190
* check middle button click before other action
* pass clicked tab instead of null to avoid closing current active page while clicking on other invalid tab
2024-06-20 09:25:56 +08:00
leo
f3e54369ad
Merge pull request #190 from ennerperez/feature/middle-click-close
Middle Button Close Tab
2024-06-20 09:19:25 +08:00
leo
0a35d8a22d
Merge pull request #189 from workgroupengineering/feature/Clone_Populate_URL
feature: Allow populating the repository URL from the clipboard
2024-06-20 09:15:16 +08:00
Enner Pérez
46b1fc1831 DoubleTab Open Submodule 2024-06-19 13:24:54 -05:00
Enner Pérez
033fbc6383 OpenSubmodule Method 2024-06-19 13:24:33 -05:00
Enner Pérez
0d14e31e02 Middle Button Close Tab 2024-06-19 13:02:47 -05:00
Giuseppe Lippolis
7b0444d317 feature: Allow populating the repository URL from the clipboard
Allow populating the repository URL from the clipboard if the clipboard contains a valid URL.
2024-06-19 17:45:40 +02:00
leo
fec2b402e0
code_review: PR #187
* replace icon with common whitespace icon in other editors
* button tooltip translations
* rename `_showHiddenSymbols` to `_showHiddenSymbolsInDiffView` to make its usage clear
* change the order of this button
2024-06-19 18:15:32 +08:00
leo
4e44d6a7b1
Merge pull request #187 from workgroupengineering/feature/ShowHiddenSymbols
feature: Allows you to show space and tab symbols in DiffView
2024-06-19 17:58:22 +08:00
leo
a472d07544
ux: new theme for statistics 2024-06-19 17:53:02 +08:00
Giuseppe Lippolis
9c7ac5b067 feature: Allows you to show space and tab symbols in DiffView 2024-06-19 11:33:34 +02:00
leo
3d205378d8
fix: crash because CRLFMode do not have a default value 2024-06-19 16:32:21 +08:00
leo
3dc32c87a8
ux: change the primary button theme 2024-06-19 16:14:41 +08:00
leo
dcc63e187b
enhance: remember the last selection of Use rebase instead of merge on pull for each repository (#185) 2024-06-19 15:37:05 +08:00
leo
a717e48a29
enhance: change the default action to deal with local changes on pull/checkout/create new branch to Do Nothing (#185) 2024-06-19 15:29:40 +08:00
leo
a168b05ac6
ux: re-design submodule preview in revision files 2024-06-19 14:24:49 +08:00
leo
e17e4b9a53
enhance: only show tracking options when file is not tracked by GIT LFS 2024-06-19 12:06:34 +08:00
leo
4ce3d73d61
fix: remote url not supports charator ~ (#186) 2024-06-19 10:38:30 +08:00
leo
86226d5484
fix: tag.gpgsign setting not updated 2024-06-19 10:21:36 +08:00
leo
9ae6df4597
readme: update development environment for Linux 2024-06-18 21:12:23 +08:00
leo
41fbbdf643
ux: placeholder for inputs 2024-06-18 20:14:36 +08:00
leo
99afc74871
enhance: shows current histories filters and add a button to clear all histories filters (#184) 2024-06-18 18:27:57 +08:00
leo
09d88455c0
ux: new icon for track option 2024-06-18 14:55:22 +08:00
leo
c2cba9ee56
localiztion: popup panel title should not end with ellipsis 2024-06-18 14:47:55 +08:00
leo
08567a7420
ux: only show Set as tracking branch option if selected remote branch is not upstream of selected local branch 2024-06-18 14:28:48 +08:00
leo
6dface0b62
ux: allow resize window size of LFSLocks 2024-06-18 14:18:29 +08:00
leo
a3c6431efa
feature: supports adding custom LFS track pattern 2024-06-18 14:14:13 +08:00
leo
c56d0cf85e
refactor: external diff merge tool - supports to use difftool/mergetool settings from git config directly (#181) 2024-06-18 12:10:38 +08:00
leo
06245320a9
feature: add a context menu item to open all repositories in a group (#179) 2024-06-18 11:07:48 +08:00
leo
4217d62f47
localization: remove ellipsis for git-lfs options 2024-06-18 10:29:27 +08:00
leo
2f6519fa4d
enhance: avoid crash when missing parameters to format string 2024-06-18 10:19:55 +08:00
leo
f79dc1f91f
code_review: PR #182
* avoid highlight trailing ellipsis
* use WidthIncludingTrailingWhitespace instead of Width to keep original white space in translation
* add same modification on zh_CN and zh_TW
2024-06-18 10:14:23 +08:00
leo
f9d62c5329
Merge pull request #182 from EreMaijala/develop-english-tweaks
Tweak English translations.
2024-06-18 10:10:49 +08:00
Ere Maijala
37066e940a Tweak English translations.
- Menu entries that require additional input end with ellipsis.
- No blank space before ellipsis or colon.
- A few minor tweaks e.g. to unify the style of adjacent choices.
2024-06-17 21:54:41 +03:00
leo
47d690f0d7
ux: new style for Statistics window 2024-06-17 21:09:22 +08:00
leo
ad2fc68c6b
feature: supports visit remote url in browser 2024-06-17 20:31:54 +08:00
leo
3afb134037
cleanup: remove duplicated 2024-06-17 19:44:54 +08:00
leo
bac82ad6cf
readme: add description for GIT LFS support 2024-06-17 18:33:43 +08:00
leo
9a0b10bd9c
enhance: Git LFS support 2024-06-17 18:25:57 +08:00
leo
e731807c91
Merge tag 'v8.17' into develop
Release 8.17
2024-06-17 09:14:39 +08:00
leo
5a1827fdcb
Merge branch 'release/v8.17' 2024-06-17 09:14:22 +08:00
leo
10fc23119e
version: Release 8.17 2024-06-17 09:13:57 +08:00
leo
89f9eb3d90 feature: add pattern to .gitignore by unstaged changes' context menu 2024-06-16 19:42:12 +08:00
leo
20f5a6eb13
ux: add brush for Window border on Linux 2024-06-15 15:20:32 +08:00
leo
e7a1fd9947
fix: artifacts when using rounded corner and clip to bounds with Window border on Linux 2024-06-15 14:55:15 +08:00
leo
f204a744bd
fix: crash when try to open context menu without selected changes in Changes page 2024-06-15 14:50:05 +08:00
leo
6de92bb4d8
refactor: git-flow supports. 2024-06-15 12:44:35 +08:00
leo
5bb41ed65f
ux: new style for NumericUpDown 2024-06-14 15:46:52 +08:00
leo
6974b0e08d
feature: supports windows on arm 2024-06-14 11:43:19 +08:00
leo
9d3f186b44
code_style: run dotnet format 2024-06-14 09:46:30 +08:00
leo
1dffb2ebf5
ux: another way to fix transparent background of popup panel on Linux 2024-06-14 09:44:44 +08:00
leo
76bb93518a
revert: "ux: use the same style for popup"
This reverts commit d85f7ffe1b.
Sometimes, it results a transparent popup panel
2024-06-13 21:19:58 +08:00
leo
3257566781
enhance: add hotkeys to commit buttons (#176) 2024-06-13 20:40:06 +08:00
leo
13cc494a48
enhance: forbid MoveWindow being called while double tap action taking place (#177) 2024-06-13 20:26:24 +08:00
leo
762ec1f702
fix: begin drag was triggered when double click on the title bar 2024-06-13 17:55:22 +08:00
leo
b77ed6520c
readme: add tips to customize current active theme 2024-06-13 17:08:38 +08:00
leo
d9e17b96f2
fix: dragging the border to resize the window looks weird on Linux (#177) 2024-06-13 15:25:04 +08:00
leo
d85f7ffe1b
ux: use the same style for popup 2024-06-13 14:20:26 +08:00
leo
f3bbf79f4f fix: only fix content margin on Windows platform after window maximized 2024-06-13 12:31:45 +08:00
leo
f5b35d3db2
refactor: replace all window with custom ChromelessWindow 2024-06-13 11:54:10 +08:00
leo
68061f82b1
refactor: rewrite TextDiffView 2024-06-12 21:12:45 +08:00
leo
eab680ae55
fix: reset current revision file content when selected commit changed 2024-06-12 12:13:45 +08:00
leo
2078886bc9
fix: close popup if current page is the last one 2024-06-12 12:08:19 +08:00
leo
78654243a0
ux: trim subject if it's too long to display 2024-06-12 12:04:51 +08:00
leo
b59c12e1f0
ux: re-design UI for checkout commit as deteched action 2024-06-12 11:42:22 +08:00
leo
662c9e1580
enhance: remember last WindowState of Launcher 2024-06-12 10:22:26 +08:00
leo
7c79340cc1
fix: view not update after Close Other Tabs clicked 2024-06-11 17:04:28 +08:00
leo
f977e76ea7
feature: remember window size and layout information (#165) 2024-06-11 16:36:52 +08:00
leo
7f2e22def6
feature: supports branch compare (#174) 2024-06-11 15:30:06 +08:00
leo
8bcce5f723
fix: missing subject for the last commit (oldest in commit graph) 2024-06-11 11:08:20 +08:00
leo
ac1eacaa87
Merge tag 'v8.16' into develop
RELEASE_DONE v8.16
2024-06-11 09:16:08 +08:00
leo
e7c52d0eaa
Merge branch 'release/v8.16' 2024-06-11 09:16:06 +08:00
leo
f4a70ba1be
version: Release 8.16 2024-06-11 09:15:36 +08:00
leo
c3cbb6d895 fix: submodule diff missing commit message 2024-06-08 21:13:59 +08:00
leo
4ec93b9d75 enhance: remove nextPartIdx bound check 2024-06-08 14:45:18 +08:00
leo
9e45a8a77d enhance: only store subject in commits.
It has several advantages:

* reduce the memory costed by histories
* higher performance while parsing commits
* no need to calculate subject every time, which is invoked most frequently to render histories
2024-06-08 12:19:48 +08:00
leo
6426da3289
enhance: supports search commits by changed file path like src/Commands/* or */Add.cs. 2024-06-07 18:43:37 +08:00
leo
89f2d3dd11
localization: remove unused keys 2024-06-07 17:38:12 +08:00
leo
bacc1c85ad
enhance: reduce memory usage by commit detail view 2024-06-07 17:29:55 +08:00
leo
78c7168a46
enhance: make commit's subject the same with pretty print parameter %s in git log command 2024-06-07 12:31:10 +08:00
leo
b4e01a8b93
refactor: commits only hold the end position of subject in body 2024-06-06 20:59:09 +08:00
leo
064d04fccc
enhance: improve QueryCommits performance 2024-06-06 20:25:16 +08:00
leo
1a18235a76
fix: tab splitter visible issue 2024-06-06 18:25:28 +08:00
leo
5514c56a29
refactor: more efficient way to update the visibility of tab splitters 2024-06-06 18:09:35 +08:00
leo
b0c14ab3e4
fix: tab splitter visible issue 2024-06-06 17:17:58 +08:00
leo
4610f702b3
code_style: run dotnet format 2024-06-06 15:31:02 +08:00
leo
ed62174942
localization: add missing translations for zh_TW 2024-06-06 11:26:43 +08:00
leo
7201f71e4b
feature: add Traditional Chinese option (#172) 2024-06-06 11:15:22 +08:00
leo
7c2edd8fbc
Merge pull request #172 from gba3124/feature-zh_TW-i18n
feat: add support for Traditional Chinese (zh_TW) i18n
2024-06-06 11:13:30 +08:00
leo
cf02c890bf
ux: re-design the image diff view 2024-06-06 11:09:28 +08:00
owen
2099f8e17e feat: add support for Traditional Chinese (zh_TW) i18n 2024-06-06 10:41:22 +08:00
leo
8b1f28ac95
enhance: show file size change in image diff 2024-06-06 10:36:17 +08:00
leo
54ef9c0bf7
refactor: use bindings instead of sync manually 2024-06-06 10:01:14 +08:00
leo
e432559a5e
enhance: only change the selected changes if it is necessary 2024-06-06 09:53:26 +08:00
leo
2c0a58a99b
ux: default color scheme with high contrast 2024-06-05 21:11:44 +08:00
leo
557e6b48de
Merge pull request #170 from ccyr119/develop
ux: get brush color for LineBackgrounRenderer from themes
2024-06-05 21:06:48 +08:00
leo
87dccda8ff
fix: solve warnings - Layout cycle detected 2024-06-05 21:04:19 +08:00
Chuanyan.Chen
7836f57904 ux: get brush color for LineBackgrounRenderer from themes 2024-06-05 20:34:56 +08:00
leo
0c618998b2
refactor: sync scroll implement 2024-06-05 20:33:33 +08:00
leo
ce35a0365d
fix: sync scroll not working 2024-06-05 19:56:45 +08:00
leo
1d7518a327
fix: add homebrew to default PATH environment 2024-06-05 19:18:47 +08:00
leo
7b71f8512d
ux: re-arrange options in apperance page 2024-06-05 18:32:55 +08:00
leo
7d49d2b913
Merge pull request #167 from gadfly3173/fix/add-remote-ssh
fix: remove null-check of sshKey in AddRemote and change command execution order
2024-06-05 18:25:57 +08:00
leo
62e5ed8a42
enhance: supports user overrides the default color schema 2024-06-05 18:23:28 +08:00
Gadfly
1adf18c724
fix: remove null-check of sshKey in AddRemote and change command execution order 2024-06-05 17:45:10 +08:00
leo
9aca84533c
ux: color scheme for revision compare 2024-06-05 14:20:01 +08:00
leo
78000b6d1a
fix: show a empty commit with sha in submodule diff view if commit has been dropped 2024-06-05 13:54:52 +08:00
leo
1870dcd468
fix: select item in tree not work 2024-06-05 13:21:01 +08:00
leo
ce9a3dad2f
enhance: improve commit and stash parsing time 2024-06-05 11:46:31 +08:00
leo
57540b960a
code_style: remove unused using 2024-06-04 21:05:23 +08:00
leo
d1eb9e15ef ux: use TextTrimming="CharacterEllipsis" for diff view title 2024-06-04 20:34:18 +08:00
leo
802b429cc8 enhance: supports word wrap in text diff view 2024-06-04 20:26:47 +08:00
leo
d2ea90be23 ux: Opacity for selected items 2024-06-04 17:29:08 +08:00
leo
4be068eb21 update: remove unused resources 2024-06-04 14:52:05 +08:00
leo
863f88133c refactor: using command binding instead of routed event binding 2024-06-04 13:10:48 +08:00
leo
d0edc09b2e refactor: add a popup panel to show submodule updating status 2024-06-04 11:36:00 +08:00
leo
069c78f213 readme: add tips for macOS users to set environment variables 2024-06-04 11:13:19 +08:00
leo
5886997389 enhance: QuerySingleCommit supports X.509 and SSH gpg signing formats 2024-06-04 10:27:52 +08:00
leo
4b0af79f73 enhance: GPG signing settings.
* remove gpg format settings from repository's local setting
* add support for X.509 format
* ux style
2024-06-04 10:20:31 +08:00
leo
38fd30d431
Merge pull request #163 from gadfly3173/fix/readme
fix: Adjust the insertion method of contrib.rocks to avoid images being cached
2024-06-03 15:00:19 +08:00
Gadfly
05ab236f8b
fix: Adjust the insertion method of contrib.rocks to avoid images being cached 2024-06-03 14:53:52 +08:00
leo
529dccfc44 Merge tag 'v8.15' into develop
RELEASE_DONE v8.15
2024-06-03 10:21:38 +08:00
leo
d8fe0e2387 Merge branch 'release/v8.15' 2024-06-03 10:21:37 +08:00
leo
9d46a9ae78 version: Release 8.15 2024-06-03 10:21:18 +08:00
leo
6a98af17e4 ux: add missing progress description 2024-06-03 10:18:35 +08:00
leo
0e6a08860a ux: use DataGrid instead of ChangeCollectionView for changes in INFORMATION page 2024-06-03 10:06:23 +08:00
leo
49ce07443e fix: application data dir may not have been created before crash (#161) 2024-06-03 09:44:12 +08:00
leo
f1f54bf6fe fix: force re-create the tree instead of only rebuild the source for the tree (#157) 2024-06-02 14:06:27 +08:00
leo
9d88ae466f fix: xaml errors in Rider 2024-06-01 12:58:59 +08:00
leo
f1ff969090 fix: change list in grid mode looks and works weird (#157) 2024-06-01 12:46:31 +08:00
leo
9d9dd6acb5 code_review: PR #160
* should be `Icons.Copy` not `Icon.Copy`
* remove unused using
* keep the same code style in a function
2024-06-01 12:34:16 +08:00
leo
04e6ed45a7
Merge pull request #160 from workgroupengineering/feature/CopyFileName
feat: Allow Copy only file name with extension
2024-06-01 12:19:03 +08:00
leo
1257234712 fix: binding errors in xaml 2024-06-01 12:13:57 +08:00
Giuseppe Lippolis
33c9771f58 feat: Allow Copy only file name with extension 2024-05-31 16:37:36 +02:00
leo
b74bd997fe
Merge pull request #158 from gadfly3173/feat/i18n-fallback
fix: i18n use en_US.axaml as default language resource
2024-05-31 22:22:56 +08:00
Gadfly
693648a321
fix: i18n use en_US.axaml as default language resource 2024-05-31 21:59:56 +08:00
leo
7c8b04e84e ux: foreground color for dark theme (#156) 2024-05-31 14:18:08 +08:00
leo
7f29d313c7 fix: commit graph rendering bug 2024-05-31 14:05:38 +08:00
leo
71fbd90d21
Merge pull request #155 from gadfly3173/feat/gpg-format
feat: add gpg format switcher (#154)
2024-05-31 14:00:58 +08:00
Gadfly
198cf04c09 fix: IsEnabled handler not triggered when GPGFormat changed 2024-05-31 11:39:15 +08:00
Gadfly
80dfa059ce
feat: add gpg format switcher 2024-05-31 00:25:30 +08:00
leo
b2996acb7b ux: better change list layout in commit detail's INFORMATION page 2024-05-30 20:03:36 +08:00
leo
0a0551bd72 ux: popup running icon 2024-05-30 18:09:42 +08:00
leo
bf96823804 ux: style for revision comparison with current worktree 2024-05-30 18:08:32 +08:00
leo
73cfeca8a9 fix: memory leak caused by animation 2024-05-30 17:30:54 +08:00
leo
092bf15906 enhance: reduce CPU usage 2024-05-30 16:28:21 +08:00
leo
b6e087259b fix: memory leak caused by animation 2024-05-30 16:12:28 +08:00
leo
8ae864a14d enhance: better support for signed commits (#154) 2024-05-30 15:18:26 +08:00
leo
fa3a3b2dad refactor: code cleanup 2024-05-30 15:13:59 +08:00
leo
04f4293421 fix: remove binding to SelectedChanges from change list in the INFORMATION page 2024-05-30 10:00:24 +08:00
leo
55c9fae110 feature: new way to expand/collapse folder node in TreeDataGrid 2024-05-30 09:53:07 +08:00
leo
f4d379e3b8
Merge pull request #153 from Hammerliu/fix_crash
Fix the crash caused by pushing without a branch
2024-05-29 22:05:37 +08:00
leo
ea1bfad84d revert: disable double-click folding/unfolding because it will cause IndexOutOfRange exception 2024-05-29 21:56:03 +08:00
DESKTOP-L3MJ80L\hamme
7ec21e2e53 Fix the crash caused by pushing without a branch 2024-05-29 21:31:46 +08:00
leo
a382a3e564 revert: csproj changes for debuging 2024-05-29 20:51:24 +08:00
leo
9d13b17aaf feature: double-click on single-selecte change tree or file tree will expand/collapse folder node 2024-05-29 20:48:51 +08:00
leo
cce4e5348c Merge branch 'develop' into feature/treedatagrid 2024-05-29 19:44:45 +08:00
leo
ec2d9c4cbe enhance: the character between version's minor and build part maybe '-' 2024-05-29 19:43:46 +08:00
leo
025d468b40 code_review: PR (#152) 2024-05-29 18:53:38 +08:00
leo
13f7279c45
Merge pull request #152 from gadfly3173/fix/git-version
feat: show tooltip if git version too low
2024-05-29 17:56:18 +08:00
Gadfly
2f7ef1ef2b feat: show tooltip if git version too low 2024-05-29 17:47:34 +08:00
leo
7154221946 ux: new style for ChangeViewModeSwitcher 2024-05-29 17:31:01 +08:00
leo
fdc41515b7 ux: remove text decorators of commit SHA in the left panel of FileHistories 2024-05-29 17:08:41 +08:00
leo
f8b327746c Merge branch 'develop' into feature/treedatagrid 2024-05-29 16:45:51 +08:00
leo
0b09d210be feature: allow to ignore local changes also when switching branch or pulling changes (#151) 2024-05-29 16:42:47 +08:00
leo
98fdff7543 code_style: code cleanup 2024-05-29 16:01:12 +08:00
leo
012e28ec8d ux: alignment for commit changes in CommitDetail page 2024-05-29 14:25:43 +08:00
leo
179887339e Merge branch 'develop' into feature/treedatagrid
# Conflicts:
#	src/Views/CommitDetail.axaml
2024-05-29 13:09:25 +08:00
leo
69f9dceece feature: new way to display changes of submodules 2024-05-29 12:50:26 +08:00
leo
1161738df9 enhance: a more adaptable regular expression for remote URLs (#149) 2024-05-29 11:20:15 +08:00
leo
b192a1c423 refactor: use TreeDataGrid instead of TreeView/DataGrid to improve performance (#148) 2024-05-29 10:42:24 +08:00
leo
3160f1d142 Merge branch 'master' into develop 2024-05-28 10:08:43 +08:00
leo
8c23cf7a0c readme: force update image of contributors 2024-05-28 10:08:06 +08:00
leo
52ef0db427 feature: add a context menu item to compare selected branch/revision with current worktree 2024-05-27 21:05:15 +08:00
leo
211e4b24c1 ux: layout for CheckoutCommit 2024-05-27 20:09:19 +08:00
leo
4249653ed6 feature: add context menu for both branch and commit to compare selected with current HEAD 2024-05-27 17:21:28 +08:00
leo
de6375da7c Merge tag 'v8.14' into develop
RELEASE_DONE v8.14
2024-05-27 10:52:07 +08:00
leo
e52eb174f2 Merge branch 'release/v8.14' 2024-05-27 10:52:06 +08:00
leo
cd1c3560ad version: Release 8.14 2024-05-27 10:51:49 +08:00
leo
1040bbe4d2 feature: add buttons to increase/decrease visible lines in text diff view (#145) 2024-05-27 10:29:15 +08:00
leo
8d27690473 code_style: keep ux/code in a uniform style 2024-05-26 14:35:57 +08:00
leo
66f2aab6a7 code_review: review for PR (#147)
* code style
* localizations for zh_CN
2024-05-26 14:25:21 +08:00
leo
e00bc4e630
Merge pull request #147 from filipeRmlh/feature/allowing_to_checkout_commit
Feature/allowing to checkout commit
2024-05-26 13:37:59 +08:00
leo
dc63e39c69 fix: warning about EnumConverters.Equals 2024-05-26 12:17:15 +08:00
Filipe Ramalho
db9ca5ba25
Merge branch 'develop' into feature/allowing_to_checkout_commit 2024-05-25 15:43:27 -03:00
Filipe Ramalho
8aa1690cde Adding checkout commit menu and dialog 2024-05-25 15:11:24 -03:00
Filipe Ramalho
b0c00340a8 Making local detached branch HEAD as the first item below folders 2024-05-25 15:09:40 -03:00
Filipe Ramalho
4750ad0d07 Adding HEAD decorator markup in the Graph 2024-05-25 15:05:32 -03:00
Filipe Ramalho
8aeb7ed17c Adding command to checkout commit 2024-05-25 14:27:42 -03:00
leo
5f333fc781 ux: using SystemAccentColor instead of Color.Accent1 2024-05-25 20:06:49 +08:00
leo
a52124c479 feature: add Do Nothing option to deal with local changes before creating a new branch (#143) 2024-05-25 19:40:30 +08:00
leo
9f0ec7d60d ux: search box corner radius 2024-05-25 11:50:59 +08:00
leo
754a2527f5 feature: allow changing of tracking branch on push (#142) 2024-05-25 11:37:06 +08:00
leo
8e3a8f4c06 optimize: new way to update corner radius of branch tree node to improve performance (#137) 2024-05-25 11:15:07 +08:00
leo
476f9265e1 fix: at least two selected branches are required 2024-05-25 01:36:08 +08:00
leo
6fe96d629a feature: allow deleting multiple branches at one time (#137) 2024-05-25 01:31:59 +08:00
leo
99794e7ff7 localization: update Text.CreateTag.GPGSign 2024-05-24 10:57:19 +08:00
leo
c10778c413 enhance: add an option to push tag to all remotes after created (#141) 2024-05-24 10:47:37 +08:00
leo
b556feb3d3 enhance: tag creation & pushing (#141)
* supports creating lightweight tags
* supports GPG signed tags
* add option to push selected tag to all remotes
2024-05-24 10:31:20 +08:00
leo
0dea7ed0e2 fix: context menu did NOT closed after its placement target being recycled (#140) 2024-05-23 21:24:22 +08:00
leo
e9208ef112 ux: titlebar height on macOS 2024-05-23 09:44:56 +08:00
leo
82b00b357b ux: change delay time to show/hide scrollbar (#139) 2024-05-22 09:55:41 +08:00
leo
717e6b4faf enhance: a more adaptable regular expression for remote URLs (#136) 2024-05-21 14:35:14 +08:00
leo
0aea822499 enhance: remote ssh private key validation 2024-05-21 11:52:30 +08:00
leo
ef20c174ae ux: tabs using system accent color 2024-05-21 11:06:05 +08:00
leo
2e58da7c2a ux: use SystemAccentColor and SystemListLowColor 2024-05-21 10:54:19 +08:00
leo
8fea9fecfb refactor: implementation to delete branches 2024-05-21 09:58:31 +08:00
leo
5eea54dbf8 fix: wrong popup title for editing remote 2024-05-21 09:42:51 +08:00
leo
faf2c39056 refactor: rewrite Preference.FindOrAddNodeByRepositoryPath
* prevent moving node while opening repository directly from commandline
* supports to set parent node while dropping folder to initialize repository
2024-05-20 17:39:31 +08:00
leo
8d726656dc feature: supports to open repository directly from commandline on Linux 2024-05-20 15:15:08 +08:00
leo
8d6481c694 feature: supports to open a repository directly from commandline (#134) 2024-05-20 14:39:05 +08:00
leo
67e8f35b47 Merge tag 'v8.13' into develop
RELEASE_DONE v8.13
2024-05-20 09:23:56 +08:00
leo
12d7fa6670 Merge branch 'release/v8.13' 2024-05-20 09:23:55 +08:00
leo
6e1276844b version: Release 8.13 2024-05-20 09:23:34 +08:00
leo
ac01e2f15b update: macOS build script permission 2024-05-17 15:33:45 +08:00
leo
4cf84cd164 feature: add ⌘+Q hotkey to quit this app on macOS 2024-05-17 15:23:42 +08:00
leo
a976f007f5 refactor: load external tool's icon on startup 2024-05-17 12:01:29 +08:00
leo
0da067caa3 update: new screenshots 2024-05-17 11:35:38 +08:00
leo
d9a14432cc fix: LineNumberMargin did not recalculate required size after data context changed 2024-05-17 10:53:28 +08:00
leo
f973834dab
Merge pull request #132 from gadfly3173/refactor/models-user
refactor: Simplify FindOrAdd method by using ConcurrentDictionary's GetOrAdd
2024-05-16 17:17:02 +08:00
Gadfly
46b9d1b09d refactor: Simplify FindOrAdd method by using ConcurrentDictionary's GetOrAdd 2024-05-16 16:33:34 +08:00
leo
9d7ccc5e67 readme: update avatars and preference storage path on macOS 2024-05-15 17:14:13 +08:00
leo
6709d3c187
Merge pull request #131 from gadfly3173/fix/perference-ignore
fix: remove SearchResultSelectedCommit from preference.json
2024-05-15 16:35:21 +08:00
Gadfly
6e35ee64da fix: remove SearchResultSelectedCommit from preference.json 2024-05-15 16:20:31 +08:00
leo
bb557cdebe
Merge pull request #129 from gadfly3173/fix/launcher-dbclick
fix: DoubleTapped on launcherTabsScroller not triggered correctly
2024-05-14 19:34:06 +08:00
Gadfly
ed39a41b61
fix: DoubleTapped on launcherTabsScroller not triggered correctly 2024-05-14 19:26:16 +08:00
leo
c48d69362e enhance: performance of filtering branch 2024-05-14 18:50:36 +08:00
leo
ae63aa334a fix: rpm file permission by habegit (#128) 2024-05-14 17:23:19 +08:00
leo
1896586f5e ux: style for branch filter input box 2024-05-14 13:37:36 +08:00
leo
02e71d4d75 feature: supports filter displayed branches 2024-05-14 11:47:56 +08:00
leo
17e48d86fe localization: system menu label for macOS 2024-05-13 17:24:42 +08:00
leo
0596a63b30 fix: skip to render contents when Bounds.Width is zero 2024-05-13 16:39:48 +08:00
leo
bd09a44ab9 fix: IME not work on Wayland (#125) 2024-05-13 15:42:24 +08:00
leo
6e3ae6b7b4 fix: wrong hotkeys to open preference dialog 2024-05-13 11:32:49 +08:00
leo
9706a4a538 Merge tag 'v8.12' into develop
RELEASE_DONE v8.12
2024-05-13 09:20:13 +08:00
leo
283c681a10 Merge branch 'release/v8.12' 2024-05-13 09:20:12 +08:00
leo
146f33b531 version: Release 8.12 2024-05-13 09:19:37 +08:00
leo
1b2f556b88
Merge pull request #124 from gadfly3173/fix/launcher-tab
Enhance launcherTabsScroller scroll behavior
2024-05-12 10:53:25 +08:00
Gadfly
ed680bf813
ux: Use RepeatButton instead of Button to make ScrollIndicator support PointerPress operation 2024-05-11 22:50:49 +08:00
Gadfly
0fcef2343a
fix: add ScrollViewer event handler to disable scroll indicators based on scroll position 2024-05-11 22:26:09 +08:00
Gadfly
e5516b5b9f
fix: Fixed ScrollViewer rebounding when scrolling to the right 2024-05-11 21:51:57 +08:00
leo
3fffb0b229 feature: add hotkeys Ctrl+Shift+P (on Windows/Linux) and ⌘+, (on macOS) to open Preference dialog 2024-05-11 18:06:31 +08:00
leo
f4c4c5eb9b ux: style for auto fetch interval input widget (#123) 2024-05-11 17:53:06 +08:00
leo
51d401bad4
Merge pull request #123 from gadfly3173/feat/auto-fetch-interval
feat: Add config of auto fetch interval
2024-05-11 17:43:06 +08:00
Gadfly
7520a2a7b6 feat: Add config of auto fetch interval 2024-05-11 17:37:54 +08:00
leo
62838e5b05
Merge pull request #122 from gadfly3173/fix/dictionary-exception
fix: avoid potential IndexOutOfRangeException in Models.User
2024-05-11 17:09:26 +08:00
Gadfly
3b166a5c22 fix: avoid potential IndexOutOfRangeException in Models.User 2024-05-11 17:00:35 +08:00
leo
449da31c70 localization: add native menu item header labels 2024-05-11 16:51:10 +08:00
leo
73ee0ae2cd fix: use NativeMenuItemSeparator instead of NativeMenuItem 2024-05-11 11:43:02 +08:00
leo
e0d35409b4 feature: move main menu to macOS system menu bar 2024-05-11 11:31:14 +08:00
leo
764cf24284 code_review: PR #120
* remove unnecessary code. The `SetProperty` function takes care of set same property in a loop
2024-05-10 16:30:34 +08:00
leo
efd8e72c4e
Merge pull request #120 from gadfly3173/fix/handle-select-changed
fix: update search filter selected commit after Histories selected commit changed
2024-05-10 16:24:25 +08:00
Gadfly
592d087e05 fix: update search filter selected commit after Histories selected commit changed 2024-05-10 16:04:03 +08:00
leo
37f5472186 ux: do not show /dev/null in DiffView for new file 2024-05-10 16:01:20 +08:00
leo
65ccc9fc7b fix: add missing script to start from commandline on linux 2024-05-10 09:53:20 +08:00
leo
b07b96baea readme: force update contributors 2024-05-09 11:16:05 +08:00
leo
cebe07695a fix: issue cause by commit eeb6abb560 2024-05-07 15:52:04 +08:00
leo
eeb6abb560 fix: avoid duplicated nodes being added into the repository tree 2024-05-07 15:50:26 +08:00
leo
207e82b391 enhance: keep repository tree sorted by name 2024-05-07 15:28:54 +08:00
leo
15456f0dee code_style: use ?: operator instead of if...else 2024-05-07 14:28:34 +08:00
leo
4af8cc18d2 fix: welcome page should use a shared singleton instance to manage and filter repositories (#117) 2024-05-07 14:12:52 +08:00
leo
06ca29b2b2 localization: update copyright 2024-05-07 11:19:50 +08:00
leo
37b5f5c083 feature: enhance the behaviour of closing the last tab
* If the last tab is an opened repository, go back to the welcome page
* If the last tab is welcome page, quit this app
2024-05-07 10:44:46 +08:00
leo
6cd550af4d
Merge pull request #116 from gadfly3173/fix/worktree-branch-switch
fix: Fixed the problem that the switching branch of the worktree repo…
2024-05-07 10:38:56 +08:00
方祝立
0e0d3d64b4 fix: Fixed the problem that the switching branch of the worktree repo is not displayed 2024-05-07 10:29:24 +08:00
leo
9aa723ec49 Merge tag 'v8.11' into develop
RELEASE_DONE v8.11
2024-05-06 12:08:39 +08:00
leo
56780f9c74 Merge branch 'release/v8.11' 2024-05-06 12:08:38 +08:00
leo
04185a7f9c version: Release 8.11 2024-05-06 12:08:19 +08:00
leo
478d52bae4
Merge pull request #111 from dangreene0/develop
Fixed Linux and macOS not being executable
2024-05-06 11:58:19 +08:00
dani
9ccd386c80
Switched workflow branch back to develop 2024-05-06 03:20:32 +00:00
dani
96a1c972de
Program packaged into tarball before uploaded to artifacts 2024-05-06 03:18:20 +00:00
leo
b651835de0 enhance: hotkeys
* add `Shift+Ctrl+Tab` (`⌘+⌥+←` on macOS) to go to previous page
* use `ESC` to cancel commit searching
* enable `AutoFocusBehaviour` on `CommitChanges` and `RevisionFiles` tab
2024-05-06 10:22:13 +08:00
leo
16741c21e6
Merge pull request #107 from dangreene0/develop
Added ability to run program by default for macOS and Linux
2024-05-06 07:23:03 +08:00
leo
e0d3a320fc ux: macOS hotkey tips (#103) 2024-05-06 07:14:53 +08:00
dani
c7784b05cd
Added ability to run program by default. 2024-05-05 23:13:45 +00:00
leo
d87716dc86 fix: disable removing repository at startup (#90) 2024-05-06 07:09:27 +08:00
leo
d46979a0c5 feature: add a checkbox to also delete the tracking remote branch (#99) 2024-05-05 19:45:28 +08:00
leo
eced2e09bd ux: show tips if user is about to delete a remote branch (#99) 2024-05-05 18:47:02 +08:00
leo
5964cf2587 ux: macOS hotkey (#103) 2024-05-05 18:31:11 +08:00
leo
68566b9b34 enhance: use instead of Ctrl , instead of Alt for all hotkeys used by this app on macOS (#103) 2024-05-05 18:19:59 +08:00
leo
9627206764 fix: launch terminal in current user's home dir failed on macOS(#105) 2024-05-05 13:12:26 +08:00
leo
7da184c55b fix: disable native system menubar on macOS (#106) 2024-05-05 13:02:23 +08:00
leo
65fbeae07e readme: add VSCodium tips 2024-05-03 22:02:19 +08:00
leo
c9ce41aef3 feature: supports open in/diff with VSCodium (#102) 2024-05-03 21:54:10 +08:00
leo
63248dafb5
Merge pull request #104 from gadfly3173/fix/keep-commit
fix: keep selected commit after _commits var reassigned
2024-05-03 21:07:49 +08:00
Gadfly
2e60c98eee
fix: keep selected commit after _commits var reassigned 2024-05-03 21:04:43 +08:00
leo
1fe050ed0b enhance: if current repository is a worktree of another repository, watch the gitdir to it's main repository's gitdir (#86) 2024-05-03 20:47:59 +08:00
leo
9ae926db9f code_style: rename BoolConverters.BoolToStarOrAutoGridLength to BoolConverters.ToStarOrAutoGridLength 2024-05-03 11:43:33 +08:00
leo
9b10a867cc
Merge pull request #100 from gadfly3173/fix/base-info
fix: Fixed the issue when the email address is too long and exceeds the scope of the StackPanel
2024-05-03 11:20:06 +08:00
leo
df79e16f6c
Merge pull request #101 from gadfly3173/fix/linux-tar
build: copy .icns file into Linux archive
2024-05-03 11:15:30 +08:00
Gadfly
e5049c04fc
build: copy .icns file into Linux archive 2024-04-30 21:58:09 +08:00
Gadfly
9c6798ef1b
fix: Fixed the issue when the email address is too long and exceeds the scope of the StackPanel 2024-04-30 21:50:30 +08:00
leo
a5150edee0 code_style: rename platform_finder to platformFinder and run dotnet format to apply code style rules 2024-04-29 17:55:38 +08:00
leo
09b8564636 ux: left margin of branch icon 2024-04-29 17:36:00 +08:00
leo
2e53945058 Merge branch 'bogomolets-owl/develop' into develop (#98) 2024-04-29 17:23:23 +08:00
leo
776605cb68 code_review: PR #98
* remove the `Leave` option (it may lead to an undefined behaviour), so user can only choose `Stash & reapply` or `Discard`.
* re-design the UI
* remove unused resources
2024-04-29 17:22:22 +08:00
Alexander Bogomolets
927a1cab24 Add checkout local changes handling
This commit adds the local changes handling behavior for branch checkout.
One of three can be selected: stash and reapply after checkout, discard changes or leave them as is (previous behaviour)
2024-04-29 16:40:20 +08:00
leo
5e6059ba36 ux: hotkey tooltip in buttons 2024-04-29 15:22:06 +08:00
leo
7589a8dcd0 ci: fix wrong runtime identifier for linux 2024-04-29 14:25:24 +08:00
leo
dc4a8007de ci: use lowercase executable file name on linux; build packages for both Intel and Apple Silicon CPU architecture on macOS (#97) 2024-04-29 14:23:07 +08:00
leo
3052506675 Merge tag 'v8.10' into develop
RELEASE_DONE v8.10
2024-04-29 11:01:47 +08:00
leo
d60a33af1a Merge branch 'release/v8.10' 2024-04-29 11:01:46 +08:00
leo
4c7ddf14ac version: Release 8.10 2024-04-29 11:00:57 +08:00
leo
84568e573a feature: test if conflicts have been resolved manually (#96) 2024-04-29 10:54:41 +08:00
leo
df66bacbd2 enhance: reset commit message after a merge request has been aborted 2024-04-29 09:31:04 +08:00
leo
1509b8ab70 ux: right margin for commit message 2024-04-28 17:55:49 +08:00
leo
5d1de37308 optimize: only set Offset from SyncScrollOffset while it's not focused. 2024-04-28 16:50:06 +08:00
leo
d9911b3447 refactor: implementation of synchronous scrolling in side-by-side diff view 2024-04-28 16:46:39 +08:00
leo
32e685622b enhance: disable some MenuItems if repository that linked by node has been auto-removed from Preference (#90). 2024-04-28 13:51:44 +08:00
leo
9b5e8429b9 feature: add hotkey 'F5' to reload/refresh whole repository 2024-04-28 10:19:12 +08:00
leo
28554d1b04 code_review: remove unused codes 2024-04-28 09:56:08 +08:00
leo
8786297d85 ux: remove 'JetBrains' prefix for all products of JetBrains 2024-04-27 22:35:27 +08:00
leo
71b9b3dfea enhance: cache for external tool icons 2024-04-27 22:26:38 +08:00
leo
78ef955002 readme: add tips for finding other tools by JetBrains Toolbox 2024-04-27 22:12:31 +08:00
leo
fdf95e39a7 fix: loading JetBrains Toolbox stage.json crash 2024-04-27 22:05:17 +08:00
leo
cdaa2d7548 readme: remove Jetbrains Rider temporary 2024-04-27 21:19:07 +08:00
leo
9a68418f51 Merge pull request #92 from ennerperez/feature/issues-77
code_review:

* use JsonSerializerContext to avoid AOT warnnings
* since we call TryAdd by interating the installed tools, so detecting by environment variable becomes meaningless (it can not detect tools not installed by Toolbox). Just add it into founded directly
* remove unnecessary type defines
* determine the Icon used by tool while adding it to the founded list.

# Conflicts:
#	src/Native/Linux.cs
#	src/Native/MacOS.cs
#	src/Native/Windows.cs
2024-04-27 21:13:21 +08:00
Enner Pérez
706a833817 Linux Path Fix 2024-04-27 02:36:40 -05:00
Enner Pérez
fe2abee21d Typo Fix 2024-04-27 02:12:12 -05:00
Enner Pérez
53beb3daac JetBrains Toolbox IDE detection 2024-04-27 02:12:03 -05:00
Enner Pérez
ad570eec3b Fallback Icon Implementation 2024-04-27 02:11:38 -05:00
Enner Pérez
59c941dd00 JetBrains Icons Resources 2024-04-27 02:10:51 -05:00
leo
80c864dad7 ux: chevron icon for MenuItem 2024-04-26 21:39:33 +08:00
leo
86c89e0c33 feature: use MERGE_MSG as default commit message while merging (#88) 2024-04-26 21:05:00 +08:00
leo
ea1d0bf6a2 fix: bug - rename local branch name should only check names with other local branches 2024-04-26 14:25:14 +08:00
leo
49abab2903 update: timeout to wait the result of downloading version info 2024-04-26 09:40:02 +08:00
leo
879f3cd76c code_style: replace tab with 2-spaces in xaml 2024-04-24 22:32:55 +08:00
leo
f92858994a readme: add description for folder that created by this app to store user settings, downloaded avatars and crash logs. 2024-04-24 22:07:48 +08:00
leo
fd2160e56e feature: supports JetBrains Rider (#77) 2024-04-23 16:53:33 +08:00
leo
e1adc30fc1 Merge tag 'v8.9' into develop
RELEASE_DONE v8.9
2024-04-22 09:06:21 +08:00
leo
7e4e339a0c Merge branch 'release/v8.9' 2024-04-22 09:06:20 +08:00
leo
c171ae0c93 version: Release 8.9 2024-04-22 09:06:07 +08:00
leo
905db5ca59 ux: show count of stashes and changes in selected stash 2024-04-19 17:35:42 +08:00
leo
fbf1d5aa32 localization: update translations 2024-04-19 14:28:18 +08:00
leo
599ba01f20 ux: re-design Views.Repository
* It's better to move the `Navigate to HEAD` button to the top-right of this page.
* Icons and alignments
2024-04-18 10:50:14 +08:00
leo
8d7df75241 readme: minimum version of git required by this app (#76) 2024-04-18 09:38:59 +08:00
leo
8378f018b1 enhance: use restore instead of reset to discard changes (#76) 2024-04-17 20:06:09 +08:00
leo
60a4d21ce7 enhance: AutoFocusBehaviour will move cursor to the end of contents 2024-04-17 17:13:28 +08:00
leo
1e3711e569 refactor: using a new DotBrushProperty instead of calling Application.TryGetResource 2024-04-17 16:16:11 +08:00
leo
3a3c0e717f build: read version from VERSION file 2024-04-17 11:24:25 +08:00
leo
27265dc465 fix: use sed to replace version in plist failed on macOS 2024-04-16 20:32:18 +08:00
leo
b926dc055d update: git ignore files & folders 2024-04-16 19:50:40 +08:00
leo
7f7e5ef5f8 refactor: rewrite all build scripts
* supports generate rpm package on Linux
* use a global VERSION file
2024-04-16 17:29:36 +08:00
leo
de5a60c6dd update: specify the file name of generated deb package 2024-04-16 14:38:26 +08:00
leo
ebf139de68 feature: add a deb build script for Linux 2024-04-16 12:37:15 +08:00
leo
66215cfa9e readme: force update contributors' image 2024-04-16 09:34:37 +08:00
leo
37ca149970 fix: get latest version info from sourcegit-scm.github.io instead of api.github.com (#75) 2024-04-16 09:23:54 +08:00
leo
69d9edf963 ux: add Icons.Submodule.Add 2024-04-15 20:34:58 +08:00
leo
92b80cbcda code_style: remove unnecessary parentheses 2024-04-15 18:07:17 +08:00
leo
fd8f257d6d feature: supports lxterminal on Linux 2024-04-15 18:01:15 +08:00
leo
c617331657 fix: wrong path for sublime text command-line interface 2024-04-15 17:48:52 +08:00
leo
cc6996444e ux: update icon for navigate to current HEAD button 2024-04-15 15:22:32 +08:00
leo
003ad66ccb ux: add menu icon for git-flow 2024-04-15 15:07:07 +08:00
leo
781569c7a0
Merge pull request #74 from walterlv/master
Dont find the path twice
2024-04-15 09:31:50 +08:00
walterlv
25082890ad Dont find the path twice 2024-04-15 09:21:42 +08:00
leo
33e60c12f8 Merge tag 'v8.8' into develop
RELEASE_DONE v8.8
2024-04-15 09:20:40 +08:00
leo
e9c65d6e81 Merge branch 'release/v8.8' 2024-04-15 09:20:39 +08:00
leo
f3532c4cf2 version: Release 8.8 2024-04-15 09:20:20 +08:00
leo
3c7c5557be
Merge pull request #73 from walterlv/master
Fix windows terminal startup directory
2024-04-15 09:10:54 +08:00
walterlv
f58cff2cb6 Fix windows terminal startup directory 2024-04-15 08:58:25 +08:00
leo
4a151dd19c code_style: remove unused name declaration 2024-04-14 20:13:07 +08:00
leo
ab26bb83e9 refactor: re-design toolbar of Views.DiffView 2024-04-14 12:27:09 +08:00
leo
7bf6793a11 refactor: detecting programs from the PATH environment variable instead of hard coded (#72) 2024-04-14 11:14:13 +08:00
leo
7b5534a267 code_style: run dotnet format to apply rules defined in .editorconfig 2024-04-13 19:24:45 +08:00
leo
1bb4d55a5c
Merge pull request #69 from gadfly3173/feat/diff-file-mode
feat: show git file mode change if exist
2024-04-13 19:17:44 +08:00
Gadfly
54c9552985
refactor: remove duplicate ObjectConverters, remove unused using 2024-04-13 18:54:46 +08:00
leo
a042945875
Merge pull request #70 from gadfly3173/fix/gpg-select
fix: GPG executable file input didn't echo after selected
2024-04-13 18:38:20 +08:00
Gadfly
f4e1e0fb6b
fix: use TextTrimming alternative PathConverters 2024-04-13 02:05:26 +08:00
Gadfly
f7dd856e49
fix: enhance diff view by truncating long file paths with ellipsis and adding tooltips for full path display 2024-04-13 01:34:08 +08:00
Gadfly
83728c1a5f
fix: change file mode status postion to right 2024-04-12 21:58:54 +08:00
Gadfly
a249eed1ac
feat: show git file mode change if exist 2024-04-12 21:38:36 +08:00
Gadfly
972b940742
fix: GPG executable file input didn't echo after selected 2024-04-12 19:37:06 +08:00
leo
2d5e048797 Merge branch 'fix/stage-list-count' into develop from PR #68 2024-04-12 10:04:03 +08:00
leo
ede96c298e code_review: review PR #68
* use Converters.ListConverters.ToCount instead of adding two properties to get the count of list.
* adding a new TextBlock to show number of files
2024-04-12 10:03:24 +08:00
leo
d64b7a7824 code_style: private functions should appear after all public functions 2024-04-12 09:41:12 +08:00
Gadfly
0e2da217f1
feat: shows the number of files in the current list on unstaged and staged lists 2024-04-12 01:27:19 +08:00
Gadfly
c0b13bdc8c
fix: Fixed the problem that the AvaloniaRider plugin on Windows cannot display the live preview for Avalonia XAML 2024-04-12 01:23:08 +08:00
leo
f3f39ac593 feature: supports resolving multiple conflicts at once. 2024-04-11 20:50:19 +08:00
leo
3783bdacbc readme: add tips for Windows users 2024-04-11 11:25:15 +08:00
leo
057c0be547 ux: change MaxHeight of commit message to 64 to ensure that there are at least 2 items displayed in the change list (#66) 2024-04-10 20:13:56 +08:00
leo
8ab7370409 enhance: use --force to override local refs if it is mismatched with remote's 2024-04-10 11:52:28 +08:00
leo
1dadad7775 ux: disable TextEditor hyperlinks (#65) 2024-04-10 11:02:33 +08:00
leo
1da754afe8 resource: update all icons to 64x64 (since we use this icons in 16x16 size) 2024-04-09 19:19:49 +08:00
leo
b8da3e9afd enhance: use diff command instead of show command to get changes of selected commit. (#56)
* for merge commit, it will shows all changes compare to the first parent of the selected commit now.
2024-04-09 16:02:42 +08:00
leo
217800c83a feature: support Meld as an external merge tool on Linux platform 2024-04-09 15:36:11 +08:00
leo
17fc7ab994 ux: add icons for external merge tools 2024-04-09 15:00:52 +08:00
leo
f0e0c90621 Merge branch 'feature/powershell_supports' into develop 2024-04-09 14:59:15 +08:00
leo
696bae00d8 ci: change the ci branch to develop 2024-04-09 14:58:12 +08:00
leo
7336a870f7 ux: macOS main menu position 2024-04-09 14:36:32 +08:00
leo
7be7ef161b fix: deepin-terminal commandline argument format 2024-04-09 13:59:55 +08:00
leo
6811103cf4 ux: use RenderOptions.BitmapInterpolationMode="HighQuality" for shell icons 2024-04-09 13:34:42 +08:00
leo
395bd29084 feature: add supports to deepin-terminal 2024-04-09 13:06:27 +08:00
leo
3fd1e0ea19 fix: Windows Terminal is not a built-in app on Windows 10 2024-04-09 11:18:16 +08:00
leo
5c9b92c3db fix: the system default powershell.exe does not recognize the -WorkingDirectory arg 2024-04-09 11:12:22 +08:00
leo
a3c81745aa enhance: add -WorkingDirectory and -Nologo arguments for PowerShell 2024-04-09 10:49:36 +08:00
leo
4882fd9d69 refactor: external tools and shells
* rename Models.ExternalMergeTools to Models.ExternalMerger
* supports Git Bash/PowerShell/Command Prompt/Default Shell in Windows Terminal
2024-04-09 10:41:37 +08:00
leo
4ac705f8ca feature: add powershell support for Windows 2024-04-08 17:39:52 +08:00
leo
8f70778ec2 version: Release 8.7 2024-04-08 10:49:48 +08:00
leo
8adf11b64c fix: crash when create image from a empty stream 2024-04-08 10:24:28 +08:00
leo
75f6087447 update: unify all external tool icons to 128 x 128 2024-04-08 10:01:17 +08:00
leo
8dd1ce9185 refactor: rewrite Commands.QueryFileContent and use it instead of GetImageFileAsBitmap 2024-04-08 09:57:41 +08:00
leo
9a4f928ece fix: DataGrid does NOT scroll when navigation target is the same as current selected in Views.Histories. (#58) 2024-04-07 21:19:02 +08:00
leo
d09e81b80a fix: remove unused using 2024-04-07 20:06:04 +08:00
leo
24b6e39066 feature: add context menu for changes in Views.CommitDetail and Views.RevisionCompare to diff with external merge tool (#53) 2024-04-07 20:02:43 +08:00
leo
b5b1f0cb8d refactor: add ExternalEditorFinder to detect supported external editors 2024-04-07 17:56:53 +08:00
leo
482fab97c0 ux: update Icons.Tree 2024-04-07 15:17:02 +08:00
leo
a8d06ce042 ux: set RenderOptions.BitmapInterpolationMode = BitmapInterpolationMode.HighQuality for avatars 2024-04-07 15:00:18 +08:00
leo
416b839df5 localization: use x:String instead of declare a new namespace for System.String 2024-04-07 10:06:17 +08:00
leo
e5be649a2d fix: Github REST API access rate limit (#60) 2024-04-07 09:54:35 +08:00
leo
400d454478 enhance: a more adaptable regular expression for remote URLs (#61) 2024-04-06 18:11:49 +08:00
leo
040a6d4bba refactor: use axaml resource to manage locales instead of resx 2024-04-06 18:06:32 +08:00
leo
1196fabfc1 feature: external editor supports Sublime Text 2024-04-06 15:31:13 +08:00
leo
d873f21b6a fix: crash when open external tool drop down menu 2024-04-06 15:01:07 +08:00
leo
111bf2966a refactor: rewrite external editor supports
* supported editors can be different on different platforms.
* display founded editors only
2024-04-06 13:14:22 +08:00
leo
bcb83af576 ux: new style for statistics page 2024-04-03 17:34:06 +08:00
leo
3d5a9f9d8b readme: force update contributors' image 2024-04-03 16:50:51 +08:00
leo
099e6a4f97 ux: use CubicBezierTo instead of calling QuadraticBezierTo twice for curves in commit graph (#57) 2024-04-03 15:32:23 +08:00
leo
0252887442 feature: external editor supports visual studio code insiders; add environment variable VSCODE_PATH and FLEET_PATH to help to find these editors. (#54) (#55) 2024-04-03 12:17:20 +08:00
leo
eea3d2c6c0 feature: enable to use external merge tool for all type of files (#53) 2024-04-03 09:43:17 +08:00
leo
54c7f80eda ux: move navigate current head button to histories (#50) 2024-04-02 21:00:55 +08:00
leo
d986aa7165 feature: add button to navigate to current HEAD (#50) 2024-04-02 20:54:57 +08:00
leo
09720f81d4 ux: use FontWeight.Bold for current head decorator 2024-04-02 20:42:17 +08:00
leo
f0b65d4499 project: update project location in github workflows 2024-04-02 20:05:33 +08:00
leo
96d4150d26 project: reorganize the structure of the project.
* remove dotnet-tool.json because the project does not rely on any dotnet tools.
* remove Directory.Build.props because the solution has only one project.
* move src/SourceGit to src. It's not needed to put all sources into a subfolder of src since there's only one project.
2024-04-02 20:00:33 +08:00
leo
96e60da7ad ux: auto focus the first input element in popup widget (#49) 2024-04-02 16:23:47 +08:00
leo
ddd152df59 ux: unify icons and labels for repository action in both welcome and repository page; remove unused resources 2024-04-02 10:09:28 +08:00
leo
4dfbb0b2ba style: ux improvement (#42) 2024-04-02 09:46:48 +08:00
leo
53bcafa5ed refactor: ux for in progress action (cherry-pick/rebase/revert/merge) 2024-04-01 21:27:08 +08:00
leo
814af539cd fix: resolve button should be visible when current active view index is NOT 1 (the changes page) 2024-04-01 19:59:15 +08:00
leo
ef02a57ab2 style: use FontWeight.Bold for current head (#44) 2024-04-01 18:12:27 +08:00
leo
54b9c420c1 build: use Powershell script instead of batch file to generate packages on Windows and remove dependency of 7z (#43) 2024-04-01 15:28:41 +08:00
leo
7e28c0904d localization: add git command name to locale zh_CN (#41) 2024-04-01 12:17:50 +08:00
leo
1f3f9a4472 style: add source code website in about dialog (#40) 2024-04-01 11:45:30 +08:00
leo
30d5f1415e version: Release 8.6 2024-04-01 09:29:04 +08:00
leo
d89a00e559 code_style: using avalonia's editorconfig and run dotnet format. 2024-03-31 16:54:29 +08:00
leo
3c38f681bd fix: disable custom window resizer on Linux platform if Window.WindowState != WindowState.Normal 2024-03-29 12:15:52 +08:00
leo
e59bacb75c update: external tool icons 2024-03-29 10:50:49 +08:00
leo
976c8da83c style: use the larger size of image in diff view if it has two valid bitmaps 2024-03-29 10:02:11 +08:00
leo
871751d7c0 style: set RenderOptions.BitmapInterpolationMode="HighQuality" for all image views 2024-03-29 09:49:42 +08:00
leo
911456a3e7 style: set RenderOptions.BitmapInterpolationMode="HighQuality" for external tool icons 2024-03-29 09:45:36 +08:00
leo
1f353f8163 style: unify all external tool icons to 512 x 512 2024-03-29 09:37:54 +08:00
leo
c2eedbdbf2 performance: do NOT re-create background brush if there exists one 2024-03-28 21:06:12 +08:00
leo
eb4f38b676 code_style: move private member/functions (except static readonly members) after all public members 2024-03-28 20:03:56 +08:00
leo
5e66765326
Merge pull request #36 from walterlv/master
_backend will never be null
2024-03-28 17:55:31 +08:00
leo
60bcdd671f style: keep aspect ratio of image in image diff view 2024-03-28 17:53:53 +08:00
walterlv
4e8efe05cc _backend will never be null 2024-03-28 17:48:46 +08:00
leo
61cead1867 code_style: run dotnet format to follow rules defined in .editorconfig 2024-03-28 17:46:03 +08:00
leo
7866a11037 Merge branch 'feature/open_with' from PR #33 2024-03-28 17:43:37 +08:00
leo
4659fbd901 code_review: code review for PR #33
* use PNG instead of SVG for external tool icons and remove dependency `Avalonia.SVG`
* remove unused property `IsVSCodeFound` and `IsFleetFound`
* find VS from registry first
* remove compile warning CA1416
* remove unused enum `OS.Platforms`
2024-03-28 17:42:13 +08:00
leo
760d64c39c style: use custom RevisionImageFileView to preview images. 2024-03-28 17:20:19 +08:00
leo
4651f306c3
Merge pull request #35 from walterlv/master
Fix spelling errors in configuration keys
2024-03-28 16:40:03 +08:00
walterlv
e54f17d13b Fix spelling errors in configuration keys 2024-03-28 16:29:15 +08:00
leo
8ed068e2dd
Merge pull request #34 from walterlv/master
Enhance file and folder selection
2024-03-28 16:18:23 +08:00
walterlv
f6683954fe Enhance file and folder selection by utilizing the default file manager instead of enforcing the use of explorer.exe 2024-03-28 16:02:39 +08:00
leo
effabb08fe style: add a background for image diff view 2024-03-28 15:47:40 +08:00
Enner Pérez
370b9bd31e MacOS Update 2024-03-28 02:16:34 -05:00
Enner Pérez
386987fbb1 Open in... Menu
New Icons
2024-03-28 02:16:33 -05:00
Enner Pérez
cde5fc8f73 Open In Fleet 2024-03-28 02:16:01 -05:00
leo
91bc1ee8ab fix: try to fix window drop shadow missing on Windows 10 2024-03-28 12:25:07 +08:00
leo
6cc6088684 style: ImageDiff layout 2024-03-28 10:11:34 +08:00
leo
0995e6e638 style: margins for ImageDiff 2024-03-28 09:54:20 +08:00
leo
582a283ad5 feature: show image size change for Models.ImageDiff 2024-03-28 09:48:42 +08:00
leo
223467480f fix: wrong work tree file path 2024-03-28 09:34:08 +08:00
leo
6950055f24 feature: supports preview and diff with image files 2024-03-27 21:38:38 +08:00
leo
5ef542f92d style: add loading indicator for FileHistories 2024-03-27 10:40:11 +08:00
leo
92e065feba feature: simple self-update implementation (#29) 2024-03-27 09:36:54 +08:00
leo
86a1148148 style: text alignment in Hotkeys 2024-03-26 16:58:12 +08:00
leo
391b017200 style: remove file name in FileHistories's title bar 2024-03-26 16:03:41 +08:00
leo
6d2e10cec2 feature: embed commit detail page in file histories 2024-03-26 15:56:38 +08:00
leo
e443e1657b style: increase all GridSplitter's size 2024-03-26 15:19:41 +08:00
leo
15ab457e74 style: traits .plist file as normal xml 2024-03-26 14:42:41 +08:00
leo
0079cdd88e style: change FontSize for MenuItem /template/ PART_InputGestureText 2024-03-26 11:30:22 +08:00
leo
cd42f2471a style: windows/linux caption buttons 2024-03-26 11:00:15 +08:00
leo
43d50c5ded version: Release 8.5 2024-03-25 11:43:21 +08:00
leo
4e81c7dc85 style: font fallback for windows 2024-03-25 10:39:36 +08:00
leo
5c5ee9bef5 style: icon for commit decorators 2024-03-25 10:27:07 +08:00
leo
8042091836 style: move some settings to Appearance tab 2024-03-22 12:29:40 +08:00
leo
a992485d11 style: use fixed tab title font size; NumericUpDown border 2024-03-22 12:18:03 +08:00
leo
c247b03223 feature: allow customized font size 2024-03-22 12:04:30 +08:00
leo
7ba7e58c9f style: keep the launcher's title bar consistent across platforms 2024-03-22 09:57:59 +08:00
leo
56f5f3b4a7 enhance: use custom JsonConverter instead of converting string to FontFamily in each control 2024-03-21 23:19:09 +08:00
leo
0fadab2ca2 fix: select file with only eol changes after other change types will not update diff result 2024-03-21 21:24:53 +08:00
leo
a6103b8b31 code-style: run dotnet format to compliance the editorconfig rules (#31) 2024-03-21 21:08:30 +08:00
leo
98a46f8211 fix: endless loop when character missing both in current active font and the default font and the fallback font is same with the default. 2024-03-21 20:55:08 +08:00
leo
8f3f011d81 enhance: calculate monospace fonts in background to avoid delay for preference window (#30) 2024-03-21 20:02:07 +08:00
leo
ff2e0d7928 fix: indicator line does not use editor's FontFamily (#30) 2024-03-21 18:08:43 +08:00
leo
83aa373079 feature: supports custom fonts (#30) 2024-03-21 18:02:06 +08:00
leo
0e49ad181a enhance: remeber tag group and submodule group IsExpanded state. 2024-03-21 11:40:17 +08:00
leo
c83d4588a1 style: update icons 2024-03-21 11:16:34 +08:00
leo
7c3c022ccc enhance: use previous state before we get new diff result 2024-03-20 20:34:24 +08:00
leo
635db8b3b3 feature: allow user to control whether or not to enable syntax highlighting in DiffView. 2024-03-20 20:17:20 +08:00
leo
8fc25e312d optimize: collect garbage after SetGrammar to avoid memory leak 2024-03-20 19:49:01 +08:00
leo
340fe9e3ba enhance: leave the current state until we got the new diff result to reduce flickering 2024-03-20 18:27:48 +08:00
leo
2782ef4cc1
Merge pull request #28 from ennerperez/feature/solution_structure
Solution structure (Update)
2024-03-20 15:50:39 +08:00
Enner Pérez
a1a14f8858 Project Location 2024-03-20 02:38:28 -05:00
Enner Pérez
014e37e505 Github Workflow Files 2024-03-20 02:34:01 -05:00
Enner Pérez
8bc8f1eaa2 Gitattributes Fix 2024-03-20 02:33:19 -05:00
leo
de1bb4b8e1
Merge pull request #27 from ennerperez/feature/solution_structure
DRAFT: Solution Structure Update
2024-03-20 15:21:25 +08:00
Enner Pérez
a29700d9f4 Solution Internal Structure 2024-03-20 02:02:51 -05:00
Enner Pérez
09444f846f dotnet Namespaces Rules 2024-03-20 02:02:47 -05:00
Enner Pérez
fc0d88d0e6 Generic .gitignore 2024-03-20 02:02:43 -05:00
Enner Pérez
f5b2559ee2 Generic .gitattributes 2024-03-20 02:02:30 -05:00
Enner Pérez
b86703c6a3 Accelerate Builds for VS 2024-03-20 01:56:30 -05:00
Enner Pérez
a64b676233 dotnet Config Files 2024-03-20 01:56:26 -05:00
leo
f175f5abc1 optimize: use combined diff view as default. 2024-03-20 13:08:01 +08:00
leo
7b0fe3a771 build: update script for macOS 2024-03-19 16:07:52 +08:00
leo
0b8740dc3a linux: use managed system dialog instead of DBus file picker (it has an extra black background panel on Wayland). 2024-03-19 15:53:46 +08:00
leo
1c14f5ea88 linux: force using en_US.UTF-8 locale to avoid GCM crash 2024-03-19 15:43:47 +08:00
leo
abc97dce6c fix: missing localization for Text.Cut 2024-03-19 13:00:47 +08:00
leo
cab902d762 readme: add tips for linux users 2024-03-19 13:00:14 +08:00
leo
7e4b67b177 build: update linux resources 2024-03-19 12:35:41 +08:00
leo
fdf90f61a8 fix: macOS build scripts 2024-03-19 11:31:33 +08:00
leo
b67cd693cd build: move build scripts and resources from src to build 2024-03-19 11:28:22 +08:00
leo
0f3e670dd4
Merge pull request #26 from stevemonaco/patch-1
Fix typos in README.md
2024-03-19 09:40:19 +08:00
Stephen Monaco
9049900121
Fix typos in README.md 2024-03-18 21:37:02 -04:00
leo
44c141be7c update: localizations
* fix Locales.Designer.cs NOT updated when compile after Locale.*.resx changed in Visual Studio 2022.
* use PublicResXFileCodeGenerator instead of ResXFileCodeGenerator to make sure access modifier is 'public' in Visual Studio 2022.
* use ResourceManager.GetResourceSet instead of collecting properties by reflection.
* remove translation warnings in Visual Studio's ResXManager extension.
2024-03-18 18:44:31 +08:00
leo
5567a8bc08 project: remove duplicated item in ItemGroup 2024-03-18 16:47:45 +08:00
leo
0bb268cdf2 version: Release 8.4 2024-03-18 15:10:11 +08:00
leo
6ea0e59c31 fix: remove warning for duplicated using 2024-03-18 11:42:54 +08:00
leo
5f0a1c5dbe
Merge pull request #23 from ennerperez/feature/resx
Resx Localization
2024-03-18 11:38:01 +08:00
Enner Pérez
aa4c7be813 Resx Folder Location 2024-03-17 22:34:24 -05:00
Enner Pérez
14550655f3
Merge branch 'master' into feature/resx 2024-03-17 21:11:24 -05:00
leo
18aaa0a143 style: add .editorconfig for code formatting. see issu #25 2024-03-18 09:37:06 +08:00
leo
a8eeea4f78
Merge pull request #24 from ennerperez/feature/regex
Source Generated RegEx
2024-03-18 09:29:32 +08:00
Enner Pérez
c0a079de41 Source Generated Regex 2024-03-16 04:09:27 -05:00
Enner Pérez
ad1fdbe6ee Resx Localization 2024-03-16 03:27:03 -05:00
leo
f93dec5e6a style: Blame & FileHistories window style 2024-03-15 10:41:36 +08:00
leo
abc3e8e9f7 fix: Statistics window can not move 2024-03-15 10:13:21 +08:00
leo
64681c0086 update: tips for Linux users 2024-03-14 19:52:24 +08:00
leo
b9f29ef059 style: margins for fixed-size window on Linux platform 2024-03-14 18:29:19 +08:00
leo
035300a612 style: border-less window style on Linux platform. 2024-03-14 18:23:36 +08:00
leo
f4b396596b feature: shows selected revision file size if it's a binary file 2024-03-14 11:59:56 +08:00
leo
f6eb1281b5 enhance: force using StringComparison.Ordinal 2024-03-14 11:09:05 +08:00
leo
cd2ecb109a enhance: diff with LFS filtered files 2024-03-14 10:55:25 +08:00
leo
63b42224f3 update: add thanks to new contributors 2024-03-13 21:52:54 +08:00
leo
499a8235b5
Merge pull request #22 from ennerperez/feature/syntax_fixes
Syntax Fixes
2024-03-13 16:20:35 +08:00
leo
7dd41b8568
Merge pull request #21 from ennerperez/feature/en_US
en_US Typo Fixes
2024-03-13 16:19:54 +08:00
Enner Pérez
f70d48495f Syntax Fixes 2024-03-13 03:10:29 -05:00
Enner Pérez
cb90f8b98d en_US Typo Fixes 2024-03-13 03:10:02 -05:00
leo
47d9e0e9f9 fix: key to close search panel in text editor is ‘ESC' not 'Ctrl+3' 2024-03-12 16:40:59 +08:00
leo
ea49de2379 style: search bar style 2024-03-12 16:32:40 +08:00
leo
a37c11e32f enhance: better sync scroll logic with two-side diff - if the width in each side is different 2024-03-12 16:14:22 +08:00
leo
b8a230cf16 style: use TextBox.InnerLeftContent and TextBox.InnerRightContent instead of custom layout for search 2024-03-12 09:53:52 +08:00
leo
ea3e28b5e7 style: text editor's search panel border 2024-03-11 19:30:07 +08:00
leo
c1c47074f4 style: use TextBox.InnerLeftContent and TextBox.InnerRightContent instead of custom layout for search 2024-03-11 18:54:12 +08:00
leo
13c5c116fd doc: add text editor hotkeys information 2024-03-11 18:30:32 +08:00
leo
76505fb582 style: new text editor search panel style 2024-03-11 18:29:42 +08:00
leo
b82c0e2ebd version: Release 8.3 2024-03-11 09:26:11 +08:00
leo
213f04a57b fix: branch tree not restore last IsExpanded nodes. See issue #20
* Binding IsExpanded property of TreeViewItem with Models.BranchTreeNode
* Current local branch should never be collapsed
2024-03-09 20:58:44 +08:00
leo
ef26f5b41c fix: bad arguments to query git version 2024-03-09 11:04:03 +08:00
leo
2ec46c9da0 feature: prefer same name if new branch is created based on a remote branch 2024-03-08 18:01:29 +08:00
leo
fc0ac109d8 build: add a script to publish on Linux 2024-03-08 17:54:26 +08:00
leo
8d533e5270 style: UseRebase and AutoStash perfered selected by default 2024-03-08 17:49:03 +08:00
leo
61e1491854 style: remove popup's border on non-linux platforms 2024-03-08 17:41:10 +08:00
leo
c14b7ebbe1 optimize: only parse track status for local branch 2024-03-08 17:16:54 +08:00
leo
7a867e3ccb update: README.md add tips for Linux users 2024-03-08 16:46:02 +08:00
leo
f7e8cf1311 refactor: use rev-list --left-right --count to query track status with upstream (when using some linux with other locales instead of English, upstream:track will output status with localized word instead of 'ahead'/'behind') 2024-03-08 16:32:44 +08:00
leo
0d1c61bcb5 style: compatible with Linux 2024-03-08 15:57:36 +08:00
leo
8c1fe66ee5 fix: using DropShadowEffect in Launcher's popup container on Linux will get a wrong render result. 2024-03-08 15:52:40 +08:00
leo
2182d39e5f refactor: setup fonts based on operating system 2024-03-08 12:22:22 +08:00
leo
267c955c88 style: views supports Linux 2024-03-08 11:28:17 +08:00
leo
a89760c7a5 refactor: change the way to refresh repository's data.
* mark dirty instead of calling refresh method directly
* force mark branches data dirty after remotes changed
2024-03-08 09:57:29 +08:00
leo
3eb8a82005 feature: use branch's fullname to create new branch based on selected one 2024-03-08 09:29:54 +08:00
leo
59b7fd8c61 optimize: better supports for LFS object 2024-03-07 17:04:57 +08:00
leo
d0e80be79f feature: enhance commit search
* Supports search commits by author/committer email
* Auto focus when search panel is visible
2024-03-07 16:29:24 +08:00
leo
f65dc36e62 style: popup container widgets 2024-03-07 12:08:54 +08:00
leo
b48c2b5ab5 fix: gnome-terminal name 2024-03-06 20:41:02 +08:00
leo
3bf962d745 feature: remember last active tab index if restore tabs is enabled 2024-03-06 19:46:19 +08:00
leo
0e824f12b4 upgrade: upgrade AvaloiaUI to 11.0.10 2024-03-06 17:17:16 +08:00
leo
f00ecbd0a1 fix: should not use Active to close a running popup. 2024-03-05 17:16:33 +08:00
leo
4b405dfc5f style: hotkeys font styles 2024-03-05 16:52:51 +08:00
leo
f834af10a2 refactor: change the way loading custom fonts 2024-03-05 16:02:47 +08:00
leo
636096c713 ci: main branch name in this repository is 'master'; add 'workflow_dispatch' event to enable trigger it manually 2024-03-05 12:07:20 +08:00
leo
acb74a4b95 feature: hotkeys enhancement. see issue #19 2024-03-05 10:46:08 +08:00
leo
b309c1c346 update: add thanks to new contributors 2024-03-05 09:37:53 +08:00
leo
67cfd21b38
merge: pull request #18 from gigi81/feature/git-actions
Added github actions build for windows/linux/macos
2024-03-05 09:27:25 +08:00
Luigi Grilli
950c7602de Removing warning 2024-03-04 19:48:27 +00:00
Luigi Grilli
0a2b1aa51d Uploading artifacts 2024-03-04 19:48:27 +00:00
Luigi Grilli
7d422f1a82 Added CI build 2024-03-04 19:48:27 +00:00
leo
01ddd07de5 style<*>: set Background of all widgets used to display content of file to Brush.Contents for 2024-03-04 21:23:17 +08:00
leo
ade43ed988 optimize<Statistics>: only redraw chart when mouse hovered on a new sample box 2024-03-04 21:01:15 +08:00
leo
ad9cf615ab style<Statistics>: change layout of Statistics 2024-03-04 17:52:40 +08:00
leo
ae02e1025e style<Toolbar>: margins for toolbar buttons 2024-03-04 10:25:19 +08:00
leo
c47fe16dd3 upgrade<Version>: Release 8.2 2024-03-04 09:31:30 +08:00
leo
14dbc0ad92 fix<TextDiffView>: discard from staged should not affect same file in unstaged 2024-03-03 09:16:19 +08:00
leo
8ca74d3a9e fix<CommitDetail>: crash when request context menu without any change selected 2024-03-02 23:44:58 +08:00
leo
60e664ab26 optimize<*>: use custom view locator instead of ContentControl.DataTemplates to avoid memory leak. 2024-03-02 23:34:32 +08:00
leo
27d4dd5f64 style<*>: remove unused usings 2024-03-02 22:06:47 +08:00
leo
307e5a5ef0 fix<Repository, History>: wrong context menu IsEnabled state.
* 'Pull' should always enabled for local branch with remote upstream
* 'Discard All Changes' for current branch should only be enabled when there's at least one changes
* 'Fast Forward' should check if target local branch has any commit ahead of it's upstream
2024-03-01 19:12:22 +08:00
leo
280ef60111 fix<Windows>: explorer does not recognize path with separator '/' 2024-03-01 17:40:17 +08:00
leo
59052d8e1f style<Blame>: rewrite MeasureOverride to fit content with for CommitInfoMargin; always show commit info for the first visual line 2024-03-01 15:09:17 +08:00
leo
7b70951c93 style<Launcher>: supports two size rules for tabs in titlebar - fixed width or size to content 2024-03-01 14:09:39 +08:00
leo
e3a7abe776 style<Repository>: normalize repository's path 2024-03-01 13:46:00 +08:00
leo
1c005983c7 fix<Discard>: wrong discard behavior with changes both in worktree and staged 2024-03-01 11:34:32 +08:00
leo
a770ff542d fix<TextDiffView>: avoid endLine out of range 2024-02-29 12:16:31 +08:00
leo
2b97d7c599 feature<TextDiffView>: do NOT reset scroll offset after recompute diff with same change 2024-02-29 11:29:54 +08:00
leo
096fd6cb22 feature<TextDiffView>: supports discard changes from staged directly 2024-02-29 10:59:59 +08:00
leo
1149c768d3 refactor<NameHighlightedTextBlock>: use NameHighlightedTextBlock's constructor instead of functions in each caller 2024-02-28 18:55:23 +08:00
leo
cfe680ffd5 fix<DiffViewer>: wrong TextDiffView mode indicator icon 2024-02-28 18:42:58 +08:00
leo
9e4d349b51 feature<TextDiffView>: implementation for stage/unstage/discard selected changes in file 2024-02-28 18:15:40 +08:00
leo
671e46f8b3 feature<TextDiffView>: supports line staging/unstaging in working copy diff view 2024-02-28 14:55:11 +08:00
leo
91ef4e44a4 optimize<WorkingCopy>: clear selection after WorkingCopy unloaded 2024-02-27 18:51:57 +08:00
leo
2aacec75b4 optimize<*>: add a static method CreateMenuIcon to App. Restore working copy changes' selection state after refreshed 2024-02-27 18:26:05 +08:00
leo
9c3294c285 optimize<*>: App.RaiseException should be called in UIThread; add default progress description for popups; 2024-02-26 11:29:57 +08:00
leo
dc0b33ba21 update<README>: add tips for macOS users 2024-02-26 10:11:17 +08:00
leo
dec70bed44 upgrade<Version>: Release 8.1 2024-02-26 09:45:42 +08:00
leo
f4c82ff749 fix<Fetch>: start fetch from remote's context menu should only fetch selected remote 2024-02-26 09:38:25 +08:00
leo
787fe4ad70 fix<Statistics>: month to index; fix using UTC time compare to local time 2024-02-26 09:29:22 +08:00
leo
68ddeb4cc5 refactor<Statistics>: use committer instead of author 2024-02-25 11:32:15 +08:00
leo
e070b79d2c feature<Statistics>: finish statistiscs 2024-02-23 19:16:28 +08:00
leo
49f6ad0407 feature<Avatar>: supports gravatar.com and cravatar.cn (for China) 2024-02-23 11:39:05 +08:00
leo
84e2c7b3a4 style<Repository>: arrange toolbar button 2024-02-23 10:58:22 +08:00
leo
e7bf9be683 update<csproj>: assembly info 2024-02-22 21:46:32 +08:00
leo
ba355a7d59 optimize<TextEditor>: trait all .h file as C++ header file instead of C 2024-02-22 20:47:43 +08:00
leo
b934049dba update<Build>: update build script for macOS. add build/ and .DS_Store to ignore list 2024-02-22 15:45:17 +08:00
leo
7f20437464 style<Window>: add window icon 2024-02-22 14:51:31 +08:00
leo
cf09ab463c feature<Linux>: try to support Linux 2024-02-22 12:26:09 +08:00
leo
79084c9a9a fix<Clone>: fix crash after clone a new repository 2024-02-22 11:05:20 +08:00
leo
faffba09c8 fix<Submodules>: compatible with un-inited submodule 2024-02-21 12:26:09 +08:00
leo
f93ad7e9e2 update<screenshots>: 2024-02-21 12:07:56 +08:00
leo
15465a3856 update<README>: 2024-02-21 12:00:52 +08:00
leo
353557ec10 fix<Native>: fix wrong file filter on macOS platform. 2024-02-21 11:29:46 +08:00
leo
dbd91c9b58 style<Repository>: arrange buttons in Repository's tool bar 2024-02-21 10:14:42 +08:00
leo
57c4a8394c optimize<*>: reduce memory usage 2024-02-20 18:27:59 +08:00
leo
ca19d65f0e update<csproj>: use official AvaloniaEdit instead of OneWare.AvaloniaEdit 2024-02-20 15:44:26 +08:00
641 changed files with 64879 additions and 13696 deletions

306
.editorconfig Normal file
View file

@ -0,0 +1,306 @@
# editorconfig.org
# top-most EditorConfig file
root = true
# Default settings:
# A newline ending every file
# Use 4 spaces as indentation
[*]
insert_final_newline = true
indent_style = space
indent_size = 4
dotnet_style_operator_placement_when_wrapping = beginning_of_line
tab_width = 4
end_of_line = crlf
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_object_initializer = true:suggestion
dotnet_style_prefer_collection_expression = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_prefer_conditional_expression_over_return = true:silent
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_simplified_interpolation = true:suggestion
dotnet_style_namespace_match_folder = true:suggestion
dotnet_style_readonly_field = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
dotnet_style_allow_multiple_blank_lines_experimental = true:silent
# C# files
[*.cs]
# New line preferences
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true
# trim_trailing_whitespace = true
# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = one_less_than_current
# avoid this. unless absolutely necessary
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_event = false:suggestion
# prefer var
csharp_style_var_for_built_in_types = true
csharp_style_var_when_type_is_apparent = true
csharp_style_var_elsewhere = true:suggestion
# use language keywords instead of BCL types
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
# name all constant fields using PascalCase
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
dotnet_naming_symbols.constant_fields.applicable_kinds = field
dotnet_naming_symbols.constant_fields.required_modifiers = const
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
# private static fields should have s_ prefix
dotnet_naming_rule.private_static_fields_should_have_prefix.severity = suggestion
dotnet_naming_rule.private_static_fields_should_have_prefix.symbols = private_static_fields
dotnet_naming_rule.private_static_fields_should_have_prefix.style = private_static_prefix_style
dotnet_naming_symbols.private_static_fields.applicable_kinds = field
dotnet_naming_symbols.private_static_fields.required_modifiers = static
dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private
dotnet_naming_style.private_static_prefix_style.required_prefix = s_
dotnet_naming_style.private_static_prefix_style.capitalization = camel_case
# internal and private fields should be _camelCase
dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion
dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields
dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style
dotnet_naming_symbols.private_internal_fields.applicable_kinds = field
dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal
dotnet_naming_style.camel_case_underscore_style.required_prefix = _
dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case
# use accessibility modifiers
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
# Code style defaults
dotnet_sort_system_directives_first = true
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = false
# Expression-level preferences
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
# Expression-bodied members
csharp_style_expression_bodied_methods = false:none
csharp_style_expression_bodied_constructors = false:none
csharp_style_expression_bodied_operators = false:none
csharp_style_expression_bodied_properties = true:none
csharp_style_expression_bodied_indexers = true:none
csharp_style_expression_bodied_accessors = true:none
# Pattern matching
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
# Null checking preferences
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
# Space preferences
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false
space_within_single_line_array_initializer_braces = true
#Net Analyzer
dotnet_analyzer_diagnostic.category-Performance.severity = none #error - Uncomment when all violations are fixed.
# CS0649: Field 'field' is never assigned to, and will always have its default value 'value'
dotnet_diagnostic.CS0649.severity = error
# CS1591: Missing XML comment for publicly visible type or member
dotnet_diagnostic.CS1591.severity = suggestion
# CS0162: Remove unreachable code
dotnet_diagnostic.CS0162.severity = error
# CA1018: Mark attributes with AttributeUsageAttribute
dotnet_diagnostic.CA1018.severity = error
# CA1304: Specify CultureInfo
dotnet_diagnostic.CA1304.severity = warning
# CA1802: Use literals where appropriate
dotnet_diagnostic.CA1802.severity = warning
# CA1813: Avoid unsealed attributes
dotnet_diagnostic.CA1813.severity = error
# CA1815: Override equals and operator equals on value types
dotnet_diagnostic.CA1815.severity = warning
# CA1820: Test for empty strings using string length
dotnet_diagnostic.CA1820.severity = warning
# CA1821: Remove empty finalizers
dotnet_diagnostic.CA1821.severity = warning
# CA1822: Mark members as static
dotnet_diagnostic.CA1822.severity = suggestion
# CA1823: Avoid unused private fields
dotnet_diagnostic.CA1823.severity = warning
dotnet_code_quality.CA1822.api_surface = private, internal
# CA1825: Avoid zero-length array allocations
dotnet_diagnostic.CA1825.severity = warning
# CA1826: Use property instead of Linq Enumerable method
dotnet_diagnostic.CA1826.severity = suggestion
# CA1827: Do not use Count/LongCount when Any can be used
dotnet_diagnostic.CA1827.severity = warning
# CA1828: Do not use CountAsync/LongCountAsync when AnyAsync can be used
dotnet_diagnostic.CA1828.severity = warning
# CA1829: Use Length/Count property instead of Enumerable.Count method
dotnet_diagnostic.CA1829.severity = warning
#CA1847: Use string.Contains(char) instead of string.Contains(string) with single characters
dotnet_diagnostic.CA1847.severity = warning
#CA1854: Prefer the IDictionary.TryGetValue(TKey, out TValue) method
dotnet_diagnostic.CA1854.severity = warning
#CA2211:Non-constant fields should not be visible
dotnet_diagnostic.CA2211.severity = error
# IDE0005: remove used namespace using
dotnet_diagnostic.IDE0005.severity = error
# Wrapping preferences
csharp_wrap_before_ternary_opsigns = false
# Avalonia DevAnalyzer preferences
dotnet_diagnostic.AVADEV2001.severity = error
# Avalonia PublicAnalyzer preferences
dotnet_diagnostic.AVP1000.severity = error
dotnet_diagnostic.AVP1001.severity = error
dotnet_diagnostic.AVP1002.severity = error
dotnet_diagnostic.AVP1010.severity = error
dotnet_diagnostic.AVP1011.severity = error
dotnet_diagnostic.AVP1012.severity = warning
dotnet_diagnostic.AVP1013.severity = error
dotnet_diagnostic.AVP1020.severity = error
dotnet_diagnostic.AVP1021.severity = error
dotnet_diagnostic.AVP1022.severity = error
dotnet_diagnostic.AVP1030.severity = error
dotnet_diagnostic.AVP1031.severity = error
dotnet_diagnostic.AVP1032.severity = error
dotnet_diagnostic.AVP1040.severity = error
dotnet_diagnostic.AVA2001.severity = error
csharp_using_directive_placement = outside_namespace:silent
csharp_prefer_simple_using_statement = true:suggestion
csharp_prefer_braces = true:silent
csharp_style_namespace_declarations = block_scoped:silent
csharp_style_prefer_method_group_conversion = true:silent
csharp_style_prefer_top_level_statements = true:silent
csharp_style_prefer_primary_constructors = true:suggestion
csharp_style_expression_bodied_lambdas = true:silent
csharp_style_expression_bodied_local_functions = false:silent
csharp_style_prefer_null_check_over_type_check = true:suggestion
csharp_prefer_simple_default_expression = true:suggestion
csharp_style_prefer_local_over_anonymous_function = true:suggestion
csharp_style_prefer_index_operator = true:suggestion
csharp_style_prefer_range_operator = true:suggestion
csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
csharp_style_prefer_tuple_swap = true:suggestion
csharp_style_prefer_utf8_string_literals = true:suggestion
csharp_style_deconstructed_variable_declaration = true:suggestion
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
csharp_style_unused_value_expression_statement_preference = discard_variable:silent
csharp_style_prefer_readonly_struct = true:suggestion
csharp_prefer_static_local_function = true:suggestion
csharp_style_prefer_readonly_struct_member = true:suggestion
# Xaml files
[*.{xaml,axaml}]
indent_size = 2
# DuplicateSetterError
avalonia_xaml_diagnostic.AVLN2203.severity = error
# StyleInMergedDictionaries
avalonia_xaml_diagnostic.AVLN2204.severity = error
# RequiredTemplatePartMissing
avalonia_xaml_diagnostic.AVLN2205.severity = error
# OptionalTemplatePartMissing
avalonia_xaml_diagnostic.AVLN2206.severity = info
# TemplatePartWrongType
avalonia_xaml_diagnostic.AVLN2207.severity = error
# Obsolete
avalonia_xaml_diagnostic.AVLN5001.severity = error
# Xml project files
[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}]
indent_size = 2
# Xml build files
[*.builds]
indent_size = 2
# Xml files
[*.{xml,stylecop,resx,ruleset}]
indent_size = 2
# Xml config files
[*.{props,targets,config,nuspec}]
indent_size = 2
[*.json]
indent_size = 2
# Shell scripts
[*.sh]
end_of_line = lf
[*.{cmd,bat}]
end_of_line = crlf
# Package manifests
[{*.spec,control}]
end_of_line = lf
# YAML files
[*.{yml,yaml}]
indent_size = 2
end_of_line = lf

14
.gitattributes vendored Normal file
View file

@ -0,0 +1,14 @@
* text=auto
*.md text
*.png binary
*.ico binary
*.sh text eol=lf
*.spec text eol=lf
control text eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
*.ps1 text eol=crlf
*.json text
.gitattributes export-ignore
.gitignore export-ignore

79
.github/workflows/build.yml vendored Normal file
View file

@ -0,0 +1,79 @@
name: Build
on:
workflow_call:
jobs:
build:
strategy:
matrix:
include:
- name : Windows x64
os: windows-2019
runtime: win-x64
- name : Windows ARM64
os: windows-2019
runtime: win-arm64
- name : macOS (Intel)
os: macos-13
runtime: osx-x64
- name : macOS (Apple Silicon)
os: macos-latest
runtime: osx-arm64
- name : Linux
os: ubuntu-latest
runtime: linux-x64
container: ubuntu:20.04
- name : Linux (arm64)
os: ubuntu-latest
runtime: linux-arm64
container: ubuntu:20.04
name: Build ${{ matrix.name }}
runs-on: ${{ matrix.os }}
container: ${{ matrix.container || '' }}
steps:
- name: Install common CLI tools
if: ${{ startsWith(matrix.runtime, 'linux-') }}
run: |
export DEBIAN_FRONTEND=noninteractive
ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime
apt-get update
apt-get install -y sudo
sudo apt-get install -y curl wget git unzip zip libicu66 tzdata clang
- name: Checkout sources
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
- name: Configure arm64 packages
if: ${{ matrix.runtime == 'linux-arm64' }}
run: |
sudo dpkg --add-architecture arm64
echo 'deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal main restricted
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal-updates main restricted
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal-backports main restricted' \
| sudo tee /etc/apt/sources.list.d/arm64.list
sudo sed -i -e 's/^deb http/deb [arch=amd64] http/g' /etc/apt/sources.list
sudo sed -i -e 's/^deb mirror/deb [arch=amd64] mirror/g' /etc/apt/sources.list
- name: Install cross-compiling dependencies
if: ${{ matrix.runtime == 'linux-arm64' }}
run: |
sudo apt-get update
sudo apt-get install -y llvm gcc-aarch64-linux-gnu
- name: Build
run: dotnet build -c Release
- name: Publish
run: dotnet publish src/SourceGit.csproj -c Release -o publish -r ${{ matrix.runtime }}
- name: Rename executable file
if: ${{ startsWith(matrix.runtime, 'linux-') }}
run: mv publish/SourceGit publish/sourcegit
- name: Tar artifact
if: ${{ startsWith(matrix.runtime, 'linux-') || startsWith(matrix.runtime, 'osx-') }}
run: |
tar -cvf "sourcegit.${{ matrix.runtime }}.tar" -C publish .
rm -r publish/*
mv "sourcegit.${{ matrix.runtime }}.tar" publish
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: sourcegit.${{ matrix.runtime }}
path: publish/*

29
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,29 @@
name: Continuous Integration
on:
push:
branches: [develop]
pull_request:
branches: [develop]
workflow_dispatch:
workflow_call:
jobs:
build:
name: Build
uses: ./.github/workflows/build.yml
version:
name: Prepare version string
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Output version string
id: version
run: echo "version=$(cat VERSION)" >> "$GITHUB_OUTPUT"
package:
needs: [build, version]
name: Package
uses: ./.github/workflows/package.yml
with:
version: ${{ needs.version.outputs.version }}

View file

@ -0,0 +1,41 @@
name: Localization Check
on:
push:
branches: [ develop ]
paths:
- 'src/Resources/Locales/**'
workflow_dispatch:
workflow_call:
jobs:
localization-check:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20.x'
- name: Install dependencies
run: npm install fs-extra@11.2.0 path@0.12.7 xml2js@0.6.2
- name: Run localization check
run: node build/scripts/localization-check.js
- name: Commit changes
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
if [ -n "$(git status --porcelain)" ]; then
git add TRANSLATION.md src/Resources/Locales/*.axaml
git commit -m 'doc: Update translation status and sort locale files'
git push
else
echo "No changes to commit"
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

111
.github/workflows/package.yml vendored Normal file
View file

@ -0,0 +1,111 @@
name: Package
on:
workflow_call:
inputs:
version:
description: SourceGit package version
required: true
type: string
jobs:
windows:
name: Package Windows
runs-on: windows-2019
strategy:
matrix:
runtime: [ win-x64, win-arm64 ]
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Download build
uses: actions/download-artifact@v4
with:
name: sourcegit.${{ matrix.runtime }}
path: build/SourceGit
- name: Package
shell: bash
env:
VERSION: ${{ inputs.version }}
RUNTIME: ${{ matrix.runtime }}
run: ./build/scripts/package.windows.sh
- name: Upload package artifact
uses: actions/upload-artifact@v4
with:
name: package.${{ matrix.runtime }}
path: build/sourcegit_*.zip
- name: Delete temp artifacts
uses: geekyeggo/delete-artifact@v5
with:
name: sourcegit.${{ matrix.runtime }}
osx-app:
name: Package macOS
runs-on: macos-latest
strategy:
matrix:
runtime: [osx-x64, osx-arm64]
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Download build
uses: actions/download-artifact@v4
with:
name: sourcegit.${{ matrix.runtime }}
path: build
- name: Package
env:
VERSION: ${{ inputs.version }}
RUNTIME: ${{ matrix.runtime }}
run: |
mkdir build/SourceGit
tar -xf "build/sourcegit.${{ matrix.runtime }}.tar" -C build/SourceGit
./build/scripts/package.osx-app.sh
- name: Upload package artifact
uses: actions/upload-artifact@v4
with:
name: package.${{ matrix.runtime }}
path: build/sourcegit_*.zip
- name: Delete temp artifacts
uses: geekyeggo/delete-artifact@v5
with:
name: sourcegit.${{ matrix.runtime }}
linux:
name: Package Linux
runs-on: ubuntu-latest
container: ubuntu:20.04
strategy:
matrix:
runtime: [linux-x64, linux-arm64]
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Download package dependencies
run: |
export DEBIAN_FRONTEND=noninteractive
ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime
apt-get update
apt-get install -y curl wget git dpkg-dev fakeroot tzdata zip unzip desktop-file-utils rpm libfuse2 file build-essential binutils
- name: Download build
uses: actions/download-artifact@v4
with:
name: sourcegit.${{ matrix.runtime }}
path: build
- name: Package
env:
VERSION: ${{ inputs.version }}
RUNTIME: ${{ matrix.runtime }}
APPIMAGE_EXTRACT_AND_RUN: 1
run: |
mkdir build/SourceGit
tar -xf "build/sourcegit.${{ matrix.runtime }}.tar" -C build/SourceGit
./build/scripts/package.linux.sh
- name: Upload package artifacts
uses: actions/upload-artifact@v4
with:
name: package.${{ matrix.runtime }}
path: |
build/sourcegit-*.AppImage
build/sourcegit_*.deb
build/sourcegit-*.rpm
- name: Delete temp artifacts
uses: geekyeggo/delete-artifact@v5
with:
name: sourcegit.${{ matrix.runtime }}

52
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,52 @@
name: Release
on:
push:
tags:
- v*
jobs:
build:
name: Build
uses: ./.github/workflows/build.yml
version:
name: Prepare version string
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
steps:
- name: Output version string
id: version
env:
TAG: ${{ github.ref_name }}
run: echo "version=${TAG#v}" >> "$GITHUB_OUTPUT"
package:
needs: [build, version]
name: Package
uses: ./.github/workflows/package.yml
with:
version: ${{ needs.version.outputs.version }}
release:
needs: [package, version]
name: Release
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Create release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG: ${{ github.ref_name }}
VERSION: ${{ needs.version.outputs.version }}
run: gh release create "$TAG" -t "$VERSION" --notes-from-tag
- name: Download artifacts
uses: actions/download-artifact@v4
with:
pattern: package.*
path: packages
merge-multiple: true
- name: Upload assets
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG: ${{ github.ref_name }}
run: gh release upload "$TAG" packages/*

45
.gitignore vendored
View file

@ -1,6 +1,41 @@
.idea
.vs
.vscode
bin
obj
.vs/
.vscode/
.idea/
*.sln.docstates
*.user
*.suo
*.code-workspace
.DS_Store
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
bin/
obj/
# ignore ci node files
node_modules/
package.json
package-lock.json
build/resources/
build/SourceGit/
build/SourceGit.app/
build/*.zip
build/*.tar.gz
build/*.deb
build/*.rpm
build/*.AppImage
SourceGit.app/
build.command
src/Properties/launchSettings.json

View file

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2024 sourcegit
Copyright (c) 2025 sourcegit
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in

196
README.md
View file

@ -1,38 +1,179 @@
# SourceGit
# SourceGit - Opensource Git GUI client.
Opensouce Git GUI client.
[![stars](https://img.shields.io/github/stars/sourcegit-scm/sourcegit.svg)](https://github.com/sourcegit-scm/sourcegit/stargazers)
[![forks](https://img.shields.io/github/forks/sourcegit-scm/sourcegit.svg)](https://github.com/sourcegit-scm/sourcegit/forks)
[![license](https://img.shields.io/github/license/sourcegit-scm/sourcegit.svg)](LICENSE)
[![latest](https://img.shields.io/github/v/release/sourcegit-scm/sourcegit.svg)](https://github.com/sourcegit-scm/sourcegit/releases/latest)
[![downloads](https://img.shields.io/github/downloads/sourcegit-scm/sourcegit/total)](https://github.com/sourcegit-scm/sourcegit/releases)
> To use this tool, you need to install Git first.
## Highlights
## High-lights
* Supports Windows/macOS
* Supports Windows/macOS/Linux
* Opensource/Free
* Fast
* English/简体中文
* Build-in light/dark themes
* Deutsch/English/Español/Français/Italiano/Português/Русский/Українська/简体中文/繁體中文/日本語/தமிழ் (Tamil)
* Built-in light/dark themes
* Customize theme
* Visual commit graph
* Supports SSH access with each remote
* GIT commands with GUI
* Clone/Fetch/Pull/Push...
* Merge/Rebase/Reset/Revert/Cherry-pick...
* Amend/Reword/Squash
* Interactive rebase
* Branches
* Remotes
* Tags
* Stashes
* Submodules
* Worktrees
* Archive
* Patch/apply
* Diff
* Save as patch/apply
* File histories
* Blame
* Revision Diffs
* Branch Diff
* Image Diff - Side-By-Side/Swipe/Blend
* Git command logs
* Search commits
* GitFlow
* Git LFS
* Bisect
* Issue Link
* Workspace
* Custom Action
* Using AI to generate commit message (C# port of [anjerodev/commitollama](https://github.com/anjerodev/commitollama))
## Download
> [!WARNING]
> **Linux** only tested on **Debian 12** on both **X11** & **Wayland**.
Pre-build Binaries[Releases](https://github.com/sourcegit-scm/sourcegit/releases)
## Translation Status
## Screen Shots
You can find the current translation status in [TRANSLATION.md](https://github.com/sourcegit-scm/sourcegit/blob/develop/TRANSLATION.md)
* Drak Theme
## How to Use
**To use this tool, you need to install Git(>=2.25.1) first.**
You can download the latest stable from [Releases](https://github.com/sourcegit-scm/sourcegit/releases/latest) or download workflow artifacts from [GitHub Actions](https://github.com/sourcegit-scm/sourcegit/actions) to try this app based on latest commits.
This software creates a folder `$"{System.Environment.SpecialFolder.ApplicationData}/SourceGit"`, which is platform-dependent, to store user settings, downloaded avatars and crash logs.
| OS | PATH |
|---------|-----------------------------------------------------|
| Windows | `%APPDATA%\SourceGit` |
| Linux | `${HOME}/.config/SourceGit` or `${HOME}/.sourcegit` |
| macOS | `${HOME}/Library/Application Support/SourceGit` |
> [!TIP]
> * You can open this data storage directory from the main menu `Open Data Storage Directory`.
> * You can create a `data` folder next to the `SourceGit` executable to force this app to store data (user settings, downloaded avatars and crash logs) into it (Portable-Mode). Only works on Windows.
For **Windows** users:
* **MSYS Git is NOT supported**. Please use official [Git for Windows](https://git-scm.com/download/win) instead.
* You can install the latest stable from `winget` with follow commands:
```shell
winget install SourceGit
```
> [!NOTE]
> `winget` will install this software as a commandline tool. You need run `SourceGit` from console or `Win+R` at the first time. Then you can add it to the taskbar.
* You can install the latest stable by `scoop` with follow commands:
```shell
scoop bucket add extras
scoop install sourcegit
```
* Pre-built binaries can be found in [Releases](https://github.com/sourcegit-scm/sourcegit/releases/latest)
For **macOS** users:
* Thanks [@ybeapps](https://github.com/ybeapps) for making `SourceGit` available on `Homebrew`. You can simply install it with following command:
```shell
brew tap ybeapps/homebrew-sourcegit
brew install --cask --no-quarantine sourcegit
```
* If you want to install `SourceGit.app` from GitHub Release manually, you need run following command to make sure it works:
```shell
sudo xattr -cr /Applications/SourceGit.app
```
* Make sure [git-credential-manager](https://github.com/git-ecosystem/git-credential-manager/releases) is installed on your mac.
* You can run `echo $PATH > ~/Library/Application\ Support/SourceGit/PATH` to generate a custom PATH env file to introduce `PATH` env to SourceGit.
For **Linux** users:
* Thanks [@aikawayataro](https://github.com/aikawayataro) for providing `rpm` and `deb` repositories, hosted on [Codeberg](https://codeberg.org/yataro/-/packages).
`deb` how to:
```shell
curl https://codeberg.org/api/packages/yataro/debian/repository.key | sudo tee /etc/apt/keyrings/sourcegit.asc
echo "deb [signed-by=/etc/apt/keyrings/sourcegit.asc, arch=amd64,arm64] https://codeberg.org/api/packages/yataro/debian generic main" | sudo tee /etc/apt/sources.list.d/sourcegit.list
sudo apt update
sudo apt install sourcegit
```
`rpm` how to:
```shell
curl https://codeberg.org/api/packages/yataro/rpm.repo | sed -e 's/gpgcheck=1/gpgcheck=0/' > sourcegit.repo
# Fedora 41 and newer
sudo dnf config-manager addrepo --from-repofile=./sourcegit.repo
# Fedora 40 and earlier
sudo dnf config-manager --add-repo ./sourcegit.repo
sudo dnf install sourcegit
```
If your distribution isn't using `dnf`, please refer to the documentation of your distribution on how to add an `rpm` repository.
* `AppImage` files can be found on [AppImage hub](https://appimage.github.io/SourceGit/), `xdg-open` (`xdg-utils`) must be installed to support open native file manager.
* Make sure [git-credential-manager](https://github.com/git-ecosystem/git-credential-manager/releases) is installed on your Linux.
* Maybe you need to set environment variable `AVALONIA_SCREEN_SCALE_FACTORS`. See https://github.com/AvaloniaUI/Avalonia/wiki/Configuring-X11-per-monitor-DPI.
* If you can NOT type accented characters, such as `ê`, `ó`, try to set the environment variable `AVALONIA_IM_MODULE` to `none`.
## OpenAI
This software supports using OpenAI or other AI service that has an OpenAI compatible HTTP API to generate commit message. You need configurate the service in `Preference` window.
For `OpenAI`:
* `Server` must be `https://api.openai.com/v1`
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`
* The `API Key` is optional that depends on the service
## External Tools
This app supports open repository in external tools listed in the table below.
| Tool | Windows | macOS | Linux |
|-------------------------------|---------|-------|-------|
| Visual Studio Code | YES | YES | YES |
| Visual Studio Code - Insiders | YES | YES | YES |
| VSCodium | YES | YES | YES |
| Fleet | YES | YES | YES |
| Sublime Text | YES | YES | YES |
| Zed | NO | YES | YES |
| Visual Studio | YES | NO | NO |
> [!NOTE]
> This app will try to find those tools based on some pre-defined or expected locations automatically. If you are using one portable version of these tools, it will not be detected by this app.
> To solve this problem you can add a file named `external_editors.json` in app data storage directory and provide the path directly. For example:
```json
{
"tools": {
"Visual Studio Code": "D:\\VSCode\\Code.exe"
}
}
```
> [!NOTE]
> This app also supports a lot of `JetBrains` IDEs, installing `JetBrains Toolbox` will help this app to find them.
## Screenshots
* Dark Theme
![Theme Dark](./screenshots/theme_dark.png)
@ -40,10 +181,27 @@ Pre-build Binaries[Releases](https://github.com/sourcegit-scm/sourcegit/relea
![Theme Light](./screenshots/theme_light.png)
## Thanks
* Custom
* [XiaoLinger](https://gitee.com/LingerNN) Hotkey: `CTRL + Enter` to commit
* [carterl](https://gitee.com/carterl) Supports Windows Terminal; Rewrite way to find git executable
* [PUMA](https://gitee.com/whgfu) Configure for default user
* [Rwing](https://gitee.com/rwing) GitFlow: add an option to keep branch after finish
* [XiaoLinger](https://gitee.com/LingerNN) Fix localizations in popup panel
You can find custom themes from [sourcegit-theme](https://github.com/sourcegit-scm/sourcegit-theme.git). And welcome to share your own themes.
## Contributing
Everyone is welcome to submit a PR. Please make sure your PR is based on the latest `develop` branch and the target branch of PR is `develop`.
In short, here are the commands to get started once [.NET tools are installed](https://dotnet.microsoft.com/en-us/download):
```sh
dotnet nuget add source https://api.nuget.org/v3/index.json -n nuget.org
dotnet restore
dotnet build
dotnet run --project src/SourceGit.csproj
```
Thanks to all the people who contribute.
[![Contributors](https://contrib.rocks/image?repo=sourcegit-scm/sourcegit&columns=20)](https://github.com/sourcegit-scm/sourcegit/graphs/contributors)
## Third-Party Components
For detailed license information, see [THIRD-PARTY-LICENSES.md](THIRD-PARTY-LICENSES.md).

122
SourceGit.sln Normal file
View file

@ -0,0 +1,122 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34714.143
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SourceGit", "src\SourceGit.csproj", "{2091C34D-4A17-4375-BEF3-4D60BE8113E4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{773082AC-D9C8-4186-8521-4B6A7BEE6158}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "resources", "resources", "{FD384607-ED99-47B7-AF31-FB245841BC92}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{F45A9D95-AF25-42D8-BBAC-8259C9EEE820}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{67B6D05F-A000-40BA-ADB4-C9065F880D7B}"
ProjectSection(SolutionItems) = preProject
.github\workflows\build.yml = .github\workflows\build.yml
.github\workflows\ci.yml = .github\workflows\ci.yml
.github\workflows\package.yml = .github\workflows\package.yml
.github\workflows\release.yml = .github\workflows\release.yml
.github\workflows\localization-check.yml = .github\workflows\localization-check.yml
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{49A7C2D6-558C-4FAA-8F5D-EEE81497AED7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "files", "files", "{3AB707DB-A02C-4AFC-BF12-D7DF2B333BAC}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
.gitattributes = .gitattributes
.gitignore = .gitignore
global.json = global.json
LICENSE = LICENSE
README.md = README.md
VERSION = VERSION
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "app", "app", "{ABC98884-F023-4EF4-A9C9-5DE9452BE955}"
ProjectSection(SolutionItems) = preProject
build\resources\app\App.icns = build\resources\app\App.icns
build\resources\app\App.plist = build\resources\app\App.plist
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_common", "_common", "{04FD74B1-FBDB-496E-A48F-3D59D71FF952}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "usr", "usr", "{76639799-54BC-45E8-BD90-F45F63ACD11D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "share", "share", "{A3ABAA7C-EE14-4448-B466-6E69C1347E7D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "applications", "applications", "{2AF28D3B-14A8-46A8-B828-157FAAB1B06F}"
ProjectSection(SolutionItems) = preProject
build\resources\_common\usr\share\applications\sourcegit.desktop = build\resources\_common\usr\share\applications\sourcegit.desktop
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "icons", "icons", "{7166EC6C-17F5-4B5E-B38E-1E53C81EACF6}"
ProjectSection(SolutionItems) = preProject
build\resources\_common\usr\share\icons\sourcegit.png = build\resources\_common\usr\share\icons\sourcegit.png
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "deb", "deb", "{9C2F0CDA-B56E-44A5-94B6-F3EA7AC20CDC}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DEBIAN", "DEBIAN", "{F101849D-BDB7-40D4-A516-751150C3CCFC}"
ProjectSection(SolutionItems) = preProject
build\resources\deb\DEBIAN\control = build\resources\deb\DEBIAN\control
build\resources\deb\DEBIAN\preinst = build\resources\deb\DEBIAN\preinst
build\resources\deb\DEBIAN\prerm = build\resources\deb\DEBIAN\prerm
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rpm", "rpm", "{9BA0B044-0CC9-46F8-B551-204F149BF45D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SPECS", "SPECS", "{7802CD7A-591B-4EDD-96F8-9BF3F61692E4}"
ProjectSection(SolutionItems) = preProject
build\resources\rpm\SPECS\build.spec = build\resources\rpm\SPECS\build.spec
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "appimage", "appimage", "{5D125DD9-B48A-491F-B2FB-D7830D74C4DC}"
ProjectSection(SolutionItems) = preProject
build\resources\appimage\sourcegit.appdata.xml = build\resources\appimage\sourcegit.appdata.xml
build\resources\appimage\sourcegit.png = build\resources\appimage\sourcegit.png
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{C54D4001-9940-477C-A0B6-E795ED0A3209}"
ProjectSection(SolutionItems) = preProject
build\scripts\localization-check.js = build\scripts\localization-check.js
build\scripts\package.linux.sh = build\scripts\package.linux.sh
build\scripts\package.osx-app.sh = build\scripts\package.osx-app.sh
build\scripts\package.windows.sh = build\scripts\package.windows.sh
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2091C34D-4A17-4375-BEF3-4D60BE8113E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2091C34D-4A17-4375-BEF3-4D60BE8113E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2091C34D-4A17-4375-BEF3-4D60BE8113E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2091C34D-4A17-4375-BEF3-4D60BE8113E4}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{2091C34D-4A17-4375-BEF3-4D60BE8113E4} = {49A7C2D6-558C-4FAA-8F5D-EEE81497AED7}
{FD384607-ED99-47B7-AF31-FB245841BC92} = {773082AC-D9C8-4186-8521-4B6A7BEE6158}
{67B6D05F-A000-40BA-ADB4-C9065F880D7B} = {F45A9D95-AF25-42D8-BBAC-8259C9EEE820}
{ABC98884-F023-4EF4-A9C9-5DE9452BE955} = {FD384607-ED99-47B7-AF31-FB245841BC92}
{04FD74B1-FBDB-496E-A48F-3D59D71FF952} = {FD384607-ED99-47B7-AF31-FB245841BC92}
{76639799-54BC-45E8-BD90-F45F63ACD11D} = {04FD74B1-FBDB-496E-A48F-3D59D71FF952}
{A3ABAA7C-EE14-4448-B466-6E69C1347E7D} = {76639799-54BC-45E8-BD90-F45F63ACD11D}
{2AF28D3B-14A8-46A8-B828-157FAAB1B06F} = {A3ABAA7C-EE14-4448-B466-6E69C1347E7D}
{7166EC6C-17F5-4B5E-B38E-1E53C81EACF6} = {A3ABAA7C-EE14-4448-B466-6E69C1347E7D}
{9C2F0CDA-B56E-44A5-94B6-F3EA7AC20CDC} = {FD384607-ED99-47B7-AF31-FB245841BC92}
{F101849D-BDB7-40D4-A516-751150C3CCFC} = {9C2F0CDA-B56E-44A5-94B6-F3EA7AC20CDC}
{9BA0B044-0CC9-46F8-B551-204F149BF45D} = {FD384607-ED99-47B7-AF31-FB245841BC92}
{7802CD7A-591B-4EDD-96F8-9BF3F61692E4} = {9BA0B044-0CC9-46F8-B551-204F149BF45D}
{5D125DD9-B48A-491F-B2FB-D7830D74C4DC} = {FD384607-ED99-47B7-AF31-FB245841BC92}
{C54D4001-9940-477C-A0B6-E795ED0A3209} = {773082AC-D9C8-4186-8521-4B6A7BEE6158}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {7FF1B9C6-B5BF-4A50-949F-4B407A0E31C9}
EndGlobalSection
EndGlobal

86
THIRD-PARTY-LICENSES.md Normal file
View file

@ -0,0 +1,86 @@
# Third-Party Licenses
This project incorporates components from the following third parties:
## Packages
### AvaloniaUI
- **Source**: https://github.com/AvaloniaUI/Avalonia
- **Version**: 11.2.5
- **License**: MIT License
- **License Link**: https://github.com/AvaloniaUI/Avalonia/blob/master/licence.md
### AvaloniaEdit
- **Source**: https://github.com/AvaloniaUI/AvaloniaEdit
- **Version**: 11.2.0
- **License**: MIT License
- **License Link**: https://github.com/AvaloniaUI/AvaloniaEdit/blob/master/LICENSE
### LiveChartsCore.SkiaSharpView.Avalonia
- **Source**: https://github.com/beto-rodriguez/LiveCharts2
- **Version**: 2.0.0-rc5.4
- **License**: MIT License
- **License Link**: https://github.com/beto-rodriguez/LiveCharts2/blob/master/LICENSE
### TextMateSharp
- **Source**: https://github.com/danipen/TextMateSharp
- **Version**: 1.0.66
- **License**: MIT License
- **License Link**: https://github.com/danipen/TextMateSharp/blob/master/LICENSE.md
### OpenAI .NET SDK
- **Source**: https://github.com/openai/openai-dotnet
- **Version**: 2.2.0-beta2
- **License**: MIT License
- **License Link**: https://github.com/openai/openai-dotnet/blob/main/LICENSE
### Azure.AI.OpenAI
- **Source**: https://github.com/Azure/azure-sdk-for-net
- **Version**: 2.2.0-beta2
- **License**: MIT License
- **License Link**: https://github.com/Azure/azure-sdk-for-net/blob/main/LICENSE.txt
## Fonts
### JetBrainsMono
- **Source**: https://github.com/JetBrains/JetBrainsMono
- **Commit**: v2.304
- **License**: SIL Open Font License, Version 1.1
- **License Link**: https://github.com/JetBrains/JetBrainsMono/blob/v2.304/OFL.txt
## Grammar Files
### haxe-TmLanguage
- **Source**: https://github.com/vshaxe/haxe-TmLanguage
- **Commit**: ddad8b4c6d0781ac20be0481174ec1be772c5da5
- **License**: MIT License
- **License Link**: https://github.com/vshaxe/haxe-TmLanguage/blob/ddad8b4c6d0781ac20be0481174ec1be772c5da5/LICENSE.md
### coc-toml
- **Source**: https://github.com/kkiyama117/coc-toml
- **Commit**: aac3e0c65955c03314b2733041b19f903b7cc447
- **License**: MIT License
- **License Link**: https://github.com/kkiyama117/coc-toml/blob/aac3e0c65955c03314b2733041b19f903b7cc447/LICENSE
### eclipse-buildship
- **Source**: https://github.com/eclipse/buildship
- **Commit**: 6bb773e7692f913dec27105129ebe388de34e68b
- **License**: Eclipse Public License 1.0
- **License Link**: https://github.com/eclipse-buildship/buildship/blob/6bb773e7692f913dec27105129ebe388de34e68b/README.md
### vscode-jsp-lang
- **Source**: https://github.com/samuel-weinhardt/vscode-jsp-lang
- **Commit**: 0e89ecdb13650dbbe5a1e85b47b2e1530bf2f355
- **License**: MIT License
- **License Link**: https://github.com/samuel-weinhardt/vscode-jsp-lang/blob/0e89ecdb13650dbbe5a1e85b47b2e1530bf2f355/LICENSE

511
TRANSLATION.md Normal file
View file

@ -0,0 +1,511 @@
# Translation Status
This document shows the translation status of each locale file in the repository.
## Details
### ![en_US](https://img.shields.io/badge/en__US-%E2%88%9A-brightgreen)
### ![de__DE](https://img.shields.io/badge/de__DE-96.14%25-yellow)
<details>
<summary>Missing keys in de_DE.axaml</summary>
- Text.Avatar.Load
- Text.BranchCM.ResetToSelectedCommit
- Text.Checkout.WithFastForward
- Text.Checkout.WithFastForward.Upstream
- Text.CommitDetail.Changes.Count
- Text.CreateBranch.OverwriteExisting
- Text.DeinitSubmodule
- Text.DeinitSubmodule.Force
- Text.DeinitSubmodule.Path
- Text.Diff.Submodule.Deleted
- Text.GitFlow.FinishWithPush
- Text.GitFlow.FinishWithSquash
- Text.Hotkeys.Global.SwitchWorkspace
- Text.Hotkeys.Global.SwitchTab
- Text.Hotkeys.TextEditor.OpenExternalMergeTool
- Text.Launcher.Workspaces
- Text.Launcher.Pages
- Text.Pull.RecurseSubmodules
- Text.Repository.ClearStashes
- Text.Repository.ShowSubmodulesAsTree
- Text.ResetWithoutCheckout
- Text.ResetWithoutCheckout.MoveTo
- Text.ResetWithoutCheckout.Target
- Text.Submodule.Deinit
- Text.Submodule.Status
- Text.Submodule.Status.Modified
- Text.Submodule.Status.NotInited
- Text.Submodule.Status.RevisionChanged
- Text.Submodule.Status.Unmerged
- Text.Submodule.URL
- Text.WorkingCopy.ResetAuthor
</details>
### ![es__ES](https://img.shields.io/badge/es__ES-%E2%88%9A-brightgreen)
### ![fr__FR](https://img.shields.io/badge/fr__FR-92.03%25-yellow)
<details>
<summary>Missing keys in fr_FR.axaml</summary>
- Text.Avatar.Load
- Text.Bisect
- Text.Bisect.Abort
- Text.Bisect.Bad
- Text.Bisect.Detecting
- Text.Bisect.Good
- Text.Bisect.Skip
- Text.Bisect.WaitingForRange
- Text.BranchCM.ResetToSelectedCommit
- Text.Checkout.RecurseSubmodules
- Text.Checkout.WithFastForward
- Text.Checkout.WithFastForward.Upstream
- Text.CommitCM.CopyAuthor
- Text.CommitCM.CopyCommitter
- Text.CommitCM.CopySubject
- Text.CommitDetail.Changes.Count
- Text.CommitMessageTextBox.SubjectCount
- Text.Configure.Git.PreferredMergeMode
- Text.ConfirmEmptyCommit.Continue
- Text.ConfirmEmptyCommit.NoLocalChanges
- Text.ConfirmEmptyCommit.StageAllThenCommit
- Text.ConfirmEmptyCommit.WithLocalChanges
- Text.CreateBranch.OverwriteExisting
- Text.DeinitSubmodule
- Text.DeinitSubmodule.Force
- Text.DeinitSubmodule.Path
- Text.Diff.Submodule.Deleted
- Text.GitFlow.FinishWithPush
- Text.GitFlow.FinishWithSquash
- Text.Hotkeys.Global.SwitchWorkspace
- Text.Hotkeys.Global.SwitchTab
- Text.Hotkeys.TextEditor.OpenExternalMergeTool
- Text.Launcher.Workspaces
- Text.Launcher.Pages
- Text.Preferences.Git.IgnoreCRAtEOLInDiff
- Text.Pull.RecurseSubmodules
- Text.Repository.BranchSort
- Text.Repository.BranchSort.ByCommitterDate
- Text.Repository.BranchSort.ByName
- Text.Repository.ClearStashes
- Text.Repository.Search.ByContent
- Text.Repository.ShowSubmodulesAsTree
- Text.Repository.ViewLogs
- Text.Repository.Visit
- Text.ResetWithoutCheckout
- Text.ResetWithoutCheckout.MoveTo
- Text.ResetWithoutCheckout.Target
- Text.Submodule.Deinit
- Text.Submodule.Status
- Text.Submodule.Status.Modified
- Text.Submodule.Status.NotInited
- Text.Submodule.Status.RevisionChanged
- Text.Submodule.Status.Unmerged
- Text.Submodule.URL
- Text.ViewLogs
- Text.ViewLogs.Clear
- Text.ViewLogs.CopyLog
- Text.ViewLogs.Delete
- Text.WorkingCopy.ConfirmCommitWithFilter
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
- Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts
- Text.WorkingCopy.Conflicts.UseMine
- Text.WorkingCopy.Conflicts.UseTheirs
- Text.WorkingCopy.ResetAuthor
</details>
### ![it__IT](https://img.shields.io/badge/it__IT-97.38%25-yellow)
<details>
<summary>Missing keys in it_IT.axaml</summary>
- Text.Avatar.Load
- Text.BranchCM.ResetToSelectedCommit
- Text.Checkout.WithFastForward
- Text.Checkout.WithFastForward.Upstream
- Text.CommitDetail.Changes.Count
- Text.CreateBranch.OverwriteExisting
- Text.DeinitSubmodule
- Text.DeinitSubmodule.Force
- Text.DeinitSubmodule.Path
- Text.Diff.Submodule.Deleted
- Text.Hotkeys.Global.SwitchWorkspace
- Text.Hotkeys.Global.SwitchTab
- Text.Launcher.Workspaces
- Text.Launcher.Pages
- Text.Pull.RecurseSubmodules
- Text.Repository.ClearStashes
- Text.ResetWithoutCheckout
- Text.ResetWithoutCheckout.MoveTo
- Text.ResetWithoutCheckout.Target
- Text.Submodule.Deinit
- Text.WorkingCopy.ResetAuthor
</details>
### ![ja__JP](https://img.shields.io/badge/ja__JP-91.78%25-yellow)
<details>
<summary>Missing keys in ja_JP.axaml</summary>
- Text.Avatar.Load
- Text.Bisect
- Text.Bisect.Abort
- Text.Bisect.Bad
- Text.Bisect.Detecting
- Text.Bisect.Good
- Text.Bisect.Skip
- Text.Bisect.WaitingForRange
- Text.BranchCM.CompareWithCurrent
- Text.BranchCM.ResetToSelectedCommit
- Text.Checkout.RecurseSubmodules
- Text.Checkout.WithFastForward
- Text.Checkout.WithFastForward.Upstream
- Text.CommitCM.CopyAuthor
- Text.CommitCM.CopyCommitter
- Text.CommitCM.CopySubject
- Text.CommitDetail.Changes.Count
- Text.CommitMessageTextBox.SubjectCount
- Text.Configure.Git.PreferredMergeMode
- Text.ConfirmEmptyCommit.Continue
- Text.ConfirmEmptyCommit.NoLocalChanges
- Text.ConfirmEmptyCommit.StageAllThenCommit
- Text.ConfirmEmptyCommit.WithLocalChanges
- Text.CreateBranch.OverwriteExisting
- Text.DeinitSubmodule
- Text.DeinitSubmodule.Force
- Text.DeinitSubmodule.Path
- Text.Diff.Submodule.Deleted
- Text.GitFlow.FinishWithPush
- Text.GitFlow.FinishWithSquash
- Text.Hotkeys.Global.SwitchWorkspace
- Text.Hotkeys.Global.SwitchTab
- Text.Hotkeys.TextEditor.OpenExternalMergeTool
- Text.Launcher.Workspaces
- Text.Launcher.Pages
- Text.Preferences.Git.IgnoreCRAtEOLInDiff
- Text.Pull.RecurseSubmodules
- Text.Repository.BranchSort
- Text.Repository.BranchSort.ByCommitterDate
- Text.Repository.BranchSort.ByName
- Text.Repository.ClearStashes
- Text.Repository.FilterCommits
- Text.Repository.Search.ByContent
- Text.Repository.ShowSubmodulesAsTree
- Text.Repository.ViewLogs
- Text.Repository.Visit
- Text.ResetWithoutCheckout
- Text.ResetWithoutCheckout.MoveTo
- Text.ResetWithoutCheckout.Target
- Text.Submodule.Deinit
- Text.Submodule.Status
- Text.Submodule.Status.Modified
- Text.Submodule.Status.NotInited
- Text.Submodule.Status.RevisionChanged
- Text.Submodule.Status.Unmerged
- Text.Submodule.URL
- Text.ViewLogs
- Text.ViewLogs.Clear
- Text.ViewLogs.CopyLog
- Text.ViewLogs.Delete
- Text.WorkingCopy.ConfirmCommitWithFilter
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
- Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts
- Text.WorkingCopy.Conflicts.UseMine
- Text.WorkingCopy.Conflicts.UseTheirs
- Text.WorkingCopy.ResetAuthor
</details>
### ![pt__BR](https://img.shields.io/badge/pt__BR-83.81%25-yellow)
<details>
<summary>Missing keys in pt_BR.axaml</summary>
- Text.AIAssistant.Regen
- Text.AIAssistant.Use
- Text.ApplyStash
- Text.ApplyStash.DropAfterApply
- Text.ApplyStash.RestoreIndex
- Text.ApplyStash.Stash
- Text.Avatar.Load
- Text.Bisect
- Text.Bisect.Abort
- Text.Bisect.Bad
- Text.Bisect.Detecting
- Text.Bisect.Good
- Text.Bisect.Skip
- Text.Bisect.WaitingForRange
- Text.BranchCM.CustomAction
- Text.BranchCM.MergeMultiBranches
- Text.BranchCM.ResetToSelectedCommit
- Text.BranchUpstreamInvalid
- Text.Checkout.RecurseSubmodules
- Text.Checkout.WithFastForward
- Text.Checkout.WithFastForward.Upstream
- Text.Clone.RecurseSubmodules
- Text.CommitCM.CopyAuthor
- Text.CommitCM.CopyCommitter
- Text.CommitCM.CopySubject
- Text.CommitCM.Merge
- Text.CommitCM.MergeMultiple
- Text.CommitDetail.Changes.Count
- Text.CommitDetail.Files.Search
- Text.CommitDetail.Info.Children
- Text.CommitMessageTextBox.SubjectCount
- Text.Configure.CustomAction.Scope.Branch
- Text.Configure.CustomAction.WaitForExit
- Text.Configure.Git.PreferredMergeMode
- Text.Configure.IssueTracker.AddSampleGiteeIssue
- Text.Configure.IssueTracker.AddSampleGiteePullRequest
- Text.ConfirmEmptyCommit.Continue
- Text.ConfirmEmptyCommit.NoLocalChanges
- Text.ConfirmEmptyCommit.StageAllThenCommit
- Text.ConfirmEmptyCommit.WithLocalChanges
- Text.CopyFullPath
- Text.CreateBranch.Name.WarnSpace
- Text.CreateBranch.OverwriteExisting
- Text.DeinitSubmodule
- Text.DeinitSubmodule.Force
- Text.DeinitSubmodule.Path
- Text.DeleteRepositoryNode.Path
- Text.DeleteRepositoryNode.TipForGroup
- Text.DeleteRepositoryNode.TipForRepository
- Text.Diff.First
- Text.Diff.Last
- Text.Diff.Submodule.Deleted
- Text.Diff.UseBlockNavigation
- Text.Fetch.Force
- Text.FileCM.ResolveUsing
- Text.GitFlow.FinishWithPush
- Text.GitFlow.FinishWithSquash
- Text.Hotkeys.Global.Clone
- Text.Hotkeys.Global.SwitchWorkspace
- Text.Hotkeys.Global.SwitchTab
- Text.Hotkeys.TextEditor.OpenExternalMergeTool
- Text.InProgress.CherryPick.Head
- Text.InProgress.Merge.Operating
- Text.InProgress.Rebase.StoppedAt
- Text.InProgress.Revert.Head
- Text.Launcher.Workspaces
- Text.Launcher.Pages
- Text.Merge.Source
- Text.MergeMultiple
- Text.MergeMultiple.CommitChanges
- Text.MergeMultiple.Strategy
- Text.MergeMultiple.Targets
- Text.Preferences.AI.Streaming
- Text.Preferences.Appearance.EditorTabWidth
- Text.Preferences.General.DateFormat
- Text.Preferences.General.ShowChildren
- Text.Preferences.General.ShowTagsInGraph
- Text.Preferences.Git.IgnoreCRAtEOLInDiff
- Text.Preferences.Git.SSLVerify
- Text.Pull.RecurseSubmodules
- Text.Repository.BranchSort
- Text.Repository.BranchSort.ByCommitterDate
- Text.Repository.BranchSort.ByName
- Text.Repository.ClearStashes
- Text.Repository.FilterCommits
- Text.Repository.HistoriesLayout
- Text.Repository.HistoriesLayout.Horizontal
- Text.Repository.HistoriesLayout.Vertical
- Text.Repository.HistoriesOrder
- Text.Repository.Notifications.Clear
- Text.Repository.OnlyHighlightCurrentBranchInHistories
- Text.Repository.Search.ByContent
- Text.Repository.ShowSubmodulesAsTree
- Text.Repository.Skip
- Text.Repository.Tags.OrderByCreatorDate
- Text.Repository.Tags.OrderByName
- Text.Repository.Tags.Sort
- Text.Repository.UseRelativeTimeInHistories
- Text.Repository.ViewLogs
- Text.Repository.Visit
- Text.ResetWithoutCheckout
- Text.ResetWithoutCheckout.MoveTo
- Text.ResetWithoutCheckout.Target
- Text.SetUpstream
- Text.SetUpstream.Local
- Text.SetUpstream.Unset
- Text.SetUpstream.Upstream
- Text.SHALinkCM.NavigateTo
- Text.Stash.AutoRestore
- Text.Stash.AutoRestore.Tip
- Text.StashCM.SaveAsPatch
- Text.Submodule.Deinit
- Text.Submodule.Status
- Text.Submodule.Status.Modified
- Text.Submodule.Status.NotInited
- Text.Submodule.Status.RevisionChanged
- Text.Submodule.Status.Unmerged
- Text.Submodule.URL
- Text.ViewLogs
- Text.ViewLogs.Clear
- Text.ViewLogs.CopyLog
- Text.ViewLogs.Delete
- Text.WorkingCopy.CommitToEdit
- Text.WorkingCopy.ConfirmCommitWithFilter
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
- Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts
- Text.WorkingCopy.Conflicts.UseMine
- Text.WorkingCopy.Conflicts.UseTheirs
- Text.WorkingCopy.ResetAuthor
- Text.WorkingCopy.SignOff
</details>
### ![ru__RU](https://img.shields.io/badge/ru__RU-99.75%25-yellow)
<details>
<summary>Missing keys in ru_RU.axaml</summary>
- Text.Checkout.WithFastForward
- Text.Checkout.WithFastForward.Upstream
</details>
### ![ta__IN](https://img.shields.io/badge/ta__IN-91.91%25-yellow)
<details>
<summary>Missing keys in ta_IN.axaml</summary>
- Text.Avatar.Load
- Text.Bisect
- Text.Bisect.Abort
- Text.Bisect.Bad
- Text.Bisect.Detecting
- Text.Bisect.Good
- Text.Bisect.Skip
- Text.Bisect.WaitingForRange
- Text.BranchCM.CompareWithCurrent
- Text.BranchCM.ResetToSelectedCommit
- Text.Checkout.RecurseSubmodules
- Text.Checkout.WithFastForward
- Text.Checkout.WithFastForward.Upstream
- Text.CommitCM.CopyAuthor
- Text.CommitCM.CopyCommitter
- Text.CommitCM.CopySubject
- Text.CommitDetail.Changes.Count
- Text.CommitMessageTextBox.SubjectCount
- Text.Configure.Git.PreferredMergeMode
- Text.ConfirmEmptyCommit.Continue
- Text.ConfirmEmptyCommit.NoLocalChanges
- Text.ConfirmEmptyCommit.StageAllThenCommit
- Text.ConfirmEmptyCommit.WithLocalChanges
- Text.CreateBranch.OverwriteExisting
- Text.DeinitSubmodule
- Text.DeinitSubmodule.Force
- Text.DeinitSubmodule.Path
- Text.Diff.Submodule.Deleted
- Text.GitFlow.FinishWithPush
- Text.GitFlow.FinishWithSquash
- Text.Hotkeys.Global.SwitchWorkspace
- Text.Hotkeys.Global.SwitchTab
- Text.Hotkeys.TextEditor.OpenExternalMergeTool
- Text.Launcher.Workspaces
- Text.Launcher.Pages
- Text.Preferences.Git.IgnoreCRAtEOLInDiff
- Text.Pull.RecurseSubmodules
- Text.Repository.BranchSort
- Text.Repository.BranchSort.ByCommitterDate
- Text.Repository.BranchSort.ByName
- Text.Repository.ClearStashes
- Text.Repository.Search.ByContent
- Text.Repository.ShowSubmodulesAsTree
- Text.Repository.ViewLogs
- Text.Repository.Visit
- Text.ResetWithoutCheckout
- Text.ResetWithoutCheckout.MoveTo
- Text.ResetWithoutCheckout.Target
- Text.Submodule.Deinit
- Text.Submodule.Status
- Text.Submodule.Status.Modified
- Text.Submodule.Status.NotInited
- Text.Submodule.Status.RevisionChanged
- Text.Submodule.Status.Unmerged
- Text.Submodule.URL
- Text.UpdateSubmodules.Target
- Text.ViewLogs
- Text.ViewLogs.Clear
- Text.ViewLogs.CopyLog
- Text.ViewLogs.Delete
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
- Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts
- Text.WorkingCopy.Conflicts.UseMine
- Text.WorkingCopy.Conflicts.UseTheirs
- Text.WorkingCopy.ResetAuthor
</details>
### ![uk__UA](https://img.shields.io/badge/uk__UA-93.15%25-yellow)
<details>
<summary>Missing keys in uk_UA.axaml</summary>
- Text.Avatar.Load
- Text.Bisect
- Text.Bisect.Abort
- Text.Bisect.Bad
- Text.Bisect.Detecting
- Text.Bisect.Good
- Text.Bisect.Skip
- Text.Bisect.WaitingForRange
- Text.BranchCM.ResetToSelectedCommit
- Text.Checkout.RecurseSubmodules
- Text.Checkout.WithFastForward
- Text.Checkout.WithFastForward.Upstream
- Text.CommitCM.CopyAuthor
- Text.CommitCM.CopyCommitter
- Text.CommitCM.CopySubject
- Text.CommitDetail.Changes.Count
- Text.CommitMessageTextBox.SubjectCount
- Text.ConfigureWorkspace.Name
- Text.CreateBranch.OverwriteExisting
- Text.DeinitSubmodule
- Text.DeinitSubmodule.Force
- Text.DeinitSubmodule.Path
- Text.Diff.Submodule.Deleted
- Text.GitFlow.FinishWithPush
- Text.GitFlow.FinishWithSquash
- Text.Hotkeys.Global.SwitchWorkspace
- Text.Hotkeys.Global.SwitchTab
- Text.Hotkeys.TextEditor.OpenExternalMergeTool
- Text.Launcher.Workspaces
- Text.Launcher.Pages
- Text.Preferences.Git.IgnoreCRAtEOLInDiff
- Text.Pull.RecurseSubmodules
- Text.Repository.BranchSort
- Text.Repository.BranchSort.ByCommitterDate
- Text.Repository.BranchSort.ByName
- Text.Repository.ClearStashes
- Text.Repository.Search.ByContent
- Text.Repository.ShowSubmodulesAsTree
- Text.Repository.ViewLogs
- Text.Repository.Visit
- Text.ResetWithoutCheckout
- Text.ResetWithoutCheckout.MoveTo
- Text.ResetWithoutCheckout.Target
- Text.Submodule.Deinit
- Text.Submodule.Status
- Text.Submodule.Status.Modified
- Text.Submodule.Status.NotInited
- Text.Submodule.Status.RevisionChanged
- Text.Submodule.Status.Unmerged
- Text.Submodule.URL
- Text.ViewLogs
- Text.ViewLogs.Clear
- Text.ViewLogs.CopyLog
- Text.ViewLogs.Delete
- Text.WorkingCopy.ResetAuthor
</details>
### ![zh__CN](https://img.shields.io/badge/zh__CN-%E2%88%9A-brightgreen)
### ![zh__TW](https://img.shields.io/badge/zh__TW-%E2%88%9A-brightgreen)

1
VERSION Normal file
View file

@ -0,0 +1 @@
2025.22

15
build/README.md Normal file
View file

@ -0,0 +1,15 @@
# build
> [!WARNING]
> The files under the `build` folder is used for `Github Action` only, **NOT** for end users.
## How to build this project manually
1. Make sure [.NET SDK 9](https://dotnet.microsoft.com/en-us/download) is installed on your machine.
2. Clone this project
3. Run the follow command under the project root dir
```sh
dotnet publish -c Release -r $RUNTIME_IDENTIFIER -o $DESTINATION_FOLDER src/SourceGit.csproj
```
> [!NOTE]
> Please replace the `$RUNTIME_IDENTIFIER` with one of `win-x64`,`win-arm64`,`linux-x64`,`linux-arm64`,`osx-x64`,`osx-arm64`, and replace the `$DESTINATION_FOLDER` with the real path that will store the output executable files.

View file

@ -0,0 +1,9 @@
[Desktop Entry]
Name=SourceGit
Comment=Open-source & Free Git GUI Client
Exec=/opt/sourcegit/sourcegit
Icon=/usr/share/icons/sourcegit.png
Terminal=false
Type=Application
Categories=Development
MimeType=inode/directory;

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIconFile</key>
<string>App.icns</string>
<key>CFBundleIdentifier</key>
<string>com.sourcegit-scm.sourcegit</string>
<key>CFBundleName</key>
<string>SourceGit</string>
<key>CFBundleVersion</key>
<string>SOURCE_GIT_VERSION.0</string>
<key>LSMinimumSystemVersion</key>
<string>11.0</string>
<key>CFBundleExecutable</key>
<string>SourceGit</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>SOURCE_GIT_VERSION</string>
<key>NSHighResolutionCapable</key>
<true/>
</dict>
</plist>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>com.sourcegit_scm.SourceGit</id>
<metadata_license>MIT</metadata_license>
<project_license>MIT</project_license>
<name>SourceGit</name>
<summary>Open-source GUI client for git users</summary>
<description>
<p>Open-source GUI client for git users</p>
</description>
<url type="homepage">https://github.com/sourcegit-scm/sourcegit</url>
<launchable type="desktop-id">com.sourcegit_scm.SourceGit.desktop</launchable>
<provides>
<id>com.sourcegit_scm.SourceGit.desktop</id>
</provides>
</component>

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View file

@ -0,0 +1,8 @@
Package: sourcegit
Version: 2025.10
Priority: optional
Depends: libx11-6, libice6, libsm6, libicu | libicu76 | libicu74 | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, xdg-utils
Architecture: amd64
Installed-Size: 60440
Maintainer: longshuang@msn.cn
Description: Open-source & Free Git GUI Client

View file

@ -0,0 +1,32 @@
#!/bin/sh
set -e
# summary of how this script can be called:
# * <new-preinst> `install'
# * <new-preinst> `install' <old-version>
# * <new-preinst> `upgrade' <old-version>
# * <old-preinst> `abort-upgrade' <new-version>
# for details, see http://www.debian.org/doc/debian-policy/
case "$1" in
install|upgrade)
# Check if SourceGit is running and stop it
if pgrep -f '/opt/sourcegit/sourcegit' > /dev/null; then
echo "Stopping running SourceGit instance..."
pkill -f '/opt/sourcegit/sourcegit' || true
# Give the process a moment to terminate
sleep 1
fi
;;
abort-upgrade)
;;
*)
echo "preinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
exit 0

View file

@ -0,0 +1,35 @@
#!/bin/sh
set -e
# summary of how this script can be called:
# * <prerm> `remove'
# * <old-prerm> `upgrade' <new-version>
# * <new-prerm> `failed-upgrade' <old-version>
# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
# * <deconfigured's-prerm> `deconfigure' `in-favour'
# <package-being-installed> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
case "$1" in
remove|upgrade|deconfigure)
if pgrep -f '/opt/sourcegit/sourcegit' > /dev/null; then
echo "Stopping running SourceGit instance..."
pkill -f '/opt/sourcegit/sourcegit' || true
# Give the process a moment to terminate
sleep 1
fi
;;
failed-upgrade)
;;
*)
echo "prerm called with unknown argument \`$1'" >&2
exit 1
;;
esac
exit 0

View file

@ -0,0 +1,38 @@
Name: sourcegit
Version: %_version
Release: 1
Summary: Open-source & Free Git Gui Client
License: MIT
URL: https://sourcegit-scm.github.io/
Source: https://github.com/sourcegit-scm/sourcegit/archive/refs/tags/v%_version.tar.gz
Requires: libX11.so.6()(%{__isa_bits}bit)
Requires: libSM.so.6()(%{__isa_bits}bit)
Requires: libicu
Requires: xdg-utils
%define _build_id_links none
%description
Open-source & Free Git Gui Client
%install
mkdir -p %{buildroot}/opt/sourcegit
mkdir -p %{buildroot}/%{_bindir}
mkdir -p %{buildroot}/usr/share/applications
mkdir -p %{buildroot}/usr/share/icons
cp -f ../../../SourceGit/* %{buildroot}/opt/sourcegit/
ln -rsf %{buildroot}/opt/sourcegit/sourcegit %{buildroot}/%{_bindir}
cp -r ../../_common/applications %{buildroot}/%{_datadir}
cp -r ../../_common/icons %{buildroot}/%{_datadir}
chmod 755 -R %{buildroot}/opt/sourcegit
chmod 755 %{buildroot}/%{_datadir}/applications/sourcegit.desktop
%files
%dir /opt/sourcegit/
/opt/sourcegit/*
/usr/share/applications/sourcegit.desktop
/usr/share/icons/*
%{_bindir}/sourcegit
%changelog
# skip

View file

@ -0,0 +1,83 @@
const fs = require('fs-extra');
const path = require('path');
const xml2js = require('xml2js');
const repoRoot = path.join(__dirname, '../../');
const localesDir = path.join(repoRoot, 'src/Resources/Locales');
const enUSFile = path.join(localesDir, 'en_US.axaml');
const outputFile = path.join(repoRoot, 'TRANSLATION.md');
const parser = new xml2js.Parser();
async function parseXml(filePath) {
const data = await fs.readFile(filePath);
return parser.parseStringPromise(data);
}
async function filterAndSortTranslations(localeData, enUSKeys, enUSData) {
const strings = localeData.ResourceDictionary['x:String'];
// Remove keys that don't exist in English file
const filtered = strings.filter(item => enUSKeys.has(item.$['x:Key']));
// Sort based on the key order in English file
const enUSKeysArray = enUSData.ResourceDictionary['x:String'].map(item => item.$['x:Key']);
filtered.sort((a, b) => {
const aIndex = enUSKeysArray.indexOf(a.$['x:Key']);
const bIndex = enUSKeysArray.indexOf(b.$['x:Key']);
return aIndex - bIndex;
});
return filtered;
}
async function calculateTranslationRate() {
const enUSData = await parseXml(enUSFile);
const enUSKeys = new Set(enUSData.ResourceDictionary['x:String'].map(item => item.$['x:Key']));
const files = (await fs.readdir(localesDir)).filter(file => file !== 'en_US.axaml' && file.endsWith('.axaml'));
const lines = [];
lines.push('# Translation Status');
lines.push('This document shows the translation status of each locale file in the repository.');
lines.push(`## Details`);
lines.push(`### ![en_US](https://img.shields.io/badge/en__US-%E2%88%9A-brightgreen)`);
for (const file of files) {
const locale = file.replace('.axaml', '').replace('_', '__');
const filePath = path.join(localesDir, file);
const localeData = await parseXml(filePath);
const localeKeys = new Set(localeData.ResourceDictionary['x:String'].map(item => item.$['x:Key']));
const missingKeys = [...enUSKeys].filter(key => !localeKeys.has(key));
// Sort and clean up extra translations
const sortedAndCleaned = await filterAndSortTranslations(localeData, enUSKeys, enUSData);
localeData.ResourceDictionary['x:String'] = sortedAndCleaned;
// Save the updated file
const builder = new xml2js.Builder({
headless: true,
renderOpts: { pretty: true, indent: ' ' }
});
let xmlStr = builder.buildObject(localeData);
// Add an empty line before the first x:String
xmlStr = xmlStr.replace(' <x:String', '\n <x:String');
await fs.writeFile(filePath, xmlStr + '\n', 'utf8');
if (missingKeys.length > 0) {
const progress = ((enUSKeys.size - missingKeys.length) / enUSKeys.size) * 100;
const badgeColor = progress >= 75 ? 'yellow' : 'red';
lines.push(`### ![${locale}](https://img.shields.io/badge/${locale}-${progress.toFixed(2)}%25-${badgeColor})`);
lines.push(`<details>\n<summary>Missing keys in ${file}</summary>\n\n${missingKeys.map(key => `- ${key}`).join('\n')}\n\n</details>`)
} else {
lines.push(`### ![${locale}](https://img.shields.io/badge/${locale}-%E2%88%9A-brightgreen)`);
}
}
const content = lines.join('\n\n');
console.log(content);
await fs.writeFile(outputFile, content, 'utf8');
}
calculateTranslationRate().catch(err => console.error(err));

70
build/scripts/package.linux.sh Executable file
View file

@ -0,0 +1,70 @@
#!/usr/bin/env bash
set -e
set -o
set -u
set pipefail
arch=
appimage_arch=
target=
case "$RUNTIME" in
linux-x64)
arch=amd64
appimage_arch=x86_64
target=x86_64;;
linux-arm64)
arch=arm64
appimage_arch=arm_aarch64
target=aarch64;;
*)
echo "Unknown runtime $RUNTIME"
exit 1;;
esac
APPIMAGETOOL_URL=https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
cd build
if [[ ! -f "appimagetool" ]]; then
curl -o appimagetool -L "$APPIMAGETOOL_URL"
chmod +x appimagetool
fi
rm -f SourceGit/*.dbg
mkdir -p SourceGit.AppDir/opt
mkdir -p SourceGit.AppDir/usr/share/metainfo
mkdir -p SourceGit.AppDir/usr/share/applications
cp -r SourceGit SourceGit.AppDir/opt/sourcegit
desktop-file-install resources/_common/applications/sourcegit.desktop --dir SourceGit.AppDir/usr/share/applications \
--set-icon com.sourcegit_scm.SourceGit --set-key=Exec --set-value=AppRun
mv SourceGit.AppDir/usr/share/applications/{sourcegit,com.sourcegit_scm.SourceGit}.desktop
cp resources/appimage/sourcegit.png SourceGit.AppDir/com.sourcegit_scm.SourceGit.png
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"
mkdir -p resources/deb/opt/sourcegit/
mkdir -p resources/deb/usr/bin
mkdir -p resources/deb/usr/share/applications
mkdir -p resources/deb/usr/share/icons
cp -f SourceGit/* resources/deb/opt/sourcegit
ln -rsf resources/deb/opt/sourcegit/sourcegit resources/deb/usr/bin
cp -r resources/_common/applications resources/deb/usr/share
cp -r resources/_common/icons resources/deb/usr/share
# Calculate installed size in KB
installed_size=$(du -sk resources/deb | cut -f1)
# Update the control file
sed -i -e "s/^Version:.*/Version: $VERSION/" \
-e "s/^Architecture:.*/Architecture: $arch/" \
-e "s/^Installed-Size:.*/Installed-Size: $installed_size/" \
resources/deb/DEBIAN/control
# Build deb package with gzip compression
dpkg-deb -Zgzip --root-owner-group --build resources/deb "sourcegit_$VERSION-1_$arch.deb"
rpmbuild -bb --target="$target" resources/rpm/SPECS/build.spec --define "_topdir $(pwd)/resources/rpm" --define "_version $VERSION"
mv "resources/rpm/RPMS/$target/sourcegit-$VERSION-1.$target.rpm" ./

View file

@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -e
set -o
set -u
set pipefail
cd build
mkdir -p SourceGit.app/Contents/Resources
mv SourceGit SourceGit.app/Contents/MacOS
cp resources/app/App.icns SourceGit.app/Contents/Resources/App.icns
sed "s/SOURCE_GIT_VERSION/$VERSION/g" resources/app/App.plist > SourceGit.app/Contents/Info.plist
rm -rf SourceGit.app/Contents/MacOS/SourceGit.dsym
zip "sourcegit_$VERSION.$RUNTIME.zip" -r SourceGit.app

View file

@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -e
set -o
set -u
set pipefail
cd build
rm -rf SourceGit/*.pdb
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" || "$OSTYPE" == "win32" ]]; then
powershell -Command "Compress-Archive -Path SourceGit -DestinationPath \"sourcegit_$VERSION.$RUNTIME.zip\" -Force"
else
zip "sourcegit_$VERSION.$RUNTIME.zip" -r SourceGit
fi

7
global.json Normal file
View file

@ -0,0 +1,7 @@
{
"sdk": {
"version": "9.0.0",
"rollForward": "latestMajor",
"allowPrerelease": false
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 KiB

After

Width:  |  Height:  |  Size: 804 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 KiB

After

Width:  |  Height:  |  Size: 712 KiB

Before After
Before After

58
src/App.Commands.cs Normal file
View file

@ -0,0 +1,58 @@
using System;
using System.Windows.Input;
using Avalonia.Controls;
namespace SourceGit
{
public partial class App
{
public class Command : ICommand
{
public event EventHandler CanExecuteChanged
{
add { }
remove { }
}
public Command(Action<object> action)
{
_action = action;
}
public bool CanExecute(object parameter) => _action != null;
public void Execute(object parameter) => _action?.Invoke(parameter);
private Action<object> _action = null;
}
public static bool IsCheckForUpdateCommandVisible
{
get
{
#if DISABLE_UPDATE_DETECTION
return false;
#else
return true;
#endif
}
}
public static readonly Command OpenPreferencesCommand = new Command(_ => ShowWindow(new Views.Preferences(), false));
public static readonly Command OpenHotkeysCommand = new Command(_ => ShowWindow(new Views.Hotkeys(), false));
public static readonly Command OpenAppDataDirCommand = new Command(_ => Native.OS.OpenInFileManager(Native.OS.DataDir));
public static readonly Command OpenAboutCommand = new Command(_ => ShowWindow(new Views.About(), false));
public static readonly Command CheckForUpdateCommand = new Command(_ => (Current as App)?.Check4Update(true));
public static readonly Command QuitCommand = new Command(_ => Quit(0));
public static readonly Command CopyTextBlockCommand = new Command(p =>
{
var textBlock = p as TextBlock;
if (textBlock == null)
return;
if (textBlock.Inlines is { Count: > 0 } inlines)
CopyText(inlines.Text);
else if (!string.IsNullOrEmpty(textBlock.Text))
CopyText(textBlock.Text);
});
}
}

54
src/App.JsonCodeGen.cs Normal file
View file

@ -0,0 +1,54 @@
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
using Avalonia.Controls;
using Avalonia.Media;
namespace SourceGit
{
public class ColorConverter : JsonConverter<Color>
{
public override Color Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return Color.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, Color value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}
public class GridLengthConverter : JsonConverter<GridLength>
{
public override GridLength Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var size = reader.GetDouble();
return new GridLength(size, GridUnitType.Pixel);
}
public override void Write(Utf8JsonWriter writer, GridLength value, JsonSerializerOptions options)
{
writer.WriteNumberValue(value.Value);
}
}
[JsonSourceGenerationOptions(
WriteIndented = true,
IgnoreReadOnlyFields = true,
IgnoreReadOnlyProperties = true,
Converters = [
typeof(ColorConverter),
typeof(GridLengthConverter),
]
)]
[JsonSerializable(typeof(Models.ExternalToolPaths))]
[JsonSerializable(typeof(Models.InteractiveRebaseJobCollection))]
[JsonSerializable(typeof(Models.JetBrainsState))]
[JsonSerializable(typeof(Models.ThemeOverrides))]
[JsonSerializable(typeof(Models.Version))]
[JsonSerializable(typeof(Models.RepositorySettings))]
[JsonSerializable(typeof(ViewModels.Preferences))]
internal partial class JsonCodeGen : JsonSerializerContext { }
}

View file

@ -1,25 +1,47 @@
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="using:SourceGit"
x:Class="SourceGit.App"
Name="SourceGit"
RequestedThemeVariant="Dark">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceInclude Source="/Resources/Fonts.axaml"/>
<ResourceInclude Source="/Resources/Icons.axaml"/>
<ResourceInclude Source="/Resources/Themes.axaml"/>
</ResourceDictionary.MergedDictionaries>
<ResourceInclude x:Key="de_DE" Source="/Resources/Locales/de_DE.axaml"/>
<ResourceInclude x:Key="en_US" Source="/Resources/Locales/en_US.axaml"/>
<ResourceInclude x:Key="fr_FR" Source="/Resources/Locales/fr_FR.axaml"/>
<ResourceInclude x:Key="it_IT" Source="/Resources/Locales/it_IT.axaml"/>
<ResourceInclude x:Key="pt_BR" Source="/Resources/Locales/pt_BR.axaml"/>
<ResourceInclude x:Key="uk_UA" Source="/Resources/Locales/uk_UA.axaml"/>
<ResourceInclude x:Key="ru_RU" Source="/Resources/Locales/ru_RU.axaml"/>
<ResourceInclude x:Key="zh_CN" Source="/Resources/Locales/zh_CN.axaml"/>
<ResourceInclude x:Key="zh_TW" Source="/Resources/Locales/zh_TW.axaml"/>
<ResourceInclude x:Key="es_ES" Source="/Resources/Locales/es_ES.axaml"/>
<ResourceInclude x:Key="ja_JP" Source="/Resources/Locales/ja_JP.axaml"/>
<ResourceInclude x:Key="ta_IN" Source="/Resources/Locales/ta_IN.axaml"/>
</ResourceDictionary>
</Application.Resources>
<Application.Styles>
<FluentTheme />
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/>
<StyleInclude Source="avares://AvaloniaEdit/Themes/Fluent/AvaloniaEdit.xaml" />
<StyleInclude Source="/Resources/Styles.axaml"/>
</Application.Styles>
<NativeMenu.Menu>
<NativeMenu>
<NativeMenuItem Header="{DynamicResource Text.About.Menu}" Command="{x:Static s:App.OpenAboutCommand}"/>
<NativeMenuItem Header="{DynamicResource Text.Hotkeys}" Command="{x:Static s:App.OpenHotkeysCommand}" Gesture="F1"/>
<NativeMenuItem Header="{DynamicResource Text.SelfUpdate}" Command="{x:Static s:App.CheckForUpdateCommand}" IsVisible="{x:Static s:App.IsCheckForUpdateCommandVisible}"/>
<NativeMenuItemSeparator/>
<NativeMenuItem Header="{DynamicResource Text.Preferences}" Command="{x:Static s:App.OpenPreferencesCommand}" Gesture="⌘+,"/>
<NativeMenuItem Header="{DynamicResource Text.OpenAppDataDir}" Command="{x:Static s:App.OpenAppDataDirCommand}"/>
<NativeMenuItemSeparator/>
<NativeMenuItem Header="{DynamicResource Text.Quit}" Command="{x:Static s:App.QuitCommand}" Gesture="⌘+Q"/>
</NativeMenu>
</NativeMenu.Menu>
</Application>

View file

@ -1,159 +1,706 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Data.Core.Plugins;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using Avalonia.Media.Fonts;
using Avalonia.Platform.Storage;
using Avalonia.Styling;
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Text;
namespace SourceGit {
public partial class App : Application {
using Avalonia.Threading;
namespace SourceGit
{
public partial class App : Application
{
#region App Entry Point
[STAThread]
public static void Main(string[] args) {
try {
public static void Main(string[] args)
{
Native.OS.SetupDataDir();
AppDomain.CurrentDomain.UnhandledException += (_, e) =>
{
LogException(e.ExceptionObject as Exception);
};
TaskScheduler.UnobservedTaskException += (_, e) =>
{
e.SetObserved();
};
try
{
if (TryLaunchAsRebaseTodoEditor(args, out int exitTodo))
Environment.Exit(exitTodo);
else if (TryLaunchAsRebaseMessageEditor(args, out int exitMessage))
Environment.Exit(exitMessage);
else
BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
} catch (Exception ex) {
var builder = new StringBuilder();
builder.Append("Crash: ");
builder.Append(ex.Message);
builder.Append("\n\n");
builder.Append("----------------------------\n");
builder.Append($"Version: {Assembly.GetExecutingAssembly().GetName().Version}\n");
builder.Append($"OS: {Environment.OSVersion.ToString()}\n");
builder.Append($"Framework: {AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName}\n");
builder.Append($"Source: {ex.Source}\n");
builder.Append($"---------------------------\n\n");
builder.Append(ex.StackTrace);
var time = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
var file = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"SourceGit",
$"crash_{time}.log");
File.WriteAllText(file, builder.ToString());
}
catch (Exception ex)
{
LogException(ex);
}
}
public static AppBuilder BuildAvaloniaApp() {
public static AppBuilder BuildAvaloniaApp()
{
var builder = AppBuilder.Configure<App>();
builder.UsePlatformDetect();
if (OperatingSystem.IsWindows()) {
builder.With(new FontManagerOptions() {
FontFallbacks = [
new FontFallback { FontFamily = new FontFamily("Microsoft YaHei UI") }
]
});
} else if (OperatingSystem.IsMacOS()) {
builder.With(new FontManagerOptions() {
FontFallbacks = [
new FontFallback { FontFamily = new FontFamily("PingFang SC") }
]
});
builder.With(new MacOSPlatformOptions() {
DisableDefaultApplicationMenuItems = true,
DisableNativeMenus = true,
});
}
builder.LogToTrace();
builder.WithInterFont();
builder.With(new FontManagerOptions()
{
DefaultFamilyName = "fonts:Inter#Inter"
});
builder.ConfigureFonts(manager =>
{
var monospace = new EmbeddedFontCollection(
new Uri("fonts:SourceGit", UriKind.Absolute),
new Uri("avares://SourceGit/Resources/Fonts", UriKind.Absolute));
manager.AddFontCollection(monospace);
});
Native.OS.SetupApp(builder);
return builder;
}
public static void RaiseException(string context, string message) {
if (Current is App app && app._notificationReceiver != null) {
var ctx = context.Replace('\\', '/');
var notice = new Models.Notification() { IsError = true, Message = message };
app._notificationReceiver.OnReceiveNotification(ctx, notice);
}
}
public static void LogException(Exception ex)
{
if (ex == null)
return;
public static void SendNotification(string context, string message) {
if (Current is App app && app._notificationReceiver != null) {
var ctx = context.Replace('\\', '/');
var notice = new Models.Notification() { IsError = false, Message = message };
app._notificationReceiver.OnReceiveNotification(ctx, notice);
}
}
var builder = new StringBuilder();
builder.Append($"Crash::: {ex.GetType().FullName}: {ex.Message}\n\n");
builder.Append("----------------------------\n");
builder.Append($"Version: {Assembly.GetExecutingAssembly().GetName().Version}\n");
builder.Append($"OS: {Environment.OSVersion}\n");
builder.Append($"Framework: {AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName}\n");
builder.Append($"Source: {ex.Source}\n");
builder.Append($"Thread Name: {Thread.CurrentThread.Name ?? "Unnamed"}\n");
builder.Append($"User: {Environment.UserName}\n");
builder.Append($"App Start Time: {Process.GetCurrentProcess().StartTime}\n");
builder.Append($"Exception Time: {DateTime.Now}\n");
builder.Append($"Memory Usage: {Process.GetCurrentProcess().PrivateMemorySize64 / 1024 / 1024} MB\n");
builder.Append($"---------------------------\n\n");
builder.Append(ex);
public static void SetLocale(string localeKey) {
var app = Current as App;
var targetLocale = app.Resources[localeKey] as ResourceDictionary;
if (targetLocale == null || targetLocale == app._activeLocale) {
var time = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
var file = Path.Combine(Native.OS.DataDir, $"crash_{time}.log");
File.WriteAllText(file, builder.ToString());
}
#endregion
#region Utility Functions
public static void ShowWindow(object data, bool showAsDialog)
{
var impl = (Views.ChromelessWindow target, bool isDialog) =>
{
if (Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime { MainWindow: { } owner })
{
if (isDialog)
target.ShowDialog(owner);
else
target.Show(owner);
}
else
{
target.Show();
}
};
if (data is Views.ChromelessWindow window)
{
impl(window, showAsDialog);
return;
}
if (app._activeLocale != null) {
app.Resources.MergedDictionaries.Remove(app._activeLocale);
var dataTypeName = data.GetType().FullName;
if (string.IsNullOrEmpty(dataTypeName) || !dataTypeName.Contains(".ViewModels.", StringComparison.Ordinal))
return;
var viewTypeName = dataTypeName.Replace(".ViewModels.", ".Views.");
var viewType = Type.GetType(viewTypeName);
if (viewType == null || !viewType.IsSubclassOf(typeof(Views.ChromelessWindow)))
return;
window = Activator.CreateInstance(viewType) as Views.ChromelessWindow;
if (window != null)
{
window.DataContext = data;
impl(window, showAsDialog);
}
}
public static void RaiseException(string context, string message)
{
if (Current is App app && app._launcher != null)
app._launcher.DispatchNotification(context, message, true);
}
public static void SendNotification(string context, string message)
{
if (Current is App app && app._launcher != null)
app._launcher.DispatchNotification(context, message, false);
}
public static void SetLocale(string localeKey)
{
var app = Current as App;
if (app == null)
return;
var targetLocale = app.Resources[localeKey] as ResourceDictionary;
if (targetLocale == null || targetLocale == app._activeLocale)
return;
if (app._activeLocale != null)
app.Resources.MergedDictionaries.Remove(app._activeLocale);
app.Resources.MergedDictionaries.Add(targetLocale);
app._activeLocale = targetLocale;
}
public static void SetTheme(string theme) {
if (theme.Equals("Light", StringComparison.OrdinalIgnoreCase)) {
App.Current.RequestedThemeVariant = ThemeVariant.Light;
} else if (theme.Equals("Dark", StringComparison.OrdinalIgnoreCase)) {
App.Current.RequestedThemeVariant = ThemeVariant.Dark;
} else {
App.Current.RequestedThemeVariant = ThemeVariant.Default;
public static void SetTheme(string theme, string themeOverridesFile)
{
var app = Current as App;
if (app == null)
return;
if (theme.Equals("Light", StringComparison.OrdinalIgnoreCase))
app.RequestedThemeVariant = ThemeVariant.Light;
else if (theme.Equals("Dark", StringComparison.OrdinalIgnoreCase))
app.RequestedThemeVariant = ThemeVariant.Dark;
else
app.RequestedThemeVariant = ThemeVariant.Default;
if (app._themeOverrides != null)
{
app.Resources.MergedDictionaries.Remove(app._themeOverrides);
app._themeOverrides = null;
}
if (!string.IsNullOrEmpty(themeOverridesFile) && File.Exists(themeOverridesFile))
{
try
{
var resDic = new ResourceDictionary();
var overrides = JsonSerializer.Deserialize(File.ReadAllText(themeOverridesFile), JsonCodeGen.Default.ThemeOverrides);
foreach (var kv in overrides.BasicColors)
{
if (kv.Key.Equals("SystemAccentColor", StringComparison.Ordinal))
resDic["SystemAccentColor"] = kv.Value;
else
resDic[$"Color.{kv.Key}"] = kv.Value;
}
if (overrides.GraphColors.Count > 0)
Models.CommitGraph.SetPens(overrides.GraphColors, overrides.GraphPenThickness);
else
Models.CommitGraph.SetDefaultPens(overrides.GraphPenThickness);
Models.Commit.OpacityForNotMerged = overrides.OpacityForNotMergedCommits;
app.Resources.MergedDictionaries.Add(resDic);
app._themeOverrides = resDic;
}
catch
{
// ignore
}
}
else
{
Models.CommitGraph.SetDefaultPens();
}
}
public static async void CopyText(string data) {
if (Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) {
if (desktop.MainWindow.Clipboard is { } clipbord) {
await clipbord.SetTextAsync(data);
public static void SetFonts(string defaultFont, string monospaceFont, bool onlyUseMonospaceFontInEditor)
{
var app = Current as App;
if (app == null)
return;
if (app._fontsOverrides != null)
{
app.Resources.MergedDictionaries.Remove(app._fontsOverrides);
app._fontsOverrides = null;
}
defaultFont = app.FixFontFamilyName(defaultFont);
monospaceFont = app.FixFontFamilyName(monospaceFont);
var resDic = new ResourceDictionary();
if (!string.IsNullOrEmpty(defaultFont))
resDic.Add("Fonts.Default", new FontFamily(defaultFont));
if (string.IsNullOrEmpty(monospaceFont))
{
if (!string.IsNullOrEmpty(defaultFont))
{
monospaceFont = $"fonts:SourceGit#JetBrains Mono,{defaultFont}";
resDic.Add("Fonts.Monospace", new FontFamily(monospaceFont));
}
}
else
{
if (!string.IsNullOrEmpty(defaultFont) && !monospaceFont.Contains(defaultFont, StringComparison.Ordinal))
monospaceFont = $"{monospaceFont},{defaultFont}";
resDic.Add("Fonts.Monospace", new FontFamily(monospaceFont));
}
if (onlyUseMonospaceFontInEditor)
{
if (string.IsNullOrEmpty(defaultFont))
resDic.Add("Fonts.Primary", new FontFamily("fonts:Inter#Inter"));
else
resDic.Add("Fonts.Primary", new FontFamily(defaultFont));
}
else
{
if (!string.IsNullOrEmpty(monospaceFont))
resDic.Add("Fonts.Primary", new FontFamily(monospaceFont));
}
if (resDic.Count > 0)
{
app.Resources.MergedDictionaries.Add(resDic);
app._fontsOverrides = resDic;
}
}
public static string Text(string key, params object[] args) {
var fmt = Current.FindResource($"Text.{key}") as string;
if (string.IsNullOrWhiteSpace(fmt)) return $"Text.{key}";
return string.Format(fmt, args);
public static async void CopyText(string data)
{
if (Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
if (desktop.MainWindow?.Clipboard is { } clipboard)
await clipboard.SetTextAsync(data ?? "");
}
}
public static TopLevel GetTopLevel() {
if (Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) {
return desktop.MainWindow;
public static async Task<string> GetClipboardTextAsync()
{
if (Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
if (desktop.MainWindow?.Clipboard is { } clipboard)
{
return await clipboard.GetTextAsync();
}
}
return null;
}
public static void Quit() {
if (Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) {
desktop.MainWindow.Close();
desktop.Shutdown();
}
public static string Text(string key, params object[] args)
{
var fmt = Current?.FindResource($"Text.{key}") as string;
if (string.IsNullOrWhiteSpace(fmt))
return $"Text.{key}";
if (args == null || args.Length == 0)
return fmt;
return string.Format(fmt, args);
}
public override void Initialize() {
public static Avalonia.Controls.Shapes.Path CreateMenuIcon(string key)
{
var icon = new Avalonia.Controls.Shapes.Path();
icon.Width = 12;
icon.Height = 12;
icon.Stretch = Stretch.Uniform;
if (Current?.FindResource(key) is StreamGeometry geo)
icon.Data = geo;
return icon;
}
public static IStorageProvider GetStorageProvider()
{
if (Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
return desktop.MainWindow?.StorageProvider;
return null;
}
public static ViewModels.Launcher GetLauncher()
{
return Current is App app ? app._launcher : null;
}
public static void Quit(int exitCode)
{
if (Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow?.Close();
desktop.Shutdown(exitCode);
}
else
{
Environment.Exit(exitCode);
}
}
#endregion
#region Overrides
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
SetLocale(ViewModels.Preference.Instance.Locale);
SetTheme(ViewModels.Preference.Instance.Theme);
var pref = ViewModels.Preferences.Instance;
pref.PropertyChanged += (_, _) => pref.Save();
SetLocale(pref.Locale);
SetTheme(pref.Theme, pref.ThemeOverrides);
SetFonts(pref.DefaultFontFamily, pref.MonospaceFontFamily, pref.OnlyUseMonoFontInEditor);
}
public override void OnFrameworkInitializationCompleted() {
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) {
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
BindingPlugins.DataValidators.RemoveAt(0);
var launcher = new Views.Launcher();
_notificationReceiver = launcher;
desktop.MainWindow = launcher;
// Disable tooltip if window is not active.
ToolTip.ToolTipOpeningEvent.AddClassHandler<Control>((c, e) =>
{
var topLevel = TopLevel.GetTopLevel(c);
if (topLevel is not Window { IsActive: true })
e.Cancel = true;
});
if (TryLaunchAsCoreEditor(desktop))
return;
if (TryLaunchAsAskpass(desktop))
return;
_ipcChannel = new Models.IpcChannel();
if (!_ipcChannel.IsFirstInstance)
{
var arg = desktop.Args is { Length: > 0 } ? desktop.Args[0].Trim() : string.Empty;
if (!string.IsNullOrEmpty(arg))
{
if (arg.StartsWith('"') && arg.EndsWith('"'))
arg = arg.Substring(1, arg.Length - 2).Trim();
if (arg.Length > 0 && !Path.IsPathFullyQualified(arg))
arg = Path.GetFullPath(arg);
}
base.OnFrameworkInitializationCompleted();
_ipcChannel.SendToFirstInstance(arg);
Environment.Exit(0);
}
else
{
_ipcChannel.MessageReceived += TryOpenRepository;
desktop.Exit += (_, _) => _ipcChannel.Dispose();
TryLaunchAsNormal(desktop);
}
}
}
#endregion
private static bool TryLaunchAsRebaseTodoEditor(string[] args, out int exitCode)
{
exitCode = -1;
if (args.Length <= 1 || !args[0].Equals("--rebase-todo-editor", StringComparison.Ordinal))
return false;
var file = args[1];
var filename = Path.GetFileName(file);
if (!filename.Equals("git-rebase-todo", StringComparison.OrdinalIgnoreCase))
return true;
var dirInfo = new DirectoryInfo(Path.GetDirectoryName(file)!);
if (!dirInfo.Exists || !dirInfo.Name.Equals("rebase-merge", StringComparison.Ordinal))
return true;
var jobsFile = Path.Combine(dirInfo.Parent!.FullName, "sourcegit_rebase_jobs.json");
if (!File.Exists(jobsFile))
return true;
var collection = JsonSerializer.Deserialize(File.ReadAllText(jobsFile), JsonCodeGen.Default.InteractiveRebaseJobCollection);
var lines = new List<string>();
foreach (var job in collection.Jobs)
{
switch (job.Action)
{
case Models.InteractiveRebaseAction.Pick:
lines.Add($"p {job.SHA}");
break;
case Models.InteractiveRebaseAction.Edit:
lines.Add($"e {job.SHA}");
break;
case Models.InteractiveRebaseAction.Reword:
lines.Add($"r {job.SHA}");
break;
case Models.InteractiveRebaseAction.Squash:
lines.Add($"s {job.SHA}");
break;
case Models.InteractiveRebaseAction.Fixup:
lines.Add($"f {job.SHA}");
break;
default:
lines.Add($"d {job.SHA}");
break;
}
}
File.WriteAllLines(file, lines);
exitCode = 0;
return true;
}
private static bool TryLaunchAsRebaseMessageEditor(string[] args, out int exitCode)
{
exitCode = -1;
if (args.Length <= 1 || !args[0].Equals("--rebase-message-editor", StringComparison.Ordinal))
return false;
exitCode = 0;
var file = args[1];
var filename = Path.GetFileName(file);
if (!filename.Equals("COMMIT_EDITMSG", StringComparison.OrdinalIgnoreCase))
return true;
var gitDir = Path.GetDirectoryName(file)!;
var origHeadFile = Path.Combine(gitDir, "rebase-merge", "orig-head");
var ontoFile = Path.Combine(gitDir, "rebase-merge", "onto");
var doneFile = Path.Combine(gitDir, "rebase-merge", "done");
var jobsFile = Path.Combine(gitDir, "sourcegit_rebase_jobs.json");
if (!File.Exists(ontoFile) || !File.Exists(origHeadFile) || !File.Exists(doneFile) || !File.Exists(jobsFile))
return true;
var origHead = File.ReadAllText(origHeadFile).Trim();
var onto = File.ReadAllText(ontoFile).Trim();
var collection = JsonSerializer.Deserialize(File.ReadAllText(jobsFile), JsonCodeGen.Default.InteractiveRebaseJobCollection);
if (!collection.Onto.Equals(onto) || !collection.OrigHead.Equals(origHead))
return true;
var done = File.ReadAllText(doneFile).Trim().Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
if (done.Length == 0)
return true;
var current = done[^1].Trim();
var match = REG_REBASE_TODO().Match(current);
if (!match.Success)
return true;
var sha = match.Groups[1].Value;
foreach (var job in collection.Jobs)
{
if (job.SHA.StartsWith(sha))
{
File.WriteAllText(file, job.Message);
break;
}
}
return true;
}
private bool TryLaunchAsCoreEditor(IClassicDesktopStyleApplicationLifetime desktop)
{
var args = desktop.Args;
if (args == null || args.Length <= 1 || !args[0].Equals("--core-editor", StringComparison.Ordinal))
return false;
var file = args[1];
if (!File.Exists(file))
{
desktop.Shutdown(-1);
return true;
}
var editor = new Views.StandaloneCommitMessageEditor();
editor.SetFile(file);
desktop.MainWindow = editor;
return true;
}
private bool TryLaunchAsAskpass(IClassicDesktopStyleApplicationLifetime desktop)
{
var launchAsAskpass = Environment.GetEnvironmentVariable("SOURCEGIT_LAUNCH_AS_ASKPASS");
if (launchAsAskpass is not "TRUE")
return false;
var args = desktop.Args;
if (args?.Length > 0)
{
var askpass = new Views.Askpass();
askpass.TxtDescription.Text = args[0];
desktop.MainWindow = askpass;
return true;
}
return false;
}
private void TryLaunchAsNormal(IClassicDesktopStyleApplicationLifetime desktop)
{
Native.OS.SetupExternalTools();
Models.AvatarManager.Instance.Start();
string startupRepo = null;
if (desktop.Args != null && desktop.Args.Length == 1 && Directory.Exists(desktop.Args[0]))
startupRepo = desktop.Args[0];
var pref = ViewModels.Preferences.Instance;
pref.SetCanModify();
_launcher = new ViewModels.Launcher(startupRepo);
desktop.MainWindow = new Views.Launcher() { DataContext = _launcher };
desktop.ShutdownMode = ShutdownMode.OnMainWindowClose;
#if !DISABLE_UPDATE_DETECTION
if (pref.ShouldCheck4UpdateOnStartup())
Check4Update();
#endif
}
private void TryOpenRepository(string repo)
{
if (!string.IsNullOrEmpty(repo) && Directory.Exists(repo))
{
var test = new Commands.QueryRepositoryRootPath(repo).ReadToEnd();
if (test.IsSuccess && !string.IsNullOrEmpty(test.StdOut))
{
Dispatcher.UIThread.Invoke(() =>
{
var node = ViewModels.Preferences.Instance.FindOrAddNodeByRepositoryPath(test.StdOut.Trim(), null, false);
ViewModels.Welcome.Instance.Refresh();
_launcher?.OpenRepositoryInTab(node, null);
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime { MainWindow: Views.Launcher wnd })
wnd.BringToTop();
});
return;
}
}
Dispatcher.UIThread.Invoke(() =>
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime { MainWindow: Views.Launcher launcher })
launcher.BringToTop();
});
}
private void Check4Update(bool manually = false)
{
Task.Run(async () =>
{
try
{
// Fetch latest release information.
var client = new HttpClient() { Timeout = TimeSpan.FromSeconds(5) };
var data = await client.GetStringAsync("https://sourcegit-scm.github.io/data/version.json");
// Parse JSON into Models.Version.
var ver = JsonSerializer.Deserialize(data, JsonCodeGen.Default.Version);
if (ver == null)
return;
// Check if already up-to-date.
if (!ver.IsNewVersion)
{
if (manually)
ShowSelfUpdateResult(new Models.AlreadyUpToDate());
return;
}
// Should not check ignored tag if this is called manually.
if (!manually)
{
var pref = ViewModels.Preferences.Instance;
if (ver.TagName == pref.IgnoreUpdateTag)
return;
}
ShowSelfUpdateResult(ver);
}
catch (Exception e)
{
if (manually)
ShowSelfUpdateResult(new Models.SelfUpdateFailed(e));
}
});
}
private void ShowSelfUpdateResult(object data)
{
Dispatcher.UIThread.Post(() =>
{
ShowWindow(new ViewModels.SelfUpdate() { Data = data }, true);
});
}
private string FixFontFamilyName(string input)
{
if (string.IsNullOrEmpty(input))
return string.Empty;
var parts = input.Split(',');
var trimmed = new List<string>();
foreach (var part in parts)
{
var t = part.Trim();
if (string.IsNullOrEmpty(t))
continue;
// Collapse multiple spaces into single space
var prevChar = '\0';
var sb = new StringBuilder();
foreach (var c in t)
{
if (c == ' ' && prevChar == ' ')
continue;
sb.Append(c);
prevChar = c;
}
var name = sb.ToString();
if (name.Contains('#', StringComparison.Ordinal))
{
if (!name.Equals("fonts:Inter#Inter", StringComparison.Ordinal) &&
!name.Equals("fonts:SourceGit#JetBrains Mono", StringComparison.Ordinal))
continue;
}
trimmed.Add(name);
}
return trimmed.Count > 0 ? string.Join(',', trimmed) : string.Empty;
}
[GeneratedRegex(@"^[a-z]+\s+([a-fA-F0-9]{4,40})(\s+.*)?$")]
private static partial Regex REG_REBASE_TODO();
private Models.IpcChannel _ipcChannel = null;
private ViewModels.Launcher _launcher = null;
private ResourceDictionary _activeLocale = null;
private Models.INotificationReceiver _notificationReceiver = null;
private ResourceDictionary _themeOverrides = null;
private ResourceDictionary _fontsOverrides = null;
}
}

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<!-- This manifest is used on Windows only.
Don't remove it as it might cause problems with window transparency and embeded controls.
Don't remove it as it might cause problems with window transparency and embedded controls.
For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests -->
<assemblyIdentity version="1.0.0.0" name="SourceGit.Desktop"/>

View file

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIconFile</key>
<string>App.icns</string>
<key>CFBundleIdentifier</key>
<string>com.sourcegit-scm.sourcegit</string>
<key>CFBundleName</key>
<string>SourceGit</string>
<key>CFBundleVersion</key>
<string>8.0.0</string>
<key>LSMinimumSystemVersion</key>
<string>10.12</string>
<key>CFBundleExecutable</key>
<string>SourceGit</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>8.0</string>
<key>NSHighResolutionCapable</key>
<true/>
</dict>
</plist>

View file

@ -1,23 +0,0 @@
#!/bin/sh
dotnet publish -c Release -r osx-x64 -p:PublishAot=true -p:PublishTrimmed=true -p:TrimMode=link --self-contained
dotnet publish -c Release -r osx-arm64 -p:PublishAot=true -p:PublishTrimmed=true -p:TrimMode=link --self-contained
rm -rf macOS
mkdir -p macOS
mkdir -p macOS/x64/SourceGit.app/Contents/MacOS
mkdir -p macOS/arm64/SourceGit.app/Contents/MacOS
mkdir -p macOS/x64/SourceGit.app/Contents/Resources
mkdir -p macOS/arm64/SourceGit.app/Contents/Resources
cp App.plist macOS/x64/SourceGit.app/Contents/Info.plist
cp App.plist macOS/arm64/SourceGit.app/Contents/Info.plist
cp App.icns macOS/x64/SourceGit.app/Contents/Resources/App.icns
cp App.icns macOS/arm64/SourceGit.app/Contents/Resources/App.icns
cp -r bin/Release/net8.0/osx-x64/publish/* macOS/x64/SourceGit.app/Contents/MacOS/
cp -r bin/Release/net8.0/osx-arm64/publish/* macOS/arm64/SourceGit.app/Contents/MacOS/
rm -rf macOS/x64/SourceGit.app/Contents/MacOS/SourceGit.dsym
rm -rf macOS/arm64/SourceGit.app/Contents/MacOS/SourceGit.dsym

View file

@ -1 +0,0 @@
dotnet publish -c Release -r win-x64 -p:PublishAot=true -p:PublishTrimmed=true -p:TrimMode=link --self-contained

View file

@ -1,24 +1,26 @@
using System.Collections.Generic;
using System.Text;
namespace SourceGit.Commands {
public class Add : Command {
public Add(string repo, List<Models.Change> changes = null) {
namespace SourceGit.Commands
{
public class Add : Command
{
public Add(string repo, bool includeUntracked)
{
WorkingDirectory = repo;
Context = repo;
Args = includeUntracked ? "add ." : "add -u .";
}
if (changes == null || changes.Count == 0) {
Args = "add .";
} else {
var builder = new StringBuilder();
builder.Append("add --");
foreach (var c in changes) {
builder.Append(" \"");
builder.Append(c.Path);
builder.Append("\"");
}
Args = builder.ToString();
public Add(string repo, Models.Change change)
{
WorkingDirectory = repo;
Context = repo;
Args = $"add -- \"{change.Path}\"";
}
public Add(string repo, string pathspecFromFile)
{
WorkingDirectory = repo;
Context = repo;
Args = $"add --pathspec-from-file=\"{pathspecFromFile}\"";
}
}
}

View file

@ -1,11 +1,18 @@
namespace SourceGit.Commands {
public class Apply : Command {
public Apply(string repo, string file, bool ignoreWhitespace, string whitespaceMode) {
namespace SourceGit.Commands
{
public class Apply : Command
{
public Apply(string repo, string file, bool ignoreWhitespace, string whitespaceMode, string extra)
{
WorkingDirectory = repo;
Context = repo;
Args = "apply ";
if (ignoreWhitespace) Args += "--ignore-whitespace ";
else Args += $"--whitespace={whitespaceMode} ";
if (ignoreWhitespace)
Args += "--ignore-whitespace ";
else
Args += $"--whitespace={whitespaceMode} ";
if (!string.IsNullOrEmpty(extra))
Args += $"{extra} ";
Args += $"\"{file}\"";
}
}

View file

@ -1,19 +1,12 @@
using System;
namespace SourceGit.Commands {
public class Archive : Command {
public Archive(string repo, string revision, string saveTo, Action<string> outputHandler) {
namespace SourceGit.Commands
{
public class Archive : Command
{
public Archive(string repo, string revision, string saveTo)
{
WorkingDirectory = repo;
Context = repo;
Args = $"archive --format=zip --verbose --output=\"{saveTo}\" {revision}";
TraitErrorAsOutput = true;
_outputHandler = outputHandler;
}
protected override void OnReadline(string line) {
_outputHandler?.Invoke(line);
}
private Action<string> _outputHandler;
}
}
}

View file

@ -1,36 +1,9 @@
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class AssumeUnchanged {
class ViewCommand : Command {
private static readonly Regex REG = new Regex(@"^(\w)\s+(.+)$");
public ViewCommand(string repo) {
WorkingDirectory = repo;
Args = "ls-files -v";
RaiseError = false;
}
public List<string> Result() {
Exec();
return _outs;
}
protected override void OnReadline(string line) {
var match = REG.Match(line);
if (!match.Success) return;
if (match.Groups[1].Value == "h") {
_outs.Add(match.Groups[2].Value);
}
}
private List<string> _outs = new List<string>();
}
class ModCommand : Command {
public ModCommand(string repo, string file, bool bAdd) {
namespace SourceGit.Commands
{
public class AssumeUnchanged : Command
{
public AssumeUnchanged(string repo, string file, bool bAdd)
{
var mode = bAdd ? "--assume-unchanged" : "--no-assume-unchanged";
WorkingDirectory = repo;
@ -38,23 +11,4 @@ namespace SourceGit.Commands {
Args = $"update-index {mode} -- \"{file}\"";
}
}
public AssumeUnchanged(string repo) {
_repo = repo;
}
public List<string> View() {
return new ViewCommand(_repo).Result();
}
public void Add(string file) {
new ModCommand(_repo, file, true).Exec();
}
public void Remove(string file) {
new ModCommand(_repo, file, false).Exec();
}
private string _repo;
}
}

13
src/Commands/Bisect.cs Normal file
View file

@ -0,0 +1,13 @@
namespace SourceGit.Commands
{
public class Bisect : Command
{
public Bisect(string repo, string subcmd)
{
WorkingDirectory = repo;
Context = repo;
RaiseError = false;
Args = $"bisect {subcmd}";
}
}
}

View file

@ -1,14 +1,16 @@
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class Blame : Command {
private static readonly Regex REG_FORMAT = new Regex(@"^\^?([0-9a-f]+)\s+.*\((.*)\s+(\d+)\s+[\-\+]?\d+\s+\d+\) (.*)");
private static readonly DateTime UTC_START = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).ToLocalTime();
namespace SourceGit.Commands
{
public partial class Blame : Command
{
[GeneratedRegex(@"^\^?([0-9a-f]+)\s+.*\((.*)\s+(\d+)\s+[\-\+]?\d+\s+\d+\) (.*)")]
private static partial Regex REG_FORMAT();
public Blame(string repo, string file, string revision) {
public Blame(string repo, string file, string revision)
{
WorkingDirectory = repo;
Context = repo;
Args = $"blame -t {revision} -- \"{file}\"";
@ -17,15 +19,27 @@ namespace SourceGit.Commands {
_result.File = file;
}
public Models.BlameData Result() {
var succ = Exec();
if (!succ) {
return new Models.BlameData();
public Models.BlameData Result()
{
var rs = ReadToEnd();
if (!rs.IsSuccess)
return _result;
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
ParseLine(line);
if (_result.IsBinary)
break;
}
if (_needUnifyCommitSHA) {
foreach (var line in _result.LineInfos) {
if (line.CommitSHA.Length > _minSHALen) {
if (_needUnifyCommitSHA)
{
foreach (var line in _result.LineInfos)
{
if (line.CommitSHA.Length > _minSHALen)
{
line.CommitSHA = line.CommitSHA.Substring(0, _minSHALen);
}
}
@ -35,54 +49,47 @@ namespace SourceGit.Commands {
return _result;
}
protected override void OnReadline(string line) {
if (_result.IsBinary) return;
if (string.IsNullOrEmpty(line)) return;
if (line.IndexOf('\0') >= 0) {
private void ParseLine(string line)
{
if (line.Contains('\0', StringComparison.Ordinal))
{
_result.IsBinary = true;
_result.LineInfos.Clear();
return;
}
var match = REG_FORMAT.Match(line);
if (!match.Success) return;
var match = REG_FORMAT().Match(line);
if (!match.Success)
return;
_content.AppendLine(match.Groups[4].Value);
var commit = match.Groups[1].Value;
if (commit == _lastSHA) {
var info = new Models.BlameLineInfo() {
CommitSHA = commit,
Author = string.Empty,
Time = string.Empty,
};
_result.LineInfos.Add(info);
} else {
var author = match.Groups[2].Value;
var timestamp = int.Parse(match.Groups[3].Value);
var when = UTC_START.AddSeconds(timestamp).ToString("yyyy/MM/dd");
var when = DateTime.UnixEpoch.AddSeconds(timestamp).ToLocalTime().ToString(_dateFormat);
var blameLine = new Models.BlameLineInfo() {
IsFirstInGroup = true,
var info = new Models.BlameLineInfo()
{
IsFirstInGroup = commit != _lastSHA,
CommitSHA = commit,
Author = author,
Time = when,
};
_result.LineInfos.Add(info);
_lastSHA = commit;
_result.LineInfos.Add(blameLine);
}
if (line[0] == '^') {
if (line[0] == '^')
{
_needUnifyCommitSHA = true;
_minSHALen = Math.Min(_minSHALen, commit.Length);
}
}
private Models.BlameData _result = new Models.BlameData();
private StringBuilder _content = new StringBuilder();
private readonly Models.BlameData _result = new Models.BlameData();
private readonly StringBuilder _content = new StringBuilder();
private readonly string _dateFormat = Models.DateTimeFormat.Active.DateOnly;
private string _lastSHA = string.Empty;
private bool _needUnifyCommitSHA = false;
private int _minSHALen = 64;

View file

@ -1,38 +1,82 @@
namespace SourceGit.Commands {
public static class Branch {
public static bool Create(string repo, string name, string basedOn) {
using System.Text;
namespace SourceGit.Commands
{
public static class Branch
{
public static string ShowCurrent(string repo)
{
var cmd = new Command();
cmd.WorkingDirectory = repo;
cmd.Context = repo;
cmd.Args = $"branch {name} {basedOn}";
cmd.Args = $"branch --show-current";
return cmd.ReadToEnd().StdOut.Trim();
}
public static bool Create(string repo, string name, string basedOn, bool force, Models.ICommandLog log)
{
var builder = new StringBuilder();
builder.Append("branch ");
if (force)
builder.Append("-f ");
builder.Append(name);
builder.Append(" ");
builder.Append(basedOn);
var cmd = new Command();
cmd.WorkingDirectory = repo;
cmd.Context = repo;
cmd.Args = builder.ToString();
cmd.Log = log;
return cmd.Exec();
}
public static bool Rename(string repo, string name, string to) {
public static bool Rename(string repo, string name, string to, Models.ICommandLog log)
{
var cmd = new Command();
cmd.WorkingDirectory = repo;
cmd.Context = repo;
cmd.Args = $"branch -M {name} {to}";
cmd.Log = log;
return cmd.Exec();
}
public static bool SetUpstream(string repo, string name, string upstream) {
public static bool SetUpstream(string repo, string name, string upstream, Models.ICommandLog log)
{
var cmd = new Command();
cmd.WorkingDirectory = repo;
cmd.Context = repo;
if (string.IsNullOrEmpty(upstream)) {
cmd.Log = log;
if (string.IsNullOrEmpty(upstream))
cmd.Args = $"branch {name} --unset-upstream";
} else {
else
cmd.Args = $"branch {name} -u {upstream}";
}
return cmd.Exec();
}
public static bool Delete(string repo, string name) {
public static bool DeleteLocal(string repo, string name, Models.ICommandLog log)
{
var cmd = new Command();
cmd.WorkingDirectory = repo;
cmd.Context = repo;
cmd.Args = $"branch -D {name}";
cmd.Log = log;
return cmd.Exec();
}
public static bool DeleteRemote(string repo, string remote, string name, Models.ICommandLog log)
{
bool exists = new Remote(repo).HasBranch(remote, name);
if (exists)
return new Push(repo, remote, $"refs/heads/{name}", true) { Log = log }.Exec();
var cmd = new Command();
cmd.WorkingDirectory = repo;
cmd.Context = repo;
cmd.Args = $"branch -D -r {remote}/{name}";
cmd.Log = log;
return cmd.Exec();
}
}

View file

@ -1,47 +1,56 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Text;
namespace SourceGit.Commands {
public class Checkout : Command {
public Checkout(string repo) {
namespace SourceGit.Commands
{
public class Checkout : Command
{
public Checkout(string repo)
{
WorkingDirectory = repo;
Context = repo;
}
public bool Branch(string branch, Action<string> onProgress) {
Args = $"checkout --progress {branch}";
TraitErrorAsOutput = true;
_outputHandler = onProgress;
public bool Branch(string branch, bool force)
{
var builder = new StringBuilder();
builder.Append("checkout --progress ");
if (force)
builder.Append("--force ");
builder.Append(branch);
Args = builder.ToString();
return Exec();
}
public bool Branch(string branch, string basedOn, Action<string> onProgress) {
Args = $"checkout --progress -b {branch} {basedOn}";
TraitErrorAsOutput = true;
_outputHandler = onProgress;
public bool Branch(string branch, string basedOn, bool force, bool allowOverwrite)
{
var builder = new StringBuilder();
builder.Append("checkout --progress ");
if (force)
builder.Append("--force ");
builder.Append(allowOverwrite ? "-B " : "-b ");
builder.Append(branch);
builder.Append(" ");
builder.Append(basedOn);
Args = builder.ToString();
return Exec();
}
public bool File(string file, bool useTheirs) {
if (useTheirs) {
Args = $"checkout --theirs -- \"{file}\"";
} else {
Args = $"checkout --ours -- \"{file}\"";
}
public bool Commit(string commitId, bool force)
{
var option = force ? "--force" : string.Empty;
Args = $"checkout {option} --detach --progress {commitId}";
return Exec();
}
public bool FileWithRevision(string file, string revision) {
Args = $"checkout {revision} -- \"{file}\"";
return Exec();
}
public bool Files(List<string> files) {
StringBuilder builder = new StringBuilder();
builder.Append("checkout -f -q --");
foreach (var f in files) {
public bool UseTheirs(List<string> files)
{
var builder = new StringBuilder();
builder.Append("checkout --theirs --");
foreach (var f in files)
{
builder.Append(" \"");
builder.Append(f);
builder.Append("\"");
@ -50,10 +59,24 @@ namespace SourceGit.Commands {
return Exec();
}
protected override void OnReadline(string line) {
_outputHandler?.Invoke(line);
public bool UseMine(List<string> files)
{
var builder = new StringBuilder();
builder.Append("checkout --ours --");
foreach (var f in files)
{
builder.Append(" \"");
builder.Append(f);
builder.Append("\"");
}
Args = builder.ToString();
return Exec();
}
private Action<string> _outputHandler;
public bool FileWithRevision(string file, string revision)
{
Args = $"checkout --no-overlay {revision} -- \"{file}\"";
return Exec();
}
}
}

View file

@ -1,10 +1,20 @@
namespace SourceGit.Commands {
public class CherryPick : Command {
public CherryPick(string repo, string commit, bool noCommit) {
var mode = noCommit ? "-n" : "--ff";
namespace SourceGit.Commands
{
public class CherryPick : Command
{
public CherryPick(string repo, string commits, bool noCommit, bool appendSourceToMessage, string extraParams)
{
WorkingDirectory = repo;
Context = repo;
Args = $"cherry-pick {mode} {commit}";
Args = "cherry-pick ";
if (noCommit)
Args += "-n ";
if (appendSourceToMessage)
Args += "-x ";
if (!string.IsNullOrEmpty(extraParams))
Args += $"{extraParams} ";
Args += commits;
}
}
}

View file

@ -1,26 +1,12 @@
using System.Collections.Generic;
using System.Text;
namespace SourceGit.Commands {
public class Clean : Command {
public Clean(string repo) {
namespace SourceGit.Commands
{
public class Clean : Command
{
public Clean(string repo)
{
WorkingDirectory = repo;
Context = repo;
Args = "clean -qfd";
}
public Clean(string repo, List<string> files) {
StringBuilder builder = new StringBuilder();
builder.Append("clean -qfd --");
foreach (var f in files) {
builder.Append(" \"");
builder.Append(f);
builder.Append("\"");
}
WorkingDirectory = repo;
Context = repo;
Args = builder.ToString();
Args = "clean -qfdx";
}
}
}

View file

@ -1,31 +1,21 @@
using System;
namespace SourceGit.Commands {
public class Clone : Command {
private Action<string> _notifyProgress;
public Clone(string ctx, string path, string url, string localName, string sshKey, string extraArgs, Action<string> ouputHandler) {
namespace SourceGit.Commands
{
public class Clone : Command
{
public Clone(string ctx, string path, string url, string localName, string sshKey, string extraArgs)
{
Context = ctx;
WorkingDirectory = path;
TraitErrorAsOutput = true;
SSHKey = sshKey;
Args = "clone --progress --verbose ";
if (string.IsNullOrEmpty(sshKey)) {
Args = "-c credential.helper=manager ";
} else {
Args = $"-c core.sshCommand=\"ssh -i '{sshKey}'\" ";
}
if (!string.IsNullOrEmpty(extraArgs))
Args += $"{extraArgs} ";
Args += "clone --progress --verbose --recurse-submodules ";
if (!string.IsNullOrEmpty(extraArgs)) Args += $"{extraArgs} ";
Args += $"{url} ";
if (!string.IsNullOrEmpty(localName)) Args += localName;
_notifyProgress = ouputHandler;
}
protected override void OnReadline(string line) {
_notifyProgress?.Invoke(line);
if (!string.IsNullOrEmpty(localName))
Args += localName;
}
}
}

View file

@ -1,87 +1,76 @@
using Avalonia.Threading;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
namespace SourceGit.Commands {
public class Command {
public class CancelToken {
public bool Requested { get; set; } = false;
using Avalonia.Threading;
namespace SourceGit.Commands
{
public partial class Command
{
public class ReadToEndResult
{
public bool IsSuccess { get; set; } = false;
public string StdOut { get; set; } = "";
public string StdErr { get; set; } = "";
}
public class ReadToEndResult {
public bool IsSuccess { get; set; }
public string StdOut { get; set; }
public string StdErr { get; set; }
public enum EditorType
{
None,
CoreEditor,
RebaseEditor,
}
public string Context { get; set; } = string.Empty;
public CancelToken Cancel { get; set; } = null;
public CancellationToken CancellationToken { get; set; } = CancellationToken.None;
public string WorkingDirectory { get; set; } = null;
public EditorType Editor { get; set; } = EditorType.CoreEditor; // Only used in Exec() mode
public string SSHKey { get; set; } = string.Empty;
public string Args { get; set; } = string.Empty;
public bool RaiseError { get; set; } = true;
public bool TraitErrorAsOutput { get; set; } = false;
public Models.ICommandLog Log { get; set; } = null;
public bool Exec() {
var start = new ProcessStartInfo();
start.FileName = Native.OS.GitExecutableFile;
start.Arguments = "--no-pager -c core.quotepath=off " + Args;
start.UseShellExecute = false;
start.CreateNoWindow = true;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
start.StandardOutputEncoding = Encoding.UTF8;
start.StandardErrorEncoding = Encoding.UTF8;
if (!string.IsNullOrEmpty(WorkingDirectory)) start.WorkingDirectory = WorkingDirectory;
public bool Exec()
{
Log?.AppendLine($"$ git {Args}\n");
var start = CreateGitStartInfo();
var errs = new List<string>();
var proc = new Process() { StartInfo = start };
var isCancelled = false;
proc.OutputDataReceived += (_, e) => {
if (Cancel != null && Cancel.Requested) {
isCancelled = true;
proc.CancelErrorRead();
proc.CancelOutputRead();
if (!proc.HasExited) proc.Kill(true);
return;
}
proc.OutputDataReceived += (_, e) => HandleOutput(e.Data, errs);
proc.ErrorDataReceived += (_, e) => HandleOutput(e.Data, errs);
if (e.Data != null) OnReadline(e.Data);
};
proc.ErrorDataReceived += (_, e) => {
if (Cancel != null && Cancel.Requested) {
isCancelled = true;
proc.CancelErrorRead();
proc.CancelOutputRead();
if (!proc.HasExited) proc.Kill(true);
return;
}
if (string.IsNullOrEmpty(e.Data)) return;
if (TraitErrorAsOutput) OnReadline(e.Data);
// Ignore progress messages
if (e.Data.StartsWith("remote: Enumerating objects:", StringComparison.Ordinal)) return;
if (e.Data.StartsWith("remote: Counting objects:", StringComparison.Ordinal)) return;
if (e.Data.StartsWith("remote: Compressing objects:", StringComparison.Ordinal)) return;
if (e.Data.StartsWith("Filtering content:", StringComparison.Ordinal)) return;
if (_progressRegex.IsMatch(e.Data)) return;
errs.Add(e.Data);
};
try {
var dummy = null as Process;
var dummyProcLock = new object();
try
{
proc.Start();
} catch (Exception e) {
if (RaiseError) {
Dispatcher.UIThread.Invoke(() => {
App.RaiseException(Context, e.Message);
// It not safe, please only use `CancellationToken` in readonly commands.
if (CancellationToken.CanBeCanceled)
{
dummy = proc;
CancellationToken.Register(() =>
{
lock (dummyProcLock)
{
if (dummy is { HasExited: false })
dummy.Kill();
}
});
}
}
catch (Exception e)
{
if (RaiseError)
Dispatcher.UIThread.Post(() => App.RaiseException(Context, e.Message));
Log?.AppendLine(string.Empty);
return false;
}
@ -89,46 +78,54 @@ namespace SourceGit.Commands {
proc.BeginErrorReadLine();
proc.WaitForExit();
if (dummy != null)
{
lock (dummyProcLock)
{
dummy = null;
}
}
int exitCode = proc.ExitCode;
proc.Close();
Log?.AppendLine(string.Empty);
if (!isCancelled && exitCode != 0 && errs.Count > 0) {
if (RaiseError) {
Dispatcher.UIThread.Invoke(() => {
App.RaiseException(Context, string.Join("\n", errs));
});
if (!CancellationToken.IsCancellationRequested && exitCode != 0)
{
if (RaiseError)
{
var errMsg = string.Join("\n", errs).Trim();
if (!string.IsNullOrEmpty(errMsg))
Dispatcher.UIThread.Post(() => App.RaiseException(Context, errMsg));
}
return false;
} else {
}
return true;
}
}
public ReadToEndResult ReadToEnd() {
var start = new ProcessStartInfo();
start.FileName = Native.OS.GitExecutableFile;
start.Arguments = "--no-pager -c core.quotepath=off " + Args;
start.UseShellExecute = false;
start.CreateNoWindow = true;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
start.StandardOutputEncoding = Encoding.UTF8;
start.StandardErrorEncoding = Encoding.UTF8;
if (!string.IsNullOrEmpty(WorkingDirectory)) start.WorkingDirectory = WorkingDirectory;
public ReadToEndResult ReadToEnd()
{
var start = CreateGitStartInfo();
var proc = new Process() { StartInfo = start };
try {
try
{
proc.Start();
} catch (Exception e) {
return new ReadToEndResult() {
}
catch (Exception e)
{
return new ReadToEndResult()
{
IsSuccess = false,
StdOut = string.Empty,
StdErr = e.Message,
};
}
var rs = new ReadToEndResult() {
var rs = new ReadToEndResult()
{
StdOut = proc.StandardOutput.ReadToEnd(),
StdErr = proc.StandardError.ReadToEnd(),
};
@ -140,8 +137,84 @@ namespace SourceGit.Commands {
return rs;
}
protected virtual void OnReadline(string line) { }
private ProcessStartInfo CreateGitStartInfo()
{
var start = new ProcessStartInfo();
start.FileName = Native.OS.GitExecutable;
start.Arguments = "--no-pager -c core.quotepath=off -c credential.helper=manager ";
start.UseShellExecute = false;
start.CreateNoWindow = true;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
start.StandardOutputEncoding = Encoding.UTF8;
start.StandardErrorEncoding = Encoding.UTF8;
private static readonly Regex _progressRegex = new Regex(@"\d+%");
// Force using this app as SSH askpass program
var selfExecFile = Process.GetCurrentProcess().MainModule!.FileName;
if (!OperatingSystem.IsLinux())
start.Environment.Add("DISPLAY", "required");
start.Environment.Add("SSH_ASKPASS", selfExecFile); // Can not use parameter here, because it invoked by SSH with `exec`
start.Environment.Add("SSH_ASKPASS_REQUIRE", "prefer");
start.Environment.Add("SOURCEGIT_LAUNCH_AS_ASKPASS", "TRUE");
// If an SSH private key was provided, sets the environment.
if (!start.Environment.ContainsKey("GIT_SSH_COMMAND") && !string.IsNullOrEmpty(SSHKey))
start.Environment.Add("GIT_SSH_COMMAND", $"ssh -i '{SSHKey}'");
// Force using en_US.UTF-8 locale
if (OperatingSystem.IsLinux())
{
start.Environment.Add("LANG", "C");
start.Environment.Add("LC_ALL", "C");
}
// Force using this app as git editor.
switch (Editor)
{
case EditorType.CoreEditor:
start.Arguments += $"-c core.editor=\"\\\"{selfExecFile}\\\" --core-editor\" ";
break;
case EditorType.RebaseEditor:
start.Arguments += $"-c core.editor=\"\\\"{selfExecFile}\\\" --rebase-message-editor\" -c sequence.editor=\"\\\"{selfExecFile}\\\" --rebase-todo-editor\" -c rebase.abbreviateCommands=true ";
break;
default:
start.Arguments += "-c core.editor=true ";
break;
}
// Append command args
start.Arguments += Args;
// Working directory
if (!string.IsNullOrEmpty(WorkingDirectory))
start.WorkingDirectory = WorkingDirectory;
return start;
}
private void HandleOutput(string line, List<string> errs)
{
line ??= string.Empty;
Log?.AppendLine(line);
// Lines to hide in error message.
if (line.Length > 0)
{
if (line.StartsWith("remote: Enumerating objects:", StringComparison.Ordinal) ||
line.StartsWith("remote: Counting objects:", StringComparison.Ordinal) ||
line.StartsWith("remote: Compressing objects:", StringComparison.Ordinal) ||
line.StartsWith("Filtering content:", StringComparison.Ordinal) ||
line.StartsWith("hint:", StringComparison.Ordinal))
return;
if (REG_PROGRESS().IsMatch(line))
return;
}
errs.Add(line);
}
[GeneratedRegex(@"\d+%")]
private static partial Regex REG_PROGRESS();
}
}

View file

@ -1,16 +1,39 @@
using System.IO;
namespace SourceGit.Commands {
public class Commit : Command {
public Commit(string repo, string message, bool amend, bool allowEmpty = false) {
var file = Path.GetTempFileName();
File.WriteAllText(file, message);
namespace SourceGit.Commands
{
public class Commit : Command
{
public Commit(string repo, string message, bool signOff, bool amend, bool resetAuthor)
{
_tmpFile = Path.GetTempFileName();
File.WriteAllText(_tmpFile, message);
WorkingDirectory = repo;
Context = repo;
Args = $"commit --file=\"{file}\"";
if (amend) Args += " --amend --no-edit";
if (allowEmpty) Args += " --allow-empty";
}
Args = $"commit --allow-empty --file=\"{_tmpFile}\"";
if (signOff)
Args += " --signoff";
if (amend)
Args += resetAuthor ? " --amend --reset-author --no-edit" : " --amend --no-edit";
}
public bool Run()
{
var succ = Exec();
try
{
File.Delete(_tmpFile);
}
catch
{
// Ignore
}
return succ;
}
private readonly string _tmpFile;
}
}

View file

@ -1,38 +1,88 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class CompareRevisions : Command {
private static readonly Regex REG_FORMAT = new Regex(@"^(\s?[\w\?]{1,4})\s+(.+)$");
namespace SourceGit.Commands
{
public partial class CompareRevisions : Command
{
[GeneratedRegex(@"^([MADC])\s+(.+)$")]
private static partial Regex REG_FORMAT();
[GeneratedRegex(@"^R[0-9]{0,4}\s+(.+)$")]
private static partial Regex REG_RENAME_FORMAT();
public CompareRevisions(string repo, string start, string end) {
public CompareRevisions(string repo, string start, string end)
{
WorkingDirectory = repo;
Context = repo;
Args = $"diff --name-status {start} {end}";
var based = string.IsNullOrEmpty(start) ? "-R" : start;
Args = $"diff --name-status {based} {end}";
}
public List<Models.Change> Result() {
Exec();
_changes.Sort((l, r) => l.Path.CompareTo(r.Path));
public CompareRevisions(string repo, string start, string end, string path)
{
WorkingDirectory = repo;
Context = repo;
var based = string.IsNullOrEmpty(start) ? "-R" : start;
Args = $"diff --name-status {based} {end} -- \"{path}\"";
}
public List<Models.Change> Result()
{
var rs = ReadToEnd();
if (!rs.IsSuccess)
return _changes;
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
ParseLine(line);
_changes.Sort((l, r) => Models.NumericSort.Compare(l.Path, r.Path));
return _changes;
}
protected override void OnReadline(string line) {
var match = REG_FORMAT.Match(line);
if (!match.Success) return;
private void ParseLine(string line)
{
var match = REG_FORMAT().Match(line);
if (!match.Success)
{
match = REG_RENAME_FORMAT().Match(line);
if (match.Success)
{
var renamed = new Models.Change() { Path = match.Groups[1].Value };
renamed.Set(Models.ChangeState.Renamed);
_changes.Add(renamed);
}
return;
}
var change = new Models.Change() { Path = match.Groups[2].Value };
var status = match.Groups[1].Value;
switch (status[0]) {
case 'M': change.Set(Models.ChangeState.Modified); _changes.Add(change); break;
case 'A': change.Set(Models.ChangeState.Added); _changes.Add(change); break;
case 'D': change.Set(Models.ChangeState.Deleted); _changes.Add(change); break;
case 'R': change.Set(Models.ChangeState.Renamed); _changes.Add(change); break;
case 'C': change.Set(Models.ChangeState.Copied); _changes.Add(change); break;
switch (status[0])
{
case 'M':
change.Set(Models.ChangeState.Modified);
_changes.Add(change);
break;
case 'A':
change.Set(Models.ChangeState.Added);
_changes.Add(change);
break;
case 'D':
change.Set(Models.ChangeState.Deleted);
_changes.Add(change);
break;
case 'C':
change.Set(Models.ChangeState.Copied);
_changes.Add(change);
break;
}
}
private List<Models.Change> _changes = new List<Models.Change>();
private readonly List<Models.Change> _changes = new List<Models.Change>();
}
}

View file

@ -1,31 +1,43 @@
using System;
using System.Collections.Generic;
namespace SourceGit.Commands {
public class Config : Command {
public Config(string repository) {
namespace SourceGit.Commands
{
public class Config : Command
{
public Config(string repository)
{
if (string.IsNullOrEmpty(repository))
{
WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
}
else
{
WorkingDirectory = repository;
Context = repository;
_isLocal = true;
}
RaiseError = false;
}
public Dictionary<string, string> ListAll() {
public Dictionary<string, string> ListAll()
{
Args = "config -l";
var output = ReadToEnd();
var rs = new Dictionary<string, string>();
if (output.IsSuccess) {
var lines = output.StdOut.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines) {
var idx = line.IndexOf('=');
if (idx != -1) {
if (output.IsSuccess)
{
var lines = output.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
var idx = line.IndexOf('=', StringComparison.Ordinal);
if (idx != -1)
{
var key = line.Substring(0, idx).Trim();
var val = line.Substring(idx + 1).Trim();
if (rs.ContainsKey(key)) {
rs[key] = val;
} else {
rs.Add(key, val);
}
}
}
}
@ -33,27 +45,24 @@ namespace SourceGit.Commands {
return rs;
}
public string Get(string key) {
public string Get(string key)
{
Args = $"config {key}";
return ReadToEnd().StdOut.Trim();
}
public bool Set(string key, string value, bool allowEmpty = false) {
if (!allowEmpty && string.IsNullOrWhiteSpace(value)) {
if (string.IsNullOrEmpty(WorkingDirectory)) {
Args = $"config --global --unset {key}";
} else {
Args = $"config --unset {key}";
}
} else {
if (string.IsNullOrWhiteSpace(WorkingDirectory)) {
Args = $"config --global {key} \"{value}\"";
} else {
Args = $"config {key} \"{value}\"";
}
}
public bool Set(string key, string value, bool allowEmpty = false)
{
var scope = _isLocal ? "--local" : "--global";
if (!allowEmpty && string.IsNullOrWhiteSpace(value))
Args = $"config {scope} --unset {key}";
else
Args = $"config {scope} {key} \"{value}\"";
return Exec();
}
private bool _isLocal = false;
}
}

View file

@ -0,0 +1,26 @@
using System;
namespace SourceGit.Commands
{
public class CountLocalChangesWithoutUntracked : Command
{
public CountLocalChangesWithoutUntracked(string repo)
{
WorkingDirectory = repo;
Context = repo;
Args = "--no-optional-locks status -uno --ignore-submodules=all --porcelain";
}
public int Result()
{
var rs = ReadToEnd();
if (rs.IsSuccess)
{
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
return lines.Length;
}
return 0;
}
}
}

View file

@ -1,127 +1,259 @@
using System;
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class Diff : Command {
private static readonly Regex REG_INDICATOR = new Regex(@"^@@ \-(\d+),?\d* \+(\d+),?\d* @@");
private static readonly string PREFIX_LFS = " version https://git-lfs.github.com/spec/";
namespace SourceGit.Commands
{
public partial class Diff : Command
{
[GeneratedRegex(@"^@@ \-(\d+),?\d* \+(\d+),?\d* @@")]
private static partial Regex REG_INDICATOR();
[GeneratedRegex(@"^index\s([0-9a-f]{6,40})\.\.([0-9a-f]{6,40})(\s[1-9]{6})?")]
private static partial Regex REG_HASH_CHANGE();
private const string PREFIX_LFS_NEW = "+version https://git-lfs.github.com/spec/";
private const string PREFIX_LFS_DEL = "-version https://git-lfs.github.com/spec/";
private const string PREFIX_LFS_MODIFY = " version https://git-lfs.github.com/spec/";
public Diff(string repo, Models.DiffOption opt, int unified, bool ignoreWhitespace)
{
_result.TextDiff = new Models.TextDiff()
{
Repo = repo,
Option = opt,
};
public Diff(string repo, Models.DiffOption opt) {
WorkingDirectory = repo;
Context = repo;
Args = $"diff --ignore-cr-at-eol --unified=4 {opt}";
if (ignoreWhitespace)
Args = $"diff --no-ext-diff --patch --ignore-all-space --unified={unified} {opt}";
else if (Models.DiffOption.IgnoreCRAtEOL)
Args = $"diff --no-ext-diff --patch --ignore-cr-at-eol --unified={unified} {opt}";
else
Args = $"diff --no-ext-diff --patch --unified={unified} {opt}";
}
public Models.DiffResult Result() {
Exec();
public Models.DiffResult Result()
{
var rs = ReadToEnd();
var start = 0;
var end = rs.StdOut.IndexOf('\n', start);
while (end > 0)
{
var line = rs.StdOut.Substring(start, end - start);
ParseLine(line);
if (_result.IsBinary || _result.IsLFS) {
start = end + 1;
end = rs.StdOut.IndexOf('\n', start);
}
if (start < rs.StdOut.Length)
ParseLine(rs.StdOut.Substring(start));
if (_result.IsBinary || _result.IsLFS || _result.TextDiff.Lines.Count == 0)
{
_result.TextDiff = null;
} else {
}
else
{
ProcessInlineHighlights();
if (_result.TextDiff.Lines.Count == 0) {
_result.TextDiff = null;
} else {
_result.TextDiff.MaxLineNumber = Math.Max(_newLine, _oldLine);
}
}
return _result;
}
protected override void OnReadline(string line) {
if (_result.IsBinary) return;
private void ParseLine(string line)
{
if (_result.IsBinary)
return;
if (_result.IsLFS) {
if (line.StartsWith("old mode ", StringComparison.Ordinal))
{
_result.OldMode = line.Substring(9);
return;
}
if (line.StartsWith("new mode ", StringComparison.Ordinal))
{
_result.NewMode = line.Substring(9);
return;
}
if (line.StartsWith("deleted file mode ", StringComparison.Ordinal))
{
_result.OldMode = line.Substring(18);
return;
}
if (line.StartsWith("new file mode ", StringComparison.Ordinal))
{
_result.NewMode = line.Substring(14);
return;
}
if (_result.IsLFS)
{
var ch = line[0];
if (ch == '-') {
line = line.Substring(1);
if (line.StartsWith("oid sha256:")) {
_result.LFSDiff.Old.Oid = line.Substring(11);
} else if (line.StartsWith("size ")) {
_result.LFSDiff.Old.Size = long.Parse(line.Substring(5));
if (ch == '-')
{
if (line.StartsWith("-oid sha256:", StringComparison.Ordinal))
{
_result.LFSDiff.Old.Oid = line.Substring(12);
}
} else if (ch == '+') {
line = line.Substring(1);
if (line.StartsWith("oid sha256:")) {
_result.LFSDiff.New.Oid = line.Substring(11);
} else if (line.StartsWith("size ")) {
_result.LFSDiff.New.Size = long.Parse(line.Substring(5));
else if (line.StartsWith("-size ", StringComparison.Ordinal))
{
_result.LFSDiff.Old.Size = long.Parse(line.AsSpan(6));
}
} else if (line.StartsWith(" size ")) {
_result.LFSDiff.New.Size = _result.LFSDiff.Old.Size = long.Parse(line.Substring(6));
}
else if (ch == '+')
{
if (line.StartsWith("+oid sha256:", StringComparison.Ordinal))
{
_result.LFSDiff.New.Oid = line.Substring(12);
}
else if (line.StartsWith("+size ", StringComparison.Ordinal))
{
_result.LFSDiff.New.Size = long.Parse(line.AsSpan(6));
}
}
else if (line.StartsWith(" size ", StringComparison.Ordinal))
{
_result.LFSDiff.New.Size = _result.LFSDiff.Old.Size = long.Parse(line.AsSpan(6));
}
return;
}
if (_result.TextDiff.Lines.Count == 0) {
var match = REG_INDICATOR.Match(line);
if (!match.Success) {
if (line.StartsWith("Binary", StringComparison.Ordinal)) _result.IsBinary = true;
if (_result.TextDiff.Lines.Count == 0)
{
if (line.StartsWith("Binary", StringComparison.Ordinal))
{
_result.IsBinary = true;
return;
}
if (string.IsNullOrEmpty(_result.OldHash))
{
var match = REG_HASH_CHANGE().Match(line);
if (!match.Success)
return;
_result.OldHash = match.Groups[1].Value;
_result.NewHash = match.Groups[2].Value;
}
else
{
var match = REG_INDICATOR().Match(line);
if (!match.Success)
return;
_oldLine = int.Parse(match.Groups[1].Value);
_newLine = int.Parse(match.Groups[2].Value);
_result.TextDiff.Lines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Indicator, line, "", ""));
} else {
if (line.Length == 0) {
_last = new Models.TextDiffLine(Models.TextDiffLineType.Indicator, line, 0, 0);
_result.TextDiff.Lines.Add(_last);
}
}
else
{
if (line.Length == 0)
{
ProcessInlineHighlights();
_result.TextDiff.Lines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Normal, "", $"{_oldLine}", $"{_newLine}"));
_last = new Models.TextDiffLine(Models.TextDiffLineType.Normal, "", _oldLine, _newLine);
_result.TextDiff.Lines.Add(_last);
_oldLine++;
_newLine++;
return;
}
var ch = line[0];
if (ch == '-') {
_deleted.Add(new Models.TextDiffLine(Models.TextDiffLineType.Deleted, line.Substring(1), $"{_oldLine}", ""));
_oldLine++;
} else if (ch == '+') {
_added.Add(new Models.TextDiffLine(Models.TextDiffLineType.Added, line.Substring(1), "", $"{_newLine}"));
_newLine++;
} else if (ch != '\\') {
ProcessInlineHighlights();
var match = REG_INDICATOR.Match(line);
if (match.Success) {
_oldLine = int.Parse(match.Groups[1].Value);
_newLine = int.Parse(match.Groups[2].Value);
_result.TextDiff.Lines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Indicator, line, "", ""));
} else {
if (line.StartsWith(PREFIX_LFS)) {
if (ch == '-')
{
if (_oldLine == 1 && _newLine == 0 && line.StartsWith(PREFIX_LFS_DEL, StringComparison.Ordinal))
{
_result.IsLFS = true;
_result.LFSDiff = new Models.LFSDiff();
return;
}
_result.TextDiff.Lines.Add(new Models.TextDiffLine(Models.TextDiffLineType.Normal, line.Substring(1), $"{_oldLine}", $"{_newLine}"));
_last = new Models.TextDiffLine(Models.TextDiffLineType.Deleted, line.Substring(1), _oldLine, 0);
_deleted.Add(_last);
_oldLine++;
}
else if (ch == '+')
{
if (_oldLine == 0 && _newLine == 1 && line.StartsWith(PREFIX_LFS_NEW, StringComparison.Ordinal))
{
_result.IsLFS = true;
_result.LFSDiff = new Models.LFSDiff();
return;
}
_last = new Models.TextDiffLine(Models.TextDiffLineType.Added, line.Substring(1), 0, _newLine);
_added.Add(_last);
_newLine++;
}
else if (ch != '\\')
{
ProcessInlineHighlights();
var match = REG_INDICATOR().Match(line);
if (match.Success)
{
_oldLine = int.Parse(match.Groups[1].Value);
_newLine = int.Parse(match.Groups[2].Value);
_last = new Models.TextDiffLine(Models.TextDiffLineType.Indicator, line, 0, 0);
_result.TextDiff.Lines.Add(_last);
}
else
{
if (_oldLine == 1 && _newLine == 1 && line.StartsWith(PREFIX_LFS_MODIFY, StringComparison.Ordinal))
{
_result.IsLFS = true;
_result.LFSDiff = new Models.LFSDiff();
return;
}
_last = new Models.TextDiffLine(Models.TextDiffLineType.Normal, line.Substring(1), _oldLine, _newLine);
_result.TextDiff.Lines.Add(_last);
_oldLine++;
_newLine++;
}
}
else if (line.Equals("\\ No newline at end of file", StringComparison.Ordinal))
{
_last.NoNewLineEndOfFile = true;
}
}
}
private void ProcessInlineHighlights() {
if (_deleted.Count > 0) {
if (_added.Count == _deleted.Count) {
for (int i = _added.Count - 1; i >= 0; i--) {
private void ProcessInlineHighlights()
{
if (_deleted.Count > 0)
{
if (_added.Count == _deleted.Count)
{
for (int i = _added.Count - 1; i >= 0; i--)
{
var left = _deleted[i];
var right = _added[i];
if (left.Content.Length > 1024 || right.Content.Length > 1024) continue;
if (left.Content.Length > 1024 || right.Content.Length > 1024)
continue;
var chunks = Models.TextInlineChange.Compare(left.Content, right.Content);
if (chunks.Count > 4) continue;
if (chunks.Count > 4)
continue;
foreach (var chunk in chunks) {
if (chunk.DeletedCount > 0) {
foreach (var chunk in chunks)
{
if (chunk.DeletedCount > 0)
{
left.Highlights.Add(new Models.TextInlineRange(chunk.DeletedStart, chunk.DeletedCount));
}
if (chunk.AddedCount > 0) {
if (chunk.AddedCount > 0)
{
right.Highlights.Add(new Models.TextInlineRange(chunk.AddedStart, chunk.AddedCount));
}
}
@ -132,15 +264,17 @@ namespace SourceGit.Commands {
_deleted.Clear();
}
if (_added.Count > 0) {
if (_added.Count > 0)
{
_result.TextDiff.Lines.AddRange(_added);
_added.Clear();
}
}
private Models.DiffResult _result = new Models.DiffResult() { TextDiff = new Models.TextDiff() };
private List<Models.TextDiffLine> _deleted = new List<Models.TextDiffLine>();
private List<Models.TextDiffLine> _added = new List<Models.TextDiffLine>();
private readonly Models.DiffResult _result = new Models.DiffResult();
private readonly List<Models.TextDiffLine> _deleted = new List<Models.TextDiffLine>();
private readonly List<Models.TextDiffLine> _added = new List<Models.TextDiffLine>();
private Models.TextDiffLine _last = null;
private int _oldLine = 0;
private int _newLine = 0;
}

View file

@ -1,33 +1,95 @@
using System;
using System.Collections.Generic;
using System.IO;
namespace SourceGit.Commands {
public static class Discard {
public static void All(string repo) {
new Reset(repo, "HEAD", "--hard").Exec();
new Clean(repo).Exec();
using Avalonia.Threading;
namespace SourceGit.Commands
{
public static class Discard
{
/// <summary>
/// Discard all local changes (unstaged & staged)
/// </summary>
/// <param name="repo"></param>
/// <param name="includeIgnored"></param>
/// <param name="log"></param>
public static void All(string repo, bool includeIgnored, Models.ICommandLog log)
{
var changes = new QueryLocalChanges(repo).Result();
try
{
foreach (var c in changes)
{
if (c.WorkTree == Models.ChangeState.Untracked ||
c.WorkTree == Models.ChangeState.Added ||
c.Index == Models.ChangeState.Added ||
c.Index == Models.ChangeState.Renamed)
{
var fullPath = Path.Combine(repo, c.Path);
if (Directory.Exists(fullPath))
Directory.Delete(fullPath, true);
else
File.Delete(fullPath);
}
}
}
catch (Exception e)
{
Dispatcher.UIThread.Invoke(() =>
{
App.RaiseException(repo, $"Failed to discard changes. Reason: {e.Message}");
});
}
public static void Changes(string repo, List<Models.Change> changes) {
var needClean = new List<string>();
var needCheckout = new List<string>();
new Reset(repo, "HEAD", "--hard") { Log = log }.Exec();
foreach (var c in changes) {
if (c.WorkTree == Models.ChangeState.Untracked || c.WorkTree == Models.ChangeState.Added) {
needClean.Add(c.Path);
} else {
needCheckout.Add(c.Path);
}
if (includeIgnored)
new Clean(repo) { Log = log }.Exec();
}
for (int i = 0; i < needClean.Count; i += 10) {
var count = Math.Min(10, needClean.Count - i);
new Clean(repo, needClean.GetRange(i, count)).Exec();
/// <summary>
/// Discard selected changes (only unstaged).
/// </summary>
/// <param name="repo"></param>
/// <param name="changes"></param>
/// <param name="log"></param>
public static void Changes(string repo, List<Models.Change> changes, Models.ICommandLog log)
{
var restores = new List<string>();
try
{
foreach (var c in changes)
{
if (c.WorkTree == Models.ChangeState.Untracked || c.WorkTree == Models.ChangeState.Added)
{
var fullPath = Path.Combine(repo, c.Path);
if (Directory.Exists(fullPath))
Directory.Delete(fullPath, true);
else
File.Delete(fullPath);
}
else
{
restores.Add(c.Path);
}
}
}
catch (Exception e)
{
Dispatcher.UIThread.Invoke(() =>
{
App.RaiseException(repo, $"Failed to discard changes. Reason: {e.Message}");
});
}
for (int i = 0; i < needCheckout.Count; i += 10) {
var count = Math.Min(10, needCheckout.Count - i);
new Checkout(repo).Files(needCheckout.GetRange(i, count));
if (restores.Count > 0)
{
var pathSpecFile = Path.GetTempFileName();
File.WriteAllLines(pathSpecFile, restores);
new Restore(repo, pathSpecFile, false) { Log = log }.Exec();
File.Delete(pathSpecFile);
}
}
}

View file

@ -0,0 +1,86 @@
using System;
using System.Diagnostics;
using System.Text;
using Avalonia.Threading;
namespace SourceGit.Commands
{
public static class ExecuteCustomAction
{
public static void Run(string repo, string file, string args)
{
var start = new ProcessStartInfo();
start.FileName = file;
start.Arguments = args;
start.UseShellExecute = false;
start.CreateNoWindow = true;
start.WorkingDirectory = repo;
try
{
Process.Start(start);
}
catch (Exception e)
{
Dispatcher.UIThread.Invoke(() => App.RaiseException(repo, e.Message));
}
}
public static void RunAndWait(string repo, string file, string args, Models.ICommandLog log)
{
var start = new ProcessStartInfo();
start.FileName = file;
start.Arguments = args;
start.UseShellExecute = false;
start.CreateNoWindow = true;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
start.StandardOutputEncoding = Encoding.UTF8;
start.StandardErrorEncoding = Encoding.UTF8;
start.WorkingDirectory = repo;
log?.AppendLine($"$ {file} {args}\n");
var proc = new Process() { StartInfo = start };
var builder = new StringBuilder();
proc.OutputDataReceived += (_, e) =>
{
if (e.Data != null)
log?.AppendLine(e.Data);
};
proc.ErrorDataReceived += (_, e) =>
{
if (e.Data != null)
{
log?.AppendLine(e.Data);
builder.AppendLine(e.Data);
}
};
try
{
proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
proc.WaitForExit();
var exitCode = proc.ExitCode;
if (exitCode != 0)
{
var errMsg = builder.ToString().Trim();
if (!string.IsNullOrEmpty(errMsg))
Dispatcher.UIThread.Invoke(() => App.RaiseException(repo, errMsg));
}
}
catch (Exception e)
{
Dispatcher.UIThread.Invoke(() => App.RaiseException(repo, e.Message));
}
proc.Close();
}
}
}

View file

@ -1,123 +1,31 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace SourceGit.Commands {
public class Fetch : Command {
public Fetch(string repo, string remote, bool prune, Action<string> outputHandler) {
_outputHandler = outputHandler;
namespace SourceGit.Commands
{
public class Fetch : Command
{
public Fetch(string repo, string remote, bool noTags, bool force)
{
WorkingDirectory = repo;
Context = repo;
TraitErrorAsOutput = true;
SSHKey = new Config(repo).Get($"remote.{remote}.sshkey");
Args = "fetch --progress --verbose ";
var sshKey = new Config(repo).Get($"remote.{remote}.sshkey");
if (!string.IsNullOrEmpty(sshKey)) {
Args = $"-c core.sshCommand=\"ssh -i '{sshKey}'\" ";
} else {
Args = "-c credential.helper=manager ";
}
if (noTags)
Args += "--no-tags ";
else
Args += "--tags ";
if (force)
Args += "--force ";
Args += "fetch --progress --verbose ";
if (prune) Args += "--prune ";
Args += remote;
AutoFetch.MarkFetched(repo);
}
public Fetch(string repo, string remote, string localBranch, string remoteBranch, Action<string> outputHandler) {
_outputHandler = outputHandler;
public Fetch(string repo, Models.Branch local, Models.Branch remote)
{
WorkingDirectory = repo;
Context = repo;
TraitErrorAsOutput = true;
var sshKey = new Config(repo).Get($"remote.{remote}.sshkey");
if (!string.IsNullOrEmpty(sshKey)) {
Args = $"-c core.sshCommand=\"ssh -i '{sshKey}'\" ";
} else {
Args = "-c credential.helper=manager ";
}
Args += $"fetch --progress --verbose {remote} {remoteBranch}:{localBranch}";
}
protected override void OnReadline(string line) {
_outputHandler?.Invoke(line);
}
private Action<string> _outputHandler;
}
public class AutoFetch {
public static bool IsEnabled {
get;
set;
} = false;
class Job {
public Fetch Cmd = null;
public DateTime NextRunTimepoint = DateTime.MinValue;
}
static AutoFetch() {
Task.Run(() => {
while (true) {
if (!IsEnabled) {
Thread.Sleep(10000);
continue;
}
var now = DateTime.Now;
var uptodate = new List<Job>();
lock (_lock) {
foreach (var job in _jobs) {
if (job.Value.NextRunTimepoint.Subtract(now).TotalSeconds <= 0) {
uptodate.Add(job.Value);
SSHKey = new Config(repo).Get($"remote.{remote.Remote}.sshkey");
Args = $"fetch --progress --verbose {remote.Remote} {remote.Name}:{local.Name}";
}
}
}
foreach (var job in uptodate) {
job.Cmd.Exec();
job.NextRunTimepoint = DateTime.Now.AddSeconds(_fetchInterval);
}
Thread.Sleep(2000);
}
});
}
public static void AddRepository(string repo) {
var job = new Job {
Cmd = new Fetch(repo, "--all", true, null) { RaiseError = false },
NextRunTimepoint = DateTime.Now.AddSeconds(_fetchInterval),
};
lock (_lock) {
if (_jobs.ContainsKey(repo)) {
_jobs[repo] = job;
} else {
_jobs.Add(repo, job);
}
}
}
public static void RemoveRepository(string repo) {
lock (_lock) {
_jobs.Remove(repo);
}
}
public static void MarkFetched(string repo) {
lock (_lock) {
if (_jobs.ContainsKey(repo)) {
_jobs[repo].NextRunTimepoint = DateTime.Now.AddSeconds(_fetchInterval);
}
}
}
private static Dictionary<string, Job> _jobs = new Dictionary<string, Job>();
private static object _lock = new object();
private static double _fetchInterval = 10 * 60;
}
}

View file

@ -1,9 +1,13 @@
namespace SourceGit.Commands {
public class FormatPatch : Command {
public FormatPatch(string repo, string commit, string saveTo) {
namespace SourceGit.Commands
{
public class FormatPatch : Command
{
public FormatPatch(string repo, string commit, string saveTo)
{
WorkingDirectory = repo;
Context = repo;
Args = $"format-patch {commit} -1 -o \"{saveTo}\"";
Editor = EditorType.None;
Args = $"format-patch {commit} -1 --output=\"{saveTo}\"";
}
}
}

View file

@ -1,19 +1,12 @@
using System;
namespace SourceGit.Commands {
public class GC : Command {
public GC(string repo, Action<string> outputHandler) {
_outputHandler = outputHandler;
namespace SourceGit.Commands
{
public class GC : Command
{
public GC(string repo)
{
WorkingDirectory = repo;
Context = repo;
TraitErrorAsOutput = true;
Args = "gc";
}
protected override void OnReadline(string line) {
_outputHandler?.Invoke(line);
}
private Action<string> _outputHandler;
Args = "gc --prune=now";
}
}
}

View file

@ -0,0 +1,99 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using Avalonia.Threading;
namespace SourceGit.Commands
{
/// <summary>
/// A C# version of https://github.com/anjerodev/commitollama
/// </summary>
public class GenerateCommitMessage
{
public class GetDiffContent : Command
{
public GetDiffContent(string repo, Models.DiffOption opt)
{
WorkingDirectory = repo;
Context = repo;
Args = $"diff --diff-algorithm=minimal {opt}";
}
}
public GenerateCommitMessage(Models.OpenAIService service, string repo, List<Models.Change> changes, CancellationToken cancelToken, Action<string> onResponse)
{
_service = service;
_repo = repo;
_changes = changes;
_cancelToken = cancelToken;
_onResponse = onResponse;
}
public void Exec()
{
try
{
_onResponse?.Invoke("Waiting for pre-file analyzing to completed...\n\n");
var responseBuilder = new StringBuilder();
var summaryBuilder = new StringBuilder();
foreach (var change in _changes)
{
if (_cancelToken.IsCancellationRequested)
return;
responseBuilder.Append("- ");
summaryBuilder.Append("- ");
var rs = new GetDiffContent(_repo, new Models.DiffOption(change, false)).ReadToEnd();
if (rs.IsSuccess)
{
_service.Chat(
_service.AnalyzeDiffPrompt,
$"Here is the `git diff` output: {rs.StdOut}",
_cancelToken,
update =>
{
responseBuilder.Append(update);
summaryBuilder.Append(update);
_onResponse?.Invoke($"Waiting for pre-file analyzing to completed...\n\n{responseBuilder}");
});
}
responseBuilder.Append("\n");
summaryBuilder.Append("(file: ");
summaryBuilder.Append(change.Path);
summaryBuilder.Append(")\n");
}
if (_cancelToken.IsCancellationRequested)
return;
var responseBody = responseBuilder.ToString();
var subjectBuilder = new StringBuilder();
_service.Chat(
_service.GenerateSubjectPrompt,
$"Here are the summaries changes:\n{summaryBuilder}",
_cancelToken,
update =>
{
subjectBuilder.Append(update);
_onResponse?.Invoke($"{subjectBuilder}\n\n{responseBody}");
});
}
catch (Exception e)
{
Dispatcher.UIThread.Post(() => App.RaiseException(_repo, $"Failed to generate commit message: {e}"));
}
}
private Models.OpenAIService _service;
private string _repo;
private List<Models.Change> _changes;
private CancellationToken _cancelToken;
private Action<string> _onResponse;
}
}

View file

@ -1,72 +1,92 @@
using System.Collections.Generic;
using System.Text;
using Avalonia.Threading;
namespace SourceGit.Commands {
public class GitFlow : Command {
public GitFlow(string repo) {
WorkingDirectory = repo;
Context = repo;
namespace SourceGit.Commands
{
public static class GitFlow
{
public static bool Init(string repo, string master, string develop, string feature, string release, string hotfix, string version, Models.ICommandLog log)
{
var config = new Config(repo);
config.Set("gitflow.branch.master", master);
config.Set("gitflow.branch.develop", develop);
config.Set("gitflow.prefix.feature", feature);
config.Set("gitflow.prefix.bugfix", "bugfix/");
config.Set("gitflow.prefix.release", release);
config.Set("gitflow.prefix.hotfix", hotfix);
config.Set("gitflow.prefix.support", "support/");
config.Set("gitflow.prefix.versiontag", version, true);
var init = new Command();
init.WorkingDirectory = repo;
init.Context = repo;
init.Args = "flow init -d";
init.Log = log;
return init.Exec();
}
public bool Init(List<Models.Branch> branches, string master, string develop, string feature, string release, string hotfix, string version) {
var current = branches.Find(x => x.IsCurrent);
public static bool Start(string repo, Models.GitFlowBranchType type, string name, Models.ICommandLog log)
{
var start = new Command();
start.WorkingDirectory = repo;
start.Context = repo;
var masterBranch = branches.Find(x => x.Name == master);
if (masterBranch == null && current != null) Branch.Create(WorkingDirectory, master, current.Head);
var devBranch = branches.Find(x => x.Name == develop);
if (devBranch == null && current != null) Branch.Create(WorkingDirectory, develop, current.Head);
var cmd = new Config(WorkingDirectory);
cmd.Set("gitflow.branch.master", master);
cmd.Set("gitflow.branch.develop", develop);
cmd.Set("gitflow.prefix.feature", feature);
cmd.Set("gitflow.prefix.bugfix", "bugfix/");
cmd.Set("gitflow.prefix.release", release);
cmd.Set("gitflow.prefix.hotfix", hotfix);
cmd.Set("gitflow.prefix.support", "support/");
cmd.Set("gitflow.prefix.versiontag", version, true);
Args = "flow init -d";
return Exec();
}
public bool Start(Models.GitFlowBranchType type, string name) {
switch (type) {
switch (type)
{
case Models.GitFlowBranchType.Feature:
Args = $"flow feature start {name}";
start.Args = $"flow feature start {name}";
break;
case Models.GitFlowBranchType.Release:
Args = $"flow release start {name}";
start.Args = $"flow release start {name}";
break;
case Models.GitFlowBranchType.Hotfix:
Args = $"flow hotfix start {name}";
start.Args = $"flow hotfix start {name}";
break;
default:
App.RaiseException(Context, "Bad branch type!!!");
Dispatcher.UIThread.Invoke(() => App.RaiseException(repo, "Bad git-flow branch type!!!"));
return false;
}
return Exec();
start.Log = log;
return start.Exec();
}
public bool Finish(Models.GitFlowBranchType type, string name, bool keepBranch) {
var option = keepBranch ? "-k" : string.Empty;
switch (type) {
public static bool Finish(string repo, Models.GitFlowBranchType type, string name, bool squash, bool push, bool keepBranch, Models.ICommandLog log)
{
var builder = new StringBuilder();
builder.Append("flow ");
switch (type)
{
case Models.GitFlowBranchType.Feature:
Args = $"flow feature finish {option} {name}";
builder.Append("feature");
break;
case Models.GitFlowBranchType.Release:
Args = $"flow release finish {option} {name} -m \"RELEASE_DONE\"";
builder.Append("release");
break;
case Models.GitFlowBranchType.Hotfix:
Args = $"flow hotfix finish {option} {name} -m \"HOTFIX_DONE\"";
builder.Append("hotfix");
break;
default:
App.RaiseException(Context, "Bad branch type!!!");
Dispatcher.UIThread.Invoke(() => App.RaiseException(repo, "Bad git-flow branch type!!!"));
return false;
}
return Exec();
builder.Append(" finish ");
if (squash)
builder.Append("--squash ");
if (push)
builder.Append("--push ");
if (keepBranch)
builder.Append("-k ");
builder.Append(name);
var finish = new Command();
finish.WorkingDirectory = repo;
finish.Context = repo;
finish.Args = builder.ToString();
finish.Log = log;
return finish.Exec();
}
}
}

23
src/Commands/GitIgnore.cs Normal file
View file

@ -0,0 +1,23 @@
using System.IO;
namespace SourceGit.Commands
{
public static class GitIgnore
{
public static void Add(string repo, string pattern)
{
var file = Path.Combine(repo, ".gitignore");
if (!File.Exists(file))
{
File.WriteAllLines(file, [pattern]);
return;
}
var org = File.ReadAllText(file);
if (!org.EndsWith('\n'))
File.AppendAllLines(file, ["", pattern]);
else
File.AppendAllLines(file, [pattern]);
}
}
}

View file

@ -1,6 +1,9 @@
namespace SourceGit.Commands {
public class Init : Command {
public Init(string ctx, string dir) {
namespace SourceGit.Commands
{
public class Init : Command
{
public Init(string ctx, string dir)
{
Context = ctx;
WorkingDirectory = dir;
Args = "init -q";

View file

@ -0,0 +1,24 @@
using System.IO;
namespace SourceGit.Commands
{
public class IsBareRepository : Command
{
public IsBareRepository(string path)
{
WorkingDirectory = path;
Args = "rev-parse --is-bare-repository";
}
public bool Result()
{
if (!Directory.Exists(Path.Combine(WorkingDirectory, "refs")) ||
!Directory.Exists(Path.Combine(WorkingDirectory, "objects")) ||
!File.Exists(Path.Combine(WorkingDirectory, "HEAD")))
return false;
var rs = ReadToEnd();
return rs.IsSuccess && rs.StdOut.Trim() == "true";
}
}
}

View file

@ -1,18 +1,23 @@
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class IsBinary : Command {
private static readonly Regex REG_TEST = new Regex(@"^\-\s+\-\s+.*$");
namespace SourceGit.Commands
{
public partial class IsBinary : Command
{
[GeneratedRegex(@"^\-\s+\-\s+.*$")]
private static partial Regex REG_TEST();
public IsBinary(string repo, string commit, string path) {
public IsBinary(string repo, string commit, string path)
{
WorkingDirectory = repo;
Context = repo;
Args = $"diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 {commit} --numstat -- \"{path}\"";
Args = $"diff {Models.Commit.EmptyTreeSHA1} {commit} --numstat -- \"{path}\"";
RaiseError = false;
}
public bool Result() {
return REG_TEST.IsMatch(ReadToEnd().StdOut);
public bool Result()
{
return REG_TEST().IsMatch(ReadToEnd().StdOut);
}
}
}

View file

@ -0,0 +1,17 @@
namespace SourceGit.Commands
{
public class IsCommitSHA : Command
{
public IsCommitSHA(string repo, string hash)
{
WorkingDirectory = repo;
Args = $"cat-file -t {hash}";
}
public bool Result()
{
var rs = ReadToEnd();
return rs.IsSuccess && rs.StdOut.Trim().Equals("commit");
}
}
}

View file

@ -0,0 +1,19 @@
namespace SourceGit.Commands
{
public class IsConflictResolved : Command
{
public IsConflictResolved(string repo, Models.Change change)
{
var opt = new Models.DiffOption(change, true);
WorkingDirectory = repo;
Context = repo;
Args = $"diff -a --ignore-cr-at-eol --check {opt}";
}
public bool Result()
{
return ReadToEnd().IsSuccess;
}
}
}

View file

@ -1,13 +1,25 @@
namespace SourceGit.Commands {
public class IsLFSFiltered : Command {
public IsLFSFiltered(string repo, string path) {
namespace SourceGit.Commands
{
public class IsLFSFiltered : Command
{
public IsLFSFiltered(string repo, string path)
{
WorkingDirectory = repo;
Context = repo;
Args = $"check-attr -a -z \"{path}\"";
Args = $"check-attr -z filter \"{path}\"";
RaiseError = false;
}
public bool Result() {
public IsLFSFiltered(string repo, string sha, string path)
{
WorkingDirectory = repo;
Context = repo;
Args = $"check-attr --source {sha} -z filter \"{path}\"";
RaiseError = false;
}
public bool Result()
{
var rs = ReadToEnd();
return rs.IsSuccess && rs.StdOut.Contains("filter\0lfs");
}

View file

@ -1,40 +1,115 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class LFS {
class PruneCmd : Command {
public PruneCmd(string repo, Action<string> onProgress) {
namespace SourceGit.Commands
{
public partial class LFS
{
[GeneratedRegex(@"^(.+)\s+([\w.]+)\s+\w+:(\d+)$")]
private static partial Regex REG_LOCK();
private class SubCmd : Command
{
public SubCmd(string repo, string args, Models.ICommandLog log)
{
WorkingDirectory = repo;
Context = repo;
Args = "lfs prune";
TraitErrorAsOutput = true;
_outputHandler = onProgress;
Args = args;
Log = log;
}
}
protected override void OnReadline(string line) {
_outputHandler?.Invoke(line);
}
private Action<string> _outputHandler;
}
public LFS(string repo) {
public LFS(string repo)
{
_repo = repo;
}
public bool IsEnabled() {
public bool IsEnabled()
{
var path = Path.Combine(_repo, ".git", "hooks", "pre-push");
if (!File.Exists(path)) return false;
if (!File.Exists(path))
return false;
var content = File.ReadAllText(path);
return content.Contains("git lfs pre-push");
}
public void Prune(Action<string> outputHandler) {
new PruneCmd(_repo, outputHandler).Exec();
public bool Install(Models.ICommandLog log)
{
return new SubCmd(_repo, "lfs install --local", log).Exec();
}
private string _repo;
public bool Track(string pattern, bool isFilenameMode, Models.ICommandLog log)
{
var opt = isFilenameMode ? "--filename" : "";
return new SubCmd(_repo, $"lfs track {opt} \"{pattern}\"", log).Exec();
}
public void Fetch(string remote, Models.ICommandLog log)
{
new SubCmd(_repo, $"lfs fetch {remote}", log).Exec();
}
public void Pull(string remote, Models.ICommandLog log)
{
new SubCmd(_repo, $"lfs pull {remote}", log).Exec();
}
public void Push(string remote, Models.ICommandLog log)
{
new SubCmd(_repo, $"lfs push {remote}", log).Exec();
}
public void Prune(Models.ICommandLog log)
{
new SubCmd(_repo, "lfs prune", log).Exec();
}
public List<Models.LFSLock> Locks(string remote)
{
var locks = new List<Models.LFSLock>();
var cmd = new SubCmd(_repo, $"lfs locks --remote={remote}", null);
var rs = cmd.ReadToEnd();
if (rs.IsSuccess)
{
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
var match = REG_LOCK().Match(line);
if (match.Success)
{
locks.Add(new Models.LFSLock()
{
File = match.Groups[1].Value,
User = match.Groups[2].Value,
ID = long.Parse(match.Groups[3].Value),
});
}
}
}
return locks;
}
public bool Lock(string remote, string file, Models.ICommandLog log)
{
return new SubCmd(_repo, $"lfs lock --remote={remote} \"{file}\"", log).Exec();
}
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}\"", log).Exec();
}
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}", log).Exec();
}
private readonly string _repo;
}
}

View file

@ -1,19 +1,36 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SourceGit.Commands {
public class Merge : Command {
public Merge(string repo, string source, string mode, Action<string> outputHandler) {
_outputHandler = outputHandler;
namespace SourceGit.Commands
{
public class Merge : Command
{
public Merge(string repo, string source, string mode)
{
WorkingDirectory = repo;
Context = repo;
TraitErrorAsOutput = true;
Args = $"merge --progress {source} {mode}";
}
protected override void OnReadline(string line) {
_outputHandler?.Invoke(line);
public Merge(string repo, List<string> targets, bool autoCommit, string strategy)
{
WorkingDirectory = repo;
Context = repo;
var builder = new StringBuilder();
builder.Append("merge --progress ");
if (!string.IsNullOrEmpty(strategy))
builder.Append($"--strategy={strategy} ");
if (!autoCommit)
builder.Append("--no-commit ");
foreach (var t in targets)
{
builder.Append(t);
builder.Append(' ');
}
private Action<string> _outputHandler = null;
Args = builder.ToString();
}
}
}

View file

@ -1,40 +1,71 @@
using System.IO;
namespace SourceGit.Commands {
public static class MergeTool {
public static bool OpenForMerge(string repo, string tool, string mergeCmd, string file) {
if (string.IsNullOrWhiteSpace(tool) || string.IsNullOrWhiteSpace(mergeCmd)) {
App.RaiseException(repo, "Invalid external merge tool settings!");
return false;
}
if (!File.Exists(tool)) {
App.RaiseException(repo, $"Can NOT found external merge tool in '{tool}'!");
return false;
}
using Avalonia.Threading;
namespace SourceGit.Commands
{
public static class MergeTool
{
public static bool OpenForMerge(string repo, int toolType, string toolPath, string file)
{
var cmd = new Command();
cmd.WorkingDirectory = repo;
cmd.RaiseError = false;
cmd.Args = $"-c mergetool.sourcegit.cmd=\"\\\"{tool}\\\" {mergeCmd}\" -c mergetool.writeToTemp=true -c mergetool.keepBackup=false -c mergetool.trustExitCode=true mergetool --tool=sourcegit \"{file}\"";
cmd.Context = repo;
cmd.RaiseError = true;
// NOTE: If no <file> names are specified, 'git mergetool' will run the merge tool program on every file with merge conflicts.
var fileArg = string.IsNullOrEmpty(file) ? "" : $"\"{file}\"";
if (toolType == 0)
{
cmd.Args = $"mergetool {fileArg}";
return cmd.Exec();
}
public static bool OpenForDiff(string repo, string tool, string diffCmd, Models.DiffOption option) {
if (string.IsNullOrWhiteSpace(tool) || string.IsNullOrWhiteSpace(diffCmd)) {
App.RaiseException(repo, "Invalid external merge tool settings!");
if (!File.Exists(toolPath))
{
Dispatcher.UIThread.Post(() => App.RaiseException(repo, $"Can NOT find external merge tool in '{toolPath}'!"));
return false;
}
if (!File.Exists(tool)) {
App.RaiseException(repo, $"Can NOT found external merge tool in '{tool}'!");
var supported = Models.ExternalMerger.Supported.Find(x => x.Type == toolType);
if (supported == null)
{
Dispatcher.UIThread.Post(() => App.RaiseException(repo, "Invalid merge tool in preference setting!"));
return false;
}
cmd.Args = $"-c mergetool.sourcegit.cmd=\"\\\"{toolPath}\\\" {supported.Cmd}\" -c mergetool.writeToTemp=true -c mergetool.keepBackup=false -c mergetool.trustExitCode=true mergetool --tool=sourcegit {fileArg}";
return cmd.Exec();
}
public static bool OpenForDiff(string repo, int toolType, string toolPath, Models.DiffOption option)
{
var cmd = new Command();
cmd.WorkingDirectory = repo;
cmd.RaiseError = false;
cmd.Args = $"-c difftool.sourcegit.cmd=\"\\\"{tool}\\\" {diffCmd}\" difftool --tool=sourcegit --no-prompt {option}";
cmd.Context = repo;
cmd.RaiseError = true;
if (toolType == 0)
{
cmd.Args = $"difftool -g --no-prompt {option}";
return cmd.Exec();
}
if (!File.Exists(toolPath))
{
Dispatcher.UIThread.Invoke(() => App.RaiseException(repo, $"Can NOT find external diff tool in '{toolPath}'!"));
return false;
}
var supported = Models.ExternalMerger.Supported.Find(x => x.Type == toolType);
if (supported == null)
{
Dispatcher.UIThread.Post(() => App.RaiseException(repo, "Invalid merge tool in preference setting!"));
return false;
}
cmd.Args = $"-c difftool.sourcegit.cmd=\"\\\"{toolPath}\\\" {supported.DiffCmd}\" difftool --tool=sourcegit --no-prompt {option}";
return cmd.Exec();
}
}

View file

@ -1,29 +1,18 @@
using System;
namespace SourceGit.Commands {
public class Pull : Command {
public Pull(string repo, string remote, string branch, bool useRebase, Action<string> outputHandler) {
_outputHandler = outputHandler;
namespace SourceGit.Commands
{
public class Pull : Command
{
public Pull(string repo, string remote, string branch, bool useRebase)
{
WorkingDirectory = repo;
Context = repo;
TraitErrorAsOutput = true;
SSHKey = new Config(repo).Get($"remote.{remote}.sshkey");
Args = "pull --verbose --progress ";
var sshKey = new Config(repo).Get($"remote.{remote}.sshkey");
if (!string.IsNullOrEmpty(sshKey)) {
Args = $"-c core.sshCommand=\"ssh -i '{sshKey}'\" ";
} else {
Args = "-c credential.helper=manager ";
}
if (useRebase)
Args += "--rebase=true ";
Args += "pull --verbose --progress --tags ";
if (useRebase) Args += "--rebase ";
Args += $"{remote} {branch}";
}
protected override void OnReadline(string line) {
_outputHandler?.Invoke(line);
}
private Action<string> _outputHandler;
}
}

View file

@ -1,70 +1,37 @@
using System;
namespace SourceGit.Commands {
public class Push : Command {
public Push(string repo, string local, string remote, string remoteBranch, bool withTags, bool force, bool track, Action<string> onProgress) {
namespace SourceGit.Commands
{
public class Push : Command
{
public Push(string repo, string local, string remote, string remoteBranch, bool withTags, bool checkSubmodules, bool track, bool force)
{
WorkingDirectory = repo;
Context = repo;
TraitErrorAsOutput = true;
_outputHandler = onProgress;
SSHKey = new Config(repo).Get($"remote.{remote}.sshkey");
Args = "push --progress --verbose ";
var sshKey = new Config(repo).Get($"remote.{remote}.sshkey");
if (!string.IsNullOrEmpty(sshKey)) {
Args = $"-c core.sshCommand=\"ssh -i '{sshKey}'\" ";
} else {
Args = "-c credential.helper=manager ";
}
Args += "push --progress --verbose ";
if (withTags) Args += "--tags ";
if (track) Args += "-u ";
if (force) Args += "--force-with-lease ";
if (withTags)
Args += "--tags ";
if (checkSubmodules)
Args += "--recurse-submodules=check ";
if (track)
Args += "-u ";
if (force)
Args += "--force-with-lease ";
Args += $"{remote} {local}:{remoteBranch}";
}
/// <summary>
/// Only used to delete a remote branch!!!!!!
/// </summary>
/// <param name="repo"></param>
/// <param name="remote"></param>
/// <param name="branch"></param>
public Push(string repo, string remote, string branch) {
public Push(string repo, string remote, string refname, bool isDelete)
{
WorkingDirectory = repo;
Context = repo;
TraitErrorAsOutput = true;
SSHKey = new Config(repo).Get($"remote.{remote}.sshkey");
Args = "push ";
var sshKey = new Config(repo).Get($"remote.{remote}.sshkey");
if (!string.IsNullOrEmpty(sshKey)) {
Args = $"-c core.sshCommand=\"ssh -i '{sshKey}'\" ";
} else {
Args = "-c credential.helper=manager ";
}
if (isDelete)
Args += "--delete ";
Args += $"push {remote} --delete {branch}";
}
public Push(string repo, string remote, string tag, bool isDelete) {
WorkingDirectory = repo;
Context = repo;
var sshKey = new Config(repo).Get($"remote.{remote}.sshkey");
if (!string.IsNullOrEmpty(sshKey)) {
Args = $"-c core.sshCommand=\"ssh -i '{sshKey}'\" ";
} else {
Args = "-c credential.helper=manager ";
}
Args += "push ";
if (isDelete) Args += "--delete ";
Args += $"{remote} refs/tags/{tag}";
}
protected override void OnReadline(string line) {
_outputHandler?.Invoke(line);
}
private Action<string> _outputHandler = null;
Args += $"{remote} {refname}";
}
}
}

View file

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands
{
public partial class QueryAssumeUnchangedFiles : Command
{
[GeneratedRegex(@"^(\w)\s+(.+)$")]
private static partial Regex REG_PARSE();
public QueryAssumeUnchangedFiles(string repo)
{
WorkingDirectory = repo;
Args = "ls-files -v";
RaiseError = false;
}
public List<string> Result()
{
var outs = new List<string>();
var rs = ReadToEnd();
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
var match = REG_PARSE().Match(line);
if (!match.Success)
continue;
if (match.Groups[1].Value == "h")
outs.Add(match.Groups[2].Value);
}
return outs;
}
}
}

View file

@ -1,76 +1,120 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class QueryBranches : Command {
private static readonly string PREFIX_LOCAL = "refs/heads/";
private static readonly string PREFIX_REMOTE = "refs/remotes/";
private static readonly Regex REG_AHEAD = new Regex(@"ahead (\d+)");
private static readonly Regex REG_BEHIND = new Regex(@"behind (\d+)");
namespace SourceGit.Commands
{
public class QueryBranches : Command
{
private const string PREFIX_LOCAL = "refs/heads/";
private const string PREFIX_REMOTE = "refs/remotes/";
private const string PREFIX_DETACHED_AT = "(HEAD detached at";
private const string PREFIX_DETACHED_FROM = "(HEAD detached from";
public QueryBranches(string repo) {
public QueryBranches(string repo)
{
WorkingDirectory = repo;
Context = repo;
Args = "branch -l --all -v --format=\"%(refname)$%(objectname)$%(HEAD)$%(upstream)$%(upstream:track)\"";
Args = "branch -l --all -v --format=\"%(refname)%00%(committerdate:unix)%00%(objectname)%00%(HEAD)%00%(upstream)%00%(upstream:trackshort)\"";
}
public List<Models.Branch> Result() {
Exec();
return _branches;
public List<Models.Branch> Result(out int localBranchesCount)
{
localBranchesCount = 0;
var branches = new List<Models.Branch>();
var rs = ReadToEnd();
if (!rs.IsSuccess)
return branches;
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
var remoteHeads = new Dictionary<string, string>();
foreach (var line in lines)
{
var b = ParseLine(line);
if (b != null)
{
branches.Add(b);
if (!b.IsLocal)
remoteHeads.Add(b.FullName, b.Head);
else
localBranchesCount++;
}
}
protected override void OnReadline(string line) {
var parts = line.Split('$');
if (parts.Length != 5) return;
foreach (var b in branches)
{
if (b.IsLocal && !string.IsNullOrEmpty(b.Upstream))
{
if (remoteHeads.TryGetValue(b.Upstream, out var upstreamHead))
{
b.IsUpstreamGone = false;
if (b.TrackStatus == null)
b.TrackStatus = new QueryTrackStatus(WorkingDirectory, b.Head, upstreamHead).Result();
}
else
{
b.IsUpstreamGone = true;
if (b.TrackStatus == null)
b.TrackStatus = new Models.BranchTrackStatus();
}
}
}
return branches;
}
private Models.Branch ParseLine(string line)
{
var parts = line.Split('\0');
if (parts.Length != 6)
return null;
var branch = new Models.Branch();
var refName = parts[0];
if (refName.EndsWith("/HEAD")) return;
if (refName.EndsWith("/HEAD", StringComparison.Ordinal))
return null;
if (refName.StartsWith(PREFIX_LOCAL, StringComparison.Ordinal)) {
branch.IsDetachedHead = refName.StartsWith(PREFIX_DETACHED_AT, StringComparison.Ordinal) ||
refName.StartsWith(PREFIX_DETACHED_FROM, StringComparison.Ordinal);
if (refName.StartsWith(PREFIX_LOCAL, StringComparison.Ordinal))
{
branch.Name = refName.Substring(PREFIX_LOCAL.Length);
branch.IsLocal = true;
} else if (refName.StartsWith(PREFIX_REMOTE, StringComparison.Ordinal)) {
}
else if (refName.StartsWith(PREFIX_REMOTE, StringComparison.Ordinal))
{
var name = refName.Substring(PREFIX_REMOTE.Length);
var shortNameIdx = name.IndexOf('/');
if (shortNameIdx < 0) return;
var shortNameIdx = name.IndexOf('/', StringComparison.Ordinal);
if (shortNameIdx < 0)
return null;
branch.Remote = name.Substring(0, shortNameIdx);
branch.Name = name.Substring(branch.Remote.Length + 1);
branch.IsLocal = false;
} else {
}
else
{
branch.Name = refName;
branch.IsLocal = true;
}
branch.FullName = refName;
branch.Head = parts[1];
branch.IsCurrent = parts[2] == "*";
branch.Upstream = parts[3];
branch.UpstreamTrackStatus = ParseTrackStatus(parts[4]);
branch.CommitterDate = ulong.Parse(parts[1]);
branch.Head = parts[2];
branch.IsCurrent = parts[3] == "*";
branch.Upstream = parts[4];
branch.IsUpstreamGone = false;
_branches.Add(branch);
}
if (!branch.IsLocal ||
string.IsNullOrEmpty(branch.Upstream) ||
string.IsNullOrEmpty(parts[5]) ||
parts[5].Equals("=", StringComparison.Ordinal))
branch.TrackStatus = new Models.BranchTrackStatus();
private string ParseTrackStatus(string data) {
if (string.IsNullOrEmpty(data)) return string.Empty;
string track = string.Empty;
var ahead = REG_AHEAD.Match(data);
if (ahead.Success) {
track += ahead.Groups[1].Value + "↑ ";
}
var behind = REG_BEHIND.Match(data);
if (behind.Success) {
track += behind.Groups[1].Value + "↓";
}
return track.Trim();
}
private List<Models.Branch> _branches = new List<Models.Branch>();
return branch;
}
}
}

View file

@ -1,38 +0,0 @@
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class QueryCommitChanges : Command {
private static readonly Regex REG_FORMAT = new Regex(@"^(\s?[\w\?]{1,4})\s+(.+)$");
public QueryCommitChanges(string repo, string commitSHA) {
WorkingDirectory = repo;
Context = repo;
Args = $"show --name-status {commitSHA}";
}
public List<Models.Change> Result() {
Exec();
_changes.Sort((l, r) => l.Path.CompareTo(r.Path));
return _changes;
}
protected override void OnReadline(string line) {
var match = REG_FORMAT.Match(line);
if (!match.Success) return;
var change = new Models.Change() { Path = match.Groups[2].Value };
var status = match.Groups[1].Value;
switch (status[0]) {
case 'M': change.Set(Models.ChangeState.Modified); _changes.Add(change); break;
case 'A': change.Set(Models.ChangeState.Added); _changes.Add(change); break;
case 'D': change.Set(Models.ChangeState.Deleted); _changes.Add(change); break;
case 'R': change.Set(Models.ChangeState.Renamed); _changes.Add(change); break;
case 'C': change.Set(Models.ChangeState.Copied); _changes.Add(change); break;
}
}
private List<Models.Change> _changes = new List<Models.Change>();
}
}

View file

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
namespace SourceGit.Commands
{
public class QueryCommitChildren : Command
{
public QueryCommitChildren(string repo, string commit, int max)
{
WorkingDirectory = repo;
Context = repo;
_commit = commit;
Args = $"rev-list -{max} --parents --branches --remotes --ancestry-path ^{commit}";
}
public List<string> Result()
{
var rs = ReadToEnd();
var outs = new List<string>();
if (rs.IsSuccess)
{
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
if (line.Contains(_commit))
outs.Add(line.Substring(0, 40));
}
}
return outs;
}
private string _commit;
}
}

View file

@ -0,0 +1,20 @@
namespace SourceGit.Commands
{
public class QueryCommitFullMessage : Command
{
public QueryCommitFullMessage(string repo, string sha)
{
WorkingDirectory = repo;
Context = repo;
Args = $"show --no-show-signature --format=%B -s {sha}";
}
public string Result()
{
var rs = ReadToEnd();
if (rs.IsSuccess)
return rs.StdOut.TrimEnd();
return string.Empty;
}
}
}

View file

@ -0,0 +1,34 @@
namespace SourceGit.Commands
{
public class QueryCommitSignInfo : Command
{
public QueryCommitSignInfo(string repo, string sha, bool useFakeSignersFile)
{
WorkingDirectory = repo;
Context = repo;
const string baseArgs = "show --no-show-signature --format=%G?%n%GS%n%GK -s";
const string fakeSignersFileArg = "-c gpg.ssh.allowedSignersFile=/dev/null";
Args = $"{(useFakeSignersFile ? fakeSignersFileArg : string.Empty)} {baseArgs} {sha}";
}
public Models.CommitSignInfo Result()
{
var rs = ReadToEnd();
if (!rs.IsSuccess)
return null;
var raw = rs.StdOut.Trim().ReplaceLineEndings("\n");
if (raw.Length <= 1)
return null;
var lines = raw.Split('\n');
return new Models.CommitSignInfo()
{
VerifyResult = lines[0][0],
Signer = lines[1],
Key = lines[2]
};
}
}
}

View file

@ -1,152 +1,154 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SourceGit.Commands {
public class QueryCommits : Command {
private static readonly string GPGSIG_START = "gpgsig -----BEGIN PGP SIGNATURE-----";
private static readonly string GPGSIG_END = " -----END PGP SIGNATURE-----";
private List<Models.Commit> commits = new List<Models.Commit>();
private Models.Commit current = null;
private bool isSkipingGpgsig = false;
private bool isHeadFounded = false;
private bool findFirstMerged = true;
public QueryCommits(string repo, string limits, bool needFindHead = true) {
namespace SourceGit.Commands
{
public class QueryCommits : Command
{
public QueryCommits(string repo, string limits, bool needFindHead = true)
{
WorkingDirectory = repo;
Args = "log --date-order --decorate=full --pretty=raw " + limits;
findFirstMerged = needFindHead;
Context = repo;
Args = $"log --no-show-signature --decorate=full --format=%H%n%P%n%D%n%aN±%aE%n%at%n%cN±%cE%n%ct%n%s {limits}";
_findFirstMerged = needFindHead;
}
public List<Models.Commit> Result() {
Exec();
public QueryCommits(string repo, string filter, Models.CommitSearchMethod method, bool onlyCurrentBranch)
{
string search = onlyCurrentBranch ? string.Empty : "--branches --remotes ";
if (current != null) {
current.Message = current.Message.Trim();
commits.Add(current);
if (method == Models.CommitSearchMethod.ByAuthor)
{
search += $"-i --author=\"{filter}\"";
}
else if (method == Models.CommitSearchMethod.ByCommitter)
{
search += $"-i --committer=\"{filter}\"";
}
else if (method == Models.CommitSearchMethod.ByMessage)
{
var argsBuilder = new StringBuilder();
argsBuilder.Append(search);
var words = filter.Split([' ', '\t', '\r'], StringSplitOptions.RemoveEmptyEntries);
foreach (var word in words)
{
var escaped = word.Trim().Replace("\"", "\\\"", StringComparison.Ordinal);
argsBuilder.Append($"--grep=\"{escaped}\" ");
}
argsBuilder.Append("--all-match -i");
search = argsBuilder.ToString();
}
else if (method == Models.CommitSearchMethod.ByFile)
{
search += $"-- \"{filter}\"";
}
else
{
search = $"-G\"{filter}\"";
}
if (findFirstMerged && !isHeadFounded && commits.Count > 0) {
WorkingDirectory = repo;
Context = repo;
Args = $"log -1000 --date-order --no-show-signature --decorate=full --format=%H%n%P%n%D%n%aN±%aE%n%at%n%cN±%cE%n%ct%n%s {search}";
_findFirstMerged = false;
}
public List<Models.Commit> Result()
{
var rs = ReadToEnd();
if (!rs.IsSuccess)
return _commits;
var nextPartIdx = 0;
var start = 0;
var end = rs.StdOut.IndexOf('\n', start);
while (end > 0)
{
var line = rs.StdOut.Substring(start, end - start);
switch (nextPartIdx)
{
case 0:
_current = new Models.Commit() { SHA = line };
_commits.Add(_current);
break;
case 1:
ParseParent(line);
break;
case 2:
_current.ParseDecorators(line);
if (_current.IsMerged && !_isHeadFounded)
_isHeadFounded = true;
break;
case 3:
_current.Author = Models.User.FindOrAdd(line);
break;
case 4:
_current.AuthorTime = ulong.Parse(line);
break;
case 5:
_current.Committer = Models.User.FindOrAdd(line);
break;
case 6:
_current.CommitterTime = ulong.Parse(line);
break;
case 7:
_current.Subject = line;
nextPartIdx = -1;
break;
}
nextPartIdx++;
start = end + 1;
end = rs.StdOut.IndexOf('\n', start);
}
if (start < rs.StdOut.Length)
_current.Subject = rs.StdOut.Substring(start);
if (_findFirstMerged && !_isHeadFounded && _commits.Count > 0)
MarkFirstMerged();
return _commits;
}
return commits;
}
protected override void OnReadline(string line) {
if (isSkipingGpgsig) {
if (line.StartsWith(GPGSIG_END, StringComparison.Ordinal)) isSkipingGpgsig = false;
return;
} else if (line.StartsWith(GPGSIG_START, StringComparison.Ordinal)) {
isSkipingGpgsig = true;
private void ParseParent(string data)
{
if (data.Length < 8)
return;
_current.Parents.AddRange(data.Split(separator: ' ', options: StringSplitOptions.RemoveEmptyEntries));
}
if (line.StartsWith("commit ", StringComparison.Ordinal)) {
if (current != null) {
current.Message = current.Message.Trim();
commits.Add(current);
}
current = new Models.Commit();
line = line.Substring(7);
var decoratorStart = line.IndexOf('(');
if (decoratorStart < 0) {
current.SHA = line.Trim();
} else {
current.SHA = line.Substring(0, decoratorStart).Trim();
current.IsMerged = ParseDecorators(current.Decorators, line.Substring(decoratorStart + 1));
if (!isHeadFounded) isHeadFounded = current.IsMerged;
}
return;
}
if (current == null) return;
if (line.StartsWith("tree ", StringComparison.Ordinal)) {
return;
} else if (line.StartsWith("parent ", StringComparison.Ordinal)) {
current.Parents.Add(line.Substring("parent ".Length));
} else if (line.StartsWith("author ", StringComparison.Ordinal)) {
Models.User user = Models.User.Invalid;
ulong time = 0;
Models.Commit.ParseUserAndTime(line.Substring(7), ref user, ref time);
current.Author = user;
current.AuthorTime = time;
} else if (line.StartsWith("committer ", StringComparison.Ordinal)) {
Models.User user = Models.User.Invalid;
ulong time = 0;
Models.Commit.ParseUserAndTime(line.Substring(10), ref user, ref time);
current.Committer = user;
current.CommitterTime = time;
} else if (string.IsNullOrEmpty(current.Subject)) {
current.Subject = line.Trim();
} else {
current.Message += (line.Trim() + "\n");
}
}
private bool ParseDecorators(List<Models.Decorator> decorators, string data) {
bool isHeadOfCurrent = false;
var subs = data.Split(new char[] { ',', ')', '(' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var sub in subs) {
var d = sub.Trim();
if (d.StartsWith("tag: refs/tags/", StringComparison.Ordinal)) {
decorators.Add(new Models.Decorator() {
Type = Models.DecoratorType.Tag,
Name = d.Substring(15).Trim(),
});
} else if (d.EndsWith("/HEAD", StringComparison.Ordinal)) {
continue;
} else if (d.StartsWith("HEAD -> refs/heads/", StringComparison.Ordinal)) {
isHeadOfCurrent = true;
decorators.Add(new Models.Decorator() {
Type = Models.DecoratorType.CurrentBranchHead,
Name = d.Substring(19).Trim(),
});
} else if (d.StartsWith("refs/heads/", StringComparison.Ordinal)) {
decorators.Add(new Models.Decorator() {
Type = Models.DecoratorType.LocalBranchHead,
Name = d.Substring(11).Trim(),
});
} else if (d.StartsWith("refs/remotes/", StringComparison.Ordinal)) {
decorators.Add(new Models.Decorator() {
Type = Models.DecoratorType.RemoteBranchHead,
Name = d.Substring(13).Trim(),
});
}
}
decorators.Sort((l, r) => {
if (l.Type != r.Type) {
return (int)l.Type - (int)r.Type;
} else {
return l.Name.CompareTo(r.Name);
}
});
return isHeadOfCurrent;
}
private void MarkFirstMerged() {
Args = $"log --since=\"{commits[commits.Count - 1].CommitterTimeStr}\" --format=\"%H\"";
private void MarkFirstMerged()
{
Args = $"log --since=\"{_commits[^1].CommitterTimeStr}\" --format=\"%H\"";
var rs = ReadToEnd();
var shas = rs.StdOut.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
if (shas.Length == 0) return;
var shas = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
if (shas.Length == 0)
return;
var set = new HashSet<string>();
foreach (var sha in shas) set.Add(sha);
foreach (var sha in shas)
set.Add(sha);
foreach (var c in commits) {
if (set.Contains(c.SHA)) {
foreach (var c in _commits)
{
if (set.Contains(c.SHA))
{
c.IsMerged = true;
break;
}
}
}
private List<Models.Commit> _commits = new List<Models.Commit>();
private Models.Commit _current = null;
private bool _findFirstMerged = false;
private bool _isHeadFounded = false;
}
}

View file

@ -0,0 +1,95 @@
using System;
using System.Collections.Generic;
namespace SourceGit.Commands
{
public class QueryCommitsForInteractiveRebase : Command
{
public QueryCommitsForInteractiveRebase(string repo, string on)
{
_boundary = $"----- BOUNDARY OF COMMIT {Guid.NewGuid()} -----";
WorkingDirectory = repo;
Context = repo;
Args = $"log --date-order --no-show-signature --decorate=full --format=\"%H%n%P%n%D%n%aN±%aE%n%at%n%cN±%cE%n%ct%n%B%n{_boundary}\" {on}..HEAD";
}
public List<Models.InteractiveCommit> Result()
{
var rs = ReadToEnd();
if (!rs.IsSuccess)
return _commits;
var nextPartIdx = 0;
var start = 0;
var end = rs.StdOut.IndexOf('\n', start);
while (end > 0)
{
var line = rs.StdOut.Substring(start, end - start);
switch (nextPartIdx)
{
case 0:
_current = new Models.InteractiveCommit();
_current.Commit.SHA = line;
_commits.Add(_current);
break;
case 1:
ParseParent(line);
break;
case 2:
_current.Commit.ParseDecorators(line);
break;
case 3:
_current.Commit.Author = Models.User.FindOrAdd(line);
break;
case 4:
_current.Commit.AuthorTime = ulong.Parse(line);
break;
case 5:
_current.Commit.Committer = Models.User.FindOrAdd(line);
break;
case 6:
_current.Commit.CommitterTime = ulong.Parse(line);
break;
default:
var boundary = rs.StdOut.IndexOf(_boundary, end + 1, StringComparison.Ordinal);
if (boundary > end)
{
_current.Message = rs.StdOut.Substring(start, boundary - start - 1);
end = boundary + _boundary.Length;
}
else
{
_current.Message = rs.StdOut.Substring(start);
end = rs.StdOut.Length - 2;
}
nextPartIdx = -1;
break;
}
nextPartIdx++;
start = end + 1;
if (start >= rs.StdOut.Length - 1)
break;
end = rs.StdOut.IndexOf('\n', start);
}
return _commits;
}
private void ParseParent(string data)
{
if (data.Length < 8)
return;
_current.Commit.Parents.AddRange(data.Split(separator: ' ', options: StringSplitOptions.RemoveEmptyEntries));
}
private List<Models.InteractiveCommit> _commits = [];
private Models.InteractiveCommit _current = null;
private readonly string _boundary;
}
}

View file

@ -1,23 +1,73 @@
using System.Text;
using System;
using System.Diagnostics;
using System.IO;
namespace SourceGit.Commands {
public class QueryFileContent : Command {
public QueryFileContent(string repo, string revision, string file) {
WorkingDirectory = repo;
Context = repo;
Args = $"show {revision}:\"{file}\"";
namespace SourceGit.Commands
{
public static class QueryFileContent
{
public static Stream Run(string repo, string revision, string file)
{
var starter = new ProcessStartInfo();
starter.WorkingDirectory = repo;
starter.FileName = Native.OS.GitExecutable;
starter.Arguments = $"show {revision}:\"{file}\"";
starter.UseShellExecute = false;
starter.CreateNoWindow = true;
starter.WindowStyle = ProcessWindowStyle.Hidden;
starter.RedirectStandardOutput = true;
var stream = new MemoryStream();
try
{
var proc = new Process() { StartInfo = starter };
proc.Start();
proc.StandardOutput.BaseStream.CopyTo(stream);
proc.WaitForExit();
proc.Close();
stream.Position = 0;
}
catch (Exception e)
{
App.RaiseException(repo, $"Failed to query file content: {e}");
}
public string Result() {
Exec();
return _builder.ToString();
return stream;
}
protected override void OnReadline(string line) {
_builder.Append(line);
_builder.Append('\n');
public static Stream FromLFS(string repo, string oid, long size)
{
var starter = new ProcessStartInfo();
starter.WorkingDirectory = repo;
starter.FileName = Native.OS.GitExecutable;
starter.Arguments = $"lfs smudge";
starter.UseShellExecute = false;
starter.CreateNoWindow = true;
starter.WindowStyle = ProcessWindowStyle.Hidden;
starter.RedirectStandardInput = true;
starter.RedirectStandardOutput = true;
var stream = new MemoryStream();
try
{
var proc = new Process() { StartInfo = starter };
proc.Start();
proc.StandardInput.WriteLine("version https://git-lfs.github.com/spec/v1");
proc.StandardInput.WriteLine($"oid sha256:{oid}");
proc.StandardInput.WriteLine($"size {size}");
proc.StandardOutput.BaseStream.CopyTo(stream);
proc.WaitForExit();
proc.Close();
stream.Position = 0;
}
catch (Exception e)
{
App.RaiseException(repo, $"Failed to query file content: {e}");
}
private StringBuilder _builder = new StringBuilder();
return stream;
}
}
}

View file

@ -1,29 +1,30 @@
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class QueryFileSize : Command {
private static readonly Regex REG_FORMAT = new Regex(@"^\d+\s+\w+\s+[0-9a-f]+\s+(\d+)\s+.*$");
namespace SourceGit.Commands
{
public partial class QueryFileSize : Command
{
[GeneratedRegex(@"^\d+\s+\w+\s+[0-9a-f]+\s+(\d+)\s+.*$")]
private static partial Regex REG_FORMAT();
public QueryFileSize(string repo, string file, string revision) {
public QueryFileSize(string repo, string file, string revision)
{
WorkingDirectory = repo;
Context = repo;
Args = $"ls-tree {revision} -l -- {file}";
Args = $"ls-tree {revision} -l -- \"{file}\"";
}
public long Result() {
if (_result != 0) return _result;
public long Result()
{
var rs = ReadToEnd();
if (rs.IsSuccess) {
var match = REG_FORMAT.Match(rs.StdOut);
if (match.Success) {
if (rs.IsSuccess)
{
var match = REG_FORMAT().Match(rs.StdOut);
if (match.Success)
return long.Parse(match.Groups[1].Value);
}
}
return 0;
}
private long _result = 0;
}
}

View file

@ -0,0 +1,26 @@
using System.IO;
namespace SourceGit.Commands
{
public class QueryGitCommonDir : Command
{
public QueryGitCommonDir(string workDir)
{
WorkingDirectory = workDir;
Args = "rev-parse --git-common-dir";
RaiseError = false;
}
public string Result()
{
var rs = ReadToEnd().StdOut;
if (string.IsNullOrEmpty(rs))
return null;
rs = rs.Trim();
if (Path.IsPathRooted(rs))
return rs;
return Path.GetFullPath(Path.Combine(WorkingDirectory, rs));
}
}
}

View file

@ -1,19 +1,25 @@
using System.IO;
namespace SourceGit.Commands {
public class QueryGitDir : Command {
public QueryGitDir(string workDir) {
namespace SourceGit.Commands
{
public class QueryGitDir : Command
{
public QueryGitDir(string workDir)
{
WorkingDirectory = workDir;
Args = "rev-parse --git-dir";
RaiseError = false;
}
public string Result() {
public string Result()
{
var rs = ReadToEnd().StdOut;
if (string.IsNullOrEmpty(rs)) return null;
if (string.IsNullOrEmpty(rs))
return null;
rs = rs.Trim();
if (Path.IsPathRooted(rs)) return rs;
if (Path.IsPathRooted(rs))
return rs;
return Path.GetFullPath(Path.Combine(WorkingDirectory, rs));
}
}

View file

@ -2,65 +2,164 @@
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class QueryLocalChanges : Command {
private static readonly Regex REG_FORMAT = new Regex(@"^(\s?[\w\?]{1,4})\s+(.+)$");
using Avalonia.Threading;
namespace SourceGit.Commands
{
public partial class QueryLocalChanges : Command
{
[GeneratedRegex(@"^(\s?[\w\?]{1,4})\s+(.+)$")]
private static partial Regex REG_FORMAT();
private static readonly string[] UNTRACKED = ["no", "all"];
public QueryLocalChanges(string repo, bool includeUntracked = true) {
public QueryLocalChanges(string repo, bool includeUntracked = true)
{
WorkingDirectory = repo;
Context = repo;
Args = $"status -u{UNTRACKED[includeUntracked ? 1 : 0]} --ignore-submodules=dirty --porcelain";
Args = $"--no-optional-locks status -u{UNTRACKED[includeUntracked ? 1 : 0]} --ignore-submodules=dirty --porcelain";
}
public List<Models.Change> Result() {
Exec();
return _changes;
public List<Models.Change> Result()
{
var outs = new List<Models.Change>();
var rs = ReadToEnd();
if (!rs.IsSuccess)
{
Dispatcher.UIThread.Post(() => App.RaiseException(Context, rs.StdErr));
return outs;
}
protected override void OnReadline(string line) {
var match = REG_FORMAT.Match(line);
if (!match.Success) return;
if (line.EndsWith("/", StringComparison.Ordinal)) return; // Ignore changes with git-worktree
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
var match = REG_FORMAT().Match(line);
if (!match.Success)
continue;
var change = new Models.Change() { Path = match.Groups[2].Value };
var status = match.Groups[1].Value;
switch (status) {
case " M": change.Set(Models.ChangeState.None, Models.ChangeState.Modified); break;
case " A": change.Set(Models.ChangeState.None, Models.ChangeState.Added); break;
case " D": change.Set(Models.ChangeState.None, Models.ChangeState.Deleted); break;
case " R": change.Set(Models.ChangeState.None, Models.ChangeState.Renamed); break;
case " C": change.Set(Models.ChangeState.None, Models.ChangeState.Copied); break;
case "M": change.Set(Models.ChangeState.Modified, Models.ChangeState.None); break;
case "MM": change.Set(Models.ChangeState.Modified, Models.ChangeState.Modified); break;
case "MD": change.Set(Models.ChangeState.Modified, Models.ChangeState.Deleted); break;
case "A": change.Set(Models.ChangeState.Added, Models.ChangeState.None); break;
case "AM": change.Set(Models.ChangeState.Added, Models.ChangeState.Modified); break;
case "AD": change.Set(Models.ChangeState.Added, Models.ChangeState.Deleted); break;
case "D": change.Set(Models.ChangeState.Deleted, Models.ChangeState.None); break;
case "R": change.Set(Models.ChangeState.Renamed, Models.ChangeState.None); break;
case "RM": change.Set(Models.ChangeState.Renamed, Models.ChangeState.Modified); break;
case "RD": change.Set(Models.ChangeState.Renamed, Models.ChangeState.Deleted); break;
case "C": change.Set(Models.ChangeState.Copied, Models.ChangeState.None); break;
case "CM": change.Set(Models.ChangeState.Copied, Models.ChangeState.Modified); break;
case "CD": change.Set(Models.ChangeState.Copied, Models.ChangeState.Deleted); break;
case "DR": change.Set(Models.ChangeState.Deleted, Models.ChangeState.Renamed); break;
case "DC": change.Set(Models.ChangeState.Deleted, Models.ChangeState.Copied); break;
case "DD": change.Set(Models.ChangeState.Deleted, Models.ChangeState.Deleted); break;
case "AU": change.Set(Models.ChangeState.Added, Models.ChangeState.Unmerged); break;
case "UD": change.Set(Models.ChangeState.Unmerged, Models.ChangeState.Deleted); break;
case "UA": change.Set(Models.ChangeState.Unmerged, Models.ChangeState.Added); break;
case "DU": change.Set(Models.ChangeState.Deleted, Models.ChangeState.Unmerged); break;
case "AA": change.Set(Models.ChangeState.Added, Models.ChangeState.Added); break;
case "UU": change.Set(Models.ChangeState.Unmerged, Models.ChangeState.Unmerged); break;
case "??": change.Set(Models.ChangeState.Untracked, Models.ChangeState.Untracked); break;
default: return;
switch (status)
{
case " M":
change.Set(Models.ChangeState.None, Models.ChangeState.Modified);
break;
case " T":
change.Set(Models.ChangeState.None, Models.ChangeState.TypeChanged);
break;
case " A":
change.Set(Models.ChangeState.None, Models.ChangeState.Added);
break;
case " D":
change.Set(Models.ChangeState.None, Models.ChangeState.Deleted);
break;
case " R":
change.Set(Models.ChangeState.None, Models.ChangeState.Renamed);
break;
case " C":
change.Set(Models.ChangeState.None, Models.ChangeState.Copied);
break;
case "M":
change.Set(Models.ChangeState.Modified);
break;
case "MM":
change.Set(Models.ChangeState.Modified, Models.ChangeState.Modified);
break;
case "MT":
change.Set(Models.ChangeState.Modified, Models.ChangeState.TypeChanged);
break;
case "MD":
change.Set(Models.ChangeState.Modified, Models.ChangeState.Deleted);
break;
case "T":
change.Set(Models.ChangeState.TypeChanged);
break;
case "TM":
change.Set(Models.ChangeState.TypeChanged, Models.ChangeState.Modified);
break;
case "TT":
change.Set(Models.ChangeState.TypeChanged, Models.ChangeState.TypeChanged);
break;
case "TD":
change.Set(Models.ChangeState.TypeChanged, Models.ChangeState.Deleted);
break;
case "A":
change.Set(Models.ChangeState.Added);
break;
case "AM":
change.Set(Models.ChangeState.Added, Models.ChangeState.Modified);
break;
case "AT":
change.Set(Models.ChangeState.Added, Models.ChangeState.TypeChanged);
break;
case "AD":
change.Set(Models.ChangeState.Added, Models.ChangeState.Deleted);
break;
case "D":
change.Set(Models.ChangeState.Deleted);
break;
case "R":
change.Set(Models.ChangeState.Renamed);
break;
case "RM":
change.Set(Models.ChangeState.Renamed, Models.ChangeState.Modified);
break;
case "RT":
change.Set(Models.ChangeState.Renamed, Models.ChangeState.TypeChanged);
break;
case "RD":
change.Set(Models.ChangeState.Renamed, Models.ChangeState.Deleted);
break;
case "C":
change.Set(Models.ChangeState.Copied);
break;
case "CM":
change.Set(Models.ChangeState.Copied, Models.ChangeState.Modified);
break;
case "CT":
change.Set(Models.ChangeState.Copied, Models.ChangeState.TypeChanged);
break;
case "CD":
change.Set(Models.ChangeState.Copied, Models.ChangeState.Deleted);
break;
case "DD":
change.ConflictReason = Models.ConflictReason.BothDeleted;
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
break;
case "AU":
change.ConflictReason = Models.ConflictReason.AddedByUs;
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
break;
case "UD":
change.ConflictReason = Models.ConflictReason.DeletedByThem;
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
break;
case "UA":
change.ConflictReason = Models.ConflictReason.AddedByThem;
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
break;
case "DU":
change.ConflictReason = Models.ConflictReason.DeletedByUs;
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
break;
case "AA":
change.ConflictReason = Models.ConflictReason.BothAdded;
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
break;
case "UU":
change.ConflictReason = Models.ConflictReason.BothModified;
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
break;
case "??":
change.Set(Models.ChangeState.None, Models.ChangeState.Untracked);
break;
}
_changes.Add(change);
if (change.Index != Models.ChangeState.None || change.WorkTree != Models.ChangeState.None)
outs.Add(change);
}
private List<Models.Change> _changes = new List<Models.Change>();
return outs;
}
}
}

View file

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
namespace SourceGit.Commands
{
public class QueryRefsContainsCommit : Command
{
public QueryRefsContainsCommit(string repo, string commit)
{
WorkingDirectory = repo;
RaiseError = false;
Args = $"for-each-ref --format=\"%(refname)\" --contains {commit}";
}
public List<Models.Decorator> Result()
{
var rs = new List<Models.Decorator>();
var output = ReadToEnd();
if (!output.IsSuccess)
return rs;
var lines = output.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
if (line.EndsWith("/HEAD", StringComparison.Ordinal))
continue;
if (line.StartsWith("refs/heads/", StringComparison.Ordinal))
rs.Add(new() { Name = line.Substring("refs/heads/".Length), Type = Models.DecoratorType.LocalBranchHead });
else if (line.StartsWith("refs/remotes/", StringComparison.Ordinal))
rs.Add(new() { Name = line.Substring("refs/remotes/".Length), Type = Models.DecoratorType.RemoteBranchHead });
else if (line.StartsWith("refs/tags/", StringComparison.Ordinal))
rs.Add(new() { Name = line.Substring("refs/tags/".Length), Type = Models.DecoratorType.Tag });
}
return rs;
}
}
}

View file

@ -1,34 +1,48 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class QueryRemotes : Command {
private static readonly Regex REG_REMOTE = new Regex(@"^([\w\.\-]+)\s*(\S+).*$");
namespace SourceGit.Commands
{
public partial class QueryRemotes : Command
{
[GeneratedRegex(@"^([\w\.\-]+)\s*(\S+).*$")]
private static partial Regex REG_REMOTE();
public QueryRemotes(string repo) {
public QueryRemotes(string repo)
{
WorkingDirectory = repo;
Context = repo;
Args = "remote -v";
}
public List<Models.Remote> Result() {
Exec();
return _loaded;
}
public List<Models.Remote> Result()
{
var outs = new List<Models.Remote>();
var rs = ReadToEnd();
if (!rs.IsSuccess)
return outs;
protected override void OnReadline(string line) {
var match = REG_REMOTE.Match(line);
if (!match.Success) return;
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
var match = REG_REMOTE().Match(line);
if (!match.Success)
continue;
var remote = new Models.Remote() {
var remote = new Models.Remote()
{
Name = match.Groups[1].Value,
URL = match.Groups[2].Value,
};
if (_loaded.Find(x => x.Name == remote.Name) != null) return;
_loaded.Add(remote);
if (outs.Find(x => x.Name == remote.Name) != null)
continue;
outs.Add(remote);
}
private List<Models.Remote> _loaded = new List<Models.Remote>();
return outs;
}
}
}

View file

@ -1,15 +1,11 @@
namespace SourceGit.Commands {
public class QueryRepositoryRootPath : Command {
public QueryRepositoryRootPath(string path) {
namespace SourceGit.Commands
{
public class QueryRepositoryRootPath : Command
{
public QueryRepositoryRootPath(string path)
{
WorkingDirectory = path;
Args = "rev-parse --show-toplevel";
RaiseError = false;
}
public string Result() {
var rs = ReadToEnd().StdOut;
if (string.IsNullOrEmpty(rs)) return null;
return rs.Trim();
}
}
}

View file

@ -0,0 +1,21 @@
namespace SourceGit.Commands
{
public class QueryRevisionByRefName : Command
{
public QueryRevisionByRefName(string repo, string refname)
{
WorkingDirectory = repo;
Context = repo;
Args = $"rev-parse {refname}";
}
public string Result()
{
var rs = ReadToEnd();
if (rs.IsSuccess && !string.IsNullOrEmpty(rs.StdOut))
return rs.StdOut.Trim();
return null;
}
}
}

View file

@ -0,0 +1,27 @@
using System.Collections.Generic;
namespace SourceGit.Commands
{
public class QueryRevisionFileNames : Command
{
public QueryRevisionFileNames(string repo, string revision)
{
WorkingDirectory = repo;
Context = repo;
Args = $"ls-tree -r -z --name-only {revision}";
}
public List<string> Result()
{
var rs = ReadToEnd();
if (!rs.IsSuccess)
return [];
var lines = rs.StdOut.Split('\0', System.StringSplitOptions.RemoveEmptyEntries);
var outs = new List<string>();
foreach (var line in lines)
outs.Add(line);
return outs;
}
}
}

View file

@ -1,39 +1,75 @@
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class QueryRevisionObjects : Command {
private static readonly Regex REG_FORMAT = new Regex(@"^\d+\s+(\w+)\s+([0-9a-f]+)\s+(.*)$");
private List<Models.Object> objects = new List<Models.Object>();
namespace SourceGit.Commands
{
public partial class QueryRevisionObjects : Command
{
[GeneratedRegex(@"^\d+\s+(\w+)\s+([0-9a-f]+)\s+(.*)$")]
private static partial Regex REG_FORMAT();
public QueryRevisionObjects(string repo, string sha) {
public QueryRevisionObjects(string repo, string sha, string parentFolder)
{
WorkingDirectory = repo;
Context = repo;
Args = $"ls-tree -r {sha}";
Args = $"ls-tree -z {sha}";
if (!string.IsNullOrEmpty(parentFolder))
Args += $" -- \"{parentFolder}\"";
}
public List<Models.Object> Result() {
Exec();
return objects;
public List<Models.Object> Result()
{
var rs = ReadToEnd();
if (rs.IsSuccess)
{
var start = 0;
var end = rs.StdOut.IndexOf('\0', start);
while (end > 0)
{
var line = rs.StdOut.Substring(start, end - start);
Parse(line);
start = end + 1;
end = rs.StdOut.IndexOf('\0', start);
}
protected override void OnReadline(string line) {
var match = REG_FORMAT.Match(line);
if (!match.Success) return;
if (start < rs.StdOut.Length)
Parse(rs.StdOut.Substring(start));
}
return _objects;
}
private void Parse(string line)
{
var match = REG_FORMAT().Match(line);
if (!match.Success)
return;
var obj = new Models.Object();
obj.SHA = match.Groups[2].Value;
obj.Type = Models.ObjectType.Blob;
obj.Path = match.Groups[3].Value;
switch (match.Groups[1].Value) {
case "blob": obj.Type = Models.ObjectType.Blob; break;
case "tree": obj.Type = Models.ObjectType.Tree; break;
case "tag": obj.Type = Models.ObjectType.Tag; break;
case "commit": obj.Type = Models.ObjectType.Commit; break;
switch (match.Groups[1].Value)
{
case "blob":
obj.Type = Models.ObjectType.Blob;
break;
case "tree":
obj.Type = Models.ObjectType.Tree;
break;
case "tag":
obj.Type = Models.ObjectType.Tag;
break;
case "commit":
obj.Type = Models.ObjectType.Commit;
break;
}
objects.Add(obj);
}
_objects.Add(obj);
}
private List<Models.Object> _objects = new List<Models.Object>();
}
}

View file

@ -0,0 +1,41 @@
using System;
namespace SourceGit.Commands
{
public class QuerySingleCommit : Command
{
public QuerySingleCommit(string repo, string sha)
{
WorkingDirectory = repo;
Context = repo;
Args = $"show --no-show-signature --decorate=full --format=%H%n%P%n%D%n%aN±%aE%n%at%n%cN±%cE%n%ct%n%s -s {sha}";
}
public Models.Commit Result()
{
var rs = ReadToEnd();
if (rs.IsSuccess && !string.IsNullOrEmpty(rs.StdOut))
{
var commit = new Models.Commit();
var lines = rs.StdOut.Split('\n');
if (lines.Length < 8)
return null;
commit.SHA = lines[0];
if (!string.IsNullOrEmpty(lines[1]))
commit.Parents.AddRange(lines[1].Split(' ', StringSplitOptions.RemoveEmptyEntries));
if (!string.IsNullOrEmpty(lines[2]))
commit.ParseDecorators(lines[2]);
commit.Author = Models.User.FindOrAdd(lines[3]);
commit.AuthorTime = ulong.Parse(lines[4]);
commit.Committer = Models.User.FindOrAdd(lines[5]);
commit.CommitterTime = ulong.Parse(lines[6]);
commit.Subject = lines[7];
return commit;
}
return null;
}
}
}

View file

@ -0,0 +1,92 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands
{
public partial class QueryStagedChangesWithAmend : Command
{
[GeneratedRegex(@"^:[\d]{6} ([\d]{6}) ([0-9a-f]{40}) [0-9a-f]{40} ([ACDMT])\d{0,6}\t(.*)$")]
private static partial Regex REG_FORMAT1();
[GeneratedRegex(@"^:[\d]{6} ([\d]{6}) ([0-9a-f]{40}) [0-9a-f]{40} R\d{0,6}\t(.*\t.*)$")]
private static partial Regex REG_FORMAT2();
public QueryStagedChangesWithAmend(string repo, string parent)
{
WorkingDirectory = repo;
Context = repo;
Args = $"diff-index --cached -M {parent}";
_parent = parent;
}
public List<Models.Change> Result()
{
var rs = ReadToEnd();
if (!rs.IsSuccess)
return [];
var changes = new List<Models.Change>();
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
var match = REG_FORMAT2().Match(line);
if (match.Success)
{
var change = new Models.Change()
{
Path = match.Groups[3].Value,
DataForAmend = new Models.ChangeDataForAmend()
{
FileMode = match.Groups[1].Value,
ObjectHash = match.Groups[2].Value,
ParentSHA = _parent,
},
};
change.Set(Models.ChangeState.Renamed);
changes.Add(change);
continue;
}
match = REG_FORMAT1().Match(line);
if (match.Success)
{
var change = new Models.Change()
{
Path = match.Groups[4].Value,
DataForAmend = new Models.ChangeDataForAmend()
{
FileMode = match.Groups[1].Value,
ObjectHash = match.Groups[2].Value,
ParentSHA = _parent,
},
};
var type = match.Groups[3].Value;
switch (type)
{
case "A":
change.Set(Models.ChangeState.Added);
break;
case "C":
change.Set(Models.ChangeState.Copied);
break;
case "D":
change.Set(Models.ChangeState.Deleted);
break;
case "M":
change.Set(Models.ChangeState.Modified);
break;
case "T":
change.Set(Models.ChangeState.TypeChanged);
break;
}
changes.Add(change);
}
}
return changes;
}
private readonly string _parent;
}
}

View file

@ -0,0 +1,29 @@
using System.Text.RegularExpressions;
namespace SourceGit.Commands
{
public partial class QueryStagedFileBlobGuid : Command
{
[GeneratedRegex(@"^\d+\s+([0-9a-f]+)\s+.*$")]
private static partial Regex REG_FORMAT();
public QueryStagedFileBlobGuid(string repo, string file)
{
WorkingDirectory = repo;
Context = repo;
Args = $"ls-files -s -- \"{file}\"";
}
public string Result()
{
var rs = ReadToEnd();
var match = REG_FORMAT().Match(rs.StdOut.Trim());
if (match.Success)
{
return match.Groups[1].Value;
}
return string.Empty;
}
}
}

View file

@ -1,37 +0,0 @@
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class QueryStashChanges : Command {
private static readonly Regex REG_FORMAT = new Regex(@"^(\s?[\w\?]{1,4})\s+(.+)$");
public QueryStashChanges(string repo, string sha) {
WorkingDirectory = repo;
Context = repo;
Args = $"diff --name-status --pretty=format: {sha}^ {sha}";
}
public List<Models.Change> Result() {
Exec();
return _changes;
}
protected override void OnReadline(string line) {
var match = REG_FORMAT.Match(line);
if (!match.Success) return;
var change = new Models.Change() { Path = match.Groups[2].Value };
var status = match.Groups[1].Value;
switch (status[0]) {
case 'M': change.Set(Models.ChangeState.Modified); _changes.Add(change); break;
case 'A': change.Set(Models.ChangeState.Added); _changes.Add(change); break;
case 'D': change.Set(Models.ChangeState.Deleted); _changes.Add(change); break;
case 'R': change.Set(Models.ChangeState.Renamed); _changes.Add(change); break;
case 'C': change.Set(Models.ChangeState.Copied); _changes.Add(change); break;
}
}
private List<Models.Change> _changes = new List<Models.Change>();
}
}

View file

@ -1,47 +1,73 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
public class QueryStashes : Command {
private static readonly Regex REG_STASH = new Regex(@"^Reflog: refs/(stash@\{\d+\}).*$");
public QueryStashes(string repo) {
namespace SourceGit.Commands
{
public class QueryStashes : Command
{
public QueryStashes(string repo)
{
WorkingDirectory = repo;
Context = repo;
Args = "stash list --pretty=raw";
Args = "stash list --format=%H%n%P%n%ct%n%gd%n%s";
}
public List<Models.Stash> Result() {
Exec();
if (_current != null) _stashes.Add(_current);
return _stashes;
public List<Models.Stash> Result()
{
var outs = new List<Models.Stash>();
var rs = ReadToEnd();
if (!rs.IsSuccess)
return outs;
var nextPartIdx = 0;
var start = 0;
var end = rs.StdOut.IndexOf('\n', start);
while (end > 0)
{
var line = rs.StdOut.Substring(start, end - start);
switch (nextPartIdx)
{
case 0:
_current = new Models.Stash() { SHA = line };
outs.Add(_current);
break;
case 1:
ParseParent(line);
break;
case 2:
_current.Time = ulong.Parse(line);
break;
case 3:
_current.Name = line;
break;
case 4:
_current.Message = line;
break;
}
protected override void OnReadline(string line) {
if (line.StartsWith("commit ", StringComparison.Ordinal)) {
if (_current != null && !string.IsNullOrEmpty(_current.Name)) _stashes.Add(_current);
_current = new Models.Stash() { SHA = line.Substring(7, 8) };
nextPartIdx++;
if (nextPartIdx > 4)
nextPartIdx = 0;
start = end + 1;
end = rs.StdOut.IndexOf('\n', start);
}
if (start < rs.StdOut.Length)
_current.Message = rs.StdOut.Substring(start);
return outs;
}
private void ParseParent(string data)
{
if (data.Length < 8)
return;
_current.Parents.AddRange(data.Split(separator: ' ', options: StringSplitOptions.RemoveEmptyEntries));
}
if (_current == null) return;
if (line.StartsWith("Reflog: refs/stash@", StringComparison.Ordinal)) {
var match = REG_STASH.Match(line);
if (match.Success) _current.Name = match.Groups[1].Value;
} else if (line.StartsWith("Reflog message: ", StringComparison.Ordinal)) {
_current.Message = line.Substring(16);
} else if (line.StartsWith("author ", StringComparison.Ordinal)) {
Models.User user = Models.User.Invalid;
ulong time = 0;
Models.Commit.ParseUserAndTime(line.Substring(7), ref user, ref time);
_current.Author = user;
_current.Time = time;
}
}
private List<Models.Stash> _stashes = new List<Models.Stash>();
private Models.Stash _current = null;
}
}

Some files were not shown because too many files have changed in this diff Show more