11import logging
2+ import os .path
23import re
34from collections import Counter
45from itertools import groupby
@@ -45,10 +46,6 @@ def sync(local_folder, cloudinary_folder, push, pull, include_hidden, concurrent
4546 if push == pull :
4647 raise UsageError ("Please use either the '--push' OR '--pull' options" )
4748
48- if pull and not cld_folder_exists (cloudinary_folder ):
49- logger .error (f"Cloudinary folder '{ cloudinary_folder } ' does not exist. Aborting..." )
50- return False
51-
5249 sync_dir = SyncDir (local_folder , cloudinary_folder , include_hidden , concurrent_workers , force , keep_unique ,
5350 deletion_batch_size , folder_mode , optional_parameter , optional_parameter_parsed )
5451
@@ -58,7 +55,8 @@ def sync(local_folder, cloudinary_folder, push, pull, include_hidden, concurrent
5855 elif pull :
5956 result = sync_dir .pull ()
6057
61- logger .info ("Done!" )
58+ if result :
59+ logger .info ("Done!" )
6260
6361 return result
6462
@@ -84,12 +82,32 @@ def __init__(self, local_dir, remote_dir, include_hidden, concurrent_workers, fo
8482
8583 self .verbose = logger .getEffectiveLevel () < logging .INFO
8684
87- self .local_files = walk_dir (path .abspath (self .local_dir ), include_hidden )
88- logger .info (f"Found { len (self .local_files )} items in local folder '{ local_dir } '" )
85+ self .local_files = {}
86+ self .local_folder_exists = os .path .isdir (path .abspath (self .local_dir ))
87+ if not self .local_folder_exists :
88+ logger .info (f"Local folder '{ self .local_dir } ' does not exist." )
89+ else :
90+ self .local_files = walk_dir (path .abspath (self .local_dir ), include_hidden )
91+ if len (self .local_files ):
92+ logger .info (f"Found { len (self .local_files )} items in local folder '{ self .local_dir } '" )
93+ else :
94+ logger .info (f"Local folder '{ self .local_dir } ' is empty." )
95+
96+ raw_remote_files = {}
97+ self .cld_folder_exists = cld_folder_exists (self .remote_dir )
98+ if not self .cld_folder_exists :
99+ logger .info (f"Cloudinary folder '{ self .user_friendly_remote_dir } ' does not exist "
100+ f"({ self .folder_mode } folder mode)." )
101+ else :
102+ raw_remote_files = query_cld_folder (self .remote_dir , self .folder_mode )
103+ if len (raw_remote_files ):
104+ logger .info (
105+ f"Found { len (raw_remote_files )} items in Cloudinary folder '{ self .user_friendly_remote_dir } ' "
106+ f"({ self .folder_mode } folder mode)." )
107+ else :
108+ logger .info (f"Cloudinary folder '{ self .user_friendly_remote_dir } ' is empty. "
109+ f"({ self .folder_mode } folder mode)" )
89110
90- raw_remote_files = query_cld_folder (self .remote_dir , self .folder_mode )
91- logger .info (f"Found { len (raw_remote_files )} items in Cloudinary folder '{ self .user_friendly_remote_dir } ' "
92- f"({ self .folder_mode } folder mode)" )
93111 self .remote_files = self ._normalize_remote_file_names (raw_remote_files , self .local_files )
94112 self .remote_duplicate_names = duplicate_values (self .remote_files , "normalized_path" , "asset_id" )
95113 self ._print_duplicate_file_names ()
@@ -137,6 +155,11 @@ def push(self):
137155 """
138156 Pushes changes from the local folder to the Cloudinary folder.
139157 """
158+
159+ if not self .local_folder_exists :
160+ logger .error (f"Cannot push a non-existent local folder '{ self .local_dir } '. Aborting..." )
161+ return False
162+
140163 if not self ._handle_unique_remote_files ():
141164 logger .info ("Aborting..." )
142165 return False
@@ -176,6 +199,12 @@ def pull(self):
176199 """
177200 Pulls changes from the Cloudinary folder to the local folder.
178201 """
202+
203+ if not self .cld_folder_exists :
204+ logger .error (f"Cannot pull from a non-existent Cloudinary folder '{ self .user_friendly_remote_dir } ' "
205+ f"({ self .folder_mode } folder mode). Aborting..." )
206+ return False
207+
179208 download_results = {}
180209 download_errors = {}
181210 if not self ._handle_unique_local_files ():
0 commit comments