@@ -15,7 +15,7 @@ def is_absolute_dir(v):
1515 if not os .path .isabs (v ):
1616 raise ValidationError ("must be an absolute path, not '{v}'" .format (v = v ))
1717 if not os .path .exists (v ):
18- raise ValidationError ("dir must exists" )
18+ raise ValidationError ("directory must exists" )
1919 if not os .path .isdir (v ):
2020 raise ValidationError ("must be a dir" )
2121
@@ -43,56 +43,70 @@ def evaluate_promise(self, promiser, attributes, metadata):
4343 model = self .create_attribute_object (promiser , attributes )
4444 link_target = model .file if model .file else model .directory
4545
46- if not os .path .exists (promiser ):
47- try :
48- os .symlink (
49- link_target , promiser , target_is_directory = bool (model .directory )
50- )
51- except FileExistsError :
52- self .log_error (
53- "Couldn't symlink '{}' to '{}'. A link already exists" .format (
54- link_target , promiser
46+ try :
47+ os .symlink (link_target , promiser , target_is_directory = bool (model .directory ))
48+ self .log_info ("Created symlink '{}' -> '{}'" .format (promiser , link_target ))
49+ return Result .REPAIRED
50+ except FileExistsError :
51+
52+ if not os .path .islink (promiser ):
53+ self .log_error ("Symlink '{}' is already a path" .format (promiser ))
54+ return Result .NOT_KEPT
55+
56+ if os .path .realpath (promiser ) != link_target :
57+ self .log_warning ("Symlink '{}' already exists but has wrong target '{}'" .format (promiser , os .path .realpath (promiser )))
58+ try :
59+ os .unlink (promiser )
60+ except FileNotFoundError :
61+ self .log_error (
62+ "'{}' is already unlinked from its old target" .format (promiser )
5563 )
64+ return Result .NOT_KEPT
65+ except Exception :
66+ self .log_error (
67+ "'{}' has wrong target but couldn't be unlinked: {}" .format (
68+ promiser , e
69+ )
70+ )
71+ return Result .NOT_KEPT
72+ try :
73+ os .symlink (
74+ link_target , promiser , target_is_directory = bool (model .directory )
75+ )
76+ except FileExistsError :
77+ self .log_error (
78+ "Couldn't symlink '{}' to '{}'. A symlink already exists" .format (
79+ link_target , promiser
80+ )
81+ )
82+ return Result .NOT_KEPT
83+ except FileNotFoundError :
84+ self .log_error ("'{}' doesn't exist" .format (link_target ))
85+ return (Result .NOT_KEPT , ["symlink_no_target_error" ])
86+ except Exception as e :
87+ self .log_error (
88+ "Couldn't symlink '{}' to '{}': {}" .format (
89+ link_target , promiser , e
90+ )
91+ )
92+ return Result .NOT_KEPT
93+
94+ self .log_info (
95+ "Corrected symlink '{}' -> '{}'" .format (promiser , link_target )
5696 )
57- return (Result .NOT_KEPT , ["old_link" ])
58- except :
59- self .log_error (
60- "Couldn't symlink '{}' to '{}'" .format (link_target , promiser )
61- )
62- return (Result .NOT_KEPT , ["unknown" ])
63- self .log_info ("Created symlink '{}' -> '{}'" .format (promiser , link_target ))
64- return (Result .REPAIRED , ["link_created" ])
97+ return Result .REPAIRED
6598
66- if not os .path .islink (promiser ):
67- self .log_error ("Symlink '{}' is already a path" .format (promiser ))
68- return (Result .NOT_KEPT , ["link_is_path" ])
99+ return Result .KEPT
69100
70- if os .path .realpath (promiser ) != link_target :
71- try :
72- os .unlink (promiser )
73- os .symlink (
74- link_target , promiser , target_is_directory = bool (model .directory )
75- )
76- except FileExistsError :
77- self .log_error (
78- "Couldn't symlink '{}' to '{}'. A link already exists" .format (
79- link_target , promiser
80- )
81- )
82- return (Result .NOT_KEPT , ["old_link" ])
83- except :
84- self .log_error (
85- "Couldn't symlink '{}' to '{}'" .format (link_target , promiser )
86- )
87- return (Result .NOT_KEPT , ["unknown" ])
88- self .log_info (
89- "Symlink '{}' had wrong target. Updated from '{}' to '{}'" .format (
90- promiser , os .path .realpath (promiser ), link_target
91- )
92- )
93- return (Result .REPAIRED , ["changed_target" ])
101+ except FileNotFoundError :
102+ self .log_error ("'{}' doesn't exist" .format (promiser ))
103+ return Result .NOT_KEPT
94104
95- return (Result .KEPT , ["already_existing_link" ])
105+ except Exception as e :
106+ self .log_error (
107+ "Couldn't symlink '{}' to '{}': {}" .format (link_target , promiser , e )
108+ )
109+ return Result .NOT_KEPT
96110
97111
98112if __name__ == "__main__" :
0 commit comments