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