# Dependencies are managed in the Dockerfile in the inkscape-ci-docker
# Git repository. Change them there, wait a bit, and then we'll use
# the new ones here in these builds.
image: registry.gitlab.com/inkscape/inkscape-ci-docker/master

variables:
  GIT_DEPTH: "10"
  GIT_SUBMODULE_STRATEGY: recursive

#######################
#                     #
#  Building inkscape  #
#                     #
#######################
# Linux, Appimage, mac. Windows is handled in .appveyor.yml

    ### On linux...

inkscape:linux:
  stage: build
  except:
    - schedules
  cache:
    key: "cache-linux"
    paths:
      - ccache/
  before_script:
    # CCache Config
    - mkdir -p ccache
    - export CCACHE_BASEDIR=${PWD}
    - export CCACHE_DIR=${PWD}/ccache
  script:
    - mkdir -p build/conf
    - ln -s . share/inkscape
    - cd build
    - cmake .. -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX:PATH=$PWD/install_dir/ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
    - make -j3 install
    - make -j3 tests
    - cpack -G DEB
    - rm -rf src _CPack_Packages # exclude from artifacts
    - cd ..
  artifacts:
    expire_in: 1 year
    paths:
      - build/

    ### + Appimage (custom script, cf generate.sh)

appimage:linux:
  stage: build
  except:
    - schedules
  cache:
    key: "cache-appimage"
    paths:
      - ccache/
  before_script:
    # CCache Config
    - mkdir -p ccache
    - export CCACHE_BASEDIR=${PWD}
    - export CCACHE_DIR=${PWD}/ccache
  script:
    - bash -ex packaging/appimage/generate.sh
  artifacts:
    expire_in: 1 year
    paths:
      - Inkscape*.AppImage*

    ### On mac... (this needs a custom mac runner)
 
inkscape:mac:
  stage: build
  tags:
    - mac
  only:
    - branches@inkscape/inkscape
    - branches@dehesselle/inkscape
  except:
    - schedules
  before_script:
    - packaging/macos/build_toolset.sh
  script:
    - packaging/macos/build_inkscape.sh
  artifacts:
    expire_in: 1 year
    paths:
      - artifacts/
  allow_failure: true


###########################
#                         #
#  Various code checkers  #
#                         #
###########################

  ### This script checks for *merge requests* that they conform to the code style. It allows failures.
  # cf ./_clang-format and https://inkscape.org/develop/coding-style/

codequality:
  stage: build
  except:
    - schedules
  script:
    - git fetch https://gitlab.com/inkscape/inkscape.git
    - echo "Your commit does not comply exactly with the clang-format style checker.\nPlease review the following diff or apply it with\n \$ git apply <<EOF"
    - git diff FETCH_HEAD -U0 --no-color | clang-format-diff-6.0 -p1 -style file | tee clang_format_diff
    - echo "EOF"
    - if [[ -s clang_format_diff ]]; then false; fi
  allow_failure: true

    ### We embed script from third party libraries, that we sometimes update from their source. Hence we should NEVER modify them here before submitting the patch upstream!
    # Ideally, we should remove all this code and use them as packaged libraries. Unfortunately this check only works for merge requests. 

codeprotect:
  stage: build
  except:
    - schedules
  script:
    - git fetch https://gitlab.com/inkscape/inkscape.git
    - git diff FETCH_HEAD -U0 --no-color src/2geom/ src/3rdparty/adaptagrams/ src/3rdparty/libdepixelize src/3rdparty/libuemf | tee forbidden
    - if [[ -s forbidden ]]; then echo "This commit modifies files that are in an dependency library. Make sure you update upstream first, *then* force the merge in Inkscape."; false; fi

  #### All files should have a licence

check-license-headers:
  stage: build
  except:
    - schedules
  script:
    - python buildtools/check_license_headers.py

    ### Several translation tests:
    #   - verify that the list of translatable files (POTFILES.*.in) are up to date
    #   - check if we can successfully re-generate inkscape.pot
    #   - sync all .po files with the updated inkscape.pot and run some automated checks on them
    #  (artifacts from this job are also used to generate translations statistics for the website)

translations:
  stage: build
  except:
    - schedules
  script:
    # make sure dependencies for inkscape.pot are up-to-date
    - mkdir build && cd build && cmake .. && make inkscape_pot && cd .. || exit 1
    - cd po/

    # update POTFILES.*.in
    - ./generate_POTFILES.sh

    # update inkscape.pot and sync all .po files
    - rm -f inkscape.pot
    - cd ../build && make inkscape_pot && cd ../po || exit 1
    - ./update_po_files.sh

    # check if POTFILES.*.in should be updated in the repo (shall we automate this?)
    - 'if [ -n "$(git diff POTFILES.*.in)" ]; then
        git diff POTFILES.*.in;
        echo "New translatable strings in source files found.";
        echo "Please add the paths to POTFILES.*.in so they can be translated";
        echo "(or add them to POTFILES.skip to exclude them from translations).";
        exit 1;
      fi'
  artifacts:
    name: "translations"
    paths:
      - po/
    when: always

  ### clang-tidy is an utility to check that some c++ code good practices and patterns are respected. We use it at 1% of its possibilities (only when it suggests fixes).

clangtidy:linux:
  stage: build
  except:
    - schedules
    - branches@inkscape/inkscape
  script:
    - git fetch https://gitlab.com/inkscape/inkscape.git
    # "borrow" a 2geom file to dump header includes
    - git diff FETCH_HEAD --name-only | (grep '^src/.*\.h$' || true) | sed 's/^src/#include"../;s/$/"/' | tee src/2geom/geom.cpp
    - git diff FETCH_HEAD --name-only | grep '^src/.*\.cpp$' | tee clang_tidy_files
    - bash buildtools/clangtidy-helper.sh $(cat clang_tidy_files)

clangtidyfull:linux:
  stage: build
  except:
    - schedules
  only:
    - branches@inkscape/inkscape
  script:
    - bash buildtools/clangtidy-helper.sh

    ### scan-build is a static analysis tool. This job is *slow*.

clang:
  stage: build
  only:
    variables:
      - $SCHEDULED_JOB_NAME == "clang"
  script:
    - apt-get update -yqq && apt-get install -y clang
    - mkdir -p clang-build
    - cd clang-build
    - scan-build cmake .. -DCMAKE_BUILD_TYPE=Debug
    - VERBOSE=1 scan-build -o ../scan make -j2
  artifacts:
    paths:
      - scan/

    ### doxygen

source-doc:
  stage: build
  only:
    variables:
      - $SCHEDULED_JOB_NAME == "source-doc"
  script:
    - cd buildtools
    - doxygen Doxyfile
    - doxygen Doxyfile-extensions
    - cd ..
  artifacts:
    paths:
      - doc/doxygen
      - doc/doxygen-extensions

################
#              #
#  Unit tests  #
#              #
################
test:linux:
  stage: test
  except:
    - schedules
  dependencies:
    - inkscape:linux
  script:
    - cd build
    - ctest -V


# uploads the clang scan to user.gitlab.io/inkscape/
pages:
  stage: deploy
  cache:
    key: "cache-pages"
    paths:
      - public
  only:
    - schedules
  dependencies:
    - source-doc
    - clang
  script:
    - mkdir -p public/
    - sed "s/%DATE%/$(date '+%B %d, %Y')/" buildtools/ci-index.html > public/index.html
    - if test -e scan; then rm -fr public/scan-build && cp -rv scan/* public/scan-build; fi
    - if test -e doc/doxygen; then cp -rv doc/doxygen/html public/doxygen; fi
    - if test -e doc/doxygen-extensions; then cp -rv doc/doxygen-extensions/html public/doxygen-extensions; fi
  artifacts:
    paths:
      - public
