Compare commits

..
20 Commits
Author SHA1 Message Date
Jesse Duffield 27cd12e2d9 accept umlaut keybindings 2020-08-12 20:07:56 +10:00
Jesse Duffield bfaf1c4f70 use remote prefixed branch name when merging remote branch 2020-08-12 20:07:46 +10:00
Jesse Duffield 2d18d089ce allow entering a password when fast forwarding another branch 2020-08-12 18:47:16 +10:00
Jesse Duffield 9c7e40906d rename arg 2020-08-12 18:47:16 +10:00
Jesse Duffield 401f291c3b lowercase function name 2020-08-12 18:47:16 +10:00
Jesse Duffield bea2ae5ff5 stop pulling in general 2020-08-12 18:47:16 +10:00
Jesse Duffield f49e4946f2 minor refactor 2020-08-12 18:47:16 +10:00
Jesse Duffield 8ff74072f8 update config 2020-08-12 18:47:16 +10:00
Jesse Duffield fcd5aea04e support multiple modes of git pull 2020-08-12 18:47:16 +10:00
Jesse Duffield 1c0da2967c update naming 2020-08-12 18:47:16 +10:00
Jesse Duffield 1b78a42b80 pass callback directly 2020-08-12 18:47:16 +10:00
Jesse Duffield 79e73d2eff minor cleanup
WIP
2020-08-12 18:47:16 +10:00
Jesse Duffield 23299f88e9 simplify patch modifier interface 2020-08-09 15:42:20 +10:00
mjarkk ef744e45c1 Update dutch translations 2020-08-08 14:25:11 +10:00
Jesse Duffield 660cc2f3d1 follow cursor when staging and unstaging a file rename 2020-08-07 18:59:56 +10:00
Jesse Duffield 469ac116ef allow renames to be discarded 2020-08-07 18:01:26 +10:00
Jesse Duffield a86103479b cleanup 2020-08-07 18:01:26 +10:00
Axel Navarro d49e75bd3e Add tab keybinding in commit message 2020-07-26 16:28:01 +10:00
Jesse Duffield f4718a9047 allow editing commit files 2020-07-21 18:24:39 +10:00
Jesse Duffield 7d5fe4b66c better logic for staging a renamed file 2020-07-19 14:11:32 +10:00
26 changed files with 907 additions and 335 deletions
-1
View File
@@ -1,5 +1,4 @@
# These are supported funding model platforms
github: [jesseduffield]
ko_fi: jesseduffield
custom: ['https://donorbox.org/lazygit']
-2
View File
@@ -61,5 +61,3 @@ brews:
# conflicts:
# - svn
# - bash
# test comment to see if goreleaser only releases on new commits
+2
View File
@@ -41,6 +41,8 @@ Default path for the config file:
manualCommit: false
# extra args passed to `git merge`, e.g. --no-ff
args: ""
pull:
mode: 'merge' # one of 'merge' | 'rebase' | 'ff-only'
skipHookPrefix: WIP
autoFetch: true
branchLogCmd: "git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium {{branchName}} --"
+1
View File
@@ -104,6 +104,7 @@
<kbd>c</kbd>: checkout file
<kbd>d</kbd>: discard this commit's changes to this file
<kbd>o</kbd>: open file
<kbd>e</kbd>: edit file
<kbd>space</kbd>: toggle file included in patch
<kbd>enter</kbd>: enter file to add selected lines to the patch
<kbd>,</kbd>: previous page
+123 -122
View File
@@ -1,33 +1,33 @@
# Lazygit Keybindings
# Lazygit Sneltoetsen
## Global
<pre>
<kbd>pgup</kbd>: scroll up main panel (fn+up)
<kbd>pgdown</kbd>: scroll down main panel (fn+down)
<kbd>pgup</kbd>: scroll omhoog naar hooft paneel (fn+up)
<kbd>pgdown</kbd>: scroll beneden naar hooft paneel (fn+down)
<kbd>m</kbd>: bekijk merge/rebase opties
<kbd>ctrl+p</kbd>: view custom patch options
<kbd>ctrl+p</kbd>: bekijk aangepaste patch opties
<kbd>P</kbd>: push
<kbd>p</kbd>: pull
<kbd>R</kbd>: verversen
<kbd>x</kbd>: open menu
<kbd>z</kbd>: undo (via reflog) (experimental)
<kbd>ctrl+z</kbd>: redo (via reflog) (experimental)
<kbd>+</kbd>: next screen mode (normal/half/fullscreen)
<kbd>_</kbd>: prev screen mode
<kbd>z</kbd>: ongedaan maken (via reflog) (experimenteel)
<kbd>ctrl+z</kbd>: redo (via reflog) (experimenteel)
<kbd>+</kbd>: volgende schermmode (normaal/half/groot )
<kbd>_</kbd>: vorige schermmode
<kbd>:</kbd>: voor aangepast commando uit
<kbd>|</kbd>: view scoping options
<kbd>ctrl+e</kbd>: open diff menu
</pre>
## Branches Panel
## Branches Paneel
<pre>
<kbd>]</kbd>: next tab
<kbd>[</kbd>: previous tab
<kbd>]</kbd>: volgende tab
<kbd>[</kbd>: vorige tab
</pre>
## Branches Panel (Branches Tab)
## Branches Paneel (Branches Tab)
<pre>
<kbd>space</kbd>: uitchecken
@@ -37,95 +37,96 @@
<kbd>n</kbd>: nieuwe branch
<kbd>d</kbd>: verwijder branch
<kbd>r</kbd>: rebase branch
<kbd>M</kbd>: merge in met huidige checked out branch
<kbd>i</kbd>: show git-flow options
<kbd>f</kbd>: fast-forward this branch from its upstream
<kbd>M</kbd>: merge in met huidige uitgecheckte branch
<kbd>i</kbd>: laat git-flow opties zien
<kbd>f</kbd>: fast-forward deze branch van zijn upstream
<kbd>g</kbd>: bekijk reset opties
<kbd>R</kbd>: rename branch
<kbd>ctrl+o</kbd>: copy branch name to clipboard
<kbd>,</kbd>: previous page
<kbd>.</kbd>: next page
<kbd><</kbd>: scroll to top
<kbd>/</kbd>: start search
<kbd>></kbd>: scroll to bottom
<kbd>R</kbd>: hernoem branch
<kbd>ctrl+o</kbd>: copieer branch name clipboard
<kbd>,</kbd>: vorige pagina
<kbd>.</kbd>: volgende pagina
<kbd><</kbd>: scroll naar bovenkant
<kbd>/</kbd>: start met zoekken
<kbd>></kbd>: scroll naar bodem
</pre>
## Branches Panel (Remote Branches (in Remotes tab))
## Branches Paneel (Remote Branches (in Remotes tab))
<pre>
<kbd>esc</kbd>: return to remotes list
<kbd>esc</kbd>: ga terug naar remotes lijst
<kbd>g</kbd>: bekijk reset opties
<kbd>space</kbd>: uitchecken
<kbd>n</kbd>: nieuwe branch
<kbd>M</kbd>: merge in met huidige checked out branch
<kbd>M</kbd>: merge in met huidige uitgecheckte branch
<kbd>d</kbd>: verwijder branch
<kbd>r</kbd>: rebase branch
<kbd>u</kbd>: set as upstream of checked-out branch
<kbd>,</kbd>: previous page
<kbd>.</kbd>: next page
<kbd><</kbd>: scroll to top
<kbd>/</kbd>: start search
<kbd>></kbd>: scroll to bottom
<kbd>,</kbd>: vorige pagina
<kbd>.</kbd>: volgende pagina
<kbd><</kbd>: scroll naar bovenkant
<kbd>/</kbd>: start met zoekken
<kbd>></kbd>: scroll naar bodem
</pre>
## Branches Panel (Remotes Tab)
## Branches Paneel (Remotes Tab)
<pre>
<kbd>f</kbd>: fetch remote
<kbd>n</kbd>: add new remote
<kbd>d</kbd>: remove remote
<kbd>e</kbd>: edit remote
<kbd>,</kbd>: previous page
<kbd>.</kbd>: next page
<kbd><</kbd>: scroll to top
<kbd>/</kbd>: start search
<kbd>></kbd>: scroll to bottom
<kbd>f</kbd>: remote ophalen
<kbd>n</kbd>: nieuwe remote toevoegen
<kbd>d</kbd>: verwijder remote
<kbd>e</kbd>: wijzig remote
<kbd>,</kbd>: vorige pagina
<kbd>.</kbd>: volgende pagina
<kbd><</kbd>: scroll naar bovenkant
<kbd>/</kbd>: start met zoekken
<kbd>></kbd>: scroll naar bodem
</pre>
## Branches Panel (Tags Tab)
## Branches Paneel (Tags Tab)
<pre>
<kbd>space</kbd>: uitchecken
<kbd>d</kbd>: delete tag
<kbd>d</kbd>: verwijdert tag
<kbd>P</kbd>: push tag
<kbd>n</kbd>: create tag
<kbd>n</kbd>: nieuwe tag
<kbd>g</kbd>: bekijk reset opties
<kbd>,</kbd>: previous page
<kbd>.</kbd>: next page
<kbd><</kbd>: scroll to top
<kbd>/</kbd>: start search
<kbd>></kbd>: scroll to bottom
<kbd>,</kbd>: vorige pagina
<kbd>.</kbd>: volgende pagina
<kbd><</kbd>: scroll naar bovenkant
<kbd>/</kbd>: start met zoekken
<kbd>></kbd>: scroll naar bodem
</pre>
## Commit bestanden Panel
## Commit bestanden Paneel
<pre>
<kbd>esc</kbd>: ga terug
<kbd>c</kbd>: bestand uitchecken
<kbd>d</kbd>: uitsluit deze commit zijn veranderingen aan dit bestand
<kbd>d</kbd>: uitsluit deze commit zijn wijzigingen aan dit bestand
<kbd>o</kbd>: open bestand
<kbd>space</kbd>: toggle file included in patch
<kbd>enter</kbd>: enter file to add selected lines to the patch
<kbd>,</kbd>: previous page
<kbd>.</kbd>: next page
<kbd><</kbd>: scroll to top
<kbd>/</kbd>: start search
<kbd>></kbd>: scroll to bottom
<kbd>e</kbd>: verander bestand
<kbd>space</kbd>: wissel bestand opgenomen in patch
<kbd>enter</kbd>: open bestand om specifieke lijnen toe te voegen aan patch
<kbd>,</kbd>: vorige pagina
<kbd>.</kbd>: volgende pagina
<kbd><</kbd>: scroll naar bovenkant
<kbd>/</kbd>: start met zoekken
<kbd>></kbd>: scroll naar bodem
</pre>
## Commits Panel
## Commits Paneel
<pre>
<kbd>]</kbd>: next tab
<kbd>[</kbd>: previous tab
<kbd>]</kbd>: volgende tab
<kbd>[</kbd>: vorige tab
</pre>
## Commits Panel (Commits Tab)
## Commits Paneel (Commits Tab)
<pre>
<kbd>s</kbd>: squash beneden
<kbd>r</kbd>: hernoem commit
<kbd>R</kbd>: rename commit with editor
<kbd>R</kbd>: hernoem commit met editor
<kbd>g</kbd>: reset naar deze commit
<kbd>f</kbd>: Fixup commit
<kbd>F</kbd>: creëer fixup commit voor deze commit
@@ -134,64 +135,64 @@
<kbd>ctrl+j</kbd>: verplaats commit 1 omlaag
<kbd>ctrl+k</kbd>: verplaats commit 1 omhoog
<kbd>e</kbd>: verander commit
<kbd>A</kbd>: wijzig commit met staged veranderingen
<kbd>p</kbd>: pick commit (when mid-rebase)
<kbd>A</kbd>: wijzig commit met staged wijzigingen
<kbd>p</kbd>: pick commit (wanneer midden in rebase)
<kbd>t</kbd>: commit omgedaan maken
<kbd>c</kbd>: kopiëer commit (cherry-pick)
<kbd>ctrl+o</kbd>: copy commit SHA to clipboard
<kbd>ctrl+o</kbd>: kopiëer commit SHA naar clipboard
<kbd>C</kbd>: kopiëer commit reeks (cherry-pick)
<kbd>v</kbd>: plak commits (cherry-pick)
<kbd>enter</kbd>: bekijk gecommite bestanden
<kbd>space</kbd>: checkout commit
<kbd>T</kbd>: tag commit
<kbd>ctrl+r</kbd>: reset cherry-picked (copied) commits selection
<kbd>,</kbd>: previous page
<kbd>.</kbd>: next page
<kbd><</kbd>: scroll to top
<kbd>/</kbd>: start search
<kbd>></kbd>: scroll to bottom
<kbd>ctrl+r</kbd>: reset cherry-picked (gecopieerde) commits selectie
<kbd>,</kbd>: vorige pagina
<kbd>.</kbd>: volgende pagina
<kbd><</kbd>: scroll naar bovenkant
<kbd>/</kbd>: start met zoekken
<kbd>></kbd>: scroll naar bodem
</pre>
## Commits Panel (Reflog Tab)
## Commits Paneel (Reflog Tab)
<pre>
<kbd>space</kbd>: checkout commit
<kbd>g</kbd>: bekijk reset opties
<kbd>,</kbd>: previous page
<kbd>.</kbd>: next page
<kbd><</kbd>: scroll to top
<kbd>/</kbd>: start search
<kbd>></kbd>: scroll to bottom
<kbd>,</kbd>: vorige pagina
<kbd>.</kbd>: volgende pagina
<kbd><</kbd>: scroll naar bovenkant
<kbd>/</kbd>: start met zoekken
<kbd>></kbd>: scroll naar bodem
</pre>
## Bestanden Panel
## Bestanden Paneel
<pre>
<kbd>c</kbd>: Commit veranderingen
<kbd>w</kbd>: commit veranderingen zonder pre-commit hook
<kbd>c</kbd>: commit wijzigingen
<kbd>w</kbd>: commit wijzigingen zonder pre-commit hook
<kbd>A</kbd>: wijzig laatste commit
<kbd>C</kbd>: commit veranderingen met de git editor
<kbd>space</kbd>: toggle staged
<kbd>d</kbd>: bekijk 'veranderingen ongedaan maken' opties
<kbd>C</kbd>: commit wijzigingen met de git editor
<kbd>space</kbd>: wissel staged
<kbd>d</kbd>: bekijk 'wijzigingen ongedaan maken' opties
<kbd>e</kbd>: verander bestand
<kbd>o</kbd>: open bestand
<kbd>i</kbd>: voeg toe aan .gitignore
<kbd>r</kbd>: refresh bestanden
<kbd>r</kbd>: bestanden vernieuwen
<kbd>s</kbd>: stash-bestanden
<kbd>S</kbd>: view stash options
<kbd>a</kbd>: toggle staged alle
<kbd>S</kbd>: bekijk stash opties
<kbd>a</kbd>: wissel staged alle
<kbd>D</kbd>: bekijk reset opties
<kbd>enter</kbd>: stage individuele hunks/lijnen
<kbd>f</kbd>: fetch
<kbd>g</kbd>: view upstream reset options
<kbd>,</kbd>: previous page
<kbd>.</kbd>: next page
<kbd><</kbd>: scroll to top
<kbd>/</kbd>: start search
<kbd>></kbd>: scroll to bottom
<kbd>g</kbd>: bekijk upstream reset optie
<kbd>,</kbd>: vorige pagina
<kbd>.</kbd>: volgende pagina
<kbd><</kbd>: scroll naar bovenkant
<kbd>/</kbd>: start met zoekken
<kbd>></kbd>: scroll naar bodem
</pre>
## Hoofd Panel (Merging)
## Hoofd Paneel (Merging)
<pre>
<kbd>esc</kbd>: ga terug naar het bestanden paneel
@@ -204,77 +205,77 @@
<kbd>z</kbd>: ongedaan maken
</pre>
## Hoofd Panel (Normaal)
## Hoofd Paneel (Normaal)
<pre>
<kbd> ̄</kbd>: scroll omlaag (fn+up)
<kbd>¦</kbd>: scroll omhoog (fn+down)
</pre>
## Hoofd Panel (Patch Building)
## Hoofd Paneel (Patch Building)
<pre>
<kbd>esc</kbd>: exit line-by-line mode
<kbd>esc</kbd>: sluit lijn-bij-lijn mode
<kbd>▲</kbd>: selecteer de vorige lijn
<kbd>▼</kbd>: selecteer de volgende lijn
<kbd>◄</kbd>: selecteer de vorige hunk
<kbd>►</kbd>: selecteer de volgende hunk
<kbd>space</kbd>: add/remove line(s) to patch
<kbd>v</kbd>: toggle drag select
<kbd>V</kbd>: toggle drag select
<kbd>a</kbd>: toggle select hunk
<kbd>space</kbd>: voeg toe/verwijdert lijn(en) in patch
<kbd>v</kbd>: wissel drag selectie
<kbd>V</kbd>: wissel drag selectie
<kbd>a</kbd>: wissel selectie hunk
</pre>
## Hoofd Panel (Stage Lines/Hunks)
## Hoofd Paneel (Stage Lines/Hunks)
<pre>
<kbd>esc</kbd>: ga terug naar het bestanden paneel
<kbd>space</kbd>: toggle line staged / unstaged
<kbd>d</kbd>: delete change (git reset)
<kbd>tab</kbd>: switch to other panel
<kbd>space</kbd>: wissel lijn staged / unstaged
<kbd>d</kbd>: verwijdert wijziging (git reset)
<kbd>tab</kbd>: ga naar ander paneel
<kbd>▲</kbd>: selecteer de vorige lijn
<kbd>▼</kbd>: selecteer de volgende lijn
<kbd>◄</kbd>: selecteer de vorige hunk
<kbd>►</kbd>: selecteer de volgende hunk
<kbd>e</kbd>: verander bestand
<kbd>o</kbd>: open bestand
<kbd>v</kbd>: toggle drag select
<kbd>V</kbd>: toggle drag select
<kbd>a</kbd>: toggle select hunk
<kbd>c</kbd>: Commit veranderingen
<kbd>w</kbd>: commit veranderingen zonder pre-commit hook
<kbd>C</kbd>: commit veranderingen met de git editor
<kbd>v</kbd>: wissel drag selectie
<kbd>V</kbd>: wissel drag selectie
<kbd>a</kbd>: wissel selectie hunk
<kbd>c</kbd>: commit wijzigingen
<kbd>w</kbd>: commit wijzigingen zonder pre-commit hook
<kbd>C</kbd>: commit wijzigingen met de git editor
</pre>
## Menu Panel
## Menu Paneel
<pre>
<kbd>esc</kbd>: close menu
<kbd>,</kbd>: previous page
<kbd>.</kbd>: next page
<kbd>esc</kbd>: sluit menu
<kbd>,</kbd>: vorige pagina
<kbd>.</kbd>: volgende pagina
<kbd><</kbd>: scroll to top
<kbd>/</kbd>: start search
<kbd>></kbd>: scroll to bottom
</pre>
## Stash Panel
## Stash Paneel
<pre>
<kbd>space</kbd>: toepassen
<kbd>g</kbd>: pop
<kbd>d</kbd>: drop
<kbd>,</kbd>: previous page
<kbd>.</kbd>: next page
<kbd><</kbd>: scroll to top
<kbd>/</kbd>: start search
<kbd>></kbd>: scroll to bottom
<kbd>,</kbd>: vorige pagina
<kbd>.</kbd>: volgende pagina
<kbd><</kbd>: scroll naar bovenkant
<kbd>/</kbd>: start met zoekken
<kbd>></kbd>: scroll naar bodem
</pre>
## Status Panel
## Status Paneel
<pre>
<kbd>e</kbd>: verander config file
<kbd>o</kbd>: open config file
<kbd>o</kbd>: open config bestand
<kbd>u</kbd>: check voor updates
<kbd>enter</kbd>: wissel naar een recente repo
</pre>
+1
View File
@@ -104,6 +104,7 @@
<kbd>c</kbd>: checkout file
<kbd>d</kbd>: discard this commit's changes to this file
<kbd>o</kbd>: otwórz plik
<kbd>e</kbd>: edytuj plik
<kbd>space</kbd>: toggle file included in patch
<kbd>enter</kbd>: enter file to add selected lines to the patch
<kbd>,</kbd>: previous page
+22
View File
@@ -1,5 +1,11 @@
package commands
import (
"strings"
"github.com/jesseduffield/lazygit/pkg/utils"
)
// File : A file from git status
// duplicating this for now
type File struct {
@@ -14,3 +20,19 @@ type File struct {
Type string // one of 'file', 'directory', and 'other'
ShortStatus string // e.g. 'AD', ' A', 'M ', '??'
}
const RENAME_SEPARATOR = " -> "
func (f *File) IsRename() bool {
return strings.Contains(f.Name, RENAME_SEPARATOR)
}
// Names returns an array containing just the filename, or in the case of a rename, the after filename and the before filename
func (f *File) Names() []string {
return strings.Split(f.Name, RENAME_SEPARATOR)
}
// returns true if the file names are the same or if a a file rename includes the filename of the other
func (f *File) Matches(f2 *File) bool {
return utils.StringArraysOverlap(f.Names(), f2.Names())
}
+117 -29
View File
@@ -231,8 +231,12 @@ func (c *GitCommand) ShowStashEntryCmdStr(index int) string {
}
// GetStatusFiles git status files
func (c *GitCommand) GetStatusFiles() []*File {
statusOutput, _ := c.GitStatus()
type GetStatusFileOptions struct {
NoRenames bool
}
func (c *GitCommand) GetStatusFiles(opts GetStatusFileOptions) []*File {
statusOutput, _ := c.GitStatus(GitStatusOptions{NoRenames: opts.NoRenames})
statusStrings := utils.SplitLines(statusOutput)
files := []*File{}
@@ -275,7 +279,7 @@ func (c *GitCommand) StashSave(message string) error {
}
// MergeStatusFiles merge status files
func (c *GitCommand) MergeStatusFiles(oldFiles, newFiles []*File) []*File {
func (c *GitCommand) MergeStatusFiles(oldFiles, newFiles []*File, selectedFile *File) []*File {
if len(oldFiles) == 0 {
return newFiles
}
@@ -286,10 +290,15 @@ func (c *GitCommand) MergeStatusFiles(oldFiles, newFiles []*File) []*File {
result := []*File{}
for _, oldFile := range oldFiles {
for newIndex, newFile := range newFiles {
if oldFile.Name == newFile.Name {
if includesInt(appendedIndexes, newIndex) {
continue
}
// if we just staged B and in doing so created 'A -> B' and we are currently have oldFile: A and newFile: 'A -> B', we want to wait until we come across B so the our cursor isn't jumping anywhere
waitForMatchingFile := selectedFile != nil && newFile.IsRename() && !selectedFile.IsRename() && newFile.Matches(selectedFile) && !oldFile.Matches(selectedFile)
if oldFile.Matches(newFile) && !waitForMatchingFile {
result = append(result, newFile)
appendedIndexes = append(appendedIndexes, newIndex)
break
}
}
}
@@ -360,11 +369,26 @@ func (c *GitCommand) RebaseBranch(branchName string) error {
return c.OSCommand.RunPreparedCommand(cmd)
}
type FetchOptions struct {
PromptUserForCredential func(string) string
RemoteName string
BranchName string
}
// Fetch fetch git repo
func (c *GitCommand) Fetch(unamePassQuestion func(string) string, canAskForCredentials bool) error {
return c.OSCommand.DetectUnamePass("git fetch", func(question string) string {
if canAskForCredentials {
return unamePassQuestion(question)
func (c *GitCommand) Fetch(opts FetchOptions) error {
command := "git fetch"
if opts.RemoteName != "" {
command = fmt.Sprintf("%s %s", command, opts.RemoteName)
}
if opts.BranchName != "" {
command = fmt.Sprintf("%s %s", command, opts.BranchName)
}
return c.OSCommand.DetectUnamePass(command, func(question string) string {
if opts.PromptUserForCredential != nil {
return opts.PromptUserForCredential(question)
}
return "\n"
})
@@ -421,10 +445,20 @@ func (c *GitCommand) ListStash() (string, error) {
return c.OSCommand.RunCommandWithOutput("git stash list")
}
type MergeOpts struct {
FastForwardOnly bool
}
// Merge merge
func (c *GitCommand) Merge(branchName string) error {
func (c *GitCommand) Merge(branchName string, opts MergeOpts) error {
mergeArgs := c.Config.GetUserConfig().GetString("git.merging.args")
return c.OSCommand.RunCommand("git merge --no-edit %s %s", mergeArgs, branchName)
command := fmt.Sprintf("git merge --no-edit %s %s", mergeArgs, branchName)
if opts.FastForwardOnly {
command = fmt.Sprintf("%s --ff-only", command)
}
return c.OSCommand.RunCommand(command)
}
// AbortMerge abort merge
@@ -476,18 +510,8 @@ func (c *GitCommand) AmendHead() (*exec.Cmd, error) {
return nil, c.OSCommand.RunCommand(command)
}
// Pull pulls from repo
func (c *GitCommand) Pull(args string, ask func(string) string) error {
return c.OSCommand.DetectUnamePass("git pull --no-edit "+args, ask)
}
// PullWithoutPasswordCheck assumes that the pull will not prompt the user for a password
func (c *GitCommand) PullWithoutPasswordCheck(args string) error {
return c.OSCommand.RunCommand("git pull --no-edit " + args)
}
// Push pushes to a branch
func (c *GitCommand) Push(branchName string, force bool, upstream string, args string, ask func(string) string) error {
func (c *GitCommand) Push(branchName string, force bool, upstream string, args string, promptUserForCredential func(string) string) error {
forceFlag := ""
if force {
forceFlag = "--force-with-lease"
@@ -499,7 +523,7 @@ func (c *GitCommand) Push(branchName string, force bool, upstream string, args s
}
cmd := fmt.Sprintf("git push --follow-tags %s %s %s", forceFlag, setUpstreamArg, args)
return c.OSCommand.DetectUnamePass(cmd, ask)
return c.OSCommand.DetectUnamePass(cmd, promptUserForCredential)
}
// CatFile obtains the content of a file
@@ -509,7 +533,9 @@ func (c *GitCommand) CatFile(fileName string) (string, error) {
// StageFile stages a file
func (c *GitCommand) StageFile(fileName string) error {
return c.OSCommand.RunCommand("git add %s", c.OSCommand.Quote(fileName))
// renamed files look like "file1 -> file2"
fileNames := strings.Split(fileName, " -> ")
return c.OSCommand.RunCommand("git add %s", c.OSCommand.Quote(fileNames[len(fileNames)-1]))
}
// StageAll stages all files
@@ -540,8 +566,16 @@ func (c *GitCommand) UnStageFile(fileName string, tracked bool) error {
}
// GitStatus returns the plaintext short status of the repo
func (c *GitCommand) GitStatus() (string, error) {
return c.OSCommand.RunCommandWithOutput("git status --untracked-files=all --porcelain")
type GitStatusOptions struct {
NoRenames bool
}
func (c *GitCommand) GitStatus(opts GitStatusOptions) (string, error) {
noRenamesFlag := ""
if opts.NoRenames {
noRenamesFlag = "--no-renames"
}
return c.OSCommand.RunCommandWithOutput("git status --untracked-files=all --porcelain %s", noRenamesFlag)
}
// IsInMergeState states whether we are still mid-merge
@@ -567,8 +601,61 @@ func (c *GitCommand) RebaseMode() (string, error) {
}
}
func (c *GitCommand) BeforeAndAfterFileForRename(file *File) (*File, *File, error) {
if !file.IsRename() {
return nil, nil, errors.New("Expected renamed file")
}
// we've got a file that represents a rename from one file to another. Unfortunately
// our File abstraction fails to consider this case, so here we will refetch
// all files, passing the --no-renames flag and then recursively call the function
// again for the before file and after file. At some point we should fix the abstraction itself
split := strings.Split(file.Name, " -> ")
filesWithoutRenames := c.GetStatusFiles(GetStatusFileOptions{NoRenames: true})
var beforeFile *File
var afterFile *File
for _, f := range filesWithoutRenames {
if f.Name == split[0] {
beforeFile = f
}
if f.Name == split[1] {
afterFile = f
}
}
if beforeFile == nil || afterFile == nil {
return nil, nil, errors.New("Could not find deleted file or new file for file rename")
}
if beforeFile.IsRename() || afterFile.IsRename() {
// probably won't happen but we want to ensure we don't get an infinite loop
return nil, nil, errors.New("Nested rename found")
}
return beforeFile, afterFile, nil
}
// DiscardAllFileChanges directly
func (c *GitCommand) DiscardAllFileChanges(file *File) error {
if file.IsRename() {
beforeFile, afterFile, err := c.BeforeAndAfterFileForRename(file)
if err != nil {
return err
}
if err := c.DiscardAllFileChanges(beforeFile); err != nil {
return err
}
if err := c.DiscardAllFileChanges(afterFile); err != nil {
return err
}
return nil
}
// if the file isn't tracked, we assume you want to delete it
quotedFileName := c.OSCommand.Quote(file.Name)
if file.HasStagedChanges || file.HasMergeConflicts {
@@ -704,8 +791,9 @@ func (c *GitCommand) ApplyPatch(patch string, flags ...string) error {
return c.OSCommand.RunCommand("git apply %s %s", flagStr, c.OSCommand.Quote(filepath))
}
func (c *GitCommand) FastForward(branchName string, remoteName string, remoteBranchName string) error {
return c.OSCommand.RunCommand("git fetch %s %s:%s", remoteName, remoteBranchName, branchName)
func (c *GitCommand) FastForward(branchName string, remoteName string, remoteBranchName string, promptUserForCredential func(string) string) error {
command := fmt.Sprintf("git fetch %s %s:%s", remoteName, remoteBranchName, branchName)
return c.OSCommand.DetectUnamePass(command, promptUserForCredential)
}
func (c *GitCommand) RunSkipEditorCommand(command string) error {
@@ -1093,7 +1181,7 @@ func (c *GitCommand) StashSaveStagedChanges(message string) error {
// if you had staged an untracked file, that will now appear as 'AD' in git status
// meaning it's deleted in your working tree but added in your index. Given that it's
// now safely stashed, we need to remove it.
files := c.GetStatusFiles()
files := c.GetStatusFiles(GetStatusFileOptions{})
for _, file := range files {
if file.ShortStatus == "AD" {
if err := c.UnStageFile(file.Name, false); err != nil {
+3 -3
View File
@@ -420,7 +420,7 @@ func TestGitCommandGetStatusFiles(t *testing.T) {
gitCmd := NewDummyGitCommand()
gitCmd.OSCommand.command = s.command
s.test(gitCmd.GetStatusFiles())
s.test(gitCmd.GetStatusFiles(GetStatusFileOptions{}))
})
}
}
@@ -541,7 +541,7 @@ func TestGitCommandMergeStatusFiles(t *testing.T) {
t.Run(s.testName, func(t *testing.T) {
gitCmd := NewDummyGitCommand()
s.test(gitCmd.MergeStatusFiles(s.oldFiles, s.newFiles))
s.test(gitCmd.MergeStatusFiles(s.oldFiles, s.newFiles, nil))
})
}
}
@@ -703,7 +703,7 @@ func TestGitCommandMerge(t *testing.T) {
return exec.Command("echo")
}
assert.NoError(t, gitCmd.Merge("test"))
assert.NoError(t, gitCmd.Merge("test", MergeOpts{}))
}
// TestGitCommandUsingGpg is a function.
+4 -4
View File
@@ -139,9 +139,9 @@ func (c *OSCommand) RunCommandWithOutputLive(command string, output func(string)
}
// DetectUnamePass detect a username / password question in a command
// ask is a function that gets executen when this function detect you need to fillin a password
// The ask argument will be "username" or "password" and expects the user's password or username back
func (c *OSCommand) DetectUnamePass(command string, ask func(string) string) error {
// promptUserForCredential is a function that gets executed when this function detect you need to fillin a password
// The promptUserForCredential argument will be "username" or "password" and expects the user's password or username back
func (c *OSCommand) DetectUnamePass(command string, promptUserForCredential func(string) string) error {
ttyText := ""
errMessage := c.RunCommandWithOutputLive(command, func(word string) string {
ttyText = ttyText + " " + word
@@ -155,7 +155,7 @@ func (c *OSCommand) DetectUnamePass(command string, ask func(string) string) err
for pattern, askFor := range prompts {
if match, _ := regexp.MatchString(pattern, ttyText); match {
ttyText = ""
return ask(askFor)
return promptUserForCredential(askFor)
}
}
+3 -4
View File
@@ -23,7 +23,7 @@ type PatchManager struct {
ApplyPatch applyPatchFunc
}
// NewPatchManager returns a new PatchModifier
// NewPatchManager returns a new PatchManager
func NewPatchManager(log *logrus.Entry, applyPatch applyPatchFunc) *PatchManager {
return &PatchManager{
Log: log,
@@ -31,7 +31,7 @@ func NewPatchManager(log *logrus.Entry, applyPatch applyPatchFunc) *PatchManager
}
}
// NewPatchManager returns a new PatchModifier
// NewPatchManager returns a new PatchManager
func (p *PatchManager) Start(commitSha string, diffMap map[string]string) {
p.CommitSha = commitSha
p.fileInfoMap = map[string]*fileInfo{}
@@ -101,8 +101,7 @@ func (p *PatchManager) RenderPlainPatchForFile(filename string, reverse bool, ke
return info.diff
case PART:
// generate a new diff with just the selected lines
m := NewPatchModifier(p.Log, filename, info.diff)
return m.ModifiedPatchForLines(info.includedLineIndices, reverse, keepOriginalHeader)
return ModifiedPatchForLines(p.Log, filename, info.diff, info.includedLineIndices, reverse, keepOriginalHeader)
default:
return ""
}
+5
View File
@@ -258,3 +258,8 @@ func ModifiedPatchForRange(log *logrus.Entry, filename string, diffText string,
p := NewPatchModifier(log, filename, diffText)
return p.ModifiedPatchForRange(firstLineIdx, lastLineIdx, reverse, keepOriginalHeader)
}
func ModifiedPatchForLines(log *logrus.Entry, filename string, diffText string, includedLineIndices []int, reverse bool, keepOriginalHeader bool) string {
p := NewPatchModifier(log, filename, diffText)
return p.ModifiedPatchForLines(includedLineIndices, reverse, keepOriginalHeader)
}
+2
View File
@@ -268,6 +268,8 @@ git:
merging:
manualCommit: false
args: ""
pull:
mode: 'merge' # one of 'merge' | 'rebase' | 'ff-only'
skipHookPrefix: 'WIP'
autoFetch: true
branchLogCmd: "git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium {{branchName}} --"
+7 -14
View File
@@ -129,8 +129,9 @@ func (gui *Gui) handleGitFetch(g *gocui.Gui, v *gocui.View) error {
return err
}
go func() {
unamePassOpend, err := gui.fetch(g, v, true)
gui.HandleCredentialsPopup(g, unamePassOpend, err)
err := gui.fetch(true)
gui.handleCredentialsPopup(err)
_ = gui.refreshSidePanels(refreshOptions{mode: ASYNC})
}()
return nil
}
@@ -321,7 +322,7 @@ func (gui *Gui) mergeBranchIntoCheckedOutBranch(branchName string) error {
return gui.createConfirmationPanel(gui.g, gui.getBranchesView(), true, gui.Tr.SLocalize("MergingTitle"), prompt,
func(g *gocui.Gui, v *gocui.View) error {
err := gui.GitCommand.Merge(branchName)
err := gui.GitCommand.Merge(branchName, commands.MergeOpts{})
return gui.handleGenericMergeCommandResult(err)
}, nil)
}
@@ -398,20 +399,12 @@ func (gui *Gui) handleFastForward(g *gocui.Gui, v *gocui.View) error {
_ = gui.createLoaderPanel(gui.g, v, message)
if gui.State.Panels.Branches.SelectedLine == 0 {
if err := gui.GitCommand.PullWithoutPasswordCheck("--ff-only"); err != nil {
_ = gui.surfaceError(err)
return
}
_ = gui.refreshSidePanels(refreshOptions{mode: ASYNC})
_ = gui.pullWithMode("ff-only", PullFilesOptions{})
} else {
if err := gui.GitCommand.FastForward(branch.Name, remoteName, remoteBranchName); err != nil {
_ = gui.surfaceError(err)
return
}
err := gui.GitCommand.FastForward(branch.Name, remoteName, remoteBranchName, gui.promptUserForCredential)
gui.handleCredentialsPopup(err)
_ = gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []int{BRANCHES}})
}
_ = gui.closeConfirmationPrompt(gui.g, true)
}()
return nil
}
+13
View File
@@ -121,9 +121,22 @@ func (gui *Gui) refreshCommitFilesView() error {
func (gui *Gui) handleOpenOldCommitFile(g *gocui.Gui, v *gocui.View) error {
file := gui.getSelectedCommitFile()
if file == nil {
return nil
}
return gui.openFile(file.Name)
}
func (gui *Gui) handleEditCommitFile(g *gocui.Gui, v *gocui.View) error {
file := gui.getSelectedCommitFile()
if file == nil {
return nil
}
return gui.editFile(file.Name)
}
func (gui *Gui) handleToggleFileForPatch(g *gocui.Gui, v *gocui.View) error {
if ok, err := gui.validateNormalWorkingTreeState(); !ok {
return err
+2 -1
View File
@@ -62,10 +62,11 @@ func (gui *Gui) handleCommitFocused(g *gocui.Gui, v *gocui.View) error {
}
message := gui.Tr.TemplateLocalize(
"CloseConfirm",
"CommitMessageConfirm",
Teml{
"keyBindClose": "esc",
"keyBindConfirm": "enter",
"keyBindNewLine": "tab",
},
)
gui.renderString(g, "options", message)
+8 -11
View File
@@ -8,10 +8,10 @@ import (
type credentials chan string
// waitForPassUname wait for a username or password input from the credentials popup
func (gui *Gui) waitForPassUname(g *gocui.Gui, currentView *gocui.View, passOrUname string) string {
// promptUserForCredential wait for a username or password input from the credentials popup
func (gui *Gui) promptUserForCredential(passOrUname string) string {
gui.credentials = make(chan string)
g.Update(func(g *gocui.Gui) error {
gui.g.Update(func(g *gocui.Gui) error {
credentialsView, _ := g.View("credentials")
if passOrUname == "username" {
credentialsView.Title = gui.Tr.SLocalize("CredentialsUsername")
@@ -20,7 +20,7 @@ func (gui *Gui) waitForPassUname(g *gocui.Gui, currentView *gocui.View, passOrUn
credentialsView.Title = gui.Tr.SLocalize("CredentialsPassword")
credentialsView.Mask = '*'
}
err := gui.switchFocus(g, currentView, credentialsView)
err := gui.switchFocus(g, gui.g.CurrentView(), credentialsView)
if err != nil {
return err
}
@@ -76,11 +76,9 @@ func (gui *Gui) handleCredentialsViewFocused(g *gocui.Gui, v *gocui.View) error
return nil
}
// HandleCredentialsPopup handles the views after executing a command that might ask for credentials
func (gui *Gui) HandleCredentialsPopup(g *gocui.Gui, popupOpened bool, cmdErr error) {
if popupOpened {
_, _ = gui.g.SetViewOnBottom("credentials")
}
// handleCredentialsPopup handles the views after executing a command that might ask for credentials
func (gui *Gui) handleCredentialsPopup(cmdErr error) {
_, _ = gui.g.SetViewOnBottom("credentials")
if cmdErr != nil {
errMessage := cmdErr.Error()
if strings.Contains(errMessage, "Invalid username or password") {
@@ -89,7 +87,6 @@ func (gui *Gui) HandleCredentialsPopup(g *gocui.Gui, popupOpened bool, cmdErr er
// we are not logging this error because it may contain a password
_ = gui.createSpecificErrorPanel(errMessage, gui.getFilesView(), false)
} else {
_ = gui.closeConfirmationPrompt(g, true)
_ = gui.refreshSidePanels(refreshOptions{mode: ASYNC})
_ = gui.closeConfirmationPrompt(gui.g, true)
}
}
+59 -21
View File
@@ -410,14 +410,27 @@ func (gui *Gui) handleRefreshFiles(g *gocui.Gui, v *gocui.View) error {
}
func (gui *Gui) refreshStateFiles() error {
// keep track of where the cursor is currently and the current file names
// when we refresh, go looking for a matching name
// move the cursor to there.
selectedFile, _ := gui.getSelectedFile()
// get files to stage
files := gui.GitCommand.GetStatusFiles()
gui.State.Files = gui.GitCommand.MergeStatusFiles(gui.State.Files, files)
files := gui.GitCommand.GetStatusFiles(commands.GetStatusFileOptions{})
gui.State.Files = gui.GitCommand.MergeStatusFiles(gui.State.Files, files, selectedFile)
if err := gui.fileWatcher.addFilesToFileWatcher(files); err != nil {
return err
}
// let's try to find our file again and move the cursor to that
for idx, f := range gui.State.Files {
if selectedFile != nil && f.Matches(selectedFile) {
gui.State.Panels.Files.SelectedLine = idx
break
}
}
gui.refreshSelectedLine(&gui.State.Panels.Files.SelectedLine, len(gui.State.Files))
return nil
}
@@ -433,7 +446,7 @@ func (gui *Gui) handlePullFiles(g *gocui.Gui, v *gocui.View) error {
}
for branchName, branch := range conf.Branches {
if branchName == currentBranch.Name {
return gui.pullFiles(v, fmt.Sprintf("%s %s", branch.Remote, branchName))
return gui.pullFiles(PullFilesOptions{RemoteName: branch.Remote, BranchName: branch.Name})
}
}
@@ -446,42 +459,67 @@ func (gui *Gui) handlePullFiles(g *gocui.Gui, v *gocui.View) error {
}
return gui.createErrorPanel(errorMessage)
}
return gui.pullFiles(v, "")
return gui.pullFiles(PullFilesOptions{})
})
}
return gui.pullFiles(v, "")
return gui.pullFiles(PullFilesOptions{})
}
func (gui *Gui) pullFiles(v *gocui.View, args string) error {
if err := gui.createLoaderPanel(gui.g, v, gui.Tr.SLocalize("PullWait")); err != nil {
type PullFilesOptions struct {
RemoteName string
BranchName string
}
func (gui *Gui) pullFiles(opts PullFilesOptions) error {
if err := gui.createLoaderPanel(gui.g, gui.g.CurrentView(), gui.Tr.SLocalize("PullWait")); err != nil {
return err
}
go func() {
unamePassOpend := false
err := gui.GitCommand.Pull(args, func(passOrUname string) string {
unamePassOpend = true
return gui.waitForPassUname(gui.g, v, passOrUname)
})
gui.HandleCredentialsPopup(gui.g, unamePassOpend, err)
}()
mode := gui.Config.GetUserConfig().GetString("git.pull.mode")
go gui.pullWithMode(mode, opts)
return nil
}
func (gui *Gui) pullWithMode(mode string, opts PullFilesOptions) error {
err := gui.GitCommand.Fetch(
commands.FetchOptions{
PromptUserForCredential: gui.promptUserForCredential,
RemoteName: opts.RemoteName,
BranchName: opts.BranchName,
},
)
gui.handleCredentialsPopup(err)
if err != nil {
return gui.refreshSidePanels(refreshOptions{mode: ASYNC})
}
switch mode {
case "rebase":
err := gui.GitCommand.RebaseBranch("FETCH_HEAD")
return gui.handleGenericMergeCommandResult(err)
case "merge":
err := gui.GitCommand.Merge("FETCH_HEAD", commands.MergeOpts{})
return gui.handleGenericMergeCommandResult(err)
case "ff-only":
err := gui.GitCommand.Merge("FETCH_HEAD", commands.MergeOpts{FastForwardOnly: true})
return gui.handleGenericMergeCommandResult(err)
default:
return gui.createErrorPanel(fmt.Sprintf("git pull mode '%s' unrecognised", mode))
}
}
func (gui *Gui) pushWithForceFlag(g *gocui.Gui, v *gocui.View, force bool, upstream string, args string) error {
if err := gui.createLoaderPanel(gui.g, v, gui.Tr.SLocalize("PushWait")); err != nil {
return err
}
go func() {
unamePassOpend := false
branchName := gui.getCheckedOutBranch().Name
err := gui.GitCommand.Push(branchName, force, upstream, args, func(passOrUname string) string {
unamePassOpend = true
return gui.waitForPassUname(g, v, passOrUname)
})
gui.HandleCredentialsPopup(g, unamePassOpend, err)
err := gui.GitCommand.Push(branchName, force, upstream, args, gui.promptUserForCredential)
gui.handleCredentialsPopup(err)
_ = gui.refreshSidePanels(refreshOptions{mode: ASYNC})
}()
return nil
}
+11 -9
View File
@@ -6,6 +6,7 @@ import (
"github.com/fatih/color"
"github.com/jesseduffield/gocui"
"github.com/jesseduffield/lazygit/pkg/commands"
"github.com/jesseduffield/lazygit/pkg/utils"
)
@@ -166,23 +167,24 @@ func (gui *Gui) handleInfoClick(g *gocui.Gui, v *gocui.View) error {
return nil
}
func (gui *Gui) fetch(g *gocui.Gui, v *gocui.View, canAskForCredentials bool) (unamePassOpend bool, err error) {
unamePassOpend = false
err = gui.GitCommand.Fetch(func(passOrUname string) string {
unamePassOpend = true
return gui.waitForPassUname(gui.g, v, passOrUname)
}, canAskForCredentials)
func (gui *Gui) fetch(canPromptForCredentials bool) (err error) {
fetchOpts := commands.FetchOptions{}
if canPromptForCredentials {
fetchOpts.PromptUserForCredential = gui.promptUserForCredential
}
if canAskForCredentials && err != nil && strings.Contains(err.Error(), "exit status 128") {
err = gui.GitCommand.Fetch(fetchOpts)
if canPromptForCredentials && err != nil && strings.Contains(err.Error(), "exit status 128") {
colorFunction := color.New(color.FgRed).SprintFunc()
coloredMessage := colorFunction(strings.TrimSpace(gui.Tr.SLocalize("PassUnameWrong")))
close := func(g *gocui.Gui, v *gocui.View) error {
return nil
}
_ = gui.createConfirmationPanel(g, v, true, gui.Tr.SLocalize("Error"), coloredMessage, close, close)
_ = gui.createConfirmationPanel(gui.g, gui.g.CurrentView(), true, gui.Tr.SLocalize("Error"), coloredMessage, close, close)
}
gui.refreshSidePanels(refreshOptions{scope: []int{BRANCHES, COMMITS, REMOTES, TAGS}, mode: ASYNC})
return unamePassOpend, err
return err
}
+2 -2
View File
@@ -501,12 +501,12 @@ func (gui *Gui) startBackgroundFetch() {
if !isNew {
time.After(60 * time.Second)
}
_, err := gui.fetch(gui.g, gui.g.CurrentView(), false)
err := gui.fetch(false)
if err != nil && strings.Contains(err.Error(), "exit status 128") && isNew {
_ = gui.createConfirmationPanel(gui.g, gui.g.CurrentView(), true, gui.Tr.SLocalize("NoAutomaticGitFetchTitle"), gui.Tr.SLocalize("NoAutomaticGitFetchBody"), nil, nil)
} else {
gui.goEvery(time.Second*60, gui.stopChan, func() error {
_, err := gui.fetch(gui.g, gui.g.CurrentView(), false)
err := gui.fetch(false)
return err
})
}
+11 -2
View File
@@ -4,6 +4,8 @@ import (
"log"
"strings"
"unicode/utf8"
"github.com/jesseduffield/gocui"
)
@@ -178,14 +180,15 @@ func GetKeyDisplay(key interface{}) string {
func (gui *Gui) getKey(name string) interface{} {
key := gui.Config.GetUserConfig().GetString("keybinding." + name)
if len(key) > 1 {
runeCount := utf8.RuneCountInString(key)
if runeCount > 1 {
binding := keymap[strings.ToLower(key)]
if binding == nil {
log.Fatalf("Unrecognized key %s for keybinding %s", strings.ToLower(key), name)
} else {
return binding
}
} else if len(key) == 1 {
} else if runeCount == 1 {
return []rune(key)[0]
}
log.Fatal("Key empty for keybinding: " + strings.ToLower(name))
@@ -878,6 +881,12 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
Handler: gui.handleOpenOldCommitFile,
Description: gui.Tr.SLocalize("openFile"),
},
{
ViewName: "commitFiles",
Key: gui.getKey("universal.edit"),
Handler: gui.handleEditCommitFile,
Description: gui.Tr.SLocalize("editFile"),
},
{
ViewName: "commitFiles",
Key: gui.getKey("universal.select"),
+1 -1
View File
@@ -84,7 +84,7 @@ func (gui *Gui) handleCheckoutRemoteBranch(g *gocui.Gui, v *gocui.View) error {
}
func (gui *Gui) handleMergeRemoteBranch(g *gocui.Gui, v *gocui.View) error {
selectedBranchName := gui.getSelectedRemoteBranch().Name
selectedBranchName := gui.getSelectedRemoteBranch().FullName()
return gui.mergeBranchIntoCheckedOutBranch(selectedBranchName)
}
+489 -104
View File
@@ -28,24 +28,33 @@ func addDutch(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "CommitsTitle",
Other: "Commits",
}, &i18n.Message{
ID: "CommitsDiffTitle",
Other: "Commits (specific diff mode)",
}, &i18n.Message{
ID: "CommitsDiff",
Other: "select commit to diff with another commit",
}, &i18n.Message{
ID: "StashTitle",
Other: "Stash",
}, &i18n.Message{
ID: "UnstagedChanges",
Other: `Unstaged Changes`,
Other: `Unstaged wijzigingen`,
}, &i18n.Message{
ID: "StagedChanges",
Other: `Staged Changes`,
Other: `Staged Wijzigingen`,
}, &i18n.Message{
ID: "PatchBuildingMainTitle",
Other: `Voeg lijnen/hunks toe aan Patch`,
}, &i18n.Message{
ID: "MergingMainTitle",
Other: "Resolve merge conflicts",
Other: "Los merge conflicten op",
}, &i18n.Message{
ID: "MainTitle",
Other: "Hooft",
}, &i18n.Message{
ID: "StagingTitle",
Other: "Staging",
}, &i18n.Message{
ID: "MergingTitle",
Other: "Merging",
}, &i18n.Message{
ID: "NormalTitle",
Other: "Normaal",
}, &i18n.Message{
ID: "CommitMessage",
Other: "Commit bericht",
@@ -78,7 +87,7 @@ func addDutch(i18nObject *i18n.Bundle) error {
Other: "Status",
}, &i18n.Message{
ID: "GlobalTitle",
Other: "Global",
Other: "Globaal",
}, &i18n.Message{
ID: "navigate",
Other: "navigeer",
@@ -124,6 +133,9 @@ func addDutch(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "resolveMergeConflicts",
Other: "los merge conflicten op",
}, &i18n.Message{
ID: "MergeConflictsTitle",
Other: "Merge Conflicten",
}, &i18n.Message{
ID: "checkout",
Other: "uitchecken",
@@ -154,6 +166,9 @@ func addDutch(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "FileNoMergeCons",
Other: "Dit bestand heeft geen merge conflicten",
}, &i18n.Message{
ID: "softReset",
Other: "zacht reset",
}, &i18n.Message{
ID: "SureTo",
Other: "Weet je het zeker dat je {{.fileName}} wilt {{.deleteVerb}} (je veranderingen zullen worden verwijderd)",
@@ -187,6 +202,9 @@ func addDutch(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "rebaseBranch",
Other: "rebase branch",
}, &i18n.Message{
ID: "CantRebaseOntoSelf",
Other: "Je kan niet een branch rebasen op zichzelf",
}, &i18n.Message{
ID: "CantMergeBranchIntoItself",
Other: "Je kan niet een branch in zichzelf mergen",
@@ -214,15 +232,21 @@ func addDutch(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "NoTrackingThisBranch",
Other: "deze branch wordt niet gevolgd",
}, &i18n.Message{
ID: "CommitMessageConfirm",
Other: "{{.keyBindClose}}: Sluiten, {{.keyBindNewLine}}: Nieuwe lijn, {{.keyBindConfirm}}: Bevestig",
}, &i18n.Message{
ID: "CommitWithoutMessageErr",
Other: "Je kan geen commit maken zonder commit bericht",
}, &i18n.Message{
ID: "CloseConfirm",
Other: "{{.keyBindClose}}: Sluiten, {{.keyBindConfirm}}: Bevestigen",
Other: "{{.keyBindClose}}: Sluiten, {{.keyBindConfirm}}: Bevestig",
}, &i18n.Message{
ID: "close",
Other: "sluiten",
}, &i18n.Message{
ID: "quit",
Other: "quit",
}, &i18n.Message{
ID: "SureResetThisCommit",
Other: "Weet je het zeker dat je wil resetten naar deze commit?",
@@ -259,18 +283,48 @@ func addDutch(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "SureFixupThisCommit",
Other: "Weet je zeker dat je fixup wil uitvoeren op deze commit? De commit hieronder zol worden squashed in deze",
}, &i18n.Message{
ID: "SureSquashThisCommit",
Other: "Weet je zeker dat je deze commit wil samenvoegen met de commit hieronder?",
}, &i18n.Message{
ID: "Squash",
Other: "Squash",
}, &i18n.Message{
ID: "pickCommit",
Other: "kies commit (wanneer midden in rebase)",
}, &i18n.Message{
ID: "revertCommit",
Other: "commit ongedaan maken",
}, &i18n.Message{
ID: "OnlyRenameTopCommit",
Other: "Je kan alleen de bovenste commit hernoemen",
}, &i18n.Message{
ID: "renameCommit",
Other: "hernoem commit",
}, &i18n.Message{
ID: "deleteCommit",
Other: "verwijder commit",
}, &i18n.Message{
ID: "moveDownCommit",
Other: "verplaats commit 1 naar beneden",
}, &i18n.Message{
ID: "moveUpCommit",
Other: "verplaats commit 1 naar boven",
}, &i18n.Message{
ID: "editCommit",
Other: "wijzig commit",
}, &i18n.Message{
ID: "amendToCommit",
Other: "wijzig commit met staged veranderingen",
}, &i18n.Message{
ID: "renameCommitEditor",
Other: "rename commit with editor",
Other: "hernoem commit met editor",
}, &i18n.Message{
ID: "PotentialErrInGetselectedCommit",
Other: "Er is mogelijk een error in getSelected Commit (geen match tussen ui en state)",
}, &i18n.Message{
ID: "NoCommitsThisBranch",
Other: "Geen commits in deze branch",
}, &i18n.Message{
ID: "Error",
Other: "Foutmelding",
@@ -295,12 +349,18 @@ func addDutch(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "undo",
Other: "ongedaan maken",
}, &i18n.Message{
ID: "undoReflog",
Other: "ongedaan maken (via reflog) (experimenteel)",
}, &i18n.Message{
ID: "redoReflog",
Other: "redo (via reflog) (experimenteel)",
}, &i18n.Message{
ID: "pop",
Other: "pop",
}, &i18n.Message{
ID: "drop",
Other: "drop",
Other: "laten vallen",
}, &i18n.Message{
ID: "apply",
Other: "toepassen",
@@ -309,10 +369,22 @@ func addDutch(i18nObject *i18n.Bundle) error {
Other: "Geen stash items",
}, &i18n.Message{
ID: "StashDrop",
Other: "Stash drop",
Other: "Stash laten vallen",
}, &i18n.Message{
ID: "SureDropStashEntry",
Other: "Weet je het zeker dat je deze stash entry wil laten vallen?",
}, &i18n.Message{
ID: "StashPop",
Other: "Stash pop",
}, &i18n.Message{
ID: "SurePopStashEntry",
Other: "Weet je zeker dat je deze stash entry wil poppen?",
}, &i18n.Message{
ID: "StashApply",
Other: "Stash toepassen",
}, &i18n.Message{
ID: "SureApplyStashEntry",
Other: "Weet je zeker dat je deze stash entry wil toepassen?",
}, &i18n.Message{
ID: "NoStashTo",
Other: "Geen stash voor {{.method}}",
@@ -331,15 +403,18 @@ func addDutch(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "newFocusedViewIs",
Other: "nieuw gefocussed weergave is {{.newFocusedView}}",
}, &i18n.Message{
ID: "NoChangedFiles",
Other: "Geen veranderde bestanden",
}, &i18n.Message{
ID: "MergeAborted",
Other: "Merge afgebroken",
}, &i18n.Message{
ID: "OpenConfig",
Other: "open config file",
Other: "open config bestand",
}, &i18n.Message{
ID: "EditConfig",
Other: "verander config file",
Other: "verander config bestand",
}, &i18n.Message{
ID: "ForcePush",
Other: "Forceer push",
@@ -367,6 +442,19 @@ func addDutch(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "AnonymousReportingPrompt",
Other: "Zou je anonieme data rapportage willen aanzetten om lazygit beter te kunnen maken? (enter/esc)",
}, &i18n.Message{
ID: "ShamelessSelfPromotionTitle",
Other: "Schaamteloose zelf promotie",
}, &i18n.Message{
ID: "ShamelessSelfPromotionMessage",
Other: `Bedankt voor het gebruik maken van lazygit! 3 dingen die je moet weten:
1) lazygit heeft nu basis muis support!
2) Als je meer van lazygit zijn features wilt leren bekijk dan deze video:
https://youtu.be/CPLdltN7wgE
3) Github matched nu elke donations euro voor euro voor de komende 12 maanden, dus als je graag zou willen doneren klik the doneer knop rechts onderin`,
}, &i18n.Message{
ID: "GitconfigParseErr",
Other: `Gogit kon je gitconfig bestand niet goed parsen door de aanwezigheid van losstaande '\' tekens. Het weghalen van deze tekens zou het probleem moeten oplossen. `,
@@ -416,14 +504,29 @@ func addDutch(i18nObject *i18n.Bundle) error {
ID: "FileStagingRequirements",
Other: `Kan alleen individuele lijnen stagen van getrackte bestanden met onstaged veranderingen`,
}, &i18n.Message{
ID: "StagingTitle",
Other: `Stage Lines/Hunks`,
ID: "SelectHunk",
Other: `selecteer hunk`,
}, &i18n.Message{
ID: "StageHunk",
Other: `stage hunk`,
ID: "StageSelection",
Other: `toggle lijnen staged / unstaged`,
}, &i18n.Message{
ID: "StageLine",
Other: `stage lijn`,
ID: "ResetSelection",
Other: `verwijdert change (git reset)`,
}, &i18n.Message{
ID: "ToggleDragSelect",
Other: `toggle drag selecteer`,
}, &i18n.Message{
ID: "ToggleSelectHunk",
Other: `toggle selecteer hunk`,
}, &i18n.Message{
ID: "ToggleSelectionForPatch",
Other: `voeg toe/verwijder lijn(en) in patch`,
}, &i18n.Message{
ID: "TogglePanel",
Other: `ga naar een ander paneel`,
}, &i18n.Message{
ID: "CantStageStaged",
Other: `Je kan niet al gestaged verandering stagen!`,
}, &i18n.Message{
ID: "ReturnToFilesPanel",
Other: `ga terug naar het bestanden paneel`,
@@ -434,65 +537,11 @@ func addDutch(i18nObject *i18n.Bundle) error {
ID: "CantFindHunk",
Other: `Kan geen hunk vinden`,
}, &i18n.Message{
ID: "RebasingTitle",
Other: "Rebasing",
ID: "FastForward",
Other: `fast-forward deze branch vanaf zijn upstream`,
}, &i18n.Message{
ID: "MergingTitle",
Other: "Merging",
}, &i18n.Message{
ID: "ConfirmRebase",
Other: "Weet je zeker dat je {{.checkedOutBranch}} op {{.selectedBranch}} wil rebasen?",
}, &i18n.Message{
ID: "ConfirmMerge",
Other: "Weet je zeker dat je {{.selectedBranch}} in {{.checkedOutBranch}} wil mergen?",
}, &i18n.Message{
ID: "FwdNoUpstream",
Other: "Kan niet de branch vooruitspoelen zonder upstream",
}, &i18n.Message{
ID: "ErrorOccurred",
Other: "Er is iets fout gegaan! Zou je hier een issue aan willen maken: https://github.com/jesseduffield/lazygit/issues",
}, &i18n.Message{
ID: "FwdCommitsToPush",
Other: "Je kan niet vooruitspoelen als de branch geen nieuwe commits heeft",
}, &i18n.Message{
ID: "MainTitle",
Other: "Hoofd",
}, &i18n.Message{
ID: "NormalTitle",
Other: "Normaal",
}, &i18n.Message{
ID: "softReset",
Other: "zacht reset",
}, &i18n.Message{
ID: "CantRebaseOntoSelf",
Other: "Je kan niet een branch rebasen op zichzelf",
}, &i18n.Message{
ID: "SureSquashThisCommit",
Other: "Weet je zeker dat je deze commit wil samenvoegen met de commit hieronder?",
}, &i18n.Message{
ID: "Squash",
Other: "Squash",
}, &i18n.Message{
ID: "pickCommit",
Other: "pick commit (when mid-rebase)",
}, &i18n.Message{
ID: "revertCommit",
Other: "commit omgedaan maken",
}, &i18n.Message{
ID: "deleteCommit",
Other: "verwijder commit",
}, &i18n.Message{
ID: "moveDownCommit",
Other: "verplaats commit 1 omlaag",
}, &i18n.Message{
ID: "moveUpCommit",
Other: "verplaats commit 1 omhoog",
}, &i18n.Message{
ID: "editCommit",
Other: "verander commit",
}, &i18n.Message{
ID: "amendToCommit",
Other: "wijzig commit met staged veranderingen",
ID: "Fetching",
Other: "fetching en fast-forwarding {{.from}} -> {{.to}} ...",
}, &i18n.Message{
ID: "FoundConflicts",
Other: "Conflicten!, Om af te breken druk 'esc', anders druk op 'enter'",
@@ -504,10 +553,10 @@ func addDutch(i18nObject *i18n.Bundle) error {
Other: "ongedaan maken",
}, &i18n.Message{
ID: "PickHunk",
Other: "pick hunk",
Other: "kies hunk",
}, &i18n.Message{
ID: "PickBothHunks",
Other: "pick beide hunks",
Other: "kies bijde hunks",
}, &i18n.Message{
ID: "ViewMergeRebaseOptions",
Other: "bekijk merge/rebase opties",
@@ -516,16 +565,85 @@ func addDutch(i18nObject *i18n.Bundle) error {
Other: "Je bent momenteel niet aan het rebasen of mergen",
}, &i18n.Message{
ID: "RecentRepos",
Other: "recent repositories",
Other: "recente repositories",
}, &i18n.Message{
ID: "MergeOptionsTitle",
Other: "Merge Opties",
}, &i18n.Message{
ID: "RebaseOptionsTitle",
Other: "Rebase Opties",
}, &i18n.Message{
ID: "CommitMessageTitle",
Other: "Commit Bericht",
}, &i18n.Message{
ID: "Local-BranchesTitle",
Other: "Branches Tab",
}, &i18n.Message{
ID: "SearchTitle",
Other: "Zoek",
}, &i18n.Message{
ID: "TagsTitle",
Other: "Tags Tab",
}, &i18n.Message{
ID: "Branch-CommitsTitle",
Other: "Commits Tab",
}, &i18n.Message{
ID: "MenuTitle",
Other: "Menu",
}, &i18n.Message{
ID: "RemotesTitle",
Other: "Remotes Tab",
}, &i18n.Message{
ID: "CredentialsTitle",
Other: "Credentials",
}, &i18n.Message{
ID: "Remote-BranchesTitle",
Other: "Remote Branches (in Remotes tab)",
}, &i18n.Message{
ID: "Patch-BuildingTitle",
Other: "Patch Bouwen",
}, &i18n.Message{
ID: "InformationTitle",
Other: "Informatie",
}, &i18n.Message{
ID: "SecondaryTitle",
Other: "Secondary",
}, &i18n.Message{
ID: "Reflog-CommitsTitle",
Other: "Reflog Tab",
}, &i18n.Message{
ID: "Title",
Other: "Title",
}, &i18n.Message{
ID: "GlobalTitle",
Other: "Globaale Sneltoetsen",
}, &i18n.Message{
ID: "MerginTitle",
Other: "Mergen",
}, &i18n.Message{
ID: "ConflictsResolved",
Other: "alle merge conflicten zijn opgelost. Wilt je verder gaan?",
}, &i18n.Message{
ID: "RebasingTitle",
Other: "Rebasen",
}, &i18n.Message{
ID: "MergingTitle",
Other: "Merggen",
}, &i18n.Message{
ID: "ConfirmRebase",
Other: "Weet je zeker dat je {{.checkedOutBranch}} op {{.selectedBranch}} wil rebasen?",
}, &i18n.Message{
ID: "ConfirmMerge",
Other: "Weet je zeker dat je {{.selectedBranch}} in {{.checkedOutBranch}} wil mergen?",
}, &i18n.Message{
ID: "FwdNoUpstream",
Other: "Kan niet de branch vooruitspoelen zonder upstream",
}, &i18n.Message{
ID: "FwdCommitsToPush",
Other: "Je kan niet vooruitspoelen als de branch geen nieuwe commits heeft",
}, &i18n.Message{
ID: "ErrorOccurred",
Other: "Er is iets fout gegaan! Zou je hier een issue aan willen maken: https://github.com/jesseduffield/lazygit/issues",
}, &i18n.Message{
ID: "NoRoom",
Other: "Niet genoeg ruimte",
@@ -589,6 +707,12 @@ func addDutch(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "ScrollUp",
Other: "scroll omhoog",
}, &i18n.Message{
ID: "scrollUpMainPanel",
Other: "scroll naar beneden vanaf hooft paneel",
}, &i18n.Message{
ID: "scrollDownMainPanel",
Other: "scroll naar beneden vabaf hooft paneel",
}, &i18n.Message{
ID: "AmendCommitTitle",
Other: "Commit wijzigen",
@@ -603,7 +727,7 @@ func addDutch(i18nObject *i18n.Bundle) error {
Other: "Weet je zeker dat je deze commit wil verwijderen?",
}, &i18n.Message{
ID: "SquashingStatus",
Other: "squashing",
Other: "squashen",
}, &i18n.Message{
ID: "FixingStatus",
Other: "fixing up",
@@ -615,13 +739,22 @@ func addDutch(i18nObject *i18n.Bundle) error {
Other: "verplaatsen",
}, &i18n.Message{
ID: "RebasingStatus",
Other: "rebasing",
Other: "rebasen",
}, &i18n.Message{
ID: "AmendingStatus",
Other: "wijzigen",
}, &i18n.Message{
ID: "CherryPickingStatus",
Other: "cherry-picking",
Other: "cherry-picken",
}, &i18n.Message{
ID: "UndoingStatus",
Other: "ongedaan maken",
}, &i18n.Message{
ID: "RedoingStatus",
Other: "redoing",
}, &i18n.Message{
ID: "CheckingOutStatus",
Other: "uitchecken",
}, &i18n.Message{
ID: "CommitFiles",
Other: "Commit bestanden",
@@ -681,7 +814,7 @@ func addDutch(i18nObject *i18n.Bundle) error {
Other: "verwijder werkende tree",
}, &i18n.Message{
ID: "discardAnyUnstagedChanges",
Other: "discard unstaged changes",
Other: "discard unstaged wijzigingen",
}, &i18n.Message{
ID: "discardUntrackedFiles",
Other: "negeer niet-gevonden bestanden",
@@ -691,6 +824,12 @@ func addDutch(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "hardReset",
Other: "harde reset",
}, &i18n.Message{
ID: "hardResetUpstream",
Other: "harde naar upstream branch",
}, &i18n.Message{
ID: "viewResetOptions",
Other: `bekijk reset opties`,
}, &i18n.Message{
ID: "createFixupCommit",
Other: `creëer fixup commit voor deze commit`,
@@ -723,58 +862,304 @@ func addDutch(i18nObject *i18n.Bundle) error {
Other: "Je hebt nog niet een commit bericht voorvoegsel ingesteld voor het overslaan van hooks. Set `git.skipHookPrefix = 'WIP'` in je config",
}, &i18n.Message{
ID: "resetTo",
Other: `reset to`,
Other: `reset naar`,
}, &i18n.Message{
ID: "pressEnterToReturn",
Other: "Press enter to return to lazygit",
Other: "Press om terug te gaan naar lazygit",
}, &i18n.Message{
ID: "viewStashOptions",
Other: "view stash options",
Other: "bekijk stash opties",
}, &i18n.Message{
ID: "stashAllChanges",
Other: "stash-bestanden",
}, &i18n.Message{
ID: "stashStagedChanges",
Other: "stash staged changes",
Other: "stash staged wijzigingen",
}, &i18n.Message{
ID: "stashOptions",
Other: "Stash options",
Other: "Stash opties",
}, &i18n.Message{
ID: "notARepository",
Other: "Error: must be run inside a git repository",
Other: "Fout: must be run inside a git repository",
}, &i18n.Message{
ID: "jump",
Other: "jump to panel",
Other: "ga naar paneel",
}, &i18n.Message{
ID: "DiscardPatch",
Other: "Patch weg gooien",
}, &i18n.Message{
ID: "DiscardPatchConfirm",
Other: "Je kan alleen maar een patch bouwen van 1 commit. actueel patch weg gooien?",
}, &i18n.Message{
ID: "CantPatchWhileRebasingError",
Other: "Je kan geen patch bouwen of patch commando uitvoeren wanneer je in een merging of rebasing state zit",
}, &i18n.Message{
ID: "toggleAddToPatch",
Other: "toggle bestand inbegrepen in patch",
}, &i18n.Message{
ID: "ViewPatchOptions",
Other: "bekijk aangepaste patch opties",
}, &i18n.Message{
ID: "PatchOptionsTitle",
Other: "Patch Opties",
}, &i18n.Message{
ID: "NoPatchError",
Other: "Nog geen patch gecreëerd. Om een patch te bouwen gebruik 'space' op een commit bestand of 'enter' om een spesiefieke lijnen toe te voegen",
}, &i18n.Message{
ID: "enterFile",
Other: "enter bestand to add selecteered lines to the patch",
}, &i18n.Message{
ID: "ExitLineByLineMode",
Other: `exit line-by-line mode`,
Other: `sluit lijn-bij-lijn mode`,
}, &i18n.Message{
ID: "EnterUpstream",
Other: `Enter upstream as '<remote> <branchname>'`,
Other: `Enter upstream als '<remote> <branchnaam>'`,
}, &i18n.Message{
ID: "EnterUpstreamWithSlash",
Other: `Enter upstream als '<remote>/<branchnaam>'`,
}, &i18n.Message{
ID: "notTrackingRemote",
Other: "(nog geen remote aan het volgen)",
}, &i18n.Message{
ID: "ReturnToRemotesList",
Other: `return to remotes list`,
Other: `Ga terug naar remotes lijst`,
}, &i18n.Message{
ID: "addNewRemote",
Other: `voeg een nieuwe remote toe`,
}, &i18n.Message{
ID: "newRemoteName",
Other: `Nieuwe remote name:`,
}, &i18n.Message{
ID: "newRemoteUrl",
Other: `Nieuwe remote url:`,
}, &i18n.Message{
ID: "editRemoteName",
Other: `Enter updated remote naam voor {{ .remoteName }}:`,
}, &i18n.Message{
ID: "editRemoteUrl",
Other: `Enter updated remote url voor {{ .remoteName }}:`,
}, &i18n.Message{
ID: "removeRemote",
Other: `verwijder remote`,
}, &i18n.Message{
ID: "removeRemotePrompt",
Other: "Weet je zeker dat je deze remote wilt verwijderen",
}, &i18n.Message{
ID: "DeleteRemoteBranch",
Other: "Verwijder Remote Branch",
}, &i18n.Message{
ID: "DeleteRemoteBranchMessage",
Other: "Weet je zeker dat je deze remote branch wilt verwijderen",
}, &i18n.Message{
ID: "setUpstream",
Other: "stel in als upstream van uitgecheckte branch",
}, &i18n.Message{
ID: "SetUpstreamTitle",
Other: "Stel in als upstream branch",
}, &i18n.Message{
ID: "SetUpstreamMessage",
Other: "Weet je zeker dat je de upstream branch van '{{.checkedOut}}' naar '{{.selected}}' wilt zetten",
}, &i18n.Message{
ID: "editRemote",
Other: "wijzig remote",
}, &i18n.Message{
ID: "tagCommit",
Other: "tag commit",
}, &i18n.Message{
ID: "TagNameTitle",
Other: "Tag naam:",
}, &i18n.Message{
ID: "deleteTag",
Other: "verwijder tag",
}, &i18n.Message{
ID: "DeleteTagTitle",
Other: "Verwijder tag",
}, &i18n.Message{
ID: "DeleteTagPrompt",
Other: "Weet je zeker dat je '{{.tagName}}' wil verwijderen?",
}, &i18n.Message{
ID: "PushTagTitle",
Other: "remote om tag '{{.tagName}}' te pushen naar:",
}, &i18n.Message{
ID: "pushTag",
Other: "push tag",
}, &i18n.Message{
ID: "createTag",
Other: "creëer tag",
}, &i18n.Message{
ID: "CreateTagTitle",
Other: "Tag naam:",
}, &i18n.Message{
ID: "fetchRemote",
Other: "fetch remote",
}, &i18n.Message{
ID: "FetchingRemoteStatus",
Other: "remote fetchen",
}, &i18n.Message{
ID: "checkoutCommit",
Other: "checkout commit",
}, &i18n.Message{
ID: "SureCheckoutThisCommit",
Other: "Weet je zeker dat je deze commit wil uitchecken?",
}, &i18n.Message{
ID: "gitFlowOptions",
Other: "laat git-flow opties zien",
}, &i18n.Message{
ID: "NotAGitFlowBranch",
Other: "Dit lijkt geen git flow branch te zijn",
}, &i18n.Message{
ID: "NewBranchNamePrompt",
Other: "nieuwe {{.branchType}} naam:",
}, &i18n.Message{
ID: "IgnoreTracked",
Other: "Ignore tracked file",
Other: "Negeer tracked bestand",
}, &i18n.Message{
ID: "IgnoreTrackedPrompt",
Other: "Are you sure you want to ignore a tracked file?",
Other: "weet je zeker dat je een getracked bestand wil negeeren?",
}, &i18n.Message{
ID: "viewResetToUpstreamOptions",
Other: "bekijk upstream reset opties",
}, &i18n.Message{
ID: "nextScreenMode",
Other: "volgende schermmode (normaal/half/groot )",
}, &i18n.Message{
ID: "prevScreenMode",
Other: "vorige schermmode",
}, &i18n.Message{
ID: "startSearch",
Other: "start met zoekken",
}, &i18n.Message{
ID: "Panel",
Other: "Paneel",
}, &i18n.Message{
ID: "Keybindings",
Other: "Sneltoetsen",
}, &i18n.Message{
ID: "renameBranch",
Other: "hernoem branch",
}, &i18n.Message{
ID: "NewBranchNamePrompt",
Other: "Noem een nieuwe branch naam",
}, &i18n.Message{
ID: "RenameBranchWarning",
Other: "Deze branch volgt een remote. Deze actie zal alleen de locale branch name wijzigen niet de naam van de remote branch. Verder gaan?",
}, &i18n.Message{
ID: "openMenu",
Other: "open menu",
}, &i18n.Message{
ID: "closeMenu",
Other: "sluit menu",
}, &i18n.Message{
ID: "resetCherryPick",
Other: "reset cherry-picked (gecopieerde) commits selectie",
}, &i18n.Message{
ID: "nextTab",
Other: "volgende tab",
}, &i18n.Message{
ID: "prevTab",
Other: "vorige tab",
}, &i18n.Message{
ID: "cantUndoWhileRebasing",
Other: "Kan niet ongedaan maken terwijl je aan het rebasen bent",
}, &i18n.Message{
ID: "cantRedoWhileRebasing",
Other: "Kan niet opnieuw doen (redo) terwijl je aan het rebasen bent",
}, &i18n.Message{
ID: "MustStashWarning",
Other: "Een patch in de index stoppen verijst stashen en onstashen van je wijzigingen. Als iets verkeert gaat kan je je bestanden terug vinden in de stash. Verder gaan?",
}, &i18n.Message{
ID: "MustStashTitle",
Other: "Moet stashen",
}, &i18n.Message{
ID: "ConfirmationTitle",
Other: "Bevestigings Paneel",
}, &i18n.Message{
ID: "prevPage",
Other: "vorige pagina",
}, &i18n.Message{
ID: "nextPage",
Other: "volgende pagina",
}, &i18n.Message{
ID: "gotoTop",
Other: "scroll naar boven",
}, &i18n.Message{
ID: "gotoBottom",
Other: "scroll naar beneden",
}, &i18n.Message{
ID: "filteringBy",
Other: "filteren bij",
}, &i18n.Message{
ID: "(reset)",
Other: "(reset)",
}, &i18n.Message{
ID: "openScopingMenu",
Other: "bekijk scoping opties",
}, &i18n.Message{
ID: "filterBy",
Other: "filter bij",
}, &i18n.Message{
ID: "exitFilterMode",
Other: "stop met filteren bij pad",
}, &i18n.Message{
ID: "filterPathOption",
Other: "vulin pad om op te filteren",
}, &i18n.Message{
ID: "enterFileName",
Other: "vulin path:",
}, &i18n.Message{
ID: "FilteringMenuTitle",
Other: "Filteren",
}, &i18n.Message{
ID: "MustExitFilterModeTitle",
Other: "Command niet beschikbaar",
}, &i18n.Message{
ID: "MustExitFilterModePrompt",
Other: "Command niet beschikbaar in filter mode. Sluit filter mode?",
}, &i18n.Message{
ID: "diff",
Other: "diff",
}, &i18n.Message{
ID: "enterRefToDiff",
Other: "vulin ref to diff",
}, &i18n.Message{
ID: "enteRefName",
Other: "vulin ref:",
}, &i18n.Message{
ID: "exitDiffMode",
Other: "sluit diff mode",
}, &i18n.Message{
ID: "DiffingMenuTitle",
Other: "Diffen",
}, &i18n.Message{
ID: "swapDiff",
Other: "keer diff richting om",
}, &i18n.Message{
ID: "openDiffingMenu",
Other: "open diff menu",
}, &i18n.Message{
ID: "showingGitDiff",
Other: "laat output zien voor:",
}, &i18n.Message{
ID: "copyCommitShaToClipboard",
Other: "copieer commit SHA naar clipboard",
}, &i18n.Message{
ID: "copyBranchNameToClipboard",
Other: "copieer branch name naar clipboard",
}, &i18n.Message{
ID: "commitPrefixPatternError",
Other: "Error in commitPrefix pattern",
Other: "Fout in commitPrefix patroon",
}, &i18n.Message{
ID: "NoFilesStagedTitle",
Other: "No files staged",
Other: "geen bestanden gestaged",
}, &i18n.Message{
ID: "NoFilesStagedPrompt",
Other: "You have not staged any files. Commit all files?",
Other: "Je hebt geen bestanden gestaged. Commit alle bestanden?",
}, &i18n.Message{
ID: "BranchNotFoundTitle",
Other: "Branch not found",
Other: "Branch niet gevonden",
}, &i18n.Message{
ID: "BranchNotFoundPrompt",
Other: "Branch not found. Create a new branch named",
Other: "Branch niet gevonden. Creëer een nieuwe branch genaamd",
},
)
}
+6 -5
View File
@@ -240,6 +240,9 @@ func addEnglish(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "NoTrackingThisBranch",
Other: "There is no tracking for this branch",
}, &i18n.Message{
ID: "CommitMessageConfirm",
Other: "{{.keyBindClose}}: close, {{.keyBindNewLine}}: new line, {{.keyBindConfirm}}: confirm",
}, &i18n.Message{
ID: "CommitWithoutMessageErr",
Other: "You cannot commit without a commit message",
@@ -526,12 +529,10 @@ func addEnglish(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "ToggleSelectionForPatch",
Other: `add/remove line(s) to patch`,
},
&i18n.Message{
}, &i18n.Message{
ID: "TogglePanel",
Other: `switch to other panel`,
},
&i18n.Message{
}, &i18n.Message{
ID: "CantStageStaged",
Other: `You can't stage an already staged change!`,
}, &i18n.Message{
@@ -926,7 +927,7 @@ func addEnglish(i18nObject *i18n.Bundle) error {
Other: "(not tracking any remote)",
}, &i18n.Message{
ID: "ReturnToRemotesList",
Other: `return to remotes list`,
Other: `Return to remotes list`,
}, &i18n.Message{
ID: "addNewRemote",
Other: `add new remote`,
+3
View File
@@ -206,6 +206,9 @@ func addPolish(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "NoTrackingThisBranch",
Other: "Brak śledzenia dla tej gałęzi",
}, &i18n.Message{
ID: "CommitMessageConfirm",
Other: "{{.keyBindClose}}: zamknij, {{.keyBindNewLine}}: new line, {{.keyBindConfirm}}: potwierdź",
}, &i18n.Message{
ID: "CommitWithoutMessageErr",
Other: "Nie możesz commitować bez podania wiadomości",
+12
View File
@@ -322,3 +322,15 @@ func FindStringSubmatch(str string, regexpStr string) (bool, []string) {
match := re.FindStringSubmatch(str)
return len(match) > 0, match
}
func StringArraysOverlap(strArrA []string, strArrB []string) bool {
for _, first := range strArrA {
for _, second := range strArrB {
if first == second {
return true
}
}
}
return false
}