Read symbolic links correctly.
authorAnders Kaseorg <andersk@MIT.EDU>
Sun, 28 Dec 2008 20:27:47 +0000 (28 15:27 -0500)
committerThiago Macieira <thiago@kde.org>
Thu, 8 Jan 2009 15:58:07 +0000 (8 16:58 +0100)
---1257098496-2120511158-1230496052=:2755Symlinks are described in Subversion by a file with propertysvn:special set to “*”, with contents “link <target of symlink>”.  We
need to strip off the “link ” when exporting to Git.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
Signed-off-by: Thiago Macieira <thiago@kde.org>
src/svn.cpp

index 5236579..3f06af7 100644 (file)
@@ -220,11 +220,6 @@ static int pathMode(svn_fs_root_t *fs_root, const char *pathname, apr_pool_t *po
     if (propvalue)
         mode = 0100755;
 
-    // maybe it's a symlink?
-    SVN_ERR(svn_fs_node_prop(&propvalue, fs_root, pathname, "svn:special", pool));
-    if (propvalue && strcmp(propvalue->data, "symlink") == 0)
-        mode = 0120000;
-
     return mode;
 }
 
@@ -261,13 +256,32 @@ static int dumpBlob(Repository::Transaction *txn, svn_fs_root_t *fs_root,
     svn_filesize_t stream_length;
 
     SVN_ERR(svn_fs_file_length(&stream_length, fs_root, pathname, dumppool));
-    QIODevice *io = txn->addFile(finalPathName, mode, stream_length);
 
 #ifndef DRY_RUN
     // open the file
     svn_stream_t *in_stream, *out_stream;
     SVN_ERR(svn_fs_file_contents(&in_stream, fs_root, pathname, dumppool));
+#endif
 
+    // maybe it's a symlink?
+    svn_string_t *propvalue;
+    SVN_ERR(svn_fs_node_prop(&propvalue, fs_root, pathname, "svn:special", dumppool));
+    if (propvalue) {
+        apr_size_t len = strlen("link ");
+#ifndef DRY_RUN
+        QByteArray buf;
+        buf.reserve(len);
+        SVN_ERR(svn_stream_read(in_stream, buf.data(), &len));
+        if (len != strlen("link ") || strncmp(buf, "link ", len) != 0)
+            qFatal("file %s is svn:special but not a symlink", pathname);
+#endif
+        mode = 0120000;
+        stream_length -= len;
+    }
+
+    QIODevice *io = txn->addFile(finalPathName, mode, stream_length);
+
+#ifndef DRY_RUN
     // open a generic svn_stream_t for the QIODevice
     out_stream = streamForDevice(io, dumppool);
     SVN_ERR(svn_stream_copy(in_stream, out_stream, dumppool));