#!/usr/bin/env zsh # # update-from-upstream.zsh # # This script updates the Oh My Zsh version of the zsh-history-substring-search # plugin from the independent upstream repo. This is to be run by OMZ developers # when they want to pull in new changes from upstream to OMZ. It is not run # during normal use of the plugin. # # The official upstream repo is zsh-users/zsh-history-substring-search # https://github.com/zsh-users/zsh-history-substring-search # # This is a zsh script, not a function. Call it with `zsh update-from-upstream.zsh` # from the command line, running it from within the plugin directory. # # You can set the environment variable REPO_PATH to point it at an upstream # repo you have already prepared. Otherwise, it will do a clean checkout of # upstream's HEAD to a temporary local repo and use that. # Just bail on any error so we don't have to do extra checking. # This is a developer-use script, so terse output like that should # be fine. set -e upstream_basename=zsh-history-substring-search plugin_basename=history-substring-search UPSTREAM_REPO=zsh-users/$upstream_basename need_repo_cleanup=false upstream_github_url="https://github.com/$UPSTREAM_REPO" if [[ -z "$UPSTREAM_REPO_PATH" ]]; then # Do a clean checkout my_tempdir=$(mktemp -d -t omz-update-histsubstrsrch) UPSTREAM_REPO_PATH="$my_tempdir/$upstream_basename" git clone "$upstream_github_url" "$UPSTREAM_REPO_PATH" need_repo_cleanup=true print "Checked out upstream repo to $UPSTREAM_REPO_PATH" else print "Using existing $upstream_basename repo at $UPSTREAM_REPO_PATH" fi upstream="$UPSTREAM_REPO_PATH" # Figure out what we're pulling in upstream_sha=$(cd $upstream && git rev-parse HEAD) upstream_commit_date=$(cd $upstream && git log -1 --pretty=format:%ci) upstream_just_date=${${=upstream_commit_date}[1]} print "upstream SHA: $upstream_sha" print "upstream commit time: $upstream_commit_date" print "upstream commit date: $upstream_just_date" print # Copy the files over, using the OMZ plugin's names where needed cp -v "$upstream"/* . mv -v zsh-history-substring-search.zsh $plugin_basename.zsh mv -v zsh-history-substring-search.plugin.zsh $plugin_basename.plugin.zsh if [[ $need_repo_cleanup == true ]]; then print "Removing temporary repo at $my_tempdir" rm -rf "$my_tempdir" fi # Do OMZ-specific edits print print "Updating files with OMZ-specific stuff" print # OMZ binds the keys as part of the plugin loading cat >> $plugin_basename.plugin.zsh <<EOF # Bind terminal-specific up and down keys if [[ -n "\$terminfo[kcuu1]" ]]; then bindkey -M emacs "\$terminfo[kcuu1]" history-substring-search-up bindkey -M viins "\$terminfo[kcuu1]" history-substring-search-up fi if [[ -n "\$terminfo[kcud1]" ]]; then bindkey -M emacs "\$terminfo[kcud1]" history-substring-search-down bindkey -M viins "\$terminfo[kcud1]" history-substring-search-down fi EOF # Tack OMZ-specific notes on to readme thin_line="------------------------------------------------------------------------------" cat >> README.md <<EOF $thin_line Oh My Zsh Distribution Notes $thin_line What you are looking at now is Oh My Zsh's repackaging of zsh-history-substring-search as an OMZ module inside the Oh My Zsh distribution. The upstream repo, $UPSTREAM_REPO, can be found on GitHub at $upstream_github_url. This downstream copy was last updated from the following upstream commit: SHA: $upstream_sha Commit date: $upstream_commit_date Everything above this section is a copy of the original upstream's README, so things may differ slightly when you're using this inside OMZ. In particular, you do not need to set up key bindings for the up and down arrows yourself in \`~/.zshrc\`; the OMZ plugin does that for you. You may still want to set up additional emacs- or vi-specific bindings as mentioned above. EOF # Announce success and generate git commit messages cat <<EOF Done OK Now you can check the results and commit like this: git add * git commit -m "history-substring-search: update to upstream version $upstream_just_date" \\ -m "Updates OMZ's copy to commit $upstream_sha from $UPSTREAM_REPO" EOF