From cc94fca0061c9b38d56d9964c98a743e9bf29b26 Mon Sep 17 00:00:00 2001 From: Fabien Boucher Date: Feb 05 2020 16:19:52 +0000 Subject: Add the source-to-tarball role This role is aimed to be used with a source that contain a RPM spec file. It detects the version of the source from the git repository and it creates the tarball from the source. Then it updates the spec file to change the Source0 and Version fields. The version detection could be optionally based on detecting the version from the spec file. --- diff --git a/roles/source-to-tarball/defaults/main.yaml b/roles/source-to-tarball/defaults/main.yaml new file mode 100644 index 0000000..0dd6a65 --- /dev/null +++ b/roles/source-to-tarball/defaults/main.yaml @@ -0,0 +1 @@ +version_from_specfile: false diff --git a/roles/source-to-tarball/files/detect-source-version.py b/roles/source-to-tarball/files/detect-source-version.py new file mode 100755 index 0000000..2f6794a --- /dev/null +++ b/roles/source-to-tarball/files/detect-source-version.py @@ -0,0 +1,42 @@ +#!/bin/env python + +import os +import sys +import subprocess + + +def execute(argv, capture=False, cwd=None, test=False): + if capture is True: + stdout = subprocess.PIPE + else: + stdout = None + if os.environ.get('debug'): + print("Running %s" % argv) + s = subprocess.Popen(argv, stdout=stdout, cwd=cwd) + out, _ = s.communicate() + code = s.wait() + if os.environ.get('debug'): + print("Command %s exited with code %s" % (argv, code)) + if code: + if not test: + print("Command %s failed" % argv) + raise RuntimeError() + return out + + +def get_repo_version(repo): + ref = 'HEAD' + try: + version = execute(["git", "describe", "--tags", ref], + capture=True, cwd=repo, test=True).strip() + except RuntimeError: + version = execute(["git", "rev-list", "--count", ref], + capture=True, cwd=repo, test=True).strip() + # Make sure rev-list version is lower than first tag + version = "0.0.0.0-dev%s" % version + return version.replace('-', '.') + + +if __name__ == "__main__": + if os.path.isdir(os.path.join(sys.argv[1], '.git')): + print(get_repo_version(sys.argv[1])) diff --git a/roles/source-to-tarball/tasks/main.yaml b/roles/source-to-tarball/tasks/main.yaml new file mode 100644 index 0000000..4aae42e --- /dev/null +++ b/roles/source-to-tarball/tasks/main.yaml @@ -0,0 +1,67 @@ +--- +- name: Discover package name from specfile name + shell: ls *.spec | sed 's/\.spec$//' + args: + chdir: "{{ ansible_user_dir }}/{{ zuul.project.src_dir }}" + register: get_package_name + +- name: Set package name fact + set_fact: + package_name: "{{ get_package_name.stdout }}" + +- name: Set tarball path fact + set_fact: + tarball: "{{ ansible_user_dir }}/{{ zuul.project.src_dir }}/{{ package_name }}-HEAD.tgz" + +- block: + - name: Detect version from specfile + shell: > + rpmspec -P {{ package_name}}.spec | egrep -i '^version:' | + sed -e "s/[Vv]ersion:[ \t]\+//g" + register: cmd + args: + chdir: "{{ ansible_user_dir }}/{{ zuul.project.src_dir }}" + + - name: Set source_version fact + set_fact: + source_version: "{{ cmd.stdout|trim }}" + + when: version_from_specfile + +- block: + - name: Detect source version from git + script: + cmd: > + files/detect-source-version.py + {{ ansible_user_dir }}/{{ zuul.project.src_dir }} + register: cmd + + - name: Set source_version fact + set_fact: + source_version: "{{ cmd.stdout|trim }}" + + when: not version_from_specfile + +- name: Create the source tarball + command: > + tar -czf /tmp/HEAD.tgz + --exclude .git + --transform s/^{{ package_name }}/{{ package_name }}-{{ source_version }}/ + {{ zuul.project.src_dir|basename }} + args: + chdir: "{{ ansible_user_dir }}/{{ zuul.project.src_dir }}/.." + +- name: Move tarball in the project repository + command: mv /tmp/HEAD.tgz {{ tarball }} + +- name: Set specfile Version + replace: + path: "{{ ansible_user_dir }}/{{ zuul.project.src_dir }}/{{ package_name }}.spec" + regexp: "^[Vv]ersion:.*" + replace: "Version: {{ source_version }}" + +- name: Set specfile Source0 + replace: + path: "{{ ansible_user_dir }}/{{ zuul.project.src_dir }}/{{ package_name }}.spec" + regexp: "^[Ss]ource0:.*" + replace: "Source0: {{ tarball | basename }}"