@@ -409,7 +409,9 @@ class SvnRevision
409
409
const char *path_from, const MatchRuleList &matchRules, svn_revnum_t rev_from,
410
410
apr_hash_t *changes, apr_pool_t *pool);
411
411
int addGitIgnore (apr_pool_t *pool, const char *key, QString path,
412
- svn_fs_root_t *fs_root, Repository::Transaction *txn);
412
+ svn_fs_root_t *fs_root, Repository::Transaction *txn, const char *content = NULL );
413
+ int fetchIgnoreProps (QString *ignore, apr_pool_t *pool, const char *key, svn_fs_root_t *fs_root);
414
+ int fetchUnknownProps (apr_pool_t *pool, const char *key, svn_fs_root_t *fs_root);
413
415
private:
414
416
void splitPathName (const Rules::Match &rule, const QString &pathName, QString *svnprefix_p,
415
417
QString *repository_p, QString *effectiveRepository_p, QString *branch_p, QString *path_p);
@@ -597,7 +599,8 @@ int SvnRevision::exportEntry(const char *key, const svn_fs_path_change2_t *chang
597
599
svn_boolean_t is_dir;
598
600
SVN_ERR (svn_fs_is_dir (&is_dir, fs_root, key, revpool));
599
601
// Adding newly created directories
600
- if (is_dir && change->change_kind == svn_fs_path_change_add && path_from == NULL && CommandLineParser::instance ()->contains (" empty-dirs" )) {
602
+ if (is_dir && change->change_kind == svn_fs_path_change_add && path_from == NULL
603
+ && CommandLineParser::instance ()->contains (" empty-dirs" )) {
601
604
QString keyQString = key;
602
605
// Skipping SVN-directory-layout
603
606
if (keyQString.endsWith (" /trunk" ) || keyQString.endsWith (" /branches" ) || keyQString.endsWith (" /tags" )) {
@@ -607,6 +610,11 @@ int SvnRevision::exportEntry(const char *key, const svn_fs_path_change2_t *chang
607
610
needCommit = true ;
608
611
// qDebug() << "Adding directory:" << key;
609
612
}
613
+ // svn:ignore-properties
614
+ else if (is_dir && (change->change_kind == svn_fs_path_change_add || change->change_kind == svn_fs_path_change_modify)
615
+ && path_from == NULL && CommandLineParser::instance ()->contains (" svn-ignore" )) {
616
+ needCommit = true ;
617
+ }
610
618
else if (is_dir) {
611
619
if (change->change_kind == svn_fs_path_change_modify ||
612
620
change->change_kind == svn_fs_path_change_add) {
@@ -858,13 +866,42 @@ int SvnRevision::exportInternal(const char *key, const svn_fs_path_change2_t *ch
858
866
} else {
859
867
if (ruledebug)
860
868
qDebug () << " add/change dir (" << key << " ->" << branch << path << " )" ;
861
- // Add GitIgnore for empty directories
862
- if (CommandLineParser::instance ()->contains (" empty-dirs" )) {
869
+
870
+ // Check unknown svn-properties
871
+ if (((path_from == NULL && change->prop_mod ==1 ) || (path_from != NULL && change->change_kind == svn_fs_path_change_add))
872
+ && CommandLineParser::instance ()->contains (" propcheck" )) {
873
+ if (fetchUnknownProps (pool, key, fs_root) != EXIT_SUCCESS) {
874
+ qWarning () << " Error checking svn-properties (" << key << " )" ;
875
+ }
876
+ }
877
+
878
+ int ignoreSet = false ;
879
+
880
+ // Add GitIgnore with svn:ignore
881
+ if (((path_from == NULL && change->prop_mod ==1 ) || (path_from != NULL && change->change_kind == svn_fs_path_change_add))
882
+ && CommandLineParser::instance ()->contains (" svn-ignore" )) {
883
+ QString svnignore;
884
+ // TODO: Check if svn:ignore or other property was changed, but always set on copy/rename (path_from != NULL)
885
+ if (fetchIgnoreProps (&svnignore, pool, key, fs_root) != EXIT_SUCCESS) {
886
+ qWarning () << " Error fetching svn-properties (" << key << " )" ;
887
+ } else if (!svnignore.isNull ()) {
888
+ addGitIgnore (pool, key, path, fs_root, txn, svnignore.toStdString ().c_str ());
889
+ ignoreSet = true ;
890
+ }
891
+ }
892
+
893
+ // Add GitIgnore for empty directories (if GitIgnore was not set previously)
894
+ if (CommandLineParser::instance ()->contains (" empty-dirs" ) && ignoreSet == false ) {
863
895
if (addGitIgnore (pool, key, path, fs_root, txn) == EXIT_SUCCESS) {
864
896
return EXIT_SUCCESS;
897
+ } else {
898
+ ignoreSet = true ;
865
899
}
866
900
}
867
- txn->deleteFile (path);
901
+
902
+ if (ignoreSet == false ) {
903
+ txn->deleteFile (path);
904
+ }
868
905
recursiveDumpDir (txn, fs_root, key, path, pool);
869
906
}
870
907
@@ -948,22 +985,62 @@ int SvnRevision::recurse(const char *path, const svn_fs_path_change2_t *change,
948
985
return EXIT_SUCCESS;
949
986
}
950
987
951
- int SvnRevision::addGitIgnore (apr_pool_t *pool, const char *key, QString path,
952
- svn_fs_root_t *fs_root, Repository::Transaction *txn)
988
+ int SvnRevision::addGitIgnore (apr_pool_t *pool, const char *key, QString path,
989
+ svn_fs_root_t *fs_root, Repository::Transaction *txn, const char *content )
953
990
{
954
- // Check for number of subfiles
955
- apr_hash_t *entries;
956
- SVN_ERR (svn_fs_dir_entries (&entries, fs_root, key, pool));
957
- // Return if any subfiles
958
- if (apr_hash_count (entries)!=0 ) {
959
- return EXIT_FAILURE;
991
+ // Check for number of subfiles if no content
992
+ if (!content) {
993
+ apr_hash_t *entries;
994
+ SVN_ERR (svn_fs_dir_entries (&entries, fs_root, key, pool));
995
+ // Return if any subfiles
996
+ if (apr_hash_count (entries)!=0 ) {
997
+ return EXIT_FAILURE;
998
+ }
960
999
}
961
1000
962
- // Add empty gitignore-File
1001
+ // Add gitignore-File
963
1002
QString gitIgnorePath = path + " .gitignore" ;
964
- qDebug () << " Adding GitIgnore-File" << gitIgnorePath;
965
- QIODevice *io = txn->addFile (gitIgnorePath, 33188 , 0 );
966
- io->putChar (' \n ' );
1003
+ if (content) {
1004
+ QIODevice *io = txn->addFile (gitIgnorePath, 33188 , strlen (content));
1005
+ io->write (content);
1006
+ io->putChar (' \n ' );
1007
+ } else {
1008
+ QIODevice *io = txn->addFile (gitIgnorePath, 33188 , 0 );
1009
+ io->putChar (' \n ' );
1010
+ }
1011
+
1012
+ return EXIT_SUCCESS;
1013
+ }
1014
+
1015
+ int SvnRevision::fetchIgnoreProps (QString *ignore, apr_pool_t *pool, const char *key, svn_fs_root_t *fs_root)
1016
+ {
1017
+ // Get svn:ignore
1018
+ svn_string_t *prop = NULL ;
1019
+ SVN_ERR (svn_fs_node_prop (&prop, fs_root, key, " svn:ignore" , pool));
1020
+ if (prop) {
1021
+ *ignore = QString (prop->data );
1022
+ } else {
1023
+ *ignore = QString ();
1024
+ }
967
1025
968
1026
return EXIT_SUCCESS;
969
1027
}
1028
+
1029
+ int SvnRevision::fetchUnknownProps (apr_pool_t *pool, const char *key, svn_fs_root_t *fs_root)
1030
+ {
1031
+ // Check all properties
1032
+ apr_hash_t *table;
1033
+ SVN_ERR (svn_fs_node_proplist (&table, fs_root, key, pool));
1034
+ apr_hash_index_t *hi;
1035
+ void *propVal;
1036
+ const void *propKey;
1037
+ for (hi = apr_hash_first (pool, table); hi; hi = apr_hash_next (hi)) {
1038
+ apr_hash_this (hi, &propKey, NULL , &propVal);
1039
+ if (strcmp ((char *)propKey, " svn:ignore" )!=0 ) {
1040
+ qWarning () << " WARN: Unknown svn-property" << (char *)propKey << " set to" << ((svn_string_t *)propVal)->data << " for" << key;
1041
+ }
1042
+ }
1043
+
1044
+ return EXIT_SUCCESS;
1045
+ }
1046
+
0 commit comments