If you are using this on a real website you might want to use SSL and make your installation secure. There are a few things you can do. For most people running on their local machine that do not want it on the internet do not require any of these settings, but it will not harm if they did. Following the instructions above you should already be using ProxyRequests Off
<Directory> / <Location>
SSL on non default port
The optional protocol argument is not required for most configurations. If not specified, https is the default for port 443 and http the default for all other ports. The protocol is used to determine which module should handle a request, and to apply protocol specific optimizations with the AcceptFilter directive.
You only need to set the protocol if you are running on non-standard ports. For example, running an https site on port 8443:
Listen 192.170.2.1:8443 https
Hooks
Secure Proxy
apache httpd.conf
<Proxy *> Order Deny,Allow Deny from all Allow from 192.168.0 </Proxy>
When you have a webserver running you probably would like redmine through that server aswell to keep things easier, reducing port forwarding requirements and the number of addresses you hand out. You could just hand out the new address which usually looks like http://localhost:3000/ if you want, but why not do a proper integration.
These methods will allow you to run redmine from your normal webserver or localhost, http://localhost/ with no port number on the end (this assumes that your webserver does not have a port number, using port 80).
Tthere are 2 parts of this process to consider:
With the following instructions i will assume the following
If you just want the code, click here, this will take you to the bottom where you can just get the code for a quick start without any of the history.
Files
This section is not required reading but might help if you have issues or question later on.
During my research i cam across references to Redmine files where you could put code. I am going to list them here and what i think they do.
This techniques is the best an i have taken most of the information from Defect #12102: Installed Redmine in a sub-URI: Links are generated not correctly - Redmine
This method also utilises the inbuilt WebBrick Webserver, This is an excellent simple solution but if you are going to use this for a lot of users you should perhaps think about using Thin Server, this will require slightly different instructions and some more work. WebBrick is classed as a reference server and if you are going to server more than 20 people at a time there will be large performance issues. For the most of us WebBrick will be fine.
config.ru
# This file is used by Rack-based servers to start the application. require ::File.expand_path('../config/environment', __FILE__) map '/redmine' do run RedmineApp::Application end
Replace the contents of {redmine}/config.ru with this code. This also assumes you have not already made any alterations to this file.
This code does 2 things
The root folder effectively no longer exists, you get page not found supplied by the webserver if you browse to http://localhost:3000/ and this is normal.
Other Static Asset Commands
You can also change the dynamic urls by using the 2 following commands:
which cause the following issues:
enviroment.rb
ActionController::Base.relative_url_root = '/redmine'
Add this to the end of {redmine}config/enviroment.rb. I also think you can put this in either development.rb or production.rb, this change will then only occur in that particular enviroment.
This code alters the path of the links pointing to the static files such as javascripts and CSS. Currently all paths for these still point to the root http://localhost:3000/ but they actual ar now present at http://localhost:3000/redmine/ and even though we have added the code in config.ru these paths are not altered so we need this code to correct that.
NB:
You now have moved your Redmine installation to a subfolder
this will be for my Thin server notes when i do them, there is also the Passenger Webserver to consider. Each has there own method. Basically youo can run these servers with switches to perform the directory change, You can then proxy this over to your main webserver as in the instructions below. Check my General Links section for resources.
This is the easiest of the methods to implement. You can simply proxy Remine to your apache server using the following code, this assumes redmine is at http://localhost:3000/
httpd.conf
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
Make sure these modules are enabled in httpd.conf, they are required.
ProxyRequests Off ProxyPreserveHost On ProxyPass / http://localhost:3000/ ProxyPassReverse / http://localhost:3000/
Add these lines to the end your apache httpd.conf , if you do this you will not be able to run any other stuff from your apache webserver because all requests will get forwarded to the Redmine server.
Or Alter the Redmine Server port directely
Simply run the Redmine server on port 80 by using the following switch which will give the same effect
-p 80
These instructions will assume the subfolder on apache you want is http://localhost/redmine/
.htaccess file
# Redirects /redmine to /redmine/ RedirectMatch ^/redmine$ /redmine/ RedirectMatch ^/$ /redmine/
add this code to ..../htdocs/.htaccess in your apache server.
You can redirect the non-slashed version, but this is to make sure we have a correct URL. A directory is denoted by having a slash at the end of the URL (ie /redmine/ ) wheresas if you dont, it denotes a page (ie /redmine ).
What we are directing to is more akin to a directory/default index file like a normal webserver, http://www.example.com/ You dont often see http://www.example.com/index.html , but they are the same page. Notice the slash at the end, this is intentional.
httpd.conf
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
Make sure these modules are enabled in httpd.conf, they are required.
ProxyRequests Off ProxyPreserveHost On ProxyPass /redmine/ http://localhost:3000/redmine/ ProxyPassReverse /redmine/ http://localhost:3000/redmine/
This is code that actualy passes the information/request between Redmine Server and your Apache server.
The commands above will work site wide so are a bit blunt, the following methods will allow you to apply these rules to a specific locations.
<Location> works on the URLs presented to the server
httpd.conf
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
Make sure these modules are enabled in httpd.conf, they are required.
ProxyRequests Off <Location /redmine/> RedirectMatch ^/redmine$ /redmine/ RedirectMatch ^/$ /redmine/ ProxyPreserveHost On ProxyPass http://localhost:3000/redmine/ ProxyPassReverse http://localhost:3000/redmine/ </Location>
With this method you have to split the commands, ProxyRequests will not work in location so needs to be put in the normal flow of the httpd.conf (i.e. not in <location>)
Directory works on the physical path of the accessed files and is better to be used for security because several URLs can point to a single directory or file whereas the <Directory> command is very specific.
httpd.conf
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
Make sure these modules are enabled in httpd.conf, they are required.
ProxyRequests Off <Directory "d:\Documents\Developer\xampp\htdocs\redmine\"> RedirectMatch ^/redmine$ /redmine/ RedirectMatch ^/$ /redmine/ ProxyPreserveHost On ProxyPass http://localhost:3000/redmine/ ProxyPassReverse http://localhost:3000/redmine/ </Directory>
With Virtualhost you can run a another domain name on the 1 xampp/apache server. This is very useful. You can also just use it to apply rules to the server and keep the code neater, easier for copying and pasting.
httpd.conf
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
Make sure these modules are enabled in httpd.conf, they are required.
<VirtualHost *:80> ## This is for setting a domain name ServerName rails.localhost.com DocumentRoot "D:\Documents\Developer\RubyRoot\redmine\public\" # Make sure there is a trailing slash in the root RedirectMatch ^/redmine$ /redmine/ RedirectMatch ^/$ /redmine/ # The proxying code ProxyRequests Off ProxyPreserveHost On ProxyPass /redmine/ http://localhost:3000/redmine/ ProxyPassReverse /redmine/ http://localhost:3000/redmine/ </VirtualHost>
Including the rules in the <VirtualHost> tags is not required but can make handling the code easier and if you do want apply this to a specific domain it is easy to enable it.
So you have arrived here at the code, just following the simple instructions and edit the files. Redmine will then run at http://localhost/redmine/ on you xampp installation. This does of course assume you have Redmine already running on your Windows PC.
Redmine - config.ru
# This file is used by Rack-based servers to start the application. require ::File.expand_path('../config/environment', __FILE__) map '/redmine' do run RedmineApp::Application end
Replace the contents of {redmine}/config.ru with this code. This also assumes you have not already made any alterations to this file.
Redmine - enviroment.rb
ActionController::Base.relative_url_root = '/redmine'
Add this to the end of {redmine}config/enviroment.rb. I also think you can put this in either development.rb or production.rb, this change will then only occur in that particular enviroment.
Apache / Xampp - httpd.conf
Edit your Apache / Xampp httpd.conf file
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
Make sure these modules are enabled in httpd.conf file, they are required.
################################# # RUBY SETUP ################################# # Enforces a trailing slash for the /redmine/ directory RedirectMatch ^/redmine$ /redmine/ RedirectMatch ^/$ /redmine/ # The proxying code ProxyRequests Off ProxyPreserveHost On ProxyPass /redmine/ http://localhost:3000/redmine/ ProxyPassReverse /redmine/ http://localhost:3000/redmine/ ################################# # RUBY SETUP #################################
Add these lines at the bottom of the httpd.conf file.
Done
All the changes are now done, you will find that Redmine will be served from http://localhost/redmine/ and http://localhost:3000/redmine/ , this is normal.
If you had your servers running while making these changes you need to restart them both.
You should note that this setup is non-SSL version so is not secure.
These are the links i used for my research and might be of use.
Redmine / Ruby
Reverse Proxy
Apache
These are my instructions to upgrade your Redmine install on windows and also assumes you have used my instructions for installing redmine, however this is not mandatory but will explain where the filepaths come from.
I will be upgrading Redmine 2.6.1 to Redmine 3.0.0 but i am sure they will be almost the same for other version.
Notes
The first step to upgrading Redmine is to check that you meet the requirements for the version you're about to install.
You can easily check what version of Redmine, Ruby and Rails by browsing to Administration/Information and you will see the following information.
Environment: Redmine version 2.6.1.stable Ruby version 2.1.5-p273 (2014-11-13) [i386-mingw32] Rails version 3.2.21 Environment production Database adapter Mysql2 SCM: Subversion 1.8.11 Filesystem Redmine plugins: no plugin installed
Redmine 3.0.0 requires, Ruby 1.9.3 or higher (and now supports ruby 2.2).
bundle install --without development test
================================================================================ You've installed the binary version of mysql2. It was built using MySQL Connector/C version 6.1.5. It's recommended to use the exact same version to avoid potential issues. At the time of building this gem, the necessary DLL files were retrieved from: http://cdn.mysql.com/Downloads/Connector-C/mysql-connector-c-6.1.5-win32.zip This gem *includes* vendor/libmysql.dll with redistribution notice in vendor/README. ================================================================================
bundle exec rake generate_secret_token
bundle exec rake db:migrate RAILS_ENV=production
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
bundle exec rake tmp:cache:clear tmp:sessions:clear RAILS_ENV=production
If you discover that your log file is filling up with lots of uneeded information you can change the logging level from the default.
in the {redmine}/config/additional_enviroment.rb file you can change the logging level. By either adding the line or un-remming one that is present. When you set the error loggin level to error you will only get errors logged to the log file. This will affect both enviroments.
The log levels available are: :debug, :info, :warn, :error, :fatal, and :unknown, which correspond to the integers 0-5.
Logging Links
Installation of Subversion with redmine can be straight forward if you have some easy toread instructions, so here they are.
There are several levels of integration
Read the official Instructions - RedmineSettings - Repositories
According to the instructions this only works if Redmine and the Subversion Server are on the sam physical machine (this needs 100% clarifying but for now we will assume it is true).
This feature allows you to grab the commits from a predefined SVN Repository (most protocols are supported) and this repository is attached to a project, by doing this when you submit a commit to a repository with a message with correct issue reference syntax, redmine will close the related isse(s) in the project. Git , SVN and other SCM are available. This feature also allows you to perfomr comparisons of different revisions and you eben get the choice to see the changes side-by-side or on top of each other, this feature can be useful depending on how your code looks. There is also a repository browse feature built in to redmine. You can have multiple repositorys per project
Enable Fetch Commits Automatically
In Redmine Administration/Settings/Repositories make sure that Fetch Commits Automatically is ticked. If this option is activated, the application automatically retrieves the new revisions when a user consults the repository.
Official article here
Instructions to add a repository
make sure u use a network version for the repository so you can move it if you want.
SCM Subversion
Main repository checked
identifier test-identifier (dont know what this is for, Repository Identifier)
URL https://svn.exampleserver.com:18080/svn/Test/
user svn-redmine
password xxwhateverxxxx
* when the repository is set you cannot change the details after you have created it except for the surname and password.I have read on the redmine official documentation that you should use a network location for you Subversion repository
Now that you have configured these settings you can close jobs via a svn commit (see below for forming a correct message for closing jobs) but the draw back is that the changes/commits are only retrieved at certain times
In the step above you configured Redmine to interact with Subversion and to retrieve any changes/commits. Redmine currently parses the commit messages for keywords which reference issue, it does this so it can automatically change these keywords into links. These links are found by using a set of default rules and keywords which can be chamged in the admin panel but the default options should be fine for most people.
The one thing Redmine does not do by default is close issues. You need to specify the keywords that you want to be used as closing keywords and enable the option in the Redmine settings via the admin panel.
Links
fix,fixes,fixed,close,closed,patches,patched
You can configure whatever rule you want but at least this will get you going. Read the official Documentation for the syntax of closing statements you should use in your commit messages.
NB:
Better Issue Referencing
Redmine has a list of keywords it scans for to identify issues as follows:
refs,references,IssueID
I want to extend that to the following list
refs,references,IssueID,bug,bugs,defect,defects,feature,features,issue,issues,patch
I dont know about whether yoou can close multiple issues but i will add the plural version here anyway
Resolve Issue Keywords (optional)
These are different status and have different uses so require their own settings in the'Referencing and fixing issues in commit messages'.
If you want to have the resolved option set from commit messages you need to do the following:
resolve,resolves,resolved
To reference and issue use a command using any of the issue referencing keywords as below:
issue #1234
To close a job use the following or similiar command with any of the other closing keywords
close #1234
The key thing with these is that that the command is in a certain format
{keyword}{a space}{a hash}{issue number}
Resolved Vs Closed Links
To get jobs to close when you actually submit the commit further integration is required which is in the next section.
This is a very useful feature because in my opinion this is how everyone will think this integration works, when you submit a commit with closing statements in the message that issue will be immediately closed. In the 'Basic SVN Integration' this does not happen until you browse the repository or your cron job is fired so the commits get parsed and redmine closes the jobs so there could potentially be a gap between closing the jobs and this apopearing on the Redmine installation.
In this method you basically create a post-commit hook that polls the Redmine installation which then instructs Redmine that some changes have been made and that it should fetch them. It should be noted that this can cause a slight slow down in the commiting of the changes to the repository.
There are 2 types of polls you can use:
And several delivery methods for the hook:
My Instructions
I will be using cURL for these instructions because it is the easiest solution.
Do this once
Required For Each Repository
For each repository you need create add an exectuable post-commit hook with the commands in it to trigger Redmine in to checking for changes. I will use a Hook that updates only the repositories in that particular project. It will also be very easy to change to refresh all repositories.
post-commit.bat
@ECHO OFF curl "http://<redmine url>/sys/fetch_changesets?id=<project identifier>&key=<your service key>"
This is the example code from Redmine's official instructions on calling a URL that will trigger Redmine to refresh all Repositories for that chosen Project.
Create the 'post-commit' Hook
I will assume
@ECHO OFF curl "http://localhost/redmine/sys/fetch_changesets?id=TestProject&key=Password123"
Upon a successful commit to your Subversion Repository, Redmine will check all of the Repositories that belong to the specified project for changes.
You might be asking why cannot i not just update only a specified repository in Redmine rather than all of the repositories that belong to a project. This is a requested feature but for some reason it has not been added yet. Considering things most people will not notice this and if you use the command that refreshes all repositories in Redmine upon a successful commit you will never need this. If you use the 'Refresh All' command you can just copy this to other repository hook folders without alteration.
Useful Links
This is the final level of integration but it is not easy and seems to come with its own issues. You have to edit code and do this and that to get it to work. It is quicker to create the SVN Repository in Subversion Edge and then enter the details into redmine as in 'Basic SVN Integration'
I will not be implementing this aas i have easy control over my Subversion Server
See the official page for more information
This can be a tricky thing to get working if you have no knowledge of Ruby or assume that all the scripts you come across actually work. I have found a lot of information about getting Redmine to run as a windows service is quite old and ruby ahs changed a lot since they were written. This article hold all my research from googling around the internet which includes those key niggets of information to help me get the scripts working.
As ever you have come across another article saying how things should work but never just give you the code so you can get Redmine working and worry about other things. This article is diffrerent, i have included all my research so if there are any problems i have not seen or issues that come along later you will be able to fix them withou pulling your hair out and lastly this article has the working scripts. If you just want the scripts so you can get running please scroll to 'The Scripts' and follow the installations instructions and you will be running very quickly.
There are currently a few methods that I have found to create a service:
When you start the service it can take up to 60 seconds to properly start and if you look in task manager it is normal to see to instances of ruby either ruby.exe or rubyw.exe
This is what happens:
When trying to configure redmine to run as a service you might come across some of the issues I am going to outline below but the good thing is I am going to tell you why they occur which will make fixing them stress free.
Error 1053
Windows could not start the redmine service on Local Computer. Error 1053: The service did not respond to the start or control request in a timely fashion.
Error 1067
Windows could not stop the redmine service on Local Computer. Error 1067: The process terminated unexpectedly.
Normal Script
Using Windows Resource Kit
Mongrel
Misc Relevant
The simple script is the absolute basic version of the script but does work as expected.
These are my notes on using the script found on redmine.org, HowTo run Redmine as a Windows service (win32-service + taskill approach) - Redmine. This script has issues with it so i have listed them below and then you will find my corrected version which does work.
sc create redmine binPath= "D:\Documents\Developer\RailsInstaller\Ruby2.1.0\bin\rubyw -C D:\Documents\Developer\RubyRoot\redmine\ redmine-service.rb"
When you fill in the command make sure you leave the space inbetween ...\redmine\ redmine-service.rb , the reason for this is that ...\redmine\ beongs with the -C switch which is telling the code to change to the redmine directory before running the script. you can actually add a full path to redmine-service.rb if you wanted to make it easier to read.
The Script
REDMINE_DIR = 'D:\Documents\Developer\RubyRoot\redmine' LOG_FILE = "#{REDMINE_DIR}\\log\\redmine-service.log" begin require 'win32/daemon' include Win32 class RedmineService < Daemon def service_init File.open(LOG_FILE, 'a'){ |f| f.puts "Initializing service #{Time.now}" } @server_pid = Process.spawn 'D:\Documents\Developer\RailsInstaller\Ruby2.1.0\bin\rubyw script/rails s -e production', :chdir => REDMINE_DIR, :err => [LOG_FILE, 'a'] end def service_main File.open(LOG_FILE, 'a'){ |f| f.puts "Service is running #{Time.now} with pid #{@server_pid}" } while running? sleep 10 end end def service_stop File.open(LOG_FILE, 'a'){ |f| f.puts "Stopping server thread #{Time.now} with pid #{@server_pid}" } system "taskkill /PID #{@server_pid} /T /F" Process.waitall File.open(LOG_FILE, 'a'){ |f| f.puts "Service stopped #{Time.now}" } pid_file = 'tmp/pids/server.pid' File.file?(pid_file) && File.delete(pid_file) #exit! # can cause a bad exit end end RedmineService.mainloop rescue Exception => e File.open(LOG_FILE,'a+'){ |f| f.puts " ***Daemon failure #{Time.now} exception=#{e.inspect}\n#{e.backtrace.join($/)}" } raise end
This is my script that i have made from several scripts. This is a modern daemon code with logging and a controller file to make install/running/deleting the script as a service. The script will also populate most of the variables if your Ruby path is set and you run the redmine_service_ctl.rb from the root of your redmine installation.
My script might not handle paths with spaces in them correctely. This should be easily fixed by using quotes (") where needed. I might update the scripts if there is any interest.
The script configures itself automatically.
If the installation does not work as expected you might need to
Controller Script
This script should be called redmine_service_ctl.rb and this is the service management script, it is used to install/stop/start/delete the service from the command line.
############################################################################ # # redmine_service_ctl.rb # # This is a command line script for installing and/or running a small # Ruby program as a service, in this case it is Redmine. # # The service will run Redmine and will record certain events to a log file. # If enabled, the service can also write a small bit of text # to the log file every 20 seconds to show it is running. # Some text will bve written to the log file during the initialization (service_init) step. # # It should take about 10 seconds to start, which is intentional - it's a test # of the service_init hook, so don't be surprised if you see "one moment, # start pending" about 10 times on the command line. # # The Log File is {redmine_dir}/log/test.log. Feel free to delete it when finished. # # To run the service, you must install it first. # # Usage: ruby redmine_service_ctl.rb <option> # # Note that you *must* pass this program an option # # Options: # install - Installs the service. The service name is "RedmineService" # and the display name is "Redmine Windows Service". # start - Starts the service. Make sure you stop it at some point or # you will eventually fill up your filesystem!. # stop - Stops the service. # pause - Pauses the service. # resume - Resumes the service. # uninstall - Uninstalls the service. # delete - Same as uninstall. # # You can also used the Windows Services GUI to start and stop the service. # # To get to the Windows Services GUI just follow: # Start -> Control Panel -> Administrative Tools -> Services # # by shoulders @ QuantumWarp.com # used code from # http://stackoverflow.com/questions/877943/how-to-configure-a-rails-app-redmine-to-run-as-a-service-on-windows # ############################################################################ #--------------------------------------------------------------------------- # Includes #--------------------------------------------------------------------------- # require 'rubygems' # only for < ruby 1.9 require 'win32/service' require 'rbconfig' include Win32 include RbConfig # Make sure you're using the version you think you're using. puts 'VERSION: ' + Service::VERSION SERVICE_NAME = 'RedmineService' SERVICE_DISPLAY_NAME = 'Redmine Windows Service' SERVICE_DESCRIPTION = 'This is my Windows Redmine Service' #--------------------------------------------------------------------------- # Automatically Create Windows Service Binary Path #--------------------------------------------------------------------------- RUBY_BINARY = File.join(CONFIG['bindir'], 'rubyw').tr('/', '\\') PATH = ' -C ' + File.dirname(File.expand_path($0)).tr('/', '\\') + '\\ ' + 'redmine_service.rb' CMD = RUBY_BINARY + PATH # MANUAL OVERIDE # This builds the windows binaryPath ="" in the format: # CMD = 'D:\Documents\Developer\RailsInstaller\Ruby2.1.0\bin\rubyw -C D:\Documents\Developer\RubyRoot\redmine\ redmine_service.rb' # CMD = 'D:\Documents\Developer\RailsInstaller\Ruby2.1.0\bin\rubyw -C D:\Documents\Developer\RubyRoot\redmine\ D:\Documents\Developer\RubyRoot\redmine\redmine_service.rb' # if you want to uses spaces in your path you need to enclose in each path in quotes ("") # possibly # CMD = '"D:\Documents\Developer\RailsInstaller\Ruby2.1.0\bin\rubyw" -C "D:\Documents\Developer\RubyRoot\redmine\ " "redmine_service.rb"' # CMD = '"D:\Documents\Developer\RailsInstaller\Ruby2.1.0\bin\rubyw" -C "D:\Documents\Developer\RubyRoot\redmine\" "D:\Documents\Developer\RubyRoot\redmine\redmine_service.rb"' #--------------------------------------------------------------------------- # Perform Service Action Based on Argument supplied #--------------------------------------------------------------------------- # You must provide at least one argument. raise ArgumentError, 'No argument provided' unless ARGV[0] # These are the actions performed for the various windows service tasks/functions case ARGV[0].downcase when 'install' Service.new( # These are the service configuration settings that are written to the registry # will run automatically without a user being logged in :service_name => SERVICE_NAME, :display_name => SERVICE_DISPLAY_NAME, :description => SERVICE_DESCRIPTION, :start_type => Service::AUTO_START, :service_type => Service::WIN32_OWN_PROCESS, :load_order_group => 'Network', :dependencies => nil, #:dependencies => ['Developer-Apache2.4','Developer-MySQL'], #:error_control => Service::ERROR_NORMAL, #:service_start_name => 'SomeDomain\\User', #:password => 'XXXXXXX', :binary_path_name => CMD, ) puts CMD puts 'Service ' + SERVICE_NAME + ' installed' # One of following code sections, which all match to their corresponding 'Windows Service Function' is # triggered depending on what argument is supplied in the oommand line. when 'start' if Service.status(SERVICE_NAME).current_state != 'running' Service.start(SERVICE_NAME, nil, 'hello', 'world') while Service.status(SERVICE_NAME).current_state != 'running' puts 'One moment...' + Service.status(SERVICE_NAME).current_state sleep 1 end puts 'Service ' + SERVICE_NAME + ' started' else puts 'Already running' end when 'stop' if Service.status(SERVICE_NAME).current_state != 'stopped' Service.stop(SERVICE_NAME) while Service.status(SERVICE_NAME).current_state != 'stopped' puts 'One moment...' + Service.status(SERVICE_NAME).current_state sleep 1 end puts 'Service ' + SERVICE_NAME + ' stopped' else puts 'Already stopped' end when 'uninstall', 'delete' if Service.status(SERVICE_NAME).current_state != 'stopped' Service.stop(SERVICE_NAME) end while Service.status(SERVICE_NAME).current_state != 'stopped' puts 'One moment...' + Service.status(SERVICE_NAME).current_state sleep 1 end Service.delete(SERVICE_NAME) puts 'Service ' + SERVICE_NAME + ' deleted' when 'pause' if Service.status(SERVICE_NAME).current_state != 'paused' Service.pause(SERVICE_NAME) while Service.status(SERVICE_NAME).current_state != 'paused' puts 'One moment...' + Service.status(SERVICE_NAME).current_state sleep 1 end puts 'Service ' + SERVICE_NAME + ' paused' else puts 'Already paused' end when 'resume' if Service.status(SERVICE_NAME).current_state != 'running' Service.resume(SERVICE_NAME) while Service.status(SERVICE_NAME).current_state != 'running' puts 'One moment...' + Service.status(SERVICE_NAME).current_state sleep 1 end puts 'Service ' + SERVICE_NAME + ' resumed' else puts 'Already running' end else raise ArgumentError, 'unknown option: ' + ARGV[0] end
Daemon / Service Script (the actual service)
This should be called redmine_service.rb
############################################################################ # # redmine_service.rb # # This script should automatically configure itself. # # The only thing you might need to alter are the RUBY_BINARY_ARGUMENTS. # -e is the enviroment and the options are development/production # -p is the port number to run Redmine on # # by shoulders @ QuantumWarp.com # used code from # http://stackoverflow.com/questions/877943/how-to-configure-a-rails-app-redmine-to-run-as-a-service-on-windows # ############################################################################ #--------------------------------------------------------------------------- # Includes #--------------------------------------------------------------------------- include RbConfig #--------------------------------------------------------------------------- # Automatically Create File Paths #--------------------------------------------------------------------------- RUBY_BINARY = File.join(CONFIG['bindir'], 'rubyw').tr('/', '\\') #RUBY_BINARY = 'D:\Documents\Developer\RailsInstaller\Ruby2.1.0\bin\rubyw' # Redmine 2.x #RUBY_BINARY_ARGUMENTS = ' ' + 'script/rails s -e production -p 3000' #RUBY_BINARY_ARGUMENTS = ' script/rails s -e production -p 3000' # Redmine 3.x RUBY_BINARY_ARGUMENTS = ' ' + 'bin/rails s -e production -p 3000' #RUBY_BINARY_ARGUMENTS = ' bin/rails s -e production -p 3000' REDMINE_DIR = File.dirname(File.expand_path($0)).tr('/', '\\') #REDMINE_DIR = 'D:\Documents\Developer\RubyRoot\redmine' LOG_FILE = "#{REDMINE_DIR}\\log\\redmine-service.log" #LOG_FILE = 'D:\Documents\Developer\RubyRoot\redmine\log\redmine-service.log' #--------------------------------------------------------------------------- # The Actual Service #--------------------------------------------------------------------------- begin require 'win32/daemon' include Win32 class RedmineDaemon < Daemon # This method fires off before the +service_main+ mainloop is entered. # Any pre-setup code you need to run before your service's mainloop # starts should be put here. Otherwise the service might fail with a # timeout error when you try to start it. # def service_init File.open(LOG_FILE, 'a'){ |f| f.puts "Initializing service #{Time.now.to_s}" } @server_pid = Process.spawn RUBY_BINARY + RUBY_BINARY_ARGUMENTS, :chdir => REDMINE_DIR, :err => [LOG_FILE, 'a'] # MANUAL COMMANDS # Redmine 2.x #@server_pid = Process.spawn 'D:\Documents\Developer\RailsInstaller\Ruby2.1.0\bin\rubyw script/rails s -e production -p 3000', :chdir => REDMINE_DIR, :err => [LOG_FILE, 'a'] # Redmine 3.0 #@server_pid = Process.spawn 'D:\Documents\Developer\RailsInstaller\Ruby2.1.0\bin\rubyw bin/rails s -e production -p 3000', :chdir => REDMINE_DIR, :err => [LOG_FILE, 'a'] end # This is the daemon's mainloop. In other words, whatever runs here # is the code that runs while your service is running. Note that the # loop is not implicit. # # You must setup a loop as I've done here with the 'while running?' # code, or setup your own loop. Otherwise your service will exit and # won't be especially useful. # # In this particular case, I've setup a loop to append a short message # and timestamp to the log file every 20 seconds. Remove the logging # when you are using this as a real service otherwise you logfile will # become large quickly. # # not sure what the (*args) means def service_main(*args) File.open(LOG_FILE, 'a'){ |f| f.puts "Service is running #{Time.now} with pid #{@server_pid}" } msg = 'application started at: ' + Time.now.to_s File.open(LOG_FILE, 'a'){ |f| f.puts msg f.puts "Args: " + args.join(',') } # While the daemon is running while running? if state == RUNNING sleep 20 # write constantly to log file while running for diagnostics only #msg = 'Service is running as of: ' + Time.now.to_s #File.open(LOG_FILE, 'a'){ |f| f.puts msg } else # PAUSED or IDLE sleep 0.5 end end # We've left the loop, the daemon is about to exit. File.open(LOG_FILE, 'a'){ |f| f.puts "STATE: #{state}" } msg = 'service_main left at: ' + Time.now.to_s File.open(LOG_FILE, 'a'){ |f| f.puts msg } end # This event triggers when the service receives a signal to stop. I've # added an explicit "exit!" here to ensure that the Ruby interpreter exits # properly. I use 'exit!' instead of 'exit' because otherwise Ruby will # raise a SystemExitError, which I don't want. # def service_stop msg = 'Received stop signal at: ' + Time.now.to_s File.open(LOG_FILE, 'a'){ |f| f.puts msg } pid_file = 'tmp/pids/server.pid' File.open(LOG_FILE, 'a'){ |f| f.puts "Stopping server thread #{Time.now.to_s} with pid #{@server_pid}" } system "taskkill /PID #{@server_pid} /T /F" Process.waitall File.open(LOG_FILE, 'a'){ |f| f.puts "Service stopped #{Time.now.to_s}" } File.file?(pid_file) && File.delete(pid_file) # exit! - what is this exit for? there was a reason, this seems to cause a bad exit with redmine but might be needed for other scripts end # This event triggers when the service receives a signal to pause. # def service_pause msg = 'Received pause signal at: ' + Time.now.to_s File.open(LOG_FILE, 'a'){ |f| f.puts msg } end # This event triggers when the service receives a signal to resume # from a paused state. # def service_resume msg = 'Received resume signal at: ' + Time.now.to_s File.open(LOG_FILE, 'a'){ |f| f.puts msg } end end # Create an instance of the Daemon and put it into a loop. I borrowed the # method name 'mainloop' from Tk, btw. # RedmineDaemon.mainloop #--------------------------------------------------------------------------- # Service Failure Logging #--------------------------------------------------------------------------- rescue Exception => err File.open(LOG_FILE, 'a'){ |fh| fh.puts 'Daemon failure: ' + err + '\n'} # this one line is from the 1 page script based on demo File.open(LOG_FILE,'a+'){ |f| f.puts " ***Daemon failure #{Time.now.to_s} exception=#{err.inspect}\n#{err.backtrace.join($/)}" } raise end
Notes
script/rails no longer exists, please use bin/rails instead.
To fix this you basically need to make the change as told in this error. You will see in the redmine-service.rb i have added Redmine 3.x versions, the lines you need to change from Redmine 2.x to 3.x are line 30 - line 36, the rest should be obvious.
If you are using xampp as the donour for the MySQL service you must make sure that this is running when the Redmine service is started otherwise it will fail and not start. To fix this you can make the xampp MySQL (and Apache if required) service as a dependency which means that when you start your redmine service it will start these dependant services first to make sur ethey are running.
Currently the scripts above are not enabled to call Xampp Apache and MySQL services as dependants, the code is there though. There are a couple of steps required to get this working if you want, otherwise you must manually start at least the MySQL service or already have it runnign before you start the redmine service
This feature requires 2 things to be done
NB:
If you want to run more than 1 Xampp installation, or even if you dont, i recommend that you should change the default service name for the Xampp Apache and MySQL services on you Developer Xampp instance. The reason for this is that if like me you use Xampp for developing websites on your Windows PC, the Xampp installationscheck by service name, to see if the Apache and MySQL services are running. This means that if you setup your Developer site with the default service names, when you then open up another instance of Xampp it will think that it is running as a service even if you have not installed that instance as a service.
So by giving different names to these services we will be using for the redmine development xampp it can function independantly to any other xampp instances. This how most people would expect this to work. I also want this seperate installation of xampp because when i am poking around with code or messing databases for my regular web development i do not risk my development enviroment.
Changing the service names is optionals for those budding coders but i definately still recommend it for the reasons outlined above)
Instructions
To change the service names of Apache and MySQL is very easy and requires you to use the xampp control panel.
Apache Service
MySQL Service
This stage is also an easy one and involves editing the redmine_service_ctl.rb from 'My Complex Script' .
:dependencies => nil, #:dependencies => ['Developer-Apache2.4','Developer-MySQL'],
You can see that there is a declaration of no dependencies. The line below it defines some depnedecies but is remmed out. Change the lines around so the service has dependencies. The new code should look like the code below, basically you have just changed the poistion of the Hash '#'
#:dependencies => nil, :dependencies => ['Developer-Apache2.4','Developer-MySQL'],
As you can see the service names match those i set earler but can be anything as long as they match the appropriate service.
Now start the redmine service and you will find it will start the Xampp apache and MySQL Services automatically.
This is a robust way of having redmine running on your Windows PC and once configured you can practically forget about it and just use Redmine for what you wanted to use it for in the first place, software development. There are no more settings to do, you are ready to rock and roll.
There are 2 different methods to install Redmine on windows and each has their benefits
Bitnami Redmine Stack | Seperate Services: Redmine, Edge Subversion and Xampp | |
---|---|---|
Comparison of Redmine Installation Methods | ||
Pros |
|
|
Cons |
|
|
This by far the easiet method of installing Redmine with subversion integration. You literally only need to click install, select your install location (i would recommend without spaces to be on the safe side), run the installer and then make sure you are happy with the port numbers. Done.
Upgrading the Binami Stack is possible and there are instructions but do require a little bit of planning and as always make sure you have a backup first.
Bitnami also does a Virtual Machine already configured using Linux that will work on all flavours of VMWare and Virtualbox. The homepage is here
I searched the internet and did not find that many instructions on how to install Redmine on windows which i found strange. Most of the instructions were complicated and assumed you already had knowledge on how to install Redmine. eventually i cam across the instructions from NBL Creations, but alas, they did not work either. These instructions were set set out in a very straight forward mannor and were writtin in 2010, so i assumed they were correct then but things have changed since then. I proceeded to go through the instructions from NLB and as i cam across issues i found a solutions. This is basically (for now) how my instructions have beend laid out. Where there are issues with the step i have made clear notes on what to do. This is a very easy installation and gives you the benefits of a Xammp installtion with such things as PhpMyadmin.
This is my prefered method of installing Redmine because i can use the installed Ruby services for other development, i get the added benefits of the CollabNet Subversion Edge Server featuers including ViewVC which is an excellent difference viewer. The server identifications are easily changed in the webbased admin which is great when you are playing with the settings to see what you want. It does have its downside that it requires a lot more configuration. It is not all bad becaus ei will also use the xampp server for developing my apps that require a webserver to run.
I would recommend that you read the instructions through once before starting as this process can be quite lenghty.
Software Versions Used
My Folder Locations I have used (might not be the same in the original instructions)
Instructions based on this article - Installing Ruby on Rails and Redmine with XAMPP on Windows 7 - NLB Creations NLB Creations
This takes 2:00hrs to install
I like Xampp. It sets up a full Apache/MySQL/PHP development environment with very little hassle, which means it’s installed on just about every computer I use on a regular basis. I recently had a need to look into Ruby on Rails (specifically so that I could use the Redmine project management web app) and figured it would be easy to integrate it into my existing dev environment.
It kind of… wasn’t.
This is how I finally managed (after two days of ripping my hair out) to do it.
1) Download and install XAMPP.
2) Download RailsInstaller for Windows.
3) Install RailsInstaller to the D:\Documents\Developer\RailsInstaller directory.
- check ‘Install Git (recommended)
- check “Add executables for Ruby, DevKit and Git (if checked above) to the PATH”
– Check “Configure git and ssh when installation has completed” at the end of the install.
– Enter the requested info in the Rails Environment Configuration screen.
- the git thing ask you for your name and email for something to do with GIT / GIT hub. i dont know why you need these, but creates a file in C:\Users\{username}\.gitconfig with these details
- this seems part of the Ruby setup
- if you already have Git information set in the file above, the setup will use that
- restart PC after installing Rails installer (might not be needed)
4) Create a new Ruby on Rails project:
a) Open a cmd window
b) Type: rails new D:/Documents/Developer/RubyRoot/redmine/
- this copies the rails scaffolding/template files into the specified directory.
- Installation might fail because of SSL issues and that files are downloaded on request by this software. There is an updated SSL certificate that was not put in some versions of Ruby. The solution is to manually download the new SSL cert and place in the correct folder before running this command.
ruby on rails - Can't access RubyGems - possibly due to SSL? - Stack Overflow
Download: AddTrustExternalCARoot-2048.pem
put it in the folder - D:\Documents\Developer\RailsInstaller\Ruby2.1.0\lib\ruby\2.1.0\rubygems\ssl_certs
- you might be prompted with
<config/secrets.yml? (enter "h" for help) [Ynaqdh] - i entered 'Y'
5) Add the following to the end of the D:\Documents\Developer\xampp\config\httpd.conf file:
- i could not get this to forward redmine to xampp/apache
# Listen 3000
# LoadModule rewrite_module modules/mod_rewrite.so
#################################
# RUBY SETUP
#################################
<VirtualHost *:3000>
ServerName rails
DocumentRoot "D:/Documents/Developer/RubyRoot/redmine/public/"
<Directory "D:/Documents/Developer/RubyRoot/redmine/">
Options ExecCGI FollowSymLinks
AllowOverride all
Allow from all
Order allow,deny
AddHandler cgi-script .cgi
AddHandler fastcgi-script .fcgi
</Directory>
</VirtualHost>
#################################
# RUBY SETUP
#################################
Side Note: Make sure you try to start/restart Apache from the Xampp control panel after you save the httpd.conf file. If Apache won’t run, try removing the “Listen 3000″ line.
- Just comment out (as in my version) Listen 3000 and LoadModule rewrite_module modules/mod_rewrite.so because if you have apache running on port 3000 the ruby server cannot start and LoadModule rewrite_module modules/mod_rewrite.so is already uncommented in http.conf so is pointless. Might be worth a quick check.
- you need to add 'rails 127.0.0.1' in to your host file
- i also think that <VirtualHost *:3000> should be <VirtualHost *:80> / <VirtualHost *> / <VirtualHost *:81> or whatever your prot number is
- i can't get this to work, it does not seem to do anything except make the http://rails/ domain valid on 127.0.0.1 and this xampp install
- I don’t know if this is needed to be done for httpd-ssl.conf (if you want SSL)
6) Back in the cmd window, navigate to the directory of your project and start the Rails server with the following commands:
cd D:/Documents/Developer/RubyRoot/redmine
rails server
- can take a moment to start. The batch file will display information when started
7) In your browser, navigate to http://localhost:3000 where you should see the RoR welcome screen. Once you’ve verified RoR is working, Ctrl-C in the cmd window to shut down the server.
- rails server stops working when you disable the command prompt window
8) Download Redmine and extract the .zip file. Replace the files generated in D:\Documents\Developer\RubyRoot\redmine\ with the files from the .zip file replacing any files when prompted
9) Create your Redmine database. Start Apache and MySql from the Xampp control panel, and in your browser, go to http://localhost/phpmyadmin to access the MySQL interface.
Click the SQL tab and run the following:
create database redmine character set utf8;
create user 'redmineUser'@'localhost' identified by 'myPassword';
grant all privileges on redmine.* to 'redmineUser'@'localhost';
10) Configure Redmine in the redmine/conf/database.yml file by adding your newly created database, username, and password in the appropriate locations.
- the /conf/ folder is now /config/ to redmine/config/database.yml
it should only contain the following
production:
adapter: mysql2
database: redmine
host: localhost
username: root
password: ""
encoding: utf8
- if like me you are running MySQL on another port you also need to add another setting
Info from here - Redmine Wiki - Redmine Install
production:
adapter: mysql2
database: redmine
host: localhost
port: 3307
username: root
password: ""
encoding: utf8
11) In the cmd window, make sure you are still in your Redmine project’s directory, and run the following command:
bundle install
- my install ‘failed’ here and actually failed quite quickly
- I got the error
DL is deprecated, please use Fiddle
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
You have requested:
i18n ~> 0.6.11
The bundle currently has i18n locked at 0.7.0.
Try running `bundle update i18n`
- So I typed ‘bundle update i18n’
- I then got the error
DL is deprecated, please use Fiddle
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Bundler could not find compatible versions for gem "actionpack":
In snapshot (Gemfile.lock):
actionpack (4.1.8)
In Gemfile:
rails (= 3.2.21) x86-mingw32 depends on
actionpack (= 3.2.21) x86-mingw32
Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
- I then typed ‘bundle update’
12) In all likelihood, it will fail epically when it gets to the rmagick gem (if not, lucky you). Go to http://rubyforge.org/projects/rmagick/ and download the file called rmagick-win32.
a) Install the Ruby Installer DevKit: https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
- the devkit is part of the Railsinstaller so does not need to be downloaded
D:\Documents\Developer\RailsInstaller\DevKit
proceed to next step (b) if DevKit is Present
the configured config.yml contains the following line only: (keep the dash)
- D:/Documents/Developer/RailsInstaller/Ruby2.1.0
- RubyGems.org Replaces RubyForge as Gem Host - tells you to download gems on RubyGems.org
- HowTo install rmagick gem on Windows - Redmine - this tells of which check boxes to tick
- Installing on Windows · rmagick/rmagick Wiki · GitHub - another rmagik install on windows article and tells the maximum version that works is 6.7.9.9
- Installing RMagick on Windows 7 | Coding with Bunnies - excellent article
- http://rubyinstaller.org/downloads/ - download the devkit here
- if the configuration file will not auto generate you can just edit it manually (see above for setting).
- the configuration file is autogenerated when the command ruby dk.rb init
- Can't get Ruby DevKit configuration file autogenerated properly - Stack Overflow
- Ruby on rails devkit windows - Stack Overflow
- Install Ruby DevKit on Windows 7
- Install Ruby and the Ruby DevKit
- the dev kit needs to match the x32 or x64 of ruby - run 'ruby - v' to see what version
- ruby.rb init - this finds ruby installs and edits the config.yml , this does not always work. if this does not work you need to manuall add the entry
note the dash, it is important, installation of the devkit means, just extract it somewhere
- D:\Documents\Developer\Ruby\DevKit
- if for some reason you need to manuall install the Devkit, when you extract the devkit to the specified folder, you must not change that folder or name. the 7zip has magic in it and hardcodes the install directory
b) Download Imagemagick (check the box to install headers in the installer) : http://www.imagemagick.org/script/binary-releases.php#windows
- make sure that the following are both checked.
“Add Application directory to your system path”
“Install development headers and libraries for C and C++”
- download only the 32-Bit version, installs with x64 will not compile, it will give errors
- the latest version of ImageMagick that will work with rails is 6.7.9.9
- I don’t know the difference netween static or dynamic
- the exact file that I used and worked is ImageMagick-6.7.9-9-Q16-windows-dll.exe
- if 6.7.9.9 will not work another recommendation is 6.7.9.9
- you can get old binaries here: ftp://ftp.sunet.se/pub/multimedia/graphics/ImageMagick/binaries/ImageMagick-6.7.9-9-Q16-windows-x64-dll.exe
c) Install ImageMagick to a location that does NOT contain any spaces in the directory names (like C:\ImageMagick)
- I did D:\Documents\Developer\ImageMagick
d) In the cmd window, run the following:
gem install rmagick --platform=ruby -- --with-opt-lib=c:/ImageMagick/lib --with-opt-include=c:/ImageMagick/include
- is this process creating a GEM (possibly this is compiling the code)
- when installing make sure the 3 following items are checked
- I did gem install rmagick --platform=ruby -- --with-opt-lib=d:/Documents/Developer/ImageMagick/lib --with-opt-include=d:/Documents/Developer/ImageMagick/include
e) Wait. This seems to take an ungodly amount of time, for some reason.
- about 10 – 15 mins on new PC
- it will finish with a “1 gem installed” message
13) Run “bundle install” again.
- my install failed here and actually failed quite quickly
- I got the error
DL is deprecated, please use Fiddle
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
You have requested:
i18n ~> 0.6.11
The bundle currently has i18n locked at 0.7.0.
Try running `bundle update i18n`
- So I typed ‘bundle update i18n’
- I then got the error
DL is deprecated, please use Fiddle
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Bundler could not find compatible versions for gem "actionpack":
In snapshot (Gemfile.lock):
actionpack (4.1.8)
In Gemfile:
rails (= 3.2.21) x86-mingw32 depends on
actionpack (= 3.2.21) x86-mingw32
Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
- I then typed ‘bundle update’
- I then get the error:
Gem files will remain installed in D:/Documents/Developer/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/mysql2-0.3.17 for inspection.
Results logged to D:/Documents/Developer/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/extensions/x86-mingw32/2.1.0/mysql2-0.3.17/gem_make.out
An error occurred while installing mysql2 (0.3.17), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.3.17'` succeeds before bundling.
14) Manually install the mysql2 gem. For some reason, bundle install doesn’t know how to do this right on Windows.
15) In the cmd window, execute the following commands:
Make sure that your MySQL server is running before continuing
set RAILS_ENV=production
rake generate_secret_token
rake db:migrate
rake redmine:load_default_data
* That last line is optional. It installs the demo data
- after I run rake generate_secret_token I get an error:
Could not find gem 'selenium-webdriver (>= 0) x86-mingw32' in the gems available on this machine.
Run `bundle install` to install missing gems.
- so I ran ‘bundle install’
- then ‘bundle update i18n’
- then bundle update (perhaps I should of run this in the beginning)
- then re-run rake generate_secret_token
if you still get error messages after successfully installing the the MySQL Connector then you should make sure you have copied the libmysql.dll file to the correct directory and then reboot your computer before continuing.
- back to rake db:migrate (this correctely creates the tables)
16) Start the rails server. In the cmd window, navigate to D:\Documents\Developer\RubyRoot\redmine and execute the following:
rails server
17) In your browser, navigate to http://localhost:3000 where you should now see the Redmine homepage.
18) If you’re still sane, enjoy your new Redmine install.
** It’s also worth noting that Redmine won’t actually be RUNNING on XAMPP’s Apache server. It will be running on the Rails server. This just makes it play nice with a new or existing XAMPP install.
Once you have completed your Redmine installation there are a few things you might come across or need to do.
Gems are like plugins for ruby and like a lot of linux systems are downloaded from the internet upon demand rather than being present in your system from the start.
A useful thing is that you can get the different version/revision names from https://rubygems.org/ . If you search this site for your Gem it will give yoou all the previous revisions and actually gives you the install command for that particular version.
Example: gem install win32-service -v 0.8.5
From: https://rubygems.org/gems/win32-service
A good article on Gems, Installing and Uninstalling, RubyMine 7.0.2 Web Help
This process is failry easy.
To install a gem
Gem uninstall <gem_name>
You can install specific version fof a gem and this can be handy whent here are incompatabilities between vearious gems and software in your install.
If you run the install command with no version number, the latest version of the gem will be installed.
To uninstall a gem
Gem uninstall <gem_name>
When you run uninstall a gem with this command, if there are multiple versions of it, the uninstaller will give you the options of which one to uninstall or all of them.
These are my indepth instructions on integrating Mantis with subversion. This came about because i had a website but no subversion server and the easiest way of getting one of those is to install it on my local PC. I then wanted to integrate Subversion with Mantis so when i closed a job it did it automatically. I thought ther would be an easy way of doing this, there is if both the Subversion and Mantis are installed on the same physical machine. I coveer all the integration types here and hopefully fill in a few blanks. I did find the documentation for this whole process lacking. I have scanned the web, categorised these links and figured out the integration for both remote and local integration.
There are a few ways of integrating Matis with a Subversion server and i will outline them below. My instructions will more than likely concentrate on integrating with CollabNet Subversion Edge but i will add some notes on VisualSVN aswell.
For those who want it working and are not to bothered how, if you click this link it will take you straight to my instructions on what i did, no fluff, just 1.2.3...
General Links
Hook Links
Text Notes / Questions
This is the native basic inbuilt script in Mantis for integrating a Subversion server on the same machine. However with some modification can be used for closing issues from a remote SVN Server.
How Does it work?
The script /mantis/scripts/checkin.php is native to Mantis and 'Provides source control (SCM) integration for closing bugs upon commits'.
This script is used to post infromation about a commit to a remote Subversion Repository. The basic mechanisim is outlined below and assumes the integration is configured correctely.
This method requires the SVN post-commit hook to have a script on it to run when it is triggered to POST the commit notes to Mantis. Also in mantis you need to add certain settings to the config_inc.php, these settings includes the REGEX settings.
Now a legacy!!
This is now a legacy method of connection your svn server to mantis because it is:
It should be noted that are some work arounds to allow you to use a remote subversion server with checkin.php and i will make a note of them here to complete my research so you guys dont have to go the hard way to figure all of this out.
Old Read These
As mention above there are a couple of ways to get checkin.php to work so i will outline these here.
The standard code of Mantis does not allow for web access of the checking script for one reason or another. I have come across 2 unique and clever solutions
Generic Subversion
VisualSVN / Windows
The Source Plugin provides a flexible framework for fully integrating any sort of Version Control System (VCS) with Mantis, including support for multiple repositories, changesets or revisions, and file path tracking. It has many features already, such as importing repository history and optional support for remote check-ins or imports, and utilizes a class-based API to access objects in the database.
Source require you to install the Source Core and then an appropriate plugin. There are several plugins and they are available from here... and support several plaforms. Only WebSVN currently has support toa loow to run your own server remotely, the rest are either online services or require Mantis and your Subversion Server to be on the same machine. Beacuse this is a plugin all of the configuration options are handled within the Mantis Plugin Panel, so no code is required to be altered.
The Process Overview
All plugins require a post-commit hook to be configured in the Subversion repository to post information to Mantis.
The checkin / issue close process is simliar to the checkin.php but all the regex settings are configured in the plugin installed in Mantis, the POST URL is different, and the POST only informs Mantis Source that a changes has been made and where to find it, which it then does to aquire all the information whereas the checkin.php method sends all the information in one go to Mantis.
Different Post Locations for Source
These are some alternative SourceSVN POST URLs that do slightly different things but are not well documented.
http://<your mantis server>/mantis/plugin.php?page=Source/import&id=all&api_key=<your api key> http://<your mantis server>/mantis/plugin.php?page=Source/import&id=all http://<your mantis server>/mantis/plugin.php?page=Source/repo_import_latest&id=XX http://<your mantis server>/mantis/plugin.php?page=Source/index http://<your mantis server>/mantis/plugin.php?page=Source/checkin
Some of these should have variables with them, via POST or GET (is possibly valid)
Files can be download here (download the files by clicking 'download zip' on the right). You will also find some simple instructions for installing the plugins.
To get Source to work you need to install its core and then the additional plugin for the platform for you choice. But for now we will just deal with the Source Core
Official Instructions Here (scroll down)
Installation Notes
Configuration
Most of the options are preconfigured and dont need touching but i will describe what the options are becaus ei have not found descriptions elsewhere. If you need to set any they will be listed at the end.
This plugin is used to allow direct integration with a local Subversion server (ie on same PC / Machine). It must have direct access to the binaries but can run on either windows or Linux.
You need to configure a batch file to be run when a commit is made on the Subversion Server. This trigger is called a hook. When you have created your repository there will be a folder inside called Hooks. Each repository gets its own Hooks folder so this process will need to be repeated for each repository.
My instructions are based on me running a CollabNet Subversion Edge Locally on my PC.
Linux / Unix post-commit.tmpl
This is an example post-commit script that is found in plugin, /SourceSVN/post-commit.tmpl . It is clearly written for Linux, so will not run on windows.
#!/bin/sh # Copyright (c) 2012 John Reese # Licensed under the MIT license REV="$2" URL="http://localhost/mantisbt/plugin.php?page=Source/checkin" PROJECT="Repository Name" API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxx" LOG_FILE=`mktemp /tmp/svn_${PROJECT}_${REV}_log.XXX` CURL=/usr/bin/curl ${CURL} -d "repo_name=${PROJECT}" -d "data=${REV}" -d "api_key=${API_KEY}" ${URL} >> ${LOG_FILE}
Windows post-commit.bat
@ECHO OFF SET REV=%2 SET URL="http://localhost/mantisbt/plugin.php?page=Source/checkin" SET PROJECT="Repository Name - exactly the same as set in mantis ?" SET API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxx" LOG_FILE="%PROJECT%_%REV%_log.XXX" D:\Documents\Developer\SubversionEdge\curl.exe -d "repo_name=%PROJECT%" -d "data=%REV%}" -d "api_key=%API_KEY%" %URL% >> %LOG_FILE% rem this is better. logging is optional rem D:\Documents\Developer\SubversionEdge\curl.exe -d "repo_name=%PROJECT%" -d "data=%REV%}" -d "api_key=%API_KEY%" %URL% >> %PROJECT%_%REV%.log
You will need to download the correct version of CURL to allow POSTs from the command line. You can also use wget via Cygwin.
These links will include all the basic POST information as well as setup information becasue they are all required for further plugins relating to Subversion on a Local PC.
Generic Subversion
VisualSVN / Windows
WebSVN allows you to show File / Revision differences by using a web browser and this plugin integrates WebSVN. This is an extension to Source Integration and requires the SourceSVN plugin to be installed.
You should install Source Integration Core and SourceSVN and SourceWebSVN. These should already be done from the steps above.
As WebSVN doesnt seem to be developed anymore, there is a replacement Web Based Fifference View called ViewVC. This come preconfigured in CollabNet Subversion Edge. Perhaps the developr could look at making this a plugin and while he is at it consider making it possibly to remotely ccess a Subversion server and which case CollabNet Subversion Edge will be perfect as it has a REST API just for this sort of thing.
Generic Subversion
VisualSVN / Windows
This section for for custom integrations such as direct database accessing
Generic Subversion
VisualSVN / Windows
This are the real bare bone instructions of what i did to get the particular methods to work. litterately just what you should to do to get things working. If you want more you should read the rest of the article but i do know people either just want a quick fix or find it easier to process things when it is working.
I have covered the 2 distinct methods of Remote checkin.php via Gateway PHP script (Not fully working) and Remote checkin.php via Altered checkin.php to accept $_POST
NB: all of this code where appropriate, has logging enabled to help you get this setup, but it is not required for operation
<?php // For testing if your data is getting POSTed echo "\r\n"; echo "This is the POSTed data at checkin.php"; echo "\r\n"; echo 'Secret: '; echo $_POST['secret']; echo "\r\n"; echo "\r\n"; echo 'Message:'; echo "\r\n"; echo $_POST['message']; echo "\r\n"; //exit; // For diagnostics only echo 'Connection Made'; echo "\r\n"; // Very cheap security measure, simply so that not just *anybody* can post issues. if ($_POST['secret'] !== 'somePasswordHere') { echo 'You are not Authorised'; echo "\r\n"; // for diagnostics only exit; } // For diagnostics only echo 'Authorised, I will now process the Data'; echo "\r\n"; $cmd = 'php checkin.php <<< ' . escapeshellarg($_POST['message']); system($cmd); // For diagnostics only echo 'Data POSTed'; echo "\r\n"; // To prevent infinite looping exit;
Notes
some webservers will has the command line (CLi) disabled. to fix this we need to enabled system(); This is done by the following:
You have now enable CLi for this folder only. if this is a little insecure for you because people will know where to look. You can create a completely random folder any where on your website with a whacky URL and put the do_checkin.php file in there and just alter the file locations appropriately. Then this will also hide this gateway to the regular internet.
This hook methods relies on a post-commit.bat being triggered by Subversion which in turn triggers a powershell script which allows us to grab more information about the revision/commit to send this to mantis. Such as real author, time and comments.
@ECHO OFF rem For live Subversion Server rem SET REPOS=%1 rem SET REV=%2 rem For local testing by directly setting variables to use with directely running post-commit.bat rem saves having to make a change for each submit and the process with that SET REV="1" SET REPOS="D:\Documents\Developer\SubversionEdge\data\repositories\Test" CD %REPOS%\hooks C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File %REPOS%\hooks\post-commit.ps1 "%REPOS%" "%REV%"
This file is what Subversion executes and is where you can change it from live to test. And by Live and Test i mean where you load the variables from. To use in the live mode while testing can be a pain because you have to change a file and submit it with TortoiseSVN everytime you want to use it. Instead i have added the Test mode where you can set the variables REPOS & REV with some arbitrary data allowing you to manually execute post-commit.bat from the command line on your window PC allowing for rapid testing and deployment.
The file above is already configured to be in Test modes, to change it to use the real variables from the Subversion Server (assumes you use a real SVN commit) you need too:
Rem out these Lines
UnRem these Lines
Done, you have now changed the mode. Both these methods will communicate with your website so just bear this in mind.
[System.Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null # output this to send a newline operation to the log file $newline = "`r`n" ## -------------------------------------------------- ## get environmental variables set by Subversion ## -------------------------------------------------- $REPOS = $args[0] $REV = $args[1] "$REPOS $REV" ## -------------------------------------------------- ## Manually load information from Subversion ## Commit/Rev Author, Date, Time, Comment, Changed Files(s) ## -------------------------------------------------- $svnlook = 'D:\Documents\Developer\SubversionEdge\bin\svnlook.exe' $auth = & $svnlook author -r $REV $REPOS $dt = & $svnlook date -r $REV $REPOS $changed = & $svnlook changed -r $REV $REPOS $changed = $changed -join "`n" $log = & $svnlook log -r $REV $REPOS $log = $log -join "`n" $data = "Changeset [${REV}] by $auth, $dt $log $changed" ## -------------------------------------------------- ## POSTing information to checkin.php ## -------------------------------------------------- $postData = "secret=somePasswordHere&message=" $postData += [System.Web.HttpUtility]::UrlEncode($data) # outputs the post to the logfile (appends)(for diagnostics only) Write-Output "This is the data POSTed to checkin.php" >> checkin-response.log $postData >> checkin-response.log # POSTing using wget and cywin (creates/replaces log with response) #D:\cygwin64\bin\wget.exe -O checkin-response.log --post-data=$postData http://exampleserver.com/sp/mantis/scripts/do_checkin.php # POSTing with CURL (exactly the same as wget above)(creates/replaces log with response)(seems slightly slower than wget) #D:\Documents\Developer\SubversionEdge\curl.exe -d $postData http://exampleserver.com/sp/mantis/scripts/do_checkin.php > checkin-response.log # POSTing with CURL (same as wget above, but appends log with response)(seems slightly slower than wget) D:\Documents\Developer\SubversionEdge\curl.exe -d $postData http://exampleserver.com/sp/mantis/scripts/do_checkin.php >> checkin-response.log ## -------------------------------------------------- ## POSTing with CURL (alternate syntax) ## -------------------------------------------------- # you must disable $postData and other POSTing method above befor using this #$secret = 'somePasswordHere' #$postData = [System.Web.HttpUtility]::UrlEncode($data) # my prefered CURL call (append output to log file) #D:\Documents\Developer\SubversionEdge\curl.exe -d secret=$secret -d message=$postData http://exampleserver.com/sp/mantis/scripts/do_checkin.php >> checking-response.log ## CURL Syntax # Posting variables: -d secret=$secret, -d "secret=$secret", -d secret=somePasswordHere, -d $postData, -d "$postData", -d "message=$postData", -d message=$postData # Append to log (add at end): >> checkin-response.log, >> D:\checkin-response.log # Replace log (add at end): | Out-File checkin-response.log, > checkin-response.log ## -------------------------------------------------- # start a newline in the log file - useful when appending to log file $newline >> checkin-response.log # Delete checkin-response.log #rm checkin-response.log
In this file you will see a lot of code that is not used. I have left this code in there so people, including me, can check syntaxes should they ever wish to make changes because unless you have come across these commands before you could spend quite a lot of time just reseaching the basics.
This file is a Windows Poweshell Script and until i did this project i have never used Powershell. It allows us, via the command line, to use svnlook and get extra information formt he Subversion server that is not passed in the variables we have to work with. We will use this data to populate the close message in the Mantis issue with some more data other than closed. It makes the integration a little tighter.
Errors You might get when running this powershell script (seen best when you manually run post-commit.bat from the command line)
Whilst trying to get the script to work i got these error message, which means more than likely you guys will at some point. So i ahve pasted the errors and their solutions. Simple as that.
D:\Documents\Developer\SubversionEdge\data\repositories\Test\hooks>post-commit.bat The term 'D:\Documents\Developer\SubversionEdge\data\repositories\Test\hooks\post-commit.ps1 D:\ Documents\edgeSVN\data\repositories\Test ' is not recognized as the name of a c mdlet, function, script file, or operable program. Check the spelling of the na me, or if a path was included, verify that the path is correct and try again. At line:1 char:115 + D:\Documents\Developer\SubversionEdge\data\repositories\Test"\hooks\post-commit.ps1 "D:\Docume nts\edgeSVN\data\repositories\Test" " <<<< + CategoryInfo : ObjectNotFound: (D:\Documents\ed...ositories\Tes t :String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
most likely the file path or name is wrong
D:\Documents\Developer\SubversionEdge\data\repositories\Test\hooks>post-commit.bat File D:\Documents\Developer\SubversionEdge\data\repositories\Test\hooks\post-commit.ps1 cannot b e loaded because the execution of scripts is disabled on this system. Please se e "get-help about_signing" for more details. At line:1 char:66 + D:\Documents\Developer\SubversionEdge\data\repositories\Test\hooks\post-commit.ps1 <<<< D:\Do cuments\edgeSVN\data\repositories\Test + CategoryInfo : NotSpecified: (:) [], PSSecurityException + FullyQualifiedErrorId : RuntimeException
because i am on windows x64, by default it will not run unsigned code so i added -ExecutionPolicy ByPass -File into the command for powershell
These are all of the Mantis related changes you need to do.
For some unknown reason you need to add these variables into the config file. They are put there because they become globally available, but i think they should of been there in the first place. These variables are used to match issue number in your comments so it know which issue to close. These can be altered if you know regex to match prefered words ie fixed issue #500.
# Array of allowed SVN hosts that can close issues via curlcheckin.php $g_source_control_server = '127.0.0.1'; # Account to be used by the source control script. The account must be enabled # and must have the appropriate access level to add notes to all issues even # private ones (DEVELOPER access recommended). $g_source_control_account = 'svn'; # Checks for 'Issue' references in the comment - used so the comment can be assigned to the correct issue # Regular expression used to detect issue ids within checkin comments. # see preg_match_all() documentation at (detect bug or issue in comment) $g_source_control_regexp = '/(?:bugs?|issues?|reports?)+\s*:?\s+(?:#(?:\d+)[,\.\s]*)+/i'; # Check for 'Fixed Issue' references in the comment - used to id issues that need closing # Regular expression used to detect the fact that an issue is fixed and extracts # its issue id. If there is a match to this regular expression, then the issue # will be marked as resolved and the resolution will be set to fixed. $g_source_control_fixed_regexp = '/(?:fixe?d?s?|resolved?s?)+\s*:?\s+(?:#(?:\d+)[,\.\s]*)+/i'; # For open source projects it is expected that the notes be public VS_PUBLIC, however, # for non-open source it will probably be VS_PRIVATE. $g_source_control_notes_view_status = VS_PRIVATE; # If set to a status, then after a checkin with a log message that matches the regular expression in # $g_source_control_fixed_regexp, the issue status is set to the specified status. If set to OFF, the # issue status is not changed. Use CLOSED if you prefer. $g_source_control_set_status_to = RESOLVED; # Whenever an issue status is set to $g_source_control_set_status_to, the issue resolution is set to # the value specified for this configuration. $g_source_control_set_resolution_to = FIXED;
There are some basic settings and obvious stuff to be done in matis.
Obviously you need to install one of these at least to be able to perfomr the POSt from the command line. You dont need both unless you want to play.
Now this is where things get tricky. I have not been able to make a successful issue close on mantis yet and i believe that is because of the securoty on my web server. If any one manages to get this working i would like to here how.
What i have managed to do is get the Subversion post-commit to POST all the required data to my do_checkin.php successfully.
Below are some responses i get in the log files:
Test Mode set in post-commit.bat
This is the data POSTed to checkin.php secret=somePasswordHere&message=Changeset+%5b1%5d+by+SYSTEM%2c+2015-01-09+18%3a01%3a24+%2b0000+(Fri%2c+09+Jan+2015)%0d%0aCreating_initial_branch_structure%0d%0aA+++branches%2f%0aA+++tags%2f%0aA+++trunk%2f This is the POSTed data at checkin.php Secret: somePasswordHere Message: Changeset [1] by SYSTEM, 2015-01-09 18:01:24 +0000 (Fri, 09 Jan 2015) Creating_initial_branch_structure A branches/ A tags/ A trunk/ Connection Made Authorised, I will now process the Data Content-type: text/html This is the POSTed data at checkin.php Secret: Message: Connection Made You are not Authorised Data POSTed
How To Run
see the A lines, this is because no information matches a Revision and so it gets an invalid lookup
Live Mode set in post-commit.bat
This is the data POSTed to checkin.php secret=somePasswordHere&message=Changeset+%5b54%5d+by+admin%2c+2015-01-17+17%3a14%3a04+%2b0000+(Sat%2c+17+Jan+2015)%0d%0aWe+have+fixed+issue+%230000001+and+solved+some+things+etc.+This+is+a+test+commit%0d%0aU+++trunk%2fchangelog.txt This is the POSTed data at checkin.php Secret: somePasswordHere Message: Changeset [54] by admin, 2015-01-17 17:14:04 +0000 (Sat, 17 Jan 2015) We have fixed issue #0000001 and solved some things etc. This is a test commit U trunk/changelog.txt Connection Made Authorised, I will now process the Data Content-type: text/html This is the POSTed data at checkin.php Secret: Message: Connection Made You are not Authorised Data POSTed
How To Run
So this is where i am at. I (with help from alt-tag, GraFX, LinLog) have got all the information to the Mantis checkin.php but cannot get that part of the process to work. All is not lost because with the work i have do here someone else might be able to finish.
If you have a private server or even a server on a local network (seperate mantis and subversion servers) this method might work as is.
In this method i have rewritten the checkin.php to accept information via $_POST and will not require CLI access which eludes me, i have also renamed it curlcheckin.php so no core code is hacked.
For further information read the appropriate sections from Remote checkin.php via Gateway PHP script - What i did (Not fully working), this prevents me from duplicating the instructions and having to maintain the text twice.
NB: some of this code where appropriate, has logging enabled to help you get this setup, but it is not required for operation
use the instructions above for extra information
<?php # MantisBT - a php based bugtracking system # Copyright (C) 2000 - 2002 Kenzaburo Ito - kenito@300baud.org # Copyright (C) 2002 - 2014 MantisBT Team - mantisbt-dev@lists.sourceforge.net # MantisBT is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # MantisBT is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with MantisBT. If not, see <http://www.gnu.org/licenses/>. # See the README and LICENSE files for details # -------------------------------------------------------- # $Id: checkin.php,v 1.5.2.1 2007-10-13 22:35:16 giallu Exp $ # from https://www.mantisbt.org/bugs/view.php?id=8847 # Updated 17-01-2015 shoulders @ exampleserver.com # -------------------------------------------------------- global $g_bypass_headers; $g_bypass_headers = 1; require_once( dirname( dirname( __FILE__ ) ) . DIRECTORY_SEPARATOR . 'core.php' ); // Very cheap security measure, simply so that not just *anybody* can post issues. if ($_POST['secret'] !== 'somePasswordHere') { echo 'You are not Authorised'; echo "\r\n"; // for diagnostics only exit; } /*# check if we are called from the right IP ( @todo might wanna use a array here ) # Only works for dedicated IP addresses $t_source_control_server = config_get( 'source_control_server' ); if($_SERVER['REMOTE_ADDR'] != $t_source_control_server ) { echo "Not allowed from this IP !!\n"; exit(0); }*/ # Check that the username is set and exists $t_username = config_get( 'source_control_account' ); if( is_blank( $t_username ) || ( user_get_id_by_name( $t_username ) === false ) ) { echo "Invalid source control account ('$t_username').\n"; exit( 1 ); } # Detect references to issues + concat all lines to have the comment log. $t_commit_regexp = config_get( 'source_control_regexp' ); $t_commit_fixed_regexp = config_get( 'source_control_fixed_regexp' ); # make sure both the regex scanner and final output gets the full message $t_line = $_POST['message']; $t_comment = $_POST['message']; echo $message; # Regex Scanning of Comment $t_issues = array(); $t_fixed_issues = array(); if( preg_match_all( $t_commit_regexp, $t_line, $t_matches ) ) { $t_count = count( $t_matches[0] ); for( $i = 0;$i < $t_count;++$i ) { $t_issues[] = $t_matches[0][$i]; } } if( preg_match_all( $t_commit_fixed_regexp, $t_line, $t_matches ) ) { $t_count = count( $t_matches[0] ); for( $i = 0;$i < $t_count;++$i ) { $t_fixed_issues[] = $t_matches[0][$i]; } } # If no issues found, then no work to do. if ( ( count( $t_issues ) == 0 ) && ( count( $t_fixed_issues ) == 0 ) ) { echo "Comment does not reference any issues.\n"; exit(0); } # If no issues found, then no work to do. if(( count( $t_issues ) == 0 ) && ( count( $t_fixed_issues ) == 0 ) ) { echo "Comment does not reference any issues.\n"; exit( 0 ); } # Login as source control user if( !auth_attempt_script_login( $t_username ) ) { echo "Unable to login\n"; exit( 1 ); } /* // not implemented needs additonal coding and $_POST['user'] configuring in the post-commit.bat # first we try to figure out if we can login with the source control/Subversion username. # Usernames on Subversion and Mantis should match $temp_username = user_get_name_by_source_control_id( $_POST['user'] ); if( !auth_attempt_script_login( $temp_username ) ) { # Login as source control user if ( !auth_attempt_script_login( $t_username ) ) { echo "Unable to login\n"; exit( 1 ); } } */ # history parameters are reserved for future use. $t_history_old_value = ''; $t_history_new_value = ''; # add note to each bug only once $t_issues = array_unique( $t_issues ); $t_fixed_issues = array_unique( $t_fixed_issues ); # Call the custom function to register the checkin on each issue. foreach( $t_issues as $t_issue_id ) { if( !in_array( $t_issue_id, $t_fixed_issues ) ) { $matches = Null; preg_match('/#?(\\d+)/', $t_issue_id, $matches); $t_issue_id = $matches[1]; helper_call_custom_function( 'checkin', array( $t_issue_id, $t_comment, $t_history_old_value, $t_history_new_value, false ) ); } } foreach( $t_fixed_issues as $t_issue_id ) { $matches = Null; preg_match('/#?(\\d+)/', $t_issue_id, $matches); $t_issue_id = $matches[1]; helper_call_custom_function( 'checkin', array( $t_issue_id, $t_comment, $t_history_old_value, $t_history_new_value, true ) ); } exit( 0 );
Follow the instructions above.
Follow the instructions above.
Follow the instructions above.
This method is fully working with extended comments and to be honest should of been like from the beginning also native to Mantis. It appears that in the next version of mantis that this methods has been removed. I am sure it will be very easy to add back in and from what i can see it only utilises an inbuilt fuction helper_call_custom_function() to post the comments to the issue and process the issue status.
Although Mantis is moving towards using Source Integration Plugin as its primary integrator, which is good, for those of us who do not have their Subversion Server and mantis on the same server this removal will cause problems.
One way around this is for Mantis / John Reese to add Remote Subversion support by utilising CollabNet Subversion Edge's REST API whilst also adding support for ViewVC which is an excellent Web based Difference viewer that comes preconfigured in this package. It should be noted that ViewVC is availabe as a seperate package.
Most techies that i know use PCs and some have websites. This is probably a large group of people that have PCs and basic websites where they could host Mantis but not a Subversion Server and that is where CollabNet Subversion Edge comes in handy as this setup would be the first suitable arrangement they come across, Mantis on website, Subversion on their own PC.
You might come across the following error or one similiar
An Exception Has Occurred Python Traceback Traceback (most recent call last): File "D:\Documents\Developer\SubversionEdge\lib\viewvc\viewvc.py", line 5068, in main request.run_viewvc() File "D:\Documents\Developer\SubversionEdge\lib\viewvc\viewvc.py", line 462, in run_viewvc self.view_func(self) File "D:\Documents\Developer\SubversionEdge\lib\viewvc\viewvc.py", line 2382, in view_roots expand_root_parents(request.cfg) File "D:\Documents\Developer\SubversionEdge\lib\viewvc\viewvc.py", line 4941, in expand_root_parents roots = vclib.svn.expand_root_parent(pp) File "D:\Documents\Developer\SubversionEdge\lib\viewvc\vclib\svn\__init__.py", line 76, in expand_root_parent roots[rootname] = canonicalize_rootpath(rootpath) File "D:\Documents\Developer\SubversionEdge\lib\viewvc\vclib\svn\__init__.py", line 39, in canonicalize_rootpath rootpath = _canonicalize_path(rootpath) File "D:\Documents\Developer\SubversionEdge\lib\viewvc\vclib\svn\__init__.py", line 23, in _canonicalize_path import svn.core File "D:\Documents\Developer\SubversionEdge\lib\svn-python\svn\core.py", line 26, in <module> from libsvn.core import * File "D:\Documents\Developer\SubversionEdge\lib\svn-python\libsvn\core.py", line 25, in <module> _core = swig_import_helper() File "D:\Documents\Developer\SubversionEdge\lib\svn-python\libsvn\core.py", line 21, in swig_import_helper _mod = imp.load_module('_core', fp, pathname, description) ImportError: DLL load failed: The operating system cannot run %1.
To Fix this you should try the following things (and probably in order)
Links
Links
SVN Clients
Plugins for Programs / IDE
Binary Repository Listing Commands