Skip to content

Commit 823719d

Browse files
committed
operations/files.copy: noop if file already exists
1 parent 6dd6cd2 commit 823719d

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

src/pyinfra/operations/files.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1331,7 +1331,11 @@ def copy(src: str, dest: str, overwrite=False):
13311331
dest_file_path = os.path.join(dest, os.path.basename(src))
13321332
dest_file_exists = host.get_fact(File, dest_file_path)
13331333
if dest_file_exists and not overwrite:
1334-
raise OperationError(f"dest {dest_file_path} already exists and `overwrite` is unset")
1334+
if _file_equal(src, dest_file_path):
1335+
host.noop(f"{dest_file_path} already exists")
1336+
return
1337+
else:
1338+
raise OperationError(f"{dest_file_path} already exists and is different than src")
13351339

13361340
cp_cmd = ["cp -r"]
13371341

tests/operations/files.copy/invalid_overwrite.json

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
"dest": "/tmp/dest_dir",
55
"overwrite": false
66
},
7+
"local_files": {
8+
"files": {
9+
"/tmp/src_dir/file": "some content"
10+
}
11+
},
712
"facts": {
813
"files.File": {
914
"path=/tmp/src_dir/file": true,
@@ -12,10 +17,14 @@
1217
"files.Directory": {
1318
"path=/tmp/dest_dir": true,
1419
"path=/tmp/src_dir/file": null
20+
},
21+
"files.Sha1File": {
22+
"path=/tmp/src_dir/file": "abc",
23+
"path=/tmp/dest_dir/file": "xyz"
1524
}
1625
},
1726
"exception": {
1827
"name": "OperationError",
19-
"message": "dest /tmp/dest_dir/file already exists and `overwrite` is unset"
28+
"message": "/tmp/dest_dir/file already exists and is different than src"
2029
}
2130
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"kwargs": {
3+
"src": "/tmp/src_dir/file",
4+
"dest": "/tmp/dest_dir",
5+
"overwrite": false
6+
},
7+
"facts": {
8+
"files.File": {
9+
"path=/tmp/src_dir/file": true,
10+
"path=/tmp/dest_dir/file": true
11+
},
12+
"files.Directory": {
13+
"path=/tmp/dest_dir": true,
14+
"path=/tmp/src_dir/file": null
15+
},
16+
"files.Sha1File": {
17+
"path=/tmp/src_dir/file": "94e66df8cd09d410c62d9e0dc59d3a884e458e05",
18+
"path=/tmp/dest_dir/file": "94e66df8cd09d410c62d9e0dc59d3a884e458e05"
19+
}
20+
},
21+
"commands": [],
22+
"noop_description": "/tmp/dest_dir/file already exists"
23+
}

0 commit comments

Comments
 (0)