git-issue 0.8.2 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +1 -0
 - data/README.markdown +11 -1
 - data/lib/git_issue.rb +5 -3
 - data/lib/git_issue/base.rb +5 -1
 - data/lib/git_issue/github.rb +59 -32
 - data/lib/git_issue/redmine.rb +39 -18
 - data/lib/git_issue/version.rb +1 -1
 - metadata +4 -4
 
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.markdown
    CHANGED
    
    | 
         @@ -21,7 +21,7 @@ now available issue-tracker system is Redmine and Github-issues. 
     | 
|
| 
       21 
21 
     | 
    
         
             
                $ gem install jeweler
         
     | 
| 
       22 
22 
     | 
    
         
             
                $ rake install
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
            ## Configuration
         
     | 
| 
      
 24 
     | 
    
         
            +
            ## Configuration(Redmine)
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
            set type of issue traking system(redmine or github)
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
         @@ -43,6 +43,16 @@ set your account name if using github. 
     | 
|
| 
       43 
43 
     | 
    
         | 
| 
       44 
44 
     | 
    
         
             
                $ git config issue.user yuroyoro
         
     | 
| 
       45 
45 
     | 
    
         | 
| 
      
 46 
     | 
    
         
            +
            ## Configuration(Github Issues)
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            set type of issue traking system(redmine or github)
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                $ git config issue.type github
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            set user and password of github(for authentication)
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                $ EDITOR=vim pit set github
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
       46 
56 
     | 
    
         
             
            ## Usage(Redmine)
         
     | 
| 
       47 
57 
     | 
    
         | 
| 
       48 
58 
     | 
    
         
             
                git issue <command> [ticket_id] [<args>]
         
     | 
    
        data/lib/git_issue.rb
    CHANGED
    
    | 
         @@ -16,6 +16,7 @@ require 'optparse' 
     | 
|
| 
       16 
16 
     | 
    
         
             
            require 'tempfile'
         
     | 
| 
       17 
17 
     | 
    
         
             
            require 'active_support/all'
         
     | 
| 
       18 
18 
     | 
    
         
             
            require 'shellwords'
         
     | 
| 
      
 19 
     | 
    
         
            +
            require 'term/ansicolor'
         
     | 
| 
       19 
20 
     | 
    
         | 
| 
       20 
21 
     | 
    
         
             
            module GitIssue
         
     | 
| 
       21 
22 
     | 
    
         
             
              class Command
         
     | 
| 
         @@ -39,8 +40,9 @@ module GitIssue 
     | 
|
| 
       39 
40 
     | 
    
         | 
| 
       40 
41 
     | 
    
         | 
| 
       41 
42 
     | 
    
         
             
                def configured_value(name, trim = true)
         
     | 
| 
       42 
     | 
    
         
            -
                  res = `git config  
     | 
| 
       43 
     | 
    
         
            -
                  trim ? res.strip : res
         
     | 
| 
      
 43 
     | 
    
         
            +
                  res = `git config #{name}`
         
     | 
| 
      
 44 
     | 
    
         
            +
                  res = trim ? res.strip : res
         
     | 
| 
      
 45 
     | 
    
         
            +
                  res
         
     | 
| 
       44 
46 
     | 
    
         
             
                end
         
     | 
| 
       45 
47 
     | 
    
         | 
| 
       46 
48 
     | 
    
         
             
                def global_configured_value(name)
         
     | 
| 
         @@ -129,7 +131,7 @@ module GitIssue 
     | 
|
| 
       129 
131 
     | 
    
         
             
                status = true
         
     | 
| 
       130 
132 
     | 
    
         | 
| 
       131 
133 
     | 
    
         
             
                begin
         
     | 
| 
       132 
     | 
    
         
            -
                  its_type = Helper.configured_value('type')
         
     | 
| 
      
 134 
     | 
    
         
            +
                  its_type = Helper.configured_value('issue.type')
         
     | 
| 
       133 
135 
     | 
    
         | 
| 
       134 
136 
     | 
    
         
             
                  # Use global config for hub
         
     | 
| 
       135 
137 
     | 
    
         
             
                  if its_type.blank?
         
     | 
    
        data/lib/git_issue/base.rb
    CHANGED
    
    | 
         @@ -2,6 +2,7 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class GitIssue::Base
         
     | 
| 
       4 
4 
     | 
    
         
             
              include GitIssue::Helper
         
     | 
| 
      
 5 
     | 
    
         
            +
              include Term::ANSIColor
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
7 
     | 
    
         
             
              attr_reader :apikey, :command, :tickets, :options
         
     | 
| 
       7 
8 
     | 
    
         
             
              attr_accessor :sysout, :syserr
         
     | 
| 
         @@ -251,6 +252,7 @@ class GitIssue::Base 
     | 
|
| 
       251 
252 
     | 
    
         
             
                  opts.on("--remote=VALUE",     'on publish, remote repository to push branch ') {|v| @options[:remote] = v}
         
     | 
| 
       252 
253 
     | 
    
         
             
                  opts.on("--onto=VALUE",       'on rebase, start new branch with HEAD equal to "newbase" ') {|v| @options[:onto] = v}
         
     | 
| 
       253 
254 
     | 
    
         | 
| 
      
 255 
     | 
    
         
            +
                  opts.on("--no-color", "turn off colored output"){@no_color = true }
         
     | 
| 
       254 
256 
     | 
    
         
             
                  opts.on("--debug", "debug print"){@debug= true }
         
     | 
| 
       255 
257 
     | 
    
         
             
                }
         
     | 
| 
       256 
258 
     | 
    
         | 
| 
         @@ -264,6 +266,8 @@ class GitIssue::Base 
     | 
|
| 
       264 
266 
     | 
    
         
             
                @syserr.puts msg
         
     | 
| 
       265 
267 
     | 
    
         
             
              end
         
     | 
| 
       266 
268 
     | 
    
         | 
| 
       267 
     | 
    
         
            -
             
     | 
| 
      
 269 
     | 
    
         
            +
              def apply_colors(str, *colors)
         
     | 
| 
      
 270 
     | 
    
         
            +
                @no_color.present? ? str : (colors.map(&method(:send)) + [str, reset]).join
         
     | 
| 
      
 271 
     | 
    
         
            +
              end
         
     | 
| 
       268 
272 
     | 
    
         
             
            end
         
     | 
| 
       269 
273 
     | 
    
         | 
    
        data/lib/git_issue/github.rb
    CHANGED
    
    | 
         @@ -7,17 +7,28 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       7 
7 
     | 
    
         
             
              def initialize(args, options = {})
         
     | 
| 
       8 
8 
     | 
    
         
             
                super(args, options)
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                 
     | 
| 
       11 
     | 
    
         
            -
                @repo 
     | 
| 
      
 10 
     | 
    
         
            +
                @repo = configured_value('issue.repo')
         
     | 
| 
      
 11 
     | 
    
         
            +
                if @repo.blank?
         
     | 
| 
      
 12 
     | 
    
         
            +
                  url = `git config remote.origin.url`.strip
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @repo = url.match(/github.com[:\/](.+)\.git/)[1]
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
       12 
15 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
                @user = options[:user] || configured_value('user')
         
     | 
| 
      
 16 
     | 
    
         
            +
                @user = options[:user] || configured_value('issue.user')
         
     | 
| 
       14 
17 
     | 
    
         
             
                @user = global_configured_value('github.user') if @user.blank?
         
     | 
| 
       15 
18 
     | 
    
         
             
                @user = Pit.get("github", :require => {
         
     | 
| 
       16 
19 
     | 
    
         
             
                    "user" => "Your user name in GitHub",
         
     | 
| 
       17 
20 
     | 
    
         
             
                })["user"] if @user.blank?
         
     | 
| 
       18 
21 
     | 
    
         | 
| 
       19 
22 
     | 
    
         
             
                configure_error('user', "git config issue.user yuroyoro")  if @user.blank?
         
     | 
| 
       20 
     | 
    
         
            -
                @ 
     | 
| 
      
 23 
     | 
    
         
            +
                @ssl_options = {}
         
     | 
| 
      
 24 
     | 
    
         
            +
                if @options.key?(:sslNoVerify) && RUBY_VERSION < "1.9.0"
         
     | 
| 
      
 25 
     | 
    
         
            +
                  @ssl_options[:ssl_verify_mode] = OpenSSL::SSL::VERIFY_NONE
         
     | 
| 
      
 26 
     | 
    
         
            +
                elsif configured_value('http.sslVerify') == "false"
         
     | 
| 
      
 27 
     | 
    
         
            +
                  @ssl_options[:ssl_verify_mode] = OpenSSL::SSL::VERIFY_NONE
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
                if (ssl_cert = configured_value('http.sslCert'))
         
     | 
| 
      
 30 
     | 
    
         
            +
                  @ssl_options[:ssl_ca_cert] = ssl_cert
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
       21 
32 
     | 
    
         
             
              end
         
     | 
| 
       22 
33 
     | 
    
         | 
| 
       23 
34 
     | 
    
         
             
              def commands
         
     | 
| 
         @@ -54,7 +65,7 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       54 
65 
     | 
    
         | 
| 
       55 
66 
     | 
    
         
             
                url = to_url("repos", @repo, 'issues')
         
     | 
| 
       56 
67 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
                issues = fetch_json(url, params)
         
     | 
| 
      
 68 
     | 
    
         
            +
                issues = fetch_json(url, options, params)
         
     | 
| 
       58 
69 
     | 
    
         
             
                issues = issues.sort_by{|i| i['number'].to_i} unless params[:sort] || params[:direction]
         
     | 
| 
       59 
70 
     | 
    
         | 
| 
       60 
71 
     | 
    
         
             
                t_max = issues.map{|i| mlength(i['title'])}.max
         
     | 
| 
         @@ -64,12 +75,12 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       64 
75 
     | 
    
         
             
                or_zero = lambda{|v| v.blank? ? "0" : v }
         
     | 
| 
       65 
76 
     | 
    
         | 
| 
       66 
77 
     | 
    
         
             
                issues.each do |i|
         
     | 
| 
       67 
     | 
    
         
            -
                  puts sprintf(" 
     | 
| 
       68 
     | 
    
         
            -
                               i['number'].to_i,
         
     | 
| 
       69 
     | 
    
         
            -
                               i['state'],
         
     | 
| 
      
 78 
     | 
    
         
            +
                  puts sprintf("%s  %s  %s  %s  %s c:%s v:%s p:%s %s %s",
         
     | 
| 
      
 79 
     | 
    
         
            +
                               apply_fmt_colors(:id, sprintf('#%-4d', i['number'].to_i)),
         
     | 
| 
      
 80 
     | 
    
         
            +
                               apply_fmt_colors(:state, i['state']),
         
     | 
| 
       70 
81 
     | 
    
         
             
                               mljust(i['title'], t_max),
         
     | 
| 
       71 
     | 
    
         
            -
                               mljust(i['user']['login'], u_max),
         
     | 
| 
       72 
     | 
    
         
            -
                               mljust(i['labels'].map{|l| l['name']}.join(','), l_max),
         
     | 
| 
      
 82 
     | 
    
         
            +
                               apply_fmt_colors(:login, mljust(i['user']['login'], u_max)),
         
     | 
| 
      
 83 
     | 
    
         
            +
                               apply_fmt_colors(:labels, mljust(i['labels'].map{|l| l['name']}.join(','), l_max)),
         
     | 
| 
       73 
84 
     | 
    
         
             
                               or_zero.call(i['comments']),
         
     | 
| 
       74 
85 
     | 
    
         
             
                               or_zero.call(i['votes']),
         
     | 
| 
       75 
86 
     | 
    
         
             
                               or_zero.call(i['position']),
         
     | 
| 
         @@ -185,18 +196,9 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       185 
196 
     | 
    
         
             
                URI.join(ROOT, path_list.join("/"))
         
     | 
| 
       186 
197 
     | 
    
         
             
              end
         
     | 
| 
       187 
198 
     | 
    
         | 
| 
       188 
     | 
    
         
            -
              def fetch_json(url, params = {})
         
     | 
| 
       189 
     | 
    
         
            -
                 
     | 
| 
       190 
     | 
    
         
            -
             
     | 
| 
       191 
     | 
    
         
            -
                puts url if @debug
         
     | 
| 
       192 
     | 
    
         
            -
             
     | 
| 
       193 
     | 
    
         
            -
                password = options[:password] || get_password(@user)
         
     | 
| 
       194 
     | 
    
         
            -
                opt = {"Authorization" => "Basic " + Base64.encode64("#{@user}:#{password}")}
         
     | 
| 
       195 
     | 
    
         
            -
             
     | 
| 
       196 
     | 
    
         
            -
                opt[:ssl_verify_mode] = OpenSSL::SSL::VERIFY_NONE if @sslNoVerify
         
     | 
| 
       197 
     | 
    
         
            -
                json = open(url, opt) {|io|
         
     | 
| 
       198 
     | 
    
         
            -
                  JSON.parse(io.read)
         
     | 
| 
       199 
     | 
    
         
            -
                }
         
     | 
| 
      
 199 
     | 
    
         
            +
              def fetch_json(url, options = {}, params = {})
         
     | 
| 
      
 200 
     | 
    
         
            +
                response = send_request(url, {},options, params, :get)
         
     | 
| 
      
 201 
     | 
    
         
            +
                json = JSON.parse(response.body)
         
     | 
| 
       200 
202 
     | 
    
         | 
| 
       201 
203 
     | 
    
         
             
                if @debug
         
     | 
| 
       202 
204 
     | 
    
         
             
                  puts '-' * 80
         
     | 
| 
         @@ -210,8 +212,8 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       210 
212 
     | 
    
         | 
| 
       211 
213 
     | 
    
         
             
              def fetch_issue(ticket_id, params = {})
         
     | 
| 
       212 
214 
     | 
    
         
             
                url = to_url("repos", @repo, 'issues', ticket_id)
         
     | 
| 
       213 
     | 
    
         
            -
                url += "?" + params.map{|k,v| "#{k}=#{v}"}.join("&") unless params.empty?
         
     | 
| 
       214 
     | 
    
         
            -
                json = fetch_json(url)
         
     | 
| 
      
 215 
     | 
    
         
            +
                # url += "?" + params.map{|k,v| "#{k}=#{v}"}.join("&") unless params.empty?
         
     | 
| 
      
 216 
     | 
    
         
            +
                json = fetch_json(url, {}, params)
         
     | 
| 
       215 
217 
     | 
    
         | 
| 
       216 
218 
     | 
    
         
             
                issue = json['issue'] || json
         
     | 
| 
       217 
219 
     | 
    
         
             
                raise "no such issue #{ticket} : #{base}" unless issue
         
     | 
| 
         @@ -231,7 +233,7 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       231 
233 
     | 
    
         
             
              end
         
     | 
| 
       232 
234 
     | 
    
         | 
| 
       233 
235 
     | 
    
         
             
              def post_json(url, json, options, params = {})
         
     | 
| 
       234 
     | 
    
         
            -
                response =  
     | 
| 
      
 236 
     | 
    
         
            +
                response = send_request(url, json, options, params, :post)
         
     | 
| 
       235 
237 
     | 
    
         
             
                json = JSON.parse(response.body)
         
     | 
| 
       236 
238 
     | 
    
         | 
| 
       237 
239 
     | 
    
         
             
                raise error_message(json) unless response_success?(response)
         
     | 
| 
         @@ -239,7 +241,7 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       239 
241 
     | 
    
         
             
              end
         
     | 
| 
       240 
242 
     | 
    
         | 
| 
       241 
243 
     | 
    
         
             
              def put_json(url, json, options, params = {})
         
     | 
| 
       242 
     | 
    
         
            -
                response =  
     | 
| 
      
 244 
     | 
    
         
            +
                response = send_request(url, json, options, params, :put)
         
     | 
| 
       243 
245 
     | 
    
         
             
                json = JSON.parse(response.body)
         
     | 
| 
       244 
246 
     | 
    
         | 
| 
       245 
247 
     | 
    
         
             
                raise error_message(json) unless response_success?(response)
         
     | 
| 
         @@ -252,7 +254,7 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       252 
254 
     | 
    
         
             
                msg.join("\n  ")
         
     | 
| 
       253 
255 
     | 
    
         
             
              end
         
     | 
| 
       254 
256 
     | 
    
         | 
| 
       255 
     | 
    
         
            -
              def  
     | 
| 
      
 257 
     | 
    
         
            +
              def send_request(url, json = {}, options = {}, params = {}, method = :post)
         
     | 
| 
       256 
258 
     | 
    
         
             
                url = "#{url}"
         
     | 
| 
       257 
259 
     | 
    
         
             
                uri = URI.parse(url)
         
     | 
| 
       258 
260 
     | 
    
         | 
| 
         @@ -265,8 +267,23 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       265 
267 
     | 
    
         | 
| 
       266 
268 
     | 
    
         
             
                https = Net::HTTP.new(uri.host, uri.port)
         
     | 
| 
       267 
269 
     | 
    
         
             
                https.use_ssl = true
         
     | 
| 
       268 
     | 
    
         
            -
                https.verify_mode = OpenSSL::SSL::VERIFY_NONE
         
     | 
| 
      
 270 
     | 
    
         
            +
                https.verify_mode = @ssl_options[:ssl_verify_mode] || OpenSSL::SSL::VERIFY_NONE
         
     | 
| 
      
 271 
     | 
    
         
            +
             
     | 
| 
      
 272 
     | 
    
         
            +
                store = OpenSSL::X509::Store.new
         
     | 
| 
      
 273 
     | 
    
         
            +
                if @ssl_options[:ssl_ca_cert].present?
         
     | 
| 
      
 274 
     | 
    
         
            +
                  if File.directory? @ssl_options[:ssl_ca_cert]
         
     | 
| 
      
 275 
     | 
    
         
            +
                    store.add_path @ssl_options[:ssl_ca_cert]
         
     | 
| 
      
 276 
     | 
    
         
            +
                  else
         
     | 
| 
      
 277 
     | 
    
         
            +
                    store.add_file @ssl_options[:ssl_ca_cert]
         
     | 
| 
      
 278 
     | 
    
         
            +
                  end
         
     | 
| 
      
 279 
     | 
    
         
            +
                  http.cert_store = store
         
     | 
| 
      
 280 
     | 
    
         
            +
                else
         
     | 
| 
      
 281 
     | 
    
         
            +
                  store.set_default_paths
         
     | 
| 
      
 282 
     | 
    
         
            +
                end
         
     | 
| 
      
 283 
     | 
    
         
            +
                https.cert_store = store
         
     | 
| 
      
 284 
     | 
    
         
            +
             
     | 
| 
       269 
285 
     | 
    
         
             
                https.set_debug_output $stderr if @debug && https.respond_to?(:set_debug_output)
         
     | 
| 
      
 286 
     | 
    
         
            +
             
     | 
| 
       270 
287 
     | 
    
         
             
                https.start{|http|
         
     | 
| 
       271 
288 
     | 
    
         | 
| 
       272 
289 
     | 
    
         
             
                  path = "#{uri.path}"
         
     | 
| 
         @@ -275,6 +292,7 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       275 
292 
     | 
    
         
             
                  request = case method
         
     | 
| 
       276 
293 
     | 
    
         
             
                    when :post then Net::HTTP::Post.new(path)
         
     | 
| 
       277 
294 
     | 
    
         
             
                    when :put  then Net::HTTP::Put.new(path)
         
     | 
| 
      
 295 
     | 
    
         
            +
                    when :get  then Net::HTTP::Get.new(path)
         
     | 
| 
       278 
296 
     | 
    
         
             
                    else raise "unknown method #{method}"
         
     | 
| 
       279 
297 
     | 
    
         
             
                  end
         
     | 
| 
       280 
298 
     | 
    
         | 
| 
         @@ -287,7 +305,7 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       287 
305 
     | 
    
         
             
                  request.basic_auth @user, password
         
     | 
| 
       288 
306 
     | 
    
         | 
| 
       289 
307 
     | 
    
         
             
                  request.set_content_type("application/json")
         
     | 
| 
       290 
     | 
    
         
            -
                  request.body = json.to_json
         
     | 
| 
      
 308 
     | 
    
         
            +
                  request.body = json.to_json if json.present?
         
     | 
| 
       291 
309 
     | 
    
         | 
| 
       292 
310 
     | 
    
         
             
                  response = http.request(request)
         
     | 
| 
       293 
311 
     | 
    
         
             
                  if @debug
         
     | 
| 
         @@ -331,7 +349,7 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       331 
349 
     | 
    
         
             
                  end
         
     | 
| 
       332 
350 
     | 
    
         
             
                end
         
     | 
| 
       333 
351 
     | 
    
         | 
| 
       334 
     | 
    
         
            -
                msg << sprintf("%s : %s", mljust('labels', 18), issue['labels'].map{|l| l['name']}.join(","))
         
     | 
| 
      
 352 
     | 
    
         
            +
                msg << sprintf("%s : %s", mljust('labels', 18), apply_fmt_colors(:labels, issue['labels'].map{|l| l['name']}.join(",")))
         
     | 
| 
       335 
353 
     | 
    
         
             
                msg << sprintf("%s : %s", mljust('html_url', 18), issue['html_url'])
         
     | 
| 
       336 
354 
     | 
    
         
             
                msg << sprintf("%s : %s", mljust('updated_at', 18), Time.parse(issue['updated_at']))
         
     | 
| 
       337 
355 
     | 
    
         | 
| 
         @@ -352,14 +370,14 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       352 
370 
     | 
    
         
             
              end
         
     | 
| 
       353 
371 
     | 
    
         | 
| 
       354 
372 
     | 
    
         
             
              def issue_title(issue)
         
     | 
| 
       355 
     | 
    
         
            -
                "[#{issue['state']}] ##{issue['number']} #{issue['title']}"
         
     | 
| 
      
 373 
     | 
    
         
            +
                "[#{apply_fmt_colors(:state, issue['state'])}] #{apply_fmt_colors(:id, "##{issue['number']}")} #{issue['title']}"
         
     | 
| 
       356 
374 
     | 
    
         
             
              end
         
     | 
| 
       357 
375 
     | 
    
         | 
| 
       358 
376 
     | 
    
         
             
              def issue_author(issue)
         
     | 
| 
       359 
377 
     | 
    
         
             
                author     = issue['user']['login']
         
     | 
| 
       360 
378 
     | 
    
         
             
                created_at = issue['created_at']
         
     | 
| 
       361 
379 
     | 
    
         | 
| 
       362 
     | 
    
         
            -
                msg = "#{author} opened this issue #{Time.parse(created_at)}"
         
     | 
| 
      
 380 
     | 
    
         
            +
                msg = "#{apply_fmt_colors(:login, author)} opened this issue #{Time.parse(created_at)}"
         
     | 
| 
       363 
381 
     | 
    
         
             
                msg
         
     | 
| 
       364 
382 
     | 
    
         
             
              end
         
     | 
| 
       365 
383 
     | 
    
         | 
| 
         @@ -399,5 +417,14 @@ class GitIssue::Github < GitIssue::Base 
     | 
|
| 
       399 
417 
     | 
    
         
             
                opts
         
     | 
| 
       400 
418 
     | 
    
         
             
              end
         
     | 
| 
       401 
419 
     | 
    
         | 
| 
      
 420 
     | 
    
         
            +
              def apply_fmt_colors(key, str)
         
     | 
| 
      
 421 
     | 
    
         
            +
                fmt_colors[key.to_sym] ? apply_colors(str, *Array(fmt_colors[key.to_sym])) : str
         
     | 
| 
      
 422 
     | 
    
         
            +
              end
         
     | 
| 
      
 423 
     | 
    
         
            +
             
     | 
| 
      
 424 
     | 
    
         
            +
              def fmt_colors
         
     | 
| 
      
 425 
     | 
    
         
            +
                @fmt_colors ||= { :id => [:bold, :cyan], :state => :blue,
         
     | 
| 
      
 426 
     | 
    
         
            +
                  :login => :magenta, :labels => :yellow}
         
     | 
| 
      
 427 
     | 
    
         
            +
              end
         
     | 
| 
      
 428 
     | 
    
         
            +
             
     | 
| 
       402 
429 
     | 
    
         
             
            end
         
     | 
| 
       403 
430 
     | 
    
         
             
            end
         
     | 
    
        data/lib/git_issue/redmine.rb
    CHANGED
    
    | 
         @@ -6,15 +6,15 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       6 
6 
     | 
    
         
             
              def initialize(args, options = {})
         
     | 
| 
       7 
7 
     | 
    
         
             
                super(args, options)
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                @apikey = options[:apikey] || configured_value('apikey')
         
     | 
| 
      
 9 
     | 
    
         
            +
                @apikey = options[:apikey] || configured_value('issue.apikey')
         
     | 
| 
       10 
10 
     | 
    
         
             
                configure_error('apikey', "git config issue.apikey some_api_key") if @apikey.blank?
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
                @url = options[:url] || configured_value('url')
         
     | 
| 
      
 12 
     | 
    
         
            +
                @url = options[:url] || configured_value('issue.url')
         
     | 
| 
       13 
13 
     | 
    
         
             
                configure_error('url', "git config issue.url http://example.com/redmine")  if @url.blank?
         
     | 
| 
       14 
14 
     | 
    
         
             
              end
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
              def default_cmd
         
     | 
| 
       17 
     | 
    
         
            -
                Helper.configured_value('project').blank? ? :list : :project
         
     | 
| 
      
 17 
     | 
    
         
            +
                Helper.configured_value('issue.project').blank? ? :list : :project
         
     | 
| 
       18 
18 
     | 
    
         
             
              end
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
              def commands
         
     | 
| 
         @@ -71,7 +71,7 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       71 
71 
     | 
    
         
             
              def add(options = {})
         
     | 
| 
       72 
72 
     | 
    
         
             
                property_names = [:project_id, :subject, :description, :done_ratio, :status_id, :priority_id, :tracker_id, :assigned_to_id, :category_id, :fixed_version_id, :notes]
         
     | 
| 
       73 
73 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
                project_id = options[:project_id] || Helper.configured_value('project')
         
     | 
| 
      
 74 
     | 
    
         
            +
                project_id = options[:project_id] || Helper.configured_value('issue.project')
         
     | 
| 
       75 
75 
     | 
    
         
             
                if options.slice(*property_names).empty?
         
     | 
| 
       76 
76 
     | 
    
         
             
                  issue = read_issue_from_editor({"project" => {"id" => project_id}}, options)
         
     | 
| 
       77 
77 
     | 
    
         
             
                  description = issue.delete(:notes)
         
     | 
| 
         @@ -85,7 +85,7 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       85 
85 
     | 
    
         
             
                end
         
     | 
| 
       86 
86 
     | 
    
         | 
| 
       87 
87 
     | 
    
         
             
                json = build_issue_json(options, property_names)
         
     | 
| 
       88 
     | 
    
         
            -
                json["issue"][:project_id] ||= Helper.configured_value('project')
         
     | 
| 
      
 88 
     | 
    
         
            +
                json["issue"][:project_id] ||= Helper.configured_value('issue.project')
         
     | 
| 
       89 
89 
     | 
    
         | 
| 
       90 
90 
     | 
    
         
             
                url = to_url('issues')
         
     | 
| 
       91 
91 
     | 
    
         | 
| 
         @@ -144,7 +144,7 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       144 
144 
     | 
    
         
             
              end
         
     | 
| 
       145 
145 
     | 
    
         | 
| 
       146 
146 
     | 
    
         
             
              def project(options = {})
         
     | 
| 
       147 
     | 
    
         
            -
                project_id = Helper.configured_value('project')
         
     | 
| 
      
 147 
     | 
    
         
            +
                project_id = Helper.configured_value('issue.project')
         
     | 
| 
       148 
148 
     | 
    
         
             
                project_id = options[:ticket_id] if project_id.blank?
         
     | 
| 
       149 
149 
     | 
    
         
             
                raise 'project_id is required.' unless project_id
         
     | 
| 
       150 
150 
     | 
    
         
             
                list(options.merge(:query => "project_id=#{project_id}"))
         
     | 
| 
         @@ -204,6 +204,10 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       204 
204 
     | 
    
         
             
                end
         
     | 
| 
       205 
205 
     | 
    
         | 
| 
       206 
206 
     | 
    
         
             
                http = Net::HTTP.new(uri.host, uri.port)
         
     | 
| 
      
 207 
     | 
    
         
            +
                if uri.scheme == 'https'
         
     | 
| 
      
 208 
     | 
    
         
            +
                  http.use_ssl = true
         
     | 
| 
      
 209 
     | 
    
         
            +
                  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
         
     | 
| 
      
 210 
     | 
    
         
            +
                end
         
     | 
| 
       207 
211 
     | 
    
         
             
                http.set_debug_output $stderr if @debug && http.respond_to?(:set_debug_output)
         
     | 
| 
       208 
212 
     | 
    
         
             
                http.start{|http|
         
     | 
| 
       209 
213 
     | 
    
         | 
| 
         @@ -238,7 +242,7 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       238 
242 
     | 
    
         | 
| 
       239 
243 
     | 
    
         | 
| 
       240 
244 
     | 
    
         
             
              def issue_title(issue)
         
     | 
| 
       241 
     | 
    
         
            -
                "[#{issue['project']['name']}] #{issue['tracker']['name']} ##{issue['id']} #{issue['subject']}"
         
     | 
| 
      
 245 
     | 
    
         
            +
                "[#{apply_colors(issue['project']['name'], :green)}] #{apply_colors(issue['tracker']['name'], :yellow)} #{apply_fmt_colors(:id, "##{issue['id']}")} #{issue['subject']}"
         
     | 
| 
       242 
246 
     | 
    
         
             
              end
         
     | 
| 
       243 
247 
     | 
    
         | 
| 
       244 
248 
     | 
    
         
             
              def issue_author(issue)
         
     | 
| 
         @@ -246,7 +250,7 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       246 
250 
     | 
    
         
             
                created_on = issue['created_on']
         
     | 
| 
       247 
251 
     | 
    
         
             
                updated_on = issue['updated_on']
         
     | 
| 
       248 
252 
     | 
    
         | 
| 
       249 
     | 
    
         
            -
                msg = "#{author}が#{time_ago_in_words(created_on)}に追加"
         
     | 
| 
      
 253 
     | 
    
         
            +
                msg = "#{apply_fmt_colors(:assigned_to, author)}が#{time_ago_in_words(created_on)}に追加"
         
     | 
| 
       250 
254 
     | 
    
         
             
                msg += ", #{time_ago_in_words(updated_on)}に更新" unless created_on == updated_on
         
     | 
| 
       251 
255 
     | 
    
         
             
                msg
         
     | 
| 
       252 
256 
     | 
    
         
             
              end
         
     | 
| 
         @@ -276,13 +280,13 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       276 
280 
     | 
    
         
             
                add_prop = Proc.new{|name|
         
     | 
| 
       277 
281 
     | 
    
         
             
                  title = property_title(name)
         
     | 
| 
       278 
282 
     | 
    
         
             
                  value = issue[name] || ""
         
     | 
| 
       279 
     | 
    
         
            -
                  props << [title, value]
         
     | 
| 
      
 283 
     | 
    
         
            +
                  props << [title, value, name]
         
     | 
| 
       280 
284 
     | 
    
         
             
                }
         
     | 
| 
       281 
285 
     | 
    
         
             
                add_prop_name = Proc.new{|name|
         
     | 
| 
       282 
286 
     | 
    
         
             
                  title = property_title(name)
         
     | 
| 
       283 
287 
     | 
    
         
             
                  value = ''
         
     | 
| 
       284 
288 
     | 
    
         
             
                  value = prop_name.call(name)
         
     | 
| 
       285 
     | 
    
         
            -
                  props << [title, value]
         
     | 
| 
      
 289 
     | 
    
         
            +
                  props << [title, value, name]
         
     | 
| 
       286 
290 
     | 
    
         
             
                }
         
     | 
| 
       287 
291 
     | 
    
         | 
| 
       288 
292 
     | 
    
         
             
                add_prop_name.call('status')
         
     | 
| 
         @@ -297,12 +301,13 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       297 
301 
     | 
    
         
             
                # acd custom_fields if it have value.
         
     | 
| 
       298 
302 
     | 
    
         
             
                if custom_fields = issue[:custom_fields] && custom_fields.reject{|cf| cf['value'].nil? || cf['value'].empty? }
         
     | 
| 
       299 
303 
     | 
    
         
             
                  custom_fields.each do |cf|
         
     | 
| 
       300 
     | 
    
         
            -
                    props << [cf['name'], cf['value']]
         
     | 
| 
      
 304 
     | 
    
         
            +
                    props << [cf['name'], cf['value'], cf['name']]
         
     | 
| 
       301 
305 
     | 
    
         
             
                  end
         
     | 
| 
       302 
306 
     | 
    
         
             
                end
         
     | 
| 
       303 
307 
     | 
    
         | 
| 
       304 
308 
     | 
    
         
             
                props.each_with_index do |p,n|
         
     | 
| 
       305 
     | 
    
         
            -
                   
     | 
| 
      
 309 
     | 
    
         
            +
                  title, value, name = p
         
     | 
| 
      
 310 
     | 
    
         
            +
                  row = sprintf("%s : %s", mljust(title, 18), apply_fmt_colors(name, mljust(value.to_s, 24)))
         
     | 
| 
       306 
311 
     | 
    
         
             
                  if n % 2 == 0
         
     | 
| 
       307 
312 
     | 
    
         
             
                    msg << row
         
     | 
| 
       308 
313 
     | 
    
         
             
                  else
         
     | 
| 
         @@ -367,7 +372,7 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       367 
372 
     | 
    
         
             
              def format_jounal(j, n)
         
     | 
| 
       368 
373 
     | 
    
         
             
                jnl = []
         
     | 
| 
       369 
374 
     | 
    
         | 
| 
       370 
     | 
    
         
            -
                jnl << "##{n + 1} - #{j['user']['name']}が#{time_ago_in_words(j['created_on'])}に更新"
         
     | 
| 
      
 375 
     | 
    
         
            +
                jnl << "##{n + 1} - #{apply_fmt_colors(:assigned_to, j['user']['name'])}が#{time_ago_in_words(j['created_on'])}に更新"
         
     | 
| 
       371 
376 
     | 
    
         
             
                jnl << "-" * 78
         
     | 
| 
       372 
377 
     | 
    
         
             
                j['details'].each do |d|
         
     | 
| 
       373 
378 
     | 
    
         
             
                  log = "#{property_title(d['name'])}を"
         
     | 
| 
         @@ -385,7 +390,7 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       385 
390 
     | 
    
         
             
              def format_changesets(changesets)
         
     | 
| 
       386 
391 
     | 
    
         
             
                cs = []
         
     | 
| 
       387 
392 
     | 
    
         
             
                changesets.sort_by{|c| c['committed_on'] }.each do |c|
         
     | 
| 
       388 
     | 
    
         
            -
                  cs << "リビジョン: #{c['revision'][0..10]} #{c['user']['name']}が#{time_ago_in_words(c['committed_on'])}に追加"
         
     | 
| 
      
 393 
     | 
    
         
            +
                  cs << "リビジョン: #{apply_colors(c['revision'][0..10], :cyan)} #{apply_fmt_colors(:assigned_to, c['user']['name'])}が#{time_ago_in_words(c['committed_on'])}に追加"
         
     | 
| 
       389 
394 
     | 
    
         
             
                  cs +=  c['comments'].split("\n").to_a
         
     | 
| 
       390 
395 
     | 
    
         
             
                  cs << ""
         
     | 
| 
       391 
396 
     | 
    
         
             
                end
         
     | 
| 
         @@ -395,10 +400,12 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       395 
400 
     | 
    
         
             
              def format_relations(relations)
         
     | 
| 
       396 
401 
     | 
    
         
             
                relations.map{|r|
         
     | 
| 
       397 
402 
     | 
    
         
             
                  issue = fetch_issue(r['issue_id'])
         
     | 
| 
       398 
     | 
    
         
            -
                  "#{relations_label(r['relation_type'])} #{issue_title(issue)} #{issue['status']['name']} #{issue['start_date']} "
         
     | 
| 
      
 403 
     | 
    
         
            +
                  "#{relations_label(r['relation_type'])} #{issue_title(issue)} #{apply_fmt_colors(:status, issue['status']['name'])} #{issue['start_date']} "
         
     | 
| 
       399 
404 
     | 
    
         
             
                }
         
     | 
| 
       400 
405 
     | 
    
         
             
              end
         
     | 
| 
       401 
406 
     | 
    
         | 
| 
      
 407 
     | 
    
         
            +
              DEFAULT_FORMAT = "%I  %S | %A | %s %T %P | %V %C |"
         
     | 
| 
      
 408 
     | 
    
         
            +
             
     | 
| 
       402 
409 
     | 
    
         
             
              def format_issue_tables(issues_json)
         
     | 
| 
       403 
410 
     | 
    
         
             
                name_of = lambda{|issue, name| issue[name]['name'] rescue ""}
         
     | 
| 
       404 
411 
     | 
    
         | 
| 
         @@ -429,7 +436,9 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       429 
436 
     | 
    
         
             
                  :subject => 80
         
     | 
| 
       430 
437 
     | 
    
         
             
                }
         
     | 
| 
       431 
438 
     | 
    
         | 
| 
       432 
     | 
    
         
            -
                fmt = configured_value('defaultformat', false)
         
     | 
| 
      
 439 
     | 
    
         
            +
                fmt = configured_value('issue.defaultformat', false)
         
     | 
| 
      
 440 
     | 
    
         
            +
                fmt = DEFAULT_FORMAT unless fmt.present?
         
     | 
| 
      
 441 
     | 
    
         
            +
             
     | 
| 
       433 
442 
     | 
    
         
             
                fmt_chars =  { :I => :id, :S => :subject,
         
     | 
| 
       434 
443 
     | 
    
         
             
                  :A => :assigned_to, :s => :status,  :T => :tracker,
         
     | 
| 
       435 
444 
     | 
    
         
             
                  :P => :priority,    :p => :project, :V => :version,
         
     | 
| 
         @@ -440,7 +449,9 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       440 
449 
     | 
    
         
             
                  fmt_chars.each do |k, v|
         
     | 
| 
       441 
450 
     | 
    
         
             
                    res.gsub!(/\%(\d*)#{k}/) do |s|
         
     | 
| 
       442 
451 
     | 
    
         
             
                      max = $1.blank? ? max_length[v] : $1.to_i
         
     | 
| 
       443 
     | 
    
         
            -
                      max ? mljust(i[v], max) : i[v]
         
     | 
| 
      
 452 
     | 
    
         
            +
                      str = max ? mljust(i[v], max) : i[v]
         
     | 
| 
      
 453 
     | 
    
         
            +
                      colored =  fmt_colors[v] ? apply_fmt_colors(v, str) : str
         
     | 
| 
      
 454 
     | 
    
         
            +
                      colored
         
     | 
| 
       444 
455 
     | 
    
         
             
                    end
         
     | 
| 
       445 
456 
     | 
    
         
             
                  end
         
     | 
| 
       446 
457 
     | 
    
         
             
                  res
         
     | 
| 
         @@ -449,6 +460,16 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       449 
460 
     | 
    
         
             
                issues.map{|i| format_to.call(i) }
         
     | 
| 
       450 
461 
     | 
    
         
             
              end
         
     | 
| 
       451 
462 
     | 
    
         | 
| 
      
 463 
     | 
    
         
            +
              def apply_fmt_colors(key, str)
         
     | 
| 
      
 464 
     | 
    
         
            +
                fmt_colors[key.to_sym] ? apply_colors(str, *Array(fmt_colors[key.to_sym])) : str
         
     | 
| 
      
 465 
     | 
    
         
            +
              end
         
     | 
| 
      
 466 
     | 
    
         
            +
             
     | 
| 
      
 467 
     | 
    
         
            +
              def fmt_colors
         
     | 
| 
      
 468 
     | 
    
         
            +
                @fmt_colors ||= { :id => [:bold, :cyan], :status => :blue,
         
     | 
| 
      
 469 
     | 
    
         
            +
                  :priority => :green, :assigned_to => :magenta,
         
     | 
| 
      
 470 
     | 
    
         
            +
                  :tracker => :yellow}
         
     | 
| 
      
 471 
     | 
    
         
            +
              end
         
     | 
| 
      
 472 
     | 
    
         
            +
             
     | 
| 
       452 
473 
     | 
    
         
             
              def output_issues(issues)
         
     | 
| 
       453 
474 
     | 
    
         
             
                if options[:raw_id]
         
     | 
| 
       454 
475 
     | 
    
         
             
                  issues.each do |i|
         
     | 
| 
         @@ -482,7 +503,7 @@ class Redmine < GitIssue::Base 
     | 
|
| 
       482 
503 
     | 
    
         
             
              def read_issue_from_editor(issue, options = {})
         
     | 
| 
       483 
504 
     | 
    
         
             
                id_of = lambda{|name| issue[name] ? sprintf('%2s : %s', issue[name]["id"] , issue[name]['name'] ): ""}
         
     | 
| 
       484 
505 
     | 
    
         | 
| 
       485 
     | 
    
         
            -
                memofile = configured_value('memofile')
         
     | 
| 
      
 506 
     | 
    
         
            +
                memofile = configured_value('issue.memofile')
         
     | 
| 
       486 
507 
     | 
    
         
             
                memo = File.open(memofile).read.lines.map{|l| "# #{l}"}.join("") unless memofile.blank?
         
     | 
| 
       487 
508 
     | 
    
         | 
| 
       488 
509 
     | 
    
         
             
                message = <<-MSG
         
     | 
    
        data/lib/git_issue/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,13 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: git-issue
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       4 
     | 
    
         
            -
              hash:  
     | 
| 
      
 4 
     | 
    
         
            +
              hash: 57
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
              segments: 
         
     | 
| 
       7 
7 
     | 
    
         
             
              - 0
         
     | 
| 
       8 
8 
     | 
    
         
             
              - 8
         
     | 
| 
       9 
     | 
    
         
            -
              -  
     | 
| 
       10 
     | 
    
         
            -
              version: 0.8. 
     | 
| 
      
 9 
     | 
    
         
            +
              - 3
         
     | 
| 
      
 10 
     | 
    
         
            +
              version: 0.8.3
         
     | 
| 
       11 
11 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       12 
12 
     | 
    
         
             
            authors: 
         
     | 
| 
       13 
13 
     | 
    
         
             
            - Tomohito Ozaki
         
     | 
| 
         @@ -15,7 +15,7 @@ autorequire: 
     | 
|
| 
       15 
15 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       16 
16 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
            date: 2012- 
     | 
| 
      
 18 
     | 
    
         
            +
            date: 2012-06-25 00:00:00 +09:00
         
     | 
| 
       19 
19 
     | 
    
         
             
            default_executable: 
         
     | 
| 
       20 
20 
     | 
    
         
             
            dependencies: 
         
     | 
| 
       21 
21 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     |