gitdocs 0.4.7 → 0.4.8

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,32 +1,42 @@
1
- 0.4.1 (12/13/2012)
1
+ 0.4.8 (12/29/2011)
2
2
 
3
- * Adds a basic search to web front-end
4
- * Beginning of the work towards cross-platform notifications
3
+ * Only encode to utf-8 on ruby 1.9.x
4
+ * Fixes so that settings form on the web front-end saves
5
+ * Cleanup the front-end directory listing significantly
6
+ * More robust EM reactor loop handling
5
7
 
6
- 0.4.2 (12/13/2012)
8
+ 0.4.7 (12/15/2011)
7
9
 
8
- * Fixes search on blank results case
10
+ * Re-throw exceptions from reactor loop
11
+ * Socket testing moved to defer block
9
12
 
10
- 0.4.3 (12/13/2012)
13
+ 0.4.5, 0.4.6 (12/14/2011)
11
14
 
12
- * Javascript fixes for front-end
15
+ * Enables logs in ~/.gitdocs/log for easier debugging
16
+ * Fix issue with default sort order on web interface
17
+ * Fixes major mime type detection issues
18
+ * Fixes rendering issues
13
19
 
14
- 0.4.4 (12/14/2012)
20
+ 0.4.4 (12/14/2011)
15
21
 
16
22
  * Lock to eventmachine 1.0
17
23
  * Use mime-types over file for better platform support
18
24
  * Remove signal handling and just leverage EM start/stop
19
25
  * Adds table sorting and file+folder icons in web front-end
20
26
 
21
- 0.4.5, 0.4.6 (12/14/2012)
27
+ 0.4.3 (12/13/2011)
28
+
29
+ * Javascript fixes for front-end
30
+
31
+ 0.4.2 (12/13/2011)
32
+
33
+ * Fixes search on blank results case
34
+
35
+ 0.4.1 (12/13/2011)
36
+
37
+ * Adds a basic search to web front-end
38
+ * Beginning of the work towards cross-platform notifications
39
+
22
40
 
23
- * Enables logs in ~/.gitdocs/log for easier debugging
24
- * Fix issue with default sort order on web interface
25
- * Fixes major mime type detection issues
26
- * Fixes rendering issues
27
41
 
28
- 0.4.7 (12/15/2012)
29
42
 
30
- * Re-throw exceptions from reactor loop
31
- * Socket testing moved to defer block
32
-
@@ -19,15 +19,15 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  s.add_dependency 'joshbuddy-guard', '~> 0.10.0'
22
- s.add_dependency 'thin'
22
+ s.add_dependency 'thin', '~> 1.3.1'
23
23
  s.add_dependency 'renee', '~> 0.3.7'
24
24
  s.add_dependency 'redcarpet', '~> 2.0.0'
25
- s.add_dependency 'thor'
26
- s.add_dependency 'coderay'
25
+ s.add_dependency 'thor', '~> 0.14.6'
26
+ s.add_dependency 'coderay', '~> 1.0.4'
27
27
  s.add_dependency 'dante', '~> 0.1.2'
28
28
  s.add_dependency 'growl', '~> 1.0.3'
29
- s.add_dependency 'yajl-ruby'
30
- s.add_dependency 'haml'
29
+ s.add_dependency 'yajl-ruby', '~> 1.1.0'
30
+ s.add_dependency 'haml', '~> 3.1.4'
31
31
  s.add_dependency 'sqlite3', "~> 1.3.4"
32
32
  s.add_dependency 'activerecord', "~> 3.1.0"
33
33
  s.add_dependency 'grit', "~> 2.4.1"
@@ -1,6 +1,7 @@
1
1
  module Gitdocs
2
2
  class Docfile
3
- attr_reader :parent, :path, :name, :author, :modified
3
+ attr_accessor :parent
4
+ attr_reader :path, :name
4
5
 
5
6
  def initialize(path)
6
7
  @path = path
@@ -15,31 +16,8 @@ module Gitdocs
15
16
  File.expand_path(@path, root).include?(expanded_root)
16
17
  end
17
18
 
18
- def file?
19
- true
20
- end
21
- end
22
-
23
- class Docdir < Docfile
24
- attr_accessor :subdirs
25
- attr_accessor :files
26
-
27
- def initialize(path)
28
- super
29
- @subdirs = []
30
- @files = []
31
- end
32
-
33
- def items
34
- (subdirs + files).sort { |a,b| a.name.downcase <=> b.name.downcase }
35
- end
36
-
37
- def parent=(dir)
38
- dir.subdirs.push(self) if dir
39
- end
40
-
41
- def file?
42
- false
19
+ def dir?
20
+ File.directory?(@path)
43
21
  end
44
22
  end
45
23
  end
@@ -29,30 +29,40 @@ module Gitdocs
29
29
  self.log "Shares: #{config.shares.map(&:inspect).join(", ")}"
30
30
  # Start the repo watchers
31
31
  runners = nil
32
- EM.run do
33
- self.log "Starting EM loop..."
34
- @runners = config.shares.map { |share| Runner.new(share) }
35
- @runners.each(&:run)
36
- # Start the web front-end
37
- if self.config.global.start_web_frontend
38
- Server.new(self, *@runners).start
39
- EM.defer( proc {
40
- i = 0
41
- web_started = false
42
- begin
43
- TCPSocket.open('127.0.0.1', 8888).close
44
- web_started = true
45
- rescue Errno::ECONNREFUSED
46
- self.log "Retrying server loop..."
47
- sleep 0.2
48
- i += 1
49
- retry if i <= 20
50
- end
51
- system("open http://localhost:8888/") if self.config.global.load_browser_on_startup && web_started
52
- }, proc {
53
- self.log "Web server running!"
54
- })
32
+ retrying = false
33
+ begin
34
+ EM.run do
35
+ self.log "Starting EM loop..."
36
+ @runners = config.shares.map { |share|
37
+ self.log "Starting #{share}"
38
+ Runner.new(share)
39
+ }
40
+ self.log "Running runners... #{@runners.size}"
41
+ @runners.each(&:run)
42
+ # Start the web front-end
43
+ if self.config.global.start_web_frontend
44
+ Server.new(self, *@runners).start
45
+ EM.defer( proc {
46
+ i = 0
47
+ web_started = false
48
+ begin
49
+ TCPSocket.open('127.0.0.1', 8888).close
50
+ web_started = true
51
+ rescue Errno::ECONNREFUSED
52
+ self.log "Retrying server loop..."
53
+ sleep 0.2
54
+ i += 1
55
+ retry if i <= 20
56
+ end
57
+ system("open http://localhost:8888/") if !retrying && self.config.global.load_browser_on_startup && web_started
58
+ }, proc {
59
+ self.log "Web server running!"
60
+ })
61
+ end
55
62
  end
63
+ rescue Restart
64
+ retrying = true
65
+ retry
56
66
  end
57
67
  rescue Exception => e # Report all errors in log
58
68
  self.log(e.class.inspect + " - " + e.inspect + " - " + e.message.inspect, :error)
@@ -63,8 +73,11 @@ module Gitdocs
63
73
  end
64
74
 
65
75
  def restart
66
- stop
67
- start
76
+ Thread.new do
77
+ Thread.main.raise Restart, "restarting ... "
78
+ sleep 0.1 while EM.reactor_running?
79
+ start
80
+ end
68
81
  end
69
82
 
70
83
  def stop
@@ -33,6 +33,25 @@ GitDocs = {
33
33
  // Enable table sorter
34
34
  var extractor = function(e) { return $(e).data('val') || $(e).text() }
35
35
  $("table#fileListing").tablesorter({ textExtraction : extractor, sortList: [[0,0]] });
36
+ },
37
+ // To make the settings form ajax-y
38
+ observeSettingsForm : function() {
39
+ $('#settings').submit(function(e) {
40
+ e.preventDefault();
41
+ $.ajax({
42
+ type: 'POST',
43
+ url: this.action,
44
+ data: $(this).serialize(),
45
+ success: function() {
46
+ $('.content div.alert-message').remove();
47
+ var el = $('.content').prepend('<div class="alert-message success"><a class="close" href="#">×</a>' +
48
+ '<p><strong>Settings saved!</strong> Gitdocs has been restarted with your new settings.</p>' +
49
+ '</div>');
50
+ $('div.alert-message').alert();
51
+ }
52
+ });
53
+ return false;
54
+ });
36
55
  }
37
56
  };
38
57
 
@@ -40,6 +59,7 @@ $(document).ready(function() {
40
59
  GitDocs.linkBreadcrumbs();
41
60
  GitDocs.fillDirMeta();
42
61
  StringFormatter.autoLink();
62
+ GitDocs.observeSettingsForm();
43
63
  });
44
64
 
45
65
  // Redirect to edit page for new file when new file form is submitted
@@ -51,3 +71,17 @@ $('form.add').live('submit', function(e){
51
71
  window.location = newPath;
52
72
  e.preventDefault(); return false;
53
73
  });
74
+
75
+ // Link method redirection
76
+ $('a[data-method]').live('click', function(e) {
77
+ e.preventDefault();
78
+ var link = $(this);
79
+ var href = link.attr('href'),
80
+ method = link.data('method'),
81
+ target = link.attr('target'),
82
+ form = $('<form method="post" action="' + href + '"></form>'),
83
+ metadata_input = '<input name="_method" value="' + method + '" type="hidden" />';
84
+ if (target) { form.attr('target', target); }
85
+ form.hide().append(metadata_input).appendTo('body');
86
+ form.submit();
87
+ });
@@ -0,0 +1,113 @@
1
+ /* ==========================================================
2
+ * bootstrap-alerts.js v1.4.0
3
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
4
+ * ==========================================================
5
+ * Copyright 2011 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================== */
19
+
20
+
21
+ !function( $ ){
22
+
23
+ "use strict"
24
+
25
+ /* CSS TRANSITION SUPPORT (https://gist.github.com/373874)
26
+ * ======================================================= */
27
+
28
+ var transitionEnd
29
+
30
+ $(document).ready(function () {
31
+
32
+ $.support.transition = (function () {
33
+ var thisBody = document.body || document.documentElement
34
+ , thisStyle = thisBody.style
35
+ , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined
36
+ return support
37
+ })()
38
+
39
+ // set CSS transition event type
40
+ if ( $.support.transition ) {
41
+ transitionEnd = "TransitionEnd"
42
+ if ( $.browser.webkit ) {
43
+ transitionEnd = "webkitTransitionEnd"
44
+ } else if ( $.browser.mozilla ) {
45
+ transitionEnd = "transitionend"
46
+ } else if ( $.browser.opera ) {
47
+ transitionEnd = "oTransitionEnd"
48
+ }
49
+ }
50
+
51
+ })
52
+
53
+ /* ALERT CLASS DEFINITION
54
+ * ====================== */
55
+
56
+ var Alert = function ( content, options ) {
57
+ this.settings = $.extend({}, $.fn.alert.defaults, options)
58
+ this.$element = $(content)
59
+ .delegate(this.settings.selector, 'click', this.close)
60
+ }
61
+
62
+ Alert.prototype = {
63
+
64
+ close: function (e) {
65
+ var $element = $(this).parent('.alert-message')
66
+
67
+ e && e.preventDefault()
68
+ $element.removeClass('in')
69
+
70
+ function removeElement () {
71
+ $element.remove()
72
+ }
73
+
74
+ $.support.transition && $element.hasClass('fade') ?
75
+ $element.bind(transitionEnd, removeElement) :
76
+ removeElement()
77
+ }
78
+
79
+ }
80
+
81
+
82
+ /* ALERT PLUGIN DEFINITION
83
+ * ======================= */
84
+
85
+ $.fn.alert = function ( options ) {
86
+
87
+ if ( options === true ) {
88
+ return this.data('alert')
89
+ }
90
+
91
+ return this.each(function () {
92
+ var $this = $(this)
93
+
94
+ if ( typeof options == 'string' ) {
95
+ return $this.data('alert')[options]()
96
+ }
97
+
98
+ $(this).data('alert', new Alert( this, options ))
99
+
100
+ })
101
+ }
102
+
103
+ $.fn.alert.defaults = {
104
+ selector: '.close'
105
+ }
106
+
107
+ $(document).ready(function () {
108
+ new Alert($('body'), {
109
+ selector: '.alert-message[data-alert] .close'
110
+ })
111
+ })
112
+
113
+ }( window.jQuery || window.ender );
@@ -1,7 +1,7 @@
1
1
  GitDocs.search = {
2
2
  highlight : function(query) {
3
3
  $('.results dl dd').each(function(idx, el) {
4
- var result = $(el).text().replace(query, "<strong>" + query + "</strong>");
4
+ var result = $(el).text().replace(new RegExp(query, 'ig'), function($0) { return"<strong>" + $0 + "</strong>"; });
5
5
  $(el).html(result);
6
6
  });
7
7
  }
@@ -17,6 +17,7 @@ require 'redcarpet'
17
17
  # Markdown.
18
18
  class RedcarpetCompat
19
19
  def to_html(*_dummy)
20
- @markdown.render(@text.encode('utf-8'))
20
+ @text = @text.encode('utf-8') if @text.respond_to?(:encode)
21
+ @markdown.render(@text)
21
22
  end
22
23
  end
@@ -6,7 +6,7 @@ module Gitdocs
6
6
 
7
7
  def initialize(share)
8
8
  @share = share
9
- @root = share.path
9
+ @root = share.path.sub(%r{/+$},'') if share.path
10
10
  @polling_interval = share.polling_interval
11
11
  @icon = File.expand_path("../../img/icon.png", __FILE__)
12
12
  end
@@ -14,14 +14,14 @@ module Gitdocs
14
14
  SearchResult = Struct.new(:file, :context)
15
15
  def search(term)
16
16
  results = []
17
- if result_test = sh_string("git grep #{ShellTools.escape(term)}")
17
+ if result_test = sh_string("git grep -i #{ShellTools.escape(term)}")
18
18
  result_test.scan(/(.*?):([^\n]*)/) { |(file, context)| results << SearchResult.new(file, context) }
19
19
  end
20
20
  results
21
21
  end
22
22
 
23
23
  def run
24
- return false unless self.valid?
24
+ return false unless self.valid? && !self.root.empty?
25
25
  @show_notifications = @share.notification
26
26
  @current_remote = @share.remote_name
27
27
  @current_branch = @share.branch_name
@@ -140,26 +140,21 @@ module Gitdocs
140
140
 
141
141
  IGNORED_FILES = ['.gitignore']
142
142
  # dir_files("some/dir") => [<Docfile>, <Docfile>]
143
- def dir_files(dir)
144
- dir_path = File.expand_path(dir, @root)
145
- files = {}
146
- ls_files = sh_string("git ls-files").split("\n").map { |f| Docfile.new(f) }
147
- ls_files.select { |f| f.within?(dir, @root) }.each do |f|
148
- path = File.expand_path(f.parent, root)
149
- files[path] ||= Docdir.new(path)
150
- files[path].files << f unless IGNORED_FILES.include?(f.name)
151
- end
152
- files.keys.each { |f| files[f].parent = files[File.dirname(f)] }
153
- files[dir_path]
143
+ def dir_files(dir_path)
144
+ Dir[File.join(dir_path, "*")].to_a.map { |path| Docfile.new(path) }
154
145
  end
155
146
 
156
147
  def file_meta(file)
148
+ result = {}
157
149
  file = file.gsub(%r{^/}, '')
158
150
  full_path = File.expand_path(file, @root)
159
- author, modified = sh_string("git log --format='%aN|%ai' -n1 #{ShellTools.escape(file)}").split("|")
151
+ log_result = sh_string("git log --format='%aN|%ai' -n1 #{ShellTools.escape(file)}")
152
+ result = {} unless File.exist?(full_path) && log_result
153
+ author, modified = log_result.split("|")
160
154
  modified = Time.parse(modified.sub(' ', 'T')).utc.iso8601
161
155
  size = (File.symlink?(full_path) || File.directory?(full_path)) ? -1 : File.size(full_path)
162
- { :author => author, :size => size, :modified => modified }
156
+ result = { :author => author, :size => size, :modified => modified }
157
+ result
163
158
  end
164
159
 
165
160
  def valid?
@@ -33,7 +33,7 @@ module Gitdocs
33
33
  end
34
34
  shares[Integer(idx)].update_attributes(share)
35
35
  end
36
- manager.restart
36
+ EM.add_timer(0.1) { manager.restart }
37
37
  redirect! '/settings'
38
38
  end
39
39
  end
@@ -42,6 +42,10 @@ module Gitdocs
42
42
  render! "search", :layout => 'app', :locals => {:conf => manager.config, :results => manager.search(request.GET['q']), :nav_state => nil}
43
43
  end
44
44
 
45
+ path('shares').post do
46
+ Configuration::Share.create
47
+ end
48
+
45
49
  var :int do |idx|
46
50
  gd = gds[idx]
47
51
  halt 404 if gd.nil?
@@ -68,7 +72,7 @@ module Gitdocs
68
72
  elsif !File.exist?(expanded_path) # edit for non-existent file
69
73
  render! "edit", :layout => 'app', :locals => locals.merge(:contents => "")
70
74
  elsif File.directory?(expanded_path) # list directory
71
- contents = gd.dir_files(expanded_path)
75
+ contents = gd.dir_files(expanded_path)
72
76
  render! "dir", :layout => 'app', :locals => locals.merge(:contents => contents)
73
77
  elsif mode == 'delete' # delete file
74
78
  FileUtils.rm(expanded_path)
@@ -1,3 +1,3 @@
1
1
  module Gitdocs
2
- VERSION = "0.4.7"
3
- end
2
+ VERSION = "0.4.8"
3
+ end
@@ -9,6 +9,7 @@
9
9
  %script{ :src => "/js/util.js", :type => "text/javascript", :charset => "utf-8" }
10
10
  %script{ :src => "/js/jquery.js", :type => "text/javascript", :charset => "utf-8" }
11
11
  %script{ :src => "/js/jquery.tablesorter.js", :type => "text/javascript", :charset => "utf-8" }
12
+ %script{ :src => "/js/bootstrap-alerts.js", :type => "text/javascript", :charset => "utf-8" }
12
13
  %script{ :src => "/js/app.js", :type => "text/javascript", :charset => "utf-8" }
13
14
  %body
14
15
  #nav.topbar
@@ -2,24 +2,28 @@
2
2
 
3
3
  = partial("header", :locals => { :parent => parent, :file => false, :idx => idx })
4
4
 
5
- %table#fileListing.condensed-table.zebra-striped
6
- %thead
7
- %tr
8
- %th File
9
- %th Author
10
- %th Last Modified
11
- %th Size
12
-
13
- %tbody
14
- - contents.items.each_with_index do |f, i|
5
+ - if contents && contents.any?
6
+ %table#fileListing.condensed-table.zebra-striped
7
+ %thead
15
8
  %tr
16
- %td
17
- %img{ :src => "/img/#{f.file? ? 'file' : 'folder'}.png", :width => 16, :height => 16 }
18
- %a{ :href => "/#{idx}#{request.path_info}/#{f.name}" }
19
- = f.name
20
- %td.author
21
- %td.modified
22
- %td.size
9
+ %th File
10
+ %th Author
11
+ %th Last Modified
12
+ %th Size
13
+
14
+ %tbody
15
+ - contents.each_with_index do |f, i|
16
+ %tr
17
+ %td
18
+ %img{ :src => "/img/#{f.dir? ? 'folder' : 'file'}.png", :width => 16, :height => 16 }
19
+ %a{ :href => "/#{idx}#{request.path_info}/#{f.name}" }
20
+ = f.name
21
+ %td.author
22
+ %td.modified
23
+ %td.size
24
+
25
+ - if contents.empty?
26
+ %p No files were found in this directory.
23
27
 
24
28
  .row
25
29
  .span6
@@ -1,6 +1,6 @@
1
1
  - @title = "Settings"
2
2
 
3
- %form{:method => 'POST', :action => '/settings'}
3
+ %form#settings{:method => 'POST', :action => '/settings'}
4
4
  %h2 Gitdocs
5
5
  #config.field.config
6
6
  %input{:type =>'hidden', :value => '0', :name=>"config[load_browser_on_startup]"}
@@ -41,8 +41,9 @@
41
41
  %input{:type =>'hidden', :value => '0', :name=>"share[#{idx}][notification]"}
42
42
  %input{:type =>'checkbox', :value => '1', :name=>"share[#{idx}][notification]", :checked => share.notification ? 'checked' : nil}
43
43
  %span Notifications?
44
- .delete
44
+ .delete{ :style => "display: none;" }
45
45
  %input{:type =>'button', :value => "Delete", :class => "btn danger"}
46
46
  %input{:type =>'hidden', :name=>"share[#{idx}][delete]"}
47
47
 
48
- %input{:value => 'Save', :type => 'submit', :class => "btn primary" }
48
+ %input{:value => 'Save', :type => 'submit', :class => "btn primary" }
49
+ %a{ :class => "btn secondary new-share", :href => "/shares", :"data-method" => "post" } Add Share
metadata CHANGED
@@ -1,246 +1,249 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: gitdocs
3
- version: !ruby/object:Gem::Version
4
- version: 0.4.7
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: 0.4.8
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Josh Hull
9
9
  - Nathan Esquenazi
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-12-15 00:00:00.000000000Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
13
+
14
+ date: 2011-12-30 00:00:00 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
16
17
  name: joshbuddy-guard
17
- requirement: &70196233094940 !ruby/object:Gem::Requirement
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
18
20
  none: false
19
- requirements:
21
+ requirements:
20
22
  - - ~>
21
- - !ruby/object:Gem::Version
23
+ - !ruby/object:Gem::Version
22
24
  version: 0.10.0
23
25
  type: :runtime
24
- prerelease: false
25
- version_requirements: *70196233094940
26
- - !ruby/object:Gem::Dependency
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
27
28
  name: thin
28
- requirement: &70196233094500 !ruby/object:Gem::Requirement
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
29
31
  none: false
30
- requirements:
31
- - - ! '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 1.3.1
34
36
  type: :runtime
35
- prerelease: false
36
- version_requirements: *70196233094500
37
- - !ruby/object:Gem::Dependency
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
38
39
  name: renee
39
- requirement: &70196233093960 !ruby/object:Gem::Requirement
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
40
42
  none: false
41
- requirements:
43
+ requirements:
42
44
  - - ~>
43
- - !ruby/object:Gem::Version
45
+ - !ruby/object:Gem::Version
44
46
  version: 0.3.7
45
47
  type: :runtime
46
- prerelease: false
47
- version_requirements: *70196233093960
48
- - !ruby/object:Gem::Dependency
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
49
50
  name: redcarpet
50
- requirement: &70196233093440 !ruby/object:Gem::Requirement
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
51
53
  none: false
52
- requirements:
54
+ requirements:
53
55
  - - ~>
54
- - !ruby/object:Gem::Version
56
+ - !ruby/object:Gem::Version
55
57
  version: 2.0.0
56
58
  type: :runtime
57
- prerelease: false
58
- version_requirements: *70196233093440
59
- - !ruby/object:Gem::Dependency
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
60
61
  name: thor
61
- requirement: &70196233092900 !ruby/object:Gem::Requirement
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
62
64
  none: false
63
- requirements:
64
- - - ! '>='
65
- - !ruby/object:Gem::Version
66
- version: '0'
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 0.14.6
67
69
  type: :runtime
68
- prerelease: false
69
- version_requirements: *70196233092900
70
- - !ruby/object:Gem::Dependency
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
71
72
  name: coderay
72
- requirement: &70196233092440 !ruby/object:Gem::Requirement
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
73
75
  none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ version: 1.0.4
78
80
  type: :runtime
79
- prerelease: false
80
- version_requirements: *70196233092440
81
- - !ruby/object:Gem::Dependency
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
82
83
  name: dante
83
- requirement: &70196233091920 !ruby/object:Gem::Requirement
84
+ prerelease: false
85
+ requirement: &id007 !ruby/object:Gem::Requirement
84
86
  none: false
85
- requirements:
87
+ requirements:
86
88
  - - ~>
87
- - !ruby/object:Gem::Version
89
+ - !ruby/object:Gem::Version
88
90
  version: 0.1.2
89
91
  type: :runtime
90
- prerelease: false
91
- version_requirements: *70196233091920
92
- - !ruby/object:Gem::Dependency
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
93
94
  name: growl
94
- requirement: &70196233091380 !ruby/object:Gem::Requirement
95
+ prerelease: false
96
+ requirement: &id008 !ruby/object:Gem::Requirement
95
97
  none: false
96
- requirements:
98
+ requirements:
97
99
  - - ~>
98
- - !ruby/object:Gem::Version
100
+ - !ruby/object:Gem::Version
99
101
  version: 1.0.3
100
102
  type: :runtime
101
- prerelease: false
102
- version_requirements: *70196233091380
103
- - !ruby/object:Gem::Dependency
103
+ version_requirements: *id008
104
+ - !ruby/object:Gem::Dependency
104
105
  name: yajl-ruby
105
- requirement: &70196233090980 !ruby/object:Gem::Requirement
106
+ prerelease: false
107
+ requirement: &id009 !ruby/object:Gem::Requirement
106
108
  none: false
107
- requirements:
108
- - - ! '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
109
+ requirements:
110
+ - - ~>
111
+ - !ruby/object:Gem::Version
112
+ version: 1.1.0
111
113
  type: :runtime
112
- prerelease: false
113
- version_requirements: *70196233090980
114
- - !ruby/object:Gem::Dependency
114
+ version_requirements: *id009
115
+ - !ruby/object:Gem::Dependency
115
116
  name: haml
116
- requirement: &70196233090520 !ruby/object:Gem::Requirement
117
+ prerelease: false
118
+ requirement: &id010 !ruby/object:Gem::Requirement
117
119
  none: false
118
- requirements:
119
- - - ! '>='
120
- - !ruby/object:Gem::Version
121
- version: '0'
120
+ requirements:
121
+ - - ~>
122
+ - !ruby/object:Gem::Version
123
+ version: 3.1.4
122
124
  type: :runtime
123
- prerelease: false
124
- version_requirements: *70196233090520
125
- - !ruby/object:Gem::Dependency
125
+ version_requirements: *id010
126
+ - !ruby/object:Gem::Dependency
126
127
  name: sqlite3
127
- requirement: &70196233090000 !ruby/object:Gem::Requirement
128
+ prerelease: false
129
+ requirement: &id011 !ruby/object:Gem::Requirement
128
130
  none: false
129
- requirements:
131
+ requirements:
130
132
  - - ~>
131
- - !ruby/object:Gem::Version
133
+ - !ruby/object:Gem::Version
132
134
  version: 1.3.4
133
135
  type: :runtime
134
- prerelease: false
135
- version_requirements: *70196233090000
136
- - !ruby/object:Gem::Dependency
136
+ version_requirements: *id011
137
+ - !ruby/object:Gem::Dependency
137
138
  name: activerecord
138
- requirement: &70196233089500 !ruby/object:Gem::Requirement
139
+ prerelease: false
140
+ requirement: &id012 !ruby/object:Gem::Requirement
139
141
  none: false
140
- requirements:
142
+ requirements:
141
143
  - - ~>
142
- - !ruby/object:Gem::Version
144
+ - !ruby/object:Gem::Version
143
145
  version: 3.1.0
144
146
  type: :runtime
145
- prerelease: false
146
- version_requirements: *70196233089500
147
- - !ruby/object:Gem::Dependency
147
+ version_requirements: *id012
148
+ - !ruby/object:Gem::Dependency
148
149
  name: grit
149
- requirement: &70196233089020 !ruby/object:Gem::Requirement
150
+ prerelease: false
151
+ requirement: &id013 !ruby/object:Gem::Requirement
150
152
  none: false
151
- requirements:
153
+ requirements:
152
154
  - - ~>
153
- - !ruby/object:Gem::Version
155
+ - !ruby/object:Gem::Version
154
156
  version: 2.4.1
155
157
  type: :runtime
156
- prerelease: false
157
- version_requirements: *70196233089020
158
- - !ruby/object:Gem::Dependency
158
+ version_requirements: *id013
159
+ - !ruby/object:Gem::Dependency
159
160
  name: shell_tools
160
- requirement: &70196233088540 !ruby/object:Gem::Requirement
161
+ prerelease: false
162
+ requirement: &id014 !ruby/object:Gem::Requirement
161
163
  none: false
162
- requirements:
164
+ requirements:
163
165
  - - ~>
164
- - !ruby/object:Gem::Version
166
+ - !ruby/object:Gem::Version
165
167
  version: 0.1.0
166
168
  type: :runtime
167
- prerelease: false
168
- version_requirements: *70196233088540
169
- - !ruby/object:Gem::Dependency
169
+ version_requirements: *id014
170
+ - !ruby/object:Gem::Dependency
170
171
  name: mimetype-fu
171
- requirement: &70196233088080 !ruby/object:Gem::Requirement
172
+ prerelease: false
173
+ requirement: &id015 !ruby/object:Gem::Requirement
172
174
  none: false
173
- requirements:
175
+ requirements:
174
176
  - - ~>
175
- - !ruby/object:Gem::Version
177
+ - !ruby/object:Gem::Version
176
178
  version: 0.1.2
177
179
  type: :runtime
178
- prerelease: false
179
- version_requirements: *70196233088080
180
- - !ruby/object:Gem::Dependency
180
+ version_requirements: *id015
181
+ - !ruby/object:Gem::Dependency
181
182
  name: eventmachine
182
- requirement: &70196233087600 !ruby/object:Gem::Requirement
183
+ prerelease: false
184
+ requirement: &id016 !ruby/object:Gem::Requirement
183
185
  none: false
184
- requirements:
185
- - - ! '>='
186
- - !ruby/object:Gem::Version
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
187
189
  version: 1.0.0.beta.3
188
190
  type: :runtime
189
- prerelease: false
190
- version_requirements: *70196233087600
191
- - !ruby/object:Gem::Dependency
191
+ version_requirements: *id016
192
+ - !ruby/object:Gem::Dependency
192
193
  name: minitest
193
- requirement: &70196233087140 !ruby/object:Gem::Requirement
194
+ prerelease: false
195
+ requirement: &id017 !ruby/object:Gem::Requirement
194
196
  none: false
195
- requirements:
197
+ requirements:
196
198
  - - ~>
197
- - !ruby/object:Gem::Version
199
+ - !ruby/object:Gem::Version
198
200
  version: 2.6.1
199
201
  type: :development
200
- prerelease: false
201
- version_requirements: *70196233087140
202
- - !ruby/object:Gem::Dependency
202
+ version_requirements: *id017
203
+ - !ruby/object:Gem::Dependency
203
204
  name: rake
204
- requirement: &70196233086740 !ruby/object:Gem::Requirement
205
+ prerelease: false
206
+ requirement: &id018 !ruby/object:Gem::Requirement
205
207
  none: false
206
- requirements:
207
- - - ! '>='
208
- - !ruby/object:Gem::Version
209
- version: '0'
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: "0"
210
212
  type: :development
211
- prerelease: false
212
- version_requirements: *70196233086740
213
- - !ruby/object:Gem::Dependency
213
+ version_requirements: *id018
214
+ - !ruby/object:Gem::Dependency
214
215
  name: mocha
215
- requirement: &70196233086280 !ruby/object:Gem::Requirement
216
+ prerelease: false
217
+ requirement: &id019 !ruby/object:Gem::Requirement
216
218
  none: false
217
- requirements:
218
- - - ! '>='
219
- - !ruby/object:Gem::Version
220
- version: '0'
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: "0"
221
223
  type: :development
222
- prerelease: false
223
- version_requirements: *70196233086280
224
- - !ruby/object:Gem::Dependency
224
+ version_requirements: *id019
225
+ - !ruby/object:Gem::Dependency
225
226
  name: fakeweb
226
- requirement: &70196233085840 !ruby/object:Gem::Requirement
227
+ prerelease: false
228
+ requirement: &id020 !ruby/object:Gem::Requirement
227
229
  none: false
228
- requirements:
229
- - - ! '>='
230
- - !ruby/object:Gem::Version
231
- version: '0'
230
+ requirements:
231
+ - - ">="
232
+ - !ruby/object:Gem::Version
233
+ version: "0"
232
234
  type: :development
233
- prerelease: false
234
- version_requirements: *70196233085840
235
+ version_requirements: *id020
235
236
  description: Open-source Dropbox using Ruby and Git.
236
- email:
237
+ email:
237
238
  - joshbuddy@gmail.com
238
239
  - nesquena@gmail.com
239
- executables:
240
+ executables:
240
241
  - gitdocs
241
242
  extensions: []
243
+
242
244
  extra_rdoc_files: []
243
- files:
245
+
246
+ files:
244
247
  - .gitignore
245
248
  - CHANGELOG
246
249
  - Gemfile
@@ -300,6 +303,7 @@ files:
300
303
  - lib/gitdocs/public/js/ace/worker-css.js
301
304
  - lib/gitdocs/public/js/ace/worker-javascript.js
302
305
  - lib/gitdocs/public/js/app.js
306
+ - lib/gitdocs/public/js/bootstrap-alerts.js
303
307
  - lib/gitdocs/public/js/edit.js
304
308
  - lib/gitdocs/public/js/jquery.js
305
309
  - lib/gitdocs/public/js/jquery.tablesorter.js
@@ -324,35 +328,32 @@ files:
324
328
  - test/test_helper.rb
325
329
  homepage: http://engineering.gomiso.com/2011/11/30/collaborate-and-track-tasks-with-ease-using-gitdocs/
326
330
  licenses: []
331
+
327
332
  post_install_message:
328
333
  rdoc_options: []
329
- require_paths:
334
+
335
+ require_paths:
330
336
  - lib
331
- required_ruby_version: !ruby/object:Gem::Requirement
337
+ required_ruby_version: !ruby/object:Gem::Requirement
332
338
  none: false
333
- requirements:
334
- - - ! '>='
335
- - !ruby/object:Gem::Version
336
- version: '0'
337
- segments:
338
- - 0
339
- hash: -356674648532103914
340
- required_rubygems_version: !ruby/object:Gem::Requirement
339
+ requirements:
340
+ - - ">="
341
+ - !ruby/object:Gem::Version
342
+ version: "0"
343
+ required_rubygems_version: !ruby/object:Gem::Requirement
341
344
  none: false
342
- requirements:
343
- - - ! '>='
344
- - !ruby/object:Gem::Version
345
- version: '0'
346
- segments:
347
- - 0
348
- hash: -356674648532103914
345
+ requirements:
346
+ - - ">="
347
+ - !ruby/object:Gem::Version
348
+ version: "0"
349
349
  requirements: []
350
+
350
351
  rubyforge_project: gitdocs
351
- rubygems_version: 1.8.10
352
+ rubygems_version: 1.8.12
352
353
  signing_key:
353
354
  specification_version: 3
354
355
  summary: Open-source Dropbox using Ruby and Git
355
- test_files:
356
+ test_files:
356
357
  - test/configuration_test.rb
357
358
  - test/runner_test.rb
358
359
  - test/test_helper.rb