File: github.rb

package info (click to toggle)
ruby-sdoc 0.4.1-2
  • links: PTS, VCS
  • area: main
  • in suites: buster, stretch
  • size: 896 kB
  • ctags: 523
  • sloc: ruby: 746; makefile: 3
file content (61 lines) | stat: -rw-r--r-- 1,585 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
module SDoc::GitHub
  def github_url(path)
    unless @github_url_cache.has_key? path
      @github_url_cache[path] = false
      file = @store.find_file_named(path)
      if file
        base_url = repository_url(path)
        if base_url
          sha1 = commit_sha1(path)
          if sha1
            relative_url = path_relative_to_repository(path)
            @github_url_cache[path] = "#{base_url}#{sha1}#{relative_url}"
          end
        end
      end
    end
    @github_url_cache[path]
  end

  protected

  def have_git?
    @have_git = system('git --version > /dev/null 2>&1') if @have_git.nil?
    @have_git
  end

  def commit_sha1(path)
    return false unless have_git?
    name = File.basename(path)
    s = Dir.chdir(File.join(base_dir, File.dirname(path))) do
      `git log -1 --pretty=format:"commit %H" #{name}`
    end
    m = s.match(/commit\s+(\S+)/)
    m ? m[1] : false
  end

  def repository_url(path)
    return false unless have_git?
    s = Dir.chdir(File.join(base_dir, File.dirname(path))) do
      `git config --get remote.origin.url`
    end
    m = s.match(%r{github.com[/:](.*)\.git$})
    m ? "https://github.com/#{m[1]}/blob/" : false
  end

  def path_relative_to_repository(path)
    absolute_path = File.join(base_dir, path)
    root = path_to_git_dir(File.dirname(absolute_path))
    absolute_path[root.size..absolute_path.size]
  end

  def path_to_git_dir(path)
    while !path.empty? && path != '.'
      if (File.exists? File.join(path, '.git'))
        return path
      end
      path = File.dirname(path)
    end
    ''
  end
end