diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -139,15 +139,22 @@ class abstractopener(object):
         '''Prevent instantiation; don't call this from subclasses.'''
         raise NotImplementedError('attempted instantiating ' + str(type(self)))
 
-    def read(self, *args, **kwargs):
-        fp = self(*args, **kwargs)
+    def read(self, path):
+        fp = self(path, 'rb')
         try:
             return fp.read()
         finally:
             fp.close()
 
-    def write(self, data, *args, **kwargs):
-        fp = self(*args, **kwargs)
+    def write(self, path, data):
+        fp = self(path, 'wb')
+        try:
+            return fp.write(data)
+        finally:
+            fp.close()
+
+    def append(self, path, data):
+        fp = self(path, 'ab')
         try:
             return fp.write(data)
         finally:
diff --git a/mercurial/util.py b/mercurial/util.py
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -778,8 +778,15 @@ def readfile(path):
     finally:
         fp.close()
 
-def writefile(path, mode, text):
-    fp = open(path, mode)
+def writefile(path, text):
+    fp = open(path, 'wb')
+    try:
+        fp.write(text)
+    finally:
+        fp.close()
+
+def appendfile(path, text):
+    fp = open(path, 'ab')
     try:
         fp.write(text)
     finally: