aboutsummaryrefslogtreecommitdiffstats
path: root/lib/tasks/themes.rake
blob: cfa3c0a61a8da4a627221a8169996c0d1ca49431 (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
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 install_theme_using_git(name, uri, verbose=false, options={})
        mkdir_p(install_path = theme_dir(name))
        Dir.chdir install_path do
            init_cmd = "git init"
            init_cmd += " -q" if options[:quiet] and not verbose
            puts init_cmd if verbose
            system(init_cmd)
            base_cmd = "git pull --depth 1 #{uri}"
            # Is there a tag for this version of Alaveteli?
            usage_tag = "use-with-alaveteli-#{ALAVETELI_VERSION}"
            # Query the remote repository passing flags for tags and
            # a non-zero return code on failure to find the tag
            if system("git ls-remote --exit-code --tags #{uri} #{usage_tag}")
                # If we got a tag, pull that instead of HEAD
                puts "Using tag #{usage_tag}" if verbose
                base_cmd += " refs/tags/#{usage_tag}"
            else
                puts "No specific tag for this version: using HEAD" if verbose
            end
            base_cmd += " -q" if options[:quiet] and not verbose
            puts base_cmd if verbose
            if system(base_cmd)
                puts "removing: .git .gitignore" if verbose
                rm_rf %w(.git .gitignore)
            else
                rm_rf install_path
            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, deprecated=false)
        deprecation_string = deprecated ? " using deprecated THEME_URL" : ""
        theme_name = File.basename(theme_url, '.git')
        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
        theme_urls = MySociety::Config.get("THEME_URLS", [])
        theme_urls.each{ |theme_url| install_theme(theme_url) }
        if theme_url = MySociety::Config.get("THEME_URL", nil)
            # Old version of the above, for backwards compatibility
            install_theme(theme_url, deprecated=true)
        end
    end
end