diff --git a/README.md b/README.md index 49cf5d0..0a0ba8d 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,40 @@ # Copycat -GitHub action for copying files from one repository to another. +[GitHub action](https://developer.github.com/actions/) for copying files from one repository to another. -##Usage +## Usage ``` +action "Copycat" { + uses = "andstor/copycat-action@v1.0.0" + secrets = ["GH_PAT"] + env = { + DST_OWNER = "andstor" + DST_REPO_NAME = "copycat-action" + SRC_WIKI = "true" + DST_PATH = "/wiki/" + SRC_PATH = "/." + } +} ``` ## Environment variables +The following environment variable options can/must be configured: -The following environment variable options can be configured: - -|Environment variable|Description| Type |Default| -|-------|-----------| ---- |-------| -|`SRC_PATH`|The source path to the file(s) or folder(s) to copy from. For example,`home.md`|`String`|| -|`DST_PATH`|The destination path to copy the file(s) or folder(s) to. For example, `pages/.`. |`String`|`SRC_PATH`| -|`DST_OWNER`|The name of the owner of the repository to push to. For example, `andstor`.|`String`|| -|`DST_REPO_NAME`|The name of the repository to push to. For example, `copycat-action`.|`String`|| -|`SRC_BRANCH`|The branch name of the source repository. Optional.|`String`|`master`| -|`DST_BRANCH`|The branch name of the destination repository. Optional.|`String`|`master`| -|`SRC_WIKI`|If the source repository you want to copy from is the GitHub Wiki.|`Boolean`| `false`| -|`DST_WIKI`|If the destination repository you want to copy from is the GitHub Wiki.|`Boolean`| `false`| - +|Environment variable|Required|Description|Default| +|--------------------|--------|-----------|-------| +|`SRC_PATH`|Required|The source path to the file(s) or folder(s) to copy from. For example, `/.` or `path/to/home.md`.|| +|`DST_PATH`|Optional|The destination path to copy the file(s) or folder(s) to. For example, `/wiki/` or `path/to/index.md`. |`SRC_PATH`| +|`DST_OWNER`|Required|The name of the owner of the repository to push to. For example, `andstor`.|| +|`DST_REPO_NAME`|Required|The name of the repository to push to. For example, `copycat-action`.|| +|`SRC_BRANCH`|Optional|The branch name of the source repository. Optional.|`master`| +|`DST_BRANCH`|Optional|The branch name of the destination repository. Optional.|`master`| +|`SRC_WIKI`|Optional|Set to `true` if the source repository you want to copy from is the GitHub Wiki.| `false`| +|`DST_WIKI`|Optional|Set to `true` if the destination repository you want to copy from is the GitHub Wiki.|`false`| ## Secrets -* `GITHUB_TOKEN`: (required) Include the [GitHub token secret](https://developer.github.com/actions/creating-workflows/storing-secrets/#github-token-secret) to make authenticated calls to the GitHub API for the **source repository**. +* `GH_PAT`: (required) GitHub Private Access Token used for the clone/push operations. To create it follow the [GitHub Documentation](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line). + +## Author +The Copycat GitHub action is written by [André Storhaug](https://github.com/andstor) -* `GH_PAT`: (required) GitHub Private Access Token used for the clone/push operations for the **destination repository**. To create it follow the [GitHub Documentation](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line). \ No newline at end of file +## License +This project is licensed under the [MIT License](https://opensource.org/licenses/MIT) - see the [LICENSE](LICENSE) file for details. diff --git a/entrypoint.sh b/entrypoint.sh index 681adf1..983c278 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,33 +1,40 @@ #!/bin/sh -set -eo pipefail +# +# @author André Storhaug +# @date 2019-07-01 +# @copyright MIT +# @version 0.1.2 -if [[ -z "${SRC_PATH}" ]]; then +set -o pipefail + +if [[ -z "$SRC_PATH" ]]; then echo "SRC_PATH environment variable is missing. Cannot proceed." exit 1 fi -if [[ -z "${DST_OWNER}" ]]; then +if [[ -z "$DST_OWNER" ]]; then echo "DST_OWNER environment variable is missing. Cannot proceed." exit 1 fi -if [[ -z "${DST_REPO_NAME}" ]]; then +if [[ -z "$DST_REPO_NAME" ]]; then echo "DST_REPO_NAME environment variable is missing. Cannot proceed." exit 1 fi -if [ -n "${SRC_WIKI}" = true ]; then +if [ "$SRC_WIKI" = "true" ]; then SRC_WIKI=".wiki" else SRC_WIKI="" fi -if [ -n "${DST_WIKI}" = true ]; then +if [ "$DST_WIKI" = "true" ]; then DST_WIKI=".wiki" else DST_WIKI="" fi +BASE_PATH=$(pwd) DST_PATH="${DST_PATH:-${SRC_PATH}}" SRC_BRANCH="${SRC_BRANCH:-master}" @@ -38,25 +45,45 @@ SRC_REPO_NAME="${GITHUB_REPOSITORY#*/}${SRC_WIKI}" DST_REPO="${DST_OWNER}/${DST_REPO_NAME}${DST_WIKI}" DST_REPO_NAME="${DST_REPO_NAME}${DST_WIKI}" -DIR="${SRC_PATH%/*}" +DIR="${DST_PATH%/*}" git config --global user.name "${GITHUB_ACTOR}" git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com" -echo "Copying \"${SRC_PATH}\" and pushing it to ${GITHUB_REPOSITORY}" +echo "Copying \"${SRC_REPO_NAME}/${SRC_PATH}\" and pushing it to ${GITHUB_REPOSITORY}" +git clone --branch ${SRC_BRANCH} --single-branch --depth 1 https://${GH_PAT}@github.com/${SRC_REPO}.git +if [ "$?" -ne 0 ]; then + echo >&2 "Cloning '$SRC_REPO' failed" + exit 1 +fi +rm -rf ${SRC_REPO_NAME}/.git # TODO: Remove every file that matches a filter (issue #1) -git clone --branch ${SRC_BRANCH} --single-branch --depth 1 https://${GITHUB_TOKEN}@github.com/${SRC_REPO}.git git clone --branch ${DST_BRANCH} --single-branch --depth 1 https://${GH_PAT}@github.com/${DST_REPO}.git +if [ "$?" -ne 0 ]; then + echo >&2 "Cloning '$DST_REPO' failed" + exit 1 +fi -mkdir -p DIR -cp -rf ${SRC_REPO_NAME}/${SRC_PATH} ${DST_REPO_NAME}/${DST_PATH} +mkdir -p ${DST_REPO_NAME}/${DIR} || exit "$?" +cp -rf ${SRC_REPO_NAME}/${SRC_PATH} ${DST_REPO_NAME}/${DST_PATH} || exit "$?" +cd ${DST_REPO_NAME} || exit "$?" -cd ${DST_REPO_NAME} +if [ -d "${BASE_PATH}/${SRC_REPO_NAME}/${SRC_PATH}" ]; then + COMMIT_MESSAGE="Update file(s) in \"${SRC_PATH}\" from \"${GITHUB_REPOSITORY}\"" +else + COMMIT_MESSAGE="Update file \"${SRC_PATH}\" from \"${GITHUB_REPOSITORY}\"" +fi -git add -A -git commit --message "Update \"${SRC_PATH}\" from \"${GITHUB_REPOSITORY}\"" +if [ -z "$(git status --porcelain)" ]; then + # Working directory is clean + echo "No changes detected " +else + # Uncommitted changes + git add -A + git commit --message "${COMMIT_MESSAGE}" -git push -u origin ${DST_BRANCH} + git push -u origin ${DST_BRANCH} +fi echo "Copying complete 👌" \ No newline at end of file