Fix UnboundLocalError with plugins and largefiles

When Plugins are used in a repository that contains largefiles,
the following exception is thrown as soon as the first largefile
is converted:

```
Traceback (most recent call last):
  File "fast-export/hg-fast-export.py", line 728, in <module>
    sys.exit(hg2git(options.repourl,m,options.marksfile,options.mappingfile,
  File "fast-export/hg-fast-export.py", line 581, in hg2git
    c=export_commit(ui,repo,rev,old_marks,max,c,authors,branchesmap,
  File "fast-export/hg-fast-export.py", line 366, in export_commit
    export_file_contents(ctx,man,modified,hgtags,fn_encoding,plugins)
  File "fast-export/hg-fast-export.py", line 222, in export_file_contents
    file_data = {'filename':filename,'file_ctx':file_ctx,'data':d}
UnboundLocalError: local variable 'file_ctx' referenced before assignment
```

This commit fixes the error by:

 * initializing the file_ctx before the largefile handling takes place
 * Providing a new `is_largefile` value for plugins so they can detect
    if largefile handling was applied (and therefore the file_ctx
    object may no longer be in sync with the git version of the file)
This commit is contained in:
Günther Nußmüller
2025-07-25 12:28:23 +02:00
parent 95459e5599
commit d77765a23e
6 changed files with 131 additions and 3 deletions

View File

@@ -211,15 +211,18 @@ def export_file_contents(ctx,manifest,files,hgtags,encoding='',plugins={}):
b'Ignoring file %s which cannot be tracked by git\n' % filename
)
continue
largefile = False
file_ctx=ctx.filectx(file)
if is_largefile(filename):
largefile = True
filename = largefile_orig_name(filename)
d = largefile_data(ctx, file, filename)
else:
file_ctx=ctx.filectx(file)
d=file_ctx.data()
if plugins and plugins['file_data_filters']:
file_data = {'filename':filename,'file_ctx':file_ctx,'data':d}
file_data = {'filename':filename,'file_ctx':file_ctx,'data':d, 'is_largefile':largefile}
for filter in plugins['file_data_filters']:
filter(file_data)
d=file_data['data']