From 106f9f5436f6726006627ce3122fddf7fc9ca330 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 17 Dec 2017 10:20:30 +0100 Subject: [PATCH] :arrow_up: updated git-update-ghpages script --- doc/Makefile | 2 +- doc/scripts/git-update-ghpages | 374 +++++++++++++++------------------ 2 files changed, 174 insertions(+), 202 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index c900bdea..886378a4 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -63,7 +63,7 @@ doxygen: create_output create_links $(SED) -i 's@< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer >@@g' html/*.html upload: clean doxygen check_output - cd html ; ../scripts/git-update-ghpages nlohmann/json + scripts/git-update-ghpages nlohmann/json html rm -fr html open http://nlohmann.github.io/json/ diff --git a/doc/scripts/git-update-ghpages b/doc/scripts/git-update-ghpages index f9760fee..393650c1 100755 --- a/doc/scripts/git-update-ghpages +++ b/doc/scripts/git-update-ghpages @@ -1,221 +1,193 @@ -#!/usr/bin/env ruby -# git update-ghpages user/repo -b gh-pages -p manual/ -i +#!/usr/bin/env bash +set -o errexit -require 'fileutils' -require 'tmpdir' +copy_contents() { + local source="$1" + status "Copying contents from $source" + if [[ ! "$dryrun" == "1" ]]; then + (cd "$source" >/dev/null && tar c .) | tar xv + else + _ "(cd \"$source\" >/dev/null && tar c .) | tar xv" + fi +} -module Params - def extract(what) i = index(what) and slice!(i, 2)[1] end; - def first_is(what) shift if what.include?(self.first); end - def self.[](*what) what.extend Params; end - def ===(argv) argv.first_is(self); end -end +# Sets git config +set_config() { + if [ -n "$GIT_NAME" ]; then _ git config user.name "$GIT_NAME"; fi + if [ -n "$GIT_EMAIL" ]; then _ git config user.email "$GIT_EMAIL"; fi +} -# ============================================================================ +# Runs the deployment +run() { + if [ ! -d "$source" ]; then + echo "Source is not a directory: $source" + exit 1 + fi -ARGV.extend Params + local tmpdir="$(mktemp -d)" -class CLI - # CLI options - attr_reader :prefix #=> "doc/" - attr_reader :input #=> "/home/me/projects/foo" - attr_reader :message #=> "Updated" - attr_reader :repo #=> "git@github.com:me/project.git" - attr_reader :url #=> "http://me.github.com/project" - attr_reader :branch #=> "gh-pages" + if [[ "$force" == "1" ]]; then + _ cd "$tmpdir" + _ git init + _ git checkout -b "$branch" + copy_contents "$source" + if [[ "$useenv" == "1" ]]; then set_config; fi + _ git add -A . + git_commit + git_push --force + else + _ cd "$tmpdir" + _ git clone "$repo" . -b "$branch" || ( \ + _ git init && \ + _ git checkout -b "$branch") + if [[ "$keep" == "0" ]]; then _ rm -rf ./*; fi + copy_contents "$source" + if [[ "$useenv" == "1" ]]; then set_config; fi + _ git add -A . + git_commit || true + git_push + fi + _ rm -rf "$tmpdir" + status_ "Done" +} - def verbose?() @verbose; end - def force?() @force; end - def simulate?() @simulate; end +git_commit() { + if [ -z "$author" ]; then + _ git commit -m "$message" + else + _ git commit -m "$message" --author "$author" + fi +} - def initialize - # Switches - @verbose = !! (ARGV.extract('--verbose') || ARGV.delete('-v')) - @simulate = !! (ARGV.extract('--simulate') || ARGV.delete('-s')) - @force = !! (ARGV.delete('--force') || ARGV.delete('-f')) +git_push() { + if [ -z "$GITHUB_TOKEN" ]; then + _ git push "${repo}" "$branch" "$@" + else + status "Pushing via \$GITHUB_TOKEN $@" + _ git push "https://${GITHUB_TOKEN}@github.com/${repospec}.git" "$branch" "$@" \ + --quiet >/dev/null 2>&1 || \ + ( status_ "Failed to push"; exit 1 ) + fi +} - # Stuff - @prefix = ARGV.extract('--prefix') || ARGV.extract('-p') || '' - @input = File.expand_path(ARGV.extract('--input') || ARGV.extract('-i') || '.') - @message = ARGV.extract('--message') || ARGV.extract('-m') || 'Update' +status() { + echo -e "\n\033[34m==>\033[0;1m" "$@\033[0m" +} +status_() { + echo -e "\033[33;1m==>\033[0m" "$@" +} - # Github info - branch = ARGV.extract('--branch') || ARGV.extract('-b') || nil - @repo, @url, @branch = get_github_info(ARGV.shift, branch) - end +_() { + echo "" + status_ "$@" + if [[ ! "$dryrun" == "1" ]]; then "$@"; fi +} - def git_current_branch - `git rev-parse --abbrev-ref HEAD`.strip - end +help() { + local cmd="$(basename $0)" + echo 'Usage:' + echo " $cmd " + echo '' + echo 'Parameters:' + echo " REPO repository to push to in 'user/repo' form" + echo " SOURCE path to upload to repository's gh-pages branch" + echo '' + echo 'Options:' + echo ' -h, --help show help screen' + echo ' -f, --force force push' + echo ' -n, --dry-run run in simulation mode' + echo ' -e, --use-env pick up arguments from environment variables' + echo ' -b, --branch use this branch name (default: gh-pages)' + echo ' -a, --author set the author' + echo ' -k, --keep keep existing files in the repo' + echo '' + echo 'Env var options:' + echo ' GITHUB_TOKEN if set, use this to push to the repo' + echo '' + echo 'Optional env vars:' + echo " Run with '-e' to enable the use of these variables." + echo " GIT_NAME set this as the repos user.name" + echo ' GIT_EMAIL set this as the repos user.email' + echo ' GITHUB_REPO substitute as the REPO (1st argument)' + echo ' GIT_SOURCE substitute as the SOURCE (2nd argument)' + echo ' GIT_BRANCH use this branch name (--branch)' + echo '' + echo 'Example:' + echo " $cmd rstacruz/myproject doc" + echo " # pushes './doc' into the gh-pages branch of rstacruz/myproject" + echo '' + echo " export GITHUB_REPO='xyz/abc'" + echo " export GIT_SOURCE='docs'" + echo " $cmd -e" + echo " # pushes './doc' into the gh-pages branch of xyz/abc" +} - def git_deploy - in_temp_path do |temppath| - status "Cloning repository" - system! "git clone #{repo} -b #{branch} #{temppath}" +# +# Defaults +# - if git_current_branch != branch - status "Warning: No #{branch} branch found in repo, creating one." - return git_deploy_force - end +force=0 +dryrun=0 +repospec= +source= +branch= +message="Update" +useenv=0 +author="" +keep=0 - copy_files input, File.join(temppath, prefix) +# +# Parse args +# - status "Committing files" - system! "git add .; git add -u; git commit -m #{message.to_s.inspect}" +while [[ "$1" =~ ^- && ! "$1" == '--' ]]; do case $1 in + -h | --help ) + help + exit + ;; + -b | --branch ) + shift + branch="$1" + ;; + -n | --dry-run ) + dryrun=1 + ;; + -e | --use-env ) + useenv=1 + ;; + -k | --keep ) + keep=1 + ;; + -a | --author) + shift + author="$1" + ;; + -f | --force ) + force=1 + ;; +esac; shift; done +if [[ "$1" == '--' ]]; then shift; fi - unless simulate? - status "Updating repo" - system! "git push origin #{branch}" - end - true - end - end +if [[ "$useenv" == "1" ]] && [[ -n "$GIT_BRANCH" ]] && [[ -z "$branch" ]]; then + branch="$GIT_BRANCH" +fi - def git_deploy_force - in_temp_path do |temppath| - status "Creating new repository" - system! "git init ." - system! "git checkout -b gh-pages" +if [[ "$useenv" == "1" ]] && [[ -n "$GITHUB_REPO" ]] && [[ -n "$GIT_SOURCE" ]] && [[ -z "$2" ]]; then + repospec="$GITHUB_REPO" + source="$GIT_SOURCE" +else + repospec="$1" + source="$2" +fi - copy_files input, File.join(temppath, prefix) +: ${branch:="gh-pages"} - status "Committing files" - system! "git add . && git commit -m #{message.to_s.inspect}" +if [ -z "$source" ]; then + help + exit 1 +fi - unless simulate? - status "Updating repo" - system! "git push #{repo} gh-pages:#{branch} --force" - end - true - end - end +source="`pwd -LP`/$source" +repo="https://github.com/${repospec}.git" - def get_github_info(repo, branch=nil, prefix=nil) - if github_format?(repo) - user, repo_name = repo.split('/') - r = "git@github.com:#{repo}.git" - - # User page or project page? - if repo_name =~ /\.github\.com/ - [r, "http://#{repo_name}/#{prefix}", branch || 'master' ] - else - [r, "http://#{user}.github.com/#{repo_name}/#{prefix}", branch || 'gh-pages' ] - end - else - [repo, nil, branch] - end - end - - def run! - unless repo - print_help - exit 128 - end - - status "Deploying to #{repo} (branch #{branch})" - msg "NOTE: Running in simulation mode." if simulate? - msg "WARNING: If the repository has gh-pages history, it with be overriden." if force? && !simulate? - - result = force? ? git_deploy_force : git_deploy - - if result - puts "" - status "Done." - msg "See: #{url}" if url && !simulate? - else - tip "Failed." - exit 1 - end - end - - def status(str) - puts "#{c('===>',34)} #{c(str, 32)}" - end - - def msg(str) - puts " #{c(str, 32)}" - end - - def c(str, color) - "\033[#{color}m#{str}\033[0m" - end - - def print_help - tip \ - %{Usage: git update-ghpages username/repository [options] - - Flags: - -f, --force Force an update (WARNING: kills the history!) - -s, --simulate Creates the repository, but doesn't push. - -v, --verbose Verbose mode - - Options: - -p PATH, --prefix The prefix - -i PATH, --input Input (defaults to current directory) - -b BRANCH, --branch The branch to deploy to (defaults to gh-pages) - -m MSG, --message Commit message (defaults to 'Update') - - Examples: - - Update the repo 'coffee' of github user 'james' with the files from the - current directory. The files will be in http://james.github.com/coffee. - - $ git update-ghpages james/coffee - - Same as above, but take the files from 'doc/'. - - $ git update-ghpages james/coffee -i doc - - Same as the first, but the files will instead be in - http://james.github.com/coffee/manual. - - $ git update-ghpages james/coffee -i doc -p manual - }.gsub(/^ {4}/, '') - end - -private # Helpers - - def tip(msg) - $stderr.write "#{msg}\n" - end - - def github_format?(str) - str =~ /^([A-Za-z0-9\-_]+)\/([A-Za-z0-9\-_\.]+)$/ - end - - # Performs actions inside a temp path. - def in_temp_path(&blk) - require 'tmpdir' - Dir.mktmpdir do |dir| - Dir.chdir(dir) { yield dir } - end - end - - def system!(str) - puts `#{str} 2>&1`.strip.gsub(/^/, " ") - raise "Failed with exit code #{$?.to_i}" unless $?.to_i == 0 - end - - # Returns the current branch name - def git_branch - `git symbolic-ref HEAD`.strip.split('/').last - end - - # Copy files from source folder to another - def copy_files(from, to) - status "Copying files #{from} => #{to}..." if verbose? - - Dir["#{from}/**/*"].each do |f| - next unless File.file?(f) - - target = File.join(to, f.gsub(/^#{Regexp.escape from}/, '')) - - FileUtils.mkdir_p File.dirname(target) - msg "%20s => %-20s" % [f, target] if verbose? - FileUtils.cp f, target - end - end - -end - -CLI.new.run! +run