public
Fork of sr/git-wiki
Description: A wiki engine that uses a Git repository as its data store.
Homepage: http://atonie.org/2008/02/git-wiki
Clone URL: git://github.com/al3x/git-wiki.git
anotherjesse (author)
Sun Feb 24 04:58:07 -0800 2008
commit  7968f8ac13f7204cc57bfda94db080f7e1dde71a
tree    d97b913abaa2d5f2b0ee0dd0b39061f5d4ac0d62
parent  95f6d9ce83ba0cc6eaf570154eb1c02c1735d1d9
git-wiki / page.rb
100644 66 lines (53 sloc) 1.389 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
65
66
class Page
  attr_reader :name
 
  def initialize(name, rev=nil)
    @name = name
    @rev = rev
    @filename = File.join(GIT_REPO, @name)
  end
 
  def body
    @body ||= RubyPants.new(RedCloth.new(raw_body).to_html).to_html.wiki_linked
  end
 
  def updated_at
    commit.committed_date
  end
 
  def raw_body
    if @rev
       @raw_body ||= blob.data
    else
      @raw_body ||= File.exists?(@filename) ? File.read(@filename) : ''
    end
  end
 
  def body=(content)
    File.open(@filename, 'w') { |f| f << content }
    message = tracked? ? "edited #{@name}" : "created #{@name}"
    `cd #{GIT_REPO} && git add #{@name} && git commit -m "#{message}"`
  end
 
  def tracked?
    return false if $repo.commits.empty?
    $repo.commits.first.tree.contents.map { |b| b.name }.include?(@name)
  end
 
  def history
    return nil unless tracked?
    @history ||= $repo.log('master', @name)
  end
 
  def delta(rev)
    $repo.diff(previous_commit, rev, @name)
  end
 
  def previous_commit
    @previous_commit ||= $repo.log(@rev || 'master', @name, {"max-count" => 2})[1]
  end
 
  def next_commit
    # TODO implement
  end
 
  def version(rev)
    data = blob.data
    RubyPants.new(RedCloth.new(data).to_html).to_html.wiki_linked
  end
 
  def commit
    @commit ||= $repo.log(@rev || 'master', @name, {"max-count" => 1}).first
  end
 
  def blob
    @blob ||= ($repo.tree(@rev)/@name)
  end
end