aboutsummaryrefslogtreecommitdiffstats
path: root/lib/tasks/themes.rake
blob: 1eed92f1e1273d71db7f55b80833075b3d97fc82 (plain)
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
namespace :themes do

    def plugin_dir
        File.join(Rails.root,"vendor","plugins")
    end

    def theme_dir(theme_name)
        File.join(plugin_dir, theme_name)
    end

    def checkout(commitish)
        puts "Checking out #{commitish}" if verbose
        system "git checkout #{commitish}"
    end

    def checkout_tag(version)
        checkout usage_tag(version)
    end

    def checkout_remote_branch(branch)
        checkout "origin/#{branch}"
    end

    def usage_tag(version)
        "use-with-alaveteli-#{version}"
    end

    def install_theme_using_git(name, uri, verbose=false, options={})
        install_path = theme_dir(name)
        Dir.chdir(plugin_dir) do
            clone_command = "git clone #{uri} #{name}"
            if system(clone_command)
                Dir.chdir install_path do
                    # First try to checkout a specific branch of the theme
                    tag_checked_out = checkout_remote_branch(AlaveteliConfiguration::theme_branch) if AlaveteliConfiguration::theme_branch
                    if !tag_checked_out
                        # try to checkout a tag exactly matching ALAVETELI VERSION
                        tag_checked_out = checkout_tag(ALAVETELI_VERSION)
                    end
                    if ! tag_checked_out
                        # if we're on a hotfix release (four sequence elements or more),
                        # look for a usage tag matching the minor release (three sequence elements)
                        # and check that out if found
                        if hotfix_version = /^(\d+\.\d+\.\d+)(\.\d+)+/.match(ALAVETELI_VERSION)
                            base_version = hotfix_version[1]
                            tag_checked_out = checkout_tag(base_version)
                        end
                    end
                    if ! tag_checked_out
                        puts "No specific tag for this version: using HEAD" if verbose
                    end
                    puts "removing: .git .gitignore" if verbose
                    rm_rf %w(.git .gitignore)
                end
            else
                rm_rf install_path
                raise "#{clone_command} failed! Stopping."
            end
        end
    end

    def uninstall(theme_name, verbose=false)
        dir = theme_dir(theme_name)
        if File.directory?(dir)
            run_hook(theme_name, 'uninstall', verbose)
            puts "Removing '#{dir}'" if verbose
            rm_r dir
        else
            puts "Plugin doesn't exist: #{dir}"
        end
    end

    def run_hook(theme_name, hook_name, verbose=false)
        hook_file = File.join(theme_dir(theme_name), "#{hook_name}.rb")
        if File.exist? hook_file
            puts "Running #{hook_name} hook for #{theme_name}" if verbose
            load hook_file
        end
    end

    def installed?(theme_name)
        File.directory?(theme_dir(theme_name))
    end

    def install_theme(theme_url, verbose, deprecated=false)
        deprecation_string = deprecated ? " using deprecated THEME_URL" : ""
        theme_name = theme_url_to_theme_name theme_url
        puts "Installing theme #{theme_name}#{deprecation_string} from #{theme_url}"
        uninstall(theme_name, verbose) if installed?(theme_name)
        install_theme_using_git(theme_name, theme_url, verbose)
        run_hook(theme_name, 'install', verbose)
        run_hook(theme_name, 'post_install', verbose)
    end

    desc "Install themes specified in the config file's THEME_URLS"
    task :install => :environment do
        verbose = true
        AlaveteliConfiguration::theme_urls.each{ |theme_url| install_theme(theme_url, verbose) }
        if ! AlaveteliConfiguration::theme_url.blank?
            # Old version of the above, for backwards compatibility
            install_theme(AlaveteliConfiguration::theme_url, verbose, deprecated=true)
        end
    end
end