siuying-gitdocs 0.4.14.md

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. data/.gitignore +5 -0
  2. data/CHANGELOG +79 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +20 -0
  5. data/README.md +192 -0
  6. data/Rakefile +8 -0
  7. data/bin/gitdocs +5 -0
  8. data/gitdocs.gemspec +41 -0
  9. data/lib/gitdocs/cli.rb +111 -0
  10. data/lib/gitdocs/configuration.rb +79 -0
  11. data/lib/gitdocs/docfile.rb +23 -0
  12. data/lib/gitdocs/manager.rb +96 -0
  13. data/lib/gitdocs/markdown_converter.rb +44 -0
  14. data/lib/gitdocs/markdown_template.rb +20 -0
  15. data/lib/gitdocs/migration/001_create_shares.rb +13 -0
  16. data/lib/gitdocs/migration/002_add_remote_branch.rb +10 -0
  17. data/lib/gitdocs/migration/003_create_configs.rb +11 -0
  18. data/lib/gitdocs/migration/004_add_index_for_path.rb +10 -0
  19. data/lib/gitdocs/migration/005_add_start_web_frontend.rb +9 -0
  20. data/lib/gitdocs/migration/006_add_web_port_to_config.rb +9 -0
  21. data/lib/gitdocs/public/css/app.css +51 -0
  22. data/lib/gitdocs/public/css/bootstrap.css +356 -0
  23. data/lib/gitdocs/public/css/coderay.css +41 -0
  24. data/lib/gitdocs/public/css/tilt.css +82 -0
  25. data/lib/gitdocs/public/img/error.png +0 -0
  26. data/lib/gitdocs/public/img/file.png +0 -0
  27. data/lib/gitdocs/public/img/folder.png +0 -0
  28. data/lib/gitdocs/public/img/git_logo.png +0 -0
  29. data/lib/gitdocs/public/img/info.png +0 -0
  30. data/lib/gitdocs/public/img/ok.png +0 -0
  31. data/lib/gitdocs/public/img/warning.png +0 -0
  32. data/lib/gitdocs/public/js/ace/ace-compat.js +1 -0
  33. data/lib/gitdocs/public/js/ace/ace-uncompressed.js +14202 -0
  34. data/lib/gitdocs/public/js/ace/ace.js +1 -0
  35. data/lib/gitdocs/public/js/ace/keybinding-emacs.js +1 -0
  36. data/lib/gitdocs/public/js/ace/keybinding-vim.js +1 -0
  37. data/lib/gitdocs/public/js/ace/mode-coffee.js +1 -0
  38. data/lib/gitdocs/public/js/ace/mode-css.js +1 -0
  39. data/lib/gitdocs/public/js/ace/mode-html.js +1 -0
  40. data/lib/gitdocs/public/js/ace/mode-javascript.js +1 -0
  41. data/lib/gitdocs/public/js/ace/mode-json.js +1 -0
  42. data/lib/gitdocs/public/js/ace/mode-lua.js +1 -0
  43. data/lib/gitdocs/public/js/ace/mode-markdown.js +1 -0
  44. data/lib/gitdocs/public/js/ace/mode-php.js +1 -0
  45. data/lib/gitdocs/public/js/ace/mode-python.js +1 -0
  46. data/lib/gitdocs/public/js/ace/mode-ruby.js +1 -0
  47. data/lib/gitdocs/public/js/ace/mode-scala.js +1 -0
  48. data/lib/gitdocs/public/js/ace/mode-scss.js +1 -0
  49. data/lib/gitdocs/public/js/ace/mode-sql.js +1 -0
  50. data/lib/gitdocs/public/js/ace/mode-svg.js +1 -0
  51. data/lib/gitdocs/public/js/ace/mode-textile.js +1 -0
  52. data/lib/gitdocs/public/js/ace/mode-xml.js +1 -0
  53. data/lib/gitdocs/public/js/ace/theme-tomorrow.js +1 -0
  54. data/lib/gitdocs/public/js/ace/theme-tomorrow_night.js +1 -0
  55. data/lib/gitdocs/public/js/ace/theme-tomorrow_night_blue.js +1 -0
  56. data/lib/gitdocs/public/js/ace/theme-twilight.js +1 -0
  57. data/lib/gitdocs/public/js/ace/theme-vibrant_ink.js +1 -0
  58. data/lib/gitdocs/public/js/ace/worker-coffee.js +7041 -0
  59. data/lib/gitdocs/public/js/ace/worker-css.js +9525 -0
  60. data/lib/gitdocs/public/js/ace/worker-javascript.js +9739 -0
  61. data/lib/gitdocs/public/js/app.js +107 -0
  62. data/lib/gitdocs/public/js/bootstrap-alerts.js +113 -0
  63. data/lib/gitdocs/public/js/edit.js +30 -0
  64. data/lib/gitdocs/public/js/jquery.js +4 -0
  65. data/lib/gitdocs/public/js/jquery.tablesorter.js +4 -0
  66. data/lib/gitdocs/public/js/search.js +13 -0
  67. data/lib/gitdocs/public/js/settings.js +25 -0
  68. data/lib/gitdocs/public/js/util.js +145 -0
  69. data/lib/gitdocs/runner.rb +259 -0
  70. data/lib/gitdocs/server.rb +154 -0
  71. data/lib/gitdocs/version.rb +3 -0
  72. data/lib/gitdocs/views/_ace_scripts.erb +8 -0
  73. data/lib/gitdocs/views/_header.haml +14 -0
  74. data/lib/gitdocs/views/app.haml +40 -0
  75. data/lib/gitdocs/views/dir.haml +43 -0
  76. data/lib/gitdocs/views/edit.haml +15 -0
  77. data/lib/gitdocs/views/file.haml +8 -0
  78. data/lib/gitdocs/views/home.haml +10 -0
  79. data/lib/gitdocs/views/revisions.haml +28 -0
  80. data/lib/gitdocs/views/search.haml +16 -0
  81. data/lib/gitdocs/views/settings.haml +55 -0
  82. data/lib/gitdocs.rb +37 -0
  83. data/lib/img/icon.png +0 -0
  84. data/test/configuration_test.rb +39 -0
  85. data/test/runner_test.rb +25 -0
  86. data/test/test_helper.rb +54 -0
  87. metadata +370 -0
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .DS_Store
data/CHANGELOG ADDED
@@ -0,0 +1,79 @@
1
+ 0.4.15 (Unreleased)
2
+
3
+ * Adds a 'new directory' function to front-end [thanks Kale Worsley]
4
+ * Change 'New file' function to actually create a blank file [thanks Kale Worsley]
5
+
6
+ 0.4.14 (1/14/2012)
7
+
8
+ * Change file modes into tab style [thanks Kale Worsley]
9
+ * Add ability to revert a file to a previous revision [thanks Kale Worsley]
10
+ * Add optional git commit message field to edit form [thanks Kale Worsley]
11
+
12
+ 0.4.13 (1/11/2012)
13
+
14
+ * Redirect to first share if there's only one
15
+ * Render inline README for a directory
16
+ * Front-end now lists folder sizes in directory listing [Thanks evan tatarka]
17
+
18
+ 0.4.12 (1/05/2012)
19
+
20
+ * Fixes incorrect padding style on rendered code blocks (thanks chris kempson)
21
+ * Fixes encoding issues in markdown files
22
+ * Tag documents as utf-8 in meta for web frontend (thanks chris kempson)
23
+
24
+ 0.4.11 (1/04/2012)
25
+
26
+ * Add line-height to code blocks in file displays
27
+ * Fixes various browser inconsistencies (thanks evan tatarka)
28
+
29
+ 0.4.10 (12/30/2011)
30
+
31
+ * View revision history on the web front-end!
32
+
33
+ 0.4.9 (12/30/2011)
34
+
35
+ * Adds configuration for web port in settings
36
+ * Adds support for 'add' and 'remove' shares in settings
37
+
38
+ 0.4.8 (12/29/2011)
39
+
40
+ * Only encode to utf-8 on ruby 1.9.x
41
+ * Fixes so that settings form on the web front-end saves
42
+ * Cleanup the front-end directory listing significantly
43
+ * More robust EM reactor loop handling
44
+
45
+ 0.4.7 (12/15/2011)
46
+
47
+ * Re-throw exceptions from reactor loop
48
+ * Socket testing moved to defer block
49
+
50
+ 0.4.5, 0.4.6 (12/14/2011)
51
+
52
+ * Enables logs in ~/.gitdocs/log for easier debugging
53
+ * Fix issue with default sort order on web interface
54
+ * Fixes major mime type detection issues
55
+ * Fixes rendering issues
56
+
57
+ 0.4.4 (12/14/2011)
58
+
59
+ * Lock to eventmachine 1.0
60
+ * Use mime-types over file for better platform support
61
+ * Remove signal handling and just leverage EM start/stop
62
+ * Adds table sorting and file+folder icons in web front-end
63
+
64
+ 0.4.3 (12/13/2011)
65
+
66
+ * Javascript fixes for front-end
67
+
68
+ 0.4.2 (12/13/2011)
69
+
70
+ * Fixes search on blank results case
71
+
72
+ 0.4.1 (12/13/2011)
73
+
74
+ * Adds a basic search to web front-end
75
+ * Beginning of the work towards cross-platform notifications
76
+
77
+
78
+
79
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in gitdocs.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 GoMiso, Inc
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,192 @@
1
+ # Gitdocs
2
+
3
+ Open-source dropbox alternative powered by git. Collaborate on files and tasks without any extra hassle.
4
+ gitdocs will automatically keep everyone's repos in sync by pushing and pulling changes.
5
+ This allows any git repo to be used as a collaborative task list, file share, or wiki for a team.
6
+ Supports a web front-end allowing each repo to be accessed through your browser.
7
+
8
+ **Note:** Gitdocs has been tested on multiple unix systems including Mac OS X and Ubuntu.
9
+ Windows support is [half-baked](https://github.com/bazaarlabs/gitdocs/issues/7)
10
+ but we plan to tackle that shortly in an upcoming release.
11
+
12
+ ## Why?
13
+
14
+ Why use gitdocs for your file and doc sharing needs?
15
+
16
+ * **Open** - gitdocs is entirely open-source under the MIT license
17
+ * **Simple** - gitdocs is the simplest thing that works in both setup and usage
18
+ * **Secure** - gitdocs leverages git (and existing providers like github) to store your data safely.
19
+ * **Versatile** - share task lists, code snippets, images, files or just use it as a wiki (with our web front-end).
20
+ * **Portable** - access your files on any client that can use git.
21
+
22
+ The best part is that getting started using this project is quick and simple.
23
+
24
+ ## Quick Start
25
+
26
+ Gitdocs monitors any number of directories for changes and keeps them automatically synced. You can either add
27
+ existing git directories to be watched or have gitdocs pull down a repository for you.
28
+
29
+ There are plenty of great git hosting providers to safely store your data and you can trust the data is stored securely.
30
+ If you want a private repo to use with gitdocs, we recommend you check out [BitBucket](https://bitbucket.org/) which
31
+ provides free private git repos after registration.
32
+
33
+ To get started with gitdocs and a secure private bitbucket repo:
34
+
35
+ - `gem install gitdocs`
36
+ - `gitdocs start`
37
+ - Login to [BitBucket](https://bitbucket.org/) and add a new private repo named 'docs'
38
+ - Setup your SSH Key under [Account](https://bitbucket.org/account/) for ssh access
39
+ - `gitdocs create ~/Documents/gitdocs git@bitbucket.org:username/docs.git`
40
+
41
+ There you go! Now just start adding and editing files within the directory and they will be automatically
42
+ synchronized across all gitdocs-enabled clients.
43
+
44
+ ## Installation
45
+
46
+ Requires ruby and rubygems. Install as a gem:
47
+
48
+ ```
49
+ gem install gitdocs
50
+ ```
51
+
52
+ If you have Growl installed on Max OSX, you'll probably want to run:
53
+
54
+ ```
55
+ brew install growlnotify
56
+ ```
57
+
58
+ to enable Growl notification support.
59
+
60
+ ## Usage
61
+
62
+ ### Starting Gitdocs
63
+
64
+ You need to start gitdocs in order for the monitoring to work:
65
+
66
+ ```
67
+ gitdocs start
68
+ ```
69
+
70
+ If the start command fails, you can check the logs in `~/.gitdocs/log` or run again with the debug flag:
71
+
72
+ ```
73
+ gitdocs start -D
74
+ ```
75
+
76
+ Once gitdocs has been started and is monitoring the correct directories, simply start editing or adding files to your
77
+ designated git repos and changes will be automatically pushed. Gitdocs can be easily stopped or restarted:
78
+
79
+ ```
80
+ gitdocs stop
81
+ gitdocs restart
82
+ ```
83
+
84
+ For an overview of gitdocs current status, run:
85
+
86
+ ```
87
+ gitdocs status
88
+ ```
89
+
90
+ ### Monitoring Shares
91
+
92
+ You can add existing folders to watch:
93
+
94
+ ```
95
+ gitdocs add my/path/to/watch
96
+ ```
97
+
98
+ or instruct gitdocs to fetch a remote share and keep it synced with:
99
+
100
+ ```
101
+ gitdocs create local/path/for/repo git@github.com:user/some/remote/repo.git
102
+ ```
103
+
104
+ This will clone the remote repo and begin monitoring the local path. You can remove and clear monitored paths as well:
105
+
106
+ ```
107
+ gitdocs rm my/path/to/watch
108
+ gitdocs clear
109
+ ```
110
+
111
+ ### Web Front-end
112
+
113
+ Gitdocs come with a handy web front-end that is available.
114
+
115
+ <a href="http://i.imgur.com/IMwqN.png">
116
+ <img src="http://i.imgur.com/IMwqN.png" width="250" />
117
+ </a>
118
+ <a href="http://i.imgur.com/0wVyB.png">
119
+ <img src="http://i.imgur.com/0wVyB.png" width="250" />
120
+ </a>
121
+ <a href="http://i.imgur.com/Ijyo9.png">
122
+ <img src="http://i.imgur.com/Ijyo9.png" width="250" />
123
+ </a>
124
+
125
+ This browser front-end supports the following features:
126
+
127
+ * Explore the files within all your shares
128
+ * View revision history for every file in your share
129
+ * Revert a file to any previous state in the file's history
130
+ * View source files in your shares with code syntax highlighting
131
+ * View text files in your shares with smart formatting (markdown, textile)
132
+ * View any file in your shares that can be rendered inline (pdf, images, et al)
133
+ * Edit and update text files using a text editor
134
+ * Upload and create new files within your shares
135
+ * Manage share settings and other configuration options
136
+
137
+ To check out the front-end, simply visit `http://localhost:8888` whenever gitdocs is running.
138
+
139
+ ### Conflict Resolution
140
+
141
+ Proper conflict resolution is an important part of any good doc and file collaboration tool.
142
+ In most cases, git does a good job of handling file merges for you. Still, what about cases where the conflict cannot be
143
+ resolved automatically?
144
+
145
+ Don't worry, gitdocs makes handling this simple. In the event of a conflict,
146
+ **all the different versions of a document are stored** in the repo tagged with the **git sha** for each
147
+ committed version. The members of the repo can then compare all versions and resolve the conflict.
148
+
149
+ ## Gitdocs in Practice
150
+
151
+ At Miso, our team actually uses gitdocs in conjunction with Dropbox. We find Dropbox is ideal for galleries, videos,
152
+ and large binary files of all sorts. We use gitdocs for storing our actual "docs":
153
+ Task lists, wiki pages, planning docs, collaborative designs, notes, guides, code snippets, etc.
154
+
155
+ You will find that the gitdocs browser front-end is well suited for this usage scenario
156
+ since you can browse formatted wiki pages, view files with smart syntax highlighting,
157
+ edit files with a rich text editor, search all your files, as well as view individual file revision histories.
158
+
159
+ ## Planned Features
160
+
161
+ Gitdocs is a young project but we have many plans for it including:
162
+
163
+ - Better handling of large binary files circumventing known git limitations
164
+ - Click-to-share instant access granting file access to users using a local tunnel or other means.
165
+ - Tagging and organizing of files within the web front-end
166
+ - Better access to the versions for a particular file within the web front-end
167
+
168
+ ## Contributors
169
+
170
+ Gitdocs was created at [Miso](http://engineering.gomiso.com) by [Joshua Hull](https://github.com/joshbuddy) and [Nathan Esquenazi](https://github.com/nesquena).
171
+ We also have had several contributors:
172
+
173
+ * [Chris Kempson](https://github.com/ChrisKempson) - Encoding issues
174
+ * [Evan Tatarka](https://github.com/evant) - Front-end style fixes
175
+ * [Kale Worsley](https://github.com/kaleworsley) - Custom commit msgs, revert revisions, front-end cleanup
176
+
177
+ Gitdocs is still a young project with a lot of opportunity for contributions. Patches welcome!
178
+
179
+ ## Prior Projects
180
+
181
+ Gitdocs is a fresh project that we originally spiked on in a few days time. Our primary goals are to keep the code as simple as possible,
182
+ but provide the features that makes Dropbox great. If you are interested in other Dropbox alternatives, be sure to checkout our notes below:
183
+
184
+ * [SparkleShare](http://sparkleshare.org/) is an open source, self-hosted Dropbox alternative written using C# and the [Mono Project](http://www.mono-project.com/Main_Page).
185
+ More mature but has a lot of dependencies, and lacks some of the features planned in Gitdocs.
186
+ * [DVCS-Autosync](http://mayrhofer.eu.org/dvcs-autosync) is a project to create an open source replacement for Dropbox based on distributed version control systems.
187
+ Very similar project but again we have features planned that are out of scope (local tunnel file sharing, complete web ui for browsing, uploading and editing).
188
+ * [Lipsync](https://github.com/philcryer/lipsync) is another similar project. We haven't looked at this too closely, but thought we would mention it in this list.
189
+ * [bitpocket](https://github.com/sickill/bitpocket) is a project that uses rsync to synchronize data. Interesting concept, but
190
+ lacks revision history, author tracking, etc and we have features planned that are out of scope for this project
191
+
192
+ If any other open-source dropbox alternatives are available, we would love to hear about them so let us know!
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs.push "lib"
6
+ t.test_files = FileList[File.expand_path('../test/**/*_test.rb', __FILE__)]
7
+ t.verbose = true
8
+ end
data/bin/gitdocs ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'gitdocs'
4
+
5
+ Gitdocs::Cli.start(ARGV)
data/gitdocs.gemspec ADDED
@@ -0,0 +1,41 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "gitdocs/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "siuying-gitdocs"
7
+ s.version = Gitdocs::VERSION
8
+ s.authors = ["Josh Hull", "Nathan Esquenazi"]
9
+ s.email = ["joshbuddy@gmail.com", "nesquena@gmail.com"]
10
+ s.homepage = "https://github.com/siuying/gitdocs"
11
+ s.summary = %q{Open-source Dropbox using Ruby and Git (my fork with github favoured markdown support)}
12
+ s.description = %q{Open-source Dropbox using Ruby and Git (my fork with github favoured markdown support).}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_dependency 'joshbuddy-guard', '~> 0.10.0'
20
+ s.add_dependency 'thin', '~> 1.3.1'
21
+ s.add_dependency 'renee', '~> 0.3.7'
22
+ s.add_dependency 'redcarpet', '~> 2.0.0'
23
+ s.add_dependency 'thor', '~> 0.14.6'
24
+ s.add_dependency 'coderay', '~> 1.0.4'
25
+ s.add_dependency 'dante', '~> 0.1.2'
26
+ s.add_dependency 'growl', '~> 1.0.3'
27
+ s.add_dependency 'yajl-ruby', '~> 1.1.0'
28
+ s.add_dependency 'haml', '~> 3.1.4'
29
+ s.add_dependency 'sqlite3', "~> 1.3.4"
30
+ s.add_dependency 'activerecord', "~> 3.1.0"
31
+ s.add_dependency 'grit', "~> 2.4.1"
32
+ s.add_dependency 'shell_tools', "~> 0.1.0"
33
+ s.add_dependency 'mimetype-fu', "~> 0.1.2"
34
+ s.add_dependency 'eventmachine', '>= 1.0.0.beta.3'
35
+ s.add_dependency 'pygments.rb'
36
+
37
+ s.add_development_dependency 'minitest', "~> 2.6.1"
38
+ s.add_development_dependency 'rake'
39
+ s.add_development_dependency 'mocha'
40
+ s.add_development_dependency 'fakeweb'
41
+ end
@@ -0,0 +1,111 @@
1
+ module Gitdocs
2
+ require 'thor'
3
+
4
+ class Cli < Thor
5
+ include Thor::Actions
6
+
7
+ def self.source_root; File.expand_path('../../', __FILE__); end
8
+
9
+ desc "start", "Starts a daemonized gitdocs process"
10
+ method_option :debug, :type => :boolean, :aliases => "-D"
11
+ method_option :port, :type => :string, :aliases => "-p"
12
+ def start
13
+ if self.stopped? && !options[:debug]
14
+ self.runner.execute { Gitdocs.start(:port => options[:port]) }
15
+ self.running? ? say("Started gitdocs", :green) : say("Failed to start gitdocs", :red)
16
+ elsif self.stopped? && options[:debug]
17
+ say "Starting in debug mode", :yellow
18
+ Gitdocs.start(:debug => true, :port => options[:port])
19
+ else # already running
20
+ say "Gitdocs is already running, please use restart", :red
21
+ end
22
+ end
23
+
24
+ desc "stop", "Stops the gitdocs process"
25
+ def stop
26
+ if self.running?
27
+ self.runner.execute(:kill => true)
28
+ say "Stopped gitdocs", :red
29
+ else # not running
30
+ say "Gitdocs is not running", :red
31
+ end
32
+ end
33
+
34
+ desc "restart", "Restarts the gitdocs process"
35
+ def restart
36
+ self.stop
37
+ self.start
38
+ end
39
+
40
+ desc "add PATH", "Adds a path to gitdocs"
41
+ def add(path)
42
+ self.config.add_path(path)
43
+ say "Added path #{path} to doc list"
44
+ self.restart if self.running?
45
+ end
46
+
47
+ desc "rm PATH", "Removes a path from gitdocs"
48
+ def rm(path)
49
+ self.config.remove_path(path)
50
+ say "Removed path #{path} from doc list"
51
+ self.restart if self.running?
52
+ end
53
+
54
+ desc "clear", "Clears all paths from gitdocs"
55
+ def clear
56
+ self.config.clear
57
+ say "Cleared paths from gitdocs"
58
+ end
59
+
60
+ desc "create PATH REMOTE", "Creates a new gitdoc root based on an existing remote"
61
+ def create(path, remote)
62
+ FileUtils.mkdir_p(File.dirname(path))
63
+ system("git clone -q #{remote} #{ShellTools.escape(path)}") or raise "Unable to clone into #{path}"
64
+ self.add(path)
65
+ say "Created #{path} path for gitdoc"
66
+ end
67
+
68
+ desc "status", "Retrieve gitdocs status"
69
+ def status
70
+ say "GitDoc v#{VERSION}"
71
+ say "Running: #{self.running?}"
72
+ say "Watching paths:"
73
+ say self.config.shares.map { |s| " - #{s.path}" }.join("\n")
74
+ end
75
+
76
+ desc "config", "Configuration options for gitdocs"
77
+ def config
78
+ # TODO make this work
79
+ end
80
+
81
+ desc "help", "Prints out the help"
82
+ def help(task = nil, subcommand = false)
83
+ say "\nGitdocs: Collaborate with ease.\n\n"
84
+ task ? self.class.task_help(shell, task) : self.class.help(shell, subcommand)
85
+ end
86
+
87
+ # Helpers for thor
88
+ no_tasks do
89
+ def runner(options={})
90
+ Dante::Runner.new('gitdocs', options.merge(:debug => false, :daemonize => true, :pid_path => self.pid_path))
91
+ end
92
+
93
+ def config
94
+ @config ||= Configuration.new
95
+ end
96
+
97
+ def running?
98
+ self.runner.daemon_running?
99
+ end
100
+
101
+ def stopped?
102
+ self.runner.daemon_stopped?
103
+ end
104
+
105
+ def pid_path
106
+ "/tmp/gitdocs.pid"
107
+ end
108
+ end
109
+
110
+ end
111
+ end
@@ -0,0 +1,79 @@
1
+ require 'active_record'
2
+ require 'grit'
3
+
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
18
+
19
+ class Share < ActiveRecord::Base
20
+ attr_accessible :polling_interval, :path, :notification, :branch_name, :remote_name
21
+
22
+ def available_remotes
23
+ repo = Grit::Repo.new(path)
24
+ repo.remotes.map{|r| r.name}
25
+ rescue
26
+ nil
27
+ end
28
+
29
+ def available_branches
30
+ repo = Grit::Repo.new(path)
31
+ repo.heads.map{|r| r.name}
32
+ rescue
33
+ nil
34
+ end
35
+ end
36
+
37
+ class Config < ActiveRecord::Base
38
+ attr_accessible :load_browser_on_startup, :start_web_frontend, :web_frontend_port
39
+ end
40
+
41
+ def add_path(path, opts = nil)
42
+ path = self.normalize_path(path)
43
+ path_opts = {:path => path}
44
+ path_opts.merge!(opts) if opts
45
+ Share.new(path_opts).save!
46
+ end
47
+
48
+ def remove_path(path)
49
+ path = self.normalize_path(path)
50
+ Share.where(:path => path).destroy_all
51
+ end
52
+
53
+ def clear
54
+ Share.destroy_all
55
+ end
56
+
57
+ def shares
58
+ Share.all
59
+ end
60
+
61
+ def global
62
+ raise if Config.all.size > 1
63
+ Config.create! if Config.all.empty?
64
+ Config.all.first
65
+ end
66
+
67
+ def normalize_path(path)
68
+ File.expand_path(path, Dir.pwd)
69
+ end
70
+
71
+ private
72
+ def import_old_shares
73
+ full_path = File.expand_path('paths', config_root)
74
+ if File.exist?(full_path)
75
+ File.read(full_path).split("\n").each { |path| Share.find_or_create_by_path(path) }
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,23 @@
1
+ module Gitdocs
2
+ class Docfile
3
+ attr_accessor :parent
4
+ attr_reader :path, :name
5
+
6
+ def initialize(path)
7
+ @path = path
8
+ @parent = File.dirname(path)
9
+ @name = File.basename(path)
10
+ end
11
+
12
+ # within?("parent", "/root/path") => "/root/path/parent"
13
+ def within?(dir, root)
14
+ expanded_root = File.expand_path(dir, root)
15
+ File.expand_path(@parent, root) == expanded_root ||
16
+ File.expand_path(@path, root).include?(expanded_root)
17
+ end
18
+
19
+ def dir?
20
+ File.directory?(@path)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,96 @@
1
+ module Gitdocs
2
+ Restart = Class.new(RuntimeError)
3
+
4
+ class Manager
5
+ attr_reader :config, :debug
6
+
7
+ def initialize(config_root, debug)
8
+ @config = Configuration.new(config_root)
9
+ @logger = Logger.new(File.expand_path('log', @config.config_root))
10
+ @debug = debug
11
+ yield @config if block_given?
12
+ end
13
+
14
+ RepoDescriptor = Struct.new(:name, :index)
15
+
16
+ def search(term)
17
+ results = {}
18
+ @runners.each_with_index do |runner, index|
19
+ descriptor = RepoDescriptor.new(runner.root, index)
20
+ repo_results = runner.search(term)
21
+ results[descriptor] = repo_results unless repo_results.empty?
22
+ end
23
+ results
24
+ end
25
+
26
+ def start(web_port=nil)
27
+ self.log "Starting Gitdocs v#{VERSION}..."
28
+ self.log "Using configuration root: '#{self.config.config_root}'"
29
+ self.log "Shares: #{config.shares.map(&:inspect).join(", ")}"
30
+ # Start the repo watchers
31
+ runners = nil
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
+ web_port ||= self.config.global.web_frontend_port
45
+ Server.new(self, *@runners).start(web_port.to_i)
46
+ EM.defer( proc {
47
+ i = 0
48
+ web_started = false
49
+ begin
50
+ TCPSocket.open('127.0.0.1', web_port.to_i).close
51
+ web_started = true
52
+ rescue Errno::ECONNREFUSED
53
+ self.log "Retrying server loop..."
54
+ sleep 0.2
55
+ i += 1
56
+ retry if i <= 20
57
+ end
58
+ system("open http://localhost:#{web_port}/") if !retrying && self.config.global.load_browser_on_startup && web_started
59
+ }, proc {
60
+ self.log "Web server running!"
61
+ })
62
+ end
63
+ end
64
+ rescue Restart
65
+ retrying = true
66
+ retry
67
+ end
68
+ rescue Exception => e # Report all errors in log
69
+ self.log(e.class.inspect + " - " + e.inspect + " - " + e.message.inspect, :error)
70
+ self.log(e.backtrace.join("\n"), :error)
71
+ raise
72
+ ensure
73
+ self.log("Gitdocs is terminating...goodbye\n\n")
74
+ end
75
+
76
+ def restart
77
+ Thread.new do
78
+ Thread.main.raise Restart, "restarting ... "
79
+ sleep 0.1 while EM.reactor_running?
80
+ start
81
+ end
82
+ end
83
+
84
+ def stop
85
+ EM.stop
86
+ end
87
+
88
+ protected
89
+
90
+ # Logs and outputs to file or stdout based on debugging state
91
+ # log("message")
92
+ def log(msg, level=:info)
93
+ @debug ? puts(msg) : @logger.send(level, msg)
94
+ end
95
+ end
96
+ end