From b74279d14c10a19431bbac7a559678f070a732e6 Mon Sep 17 00:00:00 2001 From: Sam Doran Date: Wed, 3 Oct 2018 17:27:34 -0400 Subject: [PATCH] Use proper index value with insertbefore on a one line file (#46071) Add tests and changelog --- ...nfile-insertbefore-index-out-of-range.yaml | 2 ++ lib/ansible/modules/files/lineinfile.py | 2 +- .../targets/lineinfile/tasks/main.yml | 31 +++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/lineinfile-insertbefore-index-out-of-range.yaml diff --git a/changelogs/fragments/lineinfile-insertbefore-index-out-of-range.yaml b/changelogs/fragments/lineinfile-insertbefore-index-out-of-range.yaml new file mode 100644 index 0000000000..52d4565fea --- /dev/null +++ b/changelogs/fragments/lineinfile-insertbefore-index-out-of-range.yaml @@ -0,0 +1,2 @@ +bugfixes: + - lineinfile - fix index out of range error when using insertbefore on a file with only one line (https://github.com/ansible/ansible/issues/46043) diff --git a/lib/ansible/modules/files/lineinfile.py b/lib/ansible/modules/files/lineinfile.py index 8469b76df0..00c45eb70a 100644 --- a/lib/ansible/modules/files/lineinfile.py +++ b/lib/ansible/modules/files/lineinfile.py @@ -333,7 +333,7 @@ def present(module, dest, regexp, line, insertafter, insertbefore, create, elif insertbefore and insertbefore != 'BOF': # If the line to insert before is at the beginning of the file # use the appropriate index value. - if index[1] == 0: + if index[1] <= 0: if b_lines[index[1]].rstrip(b('\r\n')) != b_line: b_lines.insert(index[1], b_line + b_linesep) msg = 'line replaced' diff --git a/test/integration/targets/lineinfile/tasks/main.yml b/test/integration/targets/lineinfile/tasks/main.yml index e9c76c4aef..680394f426 100644 --- a/test/integration/targets/lineinfile/tasks/main.yml +++ b/test/integration/targets/lineinfile/tasks/main.yml @@ -718,6 +718,37 @@ that: - result.stat.checksum == 'eca8d8ea089d4ea57a3b87d4091599ca8b60dfd2' +- name: Copy empty file to test with insertbefore + copy: + src: testempty.txt + dest: "{{ output_dir }}/testempty.txt" + +- name: Add a line to empty file with insertbefore + lineinfile: + path: "{{ output_dir }}/testempty.txt" + line: top + insertbefore: '^not in the file$' + register: oneline_insbefore_test1 + +- name: Add a line to file with only one line using insertbefore + lineinfile: + path: "{{ output_dir }}/testempty.txt" + line: top + insertbefore: '^not in the file$' + register: oneline_insbefore_test2 + +- name: Stat the file + stat: + path: "{{ output_dir }}/testempty.txt" + register: oneline_insbefore_file + +- name: Assert that insertebefore worked properly with a one line file + assert: + that: + - oneline_insbefore_test1 is changed + - oneline_insbefore_test2 is not changed + - oneline_insbefore_file.stat.checksum == '4dca56d05a21f0d018cd311f43e134e4501cf6d9' + ################################################################### # Issue 29443 # When using an empty regexp, replace the last line (since it matches every line)