Class: GitDS::Index

Inherits:
Grit::Index
  • Object
show all
Defined in:
lib/git-ds/index.rb

Overview

A Git Index.

Direct Known Subclasses

StageIndex

Instance Method Summary collapse

Instance Method Details

#add(path, data, on_fs = false) ⇒ Object



71
72
73
74
# File 'lib/git-ds/index.rb', line 71

def add(path, data, on_fs=false)
  super(path, data)
  add_fs_item(path, data) if on_fs
end

#add_dbObject

Add a DB entry at the virtual path ‘path’ with contents ‘contents’



69
# File 'lib/git-ds/index.rb', line 69

alias :add_db :add

#add_fs(path, data) ⇒ Object

Convenience function to add an on-filesystem object.



79
80
81
# File 'lib/git-ds/index.rb', line 79

def add_fs(path, data)
  add(path, data, true)
end

#delete(path) ⇒ Object

Wrapper for Grit::Index#delete that removes the file if it exists on the filesystem.



87
88
89
90
91
92
# File 'lib/git-ds/index.rb', line 87

def delete(path)
  super
  @repo.exec_in_git_dir {
    ::FileUtils.remove_entry(path) if ::File.exist?(path)
  }
end

#local_write_tree(tree, now_tree = nil) ⇒ Object

Re-implemented from Grit. Grit adds a trailing / to directory names, which makes it impossible to delete Tree objects!



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/git-ds/index.rb', line 36

def local_write_tree(tree, now_tree=nil)
  tree_contents = {}
  now_tree.contents.each do |obj|
    sha = [obj.id].pack("H*")
    k = obj.name
    tree_contents[k] = "%s %s\0%s" % [obj.mode.to_s, obj.name, sha]
  end if now_tree

  tree.each do |k, v|
    case v
      when String
        sha = write_blob(v)
        sha = [sha].pack("H*")
        str = "%s %s\0%s" % ['100644', k, sha]
        tree_contents[k] = str
      when Hash
        ctree = now_tree/k if now_tree
        sha = local_write_tree(v, ctree)
        sha = [sha].pack("H*")
        str = "%s %s\0%s" % ['40000', k, sha]
        tree_contents[k] = str
      when false
        tree_contents.delete(k)
    end
  end

  tr = tree_contents.sort.map { |k, v| v }.join('')
  self.repo.git.put_raw_object(tr, 'tree')
end

#writeObject

Write index to the object db, then read the object DB into the GIT staging index. Returns SHA of new tree.



27
28
29
30
# File 'lib/git-ds/index.rb', line 27

def write
  sha = local_write_tree(self.tree, self.current_tree)
  sha
end