mirror of
https://github.com/atom/atom.git
synced 2026-02-05 20:25:04 -05:00
By default this will occur when the window gains focus and the Git class can now be subscribed to so listeners can become notified when the status of a repository changes.
115 lines
3.0 KiB
CoffeeScript
115 lines
3.0 KiB
CoffeeScript
_ = require 'underscore'
|
|
fs = require 'fs'
|
|
Subscriber = require 'subscriber'
|
|
EventEmitter = require 'event-emitter'
|
|
GitRepository = require 'git-repository'
|
|
RepositoryStatusTask = require 'repository-status-task'
|
|
|
|
module.exports =
|
|
class Git
|
|
@open: (path, options) ->
|
|
try
|
|
new Git(path, options)
|
|
catch e
|
|
null
|
|
|
|
statusFlags:
|
|
index_new: 1 << 0
|
|
index_modified: 1 << 1
|
|
index_deleted: 1 << 2
|
|
index_renamed: 1 << 3
|
|
index_typechange: 1 << 4
|
|
working_dir_new: 1 << 7
|
|
working_dir_modified: 1 << 8
|
|
working_dir_delete: 1 << 9
|
|
working_dir_typechange: 1 << 10
|
|
ignore: 1 << 14
|
|
|
|
statuses: {}
|
|
|
|
constructor: (path, options={}) ->
|
|
@repo = GitRepository.open(path)
|
|
refreshOnWindowFocus = options.refreshOnWindowFocus ? true
|
|
if refreshOnWindowFocus
|
|
$ = require 'jquery'
|
|
@subscribe $(window), 'focus', =>
|
|
@refreshIndex()
|
|
@refreshStatuses()
|
|
|
|
getRepo: ->
|
|
unless @repo?
|
|
throw new Error("Repository has been destroyed")
|
|
@repo
|
|
|
|
refreshIndex: -> @getRepo().refreshIndex()
|
|
|
|
getPath: ->
|
|
@path ?= fs.absolute(@getRepo().getPath())
|
|
|
|
destroy: ->
|
|
@getRepo().destroy()
|
|
@repo = null
|
|
@unsubscribe()
|
|
|
|
getWorkingDirectory: ->
|
|
@getPath()?.replace(/\/\.git\/?/, '')
|
|
|
|
getHead: ->
|
|
@getRepo().getHead() ? ''
|
|
|
|
getPathStatus: (path) ->
|
|
pathStatus = @getRepo().getStatus(@relativize(path))
|
|
|
|
isPathIgnored: (path) ->
|
|
@getRepo().isIgnored(@relativize(path))
|
|
|
|
isStatusModified: (status) ->
|
|
modifiedFlags = @statusFlags.working_dir_modified |
|
|
@statusFlags.working_dir_delete |
|
|
@statusFlags.working_dir_typechange |
|
|
@statusFlags.index_modified |
|
|
@statusFlags.index_deleted |
|
|
@statusFlags.index_typechange
|
|
(status & modifiedFlags) > 0
|
|
|
|
isPathModified: (path) ->
|
|
@isStatusModified(@getPathStatus(path))
|
|
|
|
isStatusNew: (status) ->
|
|
newFlags = @statusFlags.working_dir_new |
|
|
@statusFlags.index_new
|
|
(status & newFlags) > 0
|
|
|
|
isPathNew: (path) ->
|
|
@isStatusNew(@getPathStatus(path))
|
|
|
|
relativize: (path) ->
|
|
workingDirectory = @getWorkingDirectory()
|
|
if workingDirectory and path.indexOf("#{workingDirectory}/") is 0
|
|
path.substring(workingDirectory.length + 1)
|
|
else
|
|
path
|
|
|
|
getShortHead: ->
|
|
head = @getHead()
|
|
return head.substring(11) if head.indexOf('refs/heads/') is 0
|
|
return head.substring(10) if head.indexOf('refs/tags/') is 0
|
|
return head.substring(13) if head.indexOf('refs/remotes/') is 0
|
|
return head.substring(0, 7) if head.match(/[a-fA-F0-9]{40}/)
|
|
return head
|
|
|
|
checkoutHead: (path) ->
|
|
@getRepo().checkoutHead(@relativize(path))
|
|
|
|
getDiffStats: (path) ->
|
|
@getRepo().getDiffStats(@relativize(path)) ? added: 0, deleted: 0
|
|
|
|
isSubmodule: (path) ->
|
|
@getRepo().isSubmodule(@relativize(path))
|
|
|
|
refreshStatuses: ->
|
|
new RepositoryStatusTask(this).start()
|
|
|
|
_.extend Git.prototype, Subscriber
|
|
_.extend Git.prototype, EventEmitter
|