tendersync 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +13 -0
- data/Manifest +27 -0
- data/README.md +157 -0
- data/Rakefile +40 -0
- data/bin/tendersync +14 -0
- data/config/website.yml.sample +2 -0
- data/lib/tendersync/document.rb +218 -0
- data/lib/tendersync/runner.rb +211 -0
- data/lib/tendersync/session.rb +102 -0
- data/lib/tendersync/tendersync.rb +7 -0
- data/lib/tendersync.rb +6 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +71 -0
- data/spec/fixtures/passenger_restart_issues +31 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/tendersync_document_spec.rb +58 -0
- data/spec/tendersync_session_spec.rb +26 -0
- data/spec/tendersync_spec.rb +12 -0
- data/tasks/rspec.rake +21 -0
- data/tendersync.gemspec +39 -0
- data/website/index.html +11 -0
- data/website/index.txt +81 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +159 -0
- data/website/template.html.erb +50 -0
- metadata +115 -0
@@ -0,0 +1,102 @@
|
|
1
|
+
|
2
|
+
class Tendersync::Session
|
3
|
+
attr_reader :agent
|
4
|
+
def initialize(site, user, pass)
|
5
|
+
@username = user
|
6
|
+
@password = pass
|
7
|
+
@agent = WWW::Mechanize.new { |a| }
|
8
|
+
@site = site
|
9
|
+
@login_site = "#{site}/login"
|
10
|
+
end
|
11
|
+
|
12
|
+
def login
|
13
|
+
return if @logged_in
|
14
|
+
puts "logging in as #{@username}..."
|
15
|
+
page = @agent.get(@login_site)
|
16
|
+
f = page.form_with(:action => '/login') do | login_form |
|
17
|
+
login_form['email'] = @username
|
18
|
+
login_form['password'] = @password
|
19
|
+
end
|
20
|
+
result = f.submit
|
21
|
+
if result =~ /unable to login/i
|
22
|
+
raise Tendersync::Runner::Error, "login failed--bad credentials"
|
23
|
+
end
|
24
|
+
# TODO Check the result for a valid login.
|
25
|
+
@logged_in = true
|
26
|
+
end
|
27
|
+
|
28
|
+
def get(url)
|
29
|
+
login
|
30
|
+
page = @agent.get(url)
|
31
|
+
def page.links_like(r)
|
32
|
+
result = []
|
33
|
+
links.each { |l| result << l.href if l.href =~ r }
|
34
|
+
result
|
35
|
+
end
|
36
|
+
page
|
37
|
+
end
|
38
|
+
# Get the URL's of documents in the given section.
|
39
|
+
def documents(section)
|
40
|
+
login
|
41
|
+
index = get("#{@site}/faqs/#{section}")
|
42
|
+
index.links_like(%r{faqs/#{section}/.+}).collect { |url|"#{@site}#{url}" }
|
43
|
+
end
|
44
|
+
def edit_page_for(doc_url)
|
45
|
+
login
|
46
|
+
get "#{@site}#{get(doc_url).links_like(%r{faqs/\d+/edit}).first}"
|
47
|
+
end
|
48
|
+
|
49
|
+
# Return a hash of section id to section name.
|
50
|
+
def all_sections
|
51
|
+
sections = {}
|
52
|
+
get("#{@site}/dashboard/sections").links.each do | link |
|
53
|
+
if link.href =~ %r{/dashboard/sections/(.*)/edit$}
|
54
|
+
name = $1
|
55
|
+
sections[name] = link.text
|
56
|
+
end
|
57
|
+
end
|
58
|
+
sections
|
59
|
+
end
|
60
|
+
|
61
|
+
def pull_from_tender(*sections)
|
62
|
+
sections = all_sections.keys if sections.empty?
|
63
|
+
for section in sections do
|
64
|
+
documents(section).collect do |doc_url|
|
65
|
+
doc = Tendersync::Document.from_form(section,edit_page_for(doc_url).form_with(:action => /edit/))
|
66
|
+
puts " #{doc.permalink}"
|
67
|
+
doc.save unless $dry_run
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
# Print out a list of all documents
|
72
|
+
def ls(*sections)
|
73
|
+
sections = all_sections.keys if sections.empty?
|
74
|
+
sections.each do | section |
|
75
|
+
puts "Section #{section}"
|
76
|
+
documents(section).map {|url| url =~ %r{/([^/]*)$} && $1 }.each do |link|
|
77
|
+
puts " #{link}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
def post(document)
|
82
|
+
login
|
83
|
+
form = edit_page_for("#{@site}/faqs/#{document.section}/#{document.permalink}").form_with(:action => /edit/)
|
84
|
+
document.to_form(form)
|
85
|
+
form.submit unless $dry_run
|
86
|
+
end
|
87
|
+
def create_document(section,permalink,body)
|
88
|
+
login
|
89
|
+
form = get("#{@site}/faq/new").form_with(:action => "/faqs")
|
90
|
+
document = Tendersync::Document.new(
|
91
|
+
:section => section,
|
92
|
+
:title => "New Tendersync::Document",
|
93
|
+
:permalink => permalink,
|
94
|
+
:body => body
|
95
|
+
)
|
96
|
+
document.to_form(form)
|
97
|
+
return if $dry_run
|
98
|
+
form.radiobuttons_with(:value => Tender_id_for_section[section]).first.click
|
99
|
+
form.submit
|
100
|
+
Tendersync::Document.from_form(section,edit_page_for("#{@site}/faqs/#{section}/#{permalink}").form_with(:action => /edit/))
|
101
|
+
end
|
102
|
+
end
|
data/lib/tendersync.rb
ADDED
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/tendersync.rb'}"
|
9
|
+
puts "Loading tendersync gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/script/txt2html
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
load File.dirname(__FILE__) + "/../Rakefile"
|
4
|
+
require 'rubyforge'
|
5
|
+
require 'redcloth'
|
6
|
+
require 'syntax/convertors/html'
|
7
|
+
require 'erb'
|
8
|
+
|
9
|
+
download = "http://rubyforge.org/projects/#{$hoe.rubyforge_name}"
|
10
|
+
version = $hoe.version
|
11
|
+
|
12
|
+
def rubyforge_project_id
|
13
|
+
RubyForge.new.configure.autoconfig["group_ids"][$hoe.rubyforge_name]
|
14
|
+
end
|
15
|
+
|
16
|
+
class Fixnum
|
17
|
+
def ordinal
|
18
|
+
# teens
|
19
|
+
return 'th' if (10..19).include?(self % 100)
|
20
|
+
# others
|
21
|
+
case self % 10
|
22
|
+
when 1: return 'st'
|
23
|
+
when 2: return 'nd'
|
24
|
+
when 3: return 'rd'
|
25
|
+
else return 'th'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Time
|
31
|
+
def pretty
|
32
|
+
return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def convert_syntax(syntax, source)
|
37
|
+
return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
|
38
|
+
end
|
39
|
+
|
40
|
+
if ARGV.length >= 1
|
41
|
+
src, template = ARGV
|
42
|
+
template ||= File.join(File.dirname(__FILE__), '/../website/template.html.erb')
|
43
|
+
else
|
44
|
+
puts("Usage: #{File.split($0).last} source.txt [template.html.erb] > output.html")
|
45
|
+
exit!
|
46
|
+
end
|
47
|
+
|
48
|
+
template = ERB.new(File.open(template).read)
|
49
|
+
|
50
|
+
title = nil
|
51
|
+
body = nil
|
52
|
+
File.open(src) do |fsrc|
|
53
|
+
title_text = fsrc.readline
|
54
|
+
body_text_template = fsrc.read
|
55
|
+
body_text = ERB.new(body_text_template).result(binding)
|
56
|
+
syntax_items = []
|
57
|
+
body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
|
58
|
+
ident = syntax_items.length
|
59
|
+
element, syntax, source = $1, $2, $3
|
60
|
+
syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
|
61
|
+
"syntax-temp-#{ident}"
|
62
|
+
}
|
63
|
+
title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
|
64
|
+
body = RedCloth.new(body_text).to_html
|
65
|
+
body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
|
66
|
+
end
|
67
|
+
stat = File.stat(src)
|
68
|
+
created = stat.ctime
|
69
|
+
modified = stat.mtime
|
70
|
+
|
71
|
+
$stdout << template.result(binding)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
---------------------------- document_id ----------------------------
|
2
|
+
1967
|
3
|
+
---------------------------- title ----------------------------
|
4
|
+
I updated the agent and restarted Passenger but it didn't pick up the new agent.
|
5
|
+
---------------------------- permalink ----------------------------
|
6
|
+
passenger_restart_issues
|
7
|
+
---------------------------- keywords ----------------------------
|
8
|
+
passenger restart
|
9
|
+
---------------------------- body ----------------------------
|
10
|
+
|
11
|
+
# Summary of Problem
|
12
|
+
|
13
|
+
When you update the agent it's not enough to touch the Passenger `tmp/restart.txt` file.
|
14
|
+
You need to do a hard restart of apache for the change to take effect.
|
15
|
+
|
16
|
+
# How to Fix it
|
17
|
+
|
18
|
+
Follow these detailed steps.
|
19
|
+
|
20
|
+
## Shell
|
21
|
+
|
22
|
+
Open a shell. No brainer
|
23
|
+
|
24
|
+
## Execute touch
|
25
|
+
|
26
|
+
Do touch tmp/restart.txt
|
27
|
+
|
28
|
+
# Conclusion
|
29
|
+
|
30
|
+
Hope this helps. If not, then I probably have no idea what I'm talking about and it's best just to move along and forget this ever happened.
|
31
|
+
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
begin
|
2
|
+
require 'spec'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
5
|
+
gem 'rspec'
|
6
|
+
require 'spec'
|
7
|
+
end
|
8
|
+
|
9
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
10
|
+
require 'tendersync'
|
11
|
+
|
12
|
+
Spec::Runner.configure do |config|
|
13
|
+
|
14
|
+
config.mock_with :mocha
|
15
|
+
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe Tendersync::Document do
|
4
|
+
|
5
|
+
|
6
|
+
before do
|
7
|
+
@doc_source = File.read("spec/fixtures/passenger_restart_issues")
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should generate an index" do
|
11
|
+
index = Tendersync::Document.new
|
12
|
+
doc = Tendersync::Document.load("doc", StringIO.new(@doc_source))
|
13
|
+
Tendersync::Document.stubs(:each).yields(doc)
|
14
|
+
index.refresh_index
|
15
|
+
puts index.to_s
|
16
|
+
index.body.should =~ /baba/
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should load from a file" do
|
20
|
+
doc = Tendersync::Document.load("doc", StringIO.new(@doc_source))
|
21
|
+
doc.title.should == "I updated the agent and restarted Passenger but it didn't pick up the new agent."
|
22
|
+
doc.permalink.should == 'passenger_restart_issues'
|
23
|
+
doc.keywords.should == 'passenger restart'
|
24
|
+
doc.body.should =~ /^When you update/
|
25
|
+
end
|
26
|
+
it "should print with fields" do
|
27
|
+
doc = Tendersync::Document.new :title => 'Title!', :body => "body!\nbody!"
|
28
|
+
doc.to_s.should == <<-DOC.gsub(/^\s+/,'')
|
29
|
+
---------------------------- title ----------------------------
|
30
|
+
Title!
|
31
|
+
---------------------------- body ----------------------------
|
32
|
+
body!\nbody!
|
33
|
+
DOC
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should load from a form" do
|
37
|
+
fields = { 'faq[title]' => 'title!', 'faq[body]' => "body by\nbill"}.collect do | key, value |
|
38
|
+
WWW::Mechanize::Form::Field.new(key, value)
|
39
|
+
end
|
40
|
+
form = stub(:action => '/faqs/123/edit', :fields => fields)
|
41
|
+
doc = Tendersync::Document.from_form("doc", form)
|
42
|
+
doc.title.should == "title!"
|
43
|
+
doc.document_id.should == '123'
|
44
|
+
doc.body.should == "body by\nbill"
|
45
|
+
doc.to_s.should == <<EOF.gsub(/^ */,'')
|
46
|
+
---------------------------- section ----------------------------
|
47
|
+
doc
|
48
|
+
---------------------------- document_id ----------------------------
|
49
|
+
123
|
50
|
+
---------------------------- title ----------------------------
|
51
|
+
title!
|
52
|
+
---------------------------- body ----------------------------
|
53
|
+
body by
|
54
|
+
bill
|
55
|
+
EOF
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe Tendersync::Runner do
|
4
|
+
|
5
|
+
before do
|
6
|
+
Tendersync::Runner.any_instance.stubs(:save_config_file)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should process no args" do
|
10
|
+
begin
|
11
|
+
Tendersync::Runner.new []
|
12
|
+
rescue Tendersync::Runner::Error => e
|
13
|
+
e.message.should match(/Please enter a/)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should process no args" do
|
18
|
+
begin
|
19
|
+
Tendersync::Runner.new []
|
20
|
+
rescue Tendersync::Runner::Error => e
|
21
|
+
e.message.should match(/Please enter a/)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
end
|
data/tasks/rspec.rake
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'spec'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
5
|
+
require 'spec'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'spec/rake/spectask'
|
9
|
+
rescue LoadError
|
10
|
+
puts <<-EOS
|
11
|
+
To use rspec for testing you must install rspec gem:
|
12
|
+
gem install rspec
|
13
|
+
EOS
|
14
|
+
exit(0)
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Run the specs under spec/models"
|
18
|
+
Spec::Rake::SpecTask.new do |t|
|
19
|
+
t.spec_opts = ['--options', "spec/spec.opts"]
|
20
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
21
|
+
end
|
data/tendersync.gemspec
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{tendersync}
|
5
|
+
s.version = "1.0.2"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Bill Kayser"]
|
9
|
+
s.date = %q{2009-08-15}
|
10
|
+
s.default_executable = %q{tendersync}
|
11
|
+
s.description = %q{Tendersync is a utility for syncing files from ENTP's Tender site for managing customer facing documentation. It can be used to pull and push documents to a local repository as well as create indexes for each documentation section.
|
12
|
+
}
|
13
|
+
s.email = %q{bkayser@newrelic.com}
|
14
|
+
s.executables = ["tendersync"]
|
15
|
+
s.extra_rdoc_files = ["bin/tendersync", "lib/tendersync/document.rb", "lib/tendersync/runner.rb", "lib/tendersync/session.rb", "lib/tendersync/tendersync.rb", "lib/tendersync.rb", "README.md", "tasks/rspec.rake"]
|
16
|
+
s.files = ["bin/tendersync", "config/website.yml.sample", "History.txt", "lib/tendersync/document.rb", "lib/tendersync/runner.rb", "lib/tendersync/session.rb", "lib/tendersync/tendersync.rb", "lib/tendersync.rb", "Manifest", "Rakefile", "README.md", "script/console", "script/destroy", "script/generate", "script/txt2html", "spec/fixtures/passenger_restart_issues", "spec/spec.opts", "spec/spec_helper.rb", "spec/tendersync_document_spec.rb", "spec/tendersync_session_spec.rb", "spec/tendersync_spec.rb", "tasks/rspec.rake", "website/index.html", "website/index.txt", "website/javascripts/rounded_corners_lite.inc.js", "website/stylesheets/screen.css", "website/template.html.erb", "tendersync.gemspec"]
|
17
|
+
s.homepage = %q{http://www.github.com/newrelic/tendersync}
|
18
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Tendersync", "--main", "README.md"]
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
s.rubyforge_project = %q{newrelic}
|
21
|
+
s.rubygems_version = %q{1.3.4}
|
22
|
+
s.summary = %q{Utility for syncing and indexing files from ENTP's Tender site.}
|
23
|
+
|
24
|
+
if s.respond_to? :specification_version then
|
25
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
26
|
+
s.specification_version = 3
|
27
|
+
|
28
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
29
|
+
s.add_runtime_dependency(%q<mechanize>, [">= 0.9.3"])
|
30
|
+
s.add_development_dependency(%q<newgem>, [">= 1.4.1"])
|
31
|
+
else
|
32
|
+
s.add_dependency(%q<mechanize>, [">= 0.9.3"])
|
33
|
+
s.add_dependency(%q<newgem>, [">= 1.4.1"])
|
34
|
+
end
|
35
|
+
else
|
36
|
+
s.add_dependency(%q<mechanize>, [">= 0.9.3"])
|
37
|
+
s.add_dependency(%q<newgem>, [">= 1.4.1"])
|
38
|
+
end
|
39
|
+
end
|
data/website/index.html
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
4
|
+
<title>tendersync</title>
|
5
|
+
|
6
|
+
</head>
|
7
|
+
<body id="body">
|
8
|
+
<p>This page has not yet been created for RubyGem <code>tendersync</code></p>
|
9
|
+
<p>To the developer: To generate it, update website/index.txt and run the rake task <code>website</code> to generate this <code>index.html</code> file.</p>
|
10
|
+
</body>
|
11
|
+
</html>
|
data/website/index.txt
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
h1. tendersync
|
2
|
+
|
3
|
+
|
4
|
+
h2. What
|
5
|
+
|
6
|
+
|
7
|
+
h2. Installing
|
8
|
+
|
9
|
+
<pre syntax="ruby">sudo gem install tendersync</pre>
|
10
|
+
|
11
|
+
h2. The basics
|
12
|
+
|
13
|
+
|
14
|
+
h2. Demonstration of usage
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
h2. Forum
|
19
|
+
|
20
|
+
"http://groups.google.com/group/tendersync":http://groups.google.com/group/tendersync
|
21
|
+
|
22
|
+
TODO - create Google Group - tendersync
|
23
|
+
|
24
|
+
h2. How to submit patches
|
25
|
+
|
26
|
+
Read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/ and for section "8b: Submit patch to Google Groups":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups, use the Google Group above.
|
27
|
+
|
28
|
+
TODO - pick SVN or Git instructions
|
29
|
+
|
30
|
+
The trunk repository is <code>svn://rubyforge.org/var/svn/tendersync/trunk</code> for anonymous access.
|
31
|
+
|
32
|
+
OOOORRRR
|
33
|
+
|
34
|
+
You can fetch the source from either:
|
35
|
+
|
36
|
+
<% if rubyforge_project_id %>
|
37
|
+
|
38
|
+
* rubyforge: "http://rubyforge.org/scm/?group_id=<%= rubyforge_project_id %>":http://rubyforge.org/scm/?group_id=<%= rubyforge_project_id %>
|
39
|
+
|
40
|
+
<pre>git clone git://rubyforge.org/tendersync.git</pre>
|
41
|
+
|
42
|
+
<% else %>
|
43
|
+
|
44
|
+
* rubyforge: MISSING IN ACTION
|
45
|
+
|
46
|
+
TODO - You can not created a RubyForge project, OR have not run <code>rubyforge config</code>
|
47
|
+
yet to refresh your local rubyforge data with this projects' id information.
|
48
|
+
|
49
|
+
When you do this, this message will magically disappear!
|
50
|
+
|
51
|
+
Or you can hack website/index.txt and make it all go away!!
|
52
|
+
|
53
|
+
<% end %>
|
54
|
+
|
55
|
+
* github: "http://github.com/GITHUB_USERNAME/tendersync/tree/master":http://github.com/GITHUB_USERNAME/tendersync/tree/master
|
56
|
+
|
57
|
+
<pre>git clone git://github.com/GITHUB_USERNAME/tendersync.git</pre>
|
58
|
+
|
59
|
+
|
60
|
+
TODO - add "github_username: username" to ~/.rubyforge/user-config.yml and newgem will reuse it for future projects.
|
61
|
+
|
62
|
+
|
63
|
+
* gitorious: "git://gitorious.org/tendersync/mainline.git":git://gitorious.org/tendersync/mainline.git
|
64
|
+
|
65
|
+
<pre>git clone git://gitorious.org/tendersync/mainline.git</pre>
|
66
|
+
|
67
|
+
h3. Build and test instructions
|
68
|
+
|
69
|
+
<pre>cd tendersync
|
70
|
+
rake test
|
71
|
+
rake install_gem</pre>
|
72
|
+
|
73
|
+
|
74
|
+
h2. License
|
75
|
+
|
76
|
+
This code is free to use under the terms of the MIT license.
|
77
|
+
|
78
|
+
h2. Contact
|
79
|
+
|
80
|
+
Comments are welcome. Send an email to "FIXME full name":mailto:bkayser@newrelic.com via the "forum":http://groups.google.com/group/tendersync
|
81
|
+
|