gitdocs 0.4.8 → 0.4.9

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ 0.4.9 (12/29/2011)
2
+
3
+ * Adds configuration for web port in settings
4
+ * Adds support for 'add' and 'remove' shares in settings
5
+
1
6
  0.4.8 (12/29/2011)
2
7
 
3
8
  * Only encode to utf-8 on ruby 1.9.x
data/lib/gitdocs.rb CHANGED
@@ -18,10 +18,12 @@ module Gitdocs
18
18
 
19
19
  DEBUG = ENV['DEBUG']
20
20
 
21
- def self.start(config_root = nil, debug = DEBUG, &blk)
21
+ # Gitdocs.start(:config_root => "...", :debug => true)
22
+ def self.start(options={}, &blk)
23
+ options = { :debug => DEBUG, :config_root => nil }.merge(options)
22
24
  @manager.stop if @manager
23
- @manager = Manager.new(config_root, debug, &blk)
24
- @manager.start
25
+ @manager = Manager.new(options[:config_root], options[:debug], &blk)
26
+ @manager.start(options[:port])
25
27
  end
26
28
 
27
29
  def self.restart
data/lib/gitdocs/cli.rb CHANGED
@@ -8,13 +8,14 @@ module Gitdocs
8
8
 
9
9
  desc "start", "Starts a daemonized gitdocs process"
10
10
  method_option :debug, :type => :boolean, :aliases => "-D"
11
+ method_option :port, :type => :string, :aliases => "-p"
11
12
  def start
12
13
  if self.stopped? && !options[:debug]
13
- self.runner.execute { Gitdocs.start }
14
+ self.runner.execute { Gitdocs.start(:port => options[:port]) }
14
15
  self.running? ? say("Started gitdocs", :green) : say("Failed to start gitdocs", :red)
15
16
  elsif self.stopped? && options[:debug]
16
17
  say "Starting in debug mode", :yellow
17
- Gitdocs.start(nil, true)
18
+ Gitdocs.start(:debug => true, :port => options[:port])
18
19
  else # already running
19
20
  say "Gitdocs is already running, please use restart", :red
20
21
  end
@@ -35,7 +35,7 @@ module Gitdocs
35
35
  end
36
36
 
37
37
  class Config < ActiveRecord::Base
38
- attr_accessible :load_browser_on_startup, :start_web_frontend
38
+ attr_accessible :load_browser_on_startup, :start_web_frontend, :web_frontend_port
39
39
  end
40
40
 
41
41
  def add_path(path, opts = nil)
@@ -23,7 +23,7 @@ module Gitdocs
23
23
  results
24
24
  end
25
25
 
26
- def start
26
+ def start(web_port=nil)
27
27
  self.log "Starting Gitdocs v#{VERSION}..."
28
28
  self.log "Using configuration root: '#{self.config.config_root}'"
29
29
  self.log "Shares: #{config.shares.map(&:inspect).join(", ")}"
@@ -41,12 +41,13 @@ module Gitdocs
41
41
  @runners.each(&:run)
42
42
  # Start the web front-end
43
43
  if self.config.global.start_web_frontend
44
- Server.new(self, *@runners).start
44
+ web_port ||= self.config.global.web_frontend_port
45
+ Server.new(self, *@runners).start(web_port.to_i)
45
46
  EM.defer( proc {
46
47
  i = 0
47
48
  web_started = false
48
49
  begin
49
- TCPSocket.open('127.0.0.1', 8888).close
50
+ TCPSocket.open('127.0.0.1', web_port.to_i).close
50
51
  web_started = true
51
52
  rescue Errno::ECONNREFUSED
52
53
  self.log "Retrying server loop..."
@@ -54,7 +55,7 @@ module Gitdocs
54
55
  i += 1
55
56
  retry if i <= 20
56
57
  end
57
- system("open http://localhost:8888/") if !retrying && self.config.global.load_browser_on_startup && web_started
58
+ system("open http://localhost:#{web_port}/") if !retrying && self.config.global.load_browser_on_startup && web_started
58
59
  }, proc {
59
60
  self.log "Web server running!"
60
61
  })
@@ -0,0 +1,9 @@
1
+ class AddWebPortToConfig < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :configs, :web_frontend_port, :integer, :default => 8888
4
+ end
5
+
6
+ def self.down
7
+ raise
8
+ end
9
+ end
@@ -34,24 +34,14 @@ GitDocs = {
34
34
  var extractor = function(e) { return $(e).data('val') || $(e).text() }
35
35
  $("table#fileListing").tablesorter({ textExtraction : extractor, sortList: [[0,0]] });
36
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
- });
37
+ // Displays a closeable alert within the content pane
38
+ // Gitdocs.showAlert('This is the message', 'success')
39
+ showAlert : function(body, result) {
40
+ if (result == null) result = 'info';
41
+ $('.content div.alert-message').remove();
42
+ var el = $('.content').prepend('<div class="alert-message ' + result +
43
+ '"><a class="close" href="#">×</a>' + body + '</div>');
44
+ $('div.alert-message').alert();
55
45
  }
56
46
  };
57
47
 
@@ -59,7 +49,6 @@ $(document).ready(function() {
59
49
  GitDocs.linkBreadcrumbs();
60
50
  GitDocs.fillDirMeta();
61
51
  StringFormatter.autoLink();
62
- GitDocs.observeSettingsForm();
63
52
  });
64
53
 
65
54
  // Redirect to edit page for new file when new file form is submitted
@@ -0,0 +1,25 @@
1
+ GitDocs.settings = {
2
+ // To make the settings form ajax-y
3
+ observeSettingsForm : function() {
4
+ $('#settings').submit(function(e) {
5
+ e.preventDefault();
6
+ $.ajax({
7
+ type: 'POST', url: this.action, data: $(this).serialize(),
8
+ success: function() {
9
+ GitDocs.showAlert('<p><strong>Settings saved!</strong> Gitdocs has been restarted with your new settings.</p>', 'success')
10
+ }
11
+ });
12
+ return false;
13
+ });
14
+ }
15
+ }
16
+
17
+ $(document).ready(function() {
18
+ GitDocs.settings.observeSettingsForm();
19
+ });
20
+
21
+ // Handle delete for settings form
22
+ $('input.remove_share').live('click', function(e){
23
+ $(this).siblings("input[type=hidden]").val("true")
24
+ $(this).parents("form").submit()
25
+ });
@@ -21,7 +21,8 @@ module Gitdocs
21
21
  end
22
22
 
23
23
  def run
24
- return false unless self.valid? && !self.root.empty?
24
+ return false unless self.valid?
25
+
25
26
  @show_notifications = @share.notification
26
27
  @current_remote = @share.remote_name
27
28
  @current_branch = @share.branch_name
@@ -159,7 +160,7 @@ module Gitdocs
159
160
 
160
161
  def valid?
161
162
  out, status = sh_with_code "git status"
162
- status.success?
163
+ @root.present? && status.success?
163
164
  end
164
165
 
165
166
  def warn(title, msg)
@@ -18,6 +18,7 @@ module Gitdocs
18
18
  Thin::Logging.debug = @manager.debug
19
19
  Thin::Server.start('127.0.0.1', port) do
20
20
  use Rack::Static, :urls => ['/css', '/js', '/img', '/doc'], :root => File.expand_path("../public", __FILE__)
21
+ use Rack::MethodOverride
21
22
  run Renee {
22
23
  if request.path_info == '/'
23
24
  render! "home", :layout => 'app', :locals => {:conf => manager.config, :nav_state => "home" }
@@ -31,7 +32,10 @@ module Gitdocs
31
32
  if remote_branch = share.delete('remote_branch')
32
33
  share['remote_name'], share['branch_name'] = remote_branch.split('/', 2)
33
34
  end
34
- shares[Integer(idx)].update_attributes(share)
35
+ # Update paths
36
+ if share['path'] && !share['path'].empty?
37
+ shares[Integer(idx)].update_attributes(share)
38
+ end
35
39
  end
36
40
  EM.add_timer(0.1) { manager.restart }
37
41
  redirect! '/settings'
@@ -42,8 +46,20 @@ module Gitdocs
42
46
  render! "search", :layout => 'app', :locals => {:conf => manager.config, :results => manager.search(request.GET['q']), :nav_state => nil}
43
47
  end
44
48
 
45
- path('shares').post do
46
- Configuration::Share.create
49
+ path('shares') do
50
+ post do
51
+ Configuration::Share.create
52
+ redirect! '/settings'
53
+ end
54
+
55
+ var(:int) do |id|
56
+ delete do
57
+ share = manager.config.shares.find { |s| s.id == id }
58
+ halt 404 if share.nil?
59
+ share.destroy
60
+ redirect! '/settings'
61
+ end
62
+ end
47
63
  end
48
64
 
49
65
  var :int do |idx|
@@ -1,3 +1,3 @@
1
1
  module Gitdocs
2
- VERSION = "0.4.8"
2
+ VERSION = "0.4.9"
3
3
  end
@@ -26,13 +26,13 @@
26
26
  %p No files were found in this directory.
27
27
 
28
28
  .row
29
- .span6
30
- %form.add
31
- %p Add a file in this directory
32
- %input{:type => 'text', :name => "path", :class => "edit" }
33
- %input{:type => 'submit', :value => "New file", :class => "btn secondary" }
34
29
  .span6
35
30
  %form.upload{ :method => "post", :enctype => "multipart/form-data", :action => "/#{idx}#{request.path_info}?mode=upload" }
36
- %p Upload a file to this directory
31
+ %p Upload file to this directory
37
32
  %input{:type => 'file', :value => "Select a file", :name => "file", :class => "uploader" }
38
33
  %input{:type => 'submit', :value => "Upload file", :class => "btn secondary" }
34
+ .span6
35
+ %form.add
36
+ %p Add new file in this directory
37
+ %input{:type => 'text', :name => "path", :class => "edit", :placeholder => "somefile.md" }
38
+ %input{:type => 'submit', :value => "New file", :class => "btn secondary" }
@@ -1,11 +1,17 @@
1
1
  - @title = "Settings"
2
+ %script{ :src => "/js/settings.js", :type => "text/javascript", :charset => "utf-8" }
2
3
 
3
4
  %form#settings{:method => 'POST', :action => '/settings'}
4
5
  %h2 Gitdocs
5
6
  #config.field.config
6
- %input{:type =>'hidden', :value => '0', :name=>"config[load_browser_on_startup]"}
7
- %input{:type =>'checkbox', :value => '1', :name=>"config[load_browser_on_startup]", :checked => conf.global.load_browser_on_startup ? 'checked' : nil}
8
- %span Open browser on startup?
7
+ %dl
8
+ %dt Web Frontend Port
9
+ %dd
10
+ %input{:type =>'input', :name=>"config[web_frontend_port]", :value => conf.global.web_frontend_port }
11
+ %p
12
+ %input{:type =>'hidden', :value => '0', :name=>"config[load_browser_on_startup]"}
13
+ %input{:type =>'checkbox', :value => '1', :name=>"config[load_browser_on_startup]", :checked => conf.global.load_browser_on_startup ? 'checked' : nil}
14
+ %span Open browser on startup?
9
15
 
10
16
  %h2 Shares
11
17
  - conf.shares.each_with_index do |share, idx|
@@ -41,9 +47,9 @@
41
47
  %input{:type =>'hidden', :value => '0', :name=>"share[#{idx}][notification]"}
42
48
  %input{:type =>'checkbox', :value => '1', :name=>"share[#{idx}][notification]", :checked => share.notification ? 'checked' : nil}
43
49
  %span Notifications?
44
- .delete{ :style => "display: none;" }
45
- %input{:type =>'button', :value => "Delete", :class => "btn danger"}
46
- %input{:type =>'hidden', :name=>"share[#{idx}][delete]"}
50
+ .delete
51
+ %a{ :href => "/shares/#{share.id}", :class => "btn remove_share danger", :"data-method" => "delete"}
52
+ Delete
47
53
 
48
54
  %input{:value => 'Save', :type => 'submit', :class => "btn primary" }
49
55
  %a{ :class => "btn secondary new-share", :href => "/shares", :"data-method" => "post" } Add Share
data/test/test_helper.rb CHANGED
@@ -31,7 +31,7 @@ class MiniTest::Spec
31
31
  end
32
32
  begin
33
33
  puts "RUNNING!"
34
- Gitdocs.start(conf_path) do |conf|
34
+ Gitdocs.start(:config_path => conf_path) do |conf|
35
35
  conf.global.update_attributes(:load_browser_on_startup => false, :start_web_frontend => false)
36
36
  conf.add_path(path, :polling_interval => 0.1, :notification => false)
37
37
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: gitdocs
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.4.8
5
+ version: 0.4.9
6
6
  platform: ruby
7
7
  authors:
8
8
  - Josh Hull
@@ -262,6 +262,7 @@ files:
262
262
  - lib/gitdocs/migration/003_create_configs.rb
263
263
  - lib/gitdocs/migration/004_add_index_for_path.rb
264
264
  - lib/gitdocs/migration/005_add_start_web_frontend.rb
265
+ - lib/gitdocs/migration/006_add_web_port_to_config.rb
265
266
  - lib/gitdocs/public/css/app.css
266
267
  - lib/gitdocs/public/css/bootstrap.css
267
268
  - lib/gitdocs/public/css/coderay.css
@@ -308,6 +309,7 @@ files:
308
309
  - lib/gitdocs/public/js/jquery.js
309
310
  - lib/gitdocs/public/js/jquery.tablesorter.js
310
311
  - lib/gitdocs/public/js/search.js
312
+ - lib/gitdocs/public/js/settings.js
311
313
  - lib/gitdocs/public/js/util.js
312
314
  - lib/gitdocs/rendering.rb
313
315
  - lib/gitdocs/runner.rb