gitdocs 0.2.0 → 0.3.0
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.
- data/README.md +1 -0
- data/gitdocs.gemspec +3 -0
- data/lib/gitdocs/cli.rb +2 -2
- data/lib/gitdocs/configuration.rb +25 -29
- data/lib/gitdocs/migration/001_create_shares.rb +13 -0
- data/lib/gitdocs/migration/002_add_remote_branch.rb +10 -0
- data/lib/gitdocs/public/css/app.css +48 -16
- data/lib/gitdocs/public/css/coderay.css +41 -0
- data/lib/gitdocs/public/css/tilt.css +81 -0
- data/lib/gitdocs/public/img/git_logo.png +0 -0
- data/lib/gitdocs/public/js/ace/ace-compat.js +1 -0
- data/lib/gitdocs/public/js/ace/ace-uncompressed.js +14202 -0
- data/lib/gitdocs/public/js/ace/ace.js +1 -0
- data/lib/gitdocs/public/js/ace/keybinding-emacs.js +1 -0
- data/lib/gitdocs/public/js/ace/keybinding-vim.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-coffee.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-css.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-html.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-javascript.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-json.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-lua.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-markdown.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-php.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-python.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-ruby.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-scala.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-scss.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-sql.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-svg.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-textile.js +1 -0
- data/lib/gitdocs/public/js/ace/mode-xml.js +1 -0
- data/lib/gitdocs/public/js/ace/theme-tomorrow.js +1 -0
- data/lib/gitdocs/public/js/ace/theme-tomorrow_night.js +1 -0
- data/lib/gitdocs/public/js/ace/theme-tomorrow_night_blue.js +1 -0
- data/lib/gitdocs/public/js/ace/theme-twilight.js +1 -0
- data/lib/gitdocs/public/js/ace/theme-vibrant_ink.js +1 -0
- data/lib/gitdocs/public/js/ace/worker-coffee.js +7041 -0
- data/lib/gitdocs/public/js/ace/worker-css.js +9525 -0
- data/lib/gitdocs/public/js/ace/worker-javascript.js +9739 -0
- data/lib/gitdocs/public/js/app.js +26 -0
- data/lib/gitdocs/public/js/edit.js +30 -0
- data/lib/gitdocs/public/js/jquery.js +4 -0
- data/lib/gitdocs/public/js/util.js +17 -0
- data/lib/gitdocs/runner.rb +16 -9
- data/lib/gitdocs/server.rb +46 -8
- data/lib/gitdocs/version.rb +1 -1
- data/lib/gitdocs/views/app.haml +14 -0
- data/lib/gitdocs/views/dir.haml +14 -5
- data/lib/gitdocs/views/edit.haml +32 -0
- data/lib/gitdocs/views/file.haml +7 -7
- data/lib/gitdocs/views/home.haml +1 -1
- data/lib/gitdocs/views/settings.haml +34 -0
- data/lib/gitdocs.rb +5 -5
- data/test/configuration_test.rb +6 -6
- data/test/test_helper.rb +13 -6
- metadata +193 -122
data/README.md
CHANGED
@@ -128,6 +128,7 @@ Gitdocs is a young project but we have big plans for it including:
|
|
128
128
|
- Local-area peer-to-peer syncing, avoid 'polling' in cases where we can using a messaging protocol.
|
129
129
|
- Click-to-share instant access granting file access to users using a local tunnel or other means.
|
130
130
|
- Support for linux and windows platforms (coming soon), and maybe android and iOS as well?
|
131
|
+
- Indexing and full-text search for all documents in a repo
|
131
132
|
|
132
133
|
## Prior Projects
|
133
134
|
|
data/gitdocs.gemspec
CHANGED
@@ -23,10 +23,13 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_dependency 'renee', '~> 0.3.6'
|
24
24
|
s.add_dependency 'redcarpet'
|
25
25
|
s.add_dependency 'thor'
|
26
|
+
s.add_dependency 'coderay'
|
26
27
|
s.add_dependency 'dante', '~> 0.0.4'
|
27
28
|
s.add_dependency 'growl', '~> 1.0.3'
|
28
29
|
s.add_dependency 'yajl-ruby'
|
29
30
|
s.add_dependency 'haml'
|
31
|
+
s.add_dependency 'sqlite3', "~> 1.3.4"
|
32
|
+
s.add_dependency 'activerecord', "~> 3.1.0"
|
30
33
|
|
31
34
|
s.add_development_dependency 'minitest', "~> 2.6.1"
|
32
35
|
s.add_development_dependency 'rake'
|
data/lib/gitdocs/cli.rb
CHANGED
@@ -64,7 +64,7 @@ module Gitdocs
|
|
64
64
|
FileUtils.mkdir_p(File.dirname(path))
|
65
65
|
system("git clone -q #{remote} #{path}") or raise "Unable to clone into #{path}"
|
66
66
|
self.add(path)
|
67
|
-
say "Created
|
67
|
+
say "Created #{path} path for gitdoc"
|
68
68
|
end
|
69
69
|
|
70
70
|
desc "status", "Retrieve gitdocs status"
|
@@ -72,7 +72,7 @@ module Gitdocs
|
|
72
72
|
say "GitDoc v#{VERSION}"
|
73
73
|
say "Running: #{self.running?}"
|
74
74
|
say "Watching paths:"
|
75
|
-
say self.config.
|
75
|
+
say self.config.shares.map { |s| " - #{s.path}" }.join("\n")
|
76
76
|
end
|
77
77
|
|
78
78
|
desc "config", "Configuration options for gitdocs"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
1
3
|
module Gitdocs
|
2
4
|
class Configuration
|
3
5
|
attr_reader :config_root
|
@@ -5,48 +7,42 @@ module Gitdocs
|
|
5
7
|
def initialize(config_root = nil)
|
6
8
|
@config_root = config_root || File.expand_path(".gitdocs", ENV["HOME"])
|
7
9
|
FileUtils.mkdir_p(@config_root)
|
10
|
+
ActiveRecord::Base.establish_connection(
|
11
|
+
:adapter => 'sqlite3',
|
12
|
+
:database => ENV["TEST"] ? ':memory:' : File.join(@config_root, 'config.db')
|
13
|
+
)
|
14
|
+
ActiveRecord::Migrator.migrate(File.expand_path("../migration", __FILE__))
|
15
|
+
import_old_shares unless ENV["TEST"]
|
8
16
|
end
|
9
17
|
|
10
|
-
|
11
|
-
|
12
|
-
self.read_file('paths').split("\n")
|
18
|
+
class Share < ActiveRecord::Base
|
19
|
+
attr_accessible :polling_interval, :path, :notification, :branch_name, :remote_name
|
13
20
|
end
|
14
21
|
|
15
|
-
def
|
16
|
-
|
22
|
+
def add_path(path, opts = nil)
|
23
|
+
path_opts = {:path => path}
|
24
|
+
path_opts.merge!(opts) if opts
|
25
|
+
Share.new(path_opts).save!
|
17
26
|
end
|
18
27
|
|
19
|
-
|
20
|
-
|
21
|
-
path = normalize_path(path)
|
22
|
-
self.paths += [path]
|
23
|
-
path
|
28
|
+
def remove_path(path)
|
29
|
+
Share.where(:path => path).destroy_all
|
24
30
|
end
|
25
31
|
|
26
|
-
|
27
|
-
|
28
|
-
path = normalize_path(path)
|
29
|
-
self.paths -= [path]
|
30
|
-
path
|
32
|
+
def shares
|
33
|
+
Share.all
|
31
34
|
end
|
32
35
|
|
33
36
|
def normalize_path(path)
|
34
37
|
File.expand_path(path, Dir.pwd)
|
35
38
|
end
|
36
39
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
File.exist?(full_path) ? File.read(full_path) : ''
|
44
|
-
end
|
45
|
-
|
46
|
-
# Writes configuration file
|
47
|
-
# @config.write_file('paths', '...')
|
48
|
-
def write_file(name, content)
|
49
|
-
File.open(File.expand_path(name, @config_root), 'w') { |f| f.puts content }
|
40
|
+
private
|
41
|
+
def import_old_shares
|
42
|
+
full_path = File.expand_path('paths', config_root)
|
43
|
+
if File.exist?(full_path)
|
44
|
+
File.read(full_path).split("\n").each { |path| Share.find_or_create_by_path(path) }
|
45
|
+
end
|
50
46
|
end
|
51
47
|
end
|
52
|
-
end
|
48
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateShares < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :shares do |t|
|
4
|
+
t.column :path, :string
|
5
|
+
t.column :polling_interval, :double, :default => 15
|
6
|
+
t.column :notification, :boolean, :default => true
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.down
|
11
|
+
raise
|
12
|
+
end
|
13
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
body {
|
2
2
|
margin-left: 20%;
|
3
3
|
margin-right: 20%;
|
4
|
-
font-family: Arial, Verdana;
|
4
|
+
font-family: Helvetica, Arial, Verdana;
|
5
5
|
}
|
6
6
|
|
7
7
|
body h1, h2 {
|
@@ -9,11 +9,46 @@ body h1, h2 {
|
|
9
9
|
padding-bottom: 0.8em;
|
10
10
|
font-weight: bold;
|
11
11
|
}
|
12
|
-
|
12
|
+
|
13
|
+
body h1 { font-size: 1.8em; }
|
13
14
|
body h2 { font-size: 1.5em; margin-top: 0.2em; }
|
14
15
|
|
16
|
+
.nav h1 {
|
17
|
+
text-align: center;
|
18
|
+
}
|
19
|
+
|
20
|
+
.nav h1 a {
|
21
|
+
text-decoration: none;
|
22
|
+
color: black;
|
23
|
+
}
|
24
|
+
|
25
|
+
.nav h1 a:hover {
|
26
|
+
text-decoration: none;
|
27
|
+
}
|
28
|
+
|
29
|
+
.menu {
|
30
|
+
margin-top :10px;
|
31
|
+
display: absolute;
|
32
|
+
float:right;
|
33
|
+
}
|
34
|
+
|
35
|
+
div.share {
|
36
|
+
border-color: #000000;
|
37
|
+
border-radius: 7px;
|
38
|
+
padding: 2em;
|
39
|
+
margin-top: 1.2em;
|
40
|
+
}
|
41
|
+
|
42
|
+
div.share.even {
|
43
|
+
background: #FEFBAA;
|
44
|
+
}
|
45
|
+
|
46
|
+
div.share input {
|
47
|
+
width :100%;
|
48
|
+
}
|
49
|
+
|
15
50
|
body .container {
|
16
|
-
min-width:
|
51
|
+
min-width: 700px;
|
17
52
|
background: #FCEA97;
|
18
53
|
border-style: solid;
|
19
54
|
border-width: 5px;
|
@@ -23,24 +58,21 @@ body .container {
|
|
23
58
|
margin-top: 1.2em;
|
24
59
|
}
|
25
60
|
|
26
|
-
body a { text-decoration: none; color:
|
61
|
+
body a { text-decoration: none; color: #33e; }
|
27
62
|
body a:hover { text-decoration: underline; }
|
28
63
|
|
29
|
-
body
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
margin: 0;
|
35
|
-
font-family: ;
|
64
|
+
body #editor {
|
65
|
+
position: relative;
|
66
|
+
width: 700px;
|
67
|
+
height: 600px;
|
68
|
+
margin-bottom: 1em;
|
36
69
|
}
|
37
70
|
|
38
|
-
body .
|
39
|
-
|
40
|
-
padding-bottom: 0.8em;
|
71
|
+
body form.upload, form.add {
|
72
|
+
padding-top: 1.4em;
|
41
73
|
}
|
42
74
|
|
43
|
-
body .
|
44
|
-
font-size: 1.4em;
|
75
|
+
body form.upload p, form.add p {
|
45
76
|
padding-bottom: 0.6em;
|
77
|
+
font-weight: bold;
|
46
78
|
}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
pre.CodeRay {
|
2
|
+
border: 1px black solid;
|
3
|
+
background-color: #1d1f21;
|
4
|
+
color: #c5c8c6;
|
5
|
+
padding: 5px;
|
6
|
+
-webkit-border-radius: 4px;
|
7
|
+
-moz-border-radius: 4px;
|
8
|
+
overflow: auto;
|
9
|
+
font-size: 12px;
|
10
|
+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Droid Sans Mono', 'Courier New', monospace;
|
11
|
+
}
|
12
|
+
|
13
|
+
pre.CodeRay .string {
|
14
|
+
color: #b5bd68;
|
15
|
+
}
|
16
|
+
|
17
|
+
pre.CodeRay .constant, .predefined-constant {
|
18
|
+
color: #cc6666;
|
19
|
+
}
|
20
|
+
|
21
|
+
pre.CodeRay .instance-variable, pre.CodeRay .class {
|
22
|
+
color: #cc6666;
|
23
|
+
|
24
|
+
}
|
25
|
+
|
26
|
+
pre.CodeRay .keyword {
|
27
|
+
color: #b294bb;
|
28
|
+
}
|
29
|
+
|
30
|
+
pre.CodeRay .symbol {
|
31
|
+
color: #b5bd68;
|
32
|
+
}
|
33
|
+
|
34
|
+
pre.CodeRay .integer {
|
35
|
+
color: #f77;
|
36
|
+
|
37
|
+
}
|
38
|
+
|
39
|
+
pre.CodeRay .comment {
|
40
|
+
color: #969896;
|
41
|
+
}
|
@@ -0,0 +1,81 @@
|
|
1
|
+
body .contents .tilt {
|
2
|
+
overflow: auto;
|
3
|
+
background-color: #F8F8F8;
|
4
|
+
padding: 1.2em;
|
5
|
+
border: 3px solid #EFEFEF;
|
6
|
+
margin: 0;
|
7
|
+
font-family: helvetica, arial, freesans, clean, sans-serif;
|
8
|
+
}
|
9
|
+
|
10
|
+
.tilt strong { font-weight: bold; }
|
11
|
+
.tilt em { font-style: italic; }
|
12
|
+
|
13
|
+
.tilt pre {
|
14
|
+
background-color: #eee;
|
15
|
+
padding: 10px;
|
16
|
+
-webkit-border-radius: 5px;
|
17
|
+
-moz-border-radius: 5px;
|
18
|
+
border-radius: 5px;
|
19
|
+
overflow: auto;
|
20
|
+
}
|
21
|
+
|
22
|
+
.tilt code {
|
23
|
+
background-color: #eee;
|
24
|
+
padding: 1px 3px;
|
25
|
+
-webkit-border-radius: 4px;
|
26
|
+
-moz-border-radius: 4px;
|
27
|
+
border-radius: 4px;
|
28
|
+
font-family: monospace;
|
29
|
+
}
|
30
|
+
|
31
|
+
.tilt p { padding-bottom: 0.5em; }
|
32
|
+
|
33
|
+
.tilt ul {
|
34
|
+
margin: 1em 2em 1em 0;
|
35
|
+
margin-left: 2em;
|
36
|
+
}
|
37
|
+
|
38
|
+
.tilt li p {
|
39
|
+
margin: 0.3em;
|
40
|
+
}
|
41
|
+
|
42
|
+
.tilt li {
|
43
|
+
list-style-type: square;
|
44
|
+
}
|
45
|
+
|
46
|
+
.tilt a:link, .tilt a:visited{
|
47
|
+
color: #33e;
|
48
|
+
text-decoration: none;
|
49
|
+
}
|
50
|
+
|
51
|
+
.tilt a:hover{
|
52
|
+
color: #00f;
|
53
|
+
text-shadow:1px 1px 2px #ccf;
|
54
|
+
text-decoration:underline;
|
55
|
+
}
|
56
|
+
|
57
|
+
.tilt h1 {
|
58
|
+
font-size: 1.8em;
|
59
|
+
padding-bottom: 0.6em;
|
60
|
+
margin-bottom: 0;
|
61
|
+
font-weight: bold;
|
62
|
+
}
|
63
|
+
|
64
|
+
.tilt h2 {
|
65
|
+
font-size: 1.4em;
|
66
|
+
border-bottom: 1px dotted #aaa;
|
67
|
+
margin-bottom: 1em;
|
68
|
+
padding-bottom: 0;
|
69
|
+
color: #333;
|
70
|
+
}
|
71
|
+
|
72
|
+
.tilt h3 {
|
73
|
+
color: #666;
|
74
|
+
padding-bottom: 0.4em;
|
75
|
+
}
|
76
|
+
|
77
|
+
.tilt .shadow {
|
78
|
+
-webkit-box-shadow:0 5px 15px #000;
|
79
|
+
-moz-box-shadow:0 5px 15px #000;
|
80
|
+
box-shadow:0 5px 15px #000;
|
81
|
+
}
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
define(function(a,b,c){a("pilot/browser_focus"),a("pilot/dom"),a("pilot/event"),a("pilot/event_emitter"),a("pilot/fixoldbrowsers"),a("pilot/keys"),a("pilot/lang"),a("pilot/oop"),a("pilot/useragent"),a("pilot/canon")}),define(function(a,b,c){console.warn("DEPRECATED: 'pilot/browser_focus' is deprecated. Use 'ace/lib/browser_focus' instead"),c.exports=a("ace/lib/browser_focus")}),define(function(a,b,c){console.warn("DEPRECATED: 'pilot/dom' is deprecated. Use 'ace/lib/dom' instead"),c.exports=a("ace/lib/dom")}),define(function(a,b,c){console.warn("DEPRECATED: 'pilot/event' is deprecated. Use 'ace/lib/event' instead"),c.exports=a("ace/lib/event")}),define(function(a,b,c){console.warn("DEPRECATED: 'pilot/event_emitter' is deprecated. Use 'ace/lib/event_emitter' instead"),c.exports=a("ace/lib/event_emitter")}),define(function(a,b,c){console.warn("DEPRECATED: 'pilot/fixoldbrowsers' is deprecated. Use 'ace/lib/fixoldbrowsers' instead"),c.exports=a("ace/lib/fixoldbrowsers")}),define(function(a,b,c){console.warn("DEPRECATED: 'pilot/keys' is deprecated. Use 'ace/lib/keys' instead"),c.exports=a("ace/lib/keys")}),define(function(a,b,c){console.warn("DEPRECATED: 'pilot/lang' is deprecated. Use 'ace/lib/lang' instead"),c.exports=a("ace/lib/lang")}),define(function(a,b,c){console.warn("DEPRECATED: 'pilot/oop' is deprecated. Use 'ace/lib/oop' instead"),c.exports=a("ace/lib/oop")}),define(function(a,b,c){console.warn("DEPRECATED: 'pilot/useragent' is deprecated. Use 'ace/lib/useragent' instead"),c.exports=a("ace/lib/useragent")}),define(function(a,b,c){console.warn("DEPRECATED: 'pilot/canon' is deprecated."),b.addCommand=function(){console.warn("DEPRECATED: 'canon.addCommand()' is deprecated. Use 'editor.commands.addCommand(command)' instead."),console.trace()},b.removeCommand=function(){console.warn("DEPRECATED: 'canon.removeCommand()' is deprecated. Use 'editor.commands.removeCommand(command)' instead."),console.trace()}})
|