[fossil-users] Importing git copies and renames

2013-06-17 Thread Isaac Jurado
Hello,

I finally came up with something to make import work with:

git fast-export -M -C ...

Below is the tentative patch that seems to work on my tests.  The good
thing is that even though Fossil does not follows history across
renames, at least now the rename operation is visible and both source
and destination timelines are now linked.  For repositories imported
from git, that is.

Please accept my apologies if I failed to follow the conventions.
Comments and testing will be very welcomed.


Index: src/import.c
==
--- src/import.c
+++ src/import.c
@@ -107,10 +107,11 @@
   gg.nMerge = 0;
   for(i=0; igg.nFile; i++){
 fossil_free(gg.aFile[i].zName);
 fossil_free(gg.aFile[i].zUuid);
 fossil_free(gg.aFile[i].zPrior);
+gg.aFile[i].zPrior = 0;
   }
   memset(gg.aFile, 0, gg.nFile*sizeof(gg.aFile[0]));
   gg.nFile = 0;
   if( freeAll ){
 fossil_free(gg.zPrevBranch);
@@ -243,17 +244,22 @@
   for(i=0; igg.nFile; i++){
 const char *zUuid = gg.aFile[i].zUuid;
 if( zUuid==0 ) continue;
 blob_appendf(record, F %F %s, gg.aFile[i].zName, zUuid);
 if( gg.aFile[i].isExe ){
-  blob_append(record,  x\n, 3);
+  blob_append(record,  x, 2);
 }else if( gg.aFile[i].isLink ){
-  blob_append(record,  l\n, 3);
+  blob_append(record,  l, 2);
   gg.hasLinks = 1;
-}else{
-  blob_append(record, \n, 1);
+}
+if( gg.aFile[i].zPrior ){
+  if( !gg.aFile[i].isExe  !gg.aFile[i].isLink ){
+blob_append(record,  w, 2);
+  }
+  blob_appendf(record,  %F, gg.aFile[i].zPrior);
 }
+blob_append(record, \n, 1);
   }
   if( gg.zFrom ){
 blob_appendf(record, P %s, gg.zFrom);
 for(i=0; igg.nMerge; i++){
   blob_appendf(record,  %s, gg.azMerge[i]);
@@ -636,10 +642,11 @@
   i = 0;
   while( (pFile = import_find_file(zName, i, gg.nFile))!=0 ){
 if( pFile-isFrom==0 ) continue;
 fossil_free(pFile-zName);
 fossil_free(pFile-zPrior);
+pFile-zPrior = 0;
 fossil_free(pFile-zUuid);
 *pFile = gg.aFile[--gg.nFile];
 i--;
   }
 }else
@@ -651,51 +658,36 @@
   zTo = rest_of_line(z);
   i = 0;
   mx = gg.nFile;
   nFrom = strlen(zFrom);
   while( (pFile = import_find_file(zFrom, i, mx))!=0 ){
-if( pFile-isFrom==0 ) continue;
 pNew = import_add_file();
 pFile = gg.aFile[i-1];
 if( strlen(pFile-zName)nFrom ){
   pNew-zName = mprintf(%s%s, zTo, pFile-zName[nFrom]);
 }else{
-  pNew-zName = fossil_strdup(pFile-zName);
+  pNew-zName = fossil_strdup(zTo);
 }
 pNew-isExe = pFile-isExe;
 pNew-isLink = pFile-isLink;
 pNew-zUuid = fossil_strdup(pFile-zUuid);
 pNew-isFrom = 0;
   }
 }else
 if( memcmp(zLine, R , 2)==0 ){
-  int nFrom;
   import_prior_files();
   z = zLine[2];
   zFrom = next_token(z);
   zTo = rest_of_line(z);
   i = 0;
-  nFrom = strlen(zFrom);
   while( (pFile = import_find_file(zFrom, i, gg.nFile))!=0 ){
 if( pFile-isFrom==0 ) continue;
-pNew = import_add_file();
 pFile = gg.aFile[i-1];
-if( strlen(pFile-zName)nFrom ){
-  pNew-zName = mprintf(%s%s, zTo, pFile-zName[nFrom]);
-}else{
-  pNew-zName = fossil_strdup(pFile-zName);
-}
-pNew-zPrior = pFile-zName;
-pNew-isExe = pFile-isExe;
-pNew-isLink = pFile-isLink;
-pNew-zUuid = pFile-zUuid;
-pNew-isFrom = 0;
-gg.nFile--;
-*pFile = *pNew;
-memset(pNew, 0, sizeof(*pNew));
+pFile-zPrior = pFile-zName;
+pFile-zName = fossil_strdup(zTo);
+pFile-isFrom = 0;
   }
-  fossil_fatal(cannot handle R records, use --full-tree);
 }else
 if( memcmp(zLine, deleteall, 9)==0 ){
   gg.fromLoaded = 1;
 }else
 if( memcmp(zLine, N , 2)==0 ){


-- 
Isaac Jurado

The noblest pleasure is the joy of understanding.
  Leonardo da Vinci
___
fossil-users mailing list
fossil-users@lists.fossil-scm.org
http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users


Re: [fossil-users] Importing git copies and renames

2013-06-17 Thread Richard Hipp
On Mon, Jun 17, 2013 at 3:56 PM, Isaac Jurado dipto...@gmail.com wrote:

 Hello,

 I finally came up with something to make import work with:

 git fast-export -M -C ...

 Below is the tentative patch that seems to work on my tests.  The good
 thing is that even though Fossil does not follows history across
 renames, at least now the rename operation is visible and both source
 and destination timelines are now linked.  For repositories imported
 from git, that is.


Thanks for the patch!

These changes are in a branch (
www.fossil-scm.org/fossil/timeline?r=git-import-with-rename).  I don't have
good test cases for git imports, so I'll depend on others to let me know
when this branch is ready to merge into trunk.


-- 
D. Richard Hipp
d...@sqlite.org
___
fossil-users mailing list
fossil-users@lists.fossil-scm.org
http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users