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;
}
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));
+ svn_stream_close(out_stream);
+ svn_stream_close(in_stream);
// print an ending newline
io->putChar('\n');
memset(&tm, 0, sizeof tm);
QByteArray date(svn_date, strlen(svn_date) - 8);
strptime(date, "%Y-%m-%dT%H:%M:%S", &tm);
- return mktime(&tm);
+ return timegm(&tm);
}
class SvnRevision
svn_fs_root_t *fs_root;
int revnum;
+ // must call fetchRevProps first:
+ QByteArray authorident;
+ QByteArray log;
+ uint epoch;
+
SvnRevision(int revision, svn_fs_t *f, apr_pool_t *parent_pool)
: pool(parent_pool), fs(f), fs_root(0), revnum(revision)
{
}
int prepareTransactions();
+ int fetchRevProps();
int commit();
int exportEntry(const char *path, const svn_fs_path_change_t *change, apr_hash_t *changes);
return EXIT_SUCCESS;
}
-int SvnRevision::commit()
+int SvnRevision::fetchRevProps()
{
- // now create the commit
apr_hash_t *revprops;
SVN_ERR(svn_fs_revision_proplist(&revprops, fs, revnum, pool));
svn_string_t *svnauthor = (svn_string_t*)apr_hash_get(revprops, "svn:author", APR_HASH_KEY_STRING);
svn_string_t *svndate = (svn_string_t*)apr_hash_get(revprops, "svn:date", APR_HASH_KEY_STRING);
svn_string_t *svnlog = (svn_string_t*)apr_hash_get(revprops, "svn:log", APR_HASH_KEY_STRING);
- QByteArray log = (char *)svnlog->data;
- QByteArray authorident = svnauthor ? identities.value((char *)svnauthor->data) : QByteArray();
- time_t epoch = get_epoch((char*)svndate->data);
+ log = (char *)svnlog->data;
+ authorident = svnauthor ? identities.value((char *)svnauthor->data) : QByteArray();
+ epoch = get_epoch((char*)svndate->data);
if (authorident.isEmpty()) {
if (!svnauthor || svn_string_isempty(svnauthor))
authorident = "nobody <nobody@localhost>";
authorident = svnauthor->data + QByteArray(" <") +
svnauthor->data + QByteArray("@localhost>");
}
+ return EXIT_SUCCESS;
+}
+int SvnRevision::commit()
+{
+ // now create the commit
+ if (fetchRevProps() != EXIT_SUCCESS)
+ return EXIT_FAILURE;
foreach (Repository::Transaction *txn, transactions) {
txn->setAuthor(authorident);
txn->setDateTime(epoch);
}
repo->createBranch(branch, revnum, prevbranch, rev_from);
+ if (rule.annotate) {
+ // create an annotated tag
+ fetchRevProps();
+ repo->createAnnotatedTag(branch, svnprefix, revnum, authorident,
+ epoch, log);
+ }
return EXIT_SUCCESS;
}
}
entryFrom = path_from + QByteArray("/") + dirent->name;
// check if this entry is in the changelist for this revision already
- if (apr_hash_get(changes, entry.constData(), APR_HASH_KEY_STRING)) {
+ svn_fs_path_change_t *otherchange =
+ (svn_fs_path_change_t*)apr_hash_get(changes, entry.constData(), APR_HASH_KEY_STRING);
+ if (otherchange && otherchange->change_kind == svn_fs_path_change_add) {
qDebug() << entry << "rev" << revnum
<< "is in the change-list, deferring to that one";
continue;