gitdocs 0.5.0.pre6 → 0.5.0.pre7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +8 -8
  2. data/.gitignore +1 -0
  3. data/.haml-lint.yml +3 -0
  4. data/.jslint.yml +84 -0
  5. data/.rubocop.yml +13 -0
  6. data/CHANGELOG +11 -0
  7. data/README.md +6 -2
  8. data/Rakefile +22 -3
  9. data/gitdocs.gemspec +36 -29
  10. data/lib/gitdocs.rb +5 -2
  11. data/lib/gitdocs/cli.rb +31 -8
  12. data/lib/gitdocs/configuration.rb +95 -49
  13. data/lib/gitdocs/manager.rb +36 -28
  14. data/lib/gitdocs/migration/001_create_shares.rb +2 -0
  15. data/lib/gitdocs/migration/002_add_remote_branch.rb +2 -0
  16. data/lib/gitdocs/migration/003_create_configs.rb +2 -0
  17. data/lib/gitdocs/migration/004_add_index_for_path.rb +4 -0
  18. data/lib/gitdocs/migration/005_add_start_web_frontend.rb +2 -0
  19. data/lib/gitdocs/migration/006_add_web_port_to_config.rb +2 -0
  20. data/lib/gitdocs/migration/007_add_sync_type.rb +11 -0
  21. data/lib/gitdocs/notifier.rb +89 -6
  22. data/lib/gitdocs/public/img/file.png +0 -0
  23. data/lib/gitdocs/public/img/folder.png +0 -0
  24. data/lib/gitdocs/public/js/app.js +26 -11
  25. data/lib/gitdocs/public/js/edit.js +3 -3
  26. data/lib/gitdocs/public/js/settings.js +8 -5
  27. data/lib/gitdocs/public/js/util.js +21 -20
  28. data/lib/gitdocs/rendering.rb +14 -9
  29. data/lib/gitdocs/repository.rb +180 -216
  30. data/lib/gitdocs/repository/path.rb +166 -0
  31. data/lib/gitdocs/runner.rb +22 -65
  32. data/lib/gitdocs/search.rb +35 -0
  33. data/lib/gitdocs/server.rb +123 -86
  34. data/lib/gitdocs/version.rb +1 -1
  35. data/lib/gitdocs/views/_header.haml +6 -6
  36. data/lib/gitdocs/views/app.haml +17 -17
  37. data/lib/gitdocs/views/dir.haml +10 -10
  38. data/lib/gitdocs/views/edit.haml +8 -9
  39. data/lib/gitdocs/views/file.haml +1 -1
  40. data/lib/gitdocs/views/home.haml +4 -4
  41. data/lib/gitdocs/views/revisions.haml +6 -6
  42. data/lib/gitdocs/views/search.haml +6 -6
  43. data/lib/gitdocs/views/settings.haml +23 -16
  44. data/test/.rubocop.yml +13 -0
  45. data/test/integration/browse_test.rb +149 -0
  46. data/test/integration/full_sync_test.rb +3 -11
  47. data/test/integration/share_management_test.rb +59 -10
  48. data/test/integration/status_test.rb +2 -0
  49. data/test/integration/test_helper.rb +40 -7
  50. data/test/unit/configuration_test.rb +82 -0
  51. data/test/unit/notifier_test.rb +165 -0
  52. data/test/unit/repository_path_test.rb +368 -0
  53. data/test/{repository_test.rb → unit/repository_test.rb} +426 -245
  54. data/test/unit/runner_test.rb +122 -0
  55. data/test/unit/search_test.rb +52 -0
  56. data/test/{test_helper.rb → unit/test_helper.rb} +5 -0
  57. metadata +138 -41
  58. data/lib/gitdocs/docfile.rb +0 -23
  59. data/test/configuration_test.rb +0 -41
  60. data/test/notifier_test.rb +0 -68
  61. data/test/runner_test.rb +0 -123
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZGUwYWI0Y2RjMTNjZGU4YzMzMzkxMTcxOTQ3OGQ2YWY0ZGNmZjg3MA==
4
+ ZTBiOGM2MTgxYWMwYTBlZTkzMTRhNTAxYTMyMTgyYTM1NjdmNjgyMQ==
5
5
  data.tar.gz: !binary |-
6
- MjZhNjUxNGM4Yjc2Nzk1NWRkYjJiNjNlNzYyNTA3NGEzNjFkMTcyNw==
6
+ ZTc1ZTFiNWVjZjVlYjk0MDgyYmE4NGNiNzJjZTQzNzdjY2Q2YTgwMg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NWY0NTMyOTQ1NGJhMTg5OTY3OWNhMGE4MzFhYjJjNzA1N2Y4YTgzMWIwMTE4
10
- NDZkMWIzMzFlYzNhYzc5MjAyMmQ3NGJiMzY3ZDliMzhkMTE5ZWQxNjE3MTk3
11
- Y2E4YTIzZTU2ODg3N2Y5YjRmNDFiNzM1MzZhMzczN2E4Yzk0ODI=
9
+ Yzk2NDFmMmJkYmM4MDllOTVmOWZhYjM0NDM3MzFjNzY1NzUyNGE3Mzk5ZGE5
10
+ MWNhODBjN2U5YTA5YjkzZjIwZDI5YzAyNzIyM2RiZTYwYTMzYjIwYjhkYTY0
11
+ MmExYjFlNzFlN2VkOWUyNGYwNTg1MjUyYjU2ZmM5YTk1MTU0MzE=
12
12
  data.tar.gz: !binary |-
13
- ODFiYjQ4ZmI3NWVlNzU5ZWY5NDQ3Mzk4OGRhMGNmMWQ5ZDBjNGNmYjcyYzM2
14
- N2RhMzZlZDExYzYyOTMyZWE4OWVkYTA1N2Y1NDRiMmFjYTM4YmM3N2QzZWUw
15
- OTRlZWZkOGJlMDg1MGQ4NGY4OThjOGRhN2Q1MjI5NzAyODcyZjA=
13
+ OWZiZjNkOGZiYjc4NzcwNjAxYmRmNmExOTQwMTAzODYzYjBhNzRlYzI5ZjMy
14
+ MjczNTJlMDcwYjQwZGM0Y2NlMTg4N2MyYzlhMGIyOWY0N2M3MTQ2NDJhODJi
15
+ MDNhMzEyZDcxYjlhNTRhZDU2NGQxOTQwNDA2NGZiNDYwNjdjYWM=
data/.gitignore CHANGED
@@ -4,3 +4,4 @@ Gemfile.lock
4
4
  pkg/*
5
5
  .DS_Store
6
6
  tmp
7
+ coverage
@@ -0,0 +1,3 @@
1
+ linters:
2
+ LineLength:
3
+ enabled: false
@@ -0,0 +1,84 @@
1
+ # ------------ rake task options ------------
2
+
3
+ # JS files to check by default, if no parameters are passed to rake jslint
4
+ # (you may want to limit this only to your own scripts and exclude any external scripts and frameworks)
5
+
6
+ # this can be overridden by adding 'paths' and 'exclude_paths' parameter to rake command:
7
+ # rake jslint paths=path1,path2,... exclude_paths=library1,library2,...
8
+
9
+ paths:
10
+ - lib/gitdocs/public/js/**/*.js
11
+
12
+ exclude_paths:
13
+ - lib/gitdocs/public/js/ace/**/*.js
14
+ - lib/gitdocs/public/js/jquery.tablesorter.js
15
+ - lib/gitdocs/public/js/jquery.js
16
+ - lib/gitdocs/public/js/bootstrap-alerts.js
17
+
18
+
19
+ # ------------ jslint options ------------
20
+ # see http://www.jslint.com/lint.html#options for more detailed explanations
21
+
22
+ # "enforce" type options (true means potentially more warnings)
23
+
24
+ adsafe: false # true if ADsafe rules should be enforced. See http://www.ADsafe.org/
25
+ bitwise: true # true if bitwise operators should not be allowed
26
+ newcap: true # true if Initial Caps must be used with constructor functions
27
+ eqeqeq: false # true if === should be required (for ALL equality comparisons)
28
+ immed: false # true if immediate function invocations must be wrapped in parens
29
+ nomen: false # true if initial or trailing underscore in identifiers should be forbidden
30
+ onevar: false # true if only one var statement per function should be allowed
31
+ plusplus: false # true if ++ and -- should not be allowed
32
+ regexp: false # true if . and [^...] should not be allowed in RegExp literals
33
+ safe: false # true if the safe subset rules are enforced (used by ADsafe)
34
+ strict: false # true if the ES5 "use strict"; pragma is required
35
+ undef: false # true if variables must be declared before used
36
+ white: false # true if strict whitespace rules apply (see also 'indent' option)
37
+
38
+ # "allow" type options (false means potentially more warnings)
39
+
40
+ cap: false # true if upper case HTML should be allowed
41
+ css: true # true if CSS workarounds should be tolerated
42
+ debug: false # true if debugger statements should be allowed (set to false before going into production)
43
+ es5: false # true if ECMAScript 5 syntax should be allowed
44
+ evil: false # true if eval should be allowed
45
+ forin: true # true if unfiltered 'for in' statements should be allowed
46
+ fragment: true # true if HTML fragments should be allowed
47
+ laxbreak: false # true if statement breaks should not be checked
48
+ on: false # true if HTML event handlers (e.g. onclick="...") should be allowed
49
+ sub: false # true if subscript notation may be used for expressions better expressed in dot notation
50
+
51
+ # other options
52
+
53
+ maxlen: 120 # Maximum line length
54
+ indent: 2 # Number of spaces that should be used for indentation - used only if 'white' option is set
55
+ maxerr: 50 # The maximum number of warnings reported (per file)
56
+ passfail: false # true if the scan should stop on first error (per file)
57
+ # following are relevant only if undef = true
58
+ predef: '' # Names of predefined global variables - comma-separated string or a YAML array
59
+ browser: true # true if the standard browser globals should be predefined
60
+ rhino: false # true if the Rhino environment globals should be predefined
61
+ windows: false # true if Windows-specific globals should be predefined
62
+ widget: false # true if the Yahoo Widgets globals should be predefined
63
+ devel: true # true if functions like alert, confirm, console, prompt etc. are predefined
64
+
65
+
66
+ # ------------ jslint_on_rails custom lint options (switch to true to disable some annoying warnings) ------------
67
+
68
+ # ignores "missing semicolon" warning at the end of a function; this lets you write one-liners
69
+ # like: x.map(function(i) { return i + 1 }); without having to put a second semicolon inside the function
70
+ lastsemic: false
71
+
72
+ # allows you to use the 'new' expression as a statement (without assignment)
73
+ # so you can call e.g. new Ajax.Request(...), new Effect.Highlight(...) without assigning to a dummy variable
74
+ newstat: false
75
+
76
+ # ignores the "Expected an assignment or function call and instead saw an expression" warning,
77
+ # if the expression contains a proper statement and makes sense; this lets you write things like:
78
+ # element && element.show();
79
+ # valid || other || lastChance || alert('OMG!');
80
+ # selected ? show() : hide();
81
+ # although these will still cause a warning:
82
+ # element && link;
83
+ # selected ? 5 : 10;
84
+ statinexp: false
@@ -0,0 +1,13 @@
1
+ Documentation:
2
+ Enabled: false
3
+
4
+ ClassAndModuleChildren:
5
+ Enabled: false
6
+
7
+ # Splitting method arguments across multiple lines can result in the containing
8
+ # method looking long, but not actually increasing the complexity at all.
9
+ MethodLength:
10
+ Enabled: false
11
+
12
+ EachWithObject:
13
+ Enabled: false
data/CHANGELOG CHANGED
@@ -1,3 +1,14 @@
1
+ 0.5.0.pre7 (August 3rd 2014)
2
+
3
+ * UI improvements to repo browser (@acant)
4
+ * upgrade dependencies (@acant)
5
+ * add integration testing for repo browser (@acant)
6
+ * include hidden files in directory listing (@acant)
7
+ * refactor the server, cleanup file manipulation (@acant)
8
+ * add fetch only syncing for repositories (@acant)
9
+ * add sync status for reach repository in the CLI status (@acant)
10
+ * fix display of hidden files in the web UI (@acant)
11
+
1
12
  0.5.0.pre6 (May 24th 2014)
2
13
 
3
14
  * Remove the load_browser_on_startup config option (@acant)
data/README.md CHANGED
@@ -3,6 +3,9 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/gitdocs.png)](http://badge.fury.io/rb/gitdocs)
4
4
  [![Code Climate](https://codeclimate.com/github/bazaarlabs/gitdocs.png)](https://codeclimate.com/github/bazaarlabs/gitdocs)
5
5
  [![Build Status](https://travis-ci.org/nesquena/gitdocs.svg?branch=master)](https://travis-ci.org/nesquena/gitdocs)
6
+ [![Inline docs](http://inch-ci.org/github/nesquena/gitdocs.png?branch=master)](http://inch-ci.org/github/nesquena/gitdocs)
7
+ [![Dependency Status](https://gemnasium.com/nesquena/gitdocs.svg)](https://gemnasium.com/nesquena/gitdocs)
8
+ [![Coverage Status](https://coveralls.io/repos/nesquena/gitdocs/badge.png?branch=master)](https://coveralls.io/r/nesquena/gitdocs)
6
9
 
7
10
  Open-source dropbox alternative powered by git. Collaborate on files and tasks without any extra hassle.
8
11
  gitdocs will automatically keep everyone's repos in sync by pushing and pulling changes.
@@ -10,7 +13,7 @@ This allows any git repo to be used as a collaborative task list, file share, or
10
13
  Supports a web front-end allowing each repo to be accessed through your browser.
11
14
 
12
15
  **Note:** Gitdocs has been tested on multiple unix systems including Mac OS X and Ubuntu.
13
- Windows support is [half-baked](https://github.com/bazaarlabs/gitdocs/issues/7)
16
+ Windows support is [half-baked](https://github.com/nesquena/gitdocs/issues/7)
14
17
  but we plan to tackle that shortly in an upcoming release.
15
18
 
16
19
  ## Why?
@@ -171,7 +174,8 @@ Gitdocs is a young project but we have many plans for it including:
171
174
 
172
175
  ## Contributors
173
176
 
174
- Gitdocs was created at [Miso](http://engineering.gomiso.com) by [Joshua Hull](https://github.com/joshbuddy) and [Nathan Esquenazi](https://github.com/nesquena).
177
+ Gitdocs is now primarily being developed by [Andrew Sullivan Cant](https://github.com/acant). Gitdocs was created at [Miso](http://engineering.gomiso.com) by [Joshua Hull](https://github.com/joshbuddy) and [Nathan Esquenazi](https://github.com/nesquena).
178
+
175
179
  We also have had several contributors:
176
180
 
177
181
  * [Chris Kempson](https://github.com/ChrisKempson) - Encoding issues
data/Rakefile CHANGED
@@ -1,10 +1,29 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
2
  require 'rake/testtask'
3
+ require 'jslint/tasks'
3
4
 
5
+ JSLint.config_path = '.jslint.yml'
6
+
7
+ namespace :test do
8
+ # Separate the unit and integration tests when running the entire suite.
9
+ Rake::TestTask.new(:unit) do |t|
10
+ t.libs.push('lib')
11
+ t.test_files = FileList[File.expand_path('../test/unit/**/*_test.rb', __FILE__)]
12
+ t.verbose = true
13
+ end
14
+
15
+ Rake::TestTask.new(integration: :unit) do |t|
16
+ t.libs.push('lib')
17
+ t.test_files = FileList[File.expand_path('../test/integration/**/*_test.rb', __FILE__)]
18
+ t.verbose = true
19
+ end
20
+ end
21
+
22
+ # Keep a default test task for manually running any test
4
23
  Rake::TestTask.new do |t|
5
- t.libs.push "lib"
24
+ t.libs.push('lib')
6
25
  t.test_files = FileList[File.expand_path('../test/**/*_test.rb', __FILE__)]
7
26
  t.verbose = true
8
27
  end
9
28
 
10
- task :default => [:test]
29
+ task default: 'test:integration'
@@ -1,48 +1,55 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "gitdocs/version"
2
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
+ require 'gitdocs/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "gitdocs"
6
+ s.name = 'gitdocs'
7
7
  s.version = Gitdocs::VERSION
8
- s.authors = ["Josh Hull", "Nathan Esquenazi"]
9
- s.email = ["joshbuddy@gmail.com", "nesquena@gmail.com"]
10
- s.homepage = "http://engineering.gomiso.com/2011/11/30/collaborate-and-track-tasks-with-ease-using-gitdocs/"
11
- s.summary = %q{Open-source Dropbox using Ruby and Git}
12
- s.description = %q{Open-source Dropbox using Ruby and Git.}
8
+ s.authors = ['Josh Hull', 'Nathan Esquenazi']
9
+ s.email = ['joshbuddy@gmail.com', 'nesquena@gmail.com']
10
+ s.homepage = 'http://engineering.gomiso.com/2011/11/30/collaborate-and-track-tasks-with-ease-using-gitdocs/'
11
+ s.summary = 'Open-source Dropbox using Ruby and Git.'
12
+ s.description = 'Open-source Dropbox using Ruby and Git.'
13
+ s.license = 'MIT'
13
14
 
14
- s.rubyforge_project = "gitdocs"
15
+ s.rubyforge_project = 'gitdocs'
15
16
 
16
17
  s.files = `git ls-files`.split("\n")
17
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
- s.require_paths = ["lib"]
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
20
+ s.require_paths = ['lib']
20
21
 
21
22
  s.required_ruby_version = '>= 1.9'
22
23
 
23
24
  s.add_dependency 'joshbuddy-guard', '~> 0.10.0'
24
- s.add_dependency 'thin', '~> 1.5.1'
25
- s.add_dependency 'renee', '~> 0.3.11'
26
- s.add_dependency 'redcarpet', '~> 3.1.1'
27
- s.add_dependency 'thor', '~> 0.14.6'
28
- s.add_dependency 'coderay', '~> 1.0.4'
29
- s.add_dependency 'dante', '~> 0.1.2'
30
- s.add_dependency 'growl', '~> 1.0.3'
31
- s.add_dependency 'yajl-ruby', '~> 1.1.0'
32
- s.add_dependency 'haml', '~> 3.1.4'
33
- s.add_dependency 'sqlite3', "~> 1.3.4"
34
- s.add_dependency 'activerecord', "~> 3.1.0"
35
- s.add_dependency 'grit', "~> 2.4.1"
36
- s.add_dependency 'shell_tools', "~> 0.1.0"
37
- s.add_dependency 'mimetype-fu', "~> 0.1.2"
38
- s.add_dependency 'eventmachine', '>= 1.0.3'
39
- s.add_dependency 'launchy', '~> 2.4.2'
40
- s.add_dependency 'rugged', '~> 0.19.0'
25
+ s.add_dependency 'thin', '~> 1.6.2'
26
+ s.add_dependency 'renee', '~> 0.3.11'
27
+ s.add_dependency 'redcarpet', '~> 3.1.1'
28
+ s.add_dependency 'thor', '~> 0.14.6'
29
+ s.add_dependency 'coderay', '~> 1.1.0'
30
+ s.add_dependency 'dante', '~> 0.1.2'
31
+ s.add_dependency 'growl', '~> 1.0.3'
32
+ s.add_dependency 'haml', '~> 4.0.5'
33
+ s.add_dependency 'sqlite3', '~> 1.3.4'
34
+ s.add_dependency 'activerecord', '~> 4.1.4'
35
+ s.add_dependency 'grit', '~> 2.5.0'
36
+ s.add_dependency 'shell_tools', '~> 0.1.0'
37
+ s.add_dependency 'mimetype-fu', '~> 0.1.2'
38
+ s.add_dependency 'eventmachine', '>= 1.0.3'
39
+ s.add_dependency 'launchy', '~> 2.4.2'
40
+ s.add_dependency 'rugged', '~> 0.19.0'
41
+ s.add_dependency 'table_print', '~> 1.5.1'
41
42
 
42
- s.add_development_dependency 'minitest', "~> 5.0.8"
43
+ s.add_development_dependency 'minitest', '~> 5.4.0'
44
+ s.add_development_dependency 'capybara_minitest_spec', '~> 1.0.2'
45
+ s.add_development_dependency 'poltergeist', '~> 1.5.1'
43
46
  s.add_development_dependency 'rake'
44
47
  s.add_development_dependency 'mocha'
45
48
  s.add_development_dependency 'fakeweb'
46
49
  s.add_development_dependency 'metric_fu'
47
50
  s.add_development_dependency 'aruba'
51
+ s.add_development_dependency 'rubocop'
52
+ s.add_development_dependency 'haml-lint', '~> 0.6.0'
53
+ s.add_development_dependency 'jslint_on_rails', '~> 1.1.1'
54
+ s.add_development_dependency 'coveralls', '~> 0.7.0'
48
55
  end
@@ -1,11 +1,13 @@
1
+ # -*- encoding : utf-8 -*-
2
+
1
3
  require 'thread'
2
- require 'yajl'
3
4
  require 'dante'
4
5
  require 'socket'
5
6
  require 'shell_tools'
6
7
  require 'guard'
7
8
  require 'grit'
8
9
  require 'rugged'
10
+ require 'table_print'
9
11
 
10
12
  require 'gitdocs/version'
11
13
  require 'gitdocs/configuration'
@@ -13,10 +15,11 @@ require 'gitdocs/runner'
13
15
  require 'gitdocs/server'
14
16
  require 'gitdocs/cli'
15
17
  require 'gitdocs/manager'
16
- require 'gitdocs/docfile'
17
18
  require 'gitdocs/rendering'
18
19
  require 'gitdocs/notifier'
19
20
  require 'gitdocs/repository'
21
+ require 'gitdocs/repository/path'
22
+ require 'gitdocs/search'
20
23
 
21
24
  module Gitdocs
22
25
  DEBUG = ENV['DEBUG']
@@ -1,10 +1,16 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ # rubocop:disable LineLength, ClassLength
4
+
1
5
  module Gitdocs
2
6
  require 'thor'
3
7
 
4
8
  class Cli < Thor
5
9
  include Thor::Actions
6
10
 
7
- def self.source_root; File.expand_path('../../', __FILE__); end
11
+ def self.source_root
12
+ File.expand_path('../../', __FILE__)
13
+ end
8
14
 
9
15
  desc 'start', 'Starts a daemonized gitdocs process'
10
16
  method_option :debug, type: :boolean, aliases: '-D'
@@ -84,8 +90,25 @@ module Gitdocs
84
90
  say "GitDoc v#{VERSION}"
85
91
  say "Running: #{running?}"
86
92
  say "File System Watch Method: #{file_system_watch_method}"
87
- say 'Watching paths:'
88
- say config.shares.map { |s| " - #{s.path}" }.join("\n")
93
+ say 'Watched repositories:'
94
+ tp.set(:max_width, 100)
95
+ status_display = lambda do |share|
96
+ repository = Gitdocs::Repository.new(share)
97
+
98
+ status = ''
99
+ status += '*' if repository.dirty?
100
+ status += '!' if repository.need_sync?
101
+
102
+ status = 'ok' if status.empty?
103
+ status
104
+ end
105
+ tp(
106
+ config.shares,
107
+ { sync: { display_method: :sync_type } },
108
+ { s: status_display },
109
+ :path
110
+ )
111
+ say "\n(Legend: ok everything synced, * change to commit, ! needs sync)"
89
112
  end
90
113
 
91
114
  desc 'open', 'Open the Web UI'
@@ -97,14 +120,14 @@ module Gitdocs
97
120
  end
98
121
 
99
122
  web_port = options[:port]
100
- web_port ||= config.global.web_frontend_port
123
+ web_port ||= config.web_frontend_port
101
124
  Launchy.open("http://localhost:#{web_port}/")
102
125
  end
103
126
 
104
127
  # TODO: make this work
105
- #desc 'config', 'Configuration options for gitdocs'
106
- #def config
107
- #end
128
+ # desc 'config', 'Configuration options for gitdocs'
129
+ # def config
130
+ # end
108
131
 
109
132
  desc 'help', 'Prints out the help'
110
133
  def help(task = nil, subcommand = false)
@@ -140,7 +163,7 @@ module Gitdocs
140
163
  end
141
164
 
142
165
  # @return [Symbol] to indicate how the file system is being watched
143
- def file_system_watch_method
166
+ def file_system_watch_method # rubocop:disable CyclomaticComplexity
144
167
  if Guard::Listener.mac? && Guard::Darwin.usable?
145
168
  :notification
146
169
  elsif Guard::Listener.linux? && Guard::Linux.usable?
@@ -1,66 +1,112 @@
1
+ # -*- encoding : utf-8 -*-
2
+
1
3
  require 'active_record'
2
4
  require 'grit'
3
5
 
4
- module Gitdocs
5
- class Configuration
6
- attr_reader :config_root
7
-
8
- def initialize(config_root = nil)
9
- @config_root = config_root || File.expand_path('.gitdocs', ENV['HOME'])
10
- FileUtils.mkdir_p(@config_root)
11
- ActiveRecord::Base.establish_connection(
12
- adapter: 'sqlite3',
13
- database: ENV['TEST'] ? ':memory:' : File.join(@config_root, 'config.db')
14
- )
15
- ActiveRecord::Migrator.migrate(File.expand_path('../migration', __FILE__))
16
- import_old_shares unless ENV['TEST']
17
- end
6
+ class Gitdocs::Configuration
7
+ attr_reader :config_root
18
8
 
19
- class Share < ActiveRecord::Base
20
- attr_accessible :polling_interval, :path, :notification, :branch_name, :remote_name
21
- end
9
+ def initialize(config_root = nil)
10
+ @config_root = config_root || File.expand_path('.gitdocs', ENV['HOME'])
11
+ FileUtils.mkdir_p(@config_root)
12
+ ActiveRecord::Base.establish_connection(
13
+ adapter: 'sqlite3',
14
+ database: ENV['TEST'] ? ':memory:' : File.join(@config_root, 'config.db')
15
+ )
16
+ ActiveRecord::Migrator.migrate(File.expand_path('../migration', __FILE__))
17
+ import_old_shares unless ENV['TEST']
18
+ end
22
19
 
23
- class Config < ActiveRecord::Base
24
- attr_accessible :start_web_frontend, :web_frontend_port
25
- end
20
+ class Share < ActiveRecord::Base
21
+ #attr_accessible :polling_interval, :path, :notification, :branch_name, :remote_name, :sync_type
22
+ end
26
23
 
27
- def add_path(path, opts = nil)
28
- path = normalize_path(path)
29
- path_opts = { path: path }
30
- path_opts.merge!(opts) if opts
31
- Share.new(path_opts).save!
32
- end
24
+ class Config < ActiveRecord::Base
25
+ #attr_accessible :start_web_frontend, :web_frontend_port
26
+ end
33
27
 
34
- def remove_path(path)
35
- path = normalize_path(path)
36
- Share.where(path: path).destroy_all
37
- end
28
+ # return [Boolean]
29
+ def start_web_frontend
30
+ global.start_web_frontend
31
+ end
38
32
 
39
- def clear
40
- Share.destroy_all
41
- end
33
+ # @return [Integer]
34
+ def web_frontend_port
35
+ global.web_frontend_port
36
+ end
42
37
 
43
- def shares
44
- Share.all
45
- end
38
+ # @param [String] path
39
+ # @param [Hash] opts
40
+ def add_path(path, opts = nil)
41
+ path = normalize_path(path)
42
+ path_opts = { path: path }
43
+ path_opts.merge!(opts) if opts
44
+ Share.new(path_opts).save!
45
+ end
46
46
 
47
- def global
48
- fail if Config.all.size > 1
49
- Config.create! if Config.all.empty?
50
- Config.all.first
51
- end
47
+ # @param [Hash] new_config
48
+ # @option new_config [Hash] 'config'
49
+ # @option new_config [Array<Hash>] 'share'
50
+ def update_all(new_config)
51
+ global.update_attributes(new_config['config'])
52
+ new_config['share'].each do |index, share_config|
53
+ # Skip the share update if there is no path specified.
54
+ next unless share_config['path'] && !share_config['path'].empty?
52
55
 
53
- def normalize_path(path)
54
- File.expand_path(path, Dir.pwd)
56
+ # Split the remote_branch into remote and branch
57
+ remote_branch = share_config.delete('remote_branch')
58
+ if remote_branch
59
+ share_config['remote_name'], share_config['branch_name'] = remote_branch.split('/', 2)
60
+ end
61
+ shares[index.to_i].update_attributes(share_config)
55
62
  end
63
+ end
56
64
 
57
- private
65
+ # @param [String] path of the share to remove
66
+ def remove_path(path)
67
+ path = normalize_path(path)
68
+ Share.where(path: path).destroy_all
69
+ end
58
70
 
59
- def import_old_shares
60
- full_path = File.expand_path('paths', config_root)
61
- if File.exist?(full_path)
62
- File.read(full_path).split("\n").each { |path| Share.find_or_create_by_path(path) }
63
- end
71
+ # @param [Integer] id of the share to remove
72
+ #
73
+ # @return [true] share was deleted
74
+ # @return [false] share does not exist
75
+ def remove_by_id(id)
76
+ Share.find(id).destroy
77
+ true
78
+ rescue ActiveRecord::RecordNotFound
79
+ false
80
+ end
81
+
82
+ def clear
83
+ Share.destroy_all
84
+ end
85
+
86
+ def shares
87
+ Share.all
88
+ end
89
+
90
+ ##############################################################################
91
+
92
+ private
93
+
94
+ def global
95
+ fail if Config.all.size > 1
96
+ Config.create! if Config.all.empty?
97
+ Config.all.first
98
+ end
99
+
100
+ def normalize_path(path)
101
+ File.expand_path(path, Dir.pwd)
102
+ end
103
+
104
+ def import_old_shares
105
+ full_path = File.expand_path('paths', config_root)
106
+ return unless File.exist?(full_path)
107
+
108
+ File.read(full_path).split("\n").each do |path|
109
+ Share.find_or_create_by_path(path)
64
110
  end
65
111
  end
66
112
  end