Sha256: aae7eb0951652212ea3a791f77cd8f84292c9254e0d2a94294da993775ac64b1

Contents?: true

Size: 1.87 KB

Versions: 1

Compression:

Stored size: 1.87 KB

Contents

require 'trollop'
require "git/make_mirror/version"

module Git
	module MakeMirror
		class App
			
			def main
				opts = Trollop::options do
					version "git-make-mirror #{Git::MakeMirror::VERSION} (c) 2017 @reednj (reednj@gmail.com)"
					banner "Usage: git make-mirror [options] [remote]"
					opt :remote, "create a remote in the local repository", :type => :string
					opt :push, "push to the newly created mirror"
				end

				git_remote_name = nil

				puts "creating remote repository"
				self.create_repository

				puts "copying post-receive hook"
				self.copy_hook

				if !opts[:remote].nil?
					git_remote_name = opts[:remote]
					sh "git remote add #{git_remote_name} #{remote_url}"
				end

				if opts[:push]
					sh "git push #{git_remote_name || remote_url} master"
				end
			
			end

			def sh(cmd)
				puts cmd
				system cmd
			end

			def local_hooks_dir
				@hooks_dir ||= File.join(File.dirname(__FILE__), 'hooks')
			end

			def remote_url
				ARGV.last.strip
			end

			def remote
				@remote ||= parse_remote(self.remote_url)
			end

			def server
				@server ||= SSHCmd.new remote[:host]
			end

			def parse_remote(remote)
				a = remote.split(':')
				{ :host => a[0], :path => a[1] }
			end

			def create_repository
				server.exec [
					"mkdir -p #{remote[:path]}",
					"cd #{remote[:path]}",
					'git init',
					'git config receive.denyCurrentBranch ignore'
				]
			end

			def copy_hook
				local_hook_file = File.join local_hooks_dir, 'post-receive.rb'
				remote_hook_file = File.join remote[:path], '.git/hooks/post-receive'
				server.scp local_hook_file, remote_hook_file
				server.exec "chmod 775 #{remote_hook_file}"
			end
		end

	end
end

class SSHCmd
	def initialize(server)
		@server = server
	end

	def exec(cmd)
		cmd = cmd.join ' && ' if cmd.is_a? Array
		`ssh #{@server} '#{cmd}'`
	end

	def scp(from, to)
		`scp #{from} #{@server}:#{to}`
	end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
git-make_mirror-1.0.1 lib/git/make_mirror.rb