@permission_required('explorer.can_add_files')
 @with_repo
 def file_upload(request, repo):
-    form = forms.BookUploadForm(request.POST, request.FILES)
-    if form.is_valid():
-        f = request.FILES['file']        
-
-        def upload_action():
-            print 'Adding file: %s' % f.name
-            repo._add_file(f.name, f.read().decode('utf-8'))
-            repo._commit(message="File %s uploaded from platform by %s" %
-                (f.name, request.user.username), user=request.user.username)
-
-        repo.in_branch(upload_action, 'default')
-        return HttpResponseRedirect( reverse('editor_view', kwargs={'path': f.name}) )
+    other_errors = []
 
+    if request.method == 'POST':
+        form = forms.BookUploadForm(request.POST, request.FILES)
+        if form.is_valid():
+            try:
+                # prepare the data
+                f = request.FILES['file']
+                decoded = f.read().decode('utf-8')
+
+                def upload_action():
+                    print 'Adding file: %s' % f.name
+                    repo._add_file(f.name, f.read().decode('utf-8'))
+                    repo._commit(
+                        message="File %s uploaded from platform by %s" %\
+                            (f.name, request.user.username), \
+                        user=request.user.username \
+                    )
+                    
+                    # end of upload
+
+                repo.in_branch(upload_action, 'default')
+
+                # if everything is ok, redirect to the editor
+                return HttpResponseRedirect( reverse('editor_view',
+                        kwargs={'path': f.name}) )
+
+            except hg.RepositoryException, e:
+                other_errors.append(u'Błąd repozytorium: ' + unicode(e) )
+            except UnicodeDecodeError, e:
+                other_errors.append(u'Niepoprawne kodowanie pliku: ' + e.reason \
+                 + u'. Żądane kodowanie: ' + e.encoding)
+        # invalid form
+
+    # get
+    form = forms.BookUploadForm()
     return direct_to_template(request, 'explorer/file_upload.html',
-        extra_context = {'form' : form} )
+        extra_context = {'form' : form, 'other_errors': other_errors})
    
 #
 # Edit the file
 
 encoding.encoding = 'utf-8'
 
 
-class RepositoryDoesNotExist(Exception):
-    pass
+
 
 class Repository(object):
     """Abstrakcja repozytorium Mercurial. Działa z Mercurial w wersji 1.3.1."""
         except KeyError, ke:
             raise RepositoryException("Can't switch to branch '%s': no such branch." % bname , ke)
         except util.Abort, ae:
-            raise repositoryException("Can't switch to branch '%s': %s"  % (bname, ae.message), ae)
+            raise RepositoryException("Can't switch to branch '%s': %s"  % (bname, ae.message), ae)
         finally:
             wlock.release()
 
     def __init__(self, msg, cause=None):
         Exception.__init__(self, msg)
         self.cause = cause
+
+class RepositoryDoesNotExist(RepositoryException):
+    pass