ZyX_I avatar ZyX_I committed 959d730

Added git driver (not finished, untested)
Added support for “git diff” to ftplugin/diff.vim
Removed last argument to rf-commit() function (not used in any case)

Comments (0)

Files changed (23)

 This plugin provides a vim <--> VCS (currently only mercurial) integration for 
 your projects. Features:
 
-  - Partially committing changes ([:AuRecord](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line347-0)).
+  - Partially committing changes ([:AuRecord](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line349-0)).
 
-  - Viewing file state at particular revision ([aurum://file](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line578-0), [:AuFile](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line153-0)).
+  - Viewing file state at particular revision ([aurum://file](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line580-0), [:AuFile](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line155-0)).
 
   - Viewing uncommited changes in a vimdiff, as well as changes between 
-    specific revisions ([:AuVimDiff](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line387-0)). It is also possible to open multiple 
+    specific revisions ([:AuVimDiff](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line389-0)). It is also possible to open multiple 
     tabs with all changes to all files viewed as side-by-side diffs.
 
-  - Viewing revisions log ([:AuLog](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line233-0)). Output is highly customizable.
+  - Viewing revisions log ([:AuLog](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line235-0)). Output is highly customizable.
 
-  - Viewing working directory status ([:AuStatus](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line351-0)).
+  - Viewing working directory status ([:AuStatus](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line353-0)).
 
-  - Commiting changes ([:AuCommit](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line94-0)), commit messages are remembered in case of 
-    rollback ([g:aurum_remembermsg](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line823-0)).
+  - Commiting changes ([:AuCommit](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line96-0)), commit messages are remembered in case of 
+    rollback ([g:aurum_remembermsg](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line825-0)).
 
   - Obtaining various URL’s out of remote repository URL (like URL of the HTML 
     version of the current file with URL fragment pointing to the current line 
-    attached: useful for sharing) ([:AuHyperlink](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line184-0)).
+    attached: useful for sharing) ([:AuHyperlink](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line186-0)).
 
   - aurum#changeset(), aurum#repository() and aurum#status() functions 
     that are to be used from modeline.
 
   - Frontends for various other VCS commands.
 
-Most commands can be reached with a set of mappings (see [aurum-mappings](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line720-0)), 
+Most commands can be reached with a set of mappings (see [aurum-mappings](http://vimpluginloader.sourceforge.net/doc/aurum.txt.html#line722-0)), 
 all mappings are customizable.
 
 

autoload/aurum.vim

     if empty(repo)
         return {}
     endif
-    return s:_r.cache.get('cs', repo.functions.getcs, [repo, '.'], {})
+    return s:_r.cache.get('cs', repo.functions.getwork, [repo], {})
 endfunction
 let s:_functions+=['aurum#changeset']
 "▶1 aurum#status
         8.1. Repository                                  |aurum-repository|
         8.2. Changeset                                   |aurum-changeset|
     9. Creating your own driver                          |aurum-new-driver|
-    10. Changelog                                        |aurum-changelog|
+    10. Notes about various driver implementations       |aurum-driver-notes|
+    11. Changelog                                        |aurum-changelog|
 
 ==============================================================================
 1. Intro                                                         *aurum-intro*
     of a current file (|aurum-current-file|).
 
 AuBranch[!] {branch} [repo {repo}]                                 *:AuBranch*
-    Set current branch name to {branch}.
+    Set current branch name to {branch}. Bang forces creating of the branch 
+    even if it currently exists.
 
 AuCommit {options} [glob1 [glob2 [...]]]                           *:AuCommit*
     Commit files matching given globs (current file if no globs were given). 
     accept repository object as its first argument, so it is not mentioned in 
     function descriptions. Here is the list:
                                                              *aurum-rf-commit*
-  commit :: message[, [ file ][, user[, date[, closebranch[, force]]]]] -> _
+  commit :: message[, [ file ][, user[, date[, closebranch]]]] -> _
     Commit changes made to specified files (default depends on VCS, normally 
     it is “commit changes made to all tracked files (including additions and 
     removes))”. “closebranch” and “force” arguments have Bool type, “user” and 
 throw an "nimp" exception.
 
 ==============================================================================
-10. Changelog                                                *aurum-changelog*
+10. Notes about various driver implementations            *aurum-driver-notes*
+
+Mercurial:
+|aurum-repo.hypsites|:
+    1. When processing various git repositories checked out using hg-git 
+       (http://hg-git.github.com/) it is assumed that |aurum-cs.hex| can be 
+       replaced with first bookmark or first tag that starts with "default/" 
+       with "default/" part removed.
+    2. Svn revisions are not supported at all, |aurum-cs.hex| in driver is 
+       replaced with static string "HEAD".
+|aurum-rf-status|:
+    For non-python driver this function does not support names containing 
+    newlines.
+Python driver was not tested under windows (wine) at all.
+
+Git:
+|aurum-cs.branch| always contains string "default".
+|aurum-cs.tags|:
+    Contains list of all references pointing to given commit, not just tags.
+|aurum-rf-status|:
+    If two first optional arguments are given and are non-zero, then unknown 
+    and deleted files won’t be shown (if any).
+|aurum-rf-gettiphex|: Same as |aurum-rf-getworkhex|.
+|aurum-rf-diff|: Options "git", "iblanks", "showfunc" are not supported.
+|aurum-rf-checkdir| does not support bare repositories.
+
+==============================================================================
+11. Changelog                                                *aurum-changelog*
 
 @aurum/repo:
     1.0: Instead of depending on drivers, make drivers depend on @aurum/repo
     1.1: Added repo.branch and repo.label
+    1.2: Added setlines function
 @aurum:
     0.1: Added :AuBranch and :AuName
+@aurum/edit:
+    1.0: Removed setlines function (moved it to @aurum/repo)
 
 vim: ft=help:tw=78

ftplugin/aurumannotate.vim

             \             '@aurum/bufvars': '0.0',
             \             '@aurum/vimdiff': '0.0',
             \            '@aurum/annotate': '0.0',
-            \                '@aurum/edit': '0.0',
+            \                '@aurum/edit': '1.0',
             \                 '@/mappings': '0.0',
             \                       '@/os': '0.0',})
 let s:_messages={

ftplugin/aurumlog.vim

 execute frawor#Setup('0.0', {'@aurum/cmdutils': '0.0',
             \                 '@aurum/bufvars': '0.0',
             \                    '@aurum/repo': '1.0',
-            \                    '@aurum/edit': '0.0',
+            \                    '@aurum/edit': '1.0',
             \                           '@/os': '0.0',
             \                     '@/mappings': '0.0',})
 let s:_messages={

ftplugin/aurumstatus.vim

 setlocal nomodeline
 execute frawor#Setup('0.0', {'@aurum/bufvars': '0.0',
             \                '@aurum/vimdiff': '0.0',
-            \                   '@aurum/edit': '0.0',
+            \                   '@aurum/edit': '1.0',
             \                 '@aurum/commit': '0.0',
             \                    '@/mappings': '0.0',
             \                          '@/os': '0.0',})

ftplugin/diff.vim

 function! s:FoldText()
     let line=getline(v:foldstart)
     if v:foldlevel==1
-        if line =~# '\v^diff\ a\/(.{-})\ b\/\1'
-            return matchlist(line, '\v^diff\ a\/(.{-})\ b\/\1')[1]
+        if line =~# '\v^diff%(\ --git)?\ a\/(.{-})\ b\/\1'
+            return matchlist(line, '\v^diff%(\ --git)\ a\/(.{-})\ b\/\1')[1]
         elseif line =~# '\v^diff%(\ \-r\ \x+){1,2}'
             return substitute(line, '\v^diff%(\ \-r\ \x+){1,2}\ ', '', '')
         endif
                 \                '@aurum/log': '0.0',
                 \             '@aurum/commit': '0.0',
                 \               '@aurum/repo': '1.1',
-                \               '@aurum/edit': '0.0',
+                \               '@aurum/edit': '1.0',
                 \            '@aurum/bufvars': '0.0',
                 \            '@aurum/vimdiff': '0.0',}, 0)
     "▶2 Команды

plugin/aurum/annotate.vim

     execute frawor#Setup('0.0', {'@/table': '0.1',
                 \        '@aurum/cmdutils': '0.0',
                 \         '@aurum/bufvars': '0.0',
-                \            '@aurum/edit': '0.0',
+                \            '@aurum/edit': '1.0',
                 \                  '@/fwc': '0.3',
                 \             '@/commands': '0.0',
                 \            '@/functions': '0.0',

plugin/aurum/cmdutils.vim

     execute frawor#Setup('0.0', {'@/resources': '0.0',
                 \                       '@/os': '0.0',
                 \                '@aurum/repo': '1.0',
-                \                '@aurum/edit': '0.0',
+                \                '@aurum/edit': '1.0',
                 \               '@aurum/cache': '0.0',
                 \             '@aurum/bufvars': '0.0',}, 0)
     finish

plugin/aurum/commit.vim

                 \            '@aurum/cmdutils': '0.0',
                 \             '@aurum/bufvars': '0.0',
                 \                '@aurum/repo': '1.0',
-                \                '@aurum/edit': '0.0',
+                \                '@aurum/edit': '1.0',
                 \                      '@/fwc': '0.3',
                 \                 '@/commands': '0.0',
                 \                '@/functions': '0.0',}, 0)

plugin/aurum/diff.vim

 if !exists('s:_pluginloaded')
     execute frawor#Setup('0.0', {'@aurum/cmdutils': '0.0',
                 \                 '@aurum/bufvars': '0.0',
-                \                    '@aurum/repo': '1.0',
-                \                    '@aurum/edit': '0.0',
+                \                    '@aurum/repo': '1.2',
+                \                    '@aurum/edit': '1.0',
                 \                           '@/os': '0.0',
                 \                          '@/fwc': '0.0',
                 \                     '@/mappings': '0.0',

plugin/aurum/drivers/common/utils.vim

+"▶1
+scriptencoding utf-8
+if !exists('s:_pluginloaded')
+    execute frawor#Setup('0.0', {'@/resources': '0.0',}, 0)
+    finish
+elseif s:_pluginloaded
+    finish
+endif
+let s:utils={}
+"▶1 utils.getcmd :: cmd, args, kwargs, esc → sh
+function s:utils.getcmd(cmd, args, kwargs, esc)
+    let cmd=a:cmd
+    if !empty(a:kwargs)
+        let cmd.=' '.join(map(filter(items(a:kwargs), 'v:val[1] isnot 0'),
+                \             '((v:val[1] is 1)?'.
+                \               '(repeat("-", 1+(len(v:val[0])>1)).v:val[0]):'.
+                \               '(repeat("-", 1+(len(v:val[0])>1)).v:val[0].'.
+                \                          '"=".shellescape(v:val[1],a:esc)))'))
+    endif
+    if !empty(a:args)
+        let cmd.=' '.join(map(copy(a:args), 'shellescape(v:val, a:esc)'))
+    endif
+    return cmd
+endfunction
+"▶1 utils.run :: sh, hasnulls::Bool → [String] + shell
+function s:utils.run(cmd, hasnulls, cdpath)
+    if a:hasnulls
+        let savedlazyredraw=&lazyredraw
+        set lazyredraw
+        noautocmd tabnew
+        if !empty(a:cdpath)
+            noautocmd execute 'lcd' fnameescape(a:cdpath)
+        endif
+        " XXX this is not able to distinguish between output with and without 
+        " trailing newline
+        noautocmd execute '%!'.a:cmd
+        let r=getline(1, '$')
+        noautocmd bwipeout!
+        let &lazyredraw=savedlazyredraw
+    else
+        let cmd=a:cmd
+        if !empty(a:cdpath)
+            let cmd='cd '.shellescape(a:cdpath).' && '.cmd
+        endif
+        let r=split(system(cmd), "\n", 1)
+    endif
+    return r
+endfunction
+"▶1 utils.printm :: sh, hasnulls::Bool → + :echom, shell
+function s:utils.printm(m)
+    let prevempty=0
+    for line in a:m
+        if empty(line)
+            let prevempty+=1
+        else
+            if prevempty
+                while prevempty
+                    echom ' '
+                    let prevempty-=1
+                endwhile
+            endif
+            echom line
+        endif
+    endfor
+endfunction
+"▶1 utils.diffopts :: opts, opts, difftrans → diffopts
+function s:utils.diffopts(opts, defaultdiffopts, difftrans)
+    let opts=extend(copy(a:defaultdiffopts), a:opts)
+    let r={}
+    call map(filter(copy(a:difftrans), 'has_key(opts, v:key)'),
+            \'extend(r, {v:val : opts[v:key]})')
+    if has_key(opts, 'dates')
+        let r.nodates=!opts.dates
+    endif
+    return r
+endfunction
+"▶1 utils.getcsprop :: repo, either cs rev, propname → a
+function s:utils.getcsprop(repo, csr, propname)
+    if type(a:csr)==type({})
+        let cs=a:csr
+    else
+        let cs=a:repo.functions.getcs(a:repo, a:csr)
+    endif
+    if has_key(cs, a:propname)
+        return cs[a:propname]
+    endif
+    call a:repo.functions.setcsprop(a:repo, cs, a:propname)
+    " XXX There is much code relying on the fact that after getcsprop property 
+    " with given name is added to changeset dictionary
+    return cs[a:propname]
+endfunction
+"▶1 post resource
+call s:_f.postresource('utils', s:utils)
+unlet s:utils
+"▶1
+call frawor#Lockvar(s:, '_pluginloaded')
+" vim: ft=vim ts=4 sts=4 et fmr=▶,▲

plugin/aurum/drivers/git.vim

+"▶1
+scriptencoding utf-8
+if !exists('s:_pluginloaded')
+    execute frawor#Setup('0.1', {   '@aurum/repo': '1.0',
+                \                          '@/os': '0.0',
+                \   '@aurum/drivers/common/utils': '0.0',
+                \'@aurum/drivers/common/hypsites': '0.0',}, 0)
+    finish
+elseif s:_pluginloaded
+    finish
+endif
+let s:_messages={
+            \   'hexf': 'Failed to obtain hex string for revision %s '.
+            \           'in the repository %s: %s',
+            \    'csf': 'Failed to obtain information about revision %s '.
+            \           'in the repository %s: %s',
+            \   'updf': 'Failed to checkout commit %s in the repository %s: %s',
+            \    'mvf': 'Failed to move file %s to %s in the repository %s: %s',
+            \    'rmf': 'Failed to remove file %s in the repository %s: %s',
+            \    'fgf': 'Failed to forget file %s in the repository %s: %s',
+            \  'filef': 'Failed to get revision %s of the file %s '.
+            \           'from the repository %s: %s',
+            \   'annf': 'Failet to annotate revision %s of the file %s '.
+            \           'in the repository %s: %s',
+            \  'difff': 'Failed to get diff between %s and %s for files %s '.
+            \           'in the repository %s: %s',
+            \ 'sdifff': 'Failed to get status information '.
+            \           'for the repository %s: %s',
+            \    'lsf': 'Failed to list files in the changeset %s '.
+            \           'of the repository %s: %s',
+            \'statusf': 'Failed to obtain status of the repository %s: %s',
+            \ 'cbnimp': 'Git driver is not able to close branch',
+        \}
+let s:git={}
+"▶1 s:hypsites
+let s:hypsites=s:_r.hypsites.git
+"▶1 refile :: gitfname → path
+function s:F.refile(fname)
+    return a:fname[0] is# '"' ? eval(a:fname) : a:fname
+endfunction
+"▶1 gitcmd :: repo, cmd, args, kwargs, esc → String
+function s:F.gitcmd(repo, ...)
+    let cmd = 'git --git-dir='.  shellescape(a:repo.path.'/.git', a:4).
+                \' --work-tree='.shellescape(a:repo.path,         a:4).
+                \' '.call(s:_r.utils.getcmd, a:000, {})
+    return cmd
+endfunction
+"▶1 git :: repo, cmd, args, kwargs, has0[, msgid[, marg1[, …]]] → [String] + ?
+function s:F.git(repo, cmd, args, kwargs, hasnulls, ...)
+    let cmd=s:F.gitcmd(a:repo, a:cmd, a:args, a:kwargs, a:hasnulls)
+    let r=s:_r.utils.run(cmd, a:hasnulls, a:repo.path)
+    if v:shell_error && a:0
+        call call(s:_f.throw, a:000+[a:repo.path, join(r[:-1-(a:hasnulls)],
+                    \                                  "\n")], {})
+    endif
+    return r
+endfunction
+"▶1 gitm :: {git args} → + :echom
+function s:F.gitm(...)
+    return s:_r.utils.printm(call(s:F.git, a:000, {}))
+endfunction
+"▶1 git.getrevhex :: repo, rev → hex
+function s:git.getrevhex(repo, rev)
+    return s:F.git(a:repo, 'rev-parse', [a:rev], {}, 0, 'hexf', a:rev)[0]
+endfunction
+"▶1 parsecs :: csdata, lstart::UInt → (cs, line::UInt)
+" hash-parent hashes-timestamp
+"  (refs)
+" author name
+" author email
+" 1-indented commit message
+let s:logformat='%H-%P-%at-%n%an%n%ae%n%d%n%w(0,1,1)%B'
+let s:logkwargs={'format': s:logformat, 'encoding': 'utf-8'}
+function s:F.parsecs(csdata, lstart)
+    let line=a:lstart
+    let cs={'branch': 'default'}
+    let [hex, parents, time]=split(a:csdata[line], '-') | let line+=1
+    let cs.hex=hex
+    let cs.parents=split(parents)
+    let cs.time=+time
+    let aname=a:csdata[line]                            | let line+=1
+    let aemail=a:csdata[line]                           | let line+=1
+    let cs.user=aname.' <'.aemail.'>'
+    let cs.tags=split(a:csdata[line][2:-2], ', ')       | let line+=1
+    let cs.bookmarks=[]
+    "▶2 get description
+    let description=[]
+    while a:csdata[line][0] is# ' '
+        let description+=[a:csdata[line][1:]]
+        let line+=1
+    endwhile
+    let cs.description=join(description, "\n")
+    "▲2
+    return [cs, line]
+endfunction
+"▶1 git.getcs :: repo, rev → cs
+function s:git.getcs(repo, rev)
+    let cs=s:F.parsecs(s:F.git(a:repo, 'log', [a:rev.'^..'.a:rev], s:logkwargs,
+                \              0, 'csf', a:rev),
+                \      0)[0]
+    let a:repo.changesets[cs.hex]=cs
+    return cs
+endfunction
+"▶1 git.getwork :: repo → cs
+function s:git.getwork(repo)
+    return a:repo.functions.getcs(a:repo, 'HEAD')
+endfunction
+"▶1 git.getworkhex :: repo → hex
+function s:git.getworkhex(repo)
+    return a:repo.functions.getrevhex(a:repo, 'HEAD')
+endfunction
+"▶1 git.gettiphex
+" XXX Use working directory revision instead of latest revision
+let s:git.gettiphex=s:git.getworkhex
+"▶1 git.getcsprop :: repo, Either cs rev, prop → propvalue
+function s:git.setcsprop(repo, cs, propname)
+    if a:propname is# 'allfiles'
+        let r=map(s:F.git(a:repo, 'ls-tree', ['--', a:cs.hex],
+                    \                        {'name-only': 1, 'r': 1}, 0,
+                    \     'lsf', a:cs.hex)[:-2], 's:F.refile(v:val)')
+    endif
+    " TODO children, renames, copies
+    let a:cs[a:propname]=r
+    return r
+endfunction
+let s:git.getcsprop=s:_r.utils.getcsprop
+"▶1 git.readfile :: repo, rev, file → [String]
+function s:git.readfile(repo, rev, file)
+    return s:F.git(a:repo, 'cat-file', ['blob', a:rev.':'.a:file], {}, 1,
+                \  'filef', a:rev, a:file)
+endfunction
+"▶1 git.diff :: repo, rev, rev, files, diffopts → [String]
+let s:diffopts={
+            \  'reverse': 'R',
+            \ 'ignorews': 'ignore-all-space',
+            \'iwsamount': 'ignore-space-change',
+            \ 'numlines': 'unified',
+            \  'alltext': 'text',
+        \}
+function s:git.diff(repo, rev1, rev2, files, opts)
+    let opts=s:_r.utils.diffopts(a:opts, a:repo.diffopts, s:diffopts)
+    if has_key(opts, 'unified')
+        let opts.unified=''.opts.unified
+    endif
+    let kwargs=copy(opts)
+    let args=[]
+    if empty(a:rev2)
+        if !empty(a:rev1)
+            let args+=[a:rev1.'^..'.a:rev1]
+        endif
+    else
+        let args+=[a:rev2]
+        if !empty(a:rev1)
+            let args[-1].='..'.a:rev1
+        endif
+    endif
+    if !empty(a:files)
+        let args+=['--']+a:files
+    endif
+    let r=s:F.git(a:repo, 'diff', args, kwargs, 1,
+                \ 'difff', a:rev1, a:rev2, join(a:files, ', '))
+    return r+['']
+endfunction
+"▶1 nullnl :: [String] → [String]
+" Convert between lines (NL separated strings with NULLs represented as NLs) and 
+" NULL separated strings with NLs represented by NLs.
+function s:F.nullnl(text)
+    let r=[]
+    for line in a:text
+        let nlsplit=split(line, "\n", 1)
+        if empty(r)
+            call extend(r, nlsplit)
+        else
+            let r[-1].="\n".nlsplit[0]
+            call extend(r, nlsplit[1:])
+        endif
+    endfor
+    return r
+endfunction
+"▶1 git.status :: repo[, rev1[, rev2[, files]]]
+let s:statchars={
+            \'A': 'added',
+            \'M': 'modified',
+            \'R': 'removed',
+        \}
+let s:initstatdct={
+            \'modified': [],
+            \   'added': [],
+            \ 'removed': [],
+            \ 'deleted': [],
+            \ 'unknown': [],
+            \ 'ignored': [],
+            \   'clean': [],
+        \}
+function s:git.status(repo, ...)
+    let r=deepcopy(s:initstatdct)
+    if a:0 && (a:1 isnot 0 || (a:0>1 && a:2 isnot 0))
+        " FIXME This is not going to show status for unknown files. Document it.
+        let args=((a:0>2 && !empty(a:3))?(['--']+a:3):([]))
+        let rspec=[]
+        if a:1 is 0
+            if a:0>1 && a:2 isnot 0
+                let reverse=1
+            endif
+        else
+            let rspec+=[a:1]
+        endif
+        if a:0>1 && a:2 isnot 0
+            let rspec+=[a:2]
+        endif
+        call insert(args, join(rspec, '..'))
+        let kwargs={'diff-filter': 'ADM', 'name-status': 1, 'no-renames': 1}
+        let d=s:F.git(a:repo, 'diff', args, kwargs, 0, 'sdifff')[:-2]
+        let files=map(copy(d), 's:F.refile[v:val[2:]]')
+        call map(copy(d), 'add(r[s:statchars[v:val[0]]], files[v:key])')
+        if reverse
+            let [r.deleted, r.unknown]=[r.unknown, r.deleted]
+            let [r.added,   r.removed]=[r.removed, r.added  ]
+        endif
+        let allfiles=a:repo.functions.getcsprop(a:repo, rspec[0], 'allfiles')
+        if a:0>2 && !empty(a:3)
+            let allfiles=filter(copy(allfiles), 'index(a:3, v:val)!=-1')
+        endif
+        let r.clean=filter(copy(allfiles), 'index(files, v:val)==-1')
+    else
+        let args=((a:0>2 && !empty(a:3))?(['--']+a:3):([]))
+        let kwargs={'porcelain': 1, 'z': 1}
+        let s=s:F.nullnl(s:F.git(a:repo, 'status', args, kwargs, 1, 'statusf'))
+        let files=[]
+        while !empty(s)
+            let line=remove(s, 0)
+            let status=line[:1]
+            let file=line[3:]
+            call add(files, file)
+            if status[0] is# 'R'
+                let r.added+=[file]
+                let r.removed+=[remove(s, 0)]
+            elseif status[0] is# 'C'
+                let r.added+=[file]
+                let origfile=remove(s, 0)
+                " FIXME What should be done with origfile?
+            elseif status[0] is# 'D'
+                let r.removed+=[file]
+            elseif status[1] is# 'D'
+                let r.deleted+=[file]
+            elseif status[0] is# 'A'
+                let r.added+=[file]
+            elseif stridx(status, 'M')!=-1
+                let r.modified+=[file]
+            elseif status is# '??'
+                let r.unknown+=[file]
+            endif
+        endwhile
+        let allfiles=a:repo.functions.getcsprop(a:repo, 'HEAD', 'allfiles')
+        if a:0>2 && !empty(a:3)
+            let allfiles=filter(copy(allfiles), 'index(a:3, v:val)!=-1')
+        endif
+        let r.clean=filter(copy(allfiles), 'index(files, v:val)==-1')
+    endif
+    return r
+endfunction
+"▶1 git.annotate :: repo, rev, file → [(file, hex, linenumber)]
+function s:git.annotate(repo, rev, file)
+    let args=[a:rev, '--', a:file]
+    let kwargs={'porcelain': 1, 'C': 1, 'M': 1}
+    let lines=s:F.git(a:repo, 'blame', args, kwargs, 1, 'annf', a:rev, a:file)
+    call filter(lines, 'v:val=~#''\v^(\x{40}\ |filename\ )''')
+    let r=[]
+    let filename=a:file
+    while !empty(lines)
+        let line=remove(lines, 0)
+        if !empty(lines) && lines[0][:8] is# 'filename '
+            let filename=s:F.refile(remove(lines, 0)[9:])
+        endif
+        let r+=[[filename, line[:39], str2nr(line[41:]])]
+    endwhile
+    return r
+endfunction
+"▶1 git.commit :: message[, files[, user[, date[, _]]]]
+function s:git.commit(message, ...)
+    let kwargs={'all': 1, 'cleanup': 'verbatim'}
+    if a:message=~#'\v[\r\n]'
+        let tmpfile=tempname()
+        call writefile(split(a:message, "\n", 1), tmpfile, 'b')
+        let kwargs.file=tmpfile
+        let usingfile=1
+    else
+        let kwargs.message=a:message
+    endif
+    let args=[]
+    if a:0
+        if !empty(a:1)
+            let args+=['--']+a:1
+            " FIXME Check whether it is right option
+            let kwargs.include=1
+        endif
+        if a:0>1 && !empty(a:2)
+            let kwargs.author=a:2
+        endif
+        if a:0>2 && !empty(a:3)
+            let kwargs.date=a:3
+        endif
+        if a:0>3 && !empty(a:4)
+            call s:_f.throw('cbnimp')
+        endif
+    endif
+    try
+        return s:F.gitm(a:repo, args, kwargs, 0, 'cif')
+    finally
+        if usingfile && filereadable(tmpfile)
+            call delete(tmpfile)
+        endif
+    endtry
+endfunction
+"▶1 git.update :: repo, rev, force → + FS
+function s:git.update(repo, rev, force)
+    let kwargs={}
+    if a:force
+        let kwargs.force=1
+    endif
+    let args=[a:rev]
+    return s:F.gitm(a:repo, 'checkout', args, kwargs, 0, 'updf', a:rev)
+endfunction
+"▶1 git.move :: repo, force, source, destination → + FS
+function s:git.move(repo, force, source, destination)
+    return s:F.gitm(a:repo, 'mv', ['--', a:source, a:destination],
+                \   a:force ? {'force': 1} : {}, 0, 'mvf',
+                \   a:source, a:destination)
+endfunction
+"▶1 git.remove :: repo, file → + FS
+function s:git.remove(repo, file)
+    return s:F.gitm(a:repo, 'rm', ['--', a:file], {}, 0, 'rmf',
+                \   escape(a:file, '\'))
+endfunction
+"▶1 git.forget :: repo, file → + FS
+function s:git.forget(repo, file)
+    return s:F.gitm(a:repo, 'rm', ['--',a:file], {'cached':1}, 0, 'fgf',
+                \   escape(a:file, '\'))
+endfunction
+"▶1 git.add :: repo, file → + FS
+function s:git.add(repo, file)
+    return s:F.gitm(a:repo, 'add', ['--', a:file], {}, 0, 'addf',
+                \   escape(a:file, '\'))
+endfunction
+"▶1 addtoignfile :: file, line → + FS
+function s:F.addtoignfile(ignfile, line)
+    let r=[]
+    if filereadable(a:ignfile)
+        let r+=readfile(a:ignfile, 'b')
+    endif
+    if !empty(r) && empty(r[-1])
+        call remove(r, -1)
+    endif
+    let r+=[a:line, '']
+    return writefile(r, a:ignfile, 'b')
+endfunction
+"▶1 git.ignore :: repo, file → + FS
+function s:git.ignore(repo, file)
+    return s:F.addtoignfile(s:_r.os.path.join(a:repo.path, '.gitignore'),
+                \           '/'.escape(a:file, '\*?[]'))
+endfunction
+"▶1 git.ignoreglob :: repo, glob → + FS
+function s:git.ignoreglob(repo, glob)
+    return s:F.addtoignfile(s:_r.os.path.join(a:repo.path,'.gitignore'), a:glob)
+endfunction
+"▶1 git.repo :: path → repo
+function s:git.repo(path)
+    let repo={'path': a:path, 'changesets': {}, 'cslist': [],
+                \'local': (stridx(a:path, '://')==-1),
+                \'labeltypes': ['tag', 'branch'],}
+    return repo
+endfunction
+"▶1 git.checkdir :: dir → Bool
+function s:git.checkdir(dir)
+    return s:_r.os.path.isdir(s:_r.os.path.join(a:dir, '.git'))
+endfunction
+"▶1 Register driver
+call s:_f.regdriver('Git', s:git)
+"▶1
+call frawor#Lockvar(s:, '_pluginloaded')
+" vim: ft=vim ts=4 sts=4 et fmr=▶,▲

plugin/aurum/drivers/mercurial.vim

     execute frawor#Setup('0.1', {      '@/python': '0.0',
                 \                   '@aurum/repo': '1.0',
                 \                          '@/os': '0.0',
-                \'@aurum/drivers/common/hypsites': '0.0'}, 0)
+                \   '@aurum/drivers/common/utils': '0.0',
+                \'@aurum/drivers/common/hypsites': '0.0',}, 0)
     finish
 elseif s:_pluginloaded
     finish
 endfunction
 "▶2 hg :: repo, cmd, hasnulls, msgid[, throwarg1[, …]] → [String]
 function s:F.hg(repo, cmd, hasnulls, msgid, ...)
-    let cmd='hg -R '.shellescape(a:repo.path, 1).' '.a:cmd
-    if a:hasnulls
-        let savedlazyredraw=&lazyredraw
-        set lazyredraw
-        noautocmd tabnew
-        if a:repo.local
-            noautocmd execute 'lcd' fnameescape(a:repo.path)
-        endif
-        " XXX this is not able to distinguish between output with and without 
-        " trailing newline
-        noautocmd execute '%!'.cmd
-        let r=getline(1, '$')
-        noautocmd bwipeout!
-        let &lazyredraw=savedlazyredraw
-    else
-        let r=split(system(cmd), "\n", 1)
-    endif
+    let cmd='hg -R '.shellescape(a:repo.path, a:hasnulls).' '.a:cmd
+    let r=s:_r.utils.run(cmd, a:hasnulls, a:repo.path)
     if v:shell_error
         if a:msgid isnot 0
             call call(s:_f.throw, [a:msgid.'fail']+a:000+[a:repo.path,
-                        \                                 join(r[:-1-(a:hasnulls)],
+                        \                              join(r[:-1-(a:hasnulls)],
                         \                                      "\n")], {})
         endif
     endif
 function s:F.refile(path)
     return join(s:_r.os.path.split(a:path)[1:], '/')
 endfunction
-"▶2 parsecs :: csdata, lstart::UInt → [cs, line::UInt]
+"▶2 parsecs :: csdata, lstart::UInt → (cs, line::UInt)
 let s:stylefile=shellescape(s:_r.os.path.join(s:_frawor.runtimepath,
                 \                             'misc', 'map-cmdline.csinfo'))
 let s:chars = [['P', 'parents'  ],
 endfunction
 else "▶2
 function s:hg.readfile(repo, rev, file)
-    let r=s:F.hg(a:repo, 'cat -r '.shellescape(a:rev, 1).' -- '.
-                \             shellescape(a:file, 1), 1, 'file', a:file)
-    return r
+    return s:F.hg(a:repo, 'cat -r '.shellescape(a:rev, 1).' -- '.
+                \                   shellescape(a:file, 1), 1, 'file', a:file)
 endfunction
 endif
 "▶1 hg.annotate :: repo, rev, file → [(file, rev, linenumber)]
 "▶1 hg.getcsprop :: repo, Either cs rev, propname → a
 "▶2 setcsprop
 if s:usepythondriver "▶3
-function s:F.setcsprop(repo, cs, propname)
+function s:hg.setcsprop(repo, cs, propname)
     try
         execute s:_r.py.cmd 'aurum.get_cs_prop(vim.eval("a:repo.path"), '.
                     \                         'vim.eval("a:cs.hex"), '.
     endtry
 endfunction
 else "▶3
-function s:F.setcsprop(repo, cs, propname)
+function s:hg.setcsprop(repo, cs, propname)
     if a:propname is# 'allfiles'
         let r=s:F.hg(a:repo, 'manifest -r '.a:cs.rev, 0,
                     \'csp', a:propname, a:cs.rev)[:-2]
 endfunction
 endif
 "▲2
-function s:hg.getcsprop(repo, csr, propname)
-    if type(a:csr)==type({})
-        let cs=a:csr
-    else
-        let cs=a:repo.functions.getcs(a:repo, a:csr)
-    endif
-    if has_key(cs, a:propname)
-        return cs[a:propname]
-    endif
-    call s:F.setcsprop(a:repo, cs, a:propname)
-    " XXX There is much code relying on the fact that after getcsprop property 
-    " with given name is added to changeset dictionary
-    return cs[a:propname]
-endfunction
+let s:hg.getcsprop=s:_r.utils.getcsprop
 "▶1 hg.getcs :: repo, rev → cs
 "▶2 getcs
 if s:usepythondriver "▶3
         return cs
     endif
 endfunction
-"▶1 diffopts :: opts → diffopts
+"▶1 hg.diff :: repo, rev1, rev2, [path], opts → diff::[String]
+"▶2 s:diffopts
 let s:diffopts={
             \      'git': 'git',
             \  'reverse': 'reverse',
             \ 'showfunc': 'show_function',
             \  'alltext': 'text',
         \}
-function s:F.diffopts(opts, defaultdiffopts)
-    let opts=extend(copy(a:defaultdiffopts), a:opts)
-    let r={}
-    call map(filter(copy(s:diffopts), 'has_key(opts, v:key)'),
-            \'extend(r, {v:val : opts[v:key]})')
-    if has_key(opts, 'dates')
-        let r.nodates=!opts.dates
-    endif
-    return r
-endfunction
-"▶1 hg.diff :: repo, rev1, rev2, [path], opts → diff::[String]
 if s:usepythondriver "▶2
 function s:hg.diff(repo, rev1, rev2, files, opts)
     let r=[]
-    let opts=s:F.diffopts(a:opts, a:repo.diffopts)
+    let opts=s:_r.utils.diffopts(a:opts, a:repo.diffopts, s:diffopts)
     try
         execute s:_r.py.cmd 'aurum.diff(vim.eval("a:repo.path"), '.
                     \                  'vim.eval("a:rev1"), '.
 else "▶2
 "▶3 getdiffcmd
 function s:F.getdiffcmd(repo, rev1, rev2, files, opts)
-    let opts=s:F.diffopts(a:opts, a:repo.diffopts)
+    let opts=s:_r.utils.diffopts(a:opts, a:repo.diffopts, s:diffopts)
     let rev1=((empty(a:rev1))?(0):(shellescape(a:rev1, 1)))
     let rev2=((empty(a:rev2))?(0):(shellescape(a:rev2, 1)))
     let cmd='diff '
         if o is# 'unified'
             let cmd.='--'.o.' '.v.' '
         elseif v
-            let cmd.='--'.substitute(o, '_', '-', 'g').' '
+            let cmd.='--'.tr(o, '_', '-').' '
         endif
     endfor
     let cmd.='-- '.join(map(copy(a:files), 'shellescape(v:val, 1)'))
         execute 'buffer' a:buf
     endif
     try
-        let opts=s:F.diffopts(a:opts, a:repo.diffopts)
+        let opts=s:_r.utils.diffopts(a:opts, a:repo.diffopts, s:diffopts)
         execute s:_r.py.cmd 'aurum.diffToBuffer(vim.eval("a:repo.path"), '.
                     \                          'vim.eval("a:rev1"), '.
                     \                          'vim.eval("a:rev2"), '.
     return r
 endfunction
 else "▶2
-let s:hgstatchars={
+let s:statchars={
             \'M': 'modified',
             \'A': 'added',
             \'R': 'removed',
             \'C': 'clean',
         \}
 let s:initstatdct={}
-call map(values(s:hgstatchars), 'extend(s:initstatdct, {v:val : []})')
+call map(values(s:statchars), 'extend(s:initstatdct, {v:val : []})')
 " TODO test whether zero revision may cause bugs in some commands
 function s:hg.status(repo, ...)
     let cmd='status -marduic'
         endif
     endif
     let slines=s:F.hg(a:repo, cmd, 0, 'stat')[:-2]
-    if !empty(filter(copy(slines), '!has_key(s:hgstatchars, v:val[0])'))
+    if !empty(filter(copy(slines), '!has_key(s:statchars, v:val[0])'))
         call s:_f.throw('statfail', a:repo.path, join(slines, "\n"))
     endif
     let r=deepcopy(s:initstatdct)
-    call map(copy(slines), 'add(r[s:hgstatchars[v:val[0]]], '.
-                \              's:F.refile(v:val[2:]))')
-    if a:0>2 && !empty(a:3)
-        call map(r, 'map(v:val, "a:repo.functions.reltorepo(a:repo, v:val)")')
-    endif
+    call map(copy(slines),'add(r[s:statchars[v:val[0]]],s:F.refile(v:val[2:]))')
     if reverse
         let [r.deleted, r.unknown]=[r.unknown, r.deleted]
         let [r.added,   r.removed]=[r.removed, r.added  ]
 if s:usepythondriver "▶2
 function s:hg.commit(repo, message, ...)
     let args  =  'text=vim.eval("a:message"), '.
-                \'force='.((get(a:000, 3, 0))?('True'):('False')).', '.
                 \join(map(['files', 'user', 'date', 'close_branch'],
                 \         'v:val."=".(empty(a:000[v:key])?'.
                 \                       '"None":'.
 " XXX Here all args must be paths unless attr is listed in nopathattrs
 let s:nopathattrs=['branch', 'tag', 'bookmark']
 function s:F.runcmd(repo, attr, args, kwargs, ...)
-    let cmd=a:attr
-    if !empty(a:kwargs)
-        let cmd.=' '.join(map(filter(items(a:kwargs), 'v:val[1] isnot 0'),
-                \             '((v:val[1] is 1)?'.
-                \               '("--".v:val[0]):'.
-                \               '("--".v:val[0]." ".shellescape(v:val[1],1)))'))
+    let e=(a:0 && a:1)
+    let args=copy(a:args)
+    if !empty(args)
+        call insert(args, '--')
     endif
-    if !empty(a:args)
-        if index(s:nopathattrs, a:attr)==-1
-            let expr='shellescape(s:_r.os.path.join(a:repo.path, v:val), 1)'
-        else
-            let expr='shellescape(v:val, 1)'
-        endif
-        let cmd.=' -- '.join(map(copy(a:args), expr))
-    endif
-    let prevempty=0
-    for line in s:F.hg(a:repo, cmd, a:0 && a:1, 'cmd', cmd)[:-2+(a:0 && a:1)]
-        if empty(line)
-            let prevempty+=1
-        else
-            if prevempty
-                while prevempty
-                    echomsg ' '
-                    let prevempty-=1
-                endwhile
-            endif
-            echomsg line
-        endif
-    endfor
+    let cmd=s:_r.utils.getcmd(a:attr, args, a:kwargs, e)
+    return s:_r.utils.printm(s:F.hg(a:repo, cmd, e, 'cmd', cmd)[:-2+e])
 endfunction
 endif
 "▶1 hg.move :: repo, force, source, target → + FS
         endif
         let [file, rev, lnum, text]=match[1:4]
         if a:wdfiles && s:F.checknotmodifiedsince(a:repo, rev, file, cnmscache)
-            let filename=s:_r.os.path.normpath(s:_r.os.path.join(a:repo.path, file))
+            let filename=s:_r.os.path.normpath(s:_r.os.path.join(a:repo.path,
+                        \                      file))
         else
             let filename=[rev, file]
         endif

plugin/aurum/edit.vim

 "▶1
 scriptencoding utf-8
 if !exists('s:_pluginloaded')
-    execute frawor#Setup('0.0', {'@/autocommands': '0.0',
+    execute frawor#Setup('1.0', {'@/autocommands': '0.0',
                 \                   '@/functions': '0.0',
                 \                   '@/resources': '0.0',
-                \                   '@aurum/repo': '1.0',
+                \                   '@aurum/repo': '1.2',
                 \                '@aurum/bufvars': '0.0',}, 0)
     call FraworLoad('@/autocommands')
     call FraworLoad('@/functions')
     endfor
     return r
 endfunction
-"▶1 setlines :: [String], read::Bool → + buffer
-function s:F.setlines(lines, read)
-    let d={'set': function((a:read)?('append'):('setline'))}
-    if len(a:lines)>1 && empty(a:lines[-1])
-        call d.set('.', a:lines[:-2])
-    else
-        if !a:read
-            setlocal binary noendofline
-        endif
-        call d.set('.', a:lines)
-    endif
-endfunction
 "▶1 copy
 function s:F.copy(read, file)
-    call s:F.setlines(readfile(a:file, 'b'), a:read)
+    call s:_r.setlines(readfile(a:file, 'b'), a:read)
     if !a:read
         let s:_r.bufvars[bufnr('%')]={'file': a:file, 'command': 'copy'}
     endif
 "▶1 Register resources
 call s:_f.postresource('run',       s:F.run)
 call s:_f.postresource('fname',     s:F.fname)
-call s:_f.postresource('setlines',  s:F.setlines)
 call s:_f.postresource('globtopat', s:F.globtopat)
 "▶1
 call frawor#Lockvar(s:, '_pluginloaded,_r,commands')

plugin/aurum/file.vim

     execute frawor#Setup('0.0', {'@aurum/cmdutils': '0.0',
                 \                 '@aurum/bufvars': '0.0',
                 \                 '@aurum/vimdiff': '0.0',
-                \                    '@aurum/repo': '1.0',
-                \                    '@aurum/edit': '0.0',
+                \                    '@aurum/repo': '1.2',
+                \                    '@aurum/edit': '1.0',
                 \                           '@/os': '0.0',
                 \                          '@/fwc': '0.0',
                 \                     '@/mappings': '0.0',
 endif
 "▶1 filefunc
 function s:filefunc.function(rev, file, opts)
-    let opts=extend(copy(a:opts), {'rev': a:rev})
-    if a:file isnot 0
-        if a:file isnot# ':'
-            let opts.file=a:file
-        endif
+    let opts=copy(a:opts)
+    if a:rev isnot 0 && a:rev isnot ':'
+        let opts.rev=a:rev
+    endif
+    if a:file isnot 0 && a:file isnot# ':'
+        let opts.file=a:file
     endif
     let [hasbuf, repo, rev, file]=s:_r.cmdutils.getrrf(opts, 'noffile', 0)
     if repo is 0
         return
     endif
-    let rev=repo.functions.getrevhex(repo, a:rev)
+    if rev is 0
+        let rev=repo.functions.getworkhex(repo)
+    else
+        let rev=repo.functions.getrevhex(repo, a:rev)
+    endif
     if get(a:opts, 'replace', 0)
         call s:_r.setlines(repo.functions.readfile(repo, rev, file), 0)
         return
     call s:_f.mapgroup.map('AuFile', bufnr('%'))
 endfunction
 let s:filefunc['@FWC']=['-onlystrings '.
-            \           '[:"."    type "" '.
+            \           '[:=(0)   type "" '.
             \           '[:=(0)   either (match /\L/, path fr)]]'.
             \           '{  repo '.s:_r.cmdutils.nogetrepoarg.
             \           ' !?replace'.

plugin/aurum/log.vim

     execute frawor#Setup('0.0', {'@/table': '0.1',
                 \        '@aurum/cmdutils': '0.0',
                 \         '@aurum/bufvars': '0.0',
-                \            '@aurum/edit': '0.0',
+                \            '@aurum/edit': '1.0',
                 \                  '@/fwc': '0.3',
-                \            '@aurum/repo': '1.0',
+                \            '@aurum/repo': '1.2',
                 \             '@/commands': '0.0',
                 \            '@/functions': '0.0',
                 \              '@/options': '0.0',}, 0)

plugin/aurum/record.vim

                 \                   '@/functions': '0.0',
                 \                 '@aurum/commit': '0.0',
                 \               '@aurum/cmdutils': '0.0',
-                \                   '@aurum/repo': '1.0',
-                \                   '@aurum/edit': '0.0',
+                \                   '@aurum/repo': '1.2',
+                \                   '@aurum/edit': '1.0',
                 \                     '@/options': '0.0',}, 0)
     call FraworLoad('@/commands')
     call FraworLoad('@/functions')

plugin/aurum/repo.vim

 "▶1
 scriptencoding utf-8
 if !exists('s:_pluginloaded')
-    execute frawor#Setup('1.1', {'@/resources': '0.0',
+    execute frawor#Setup('1.2', {'@/resources': '0.0',
                 \                       '@/os': '0.0',
                 \                  '@/options': '0.0',
                 \             '@aurum/bufvars': '0.0',}, 0)
             \         'callable function references',
         \}, '"Error while registering driver %s for plugin %s: ".v:val'))
 let s:deffuncs={}
+"▶1 setlines :: [String], read::Bool → + buffer
+function s:F.setlines(lines, read)
+    let d={'set': function((a:read)?('append'):('setline'))}
+    if len(a:lines)>1 && empty(a:lines[-1])
+        call d.set('.', a:lines[:-2])
+    else
+        if !a:read
+            setlocal binary noendofline
+        endif
+        call d.set('.', a:lines)
+    endif
+endfunction
 "▶1 dirty :: repo, file → Bool
 function s:deffuncs.dirty(repo, file)
     let status=a:repo.functions.status(a:repo, 0, 0, [a:file])
             \                'update': s:F.update,
             \           'diffoptslst': s:diffoptslst,
             \           'diffoptsstr': s:diffoptsstr,})
+call s:_f.postresource('setlines', s:F.setlines)
 "▶1 regdriver feature
 let s:requiredfuncs=['repo', 'getcs', 'checkdir']
 let s:optfuncs=['readfile', 'annotate', 'diff', 'status', 'commit', 'update',

plugin/aurum/status.vim

                 \            '@aurum/cmdutils': '0.0',
                 \                      '@/fwc': '0.2',
                 \                '@aurum/repo': '1.0',
-                \                '@aurum/edit': '0.0',
+                \                '@aurum/edit': '1.0',
                 \                 '@/commands': '0.0',
                 \                  '@/options': '0.0',
                 \                '@/functions': '0.0',}, 0)

plugin/aurum/vimdiff.vim

 if !exists('s:_pluginloaded')
     execute frawor#Setup('0.0', {'@/os': '0.0',
                 \     '@aurum/cmdutils': '0.0',
-                \         '@aurum/edit': '0.0',
+                \         '@aurum/edit': '1.0',
                 \               '@/fwc': '0.0',
                 \          '@/mappings': '0.0',
                 \         '@/resources': '0.0',
     except AurumError:
         pass
 
-def commit(path, text, force=False, user=None, date=None, files=None, close_branch=False):
+def commit(path, text, user=None, date=None, files=None, close_branch=False):
     try:
         repo=g_repo(path)
         if not hasattr(repo, 'commit'):
             kwargs['date']=date
         if user:
             kwargs['user']=user
-        if force:
-            kwargs['force']=True
         run_in_dir(repo.root, commands.commit, *args, **kwargs)
     except AurumError:
         pass
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.