Compare commits
70 Commits
version/20
...
version/20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
735f5160e4 | ||
|
|
a5949431b1 | ||
|
|
0622410e4a | ||
|
|
acb8a7a793 | ||
|
|
93b71e29e6 | ||
|
|
fcf5087da9 | ||
|
|
2c7e8318db | ||
|
|
157ce05c69 | ||
|
|
799b0b4ad6 | ||
|
|
c9f7483fc4 | ||
|
|
4d3a5fb528 | ||
|
|
e8a6c477cc | ||
|
|
21a53b3537 | ||
|
|
37ff25cfe4 | ||
|
|
0409f339ae | ||
|
|
771c2a2abe | ||
|
|
224a9a0b18 | ||
|
|
08cb5c481b | ||
|
|
c23ec2827f | ||
|
|
ba8feb7d6f | ||
|
|
f1f612206f | ||
|
|
ef36d50d9b | ||
|
|
5b969d37ec | ||
|
|
8e82d4e1fb | ||
|
|
2dfbc989ba | ||
|
|
93b085f441 | ||
|
|
52bceabab7 | ||
|
|
cee226183c | ||
|
|
6cb7d12ec1 | ||
|
|
16a42dfc6b | ||
|
|
9d6ce08430 | ||
|
|
95b7ef534b | ||
|
|
b03d12313a | ||
|
|
13137727b0 | ||
|
|
7e30b2f87a | ||
|
|
6a356f7e18 | ||
|
|
b2743b92f3 | ||
|
|
f57a5ed4cb | ||
|
|
249f00dd32 | ||
|
|
f581b93d9b | ||
|
|
2a1b666a5e | ||
|
|
92864a4c1a | ||
|
|
03ef344ada | ||
|
|
b81e7868e7 | ||
|
|
a64e172c00 | ||
|
|
6927ffb67c | ||
|
|
6ae033aa68 | ||
|
|
d60b866718 | ||
|
|
57e20e046a | ||
|
|
914241cc79 | ||
|
|
6e61261a52 | ||
|
|
cd41e9713f | ||
|
|
78a51fb6e1 | ||
|
|
5a64d51e10 | ||
|
|
32738decf4 | ||
|
|
378b261aaa | ||
|
|
20f6511228 | ||
|
|
8f8b7b24c1 | ||
|
|
c9fc223310 | ||
|
|
067afcd2b3 | ||
|
|
e61ebfae25 | ||
|
|
bbceb8429c | ||
|
|
450ab705d2 | ||
|
|
e50b26e537 | ||
|
|
30f7151599 | ||
|
|
4a557f9ff8 | ||
|
|
58e822462a | ||
|
|
3ff1d47aa6 | ||
|
|
4106b73f36 | ||
|
|
0cd4679fbc |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -20,3 +20,4 @@ archivebuild
|
||||
osgbuild
|
||||
CMakeCache.txt
|
||||
*.pyc
|
||||
build-*
|
||||
|
||||
10
.gitmodules
vendored
10
.gitmodules
vendored
@@ -1,20 +1,20 @@
|
||||
[submodule "simgear"]
|
||||
path = simgear
|
||||
url = git://git.code.sf.net/p/flightgear/simgear
|
||||
url = https://git.code.sf.net/p/flightgear/simgear
|
||||
branch = next
|
||||
[submodule "flightgear"]
|
||||
path = flightgear
|
||||
url = git://git.code.sf.net/p/flightgear/flightgear
|
||||
url = https://git.code.sf.net/p/flightgear/flightgear
|
||||
branch = next
|
||||
[submodule "fgrun"]
|
||||
path = fgrun
|
||||
url = git://git.code.sf.net/p/flightgear/fgrun
|
||||
url = https://git.code.sf.net/p/flightgear/fgrun
|
||||
branch = next
|
||||
[submodule "fgdata"]
|
||||
path = fgdata
|
||||
url = git://git.code.sf.net/p/flightgear/fgdata
|
||||
url = https://git.code.sf.net/p/flightgear/fgdata
|
||||
branch = next
|
||||
[submodule "windows-3rd-party"]
|
||||
path = windows-3rd-party
|
||||
url = git://git.code.sf.net/p/flightgear/windows-3rd-party
|
||||
url = https://git.code.sf.net/p/flightgear/windows-3rd-party
|
||||
branch = master
|
||||
|
||||
745
FlightGear.iss
745
FlightGear.iss
@@ -1,379 +1,366 @@
|
||||
; Script generated by the Inno Setup Script Wizard.
|
||||
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
|
||||
;
|
||||
; This script creates an installable FlightGear package for Win32 using the
|
||||
; "Inno Setup" package builder. Inno Setup is free (but probably not open
|
||||
; source?.) The official web site for this package building software is:
|
||||
;
|
||||
; http://www.jrsoftware.org/isinfo.php
|
||||
;
|
||||
; Note: the files must appear in the X: drive.
|
||||
; You can do this with the command below:
|
||||
;
|
||||
; subst X: path_to_files
|
||||
;
|
||||
; For example:
|
||||
;
|
||||
; C:\> subst X: F:\Path\to\FlightGear\root
|
||||
; C:\> subst X: F:\
|
||||
;
|
||||
|
||||
#include "InstallConfig.iss"
|
||||
|
||||
#if GetEnv("VSINSTALLDIR") == ""
|
||||
#define VSInstallDir "C:\Program Files (x86)\Microsoft Visual Studio 10.0"
|
||||
#else
|
||||
#define VSInstallDir GetEnv("VSINSTALLDIR")
|
||||
#endif
|
||||
|
||||
#define VCInstallDir VSInstallDir + "\VC"
|
||||
#define OSGInstallDir "X:\install\msvc100\OpenSceneGraph"
|
||||
#define OSGPluginsDir OSGInstallDir + "\bin\osgPlugins-" + OSGVersion
|
||||
|
||||
#define OSG64InstallDir "X:\install\msvc100-64\OpenSceneGraph"
|
||||
#define OSG64PluginsDir OSG64InstallDir + "\bin\osgPlugins-" + OSGVersion
|
||||
|
||||
[Setup]
|
||||
AppId=FlightGear
|
||||
AppName=FlightGear
|
||||
AppPublisher=The FlightGear Team
|
||||
OutputBaseFilename=FlightGear-{#FGVersion}{#FGDetails}
|
||||
AppVerName=FlightGear v{#FGVersion}
|
||||
AppPublisherURL=http://www.flightgear.org
|
||||
AppSupportURL=http://www.flightgear.org
|
||||
AppUpdatesURL=http://www.flightgear.org
|
||||
DefaultDirName={pf}\FlightGear {#FGVersion}
|
||||
UsePreviousAppDir=no
|
||||
DefaultGroupName=FlightGear {#FGVersion}
|
||||
UsePreviousGroup=no
|
||||
LicenseFile=X:\flightgear\COPYING
|
||||
Uninstallable=yes
|
||||
SetupIconFile=X:\flightgear\package\flightgear.ico
|
||||
VersionInfoVersion={#FGVersion}.0
|
||||
InfoBeforeFile=X:\flightgear\package\windows\infobefore.txt
|
||||
WizardImageFile=X:\flightgear\package\windows\setupimg.bmp
|
||||
WizardImageStretch=No
|
||||
WizardSmallImageFile=X:\flightgear\package\windows\setupsmall.bmp
|
||||
VersionInfoCompany=The FlightGear Team
|
||||
UninstallDisplayIcon={app}\bin\fgfs.exe
|
||||
ArchitecturesInstallIn64BitMode=x64
|
||||
ArchitecturesAllowed=x86 x64
|
||||
|
||||
|
||||
[Tasks]
|
||||
; NOTE: The following entry contains English phrases ("Create a desktop icon" and "Additional icons"). You are free to translate them into another language if required.
|
||||
Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"
|
||||
Name: "insoal"; Description: "Install OpenAL (the sound engine)"
|
||||
|
||||
[Files]
|
||||
; NOTE: run subst X: F:\ (or whatever path the expanded tree resides at)
|
||||
;Source: "X:\*.txt"; DestDir: "{app}"; Flags: ignoreversion
|
||||
; 32 bits install
|
||||
Source: "X:\install\msvc100\FlightGear\bin\*"; DestDir: "{app}\bin"; Flags: ignoreversion recursesubdirs; Check: not Is64BitInstallMode
|
||||
Source: "X:\install\msvc100\FGRun\bin\fgrun.exe"; DestDir: "{app}\bin"; Flags: ignoreversion ; Check: not Is64BitInstallMode
|
||||
Source: "X:\install\msvc100\FGRun\share\locale\*"; DestDir: "{app}\bin\locale"; Flags: ignoreversion recursesubdirs; Check: not Is64BitInstallMode
|
||||
Source: "X:\3rdParty\bin\zlib.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "X:\3rdParty\bin\OpenAL32.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "X:\3rdParty\bin\libpng16.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "X:\3rdParty\bin\libintl-8.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "X:\3rdParty\bin\CrashRpt1402.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "X:\3rdParty\bin\crashrpt_lang.ini"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "X:\3rdParty\bin\CrashSender1402.exe"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#VCInstallDir}\redist\x86\Microsoft.VC100.CRT\*.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "X:\3rdParty\bin\vcredist_x86.exe"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: not Is64BitInstallMode
|
||||
|
||||
; 64 bits install
|
||||
Source: "X:\install\msvc100-64\FlightGear\bin\*"; DestDir: "{app}\bin"; Flags: ignoreversion recursesubdirs; Check: Is64BitInstallMode
|
||||
Source: "X:\install\msvc100-64\FGRun\bin\fgrun.exe"; DestDir: "{app}\bin"; Flags: ignoreversion; Check: Is64BitInstallMode
|
||||
Source: "X:\install\msvc100-64\FGRun\share\locale\*"; DestDir: "{app}\bin\locale"; Flags: ignoreversion recursesubdirs; Check: Is64BitInstallMode
|
||||
Source: "X:\3rdParty.x64\bin\zlib.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "X:\3rdParty.x64\bin\OpenAL32.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "X:\3rdParty.x64\bin\vcredist_x64.exe"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "X:\3rdParty.x64\bin\libpng16.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "X:\3rdParty.x64\bin\libintl-8.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "X:\3rdParty.x64\bin\CrashRpt1402.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "X:\3rdParty.x64\bin\crashrpt_lang.ini"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "X:\3rdParty.x64\bin\CrashSender1402.exe"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#VCInstallDir}\redist\x64\Microsoft.VC100.CRT\*.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
|
||||
; 32/64 bits install
|
||||
;NOTE: FGPanel has no 64 bits equivalent, so we are using the 32 bits binary for 32&64 bits OS
|
||||
Source: "X:\install\msvc100\FlightGear\bin\fgpanel.exe"; DestDir: "{app}\bin"; Flags: ignoreversion
|
||||
Source: "X:\3rdParty\bin\oalinst.exe"; DestDir: "{app}\bin"; Flags: ignoreversion skipifsourcedoesntexist
|
||||
|
||||
; Include the base package
|
||||
#if IncludeData == "TRUE"
|
||||
Source: "X:\fgdata\*.*"; DestDir: "{app}\data"; Flags: ignoreversion recursesubdirs skipifsourcedoesntexist
|
||||
#endif
|
||||
|
||||
; 32 bits install
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osg.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgDB.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgGA.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgParticle.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgText.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgUtil.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgViewer.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgSim.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgFX.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\ot{#OTSoNumber}-OpenThreads.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_ac.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_osga.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_3ds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_mdl.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_jpeg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_rgb.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_png.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_dds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_txf.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_tiff.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_ogr.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_gdal.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_freetype.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_serializers_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_serializers_osganimation.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_serializers_osgfx.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_serializers_osgmanipulator.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_serializers_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_serializers_osgshadow.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_serializers_osgsim.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_serializers_osgterrain.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_serializers_osgtext.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_serializers_osgvolume.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_deprecated_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_deprecated_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
|
||||
; 64 bits install
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osg.dll"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgDB.dll"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgGA.dll"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgParticle.dll"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgText.dll"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgUtil.dll"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgViewer.dll"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgSim.dll"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgFX.dll"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\ot{#OTSoNumber}-OpenThreads.dll"; DestDir: "{app}\bin"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_ac.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_osga.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_3ds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_mdl.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_jpeg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_rgb.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_png.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_dds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_txf.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_tiff.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_ogr.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_gdal.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_freetype.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_serializers_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_serializers_osganimation.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_serializers_osgfx.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_serializers_osgmanipulator.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_serializers_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_serializers_osgshadow.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_serializers_osgsim.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_serializers_osgterrain.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_serializers_osgtext.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_serializers_osgvolume.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_deprecated_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_deprecated_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
|
||||
[Dirs]
|
||||
; Make the user installable scenery directory
|
||||
Name: "{userdocs}\FlightGear\Aircraft"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\Aircraft'))
|
||||
Name: "{userdocs}\FlightGear\TerraSync"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\TerraSync'))
|
||||
Name: "{userdocs}\FlightGear\Custom Scenery"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\Custom Scenery'))
|
||||
|
||||
[Icons]
|
||||
Name: "{userdesktop}\FlightGear {#FGVersion}"; Filename: "{app}\bin\fgfs.exe"; Parameters: "--launcher"; WorkingDir: "{app}"; Tasks: desktopicon;
|
||||
Name: "{group}\FlightGear Launcher"; Filename: "{app}\bin\fgfs.exe"; Parameters: "--launcher"; WorkingDir: "{app}";
|
||||
Name: "{group}\FlightGear Manual"; Filename: "{app}\fgdata\Docs\getstart.pdf"
|
||||
Name: "{group}\FlightGear Documentation"; Filename: "{app}\fgdata\Docs\index.html"
|
||||
Name: "{group}\Flightgear Wiki"; Filename: "http://wiki.flightgear.org"
|
||||
Name: "{group}\Tools\FGRun"; Filename: "{app}\bin\fgrun.exe"; WorkingDir: "{app}";
|
||||
Name: "{group}\Tools\Install & Uninstall Scenery"; Filename: "{app}\bin\fgadmin.exe"; WorkingDir: "{app}"
|
||||
Name: "{group}\Tools\TerraSync"; Filename: "{app}\bin\terrasync.exe"; Parameters: "-S -p 5505 -d ""{userdocs}\FlightGear\TerraSync"""; WorkingDir: "{app}"
|
||||
Name: "{group}\Tools\Uninstall FlightGear"; Filename: "{uninstallexe}"
|
||||
Name: "{group}\Tools\js_demo"; Filename: "{app}\bin\js_demo.exe"
|
||||
Name: "{group}\Tools\fgjs"; Filename: "cmd"; Parameters: "/k fgjs.exe ""--fg-root={app}\fgdata"""; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\GPSsmooth"; Filename: "cmd"; Parameters: "/k ""{app}\bin\GPSsmooth.exe"" -h"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\UGsmooth"; Filename: "cmd"; Parameters: "/k ""{app}\bin\UGsmooth.exe"" -h"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\MIDGsmooth"; Filename: "cmd"; Parameters: "/k ""{app}\bin\MIDGsmooth.exe"" -h"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\metar"; Filename: "cmd"; Parameters: "/k ""{app}\bin\metar.exe"" -h"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\yasim"; Filename: "cmd"; Parameters: "/k ""{app}\bin\yasim.exe"" -h"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\fgpanel"; Filename: "cmd"; Parameters: "/k ""{app}\bin\fgpanel.exe"" -h"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\FGCom"; Filename: "{app}\bin\fgcom.exe"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\FGCom-testing"; Filename: "{app}\bin\fgcom.exe"; Parameters: "--frequency=910"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\Explore Documentation Folder"; Filename: "{app}\fgdata\Docs"
|
||||
|
||||
[Run]
|
||||
filename: "cmd.exe"; WorkingDir: "{app}\bin"; Parameters: "/C del msvc*.dll"; Check: FileExists(ExpandConstant('{app}\bin\vcredist_x86.exe'))
|
||||
filename: "cmd.exe"; WorkingDir: "{app}\bin"; Parameters: "/C del msvc*.dll"; Check: FileExists(ExpandConstant('{app}\bin\vcredist_x64.exe'))
|
||||
filename: "{app}\bin\vcredist_x86.exe"; WorkingDir: "{app}\bin"; Parameters: "/passive /norestart"; Description: "Installing MS Visual C++ runtime components"; Check: FileExists(ExpandConstant('{app}\bin\vcredist_x86.exe'))
|
||||
filename: "{app}\bin\vcredist_x64.exe"; WorkingDir: "{app}\bin"; Parameters: "/passive /norestart"; Description: "Installing MS Visual C++ runtime components"; Check: Is64BitInstallMode and FileExists(ExpandConstant('{app}\bin\vcredist_x64.exe'))
|
||||
filename: "{app}\bin\oalinst.exe"; WorkingDir: "{app}\bin"; Description: "Installing OpenAL"; Check: IsTaskSelected('insoal') and FileExists(ExpandConstant('{app}\bin\oalinst.exe'))
|
||||
; Put installation directory into the fgrun.prefs
|
||||
filename: "{app}\bin\fgrun.exe"; WorkingDir: "{app}\bin"; Parameters: "--silent ""--fg-exe={app}\bin\fgfs.exe"" ""--fg-root={app}\fgdata"" ""--fg-scenery={userdocs}\FlightGear\Custom Scenery;{app}\fgdata\Scenery;{userdocs}\FlightGear\TerraSync"" ""--fg-aircraft={userdocs}\FlightGear\Aircraft"" ""--terrasync-dir={userdocs}\FlightGear\TerraSync"" --version={#FGVersion}"
|
||||
; Put installation and source directories into the fgadmin.prefs
|
||||
filename: "{app}\bin\fgadmin.exe"; WorkingDir: "{app}\bin"; Parameters: "--silent ""--install-source={src}\..\Scenery"" ""--scenery-dest={userdocs}\FlightGear\Custom Scenery"""
|
||||
|
||||
[Code]
|
||||
const
|
||||
NET_FW_SCOPE_ALL = 0;
|
||||
NET_FW_IP_VERSION_ANY = 2;
|
||||
NET_FW_ACTION_ALLOW = 1;
|
||||
NET_FW_RULE_DIR_ALL = 0;
|
||||
NET_FW_RULE_DIR_IN = 1;
|
||||
NET_FW_RULE_DIR_OUT = 2;
|
||||
NET_FW_IP_PROTOCOL_ALL = 0;
|
||||
NET_FW_IP_PROTOCOL_TCP = 6;
|
||||
NET_FW_IP_PROTOCOL_UDP = 17;
|
||||
NET_FW_PROFILE2_DOMAIN = 1;
|
||||
NET_FW_PROFILE2_PRIVATE = 2;
|
||||
NET_FW_PROFILE2_PUBLIC = 4;
|
||||
|
||||
procedure URLLabelOnClick(Sender: TObject);
|
||||
var
|
||||
ErrorCode: Integer;
|
||||
begin
|
||||
ShellExec('open', 'http://www.flightgear.org', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
|
||||
end;
|
||||
|
||||
procedure CreateURLLabel(ParentForm: TSetupForm; CancelButton: TNewButton);
|
||||
var
|
||||
URLLabel: TNewStaticText;
|
||||
begin
|
||||
URLLabel := TNewStaticText.Create(ParentForm);
|
||||
URLLabel.Caption := 'www.flightgear.org';
|
||||
URLLabel.Cursor := crHand;
|
||||
URLLabel.OnClick := @URLLabelOnClick;
|
||||
URLLabel.Parent := ParentForm;
|
||||
{ Alter Font *after* setting Parent so the correct defaults are inherited first }
|
||||
URLLabel.Font.Style := URLLabel.Font.Style + [fsUnderline];
|
||||
URLLabel.Font.Color := clBlue;
|
||||
URLLabel.Top := CancelButton.Top + CancelButton.Height - URLLabel.Height - 2;
|
||||
URLLabel.Left := ScaleX(20);
|
||||
end;
|
||||
|
||||
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
|
||||
var
|
||||
S: String;
|
||||
begin
|
||||
S := '';
|
||||
S := S + MemoDirInfo + NewLine + NewLine;
|
||||
S := S + MemoGroupInfo + NewLine + NewLine;
|
||||
S := S + MemoTasksInfo + NewLine + NewLine;
|
||||
|
||||
Result := S;
|
||||
end;
|
||||
|
||||
procedure AddBasicFirewallException(AppName, FileName: String);
|
||||
var
|
||||
FirewallObject: variant;
|
||||
RuleObject: variant;
|
||||
begin
|
||||
try
|
||||
FirewallObject := CreateOleObject('HNetCfg.FwMgr');
|
||||
RuleObject := CreateOleObject('HNetCfg.FwAuthorizedApplication');
|
||||
RuleObject.ProcessImageFileName := FileName;
|
||||
RuleObject.Name := AppName;
|
||||
RuleObject.Scope := NET_FW_SCOPE_ALL;
|
||||
RuleObject.IpVersion := NET_FW_IP_VERSION_ANY;
|
||||
RuleObject.Enabled := true;
|
||||
FirewallObject.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(RuleObject);
|
||||
except
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure AddAdvancedFirewallException(AppName, AppDescription, FileName: String; Protocol: Integer; LocalPorts, RemotePorts: String; Direction: Integer);
|
||||
var
|
||||
FirewallObject: variant;
|
||||
RuleObject: variant;
|
||||
begin
|
||||
try
|
||||
FirewallObject := CreateOleObject('HNetCfg.FwPolicy2');
|
||||
RuleObject := CreateOleObject('HNetCfg.FWRule');
|
||||
RuleObject.Name := AppName;
|
||||
RuleObject.Description := AppDescription;
|
||||
RuleObject.ApplicationName := FileName;
|
||||
if (Protocol <> NET_FW_IP_PROTOCOL_ALL) then
|
||||
RuleObject.Protocol := Protocol;
|
||||
if (LocalPorts <> '') then
|
||||
RuleObject.LocalPorts := LocalPorts;
|
||||
if (RemotePorts <> '') then
|
||||
RuleObject.RemotePorts := RemotePorts;
|
||||
if (Direction <> NET_FW_RULE_DIR_ALL) then
|
||||
RuleObject.Direction := Direction;
|
||||
RuleObject.Enabled := true;
|
||||
RuleObject.Grouping := 'FlightGear';
|
||||
RuleObject.Profiles := NET_FW_PROFILE2_DOMAIN + NET_FW_PROFILE2_PRIVATE + NET_FW_PROFILE2_PUBLIC;
|
||||
RuleObject.Action := NET_FW_ACTION_ALLOW;
|
||||
RuleObject.RemoteAddresses := '*';
|
||||
FirewallObject.Rules.Add(RuleObject);
|
||||
except
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure RemoveFirewallException(AppName, FileName: String);
|
||||
var
|
||||
FirewallObject: variant;
|
||||
Version: TWindowsVersion;
|
||||
begin
|
||||
GetWindowsVersionEx(Version);
|
||||
try
|
||||
if (Version.Major >= 6) then
|
||||
begin
|
||||
FirewallObject := CreateOleObject('HNetCfg.FwPolicy2');
|
||||
FirewallObject.Rules.Remove(AppName);
|
||||
end
|
||||
else if (Version.Major = 5) and (((Version.Minor = 1) and (Version.ServicePackMajor >= 2)) or ((Version.Minor = 2) and (Version.ServicePackMajor >= 1))) then
|
||||
begin
|
||||
FirewallObject := CreateOleObject('HNetCfg.FwMgr');
|
||||
FirewallObject.LocalPolicy.CurrentProfile.AuthorizedApplications.Remove(FileName);
|
||||
end;
|
||||
except
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure CurStepChanged(CurStep: TSetupStep);
|
||||
var
|
||||
Version: TWindowsVersion;
|
||||
begin
|
||||
if CurStep = ssPostInstall then
|
||||
begin
|
||||
GetWindowsVersionEx(Version);
|
||||
if (Version.Major >= 6) then
|
||||
begin
|
||||
{ IN and OUT rules must be specified separately, otherwise the firewall will create only the IN rule }
|
||||
AddAdvancedFirewallException('FlightGear', 'Allows FlightGear to send and receive data over the multiplayer network and to get METARs.', ExpandConstant('{app}') + '\bin\fgfs.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_IN);
|
||||
AddAdvancedFirewallException('FlightGear', 'Allows FlightGear to send and receive data over the multiplayer network and to get METARs.', ExpandConstant('{app}') + '\bin\fgfs.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_OUT);
|
||||
AddAdvancedFirewallException('FlightGear METAR Utility', 'Allows the FlightGear METAR utility to receive METARs.', ExpandConstant('{app}') + '\bin\metar.exe', NET_FW_IP_PROTOCOL_TCP, '', '80', NET_FW_RULE_DIR_OUT);
|
||||
AddAdvancedFirewallException('FlightGear TerraSync', 'Allows TerraSync to download additional scenery while FlightGear is running.', ExpandConstant('{app}') + '\bin\terrasync.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_IN);
|
||||
AddAdvancedFirewallException('FlightGear TerraSync', 'Allows TerraSync to download additional scenery while FlightGear is running.', ExpandConstant('{app}') + '\bin\terrasync.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_OUT);
|
||||
AddAdvancedFirewallException('FlightGear FGCom', 'Allows FGCom to establish a connection to FlightGear and the VoIP server for voice ATC communication.', ExpandConstant('{app}') + '\bin\fgcom.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_IN);
|
||||
AddAdvancedFirewallException('FlightGear FGCom', 'Allows FGCom to establish a connection to FlightGear and the VoIP server for voice ATC communication.', ExpandConstant('{app}') + '\bin\fgcom.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_OUT);
|
||||
end
|
||||
else if (Version.Major = 5) and (((Version.Minor = 1) and (Version.ServicePackMajor >= 2)) or ((Version.Minor = 2) and (Version.ServicePackMajor >= 1))) then
|
||||
begin
|
||||
{ The Windows XP/Server 2003 firewall does not block outgoing connections at all, so only listening processes should be added }
|
||||
AddBasicFirewallException('FlightGear', ExpandConstant('{app}') + '\bin\fgfs.exe');
|
||||
AddBasicFirewallException('FlightGear TerraSync', ExpandConstant('{app}') + '\bin\terrasync.exe');
|
||||
AddBasicFirewallException('FlightGear FGCom', ExpandConstant('{app}') + '\bin\fgcom.exe');
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
|
||||
begin
|
||||
if CurUninstallStep = usPostUninstall then
|
||||
begin
|
||||
RemoveFirewallException('FlightGear', ExpandConstant('{app}') + '\bin\fgfs.exe');
|
||||
RemoveFirewallException('FlightGear METAR Utility', ExpandConstant('{app}') + '\bin\metar.exe');
|
||||
RemoveFirewallException('FlightGear TerraSync', ExpandConstant('{app}') + '\bin\terrasync.exe');
|
||||
RemoveFirewallException('FlightGear FGCom', ExpandConstant('{app}') + '\bin\fgcom.exe');
|
||||
end;
|
||||
end;
|
||||
; Script generated by the Inno Setup Script Wizard.
|
||||
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
|
||||
;
|
||||
; This script creates an installable FlightGear package for Win32 using the
|
||||
; "Inno Setup" package builder. Inno Setup is free (but probably not open
|
||||
; source?.) The official web site for this package building software is:
|
||||
;
|
||||
; http://www.jrsoftware.org/isinfo.php
|
||||
;
|
||||
; Note: the files must appear in the X: drive.
|
||||
; You can do this with the command below:
|
||||
;
|
||||
; subst X: path_to_files
|
||||
;
|
||||
; For example:
|
||||
;
|
||||
; C:\> subst X: F:\Path\to\FlightGear\root
|
||||
; C:\> subst X: F:\
|
||||
;
|
||||
|
||||
#include "InstallConfig.iss"
|
||||
|
||||
#if GetEnv("VSINSTALLDIR") == ""
|
||||
#define VSInstallDir "C:\Program Files (x86)\Microsoft Visual Studio 14.0"
|
||||
#else
|
||||
#define VSInstallDir GetEnv("VSINSTALLDIR")
|
||||
#endif
|
||||
|
||||
#define VCInstallDir VSInstallDir + "\VC"
|
||||
#define InstallDir32 "X:\install\msvc140"
|
||||
#define OSGInstallDir InstallDir32 + "\OpenSceneGraph"
|
||||
#define OSGPluginsDir OSGInstallDir + "\bin\osgPlugins-" + OSGVersion
|
||||
|
||||
#define InstallDir64 "X:\install\msvc140-64"
|
||||
#define OSG64InstallDir InstallDir64 + "\OpenSceneGraph"
|
||||
#define OSG64PluginsDir OSG64InstallDir + "\bin\osgPlugins-" + OSGVersion
|
||||
|
||||
#define ThirdPartyDir "X:\windows-3rd-party\msvc140"
|
||||
|
||||
; we copy everything in install/<arch>/bin except these, which aren't
|
||||
; useful to the end-user to ship
|
||||
#define ExcludedBinaries "*smooth.exe,metar.exe,js_demo.exe"
|
||||
|
||||
[Setup]
|
||||
AppId=FlightGear
|
||||
AppName=FlightGear
|
||||
AppPublisher=The FlightGear Team
|
||||
OutputBaseFilename=FlightGear-{#FGVersion}{#FGDetails}
|
||||
AppVerName=FlightGear v{#FGVersion}
|
||||
AppPublisherURL=http://www.flightgear.org
|
||||
AppSupportURL=http://www.flightgear.org
|
||||
AppUpdatesURL=http://www.flightgear.org
|
||||
DefaultDirName={pf}\FlightGear {#FGVersion}
|
||||
UsePreviousAppDir=no
|
||||
DefaultGroupName=FlightGear {#FGVersion}
|
||||
UsePreviousGroup=no
|
||||
LicenseFile=X:\flightgear\COPYING
|
||||
Uninstallable=yes
|
||||
SetupIconFile=X:\flightgear\package\flightgear.ico
|
||||
VersionInfoVersion={#FGVersion}.0
|
||||
InfoBeforeFile=X:\flightgear\package\windows\infobefore.txt
|
||||
WizardImageFile=X:\flightgear\package\windows\setupimg.bmp
|
||||
WizardImageStretch=No
|
||||
WizardSmallImageFile=X:\flightgear\package\windows\setupsmall.bmp
|
||||
VersionInfoCompany=The FlightGear Team
|
||||
UninstallDisplayIcon={app}\bin\fgfs.exe
|
||||
ArchitecturesInstallIn64BitMode=x64
|
||||
ArchitecturesAllowed=x86 x64
|
||||
|
||||
; Sign tool must be defined in the Inno Setup GUI, to avoid
|
||||
; exposing the certificate password
|
||||
; SignTool=fg_code_sign1
|
||||
|
||||
[Tasks]
|
||||
; NOTE: The following entry contains English phrases ("Create a desktop icon" and "Additional icons"). You are free to translate them into another language if required.
|
||||
Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"
|
||||
|
||||
[Files]
|
||||
; NOTE: run subst X: F:\ (or whatever path the expanded tree resides at)
|
||||
;Source: "X:\*.txt"; DestDir: "{app}"; Flags: ignoreversion
|
||||
; 32 bits install
|
||||
|
||||
Source: "{#InstallDir32}\bin\*.*"; DestDir: "{app}\bin"; Excludes: "{#ExcludedBinaries}"; Flags: ignoreversion recursesubdirs; Check: not Is64BitInstallMode
|
||||
;locale only exists for fgrun - which has been disabled
|
||||
;Source: "{#InstallDir32}\share\locale\*"; DestDir: "{app}\bin\locale"; Flags: ignoreversion recursesubdirs; Check: not Is64BitInstallMode
|
||||
|
||||
Source: "{#ThirdPartyDir}\3rdParty\bin\zlib.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty\bin\OpenAL32.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty\bin\libpng.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty\bin\libcurl.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty\bin\libintl-8.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty\bin\CrashRpt1403.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty\bin\crashrpt_lang.ini"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty\bin\CrashSender1403.exe"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#VCInstallDir}\redist\x86\Microsoft.VC140.CRT\*.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
|
||||
; 64 bits install
|
||||
Source: "{#InstallDir64}\bin\*.*"; DestDir: "{app}\bin"; Excludes: "{#ExcludedBinaries}"; Flags: ignoreversion recursesubdirs; Check: Is64BitInstallMode
|
||||
;locale only exists for fgrun - which has been disabled
|
||||
;Source: "{#InstallDir64}\share\locale\*"; DestDir: "{app}\bin\locale"; Flags: ignoreversion recursesubdirs; Check: Is64BitInstallMode
|
||||
|
||||
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\zlib.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\OpenAL32.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\libpng.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\libcurl.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\libintl-8.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\CrashRpt1403.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\crashrpt_lang.ini"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\CrashSender1403.exe"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#VCInstallDir}\redist\x64\Microsoft.VC140.CRT\*.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
|
||||
; 32/64 bits install
|
||||
;NOTE: FGPanel has no 64 bits equivalent, so we are using the 32 bits binary for 32&64 bits OS
|
||||
Source: "{#InstallDir32}\bin\fgpanel.exe"; DestDir: "{app}\bin"; Flags: ignoreversion
|
||||
|
||||
; Include the base package
|
||||
#if IncludeData == "TRUE"
|
||||
Source: "X:\fgdata\*.*"; DestDir: "{app}\data"; Flags: ignoreversion recursesubdirs skipifsourcedoesntexist
|
||||
#endif
|
||||
|
||||
; 32 bits install
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osg.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgDB.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgGA.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgParticle.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgText.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgUtil.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgViewer.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgSim.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgFX.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGInstallDir}\bin\ot{#OTSoNumber}-OpenThreads.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
|
||||
|
||||
Source: "{#OSGPluginsDir}\osgdb_ac.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_osga.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_3ds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_mdl.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_jpeg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_rgb.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_png.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_dds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_txf.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_tiff.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
Source: "{#OSGPluginsDir}\osgdb_freetype.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
|
||||
;Source: "{#OSGPluginsDir}\osgdb_serializers_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
;Source: "{#OSGPluginsDir}\osgdb_serializers_osganimation.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgfx.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgmanipulator.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgshadow.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgsim.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgterrain.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgtext.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgvolume.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
;Source: "{#OSGPluginsDir}\osgdb_deprecated_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
;Source: "{#OSGPluginsDir}\osgdb_deprecated_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
|
||||
|
||||
; 64 bits install
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osg.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgDB.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgGA.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgParticle.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgText.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgUtil.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgViewer.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgSim.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgFX.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64InstallDir}\bin\ot{#OTSoNumber}-OpenThreads.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
||||
|
||||
Source: "{#OSG64PluginsDir}\osgdb_ac.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_osga.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_3ds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_mdl.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_jpeg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_rgb.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_png.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_dds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_txf.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_tiff.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
Source: "{#OSG64PluginsDir}\osgdb_freetype.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osganimation.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgfx.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgmanipulator.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgshadow.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgsim.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgterrain.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgtext.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgvolume.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_deprecated_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
;Source: "{#OSG64PluginsDir}\osgdb_deprecated_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
|
||||
|
||||
[Dirs]
|
||||
; Make the user installable scenery directory
|
||||
Name: "{userdocs}\FlightGear\Aircraft"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\Aircraft'))
|
||||
Name: "{userdocs}\FlightGear\TerraSync"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\TerraSync'))
|
||||
Name: "{userdocs}\FlightGear\Custom Scenery"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\Custom Scenery'))
|
||||
|
||||
[Icons]
|
||||
Name: "{userdesktop}\FlightGear {#FGVersion}"; Filename: "{app}\bin\fgfs.exe"; Parameters: "--launcher"; WorkingDir: "{app}\bin"; Tasks: desktopicon;
|
||||
Name: "{group}\FlightGear"; Filename: "{app}\bin\fgfs.exe"; Parameters: "--launcher"; WorkingDir: "{app}\bin";
|
||||
Name: "{group}\FlightGear Manual"; Filename: "{app}\data\Docs\getstart.pdf"
|
||||
Name: "{group}\FlightGear Documentation"; Filename: "{app}\data\Docs\index.html"
|
||||
Name: "{group}\Flightgear Wiki"; Filename: "http://wiki.flightgear.org"
|
||||
Name: "{group}\Tools\Uninstall FlightGear"; Filename: "{uninstallexe}"
|
||||
Name: "{group}\Tools\fgjs"; Filename: "cmd"; Parameters: "/k fgjs.exe ""--fg-root={app}\data"""; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\yasim"; Filename: "cmd"; Parameters: "/k ""{app}\bin\yasim.exe"" -h"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\fgpanel"; Filename: "cmd"; Parameters: "/k ""{app}\bin\fgpanel.exe"" -h"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\FGCom"; Filename: "{app}\bin\fgcom.exe"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\FGCom-testing"; Filename: "{app}\bin\fgcom.exe"; Parameters: "--frequency=910"; WorkingDir: "{app}\bin"
|
||||
Name: "{group}\Tools\Explore Documentation Folder"; Filename: "{app}\data\Docs"
|
||||
|
||||
[Code]
|
||||
const
|
||||
NET_FW_SCOPE_ALL = 0;
|
||||
NET_FW_IP_VERSION_ANY = 2;
|
||||
NET_FW_ACTION_ALLOW = 1;
|
||||
NET_FW_RULE_DIR_ALL = 0;
|
||||
NET_FW_RULE_DIR_IN = 1;
|
||||
NET_FW_RULE_DIR_OUT = 2;
|
||||
NET_FW_IP_PROTOCOL_ALL = 0;
|
||||
NET_FW_IP_PROTOCOL_TCP = 6;
|
||||
NET_FW_IP_PROTOCOL_UDP = 17;
|
||||
NET_FW_PROFILE2_DOMAIN = 1;
|
||||
NET_FW_PROFILE2_PRIVATE = 2;
|
||||
NET_FW_PROFILE2_PUBLIC = 4;
|
||||
|
||||
procedure URLLabelOnClick(Sender: TObject);
|
||||
var
|
||||
ErrorCode: Integer;
|
||||
begin
|
||||
ShellExec('open', 'http://www.flightgear.org', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
|
||||
end;
|
||||
|
||||
procedure CreateURLLabel(ParentForm: TSetupForm; CancelButton: TNewButton);
|
||||
var
|
||||
URLLabel: TNewStaticText;
|
||||
begin
|
||||
URLLabel := TNewStaticText.Create(ParentForm);
|
||||
URLLabel.Caption := 'www.flightgear.org';
|
||||
URLLabel.Cursor := crHand;
|
||||
URLLabel.OnClick := @URLLabelOnClick;
|
||||
URLLabel.Parent := ParentForm;
|
||||
{ Alter Font *after* setting Parent so the correct defaults are inherited first }
|
||||
URLLabel.Font.Style := URLLabel.Font.Style + [fsUnderline];
|
||||
URLLabel.Font.Color := clBlue;
|
||||
URLLabel.Top := CancelButton.Top + CancelButton.Height - URLLabel.Height - 2;
|
||||
URLLabel.Left := ScaleX(20);
|
||||
end;
|
||||
|
||||
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
|
||||
var
|
||||
S: String;
|
||||
begin
|
||||
S := '';
|
||||
S := S + MemoDirInfo + NewLine + NewLine;
|
||||
S := S + MemoGroupInfo + NewLine + NewLine;
|
||||
S := S + MemoTasksInfo + NewLine + NewLine;
|
||||
|
||||
Result := S;
|
||||
end;
|
||||
|
||||
procedure AddBasicFirewallException(AppName, FileName: String);
|
||||
var
|
||||
FirewallObject: variant;
|
||||
RuleObject: variant;
|
||||
begin
|
||||
try
|
||||
FirewallObject := CreateOleObject('HNetCfg.FwMgr');
|
||||
RuleObject := CreateOleObject('HNetCfg.FwAuthorizedApplication');
|
||||
RuleObject.ProcessImageFileName := FileName;
|
||||
RuleObject.Name := AppName;
|
||||
RuleObject.Scope := NET_FW_SCOPE_ALL;
|
||||
RuleObject.IpVersion := NET_FW_IP_VERSION_ANY;
|
||||
RuleObject.Enabled := true;
|
||||
FirewallObject.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(RuleObject);
|
||||
except
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure AddAdvancedFirewallException(AppName, AppDescription, FileName: String; Protocol: Integer; LocalPorts, RemotePorts: String; Direction: Integer);
|
||||
var
|
||||
FirewallObject: variant;
|
||||
RuleObject: variant;
|
||||
begin
|
||||
try
|
||||
FirewallObject := CreateOleObject('HNetCfg.FwPolicy2');
|
||||
RuleObject := CreateOleObject('HNetCfg.FWRule');
|
||||
RuleObject.Name := AppName;
|
||||
RuleObject.Description := AppDescription;
|
||||
RuleObject.ApplicationName := FileName;
|
||||
if (Protocol <> NET_FW_IP_PROTOCOL_ALL) then
|
||||
RuleObject.Protocol := Protocol;
|
||||
if (LocalPorts <> '') then
|
||||
RuleObject.LocalPorts := LocalPorts;
|
||||
if (RemotePorts <> '') then
|
||||
RuleObject.RemotePorts := RemotePorts;
|
||||
if (Direction <> NET_FW_RULE_DIR_ALL) then
|
||||
RuleObject.Direction := Direction;
|
||||
RuleObject.Enabled := true;
|
||||
RuleObject.Grouping := 'FlightGear';
|
||||
RuleObject.Profiles := NET_FW_PROFILE2_DOMAIN + NET_FW_PROFILE2_PRIVATE + NET_FW_PROFILE2_PUBLIC;
|
||||
RuleObject.Action := NET_FW_ACTION_ALLOW;
|
||||
RuleObject.RemoteAddresses := '*';
|
||||
FirewallObject.Rules.Add(RuleObject);
|
||||
except
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure RemoveFirewallException(AppName, FileName: String);
|
||||
var
|
||||
FirewallObject: variant;
|
||||
Version: TWindowsVersion;
|
||||
begin
|
||||
GetWindowsVersionEx(Version);
|
||||
try
|
||||
if (Version.Major >= 6) then
|
||||
begin
|
||||
FirewallObject := CreateOleObject('HNetCfg.FwPolicy2');
|
||||
FirewallObject.Rules.Remove(AppName);
|
||||
end
|
||||
else if (Version.Major = 5) and (((Version.Minor = 1) and (Version.ServicePackMajor >= 2)) or ((Version.Minor = 2) and (Version.ServicePackMajor >= 1))) then
|
||||
begin
|
||||
FirewallObject := CreateOleObject('HNetCfg.FwMgr');
|
||||
FirewallObject.LocalPolicy.CurrentProfile.AuthorizedApplications.Remove(FileName);
|
||||
end;
|
||||
except
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure CurStepChanged(CurStep: TSetupStep);
|
||||
var
|
||||
Version: TWindowsVersion;
|
||||
begin
|
||||
if CurStep = ssPostInstall then
|
||||
begin
|
||||
GetWindowsVersionEx(Version);
|
||||
if (Version.Major >= 6) then
|
||||
begin
|
||||
{ IN and OUT rules must be specified separately, otherwise the firewall will create only the IN rule }
|
||||
AddAdvancedFirewallException('FlightGear', 'Allows FlightGear to send and receive data over the multiplayer network and to get METARs.', ExpandConstant('{app}') + '\bin\fgfs.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_IN);
|
||||
AddAdvancedFirewallException('FlightGear', 'Allows FlightGear to send and receive data over the multiplayer network and to get METARs.', ExpandConstant('{app}') + '\bin\fgfs.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_OUT);
|
||||
AddAdvancedFirewallException('FlightGear FGCom', 'Allows FGCom to establish a connection to FlightGear and the VoIP server for voice ATC communication.', ExpandConstant('{app}') + '\bin\fgcom.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_IN);
|
||||
AddAdvancedFirewallException('FlightGear FGCom', 'Allows FGCom to establish a connection to FlightGear and the VoIP server for voice ATC communication.', ExpandConstant('{app}') + '\bin\fgcom.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_OUT);
|
||||
end
|
||||
else if (Version.Major = 5) and (((Version.Minor = 1) and (Version.ServicePackMajor >= 2)) or ((Version.Minor = 2) and (Version.ServicePackMajor >= 1))) then
|
||||
begin
|
||||
{ The Windows XP/Server 2003 firewall does not block outgoing connections at all, so only listening processes should be added }
|
||||
AddBasicFirewallException('FlightGear', ExpandConstant('{app}') + '\bin\fgfs.exe');
|
||||
AddBasicFirewallException('FlightGear FGCom', ExpandConstant('{app}') + '\bin\fgcom.exe');
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
|
||||
begin
|
||||
if CurUninstallStep = usPostUninstall then
|
||||
begin
|
||||
RemoveFirewallException('FlightGear', ExpandConstant('{app}') + '\bin\fgfs.exe');
|
||||
RemoveFirewallException('FlightGear FGCom', ExpandConstant('{app}') + '\bin\fgcom.exe');
|
||||
end;
|
||||
end;
|
||||
|
||||
339
Nasa2FGearthview/LICENSE
Normal file
339
Nasa2FGearthview/LICENSE
Normal file
@@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
{description}
|
||||
Copyright (C) {year} {fullname}
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
{signature of Ty Coon}, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
167
Nasa2FGearthview/README.md
Normal file
167
Nasa2FGearthview/README.md
Normal file
@@ -0,0 +1,167 @@
|
||||
# Nasa2FGearthview
|
||||
A bash-script to convert NASA satellite images to ready-to-use
|
||||
textures for FG's EarthView using ImageMagick.
|
||||
|
||||
For info about FGearthview, see the forum thread:
|
||||
https://forum.flightgear.org/viewtopic.php?f=6&t=15754
|
||||
or this FG-wiki-page:
|
||||
http://wiki.flightgear.org/Earthview
|
||||
|
||||
|
||||
------------------------------------
|
||||
About:
|
||||
|
||||
This script runs on Linux (maybe Mac also?) in a Bash
|
||||
(Bourne Again Shell) - Windows is not supported (by the nature of the
|
||||
script). Maybe it works on windows as well, I don't know, feel free
|
||||
to try, and please let me know! :)
|
||||
|
||||
This will download the raw images from http://visibleearth.nasa.gov -
|
||||
their server is not very fast, so I provide an alternative download
|
||||
location: https://musicchris.de/download/FG/EarthView/raw-data-NASA.7z
|
||||
This one is much quicker! If you really want the images directly from
|
||||
NASA, then provide "nasa" to the script (see below)
|
||||
|
||||
In the end you will have 8 world-textures in .png and .dds format.
|
||||
Generally .dds is better in performance, but it won't work on some
|
||||
graphics cards. If this is the case for you, then try the .png files.
|
||||
For further information see:
|
||||
http://wiki.flightgear.org/index.php?title=DDS_Textures_in_FlightGear&redirect=no
|
||||
|
||||
If you also converted the clouds, then you'll also find 8 cloud-
|
||||
textures in the format .png. Because the .dds-format has trouble with
|
||||
rendering heavy alpha images, which is because of it's compression
|
||||
algorythm [1], I think it's useless to also build faulty files.
|
||||
However, this is not entirely true! It is possible to switch off the
|
||||
.dds/DXT compression. But this results in huge files and is rather
|
||||
heavy on the GPU's RAM.
|
||||
|
||||
Buckaroo has created a nice overview on dds-compression:
|
||||
[1] http://www.buckarooshangar.com/flightgear/tut_dds.html
|
||||
|
||||
------------------------------------
|
||||
Installation and usage:
|
||||
|
||||
Simply copy "convert.sh" into a folder of your liking and run it:
|
||||
|
||||
$ ./convert.sh
|
||||
|
||||
This will show a help text, since you didn't specify any target(s).
|
||||
Possible targets are:
|
||||
* world
|
||||
* clouds
|
||||
* all
|
||||
|
||||
Additionally, there are some options you could specify (further
|
||||
explained below):
|
||||
* 1k | 2k | 4k | 8k | 16k
|
||||
* nasa
|
||||
* no-download
|
||||
* cleanup
|
||||
* rebuild
|
||||
* check
|
||||
|
||||
So your call could look sth like this:
|
||||
|
||||
$ ./convert.sh world no-download cleanup 8k
|
||||
|
||||
|
||||
------------------------------------
|
||||
Requirements:
|
||||
|
||||
WARNING!
|
||||
|
||||
This script uses a *lot* disk space! Make sure you have at least 90GB
|
||||
available!
|
||||
|
||||
Also, this script will run for a *very long* time! It might be best to
|
||||
let it run over night - your computer might become unresponsive from
|
||||
time to time, due to the heavy CPU and memory load, which tends to
|
||||
occur, when converting 54000x27000 images. ;-)
|
||||
I also recommend to deactivate swapping!
|
||||
$ sudo swapoff -a
|
||||
To reactivate swapping do:
|
||||
$ sudo swapon -a
|
||||
|
||||
This script relies on wget and imagemagick. Both are easily installed
|
||||
by your systems package-management-system.
|
||||
(On Debian/Ubuntu this is "apt-get")
|
||||
|
||||
So, on Debian for instance, you only need to put the following into
|
||||
the console:
|
||||
|
||||
$ sudo apt-get install wget imagemagick
|
||||
|
||||
Depending on your distro, the package names might differ slightly! Use
|
||||
a search engine of your choice to find out, how the packages are named
|
||||
in your distro!
|
||||
|
||||
You may want to check:
|
||||
|
||||
$ apt search imagemagick
|
||||
|
||||
|
||||
------------------------------------
|
||||
Targets:
|
||||
|
||||
world
|
||||
Generates the world tiles, needed to run FG with EarthView.
|
||||
You will find the results in output/[$resolution]/*. Copy
|
||||
these into $FGDATA/Models/Astro/*. More about the installation
|
||||
of these textures can be found here:
|
||||
http://wiki.flightgear.org/Earthview#Customization
|
||||
|
||||
clouds
|
||||
Generates the cloud tiles, needed to run FG with EarthView.
|
||||
The locations are the same as the other textures mentioned
|
||||
above. Note that clouds are only available with up to 8k
|
||||
resolution, due to the available data at NASA.
|
||||
|
||||
all
|
||||
Converts everything needed for a full-blown earthview texture
|
||||
set. Does the same as:
|
||||
$ ./convert.sh world clouds
|
||||
|
||||
|
||||
Options:
|
||||
|
||||
1k | 2k | 4k | 8k | 16k
|
||||
Lets you specify a desired resolution of the textures.
|
||||
Possible values are 1k, 2k, 4k, 8k and 16k. If nothing is
|
||||
specified, the script will generate all of the resolutions.
|
||||
16k is only available for earth textures.
|
||||
|
||||
nasa
|
||||
Causes the script to download directly from
|
||||
http://visibleearth.nasa.gov . If omitted the script will
|
||||
download from
|
||||
https://musicchris.de/download/FG/EarthView/raw-data-NASA.7z
|
||||
which is much faster!
|
||||
Uses wget either way.
|
||||
|
||||
no-download
|
||||
Causes the script to skip the download function. If you
|
||||
already have the source images, then you don't need to
|
||||
re-download them. (About 2.4GB!)
|
||||
If omitted, the script will download the source images from
|
||||
https://musicchris.de/download/FG/EarthView/raw-data-NASA.7z
|
||||
|
||||
cleanup
|
||||
Deletes the temporary files created during texture generation.
|
||||
These can be found in tmp/
|
||||
Note: if for some reason you later want some other resolution,
|
||||
then it's good to have the data there. So only do this, when
|
||||
you're quite sure that you're done.
|
||||
Frees up a lot of disk-space! Which would have to be
|
||||
regenerated if needed again.
|
||||
|
||||
rebuild
|
||||
Deletes only the temporary files of the given target. So if
|
||||
you call './convert.sh rebuild world' the script will delete
|
||||
all corresponding temp-files of the target world, which will
|
||||
trigger a complete regeneration of the relevant (instead of
|
||||
skipping existing files)
|
||||
|
||||
check
|
||||
Creates mosaics of the tiles, so you can look at them and see
|
||||
if all went well.
|
||||
1403
Nasa2FGearthview/convert.sh
Executable file
1403
Nasa2FGearthview/convert.sh
Executable file
File diff suppressed because it is too large
Load Diff
@@ -19,7 +19,7 @@ rm -rf dist/*
|
||||
#####################################################################################
|
||||
echo "Starting on SimGear"
|
||||
cd sgBuild
|
||||
cmake -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DSIMGEAR_SHARED:BOOL="ON" ../simgear
|
||||
cmake -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DENABLE_DNS:BOOL="ON" -DSIMGEAR_SHARED:BOOL="ON" ../simgear
|
||||
|
||||
# compile
|
||||
make
|
||||
|
||||
@@ -1,76 +1,62 @@
|
||||
|
||||
IF NOT DEFINED WORKSPACE SET WORKSPACE=%~dp0
|
||||
|
||||
REM following are for testing the script locally
|
||||
REM SET PATH=%PATH%;%ProgramFiles%\CMake\bin;%ProgramFiles(x86)%\"Inno Setup 5"\
|
||||
REM SET QT5SDK32=C:\Qt\5.6\msvc2015
|
||||
REM SET QT5SDK64=C:\Qt\5.6\msvc2015_64
|
||||
REM SET IS_NIGHTLY_BUILD=1
|
||||
|
||||
SET OSG32=%WORKSPACE%\install\msvc140\OpenSceneGraph
|
||||
SET OSG64=%WORKSPACE%\install\msvc140-64\OpenSceneGraph
|
||||
|
||||
REM 32bits
|
||||
md build-sg32
|
||||
md build-fg32
|
||||
md build-fgrun32
|
||||
cd build-sg32
|
||||
cmake ..\simgear -G "Visual Studio 10" ^
|
||||
-DMSVC_3RDPARTY_ROOT=%WORKSPACE% ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc100/SimGear ^
|
||||
-DBOOST_ROOT=%WORKSPACE%/Boost
|
||||
cmake --build . --config Release --target INSTALL
|
||||
cmake ..\simgear -G "Visual Studio 14" ^
|
||||
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
|
||||
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
|
||||
-DCMAKE_PREFIX_PATH:PATH=%OSG32% ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140
|
||||
cmake --build . --config RelWithDebInfo --target INSTALL
|
||||
|
||||
cd ..\build-fg32
|
||||
cmake ..\flightgear -G "Visual Studio 10" ^
|
||||
-DMSVC_3RDPARTY_ROOT=%WORKSPACE% ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc100/FlightGear ^
|
||||
-DCMAKE_PREFIX_PATH=%QT5SDK32% ^
|
||||
-DPNG_LIBRARY=%WORKSPACE%/3rdParty/lib/libpng16.lib ^
|
||||
-DFLTK_FLUID_EXECUTABLE=%WORKSPACE%/3rdParty/bin/fluid.exe ^
|
||||
-DBOOST_ROOT=%WORKSPACE%/Boost
|
||||
cmake --build . --config Release --target INSTALL
|
||||
|
||||
cd ..\build-fgrun32
|
||||
cmake ..\fgrun -G "Visual Studio 10" ^
|
||||
-DMSVC_3RDPARTY_ROOT:PATH=%WORKSPACE% ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc100/FGRun ^
|
||||
-DFLTK_FLUID_EXECUTABLE:FILEPATH=%WORKSPACE%/3rdParty/bin/fluid.exe ^
|
||||
-DGETTEXT_MSGFMT_EXECUTABLE:FILEPATH=%WORKSPACE%/3rdParty/bin/msgfmt.exe ^
|
||||
-DGETTEXT_MSGMERGE_EXECUTABLE:FILEPATH=%WORKSPACE%/3rdParty/bin/msgmerge.exe ^
|
||||
-DBOOST_ROOT=%WORKSPACE%/Boost
|
||||
cmake --build . --config Release --target INSTALL
|
||||
cmake ..\flightgear -G "Visual Studio 14" ^
|
||||
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140 ^
|
||||
-DCMAKE_PREFIX_PATH:PATH=%WORKSPACE%/install/msvc140/OpenSceneGraph ^
|
||||
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
|
||||
-DCMAKE_PREFIX_PATH=%QT5SDK32%;%OSG32%
|
||||
cmake --build . --config RelWithDebInfo --target INSTALL
|
||||
|
||||
cd ..
|
||||
|
||||
REM 64 bits
|
||||
md build-sg64
|
||||
md build-fg64
|
||||
md build-fgrun64
|
||||
|
||||
cd build-sg64
|
||||
cmake ..\SimGear -G "Visual Studio 10 Win64" ^
|
||||
-DMSVC_3RDPARTY_ROOT=%WORKSPACE% ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc100-64/SimGear ^
|
||||
-DBOOST_ROOT=%WORKSPACE%/Boost
|
||||
cmake --build . --config Release --target INSTALL
|
||||
cmake ..\SimGear -G "Visual Studio 14 Win64" ^
|
||||
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
|
||||
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
|
||||
-DCMAKE_PREFIX_PATH:PATH=%OSG64% ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140-64
|
||||
cmake --build . --config RelWithDebInfo --target INSTALL
|
||||
|
||||
cd ..\build-fg64
|
||||
cmake ..\flightgear -G "Visual Studio 10 Win64" ^
|
||||
-DMSVC_3RDPARTY_ROOT=%WORKSPACE% ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc100-64/FlightGear ^
|
||||
-DCMAKE_PREFIX_PATH=%QT5SDK64% ^
|
||||
-DFLTK_FLUID_EXECUTABLE=%WORKSPACE%/3rdParty/bin/fluid.exe ^
|
||||
-DBOOST_ROOT=%WORKSPACE%/Boost ^
|
||||
-DWITH_FGPANEL=OFF ^
|
||||
-DENABLE_PROFILE=OFF
|
||||
cmake --build . --config Release --target INSTALL
|
||||
|
||||
cd ..\build-fgrun64
|
||||
cmake ..\fgrun -G "Visual Studio 10 Win64" ^
|
||||
-DMSVC_3RDPARTY_ROOT:PATH=%WORKSPACE% ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc100-64/FGRun ^
|
||||
-DFLTK_FLUID_EXECUTABLE:FILEPATH=%WORKSPACE%/3rdParty/bin/fluid.exe ^
|
||||
-DGETTEXT_MSGFMT_EXECUTABLE:FILEPATH=%WORKSPACE%/3rdParty/bin/msgfmt.exe ^
|
||||
-DGETTEXT_MSGMERGE_EXECUTABLE:FILEPATH=%WORKSPACE%/3rdParty/bin/msgmerge.exe ^
|
||||
-DBOOST_ROOT=%WORKSPACE%/Boost
|
||||
cmake --build . --config Release --target INSTALL
|
||||
cmake ..\flightgear -G "Visual Studio 14 Win64" ^
|
||||
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
|
||||
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140-64 ^
|
||||
-DCMAKE_PREFIX_PATH=%QT5SDK64%;%OSG64%
|
||||
cmake --build . --config RelWithDebInfo --target INSTALL
|
||||
|
||||
cd ..
|
||||
|
||||
REM Qt5 deployment
|
||||
%QT5SDK32%\bin\windeployqt --release --list target %WORKSPACE%/install/msvc100/FlightGear/bin/fgfs.exe
|
||||
%QT5SDK64%\bin\windeployqt --release --list target %WORKSPACE%/install/msvc100-64/FlightGear/bin/fgfs.exe
|
||||
%QT5SDK32%\bin\windeployqt --release --list target %WORKSPACE%/install/msvc140/bin/fgfs.exe
|
||||
%QT5SDK64%\bin\windeployqt --release --list target %WORKSPACE%/install/msvc140-64/bin/fgfs.exe
|
||||
|
||||
REM build setup
|
||||
ECHO Packaging root is %WORKSPACE%
|
||||
@@ -86,7 +72,7 @@ copy %WORKSPACE%\build-fg32\src\Main\RelWithDebInfo\fgfs.pdb %WORKSPACE%\Output\
|
||||
copy %WORKSPACE%\build-fg64\src\Main\RelWithDebInfo\fgfs.pdb %WORKSPACE%\Output\fgfs-x64-%BUILD_NUMBER%.pdb
|
||||
|
||||
REM indirect way to get command output into an environment variable
|
||||
set PATH=%WORKSPACE%\install\msvc100\OpenSceneGraph\bin;%PATH%
|
||||
set PATH=%OSG32%\bin;%PATH%
|
||||
osgversion --so-number > %TEMP%\osg-so-number.txt
|
||||
osgversion --version-number > %TEMP%\osg-version.txt
|
||||
osgversion --openthreads-soversion-number > %TEMP%\openthreads-so-number.txt
|
||||
@@ -100,17 +86,17 @@ IF %IS_NIGHTLY_BUILD% EQU 1 (
|
||||
REM FlightGear nightly: with fgdata, output filename would be "FlightGear-x.x.x-nightly-full.exe"
|
||||
CALL :writeBaseConfig
|
||||
CALL :writeNightlyFullConfig
|
||||
iscc FlightGear.iss
|
||||
iscc /Q FlightGear.iss
|
||||
|
||||
REM FlightGear nightly: without fgdata, output filename would be "FlightGear-x.x.x-nightly.exe"
|
||||
CALL :writeBaseConfig
|
||||
CALL :writeNightlyDietConfig
|
||||
iscc FlightGear.iss
|
||||
iscc /Q FlightGear.iss
|
||||
) ELSE (
|
||||
REM FlightGear release: with fgdata, output filename would be "FlightGear-x.x.x.exe"
|
||||
CALL :writeBaseConfig
|
||||
CALL :writeReleaseConfig
|
||||
iscc FlightGear.iss
|
||||
iscc /Q FlightGear.iss
|
||||
)
|
||||
GOTO End
|
||||
|
||||
|
||||
28
catalog/fgaddon-catalog/catalog.config.xml
Normal file
28
catalog/fgaddon-catalog/catalog.config.xml
Normal file
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--Template catalog - copy and modify for your site as required-->
|
||||
<PropertyList>
|
||||
<local-output>/home/curt/Projects/FlightGear/ftp/Aircraft</local-output>
|
||||
<download-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/</download-url>
|
||||
<thumbnail-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/thumbnails</thumbnail-url>
|
||||
<scm>
|
||||
<type>svn</type>
|
||||
<path>/home/curt/Projects/FlightGear/flightgear-fgaddon/Aircraft</path>
|
||||
<skip>NTPS</skip>
|
||||
<skip>c172</skip>
|
||||
<skip>tu134</skip>
|
||||
</scm>
|
||||
<include-dir>/home/curt/Projects/FlightGear/flightgear-fgdata</include-dir>
|
||||
<include-dir>/home/curt/Projects/FlightGear/flightgear-fgaddon</include-dir>
|
||||
|
||||
<!-- <scm>
|
||||
<type>git</type>
|
||||
<update type="bool">false</update>
|
||||
<path>/Users/jmt/FGFS/fgdata</path>
|
||||
<url>git://git.code.sf.net/p/flightgear/fgdata</url>
|
||||
</scm> -->
|
||||
<upload n="0">
|
||||
<enabled type="bool">true</enabled>
|
||||
<type>rsync-ssh</type>
|
||||
<remote>fgfs:/home/fgfs/fgfs.goneabitbursar.com/official</remote>
|
||||
</upload>
|
||||
</PropertyList>
|
||||
516
catalog/fgaddon-catalog/md5sum.xml
Normal file
516
catalog/fgaddon-catalog/md5sum.xml
Normal file
@@ -0,0 +1,516 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<PropertyList>
|
||||
<aircraft_14bis>8a4ea48a3bb83b608386f942a85100c9</aircraft_14bis>
|
||||
<aircraft_21>057bfdb3c3fcfba3f8d31723a77df277</aircraft_21>
|
||||
<aircraft_707>088f6c3850d9c3f8e94ced2bfc2a65db</aircraft_707>
|
||||
<aircraft_717>abc393890f7ab49f32c6a2adc01b7823</aircraft_717>
|
||||
<aircraft_727-230>8e93ee83c42f77db9881f9ca0f00cf8b</aircraft_727-230>
|
||||
<aircraft_737-100>45fc009e9323de75e477b2548c79cb9a</aircraft_737-100>
|
||||
<aircraft_737-200>3fb8820c373e78bcd52981293e2d46e8</aircraft_737-200>
|
||||
<aircraft_737-300>c974d9b2e7c5feba195563433a4c5bc2</aircraft_737-300>
|
||||
<aircraft_737NG>dd9ab7cb3fb27a4acfc7b634fa9ec396</aircraft_737NG>
|
||||
<aircraft_747>5779ec5bdab4e9405d0db447c5a73df4</aircraft_747>
|
||||
<aircraft_747-200>e3565e459436a5e4dcdd260a095c28b2</aircraft_747-200>
|
||||
<aircraft_747-400>ce6c904cb23df6337ed6bdc1dcf6d68e</aircraft_747-400>
|
||||
<aircraft_747-8i>92161d0ef86048c0c859241abd64ffcd</aircraft_747-8i>
|
||||
<aircraft_757-200>9f5841317f4ed65fc815517c6770affd</aircraft_757-200>
|
||||
<aircraft_767-300>89c1b762b8b58fee4772a94d3c9b81d8</aircraft_767-300>
|
||||
<aircraft_777>693bf6470439f876edced4bd558b69a1</aircraft_777>
|
||||
<aircraft_787-8>f450b755c5bad640d8c2ef7312b1a6fb</aircraft_787-8>
|
||||
<aircraft_A-10>4aaca65794466d8cbf8e9ab29ef1b47b</aircraft_A-10>
|
||||
<aircraft_A-26-Invader>c57f1d877e851f2164f292997508dd36</aircraft_A-26-Invader>
|
||||
<aircraft_A-6E>86b52be36911fd0ee5d0b93d4b70a087</aircraft_A-6E>
|
||||
<aircraft_A24-Viking>904f23999e33d323d3f7a09c1807b71a</aircraft_A24-Viking>
|
||||
<aircraft_A300>3ae04898384a6531fa2edac2fcd508e9</aircraft_A300>
|
||||
<aircraft_A320-family>c9ec3df5ce80cbbbec9e39a849877ceb</aircraft_A320-family>
|
||||
<aircraft_A340-600>f015a7d2c8bde1224298261ae34e04c2</aircraft_A340-600>
|
||||
<aircraft_A380>4951432b9d39c142e891da3209e3ad32</aircraft_A380>
|
||||
<aircraft_a4>f175e90ccf2c3ae5118cf6eb1a43867e</aircraft_a4>
|
||||
<aircraft_A6M2>dfb5b7f4f7233d854dca45ae4521e080</aircraft_A6M2>
|
||||
<aircraft_Aermacchi-MB-339>f6757f3a4f78364c0439fd7d488c4330</aircraft_Aermacchi-MB-339>
|
||||
<aircraft_Aero-Commander>021be8bd26c7aa03093e5e356d8c7ef2</aircraft_Aero-Commander>
|
||||
<aircraft_Aerocar>89c4f1663f6b65ca1f70184dd8886f8b</aircraft_Aerocar>
|
||||
<aircraft_Aerostar-700>9049ec76bddd80abff57a837313771d8</aircraft_Aerostar-700>
|
||||
<aircraft_AG-14>4f9c9c24e662036de1cd85ed528c3d4e</aircraft_AG-14>
|
||||
<aircraft_Aichi-D3A>766eb03f38f36190de94422b5481ce4b</aircraft_Aichi-D3A>
|
||||
<aircraft_Aichi-M6A>14219343b589d8610da96f7a8ec16cdc</aircraft_Aichi-M6A>
|
||||
<aircraft_Airco-DH2>67689844de14068b7e95e675c0da6c17</aircraft_Airco-DH2>
|
||||
<aircraft_AirCrane>44fd70dc27b3d36bbde5766ac528d095</aircraft_AirCrane>
|
||||
<aircraft_Airspeed-Horsa>dae16af174310b492c4412e0c77593e8</aircraft_Airspeed-Horsa>
|
||||
<aircraft_airwaveXtreme150>64c7f53c6dac1b4da3813661f7455faf</aircraft_airwaveXtreme150>
|
||||
<aircraft_Albatros-BII>7ccb293d5808ca0b9c48271a6398de94</aircraft_Albatros-BII>
|
||||
<aircraft_Albatross>61af35090bbc722076353d1496c2d82f</aircraft_Albatross>
|
||||
<aircraft_Allegro-2000>edae78dee86c3c0cb741bc4ea8793162</aircraft_Allegro-2000>
|
||||
<aircraft_Alouette-II>94d5008f7bbfb65a56cff0694983d8ff</aircraft_Alouette-II>
|
||||
<aircraft_Alouette-III>c267be9f90def2460ff53649c6fee2f0</aircraft_Alouette-III>
|
||||
<aircraft_Alphajet>3fd4701f2363c41de0374c4703b88e83</aircraft_Alphajet>
|
||||
<aircraft_AN-225>87a1ad2288b56c71559549d55b93cccd</aircraft_AN-225>
|
||||
<aircraft_an2>37ccf863b017f0b773885619a671f8f7</aircraft_an2>
|
||||
<aircraft_an24b>3e26ca3bf5296630eebbcd82859d5ac4</aircraft_an24b>
|
||||
<aircraft_ANT-20>add26dd267eca688d4a88b672749a155</aircraft_ANT-20>
|
||||
<aircraft_Antoinette>75e69854bf9d09d16cbd5147926ba7fd</aircraft_Antoinette>
|
||||
<aircraft_Antonov-An-12>457f71d5be8ec8c3e42c6919b226b549</aircraft_Antonov-An-12>
|
||||
<aircraft_Antonov-An-22>4a27ba4bb53f82bf2a4b325cd3405a89</aircraft_Antonov-An-22>
|
||||
<aircraft_apache>b7e3e73c98d17006e984e056442c29ce</aircraft_apache>
|
||||
<aircraft_AR-234>c0c500c55706fc18d93817ebc3b6e83b</aircraft_AR-234>
|
||||
<aircraft_Arsenal-VG33>c883cde7942cdcfb8cd69c135c4d29f7</aircraft_Arsenal-VG33>
|
||||
<aircraft_Arup-S2>70db9ed1cb09e1442e22d020a9dc3069</aircraft_Arup-S2>
|
||||
<aircraft_as332>c62f9ee3f78c98a6342a6a337089fd10</aircraft_as332>
|
||||
<aircraft_ASK13>264d821437a558cf71c9209f466f6103</aircraft_ASK13>
|
||||
<aircraft_ASK21>27923bdc9f0f3ae3449f5d7a17744da5</aircraft_ASK21>
|
||||
<aircraft_ASK21-MI>023bbe168eb0babb4a68963edffc273b</aircraft_ASK21-MI>
|
||||
<aircraft_asw20>0926a8a021c4e11fa2610cbb5f6f11b3</aircraft_asw20>
|
||||
<aircraft_ATC>846d8156216e434e789f5d2b7432b68f</aircraft_ATC>
|
||||
<aircraft_ATC-ML>887c1bc8ab679604031f983ab6c67974</aircraft_ATC-ML>
|
||||
<aircraft_ATI-Resolution>915cd6323c113bb2a8b57e4c08900f3e</aircraft_ATI-Resolution>
|
||||
<aircraft_ATR-72-500>c0fe4169db9a338f5beec102f1efe301</aircraft_ATR-72-500>
|
||||
<aircraft_Avro-Arrow>4b2acc554752df97194e0da1a1c8638c</aircraft_Avro-Arrow>
|
||||
<aircraft_AVRO-IV-Triplane>9d3c4b4b66a7140628b79c4f142cc0f4</aircraft_AVRO-IV-Triplane>
|
||||
<aircraft_Avro-Lancaster>611d6172991766b32a43d19bfb06bbb2</aircraft_Avro-Lancaster>
|
||||
<aircraft_B-17>7cf94e2ee2c76783bf17c845e12e48cb</aircraft_B-17>
|
||||
<aircraft_B-1B>6407f6fd1bfe031b280639d20dfe100f</aircraft_B-1B>
|
||||
<aircraft_B-2>04db71541bc7099383524080a2c64012</aircraft_B-2>
|
||||
<aircraft_B-24-Liberator>2bdd09054c9c92088ff297d6358a05a8</aircraft_B-24-Liberator>
|
||||
<aircraft_B-25>51c6e9397e1e8fff65eb1d1671d18067</aircraft_B-25>
|
||||
<aircraft_B-36D-Peacemaker>3d1883d3213d2b5f7d39ec5221cd4eb2</aircraft_B-36D-Peacemaker>
|
||||
<aircraft_B-52F>d172dc57ce4e2c15f7f550a5c0c734a8</aircraft_B-52F>
|
||||
<aircraft_b1900d>db7301be7b428db2070e27a5fe7ee06e</aircraft_b1900d>
|
||||
<aircraft_b26>a71912ae798780eba390f9b27638b139</aircraft_b26>
|
||||
<aircraft_b29>7dd2ae465a7710921d11c6c18aa0c0e7</aircraft_b29>
|
||||
<aircraft_BAC-TSR2>6aaa660040bd40facf28fc68220b3cfc</aircraft_BAC-TSR2>
|
||||
<aircraft_BAe-125>2a3387f97647ad875060bac1284cfcbd</aircraft_BAe-125>
|
||||
<aircraft_Beagle-Pup>46a6f17c638e177421d1afc559b9d66a</aircraft_Beagle-Pup>
|
||||
<aircraft_beaufighter>50af4a2d301fafb2a3e13fe96e9215be</aircraft_beaufighter>
|
||||
<aircraft_beech99>6395fcaf780d6e43b4dd9f215a24e718</aircraft_beech99>
|
||||
<aircraft_Beechcraft-C18S>5a133a789694642b9f3e611ddf23d3d6</aircraft_Beechcraft-C18S>
|
||||
<aircraft_Beechcraft-Staggerwing>b668b91e67ef10757839da013faee44b</aircraft_Beechcraft-Staggerwing>
|
||||
<aircraft_Bell-222X>635dc4a39a43814f2885d59b1dda8a9d</aircraft_Bell-222X>
|
||||
<aircraft_Bell-P-39>aba5e103f315014925dff3b39bd2d648</aircraft_Bell-P-39>
|
||||
<aircraft_Bell-P-59>ba6e32553464e03fe6392303a2072631</aircraft_Bell-P-59>
|
||||
<aircraft_Bell-X1>3c10ccdf2775cad485bb394d5b1e56eb</aircraft_Bell-X1>
|
||||
<aircraft_Bell-XFL-1>167d03a6eafc1a3780f6fdf733fc7c6e</aircraft_Bell-XFL-1>
|
||||
<aircraft_Bernard-HV220>0579472d3185c8beba310aef9bf65f5d</aircraft_Bernard-HV220>
|
||||
<aircraft_bf109>cb732caa641493f07c4cc564018dd481</aircraft_bf109>
|
||||
<aircraft_Bleriot-125>21b170a0f9dae055d5c1d1af9946515e</aircraft_Bleriot-125>
|
||||
<aircraft_Bleriot-5190>4fdcfd3aa209318c07c779e408e81df2</aircraft_Bleriot-5190>
|
||||
<aircraft_Bleriot-SPAD-S.510>aef8c5f5f68349a7ae804df1d6d07e3f</aircraft_Bleriot-SPAD-S.510>
|
||||
<aircraft_bleriot-XI>e499504fcba1e95e0cca9c4418bfee23</aircraft_bleriot-XI>
|
||||
<aircraft_bluebird>a9af2d04a1e7bf279d135a4a06b11181</aircraft_bluebird>
|
||||
<aircraft_bo105>506a63476d00ef552b8adc3260ba1fa4</aircraft_bo105>
|
||||
<aircraft_bocian>9a3fd12ef60228dca05efa4ff694a882</aircraft_bocian>
|
||||
<aircraft_Boeing-247>152fcac32e4bb9f7fce5b6894b6da08b</aircraft_Boeing-247>
|
||||
<aircraft_Boeing-P26>97a640a4f9eddc33ac626f78adfaecb9</aircraft_Boeing-P26>
|
||||
<aircraft_Boeing314>f00599943616e14682c2baea90e6173a</aircraft_Boeing314>
|
||||
<aircraft_Bombardier-415>787d13e37c31fbf894d5a25091e4befc</aircraft_Bombardier-415>
|
||||
<aircraft_Br-761>78d4695d2466f50d3c45e0374809b386</aircraft_Br-761>
|
||||
<aircraft_Brabazon>6d0e61e40af698ea72e2978ed50e3a49</aircraft_Brabazon>
|
||||
<aircraft_Breda-B.Z.308>b3e9444c45cc9c445961b726429c0c7e</aircraft_Breda-B.Z.308>
|
||||
<aircraft_Breguet-XIX>a230231691ebc4df86e7d645f31a0f07</aircraft_Breguet-XIX>
|
||||
<aircraft_Buccaneer>84362d957e9dae0e5abc70ba4cb9816e</aircraft_Buccaneer>
|
||||
<aircraft_Bugatti>311a00f90c55c01980688c1d5504df64</aircraft_Bugatti>
|
||||
<aircraft_Burnelli-CBY-3>cb75a6990af600c666b02398cf77d6d1</aircraft_Burnelli-CBY-3>
|
||||
<aircraft_BV-141>a191302bdfb1faff1c6f2dd8a5494381</aircraft_BV-141>
|
||||
<aircraft_BV-170>258b971dd3041a49a816a2150d7e7125</aircraft_BV-170>
|
||||
<aircraft_C-160-Transall>695ce9bf3221055eecd24be01acb57e2</aircraft_C-160-Transall>
|
||||
<aircraft_C-2A>3c341ded96ce7c8832738c34c5c115f8</aircraft_C-2A>
|
||||
<aircraft_C130>c954a3ab900676c0cbabb1bada93754b</aircraft_C130>
|
||||
<aircraft_c150>270cabd6289080468d29a807f612cb4c</aircraft_c150>
|
||||
<aircraft_c172r>60bb07c7cefe930145d4b199b63842a7</aircraft_c172r>
|
||||
<aircraft_c182>fd61954ffdd247b47fec0fc9074aa40b</aircraft_c182>
|
||||
<aircraft_c182rg>171f7d74d45a50804c8111f5fab29543</aircraft_c182rg>
|
||||
<aircraft_c310>604cd9887e8f1c9011581348feca1e3c</aircraft_c310>
|
||||
<aircraft_c310u3a>80756d598e81a6a09217da9025e6284f</aircraft_c310u3a>
|
||||
<aircraft_C460>b465d263b244c5860ce010371032b5d3</aircraft_C460>
|
||||
<aircraft_C561>60cb1a6effe4e0023edd1bfdc109aed3</aircraft_C561>
|
||||
<aircraft_C684>e2881ea7546775db6847bb3890c04a03</aircraft_C684>
|
||||
<aircraft_Campini-Caproni-N1>68ec43ed98164bef020452e3758ec22f</aircraft_Campini-Caproni-N1>
|
||||
<aircraft_CanberraBI8>a865e922bec69cf8a6fe1f8d53dbc71b</aircraft_CanberraBI8>
|
||||
<aircraft_Cap10B>4a7cb6a6f5f6d71d5eb2da025b42d71f</aircraft_Cap10B>
|
||||
<aircraft_Cap10C>bd103f5fa8a8ac980b8c4ed3a041ff6b</aircraft_Cap10C>
|
||||
<aircraft_Caproni-C22J>d4eb3933d210d1a8f1deaf8b43a65960</aircraft_Caproni-C22J>
|
||||
<aircraft_Caproni-Ca3>0ad6cdbf91f37b6c71f94268914d2615</aircraft_Caproni-Ca3>
|
||||
<aircraft_Caproni-Stipa>d94119914089db0f7b6d43ddf20cb302</aircraft_Caproni-Stipa>
|
||||
<aircraft_Caravelle>826b017ad5bc1c77c65959367f41415f</aircraft_Caravelle>
|
||||
<aircraft_Carreidas>4cc78b3c9c421c382b4e197de6589535</aircraft_Carreidas>
|
||||
<aircraft_Caudron-G3>6c8b251c720301a00276f91db736ee85</aircraft_Caudron-G3>
|
||||
<aircraft_Caudron-G4>28ebd3b1236a53a0b15bf9c6f5cc79d6</aircraft_Caudron-G4>
|
||||
<aircraft_Cessna-208-Caravan>edbaa02c5b837b9522ad8d0fd7da81e8</aircraft_Cessna-208-Caravan>
|
||||
<aircraft_Cessna-421-Golden-Eagle>e16b7b135dbe3fa75539931c950116b6</aircraft_Cessna-421-Golden-Eagle>
|
||||
<aircraft_Cessna337>bf3b60a808daefd7b7374f934e7b10bf</aircraft_Cessna337>
|
||||
<aircraft_ch47>d46d6e08cd90412088abffe2dbd03982</aircraft_ch47>
|
||||
<aircraft_ch53e>55d564ff1b335a723d144e423b9a3c10</aircraft_ch53e>
|
||||
<aircraft_Cirrus-SR22>a3bbd80a8c11bea16f567eafa898db8f</aircraft_Cirrus-SR22>
|
||||
<aircraft_Citation>c6f74c5596f959608e1810004abba534</aircraft_Citation>
|
||||
<aircraft_Citation-Bravo>a6743e193bb01776107fec98595555e4</aircraft_Citation-Bravo>
|
||||
<aircraft_CitationX>8bf718df53a6af7777f087a302641061</aircraft_CitationX>
|
||||
<aircraft_Coanda-1910>b66f175629a52396dd1db3f1718d2028</aircraft_Coanda-1910>
|
||||
<aircraft_colditz>77100ce686eee7ae2b5950df44a38709</aircraft_colditz>
|
||||
<aircraft_Commonwealth-Ca-12>f132805e11b1c1e60908080b9b6533ad</aircraft_Commonwealth-Ca-12>
|
||||
<aircraft_ComperSwift>8b227cd83d5f1f3b3b44bb7b46714349</aircraft_ComperSwift>
|
||||
<aircraft_Concorde>566f1dc35ae741cdeee125111f1e0c20</aircraft_Concorde>
|
||||
<aircraft_Convair-XFY-1-Pogo>633550eae44633a9b23777ffab527f1b</aircraft_Convair-XFY-1-Pogo>
|
||||
<aircraft_couzinet70>d8fa7f026fc404ad20b7c7f6a11619ee</aircraft_couzinet70>
|
||||
<aircraft_cri-cri>bc2267347bc48ba2377926a7a6515274</aircraft_cri-cri>
|
||||
<aircraft_CRJ-200>0d500b113ae2d633e5f0bf36a1d19fd9</aircraft_CRJ-200>
|
||||
<aircraft_CRJ700-family>d935f718bed4a71069122fe5214ecd2e</aircraft_CRJ700-family>
|
||||
<aircraft_Curtiss-Jenny>6062a91295fbf99801e65197a71451c5</aircraft_Curtiss-Jenny>
|
||||
<aircraft_Curtiss-Model-F>8ca56323ab3db01ec034f231490a7702</aircraft_Curtiss-Model-F>
|
||||
<aircraft_Curtiss-P40>a0d00a78d80e4a621a1cfb55c0658fe3</aircraft_Curtiss-P40>
|
||||
<aircraft_D510>8b09cc7658164d311f4e70e36f463cde</aircraft_D510>
|
||||
<aircraft_D520>b967ca884dd02b37ad9c247d31bdf1c7</aircraft_D520>
|
||||
<aircraft_DaSH>f9c33778a3805892fbd0e6de35e54e91</aircraft_DaSH>
|
||||
<aircraft_Dassault-Mystere-IV>387fd1c59b2e5934ffcd888df39b7174</aircraft_Dassault-Mystere-IV>
|
||||
<aircraft_Dauphin>bdc3b2e695db1588827d000b55bbebda</aircraft_Dauphin>
|
||||
<aircraft_DC-10-30>1d37211f993a920b0806b95db0f8ea7c</aircraft_DC-10-30>
|
||||
<aircraft_dc2>77f9e6a9e1647dcd012966af7df1d4be</aircraft_dc2>
|
||||
<aircraft_dc6>dbfd9548db8318098daa75733171a18e</aircraft_dc6>
|
||||
<aircraft_dc8-63>70cff7394ced9ab348653ad82ece3c10</aircraft_dc8-63>
|
||||
<aircraft_dc8-73>26883edc54c7a02e208ce51e7b964e2e</aircraft_dc8-73>
|
||||
<aircraft_Deperdussin>00fc8120294619b97ccf0e04a6145c1f</aircraft_Deperdussin>
|
||||
<aircraft_DerKleineUhu>9003650773fd4933b40089d146484045</aircraft_DerKleineUhu>
|
||||
<aircraft_Deuche>033799e2157ac9ffc6ac04fcdfeafe04</aircraft_Deuche>
|
||||
<aircraft_DG-101G>02e81c7a33551c2581f8d5767e464518</aircraft_DG-101G>
|
||||
<aircraft_DH-106>f7ac35642502a83a265f7b6594650279</aircraft_DH-106>
|
||||
<aircraft_DH-88>be3e5fcef3000c72a2d85fb9eb827793</aircraft_DH-88>
|
||||
<aircraft_DH-89>c745759b0e259323b20ba2e535284e7d</aircraft_DH-89>
|
||||
<aircraft_DH-91>8b24f65ff28f7c66e65bcf7025582575</aircraft_DH-91>
|
||||
<aircraft_dhc1>14b8d09e2debfdfd9cac81b8b67c9498</aircraft_dhc1>
|
||||
<aircraft_dhc2>ff6f3470289772182d931daa00f6057f</aircraft_dhc2>
|
||||
<aircraft_dhc3>a0506714e972c2a58f745c6bd7cc4fe2</aircraft_dhc3>
|
||||
<aircraft_dhc4>4a792858aa65aada7cb91a47a9cf8c5d</aircraft_dhc4>
|
||||
<aircraft_dhc6>81fb6e7b8ff50d43180bb758d1a56121</aircraft_dhc6>
|
||||
<aircraft_dhc8>cca58285c8c814dfe923aaec656b1d9c</aircraft_dhc8>
|
||||
<aircraft_Diamond-Da40>26885d6e6a849ad9dd54829baa26daee</aircraft_Diamond-Da40>
|
||||
<aircraft_Diamond-Da42>e9992fcecbc66640a932c1c8fb7e71ae</aircraft_Diamond-Da42>
|
||||
<aircraft_DO-228>8915f9465c563740f9f8f2cf32f1dd74</aircraft_DO-228>
|
||||
<aircraft_DO-26>80757f34ea04417b6b30d65092ce50ab</aircraft_DO-26>
|
||||
<aircraft_DO-335>ba8bbc9e04405db298beb9c24c6200c3</aircraft_DO-335>
|
||||
<aircraft_DO-X>41356deabb2cd689393f36b96123a330</aircraft_DO-X>
|
||||
<aircraft_Douglas-Dc3>b57c14a1791a20bccbf23db826a22dbb</aircraft_Douglas-Dc3>
|
||||
<aircraft_Douglas-Dolphin>578771e25e6d7d81e5574d8cd1d19de0</aircraft_Douglas-Dolphin>
|
||||
<aircraft_DR400>01c814d7ddeb0adcee0ed58022ebf6a8</aircraft_DR400>
|
||||
<aircraft_DR400-dauphin>259cd05cfbf4b80b2cb4be07cf4bf781</aircraft_DR400-dauphin>
|
||||
<aircraft_Dragonfly>012f8917ef6d7ec50d8a73c0508e5b47</aircraft_Dragonfly>
|
||||
<aircraft_Dromader>9f77b8fbf981c4d761d8c497b6ef0868</aircraft_Dromader>
|
||||
<aircraft_Dunne-D.5>48795402cda50957be7b7504b4d82389</aircraft_Dunne-D.5>
|
||||
<aircraft_E-2C>d015100dfb5381135d221f41b293584d</aircraft_E-2C>
|
||||
<aircraft_E3B>894c16ccfa5aed2778c7be4873947b69</aircraft_E3B>
|
||||
<aircraft_eastbourne_mono>a99c8114ca48074fea2c675a8e6908e0</aircraft_eastbourne_mono>
|
||||
<aircraft_ec130>684d979f81bf15b2adf47b52d6ca21f7</aircraft_ec130>
|
||||
<aircraft_ec135>39631381049db9e54655c499f91bfb31</aircraft_ec135>
|
||||
<aircraft_Embraer-ERJ-145>ef5ed515fe8f93876137bb6b27f3b158</aircraft_Embraer-ERJ-145>
|
||||
<aircraft_ercoupe>bdaa474d4be6e51b21266ce0c8782c2c</aircraft_ercoupe>
|
||||
<aircraft_Etrich-Taube>f6ba735798172b43abf417c80c1c4db4</aircraft_Etrich-Taube>
|
||||
<aircraft_eurofighter>0f915d06528b1cc2dcc16f7be3b9ab37</aircraft_eurofighter>
|
||||
<aircraft_extra500>72a8b154cda42a2ec507b6a4c604afcb</aircraft_extra500>
|
||||
<aircraft_F-106-dart>84bfa325c11d56920062e8516bfc146e</aircraft_F-106-dart>
|
||||
<aircraft_F-117>ba904d06c2ddb28a7fd3f95ac344de7a</aircraft_F-117>
|
||||
<aircraft_f-14b>3c0963e6203c4a6315155012bbbb8096</aircraft_f-14b>
|
||||
<aircraft_F-15>43f556905826c6ad5c80af409eb8a76c</aircraft_F-15>
|
||||
<aircraft_F-35B>e1875c6efdc7ffe1160d8e64ac5f5fd7</aircraft_F-35B>
|
||||
<aircraft_F-86>ea67ec6bb6c981dbbd391003f997c6ef</aircraft_F-86>
|
||||
<aircraft_F-8E-Crusader>41b4502a287018e27402925094324209</aircraft_F-8E-Crusader>
|
||||
<aircraft_f16>25805162fbd9d4d00e09c814f0beef9b</aircraft_f16>
|
||||
<aircraft_f18>45264d8293d22533f56f571283940754</aircraft_f18>
|
||||
<aircraft_F4U>fb47e4425240141a45818dcdc8060a4b</aircraft_F4U>
|
||||
<aircraft_F6F-Hellcat>b4fcbc6e73565001d25f3cd64fb85a77</aircraft_F6F-Hellcat>
|
||||
<aircraft_F7F-Tigercat>0ea6ad997b8595f97530d9aed5529ec9</aircraft_F7F-Tigercat>
|
||||
<aircraft_F80C>9a7c5ac1aabe992abf14fd4b53c1712c</aircraft_F80C>
|
||||
<aircraft_F9F-Panther>305fc09e91c52fefd2b67d6925baff38</aircraft_F9F-Panther>
|
||||
<aircraft_fa223>3746de4faf66266399a9273321088ce2</aircraft_fa223>
|
||||
<aircraft_Fairchild-C119>ec397cdc0f61d78ecc28d2cc564becd6</aircraft_Fairchild-C119>
|
||||
<aircraft_Fairchild-Metroliner>3248a3f496cc146fcd95c61ec2538ae7</aircraft_Fairchild-Metroliner>
|
||||
<aircraft_Fairey-Gannet>96e43cd67c0c8b9fd6e158a3ee46fbdc</aircraft_Fairey-Gannet>
|
||||
<aircraft_Falcon-50>6d78633d200d8f945be6400027116539</aircraft_Falcon-50>
|
||||
<aircraft_Farman-III>3e0a4af617e2064e78cee25e1d8af653</aircraft_Farman-III>
|
||||
<aircraft_Farman-IV>42f45908ac131a855f66e63c09279562</aircraft_Farman-IV>
|
||||
<aircraft_Fiat-G55>15f03458e112d4d7d3ff674dc20286c2</aircraft_Fiat-G55>
|
||||
<aircraft_Fiat-G91>a3854718af2cf6c4c0512a166e283b4c</aircraft_Fiat-G91>
|
||||
<aircraft_FK9MK2>24144321fdadaf71e81f8b014ad0e16b</aircraft_FK9MK2>
|
||||
<aircraft_fkdr1>2294512dc1cdb63a8b90a21ba48875c7</aircraft_fkdr1>
|
||||
<aircraft_flash2a>c56ee7fbdb10b1ba979d019cc26972cf</aircraft_flash2a>
|
||||
<aircraft_Focke-Wulf-F19-ente>8bd5f800b24dbfc37f59fe368a748af1</aircraft_Focke-Wulf-F19-ente>
|
||||
<aircraft_Focke-Wulf-Ta.154>f926af126c01eabd3ceb0398b178519a</aircraft_Focke-Wulf-Ta.154>
|
||||
<aircraft_Fokker-Eindecker-EIII>29cd9e7ea06489595979f3df518813dd</aircraft_Fokker-Eindecker-EIII>
|
||||
<aircraft_Fokker-G1>ea6025e2b6cdffc86764c5ee5a949c9a</aircraft_Fokker-G1>
|
||||
<aircraft_Fokker-S-11>c3f68417e01ab653e66131bd446f8940</aircraft_Fokker-S-11>
|
||||
<aircraft_Fokker-Spin>2fc955ad2ecb4ba0a7899097e7e4b226</aircraft_Fokker-Spin>
|
||||
<aircraft_fokker100>83874804ebae4b77f6ac92f55c19ba91</aircraft_fokker100>
|
||||
<aircraft_fokker50>da5fc6e9761203e6dd26dc3f01a2fe68</aircraft_fokker50>
|
||||
<aircraft_followme>6b17d6d7bc78b5424420d47c0d737fa9</aircraft_followme>
|
||||
<aircraft_Ford-Trimotor>83743f288a09c89716ac2a2e212b11bc</aircraft_Ford-Trimotor>
|
||||
<aircraft_Fouga-Magister>866329f60e90f3404a6bace54e733b73</aircraft_Fouga-Magister>
|
||||
<aircraft_fw190>449953e8d06e61e78e94e520d8fbc3e3</aircraft_fw190>
|
||||
<aircraft_Fw200>5179bd127ee44112ec06887e322725aa</aircraft_Fw200>
|
||||
<aircraft_Fw61>049759aaa0c615f71b0e1e2d683cb3ba</aircraft_Fw61>
|
||||
<aircraft_G-164>977f70220ecee03ef7367b940956122a</aircraft_G-164>
|
||||
<aircraft_Gee-Bee>bf993f8a5499538d2b5f5f5ec0c7574d</aircraft_Gee-Bee>
|
||||
<aircraft_Gloster-Gladiator>65223229f5f8adc17c534412fb1b2bc8</aircraft_Gloster-Gladiator>
|
||||
<aircraft_Gloster-Meteor>9905dc7569bc1e9cf750e47cc138dbeb</aircraft_Gloster-Meteor>
|
||||
<aircraft_Gloster-Whittle>ef530cb8d0f3b53b83d993f4284bc4c3</aircraft_Gloster-Whittle>
|
||||
<aircraft_Gotha-G-V>d18ed659fb34df8e078b36d0156de731</aircraft_Gotha-G-V>
|
||||
<aircraft_Grob-Astir>57ada6ce17e8dda569e49ef29a517b90</aircraft_Grob-Astir>
|
||||
<aircraft_Grob-G109>65c28732f4909889ca9739953c7b2032</aircraft_Grob-G109>
|
||||
<aircraft_Grob-G115>82ca3e94ee5a1ee711fbc73e7ab99645</aircraft_Grob-G115>
|
||||
<aircraft_Grob-Gf200>b80921cb1ec91813ba6912abf8d3d73c</aircraft_Grob-Gf200>
|
||||
<aircraft_Grumman-American-AA1>40f6523b7cc0aff71281820d54bdaa0f</aircraft_Grumman-American-AA1>
|
||||
<aircraft_H-21C-Shawnee>515e08d2a12b2cc1891f23e086aa5933</aircraft_H-21C-Shawnee>
|
||||
<aircraft_H1-Racer>d8250d2d9f842108ffed965ced81ab64</aircraft_H1-Racer>
|
||||
<aircraft_H4-Hercules>34ea914ec8c9f7c85ba3c243c6d0f981</aircraft_H4-Hercules>
|
||||
<aircraft_Handley-Page-Halifax>837d0bc1db372b8d18e251fb63aa13ea</aircraft_Handley-Page-Halifax>
|
||||
<aircraft_Hansajet>98a417480a3126432d9214fe0efb83c9</aircraft_Hansajet>
|
||||
<aircraft_harrier>568eeccd7ffc3b08937fdf2da81a972a</aircraft_harrier>
|
||||
<aircraft_Harrier-GR1>8f90009d9f8c66ba0dafc1c05ff2c685</aircraft_Harrier-GR1>
|
||||
<aircraft_Harrier-GR3>b3d6038ff416a64372b663e9f3ccc137</aircraft_Harrier-GR3>
|
||||
<aircraft_Hawker-Siddeley-Nimrod>e78cd169d9423dc9a9126d51fbeeb91e</aircraft_Hawker-Siddeley-Nimrod>
|
||||
<aircraft_He-111>febb50152f339e23040815432e8fd6d4</aircraft_He-111>
|
||||
<aircraft_He162>a27b2dd3efe6a362d135d55eca70d134</aircraft_He162>
|
||||
<aircraft_Heinkel-He-111>941ab65d0ee6a8c0578e87b8d881ffc0</aircraft_Heinkel-He-111>
|
||||
<aircraft_Heinkel-He-177>3bc698cc3b8937609e715c12fb135ca0</aircraft_Heinkel-He-177>
|
||||
<aircraft_Heinkel-He-178>8a646c02ac858485f683301e5d98adb5</aircraft_Heinkel-He-178>
|
||||
<aircraft_Heinkel-He-280>f4656701178b9d1eea30aa73b6a96ea2</aircraft_Heinkel-He-280>
|
||||
<aircraft_Heston-Type5>11ef72971dce2d4b47f9899fabc4e591</aircraft_Heston-Type5>
|
||||
<aircraft_HM-14>aa1c16c7731e99ebc6cd536ce26daa14</aircraft_HM-14>
|
||||
<aircraft_Hornet>5dacabf98fe85149246cd5fc9bae6c39</aircraft_Hornet>
|
||||
<aircraft_Horsa>1ddf68bca0c4a97d263a2d1718f87d2e</aircraft_Horsa>
|
||||
<aircraft_Horten-Ho-IX>e8e04eb1d9bd25e270944775d8cb4100</aircraft_Horten-Ho-IX>
|
||||
<aircraft_HS-P-75>90f738b3a6362f787e2170cb3d7317f0</aircraft_HS-P-75>
|
||||
<aircraft_Hughes-XF11>bcf549f662ba17ac5896ef38b824f13e</aircraft_Hughes-XF11>
|
||||
<aircraft_Hunter>608118d1e8019c92a22c275b8ce02c4a</aircraft_Hunter>
|
||||
<aircraft_HUP-Retriever>5a2683f3d5a170495dc0ed3ed8cfa3f2</aircraft_HUP-Retriever>
|
||||
<aircraft_Hurricane>0f64845ba2b2a4bc6a5f5637d261b93b</aircraft_Hurricane>
|
||||
<aircraft_Icaro_MRX13>5f873b418694a01d049664ae58ad69a8</aircraft_Icaro_MRX13>
|
||||
<aircraft_IL-2>cdc9eeae48d8760204735cf3dfdfbec9</aircraft_IL-2>
|
||||
<aircraft_j22>14d705864d455ec73ca9c373f6d61d58</aircraft_j22>
|
||||
<aircraft_J3Cub>f978f4a979edc6b3ac3c6b0cbd631c83</aircraft_J3Cub>
|
||||
<aircraft_j7w>b777fc0d1a2c85ce6c0a03dfd90df48b</aircraft_j7w>
|
||||
<aircraft_JA37>ef141db8c2469b1421c8e74f018ee8a4</aircraft_JA37>
|
||||
<aircraft_Jaguar>7a0a5d5f93e34dd40fcdce3f06848908</aircraft_Jaguar>
|
||||
<aircraft_JAS39-Gripen>ed3685660909e7e831d7711a2cc7b7b0</aircraft_JAS39-Gripen>
|
||||
<aircraft_jeep>59341e0675583a826c34c625ba277345</aircraft_jeep>
|
||||
<aircraft_jetman>67a0cbf1e934dd6552cf3f231ed65964</aircraft_jetman>
|
||||
<aircraft_Jodel-D140>0cfed1923e5d2b849760df5ced30a175</aircraft_Jodel-D140>
|
||||
<aircraft_JT-5B>0650d1a62cce431fa07e64bf8845a904</aircraft_JT-5B>
|
||||
<aircraft_Ju-87>91a6f9e779d641b451efa777b6f81e81</aircraft_Ju-87>
|
||||
<aircraft_Ju-88>ebdd6f04edccd2205bcaed1e845b567d</aircraft_Ju-88>
|
||||
<aircraft_ju52>ee7f03a89cabb1370183f8a88dad1e9d</aircraft_ju52>
|
||||
<aircraft_Junkers-F13>f88670ae7d834818ba14d71a7e0036e3</aircraft_Junkers-F13>
|
||||
<aircraft_Junkers-G.38ce>7ad891738873394a7626882fd86e2031</aircraft_Junkers-G.38ce>
|
||||
<aircraft_Junkers-Ju-390>be9047b6412830adcf9a7d68cb4574d1</aircraft_Junkers-Ju-390>
|
||||
<aircraft_Junkers-W34>b5e96c226c4a2277b34dee97efc1d960</aircraft_Junkers-W34>
|
||||
<aircraft_K-7>cb160921e2c703bbbdafcb51d49c266f</aircraft_K-7>
|
||||
<aircraft_K5Y1>f72439b0db6a44fde139cb7651c28207</aircraft_K5Y1>
|
||||
<aircraft_Ka-50>96aae67efd76fb6bfce1a97b1fbdbefd</aircraft_Ka-50>
|
||||
<aircraft_Katana>151fbc5f85a7acd78039d2f074901028</aircraft_Katana>
|
||||
<aircraft_Kawasaki-Ki-61-Hien>4ab8429c7200f96c144439fe50cda12d</aircraft_Kawasaki-Ki-61-Hien>
|
||||
<aircraft_KC135>28519bdf05d7b1c5601ebfe9b7d95c0d</aircraft_KC135>
|
||||
<aircraft_Ki-84>fbee5f8f188262cf1e09c168dd1014db</aircraft_Ki-84>
|
||||
<aircraft_KM>3031820f648fe2fb15f8c9d64c104387</aircraft_KM>
|
||||
<aircraft_kodiak>947daecf702214b7708c8d7df872366b</aircraft_kodiak>
|
||||
<aircraft_L-1011-500>14670bbba47068cc5914c399c51a20e3</aircraft_L-1011-500>
|
||||
<aircraft_l39>1d42f9adf23bf70ef1f9ba1695b9f794</aircraft_l39>
|
||||
<aircraft_La-5>75204b0421e9835bf3ac3d2a0d198163</aircraft_La-5>
|
||||
<aircraft_Lancair-235>6fbd208db0830b462fe2d105d1924f1e</aircraft_Lancair-235>
|
||||
<aircraft_LATE-29>5ad79d5b9a17f3ac79b71722547fb6ff</aircraft_LATE-29>
|
||||
<aircraft_Late-631>421b4ec83fe86c82e0bb952d3ee08780</aircraft_Late-631>
|
||||
<aircraft_Leduc-022>2d3c15a8151e86b497900f6873b1875b</aircraft_Leduc-022>
|
||||
<aircraft_Lightning>b80a9a8c89b05c4fa22a314ea56b32ab</aircraft_Lightning>
|
||||
<aircraft_Lionceau>93a573bcf722ce69de872674b3f9dd27</aircraft_Lionceau>
|
||||
<aircraft_Lockheed-Martin-FA-22A-Raptor>97c2da3770e378b72637b09c0475156f</aircraft_Lockheed-Martin-FA-22A-Raptor>
|
||||
<aircraft_Lockheed-NF104>572acc2315b077411699eba35c0655d1</aircraft_Lockheed-NF104>
|
||||
<aircraft_Lockheed-NF104A>41347e33250b355077aba64c671a44ce</aircraft_Lockheed-NF104A>
|
||||
<aircraft_Lockheed-P38>53cd0af0a81de17378a7d3201c31dbb9</aircraft_Lockheed-P38>
|
||||
<aircraft_Lockheed-SR71>99485aa18c25c0e6537334d63ccfe2c6</aircraft_Lockheed-SR71>
|
||||
<aircraft_Lockheed-U-2S>b00db640f9f0f490b0bfa7d6d8b40163</aircraft_Lockheed-U-2S>
|
||||
<aircraft_Lockheed-Vega>04e530018ec557294dd90128fc0c4a56</aircraft_Lockheed-Vega>
|
||||
<aircraft_Lockheed1049>99539707fa1c283b6513be48996d8d14</aircraft_Lockheed1049>
|
||||
<aircraft_Lockheed1049h>8da4141b5716e4321d1d5dcf3cfd30e6</aircraft_Lockheed1049h>
|
||||
<aircraft_Long-EZ>6e5a8b2abc701632f9b9ab7a839eee4d</aircraft_Long-EZ>
|
||||
<aircraft_Lynx-WG13>9add8ac0325547a52fa53e03b06d23b9</aircraft_Lynx-WG13>
|
||||
<aircraft_M-XE>1978498650f9f5ae335cfd702a6d16f6</aircraft_M-XE>
|
||||
<aircraft_Macchi-Castoldi-MC72>6952026a71d24cf0b11baca0320ab087</aircraft_Macchi-Castoldi-MC72>
|
||||
<aircraft_Macchi-M33>90dc0d1bce4c19822312f51be82e9c98</aircraft_Macchi-M33>
|
||||
<aircraft_marchetti>b6959644da3e1acbdd2f63af0cc529f0</aircraft_marchetti>
|
||||
<aircraft_Martin-Baker-MB5>5c21bdb968a38b57b911aa998b9db99d</aircraft_Martin-Baker-MB5>
|
||||
<aircraft_MB326>1a61bc6d32a3ed512b51535c46dc6991</aircraft_MB326>
|
||||
<aircraft_MD-312-Flamant>be65efca7b7d7fc246c373e391996978</aircraft_MD-312-Flamant>
|
||||
<aircraft_MD11>e772e7fae851948c6f6b19c0191821aa</aircraft_MD11>
|
||||
<aircraft_ME-209-V1>3de79c61240e8e04a24d95c707a61a2b</aircraft_ME-209-V1>
|
||||
<aircraft_ME-262>9960374b772e64e5ad75e0d3b6e12f08</aircraft_ME-262>
|
||||
<aircraft_ME-262HGIII>3dfa621d920cecce3585b0f1ccb6be72</aircraft_ME-262HGIII>
|
||||
<aircraft_me163>687309052c27966bd4d3bbd023237c17</aircraft_me163>
|
||||
<aircraft_me323>0d615e9e715d3d4e150e836fbf43f426</aircraft_me323>
|
||||
<aircraft_Messerschmitt-BF110>39b9d8b0a4aafa4e1b25992520deb011</aircraft_Messerschmitt-BF110>
|
||||
<aircraft_Messerschmitt-Libelle>ed7ad8c54b6c2d9d1727e85a1a198a31</aircraft_Messerschmitt-Libelle>
|
||||
<aircraft_Messerschmitt-P1101>3b989b232dd121eff6b0b230e9e85f6c</aircraft_Messerschmitt-P1101>
|
||||
<aircraft_MFI-9>a566bad5dc6de5bc8d782c4f292e34ed</aircraft_MFI-9>
|
||||
<aircraft_MiG-15>9bb9d2c8983b99f4f74e063f3d1e3479</aircraft_MiG-15>
|
||||
<aircraft_MiG-21bis>d749c64a1fa96fbb0f13fc3d41b646e9</aircraft_MiG-21bis>
|
||||
<aircraft_Mig-29>c6b9271b94abdf0770612a5cf4555f91</aircraft_Mig-29>
|
||||
<aircraft_Mil-Mi-12>e1d83cafee3b3cecfdc3e473913df264</aircraft_Mil-Mi-12>
|
||||
<aircraft_Mil-Mi-24>9fe6b04de733a20290141310f02abdcf</aircraft_Mil-Mi-24>
|
||||
<aircraft_Mirage-2000>7bf582dfc110cfe38d616b1cdeed91ee</aircraft_Mirage-2000>
|
||||
<aircraft_mirage2000>faa0e38bdadaadb61fa28e968f8a2122</aircraft_mirage2000>
|
||||
<aircraft_Mirage_F1>dc188baadc7e6b3033845cfd48a14163</aircraft_Mirage_F1>
|
||||
<aircraft_MirageIII>9f814e7ec8180ca71bbaf721d9337e70</aircraft_MirageIII>
|
||||
<aircraft_MirageIV>a969aedf03beddd8ee89367d6179e1a4</aircraft_MirageIV>
|
||||
<aircraft_mosquito>15eac7459f9aeafabdce72df42a4ba69</aircraft_mosquito>
|
||||
<aircraft_MPCarrier>280758b9c9b1ec90f2010f1b1ab06ba7</aircraft_MPCarrier>
|
||||
<aircraft_MRJ>ad879791f1e9d0e2d719d6a4518bbe2c</aircraft_MRJ>
|
||||
<aircraft_MS-406>4507e58972e6bc69ba4f46ea3db455ec</aircraft_MS-406>
|
||||
<aircraft_Nakajima-B5N>02e681d40a2427610dd55c643e89b01d</aircraft_Nakajima-B5N>
|
||||
<aircraft_Nieuport-11>701b0401fb152e87a40c8b5babe87798</aircraft_Nieuport-11>
|
||||
<aircraft_Noratlas>b177adbf225feca2f7d39f80d5acc352</aircraft_Noratlas>
|
||||
<aircraft_Nord-1405-Gerfaut-II>a862bcf397791708ef2e0441282b2b69</aircraft_Nord-1405-Gerfaut-II>
|
||||
<aircraft_Nord-2502>c6f4dc65ba8177e50ef5742b3ecb52b7</aircraft_Nord-2502>
|
||||
<aircraft_Nordstern>6df28cb4a7d5e8907391c3ed8e70b6e0</aircraft_Nordstern>
|
||||
<aircraft_North-American-T28D-Trojan>5fee1165f23a11eeca4d24d766117377</aircraft_North-American-T28D-Trojan>
|
||||
<aircraft_North-American-T6-Texan>7ee82c752779d1c51f7b92660006aad2</aircraft_North-American-T6-Texan>
|
||||
<aircraft_Northrop-P61>23a394d7e36aa653bff9b32fc9548250</aircraft_Northrop-P61>
|
||||
<aircraft_Northrop-xb35>e4ec374be03638c10a88f351e8f09bad</aircraft_Northrop-xb35>
|
||||
<aircraft_ogel>26e51eabb21a9a71f1b5a685e3061843</aircraft_ogel>
|
||||
<aircraft_OH-1>49259a0e7725bb2c6809e1aae15e8fac</aircraft_OH-1>
|
||||
<aircraft_OH-58D>40801a1693b0b8bd33178d4a5bf67765</aircraft_OH-58D>
|
||||
<aircraft_ornithopter>7b0c70f7b8de3e1a5c19d32c36fa7d00</aircraft_ornithopter>
|
||||
<aircraft_OV10>74faff4f12efb353ccc61689fe96c46c</aircraft_OV10>
|
||||
<aircraft_P-38-Lightning>43c98dfe30fecc4c2448dc51750154ee</aircraft_P-38-Lightning>
|
||||
<aircraft_P130UL>ea0a540d06226687e3409c1226a1cc1d</aircraft_P130UL>
|
||||
<aircraft_P180>ab8760c0219835fe97dcbbf698b39fa4</aircraft_P180>
|
||||
<aircraft_P47>cc9b6238b260d924338d2c4ee2dafc95</aircraft_P47>
|
||||
<aircraft_p51d>7caa4abbdb5dba23edbdc02cf2693909</aircraft_p51d>
|
||||
<aircraft_pa22>da2990b33cef4afe7d629530b274632a</aircraft_pa22>
|
||||
<aircraft_pa24-250>65a95dd87096e2377dff6fe917befb8a</aircraft_pa24-250>
|
||||
<aircraft_pa28-161>02f4a01e218da00e8969d4ae52c84193</aircraft_pa28-161>
|
||||
<aircraft_PaperAirplane>2b7fbfc1efdf6ab2663e8b3d7cd3daed</aircraft_PaperAirplane>
|
||||
<aircraft_Parachutist>79da74f4e265f5290b4cf35b740663a7</aircraft_Parachutist>
|
||||
<aircraft_paraglider>6531e09545716af63e4ef5cf8feb8ec1</aircraft_paraglider>
|
||||
<aircraft_payen-pa100>2f86aa5353798f3a4202e403bfa12c02</aircraft_payen-pa100>
|
||||
<aircraft_payen-pa350cd>b6e5e2bb9985effc63bdcb2177ec681b</aircraft_payen-pa350cd>
|
||||
<aircraft_PBY-Catalina>937f55e89ec3df58c2d0339f9a1dd622</aircraft_PBY-Catalina>
|
||||
<aircraft_PC-12>70352371bec5bee2af6bfa7fceb7da5e</aircraft_PC-12>
|
||||
<aircraft_PC-21>a53d16394c2492eb0a713ecfd8dbaf8e</aircraft_PC-21>
|
||||
<aircraft_PC-6>b4fbd66018b94d83d11e3e6e7e0fac1d</aircraft_PC-6>
|
||||
<aircraft_PC-9M>7c90665c0c85a3e81b15a0ea69befeeb</aircraft_PC-9M>
|
||||
<aircraft_pc7>6eea7be83224abc9a1c3da0ce2fe6c82</aircraft_pc7>
|
||||
<aircraft_Percival-Mew-Gull>e2e0f33e2d38ad747f5c738230439ad6</aircraft_Percival-Mew-Gull>
|
||||
<aircraft_Piaggio-P166>66de4194f057e4a5248d19c5d51f88ca</aircraft_Piaggio-P166>
|
||||
<aircraft_Piaggio-Pegna-Pc-7>6944e2533d7ddca2752df6300a281b16</aircraft_Piaggio-Pegna-Pc-7>
|
||||
<aircraft_Pioneer-200>8e89696bf062126e4fe969a65ea5da1f</aircraft_Pioneer-200>
|
||||
<aircraft_Piper-PA-18>466c8c681f2c6c942668d769e79defba</aircraft_Piper-PA-18>
|
||||
<aircraft_Piper-PA-28>f7f176d0ff24d09134c43f0e0bc57d5b</aircraft_Piper-PA-28>
|
||||
<aircraft_Piper-PA-32>601545618b8fe3c210b4514a25242faf</aircraft_Piper-PA-32>
|
||||
<aircraft_pittss1c>427efb1a07d99ca6c99698de322b7d74</aircraft_pittss1c>
|
||||
<aircraft_Polikarpov-I16>3926f7b7e584ad63327a622dbac60564</aircraft_Polikarpov-I16>
|
||||
<aircraft_Pond-Racer>46e6876c63888a593dd46307b7fe0965</aircraft_Pond-Racer>
|
||||
<aircraft_Potez-630>228dab05bac8112a51265a509d28adc3</aircraft_Potez-630>
|
||||
<aircraft_Pterodactyl>aa747cdb68e4ce5bcf3fcf3a7fa9b371</aircraft_Pterodactyl>
|
||||
<aircraft_Pterosaur>fec9ddaa76f650624821341e07c32ef5</aircraft_Pterosaur>
|
||||
<aircraft_pushback>8fa3ff17dbf4f5216d2b038af30b6d4b</aircraft_pushback>
|
||||
<aircraft_Quickie>9e12e7ae2a644e77749efb5d5c4d0917</aircraft_Quickie>
|
||||
<aircraft_R22>7c66503ed0253f16ad021be72e4abfa7</aircraft_R22>
|
||||
<aircraft_R44>4db8a423cab299263b5139e0b44c4884</aircraft_R44>
|
||||
<aircraft_RAF-S-E-5>267a979bb7fcadac5698365c158f8fbf</aircraft_RAF-S-E-5>
|
||||
<aircraft_rah-66>14d8af5d3bc22ac49c5bdfcb8f63c9d8</aircraft_rah-66>
|
||||
<aircraft_rallye-MS893>7afb876e7a2e7b7bfaa8619bf0c07265</aircraft_rallye-MS893>
|
||||
<aircraft_Rascal>640eafc8068633c0e48ed3a569d18870</aircraft_Rascal>
|
||||
<aircraft_RV-6A>27238520cd1123eb6e832489ed6d5a65</aircraft_RV-6A>
|
||||
<aircraft_Ryan-Navion>e64d386ede9f5d1ab93bbe212246086f</aircraft_Ryan-Navion>
|
||||
<aircraft_Ryan-PT22>dee77f1d0d3de7f0ce6859006e0ba642</aircraft_Ryan-PT22>
|
||||
<aircraft_Ryan-SoSL>93e380e1b639a5d063be34521ef058a1</aircraft_Ryan-SoSL>
|
||||
<aircraft_S-51-Dragonfly>fa4c3f5a64725039c6ac69dc817d0861</aircraft_S-51-Dragonfly>
|
||||
<aircraft_SaabJ35F>d9c356d0f282204a451c7acb86a0df95</aircraft_SaabJ35F>
|
||||
<aircraft_santa>cd6232d913be2a512d2e8fcae806afad</aircraft_santa>
|
||||
<aircraft_Saunders-Roe-Princess>a6cef52c80b2fd0ebc43e26183d9a668</aircraft_Saunders-Roe-Princess>
|
||||
<aircraft_seahawk>792aa8e491c51b10898600e5fce883fd</aircraft_seahawk>
|
||||
<aircraft_SeaVixen>21e9817040f8a9ab9160745591915f28</aircraft_SeaVixen>
|
||||
<aircraft_SenecaII>a769ea7ad74deb9a793966b98be001a0</aircraft_SenecaII>
|
||||
<aircraft_sf25b>664ad64136e6958a39b292ec54607037</aircraft_sf25b>
|
||||
<aircraft_sgs233>86308422b554356c850dffb9d0c90b2a</aircraft_sgs233>
|
||||
<aircraft_Short-Stirling>96a0604d6e963d36a35e919f3ca01310</aircraft_Short-Stirling>
|
||||
<aircraft_Short_Empire>868a7faef6fb3bca64a0bcb19b32840c</aircraft_Short_Empire>
|
||||
<aircraft_shuttle>4e24a9c27d36afaec32256a211bef2c3</aircraft_shuttle>
|
||||
<aircraft_SIAI-Marchetti-S.205R>2771caeaa310c1a6970e95c0ea403f3a</aircraft_SIAI-Marchetti-S.205R>
|
||||
<aircraft_SIAI-Marchetti-SF.260>dcab556a830e493703640fd1fdad70eb</aircraft_SIAI-Marchetti-SF.260>
|
||||
<aircraft_Sikorsky-76C>679c00028ac62b9aa3368840147170b5</aircraft_Sikorsky-76C>
|
||||
<aircraft_Sikorsky-S38>3856921a90f947ec2f3e70fa23a1f6ea</aircraft_Sikorsky-S38>
|
||||
<aircraft_Sikorsky-S58>9abb2fc4e373ab4431920fdaf45d8a87</aircraft_Sikorsky-S58>
|
||||
<aircraft_Sky-sportster>d9b9c033f30335a81558a201810f862e</aircraft_Sky-sportster>
|
||||
<aircraft_Skyranger>0a7450c02b7ff3de085087668ba975e7</aircraft_Skyranger>
|
||||
<aircraft_Skyvan>712723a74eaa5f47d905c5938d1ecfa3</aircraft_Skyvan>
|
||||
<aircraft_SM-55>dad894bca78456b5e2ba2e2005d2f29a</aircraft_SM-55>
|
||||
<aircraft_sm79>626844492e56226455fa3a399f41c9e9</aircraft_sm79>
|
||||
<aircraft_snowplow>e9eb491ec0bf4d3ad2c2690b94a9be95</aircraft_snowplow>
|
||||
<aircraft_Socata-ST10>37b95c63434f398743ebbdfd2bee8089</aircraft_Socata-ST10>
|
||||
<aircraft_sopwithCamel>7792f06b71703a39936f75eb1f0f1e05</aircraft_sopwithCamel>
|
||||
<aircraft_SpaceShip-One>d082a2f287fc96ade10753e47cff2977</aircraft_SpaceShip-One>
|
||||
<aircraft_SpaceShuttle>39c46f24941da46177122a83f119e8b7</aircraft_SpaceShuttle>
|
||||
<aircraft_SPAD-VII>f250ae8d2a2b28eb4f736aa28e8f6abf</aircraft_SPAD-VII>
|
||||
<aircraft_Spitfire>ca055bf7c4d39b07a40bb465ad635146</aircraft_Spitfire>
|
||||
<aircraft_spitfireIX>690b3c6a74770738d2d5173fefb48e61</aircraft_spitfireIX>
|
||||
<aircraft_sr20>cbecc0a364fbe6a7aa0c0ea683ce62ea</aircraft_sr20>
|
||||
<aircraft_SR71-BlackBird>29a5495e10aa160cf94b0b9a06e94b48</aircraft_SR71-BlackBird>
|
||||
<aircraft_Stampe-SV4>54ed408f46a6ae86d2b609c58caa2348</aircraft_Stampe-SV4>
|
||||
<aircraft_Starship>078d68204b7b7d11103f97d6067693d2</aircraft_Starship>
|
||||
<aircraft_Stearman>791b0a572eba95a6d0fcfdee605b284e</aircraft_Stearman>
|
||||
<aircraft_Stieglitz>7c5d4939a29bbde445fa5a51a806a600</aircraft_Stieglitz>
|
||||
<aircraft_Stiletto>f469bf3d05e34508c4644c9f21adde9b</aircraft_Stiletto>
|
||||
<aircraft_Storch>987d5891ea899b92697b3dbae69f4290</aircraft_Storch>
|
||||
<aircraft_Su-25>fc53b9f9e774bf455099a41e44f163e0</aircraft_Su-25>
|
||||
<aircraft_SU-37>f0f2e74ef26520d16f11c26adcfa7244</aircraft_SU-37>
|
||||
<aircraft_Submarine_Scout>57853593a2c72148f0de00faa70d67d4</aircraft_Submarine_Scout>
|
||||
<aircraft_Super-Etendard>ea86ee06b4d358790036fe22ae8673a3</aircraft_Super-Etendard>
|
||||
<aircraft_Super-Frelon>92a9c71fb1666816273b3283e7d02504</aircraft_Super-Frelon>
|
||||
<aircraft_superguppySGT>86c50734cf3e657a4bb0646ae4848af3</aircraft_superguppySGT>
|
||||
<aircraft_Supermarine-S.6B>b59d6790040c27853338b680067edc52</aircraft_Supermarine-S.6B>
|
||||
<aircraft_Superwal>92158d7e55f4a892b3d3640cf0b254f0</aircraft_Superwal>
|
||||
<aircraft_T-4>8518cfd8bec8278d0681f67dc7293906</aircraft_T-4>
|
||||
<aircraft_T-50>2e45346a0f377bcb6adc59be3c05d72a</aircraft_T-50>
|
||||
<aircraft_T37>7607a3732fee1ad3b43d44875764afe0</aircraft_T37>
|
||||
<aircraft_T38>1039def0bf9d28ef2cc3a4b5649a9bcb</aircraft_T38>
|
||||
<aircraft_TBM-Avenger>3118e96ceee1f63c4c5f916e48a62e3c</aircraft_TBM-Avenger>
|
||||
<aircraft_Tecnam-P2006T>45daae280d68e757730051ce96933435</aircraft_Tecnam-P2006T>
|
||||
<aircraft_Tecnam-P2010>d27cfef60c88f2785585db762aff50c0</aircraft_Tecnam-P2010>
|
||||
<aircraft_Tecnam-P92>eefbe319cbc34fed4d63ace54f2fc1c8</aircraft_Tecnam-P92>
|
||||
<aircraft_Tigre>806acc4c1616d1d940e61d27737e39f6</aircraft_Tigre>
|
||||
<aircraft_TU-114>f6ce2c5a24ea1545e1d22956017e31b0</aircraft_TU-114>
|
||||
<aircraft_Tu-134>66cee3c0d3e34c4bd97599c1a633c7db</aircraft_Tu-134>
|
||||
<aircraft_TU-95>71c35b11bb1662bd612bc8e3e21232e5</aircraft_TU-95>
|
||||
<aircraft_Tu-SB2bis-M103>50cd266f7a98b7d19ec75b9be804e715</aircraft_Tu-SB2bis-M103>
|
||||
<aircraft_tu154>e5fd32dabb3412be5797805b5b00c002</aircraft_tu154>
|
||||
<aircraft_tu154b>7a7bd91ea1d3c40e3f52a3453f6d5789</aircraft_tu154b>
|
||||
<aircraft_UH-1>0c2692680244c3848e16c5f5cc6e525f</aircraft_UH-1>
|
||||
<aircraft_UH-60>3126bd7f0dc24fb15fbaa6516bbc08d9</aircraft_UH-60>
|
||||
<aircraft_V22-Osprey>1b1eb3803d01ea5dbfaee1836c9efb02</aircraft_V22-Osprey>
|
||||
<aircraft_Velocity-XL>85770badb88a7a876bb828718cc4a30f</aircraft_Velocity-XL>
|
||||
<aircraft_Vickers-Vanguard>1c9f328d29ee7e2453bf30a6b05939f4</aircraft_Vickers-Vanguard>
|
||||
<aircraft_Vickers-Vimy>5d6709607fc95b3867fc491c0fe5e5e3</aircraft_Vickers-Vimy>
|
||||
<aircraft_victor>ee0b3f5284765e02f1357f1cf7071ee1</aircraft_victor>
|
||||
<aircraft_VMX22-Osprey>39f6e98033e45e3b599cdff5b72d7328</aircraft_VMX22-Osprey>
|
||||
<aircraft_Vostok-1>9dc57923ec3e984723338db44460b4fe</aircraft_Vostok-1>
|
||||
<aircraft_vulcanb2>f2eabbfcc31b0ab183fb4b91ba4f19c4</aircraft_vulcanb2>
|
||||
<aircraft_Westland-Whirlwind>cce4ae63928058699f87b61a9604d1b1</aircraft_Westland-Whirlwind>
|
||||
<aircraft_wrightFlyer1903>04d855def138064915a06781720d33cc</aircraft_wrightFlyer1903>
|
||||
<aircraft_X15>a4e382d1493412f3d5cb1e06f9ec9b88</aircraft_X15>
|
||||
<aircraft_x24b>c209d368e99561002a43697c0496d87d</aircraft_x24b>
|
||||
<aircraft_XB-70>749a85a21354df350ddb8c50a5561b22</aircraft_XB-70>
|
||||
<aircraft_XP-67>83cebd2f3cf663215a8bb97dcd38b13e</aircraft_XP-67>
|
||||
<aircraft_Yak-130>b867555c6e06befe0715665c2a10931d</aircraft_Yak-130>
|
||||
<aircraft_Yak-18T>e514c7719ac869a86ff466a22de3554d</aircraft_Yak-18T>
|
||||
<aircraft_Yak-23>c1e1b2a685c99e73720bca83f0c01405</aircraft_Yak-23>
|
||||
<aircraft_Yak-36>2db3c206f581c88c329567013d16aca3</aircraft_Yak-36>
|
||||
<aircraft_yak3>62ff0d85b3b5d71c2854623bcad155cb</aircraft_yak3>
|
||||
<aircraft_YardStik>44106df1f8f1145bb7f9d465a3d85233</aircraft_YardStik>
|
||||
<aircraft_YF-23>bf82709deb10a369d7eaa23d623f631a</aircraft_YF-23>
|
||||
<aircraft_YS-11>f32ab303e103ceeb6ca46926f2c1f510</aircraft_YS-11>
|
||||
<aircraft_ZF_Navy_free_balloon>d6d11bb00006f7b6da2f4939ef06af23</aircraft_ZF_Navy_free_balloon>
|
||||
<aircraft_ZivkoEdge>01893b6c69d97c42f223d95ff8595ff7</aircraft_ZivkoEdge>
|
||||
<aircraft_Zlin-50lx>ec52deb7d44c5186c324ac0532ff2bc8</aircraft_Zlin-50lx>
|
||||
<aircraft_ZLT-NT>60ffdd2bd30dc4a02dfca2ced49bbec5</aircraft_ZLT-NT>
|
||||
<aircraft_IL-76>4a8d5a29427d179a6b0566d79555cbad</aircraft_IL-76>
|
||||
<aircraft_SuperGuepard912>eedc5b614bac903c03dfdd287dc0123a</aircraft_SuperGuepard912>
|
||||
<aircraft_Heinkel-He-111Z>e1f2b5c9d0a65366efd6f4840725d3c5</aircraft_Heinkel-He-111Z>
|
||||
<aircraft_c182s>e307c8d98edfad2432ceea160a5b455d</aircraft_c182s>
|
||||
<aircraft_Cessna-L19>3c40924714e6511a2c7c2e8d64a22e4c</aircraft_Cessna-L19>
|
||||
<aircraft_Boomerang>e9c38c20924902a8cb168d69adf028c5</aircraft_Boomerang>
|
||||
<aircraft_Arsenal-Delanne-10>e01bdd83f13783e98eae4d89d7c55405</aircraft_Arsenal-Delanne-10>
|
||||
</PropertyList>
|
||||
24
catalog/fgaddon-catalog/template.xml
Normal file
24
catalog/fgaddon-catalog/template.xml
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--Template catalog - copy and modify for your site as required-->
|
||||
<PropertyList>
|
||||
<template>
|
||||
<version n="0">3.4.*</version>
|
||||
<version n="1">3.5.*</version>
|
||||
<version n="2">3.6.*</version>
|
||||
<version n="3">3.7.*</version>
|
||||
<version n="4">2016.1.*</version>
|
||||
<version n="5">2016.*.*</version>
|
||||
<version n="6">2017.*.*</version>
|
||||
<id>org.flightgear.fgaddon</id>
|
||||
<license>GPL</license>
|
||||
<url>http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/catalog.xml</url>
|
||||
<name>FlightGear Aircraft Distribution From fgaddon</name>
|
||||
<description>This hangar provides aircraft officially supported and maintained by the FlightGear project, under a free-software license.</description>
|
||||
<de>
|
||||
<description>Auf Deutsch</description>
|
||||
</de>
|
||||
<fr>
|
||||
<description>En Francais</description>
|
||||
</fr>
|
||||
</template>
|
||||
</PropertyList>
|
||||
5
catalog/fgaddon-catalog/zip-excludes.lst
Normal file
5
catalog/fgaddon-catalog/zip-excludes.lst
Normal file
@@ -0,0 +1,5 @@
|
||||
*/.svn/*
|
||||
*.xcf
|
||||
*.blend
|
||||
*.psd
|
||||
*~
|
||||
@@ -144,6 +144,22 @@ class Node(object):
|
||||
|
||||
return n;
|
||||
|
||||
class ParseState:
|
||||
def __init__(self):
|
||||
self._counters = {}
|
||||
|
||||
def getNextIndex(self, name):
|
||||
if name in self._counters:
|
||||
self._counters[name] += 1
|
||||
else:
|
||||
self._counters[name] = 0
|
||||
return self._counters[name]
|
||||
|
||||
def recordExplicitIndex(self, name, index):
|
||||
if not name in self._counters:
|
||||
self._counters[name] = index
|
||||
else:
|
||||
self._counters[name] = max(self._counters[name], index)
|
||||
|
||||
class PropsHandler(handler.ContentHandler):
|
||||
def __init__(self, root = None, path = None, includePaths = []):
|
||||
@@ -152,6 +168,7 @@ class PropsHandler(handler.ContentHandler):
|
||||
self._basePath = os.path.dirname(path)
|
||||
self._includes = includePaths
|
||||
self._locator = None
|
||||
self._stateStack = [ParseState()]
|
||||
|
||||
if root is None:
|
||||
# make a nameless root node
|
||||
@@ -164,20 +181,27 @@ class PropsHandler(handler.ContentHandler):
|
||||
def startElement(self, name, attrs):
|
||||
self._content = None
|
||||
if (name == 'PropertyList'):
|
||||
# still need to handle includes on the root element
|
||||
if 'include' in attrs.keys():
|
||||
self.handleInclude(attrs['include'])
|
||||
return
|
||||
|
||||
|
||||
currentState = self._stateStack[-1]
|
||||
if 'n' in attrs.keys():
|
||||
try:
|
||||
index = int(attrs['n'])
|
||||
except:
|
||||
print "Invalid index at line:", self._locator.getLineNumber(), "of", self._path
|
||||
self._current = self._current.addChild(name)
|
||||
return
|
||||
raise IndexError("Invalid index at line:", self._locator.getLineNumber(), "of", self._path)
|
||||
|
||||
currentState.recordExplicitIndex(name, index)
|
||||
self._current = self._current.getChild(name, index, create=True)
|
||||
else:
|
||||
self._current = self._current.addChild(name)
|
||||
index = currentState.getNextIndex(name)
|
||||
# important we use getChild here, so that includes are resolved
|
||||
# correctly
|
||||
self._current = self._current.getChild(name, index, create=True)
|
||||
|
||||
self._stateStack.append(ParseState())
|
||||
|
||||
if 'include' in attrs.keys():
|
||||
self.handleInclude(attrs['include'])
|
||||
@@ -228,6 +252,7 @@ class PropsHandler(handler.ContentHandler):
|
||||
self._current = self._current.parent
|
||||
self._content = None
|
||||
self._currentTy = None
|
||||
self._stateStack.pop()
|
||||
|
||||
|
||||
def parsePropsBool(self, content):
|
||||
11
catalog/testData/bad-index.xml
Normal file
11
catalog/testData/bad-index.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<PropertyList>
|
||||
<sim>
|
||||
<!-- found in the F-15 XML -->
|
||||
<uhf n="[0]">
|
||||
<frequencies>
|
||||
<selected-mhz type="int">225000</selected-mhz>
|
||||
</frequencies>
|
||||
</uhf>
|
||||
</sim>
|
||||
</PropertyList>
|
||||
25
catalog/testData/props1.xml
Normal file
25
catalog/testData/props1.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<PropertyList>
|
||||
<value type="int">42</value>
|
||||
|
||||
<thing>
|
||||
<value>apple</value>
|
||||
</thing>
|
||||
|
||||
<thing>
|
||||
<value>lemon</value>
|
||||
</thing>
|
||||
|
||||
<thing>
|
||||
<value>pear</value>
|
||||
</thing>
|
||||
|
||||
<!-- ensure explicit indexing works -->
|
||||
<sub>
|
||||
<value n="1">a</value>
|
||||
<value n="3">b</value>
|
||||
<value n="99">c</value>
|
||||
<value>d</value> <!-- should be assigned n=100 -->
|
||||
</sub>
|
||||
|
||||
</PropertyList>
|
||||
20
catalog/testData/props2.xml
Normal file
20
catalog/testData/props2.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<PropertyList include="root-include.xml">
|
||||
<value type="int">33</value>
|
||||
|
||||
<thing>
|
||||
<value>apple</value>
|
||||
</thing>
|
||||
|
||||
<thing>
|
||||
<value>lemon</value>
|
||||
</thing>
|
||||
|
||||
|
||||
<sub include ="sub-include.xml">
|
||||
<!-- different index to avoid being included over -->
|
||||
<widget n="100" type="int">99</widget>
|
||||
|
||||
</sub>
|
||||
|
||||
</PropertyList>
|
||||
22
catalog/testData/root-include.xml
Normal file
22
catalog/testData/root-include.xml
Normal file
@@ -0,0 +1,22 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<PropertyList>
|
||||
<value type="int">42</value>
|
||||
<value type="int">43</value>
|
||||
<value type="int">44</value>
|
||||
|
||||
<sim>
|
||||
<views>
|
||||
</views>
|
||||
|
||||
<preview>
|
||||
</preview>
|
||||
|
||||
<preview>
|
||||
</preview>
|
||||
</sim>
|
||||
|
||||
<payload>
|
||||
<weight>
|
||||
</weight>
|
||||
</payload>
|
||||
</PropertyList>
|
||||
6
catalog/testData/sub-include.xml
Normal file
6
catalog/testData/sub-include.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<PropertyList>
|
||||
<widget type="int">42</widget>
|
||||
<widget type="int">43</widget>
|
||||
<widget type="int">44</widget>
|
||||
</PropertyList>
|
||||
61
catalog/test_sgprops.py
Executable file
61
catalog/test_sgprops.py
Executable file
@@ -0,0 +1,61 @@
|
||||
import unittest
|
||||
|
||||
import types
|
||||
import sgprops
|
||||
|
||||
class SGProps(unittest.TestCase):
|
||||
|
||||
def test_parse(self):
|
||||
parsed = sgprops.readProps("testData/props1.xml")
|
||||
|
||||
self.assertEqual(parsed.getValue("value"), 42)
|
||||
self.assertEqual(type(parsed.getValue("value")), types.IntType)
|
||||
|
||||
valNode = parsed.getChild("value")
|
||||
self.assertEqual(valNode.parent, parsed)
|
||||
self.assertEqual(valNode.name, "value")
|
||||
|
||||
self.assertEqual(valNode.value, 42)
|
||||
self.assertEqual(type(valNode.value), types.IntType)
|
||||
|
||||
with self.assertRaises(IndexError):
|
||||
missingNode = parsed.getChild("missing")
|
||||
|
||||
things = parsed.getChildren("thing")
|
||||
self.assertEqual(len(things), 3)
|
||||
|
||||
self.assertEqual(things[0], parsed.getChild("thing", 0));
|
||||
self.assertEqual(things[1], parsed.getChild("thing", 1));
|
||||
self.assertEqual(things[2], parsed.getChild("thing", 2));
|
||||
|
||||
self.assertEqual(things[0].getValue("value"), "apple");
|
||||
self.assertEqual(things[1].getValue("value"), "lemon");
|
||||
self.assertEqual(things[2].getValue("value"), "pear");
|
||||
|
||||
def test_create(self):
|
||||
pass
|
||||
|
||||
|
||||
def test_invalidIndex(self):
|
||||
with self.assertRaises(IndexError):
|
||||
parsed = sgprops.readProps("testData/bad-index.xml")
|
||||
|
||||
def test_include(self):
|
||||
parsed = sgprops.readProps("testData/props2.xml")
|
||||
|
||||
# test that value in main file over-rides the one in the include
|
||||
self.assertEqual(parsed.getValue("value"), 33)
|
||||
|
||||
# but these come from the included file
|
||||
self.assertEqual(parsed.getValue("value[1]"), 43)
|
||||
self.assertEqual(parsed.getValue("value[2]"), 44)
|
||||
|
||||
subNode = parsed.getChild("sub")
|
||||
widgets = subNode.getChildren("widget")
|
||||
self.assertEqual(len(widgets), 4)
|
||||
|
||||
self.assertEqual(widgets[2].value, 44)
|
||||
self.assertEqual(widgets[3].value, 99)
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
455
catalog/update-catalog.py
Executable file
455
catalog/update-catalog.py
Executable file
@@ -0,0 +1,455 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import argparse
|
||||
import datetime
|
||||
import hashlib # md5
|
||||
import lxml.etree as ET
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import time
|
||||
import sgprops
|
||||
import sys
|
||||
|
||||
CATALOG_VERSION = 4
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--update", help="Update/pull SCM source",
|
||||
action="store_true")
|
||||
parser.add_argument("--no-update",
|
||||
help="Disable updating from SCM source",
|
||||
action="store_true")
|
||||
parser.add_argument("--clean", help="Force regeneration of all zip files",
|
||||
action="store_true")
|
||||
parser.add_argument("dir", help="Catalog directory")
|
||||
args = parser.parse_args()
|
||||
|
||||
includes = []
|
||||
|
||||
# xml node (robust) get text helper
|
||||
def get_xml_text(e):
|
||||
if e != None and e.text != None:
|
||||
return e.text
|
||||
else:
|
||||
return ''
|
||||
|
||||
# create an xml node with text content
|
||||
def make_xml_leaf(name, text):
|
||||
leaf = ET.Element(name)
|
||||
if text != None:
|
||||
if isinstance(text, (int, long)):
|
||||
leaf.text = str(text)
|
||||
else:
|
||||
leaf.text = text
|
||||
else:
|
||||
leaf.text = ''
|
||||
return leaf
|
||||
|
||||
# return all available aircraft information from the set file as a
|
||||
# dict
|
||||
def scan_set_file(aircraft_dir, set_file):
|
||||
global includes
|
||||
|
||||
base_file = os.path.basename(set_file)
|
||||
base_id = base_file[:-8]
|
||||
set_path = os.path.join(aircraft_dir, set_file)
|
||||
|
||||
local_includes = includes
|
||||
local_includes.append(aircraft_dir)
|
||||
root_node = sgprops.readProps(set_path, includePaths = local_includes)
|
||||
|
||||
if not root_node.hasChild("sim"):
|
||||
return None
|
||||
|
||||
sim_node = root_node.getChild("sim")
|
||||
if sim_node == None:
|
||||
return None
|
||||
|
||||
variant = {}
|
||||
variant['name'] = sim_node.getValue("description", None)
|
||||
variant['status'] = sim_node.getValue("status", None)
|
||||
variant['author'] = sim_node.getValue("author", None)
|
||||
variant['description'] = sim_node.getValue("long-description", None)
|
||||
variant['id'] = base_id
|
||||
|
||||
# allow -set.xml files to declare themselves as primary.
|
||||
# we use this avoid needing a variant-of in every other -set.xml
|
||||
variant['primary-set'] = sim_node.getValue('primary-set', False)
|
||||
|
||||
# extract and record previews for each variant
|
||||
if sim_node.hasChild('previews'):
|
||||
print "has previews ..."
|
||||
variant['previews'] = extract_previews(sim_node.getChild('previews'), aircraft_dir)
|
||||
|
||||
if sim_node.hasChild('rating'):
|
||||
rating_node = sim_node.getChild("rating")
|
||||
variant['rating_FDM'] = rating_node.getValue("FDM", 0)
|
||||
variant['rating_systems'] = rating_node.getValue("systems", 0)
|
||||
variant['rating_cockpit'] = rating_node.getValue("cockpit", 0)
|
||||
variant['rating_model'] = rating_node.getValue("model", 0)
|
||||
|
||||
variant['variant-of'] = sim_node.getValue("variant-of", None)
|
||||
#print ' ', variant
|
||||
return variant
|
||||
|
||||
def extract_previews(previews_node, aircraft_dir):
|
||||
result = []
|
||||
for node in previews_node.getChildren("preview"):
|
||||
previewType = node.getValue("type", None)
|
||||
previewPath = node.getValue("path", None)
|
||||
|
||||
# check path exists in base-name-dir
|
||||
fullPath = os.path.join(aircraft_dir, previewPath)
|
||||
if not os.path.isfile(fullPath):
|
||||
print "Bad preview path, skipping:" + fullPath
|
||||
continue
|
||||
result.append({'type':previewType, 'path':previewPath})
|
||||
|
||||
return result
|
||||
|
||||
# scan all the -set.xml files in an aircraft directory. Returns a
|
||||
# package dict and a list of variants.
|
||||
def scan_aircraft_dir(aircraft_dir):
|
||||
# old way of finding the master aircraft: it's the only one whose
|
||||
# variant-of is empty. All the others have an actual value
|
||||
# newer alternative is to specify one -set.xml as the primary. All the
|
||||
# others are therefore variants.
|
||||
setDicts = []
|
||||
found_master = False
|
||||
package = None
|
||||
|
||||
files = os.listdir(aircraft_dir)
|
||||
for file in sorted(files, key=lambda s: s.lower()):
|
||||
if file.endswith('-set.xml'):
|
||||
try:
|
||||
d = scan_set_file(aircraft_dir, file)
|
||||
if d == None:
|
||||
continue
|
||||
except:
|
||||
print "Skipping set file since couldn't be parsed:", os.path.join(aircraft_dir, file), sys.exc_info()[0]
|
||||
continue
|
||||
|
||||
setDicts.append(d)
|
||||
if d['primary-set']:
|
||||
found_master = True
|
||||
package = d
|
||||
|
||||
# didn't find a dict identified explicitly as the primary, look for one
|
||||
# with an undefined variant-of
|
||||
if not found_master:
|
||||
for d in setDicts:
|
||||
if d['variant-of'] == '':
|
||||
found_master = True
|
||||
package = d
|
||||
break
|
||||
|
||||
if not found_master:
|
||||
if len(setDicts) > 1:
|
||||
print "Warning, no explicit primary set.xml in " + aircraft_dir
|
||||
# use the first one
|
||||
package = setDicts[0]
|
||||
|
||||
# variants is just all the set dicts except the master
|
||||
variants = setDicts
|
||||
variants.remove(package)
|
||||
return (package, variants)
|
||||
|
||||
# use svn commands to report the last change date within dir
|
||||
def last_change_date_svn(dir):
|
||||
command = [ 'svn', 'info', dir ]
|
||||
result = subprocess.check_output( command )
|
||||
match = re.search('Last Changed Date: (\d+)\-(\d+)\-(\d+)', result)
|
||||
if match:
|
||||
rev_str = match.group(1) + match.group(2) + match.group(3)
|
||||
return int(rev_str)
|
||||
|
||||
# find the most recent mtime within a directory subtree
|
||||
def scan_dir_for_change_date_mtime(path):
|
||||
maxsec = 0
|
||||
names = os.listdir(path)
|
||||
for name in names:
|
||||
fullname = os.path.join(path, name)
|
||||
if name == '.' or name == '..':
|
||||
pass
|
||||
elif os.path.isdir( fullname ):
|
||||
mtime = scan_dir_for_change_date_mtime( fullname )
|
||||
if mtime > maxsec:
|
||||
maxsec = mtime
|
||||
else:
|
||||
mtime = os.path.getmtime( fullname )
|
||||
if mtime > maxsec:
|
||||
maxsec = mtime
|
||||
return maxsec
|
||||
|
||||
def make_aircraft_zip(repo_path, name, zip_file):
|
||||
print "Updating:", name + '.zip'
|
||||
savedir = os.getcwd()
|
||||
os.chdir(repo_path)
|
||||
if os.path.exists(zip_file):
|
||||
os.remove(zip_file)
|
||||
command = ['zip', '-rq', '-9']
|
||||
if os.path.exists(zip_excludes):
|
||||
command += ['-x@' + zip_excludes]
|
||||
else:
|
||||
print "warning: no zip-excludes.lst file provided", zip_excludes
|
||||
command += [zip_file, name]
|
||||
subprocess.call(command)
|
||||
os.chdir(savedir)
|
||||
|
||||
def get_md5sum(file):
|
||||
f = open(file, 'r')
|
||||
md5sum = hashlib.md5(f.read()).hexdigest()
|
||||
f.close()
|
||||
return md5sum
|
||||
|
||||
def append_preview_nodes(node, variant, download_base, package_name):
|
||||
if not 'previews' in variant:
|
||||
return
|
||||
|
||||
for preview in variant['previews']:
|
||||
preview_node = ET.Element('preview')
|
||||
preview_url = download_base + 'previews/' + package_name + '_' + preview['path']
|
||||
preview_node.append( make_xml_leaf('type', preview['type']) )
|
||||
preview_node.append( make_xml_leaf('url', preview_url) )
|
||||
preview_node.append( make_xml_leaf('path', preview['path']) )
|
||||
node.append(preview_node)
|
||||
|
||||
def copy_previews_for_variant(variant, package_name, package_dir, previews_dir):
|
||||
if not 'previews' in variant:
|
||||
return
|
||||
|
||||
for preview in variant['previews']:
|
||||
preview_src = os.path.join(package_dir, preview['path'])
|
||||
preview_dst = os.path.join(previews_dir, package_name + '_' + preview['path'])
|
||||
#print preview_src, preview_dst, preview['path']
|
||||
dir = os.path.dirname(preview_dst)
|
||||
if not os.path.isdir(dir):
|
||||
os.makedirs(dir)
|
||||
if os.path.exists(preview_src):
|
||||
shutil.copy2(preview_src, preview_dst)
|
||||
|
||||
def copy_previews_for_package(package, variants, package_name, package_dir, previews_dir):
|
||||
copy_previews_for_variant(package, package_name, package_dir, previews_dir)
|
||||
for v in variants:
|
||||
copy_previews_for_variant(v, package_name, package_dir, previews_dir)
|
||||
|
||||
#def get_file_stats(file):
|
||||
# f = open(file, 'r')
|
||||
# md5 = hashlib.md5(f.read()).hexdigest()
|
||||
# file_size = os.path.getsize(file)
|
||||
# return (md5, file_size)
|
||||
|
||||
if not os.path.isdir(args.dir):
|
||||
print "A valid catalog directory must be provided"
|
||||
exit(0)
|
||||
|
||||
parser = ET.XMLParser(remove_blank_text=True)
|
||||
|
||||
config_file = os.path.join(args.dir, 'catalog.config.xml')
|
||||
config = ET.parse(config_file, parser)
|
||||
config_node = config.getroot()
|
||||
|
||||
template_file = os.path.join(args.dir, 'template.xml')
|
||||
template = ET.parse(template_file, parser)
|
||||
template_root = template.getroot()
|
||||
template_node = template_root.find('template')
|
||||
|
||||
md5sum_file = os.path.join(args.dir, 'md5sum.xml')
|
||||
if os.path.exists(md5sum_file):
|
||||
md5sum_tree = ET.parse(md5sum_file, parser)
|
||||
md5sum_root = md5sum_tree.getroot()
|
||||
else:
|
||||
md5sum_root = ET.Element('PropertyList')
|
||||
md5sum_tree = ET.ElementTree(md5sum_root)
|
||||
|
||||
scm_list = config_node.findall('scm')
|
||||
upload_node = config_node.find('upload')
|
||||
download_base = get_xml_text(config_node.find('download-url'))
|
||||
output_dir = get_xml_text(config_node.find('local-output'))
|
||||
if output_dir == '':
|
||||
output_dir = os.path.join(args.dir, 'output')
|
||||
if not os.path.isdir(output_dir):
|
||||
os.mkdir(output_dir)
|
||||
|
||||
thumbnail_dir = os.path.join(output_dir, 'thumbnails')
|
||||
if not os.path.isdir(thumbnail_dir):
|
||||
os.mkdir(thumbnail_dir)
|
||||
|
||||
previews_dir = os.path.join(output_dir, 'previews')
|
||||
if not os.path.isdir(previews_dir):
|
||||
os.mkdir(previews_dir)
|
||||
|
||||
tmp = os.path.join(args.dir, 'zip-excludes.lst')
|
||||
zip_excludes = os.path.realpath(tmp)
|
||||
|
||||
for i in config_node.findall("include-dir"):
|
||||
path = get_xml_text(i)
|
||||
if not os.path.exists(path):
|
||||
print "Skipping missing include path:", path
|
||||
continue
|
||||
includes.append(path)
|
||||
|
||||
# freshen repositories
|
||||
if args.no_update:
|
||||
print 'Skipping repository updates.'
|
||||
else:
|
||||
cwd = os.getcwd()
|
||||
for scm in scm_list:
|
||||
repo_type = get_xml_text(scm.find('type'))
|
||||
repo_path = get_xml_text(scm.find('path'))
|
||||
includes.append(repo_path)
|
||||
|
||||
if repo_type == 'svn':
|
||||
print 'SVN update:', repo_path
|
||||
subprocess.call(['svn', 'update', repo_path])
|
||||
elif repo_type == 'git':
|
||||
print 'GIT pull:', repo_path
|
||||
os.chdir(repo_path)
|
||||
subprocess.call(['git','pull'])
|
||||
elif repo_type == 'no-scm':
|
||||
print "No update of unmannaged files:", repo_path
|
||||
else:
|
||||
print "Unknown scm type:", scm, repo_path
|
||||
os.chdir(cwd)
|
||||
|
||||
# names of zip files we want (so we can identify/remove orphans)
|
||||
valid_zips = []
|
||||
|
||||
# create the catalog tree
|
||||
catalog_node = ET.Element('PropertyList')
|
||||
catalog_root = ET.ElementTree(catalog_node)
|
||||
|
||||
# include the template configuration
|
||||
for child in template_node:
|
||||
catalog_node.append(child)
|
||||
|
||||
# scan repositories for catalog information
|
||||
for scm in scm_list:
|
||||
repo_type = get_xml_text(scm.find('type'))
|
||||
repo_path = get_xml_text(scm.find('path'))
|
||||
skip_nodes = scm.findall('skip')
|
||||
skip_list = []
|
||||
for s in skip_nodes:
|
||||
skip_list.append(get_xml_text(s))
|
||||
print 'skip list:', skip_list
|
||||
names = os.listdir(repo_path)
|
||||
for name in sorted(names, key=lambda s: s.lower()):
|
||||
if name in skip_list:
|
||||
print "skipping:", name
|
||||
continue
|
||||
|
||||
aircraft_dir = os.path.join(repo_path, name)
|
||||
if os.path.isdir(aircraft_dir):
|
||||
print "%s:" % name,
|
||||
(package, variants) = scan_aircraft_dir(aircraft_dir)
|
||||
if package == None:
|
||||
print "skipping:", name, "(no -set.xml files)"
|
||||
continue
|
||||
#print "package:", package
|
||||
#print "variants:", variants
|
||||
package_node = ET.Element('package')
|
||||
package_node.append( make_xml_leaf('name', package['name']) )
|
||||
package_node.append( make_xml_leaf('status', package['status']) )
|
||||
package_node.append( make_xml_leaf('author', package['author']) )
|
||||
package_node.append( make_xml_leaf('description', package['description']) )
|
||||
if 'rating_FDM' in package or 'rating_systems' in package \
|
||||
or 'rating_cockpit' in package or 'rating_model' in package:
|
||||
rating_node = ET.Element('rating')
|
||||
package_node.append(rating_node)
|
||||
rating_node.append( make_xml_leaf('FDM',
|
||||
package['rating_FDM']) )
|
||||
rating_node.append( make_xml_leaf('systems',
|
||||
package['rating_systems']) )
|
||||
rating_node.append( make_xml_leaf('cockpit',
|
||||
package['rating_cockpit']) )
|
||||
rating_node.append( make_xml_leaf('model',
|
||||
package['rating_model']) )
|
||||
package_node.append( make_xml_leaf('id', package['id']) )
|
||||
for variant in variants:
|
||||
variant_node = ET.Element('variant')
|
||||
package_node.append(variant_node)
|
||||
variant_node.append( make_xml_leaf('id', variant['id']) )
|
||||
variant_node.append( make_xml_leaf('name', variant['name']) )
|
||||
if 'description' in variant:
|
||||
variant_node.append( make_xml_leaf('description', variant['description']) )
|
||||
|
||||
if 'author' in variant:
|
||||
variant_node.append( make_xml_leaf('author', variant['author']) )
|
||||
|
||||
append_preview_nodes(variant_node, variant, download_base, name)
|
||||
|
||||
package_node.append( make_xml_leaf('dir', name) )
|
||||
if not download_base.endswith('/'):
|
||||
download_base += '/'
|
||||
download_url = download_base + name + '.zip'
|
||||
thumbnail_url = download_base + 'thumbnails/' + name + '_thumbnail.jpg'
|
||||
package_node.append( make_xml_leaf('url', download_url) )
|
||||
package_node.append( make_xml_leaf('thumbnail', thumbnail_url) )
|
||||
|
||||
append_preview_nodes(package_node, package, download_base, name)
|
||||
|
||||
# todo: url (download), thumbnail (download url)
|
||||
|
||||
# get cached md5sum if it exists
|
||||
md5sum = get_xml_text(md5sum_root.find(str('aircraft_' + name)))
|
||||
|
||||
# now do the packaging and rev number stuff
|
||||
dir_mtime = scan_dir_for_change_date_mtime(aircraft_dir)
|
||||
if repo_type == 'svn':
|
||||
rev = last_change_date_svn(aircraft_dir)
|
||||
else:
|
||||
d = datetime.datetime.utcfromtimestamp(dir_mtime)
|
||||
rev = d.strftime("%Y%m%d")
|
||||
package_node.append( make_xml_leaf('revision', rev) )
|
||||
#print "rev:", rev
|
||||
#print "dir mtime:", dir_mtime
|
||||
zipfile = os.path.join( output_dir, name + '.zip' )
|
||||
valid_zips.append(name + '.zip')
|
||||
if not os.path.exists(zipfile) \
|
||||
or dir_mtime > os.path.getmtime(zipfile) \
|
||||
or args.clean:
|
||||
# rebuild zip file
|
||||
print "updating:", zipfile
|
||||
make_aircraft_zip(repo_path, name, zipfile)
|
||||
md5sum = get_md5sum(zipfile)
|
||||
else:
|
||||
print "(no change)"
|
||||
if md5sum == "":
|
||||
md5sum = get_md5sum(zipfile)
|
||||
filesize = os.path.getsize(zipfile)
|
||||
package_node.append( make_xml_leaf('md5', md5sum) )
|
||||
package_node.append( make_xml_leaf('file-size-bytes', filesize) )
|
||||
|
||||
# handle md5sum cache
|
||||
node = md5sum_root.find('aircraft_' + name)
|
||||
if node != None:
|
||||
node.text = md5sum
|
||||
else:
|
||||
md5sum_root.append( make_xml_leaf('aircraft_' + name, md5sum) )
|
||||
|
||||
# handle thumbnails
|
||||
thumbnail_src = os.path.join(aircraft_dir, 'thumbnail.jpg')
|
||||
thumbnail_dst = os.path.join(thumbnail_dir, name + '_thumbnail.jpg')
|
||||
if os.path.exists(thumbnail_src):
|
||||
shutil.copy2(thumbnail_src, thumbnail_dst)
|
||||
catalog_node.append(package_node)
|
||||
package_node.append( make_xml_leaf('thumbnail-path', 'thumbnail.jpg') )
|
||||
|
||||
# copy previews for the package and variants into the
|
||||
# output directory
|
||||
copy_previews_for_package(package, variants, name, aircraft_dir, previews_dir)
|
||||
|
||||
# write out the master catalog file
|
||||
cat_file = os.path.join(output_dir, 'catalog.xml')
|
||||
catalog_root.write(cat_file, encoding='utf-8', xml_declaration=True, pretty_print=True)
|
||||
|
||||
# write out the md5sum cache file
|
||||
print md5sum_file
|
||||
md5sum_tree.write(md5sum_file, encoding='utf-8', xml_declaration=True, pretty_print=True)
|
||||
|
||||
# look for orphaned zip files
|
||||
files = os.listdir(output_dir)
|
||||
for file in files:
|
||||
if file.endswith('.zip')and not file in valid_zips:
|
||||
print "orphaned zip:", file
|
||||
@@ -0,0 +1,9 @@
|
||||
--- apt.dat 2016-12-08 18:43:50.000000000 +0100
|
||||
+++ apt.dat-000 2016-12-08 18:56:02.310707492 +0100
|
||||
@@ -1,5 +1,5 @@
|
||||
I
|
||||
-1000 Version - data cycle 2013.10, build 20131335, metadata AptXP1000. Copyright <20> 2013, Robin A. Peel (robin@x-plane.com). This data is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program ("AptNavGNULicence.txt"); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
+1000 Version - data cycle 2013.10, build 20131335, metadata AptXP1000, further modified by the FlightGear team (cf. <https://sourceforge.net/p/flightgear/fgmeta/ci/next/tree/changes-in-dat-files/apt.dat>). Copyright <20> 2013, Robin A. Peel (robin@x-plane.com). This data is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program ("AptNavGNULicence.txt"); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
|
||||
1 15 1 0 VHXX [X] CLOSED Kai Tak
|
||||
@@ -0,0 +1,11 @@
|
||||
--- apt.dat 2016-12-08 18:56:02.310707492 +0100
|
||||
+++ apt.dat-001 2016-12-08 19:01:00.082169377 +0100
|
||||
@@ -926129,7 +926129,7 @@
|
||||
19 45.98520090 -065.30815534 1 WS
|
||||
19 45.98509598 -065.29620316 1 WS
|
||||
19 45.98776000 -065.29826459 1 WS
|
||||
-51 12320
|
||||
+51 12320 CTAF/UNICOM
|
||||
|
||||
1 1000 0 1 3MN7 Haven
|
||||
100 22.86 3 0 0.25 0 0 0 15 45.49243037 -094.12309108 0.00 0.00 1 0 0 0 33 45.48749963 -094.11966060 0.00 0.00 1 0 0 0
|
||||
21
compile-scripts/README.md
Normal file
21
compile-scripts/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
This is the scripts I (James) use to maintain my builds on each platform.
|
||||
|
||||
They're much less clever than 'download and compile' but they do enough for me
|
||||
and probably most other people, if you tweak the paths accordingly. The Mac
|
||||
and Linux ones require Ruby (which is usually pre-installed). There are no
|
||||
instructions - if you can't figure out what these do from reading the scripts,
|
||||
you almost certainly should not be using them!
|
||||
|
||||
They all assume a top-level folder which contains
|
||||
checkouts of simgear, flightgear, fgdata, OpenSceneGraph (into a dir named
|
||||
'osg') and the windows-3rd-party dir in the case of Windows. It's assumed
|
||||
you copy the script to that same dir, edit paths and run from there.
|
||||
|
||||
The Mac and Linux scripts will do the checkout for you - the Windows is not
|
||||
so smart because Window batch scripts are not my friend.
|
||||
|
||||
On Mac you will need to grab the 3rdparty-dependency-build from Jenkins, or
|
||||
build PLIB manually yourself, either should be straightforward. For all other
|
||||
dependencies on Mac / Linux use your package manager / Homebrew.
|
||||
|
||||
Files will be installed into a subdir called 'dist'
|
||||
130
compile-scripts/commands-linux.rb
Executable file
130
compile-scripts/commands-linux.rb
Executable file
@@ -0,0 +1,130 @@
|
||||
#!/usr/bin/ruby
|
||||
|
||||
require 'fileutils'
|
||||
require 'optparse'
|
||||
include FileUtils
|
||||
|
||||
baseDir = Dir.pwd
|
||||
gitArgs = ""
|
||||
qtPath = ""
|
||||
|
||||
doPull = false
|
||||
doCMake = false
|
||||
doInit = false
|
||||
doClean = false
|
||||
doPackage = false
|
||||
|
||||
cmakeCommonArgs = "-DCMAKE_INSTALL_PREFIX=#{baseDir}/dist -DSIMGEAR_SHARED=1"
|
||||
cmakeFGArgs = ""
|
||||
sfUser = "jmturner"
|
||||
|
||||
OptionParser.new do |opts|
|
||||
opts.banner = "Usage: commands.rb [options]"
|
||||
opts.on("", "--init", "Setup empty") do |v|
|
||||
doInit = v
|
||||
end
|
||||
|
||||
opts.on("-p", "--[no-]pull", "Pull from Git") do |v|
|
||||
doPull = v
|
||||
end
|
||||
opts.on("-c", "--cmake", "Run Cmake") do |v|
|
||||
doCMake = v
|
||||
end
|
||||
opts.on("", "--clean", "Clean build dirs") do |v|
|
||||
doClean = v
|
||||
end
|
||||
opts.on("-r", "--rebase", "Rebase when pulling") do |v|
|
||||
gitArgs += "--rebase"
|
||||
end
|
||||
|
||||
opts.on("", "--qt=QTPATH", "Set Qt path when running cmake") do |v|
|
||||
qtPath = v
|
||||
end
|
||||
end.parse!(ARGV)
|
||||
|
||||
def cloneEverything()
|
||||
puts "Initialising"
|
||||
if File.exist?("#{Dir.pwd}/simgear") or File.exist?("#{Dir.pwd}/flightgear")
|
||||
puts "Checkout already exists"
|
||||
return
|
||||
end
|
||||
|
||||
`git clone ssh://#{sfUser}@git.code.sf.net/p/flightgear/simgear simgear`
|
||||
`git clone ssh://#{sfUser}@git.code.sf.net/p/flightgear/flightgear flightgear`
|
||||
`git clone ssh://#{sfUser}@git.code.sf.net/p/flightgear/fgdata fgdata`
|
||||
`git clone https://github.com/openscenegraph/osg.git osg`
|
||||
end
|
||||
|
||||
def createDirs()
|
||||
`mkdir -p sgbuild`
|
||||
`mkdir -p fgbuild`
|
||||
`mkdir -p osg_release_build`
|
||||
end
|
||||
|
||||
# path is needed for Cmake & running macdeployqt
|
||||
if qtPath != ""
|
||||
ENV['PATH'] = "#{ENV['PATH']}:#{qtPath}/bin"
|
||||
end
|
||||
|
||||
if doClean
|
||||
puts "Cleaning build dirs"
|
||||
`rm -r sgbuild`
|
||||
`rm -r fgbuild`
|
||||
`rm -r osg_release_build`
|
||||
createDirs()
|
||||
end
|
||||
|
||||
if doInit
|
||||
puts "Doing init"
|
||||
cloneEverything()
|
||||
createDirs();
|
||||
end
|
||||
|
||||
if doPull
|
||||
puts "Pulling from Git"
|
||||
dataPull = Thread.new do
|
||||
puts "Syncing FGData"
|
||||
Dir.chdir "#{baseDir}/fgdata"
|
||||
`git pull #{gitArgs}`
|
||||
end
|
||||
|
||||
Dir.chdir "#{baseDir}/simgear"
|
||||
`git pull #{gitArgs}`
|
||||
|
||||
Dir.chdir "#{baseDir}/flightgear"
|
||||
`git pull #{gitArgs}`
|
||||
end
|
||||
|
||||
Dir.chdir "#{baseDir}/osg_release_build"
|
||||
if doCMake or !File.exist?("#{Dir.pwd}/Makefile")
|
||||
`cmake ../osg -DCMAKE_INSTALL_PREFIX=#{baseDir}/dist`
|
||||
end
|
||||
|
||||
puts "Building OpenSceneGraph"
|
||||
`make`
|
||||
`make install`
|
||||
|
||||
Dir.chdir "#{baseDir}/sgbuild"
|
||||
|
||||
if doCMake or !File.exist?("#{Dir.pwd}/Makefile")
|
||||
`cmake ../simgear #{cmakeCommonArgs}`
|
||||
end
|
||||
|
||||
puts "Building SimGear"
|
||||
`make`
|
||||
`make install`
|
||||
|
||||
Dir.chdir "#{baseDir}/fgbuild"
|
||||
|
||||
if doCMake or !File.exist?("#{Dir.pwd}/Makefile")
|
||||
if qtPath != ""
|
||||
cmakeFGArgs = '-DENABLE_QT=1'
|
||||
end
|
||||
`cmake ../flightgear #{cmakeCommonArgs} #{cmakeFGArgs}`
|
||||
end
|
||||
|
||||
puts "Building FlightGear"
|
||||
`make`
|
||||
`make install`
|
||||
|
||||
puts "All done."
|
||||
135
compile-scripts/commands-mac.rb
Executable file
135
compile-scripts/commands-mac.rb
Executable file
@@ -0,0 +1,135 @@
|
||||
#!/usr/bin/ruby
|
||||
|
||||
require 'fileutils'
|
||||
require 'optparse'
|
||||
include FileUtils
|
||||
|
||||
baseDir = Dir.pwd
|
||||
gitArgs = ""
|
||||
qtPath = ""
|
||||
|
||||
doPull = false
|
||||
doCMake = false
|
||||
doInit = false
|
||||
doClean = false
|
||||
doPackage = false
|
||||
|
||||
cmakePlatformArgs = "-G Xcode"
|
||||
cmakeCommonArgs = "-DCMAKE_INSTALL_PREFIX=#{baseDir}/dist"
|
||||
cmakeSGArgs = "-DSIMGEAR_SHARED=1"
|
||||
cmakeFGArgs = "-DSIMGEAR_SHARED=1"
|
||||
sfUser = "jmturner"
|
||||
|
||||
OptionParser.new do |opts|
|
||||
opts.banner = "Usage: commands.rb [options]"
|
||||
opts.on("", "--init", "Setup empty") do |v|
|
||||
doInit = v
|
||||
end
|
||||
|
||||
opts.on("-p", "--[no-]pull", "Pull from Git") do |v|
|
||||
doPull = v
|
||||
end
|
||||
opts.on("-c", "--cmake", "Run Cmake") do |v|
|
||||
doCMake = v
|
||||
end
|
||||
opts.on("", "--clean", "Clean build dirs") do |v|
|
||||
doClean = v
|
||||
end
|
||||
opts.on("-r", "--rebase", "Rebase when pulling") do |v|
|
||||
gitArgs += "--rebase"
|
||||
end
|
||||
|
||||
opts.on("", "--qt=QTPATH", "Set Qt path when running cmake") do |v|
|
||||
qtPath = v
|
||||
end
|
||||
end.parse!(ARGV)
|
||||
|
||||
def cloneEverything()
|
||||
puts "Initialising"
|
||||
if File.exist?("#{Dir.pwd}/simgear") or File.exist?("#{Dir.pwd}/flightgear")
|
||||
puts "Checkout already exists"
|
||||
return
|
||||
end
|
||||
|
||||
`git clone ssh://#{sfUser}@git.code.sf.net/p/flightgear/simgear simgear`
|
||||
`git clone ssh://#{sfUser}@git.code.sf.net/p/flightgear/flightgear flightgear`
|
||||
`git clone git@github.com:zakalawe/osg.git osg`
|
||||
end
|
||||
|
||||
def createDirs()
|
||||
`mkdir -p sgbuild`
|
||||
`mkdir -p fgbuild`
|
||||
`mkdir -p osg_fg_build`
|
||||
end
|
||||
|
||||
# path is needed for Cmake & running macdeployqt
|
||||
if qtPath != ""
|
||||
ENV['PATH'] = "#{ENV['PATH']}:#{qtPath}/bin"
|
||||
end
|
||||
|
||||
if doClean
|
||||
puts "Cleaning build dirs"
|
||||
`rm -r sgbuild`
|
||||
`rm -r fgbuild`
|
||||
`rm -r osg_fg_build`
|
||||
end
|
||||
|
||||
if doInit
|
||||
puts "Doing init"
|
||||
cloneEverything()
|
||||
end
|
||||
|
||||
if doPull
|
||||
puts "Pulling from Git"
|
||||
dataPull = Thread.new do
|
||||
puts "Syncing FGData"
|
||||
Dir.chdir "#{baseDir}/fgdata"
|
||||
`git pull #{gitArgs}`
|
||||
end
|
||||
|
||||
Dir.chdir "#{baseDir}/simgear"
|
||||
`git pull #{gitArgs}`
|
||||
|
||||
Dir.chdir "#{baseDir}/flightgear"
|
||||
`git pull #{gitArgs}`
|
||||
end
|
||||
|
||||
createDirs()
|
||||
|
||||
Dir.chdir "#{baseDir}/osg_fg_build"
|
||||
if doCMake or !File.exist?("#{Dir.pwd}/Makefile")
|
||||
`cmake ../osg #{cmakeCommonArgs}`
|
||||
end
|
||||
|
||||
puts "Building OpenSceneGraph"
|
||||
`make -j4`
|
||||
`make install`
|
||||
|
||||
Dir.chdir "#{baseDir}/sgbuild"
|
||||
|
||||
if doCMake or !File.exist?("#{Dir.pwd}/SimGear.xcodeproj")
|
||||
`cmake ../simgear #{cmakePlatformArgs} #{cmakeCommonArgs} #{cmakeSGArgs}`
|
||||
end
|
||||
|
||||
puts "Building SimGear Debug"
|
||||
`xcodebuild -target install -configuration Debug`
|
||||
|
||||
puts "Building SimGear Release"
|
||||
`xcodebuild -target install -configuration Release`
|
||||
|
||||
Dir.chdir "#{baseDir}/fgbuild"
|
||||
|
||||
if doCMake or !File.exist?("#{Dir.pwd}/FlightGear.xcodeproj")
|
||||
if qtPath != ""
|
||||
cmakeFGArgs = '-DENABLE_QT=1'
|
||||
end
|
||||
`cmake ../flightgear #{cmakePlatformArgs} #{cmakeCommonArgs} #{cmakeFGArgs}`
|
||||
end
|
||||
|
||||
puts "Building FlightGear Debug"
|
||||
`xcodebuild -target fgfs -configuration Debug`
|
||||
|
||||
puts "Building FlightGear Release"
|
||||
`xcodebuild -target fgfs -configuration Release`
|
||||
|
||||
puts "All done."
|
||||
52
compile-scripts/pull_build.bat
Normal file
52
compile-scripts/pull_build.bat
Normal file
@@ -0,0 +1,52 @@
|
||||
|
||||
SET PATH=%PATH%;%ProgramFiles%\CMake\bin
|
||||
SET QT5SDK64=C:\Qt\5.6\msvc2015_64
|
||||
SET CMAKE_TOOLCHAIN="Visual Studio 14 Win64"
|
||||
SET ROOT_DIR=%CD%
|
||||
|
||||
md osgbuild
|
||||
md sgbuild
|
||||
md fgbuild
|
||||
REM md fgrun-build
|
||||
|
||||
cd simgear
|
||||
git pull --rebase
|
||||
|
||||
cd ..\flightgear
|
||||
git pull --rebase
|
||||
|
||||
REM cd ..\fgrun
|
||||
REM git pull --rebase
|
||||
|
||||
cd ..\osgbuild
|
||||
cmake ..\osg -G %CMAKE_TOOLCHAIN% ^
|
||||
-DACTUAL_3RDPARTY_DIR:PATH=%ROOT_DIR%\windows-3rd-party\msvc140\3rdparty.x64 ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%\dist ^
|
||||
-DOSG_USE_UTF8_FILENAME:BOOL=ON
|
||||
|
||||
cmake --build . --config Release --target INSTALL
|
||||
cmake --build . --config Debug --target INSTALL
|
||||
|
||||
cd ..\sgbuild
|
||||
cmake ..\simgear -G %CMAKE_TOOLCHAIN% ^
|
||||
-DMSVC_3RDPARTY_ROOT=%ROOT_DIR%\windows-3rd-party\msvc140 ^
|
||||
-DOSG_FSTREAM_EXPORT_FIXED:BOOL=ON ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%\dist
|
||||
cmake --build . --config Release --target INSTALL
|
||||
cmake --build . --config Debug --target INSTALL
|
||||
|
||||
cd ..\fgbuild
|
||||
cmake ..\flightgear -G %CMAKE_TOOLCHAIN% ^
|
||||
-DMSVC_3RDPARTY_ROOT=%ROOT_DIR%\windows-3rd-party\msvc140 ^
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%\dist ^
|
||||
-DCMAKE_PREFIX_PATH=%QT5SDK64% ^
|
||||
-DOSG_FSTREAM_EXPORT_FIXED:BOOL=ON
|
||||
cmake --build . --config Release --target INSTALL
|
||||
cmake --build . --config Debug --target INSTALL
|
||||
|
||||
REM cd ..\fgrun-build
|
||||
REM cmake ..\fgrun -G %CMAKE_TOOLCHAIN% ^
|
||||
REM -DMSVC_3RDPARTY_ROOT=C:\FGFS\windows-3rd-party\msvc140 ^
|
||||
REM -DCMAKE_INSTALL_PREFIX:PATH=C:\FGFS\dist
|
||||
REM cmake --build . --config Release --target INSTALL
|
||||
REM cmake --build . --config Debug --target INSTALL
|
||||
80
create_metar_dat.py
Executable file
80
create_metar_dat.py
Executable file
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# create_metar_dat.py
|
||||
#
|
||||
# Script to create metar.dat.gz by checking tgftp.nws.noaa.gov for stations
|
||||
# that have reported recently.
|
||||
#
|
||||
# Usage: create_metar_dat.py [OUTPUT_FILENAME]
|
||||
#
|
||||
# If OUTPUT_FILENAME is omitted, creates metar.dat.gz in working directory.
|
||||
#
|
||||
# Copyright (c) 2016 Richard Senior
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301, USA.
|
||||
|
||||
import datetime
|
||||
import dateutil.parser
|
||||
import gzip
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import urllib.request
|
||||
|
||||
filename = "metar.dat.gz" if len(sys.argv) <= 1 else sys.argv[1]
|
||||
max_age_days = 7
|
||||
url = "http://tgftp.nws.noaa.gov/data/observations/metar/stations/"
|
||||
|
||||
now = datetime.datetime.now()
|
||||
script = os.path.basename(__file__)
|
||||
|
||||
class ParseException(Exception):
|
||||
pass
|
||||
|
||||
def stations():
|
||||
for line in urllib.request.urlopen(url).readlines():
|
||||
if b".TXT" in line:
|
||||
yield line
|
||||
|
||||
def active_stations():
|
||||
cutoff = now - datetime.timedelta(max_age_days)
|
||||
icao_pattern = re.compile("[A-Z][A-Z0-9]{3}")
|
||||
for station in stations():
|
||||
tokens = station.split()
|
||||
last_modified = tokens[2][14:25]
|
||||
if dateutil.parser.parse(last_modified) > cutoff:
|
||||
icao = tokens[1][16:20:].decode()
|
||||
# Sanity check on parsed ICAO code.
|
||||
if not icao_pattern.match(icao):
|
||||
raise ParseException("Dubious ICAO code: " + icao)
|
||||
yield icao
|
||||
|
||||
# Run through the active stations before opening the file so that a file
|
||||
# is not created (or overwritten) if an exception is thrown.
|
||||
active = [icao + "\n" for icao in active_stations()]
|
||||
|
||||
# Sanity check on the number of stations.
|
||||
if len(active) < 5000:
|
||||
raise ParseException("Expected more than " + str(len(active)) + " stations")
|
||||
|
||||
with gzip.open(filename, "wt") as f:
|
||||
print("# List of airports known to have metar data available", file=f)
|
||||
print("# Generated by", script, "on", now.strftime("%Y-%m-%d"), file=f)
|
||||
print("#", url, file=f)
|
||||
f.writelines(active)
|
||||
|
||||
print(script + ": Wrote", len(active), "stations to", filename)
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
VERSION="2.33"
|
||||
FGVERSION="release/3.6.0"
|
||||
VERSION="2.34"
|
||||
FGVERSION="release/$(git ls-remote --heads https://git.code.sf.net/p/flightgear/flightgear|grep '\/release\/'|cut -f4 -d'/'|sort -t . -k 1,1n -k2,2n -k3,3n|tail -1)"
|
||||
|
||||
#######################################################
|
||||
# THANKS TO
|
||||
@@ -32,7 +32,7 @@ FGVERSION="release/3.6.0"
|
||||
|
||||
LOGFILE=compilation_log.txt
|
||||
WHATTOBUILD=
|
||||
#AVAILABLE VALUES: PLIB OPENRTI OSG SIMGEAR FGFS DATA FGRUN FGO FGX OPENRADAR ATCPIE TERRAGEAR TERRAGEARGUI
|
||||
#AVAILABLE VALUES: CMAKE PLIB OPENRTI OSG SIMGEAR FGFS DATA FGRUN FGO FGX OPENRADAR ATCPIE TERRAGEAR TERRAGEARGUI
|
||||
WHATTOBUILDALL=(SIMGEAR FGFS DATA)
|
||||
STABLE=
|
||||
APT_GET_UPDATE="y"
|
||||
@@ -42,11 +42,11 @@ RECONFIGURE="y"
|
||||
DOWNLOAD="y"
|
||||
JOPTION=""
|
||||
OOPTION=""
|
||||
DEBUG=""
|
||||
BUILD_TYPE="RelWithDebInfo"
|
||||
SG_CMAKEARGS=""
|
||||
FG_CMAKEARGE=""
|
||||
FG_CMAKEARGS=""
|
||||
|
||||
while getopts "shc:p:a:d:r:j:O:i" OPTION; do
|
||||
while getopts "shc:p:a:d:r:j:O:ib:" OPTION; do
|
||||
case $OPTION in
|
||||
s) STABLE="STABLE" ;;
|
||||
h) HELP="HELP" ;;
|
||||
@@ -58,6 +58,7 @@ while getopts "shc:p:a:d:r:j:O:i" OPTION; do
|
||||
j) JOPTION=" -j"$OPTARG" " ;;
|
||||
O) OOPTION=" -O"$OPTARG" " ;;
|
||||
i) OPENRTI="OPENRTI" ;;
|
||||
b) BUILD_TYPE="$OPTARG" ;;
|
||||
?) HELP="HELP" ;;
|
||||
esac
|
||||
done
|
||||
@@ -85,8 +86,8 @@ fi
|
||||
|
||||
|
||||
if [ "$OPENRTI" = "OPENRTI" ]; then
|
||||
SG_CMAKEARGS="$SG_CMAKEARGS-DENABLE_RTI=ON;"
|
||||
FG_CMAKEARGS="$FG_CMAKEARGS-DENABLE_RTI=ON;"
|
||||
SG_CMAKEARGS="$SG_CMAKEARGS -DENABLE_RTI=ON;"
|
||||
FG_CMAKEARGS="$FG_CMAKEARGS -DENABLE_RTI=ON;"
|
||||
WHATTOBUILD=( "${WHATTOBUILD[@]}" OPENRTI )
|
||||
fi
|
||||
|
||||
@@ -108,13 +109,13 @@ function _gitUpdate(){
|
||||
git diff --exit-code 2>&1 > /dev/null
|
||||
if [ $? != 1 ]; then
|
||||
set -e
|
||||
git checkout -f $branch
|
||||
git pull -r
|
||||
git checkout -f $branch
|
||||
else
|
||||
set -e
|
||||
git stash save -u -q
|
||||
git checkout -f $branch
|
||||
git pull -r
|
||||
git checkout -f $branch
|
||||
git stash pop -q
|
||||
fi
|
||||
}
|
||||
@@ -124,7 +125,7 @@ function _gitDownload(){
|
||||
return
|
||||
fi
|
||||
repo=$1
|
||||
if [ -f "README" -o -f "README.txt" ]; then
|
||||
if [ -f "README" -o -f "README.txt" -o -f "README.rst" ]; then
|
||||
echo "$repo exists already"
|
||||
else
|
||||
git clone $repo .
|
||||
@@ -149,14 +150,14 @@ set -e
|
||||
if [ "$HELP" = "HELP" ]; then
|
||||
echo "$0 Version $VERSION"
|
||||
echo "Usage:"
|
||||
echo "./$0 [-h] [-s] [-e] [-f] [-i] [-g] [-a y|n] [-c y|n] [-p y|n] [-d y|n] [-r y|n] [ALL|PLIB|OPENRTI|SIMGEAR|FGFS|DATA|FGRUN|FGO|FGX|OPENRADAR|ATCPIE|TERRAGEAR|TERRAGEARGUI]"
|
||||
echo "./$0 [-h] [-s] [-e] [-f] [-i] [-g] [-a y|n] [-c y|n] [-p y|n] [-d y|n] [-r y|n] [ALL|CMAKE|OSG|PLIB|OPENRTI|SIMGEAR|FGFS|DATA|FGRUN|FGO|FGX|OPENRADAR|ATCPIE|TERRAGEAR|TERRAGEARGUI]"
|
||||
echo "* without options or with ALL it recompiles the content of the WHATTOBUILDALL variable."
|
||||
echo "* Feel you free to customize the WHATTOBUILDALL variable available on the top of this script"
|
||||
echo "Switches:"
|
||||
echo "* -h show this help"
|
||||
echo "* -e compile FlightGear with --with-eventinput option (experimental)"
|
||||
echo "* -i compile SimGear and FlightGear with -D ENABLE_RTI=ON option (experimental)"
|
||||
echo "* -g compile with debug info for gcc"
|
||||
echo "* -b Release|RelWithDebInfo|Debug set build type default=RelWithDebInfo"
|
||||
echo "* -a y|n y=do an apt-get update n=skip apt-get update default=y"
|
||||
echo "* -p y|n y=download packages n=skip download packages default=y"
|
||||
echo "* -c y|n y=compile programs n=do not compile programs default=y"
|
||||
@@ -195,13 +196,15 @@ echo "RECONFIGURE=$RECONFIGURE" >> $LOGFILE
|
||||
echo "DOWNLOAD=$DOWNLOAD" >> $LOGFILE
|
||||
echo "JOPTION=$JOPTION" >> $LOGFILE
|
||||
echo "OOPTION=$OOPTION" >> $LOGFILE
|
||||
echo "DEBUG=$DEBUG" >> $LOGFILE
|
||||
echo "BUILD_TYPE=$BUILD_TYPE" >> $LOGFILE
|
||||
_logSep
|
||||
|
||||
#######################################################
|
||||
#######################################################
|
||||
# Minimum
|
||||
PKG="build-essential cmake git"
|
||||
# cmake
|
||||
PKG="$PKG libarchive-dev libbz2-dev libcurl4-gnutls-dev libexpat1-dev libjsoncpp-dev liblzma-dev libncurses5-dev procps zlib1g-dev"
|
||||
# TG
|
||||
PKG="$PKG libcgal-dev libgdal-dev libtiff5-dev"
|
||||
# TGGUI/OpenRTI
|
||||
@@ -265,6 +268,41 @@ if [ -d "$CBD"/fgfs/flightgear ]; then
|
||||
echo "Done"
|
||||
fi
|
||||
|
||||
#######################################################
|
||||
# cmake
|
||||
#######################################################
|
||||
CMAKE_INSTALL_DIR=cmake
|
||||
INSTALL_DIR_CMAKE=$INSTALL_DIR/$CMAKE_INSTALL_DIR
|
||||
cd "$CBD"
|
||||
if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="CMAKE"' ]]; then
|
||||
echo "****************************************" | tee -a $LOGFILE
|
||||
echo "*************** CMAKE ******************" | tee -a $LOGFILE
|
||||
echo "****************************************" | tee -a $LOGFILE
|
||||
|
||||
mkdir -p "cmake"
|
||||
cd "$CBD"/cmake
|
||||
_gitDownload https://cmake.org/cmake.git
|
||||
_gitUpdate master
|
||||
|
||||
if [ "$RECONFIGURE" = "y" ]; then
|
||||
cd "$CBD"
|
||||
mkdir -p build/cmake
|
||||
echo "CONFIGURING cmake" >> $LOGFILE
|
||||
cd "$CBD"/build/cmake
|
||||
../../cmake/configure --prefix="$INSTALL_DIR_CMAKE" \
|
||||
2>&1 | tee -a $LOGFILE
|
||||
fi
|
||||
|
||||
_make cmake
|
||||
CMAKE="$INSTALL_DIR_CMAKE/bin/cmake"
|
||||
else
|
||||
if [ -x "$INSTALL_DIR_CMAKE/bin/cmake" ]; then
|
||||
CMAKE="$INSTALL_DIR_CMAKE/bin/cmake"
|
||||
else
|
||||
CMAKE=cmake
|
||||
fi
|
||||
fi
|
||||
|
||||
#######################################################
|
||||
# PLIB
|
||||
#######################################################
|
||||
@@ -278,7 +316,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="PLIB"' ]]; then
|
||||
|
||||
mkdir -p "plib"
|
||||
cd "$CBD"/plib
|
||||
_gitDownload git://git.code.sf.net/p/libplib/code
|
||||
_gitDownload https://git.code.sf.net/p/libplib/code
|
||||
_gitUpdate master
|
||||
|
||||
if [ "$RECONFIGURE" = "y" ]; then
|
||||
@@ -286,7 +324,8 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="PLIB"' ]]; then
|
||||
mkdir -p build/plib
|
||||
echo "CONFIGURING plib" >> $LOGFILE
|
||||
cd "$CBD"/build/plib
|
||||
cmake -DCMAKE_INSTALL_PREFIX:PATH="$INSTALL_DIR_PLIB" \
|
||||
"$CMAKE" -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
|
||||
-DCMAKE_INSTALL_PREFIX:PATH="$INSTALL_DIR_PLIB" \
|
||||
../../plib 2>&1 | tee -a $LOGFILE
|
||||
fi
|
||||
|
||||
@@ -306,7 +345,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="OPENRTI"' ]]; then
|
||||
|
||||
mkdir -p "openrti"
|
||||
cd "$CBD"/openrti
|
||||
_gitDownload git://git.code.sf.net/p/openrti/OpenRTI
|
||||
_gitDownload https://git.code.sf.net/p/openrti/OpenRTI
|
||||
|
||||
if [ "$STABLE" = "STABLE" ]; then
|
||||
_gitUpdate release-0.7
|
||||
@@ -319,7 +358,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="OPENRTI"' ]]; then
|
||||
mkdir -p build/openrti
|
||||
cd "$CBD"/build/openrti
|
||||
rm -f CMakeCache.txt
|
||||
cmake -DCMAKE_BUILD_TYPE="Release" \
|
||||
"$CMAKE" -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
|
||||
-DCMAKE_INSTALL_PREFIX:PATH="$INSTALL_DIR_OPENRTI" \
|
||||
../../openrti 2>&1 | tee -a $LOGFILE
|
||||
fi
|
||||
@@ -335,31 +374,36 @@ INSTALL_DIR_OSG=$INSTALL_DIR/$OSG_INSTALL_DIR
|
||||
cd "$CBD"
|
||||
mkdir -p "openscenegraph"
|
||||
if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="OSG"' ]]; then
|
||||
echo "****************************************" | tee -a $LOGFILE
|
||||
echo "**************** OSG *******************" | tee -a $LOGFILE
|
||||
echo "****************************************" | tee -a $LOGFILE
|
||||
cd "$CBD"/openscenegraph
|
||||
_gitDownload http://github.com/openscenegraph/osg.git
|
||||
_gitUpdate OpenSceneGraph-3.2
|
||||
|
||||
if [ "$RECONFIGURE" = "y" ]; then
|
||||
cd "$CBD"
|
||||
mkdir -p build/openscenegraph
|
||||
cd "$CBD"/build/openscenegraph
|
||||
rm -f CMakeCache.txt
|
||||
cmake -DCMAKE_BUILD_TYPE="Release" \
|
||||
-DCMAKE_INSTALL_PREFIX:PATH="$INSTALL_DIR_OSG" ../../openscenegraph/ 2>&1 | tee -a $LOGFILE
|
||||
fi
|
||||
|
||||
_make openscenegraph
|
||||
#FIX FOR 64 BIT COMPILATION
|
||||
if [ -d "$INSTALL_DIR_OSG/lib64" ]; then
|
||||
if [ -L "$INSTALL_DIR_OSG/lib" ]; then
|
||||
echo "link already done"
|
||||
else
|
||||
ln -s "$INSTALL_DIR_OSG/lib64" "$INSTALL_DIR_OSG/lib"
|
||||
fi
|
||||
fi
|
||||
echo "****************************************" | tee -a $LOGFILE
|
||||
echo "**************** OSG *******************" | tee -a $LOGFILE
|
||||
echo "****************************************" | tee -a $LOGFILE
|
||||
cd "$CBD"/openscenegraph
|
||||
_gitDownload https://github.com/openscenegraph/osg.git
|
||||
_gitUpdate OpenSceneGraph-3.2
|
||||
|
||||
if [ "$RECONFIGURE" = "y" ]; then
|
||||
cd "$CBD"
|
||||
mkdir -p build/openscenegraph
|
||||
cd "$CBD"/build/openscenegraph
|
||||
rm -f CMakeCache.txt
|
||||
if [ "$BUILD_TYPE" = "Debug" ]; then
|
||||
OSG_BUILD_TYPE=Debug
|
||||
else
|
||||
OSG_BUILD_TYPE=Release
|
||||
fi
|
||||
"$CMAKE" -DCMAKE_BUILD_TYPE="$OSG_BUILD_TYPE" \
|
||||
-DCMAKE_INSTALL_PREFIX:PATH="$INSTALL_DIR_OSG" ../../openscenegraph/ 2>&1 | tee -a $LOGFILE
|
||||
fi
|
||||
|
||||
_make openscenegraph
|
||||
#FIX FOR 64 BIT COMPILATION
|
||||
if [ -d "$INSTALL_DIR_OSG/lib64" ]; then
|
||||
if [ -L "$INSTALL_DIR_OSG/lib" ]; then
|
||||
echo "link already done"
|
||||
else
|
||||
ln -s "$INSTALL_DIR_OSG/lib64" "$INSTALL_DIR_OSG/lib"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
#######################################################
|
||||
@@ -375,7 +419,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="SIMGEAR"' ]]; then
|
||||
|
||||
mkdir -p "simgear"
|
||||
cd "$CBD"/simgear
|
||||
_gitDownload git://git.code.sf.net/p/flightgear/simgear
|
||||
_gitDownload https://git.code.sf.net/p/flightgear/simgear
|
||||
_gitUpdate $FGVERSION
|
||||
|
||||
if [ "$RECONFIGURE" = "y" ]; then
|
||||
@@ -383,7 +427,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="SIMGEAR"' ]]; then
|
||||
mkdir -p build/simgear
|
||||
cd "$CBD"/build/simgear
|
||||
rm -f CMakeCache.txt
|
||||
cmake -DCMAKE_BUILD_TYPE="Release" \
|
||||
"$CMAKE" -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
|
||||
-DCMAKE_INSTALL_PREFIX:PATH="$INSTALL_DIR_SIMGEAR" \
|
||||
-DCMAKE_PREFIX_PATH="$INSTALL_DIR_OSG;$INSTALL_DIR_OPENRTI" \
|
||||
$SG_CMAKEARGS \
|
||||
@@ -408,7 +452,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="FGFS"' || "$(declare -p WHAT
|
||||
cd "$CBD"/flightgear
|
||||
|
||||
if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="FGFS"' ]]; then
|
||||
_gitDownload git://git.code.sf.net/p/flightgear/flightgear
|
||||
_gitDownload https://git.code.sf.net/p/flightgear/flightgear
|
||||
_gitUpdate $FGVERSION
|
||||
|
||||
if [ "$RECONFIGURE" = "y" ]; then
|
||||
@@ -416,7 +460,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="FGFS"' || "$(declare -p WHAT
|
||||
mkdir -p build/flightgear
|
||||
cd "$CBD"/build/flightgear
|
||||
rm -f CMakeCache.txt
|
||||
cmake -DCMAKE_BUILD_TYPE="Release" \
|
||||
"$CMAKE" -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
|
||||
-DENABLE_FLITE=ON \
|
||||
-DCMAKE_INSTALL_PREFIX:PATH="$INSTALL_DIR_FGFS" \
|
||||
-DCMAKE_PREFIX_PATH="$INSTALL_DIR_SIMGEAR;$INSTALL_DIR_OSG;$INSTALL_DIR_OPENRTI;$INSTALL_DIR_PLIB" \
|
||||
@@ -435,7 +479,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="FGFS"' || "$(declare -p WHAT
|
||||
echo "**************** DATA ******************" | tee -a $LOGFILE
|
||||
echo "****************************************" | tee -a $LOGFILE
|
||||
|
||||
_gitDownload git://git.code.sf.net/p/flightgear/fgdata
|
||||
_gitDownload https://git.code.sf.net/p/flightgear/fgdata
|
||||
_gitUpdate $FGVERSION
|
||||
fi
|
||||
cd "$CBD"
|
||||
@@ -453,7 +497,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="FGFS"' || "$(declare -p WHAT
|
||||
echo "cd \$(dirname \$0)" >> $SCRIPT
|
||||
echo "cd $SUB_INSTALL_DIR/$FGFS_INSTALL_DIR/bin" >> $SCRIPT
|
||||
echo "export LD_LIBRARY_PATH=../../$SIMGEAR_INSTALL_DIR/lib:../../$OSG_INSTALL_DIR/lib:../../$OPENRTI_INSTALL_DIR/lib:../../$PLIB_INSTALL_DIR/lib" >> $SCRIPT
|
||||
echo "gdb --directory="\$P1"/fgfs/source/src/ --args fgfs --fg-root=\$PWD/../fgdata/ \$@" >> $SCRIPT
|
||||
echo "gdb --directory=$CBD/flightgear/src --args fgfs --fg-root=\$PWD/../fgdata/ \$@" >> $SCRIPT
|
||||
chmod 755 $SCRIPT
|
||||
|
||||
SCRIPT=run_fgcom.sh
|
||||
@@ -477,7 +521,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="FGRUN"' ]]; then
|
||||
|
||||
mkdir -p "fgrun"
|
||||
cd "$CBD"/fgrun
|
||||
_gitDownload git://git.code.sf.net/p/flightgear/fgrun
|
||||
_gitDownload https://git.code.sf.net/p/flightgear/fgrun
|
||||
_gitUpdate $FGVERSION
|
||||
|
||||
if [ "$RECONFIGURE" = "y" ]; then
|
||||
@@ -485,7 +529,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="FGRUN"' ]]; then
|
||||
mkdir -p build/fgrun
|
||||
cd "$CBD"/build/fgrun
|
||||
rm -f CMakeCache.txt
|
||||
cmake -DCMAKE_BUILD_TYPE="Release" \
|
||||
"$CMAKE" -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
|
||||
-DCMAKE_INSTALL_PREFIX:PATH="$INSTALL_DIR_FGRUN" \
|
||||
-DCMAKE_PREFIX_PATH="$INSTALL_DIR_SIMGEAR" \
|
||||
../../fgrun/ 2>&1 | tee -a $LOGFILE
|
||||
@@ -499,7 +543,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="FGRUN"' ]]; then
|
||||
echo "#!/bin/sh" > $SCRIPT
|
||||
echo "cd \$(dirname \$0)" >> $SCRIPT
|
||||
echo "cd $SUB_INSTALL_DIR/$FGRUN_INSTALL_DIR/bin" >> $SCRIPT
|
||||
echo "export LD_LIBRARY_PATH=$INSTALL_DIR_SIMGEAR/lib" >> $SCRIPT
|
||||
echo "export LD_LIBRARY_PATH=../../$SIMGEAR_INSTALL_DIR/lib:../../$OSG_INSTALL_DIR/lib:../../$OPENRTI_INSTALL_DIR/lib:../../$PLIB_INSTALL_DIR/lib" >> $SCRIPT
|
||||
echo "./fgrun --fg-exe=\$PWD/../../$FGFS_INSTALL_DIR/bin/fgfs --fg-root=\$PWD/../../$FGFS_INSTALL_DIR/fgdata \$@" >> $SCRIPT
|
||||
chmod 755 $SCRIPT
|
||||
fi
|
||||
@@ -605,7 +649,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="ATCPIE"' ]]; then
|
||||
|
||||
mkdir -p "$INSTALL_DIR_ATCPIE"
|
||||
cd $INSTALL_DIR_ATCPIE
|
||||
_gitDownload git://git.code.sf.net/p/atc-pie/code
|
||||
_gitDownload https://git.code.sf.net/p/atc-pie/code
|
||||
_gitUpdate master
|
||||
|
||||
cd "$CBD"
|
||||
@@ -658,7 +702,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="TERRAGEAR"' ]]; then
|
||||
|
||||
mkdir -p "terragear"
|
||||
cd "$CBD"/terragear
|
||||
_gitDownload git://git.code.sf.net/p/flightgear/terragear
|
||||
_gitDownload https://git.code.sf.net/p/flightgear/terragear
|
||||
_gitUpdate scenery/ws2.0
|
||||
|
||||
if [ "$RECONFIGURE" = "y" ]; then
|
||||
@@ -666,7 +710,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="TERRAGEAR"' ]]; then
|
||||
mkdir -p build/terragear
|
||||
cd "$CBD"/build/terragear
|
||||
rm -f CMakeCache.txt
|
||||
cmake -DCMAKE_BUILD_TYPE="Debug" \
|
||||
"$CMAKE" -DCMAKE_BUILD_TYPE="Debug" \
|
||||
-DCMAKE_INSTALL_PREFIX:PATH="$INSTALL_DIR_TG" \
|
||||
-DCMAKE_PREFIX_PATH="$INSTALL_DIR_SIMGEAR;$INSTALL_DIR_CGAL" \
|
||||
../../terragear/ 2>&1 | tee -a $LOGFILE
|
||||
@@ -709,7 +753,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="TERRAGEARGUI"' ]]; then
|
||||
|
||||
mkdir -p "terrageargui"
|
||||
cd "$CBD"/terrageargui
|
||||
_gitDownload git://git.code.sf.net/p/flightgear/fgscenery/terrageargui
|
||||
_gitDownload https://git.code.sf.net/p/flightgear/fgscenery/terrageargui
|
||||
_gitUpdate master
|
||||
|
||||
|
||||
@@ -718,7 +762,7 @@ if [[ "$(declare -p WHATTOBUILD)" =~ '['([0-9]+)']="TERRAGEARGUI"' ]]; then
|
||||
mkdir -p build/terrageargui
|
||||
cd "$CBD"/build/terrageargui
|
||||
rm -f ../../terrageargui/CMakeCache.txt
|
||||
cmake -DCMAKE_BUILD_TYPE="Release" \
|
||||
"$CMAKE" -DCMAKE_BUILD_TYPE="Release" \
|
||||
-DCMAKE_INSTALL_PREFIX="$INSTALL_DIR_TGGUI" \
|
||||
../../terrageargui 2>&1 | tee -a $LOGFILE
|
||||
fi
|
||||
|
||||
2
fgdata
2
fgdata
Submodule fgdata updated: eb1ed07b03...6a3316ebd8
@@ -476,8 +476,8 @@ Nasal (Canvas map) probably wouldn't break anything, but guessing it's a bad ide
|
||||
base_texture_files=[]
|
||||
for t in find_unused_textures(input_path,return_used_noregions=True):
|
||||
base_texture_files.extend([path_join("Textures",t),path_join("Textures.high",t)])
|
||||
#no longer a significant problem with exclude_dirs: if os.path.exists(path_join(input_path,".git")):
|
||||
#print(input_path,"appears to be a git clone; this will work, but the result will be larger than starting from a standard flightgear-data package.\nTo create this use (adjusting paths as necessary) rsync -av --filter=\"merge /home/rnpalmer/fs_dev/git/fgmeta/base-package.rules\" ~/fs_dev/git/fgdata ~/fs_dev/flightgear/data_full")
|
||||
#no longer a significant problem with exclude_dirs, and no longer exists for new fgdata: if os.path.exists(path_join(input_path,".git")):
|
||||
#print(input_path,"""appears to be a git clone; this will work, but the result will be larger than starting from a standard flightgear-data package.\nTo create this use (adjusting paths as necessary) rsync -av --filter="merge /home/rnpalmer/FlightGear/source/fgmeta/base-package.rules" ~/FlightGear/source/fgdata ~/FlightGear/data_full""")
|
||||
if os.path.exists(output_path.format("base")) and os.listdir(output_path.format("base")):
|
||||
print("output path",output_path,"non-empty, aborting to avoid data loss\nIf you did want to lose its previous contents, run:\nrm -r",output_path,"\nthen re-run this script")
|
||||
return
|
||||
|
||||
2
fgrun
2
fgrun
Submodule fgrun updated: f5a9513327...3fb3be1935
Submodule flightgear updated: 97f8cdaaea...9aaff777d9
@@ -1,50 +0,0 @@
|
||||
# git diff --quiet e5f841bc84d31fee339191a59b8746cb4eb8074c -- ./Aircraft/
|
||||
|
||||
import subprocess
|
||||
import os, sgprops
|
||||
|
||||
class GITCatalogRepository:
|
||||
def __init__(self, node, singleAircraft = False):
|
||||
self._path = node.getValue("path")
|
||||
|
||||
if not os.path.exists(os.path.join(self._path , ".git")):
|
||||
raise RuntimeError("not a Git directory:" + self._path )
|
||||
|
||||
self._usesSubmodules = node.getValue("uses-submodules", False)
|
||||
self._singleAircraft = singleAircraft
|
||||
|
||||
self._currentRevision = subprocess.check_output(["git", "rev-parse", "HEAD"],
|
||||
cwd = self._path)
|
||||
|
||||
self._aircraftPath = None
|
||||
if node.hasChild("scan-suffix"):
|
||||
self._aircraftPath = os.path.join(path, node.getValue("scan-suffix"))
|
||||
|
||||
@property
|
||||
def path(self):
|
||||
return self._path
|
||||
|
||||
@property
|
||||
def aircraftPath(self):
|
||||
return self._aircraftPath
|
||||
|
||||
def hasPathChanged(self, path, oldRev):
|
||||
diffArgs = ["git", "diff", "--quiet", oldRev, "--"]
|
||||
if not (self._usesSubmodules and self._singleAircraft):
|
||||
diffArgs.append(path)
|
||||
|
||||
return subprocess.call(diffArgs, cwd = self._path)
|
||||
|
||||
def update(self):
|
||||
subprocess.call(["git", "pull"])
|
||||
self._currentRevision = subprocess.check_output(["git", "rev-parse", "HEAD"],
|
||||
cwd = self._path)
|
||||
|
||||
if self._usesSubmodules:
|
||||
subprocess.call(["git", "submodule", "update"], cwd = self._path)
|
||||
|
||||
def scmRevisionForPath(self, path):
|
||||
if self._usesSubmodules:
|
||||
return subprocess.check_output(["git", "rev-parse", "HEAD"], cwd = self._path)
|
||||
|
||||
return self._currentRevision
|
||||
@@ -1,34 +0,0 @@
|
||||
# git diff --quiet e5f841bc84d31fee339191a59b8746cb4eb8074c -- ./Aircraft/
|
||||
|
||||
import subprocess
|
||||
import os
|
||||
import sgprops
|
||||
|
||||
import git_catalog_repository
|
||||
|
||||
class GitDiscreteSCM:
|
||||
def __init__(self, node):
|
||||
|
||||
configNode = node.parent
|
||||
|
||||
self._repos = {}
|
||||
|
||||
# iterate over aicraft paths finding repositories
|
||||
for g in config.getChildren("aircraft-dir"):
|
||||
repo = GITCatalogRepository(g, useSubmodules = False,
|
||||
singleAircraft = True)
|
||||
|
||||
|
||||
def hasPathChanged(self, path, oldRev):
|
||||
|
||||
return self._repos[path].hasPathChanged(path, oldRev)
|
||||
|
||||
def update(self):
|
||||
for r in self._repos:
|
||||
r.update()
|
||||
|
||||
def scmRevisionForPath(self, path):
|
||||
return self._repos[path].scmRevisionForPath(path)
|
||||
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ echo "Build path is: $PATH"
|
||||
###############################################################################
|
||||
echo "Starting on SimGear"
|
||||
pushd sgBuild
|
||||
cmake -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DCMAKE_BUILD_TYPE=RelWithDebInfo ../simgear
|
||||
cmake -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DENABLE_CURL:BOOL="ON" -DCMAKE_BUILD_TYPE=RelWithDebInfo ../simgear
|
||||
|
||||
# compile
|
||||
make
|
||||
|
||||
@@ -1,226 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import os, sys, re, glob, shutil
|
||||
import subprocess
|
||||
import sgprops
|
||||
import argparse
|
||||
import urllib2
|
||||
import package as pkg
|
||||
|
||||
import svn_catalog_repository
|
||||
import git_catalog_repository
|
||||
import git_discrete_repository
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--clean", help="Regenerate every package",
|
||||
action="store_true")
|
||||
parser.add_argument("--update", help="Update/pull SCM source",
|
||||
action="store_true")
|
||||
parser.add_argument("--force-dirty", dest="forcedirty",
|
||||
help="Mark every package as dirty", action="store_true")
|
||||
parser.add_argument("--no-update",
|
||||
dest = "noupdate",
|
||||
help="Disable updating from SCM source",
|
||||
action="store_true")
|
||||
parser.add_argument("--no-upload",
|
||||
dest = "noupload",
|
||||
help="Disable uploading to destination server",
|
||||
action="store_true")
|
||||
parser.add_argument("dir", help="Catalog directory")
|
||||
args = parser.parse_args()
|
||||
|
||||
CATALOG_VERSION = 4
|
||||
includePaths = []
|
||||
packages = {}
|
||||
|
||||
def scanPackages(scmRepo):
|
||||
result = []
|
||||
globPath = scmRepo.aircraftPath
|
||||
if globPath is None:
|
||||
return result
|
||||
|
||||
print "Scanning", globPath
|
||||
print os.getcwd()
|
||||
for d in glob.glob(globPath):
|
||||
# check dir contains at least one -set.xml file
|
||||
if len(glob.glob(os.path.join(d, "*-set.xml"))) == 0:
|
||||
print "no -set.xml in", d
|
||||
continue
|
||||
|
||||
result.append(pkg.PackageData(d, scmRepo))
|
||||
|
||||
return result
|
||||
|
||||
def initScmRepository(node):
|
||||
scmType = node.getValue("type")
|
||||
if (scmType == "svn"):
|
||||
return svn_catalog_repository.SVNCatalogRepository(node)
|
||||
elif (scmType == "git"):
|
||||
return git_catalog_repository.GITCatalogRepository(node)
|
||||
elif (scmType == "git-discrete"):
|
||||
return git_discrete_repository.GitDiscreteSCM(node)
|
||||
elif (scmType == None):
|
||||
raise RuntimeError("No scm/type defined in catalog configuration")
|
||||
else:
|
||||
raise RuntimeError("Unspported SCM type:" + scmType)
|
||||
|
||||
def initRepositories():
|
||||
repositories = []
|
||||
|
||||
for scm in config.getChildren("scm"):
|
||||
scmRepo = initScmRepository(scm)
|
||||
if args.update or (not args.noupdate and scm.getValue("update")):
|
||||
scmRepo.update()
|
||||
# presumably include repos in parse path
|
||||
# TODO: make this configurable
|
||||
includePaths.append(scmRepo.path)
|
||||
repositories.append(scmRepo)
|
||||
|
||||
return repositories
|
||||
|
||||
def processUpload(node, outputPath):
|
||||
if args.noupload or not node.getValue("enabled", True):
|
||||
print "Upload disabled"
|
||||
return
|
||||
|
||||
uploadType = node.getValue("type")
|
||||
if (uploadType == "rsync"):
|
||||
subprocess.call(["rsync", node.getValue("args", "-az"), ".",
|
||||
node.getValue("remote")],
|
||||
cwd = outputPath)
|
||||
elif (uploadType == "rsync-ssh"):
|
||||
print "Doing rsync upload to:", node.getValue("remote")
|
||||
subprocess.call(["rsync", node.getValue("args", "-azve"),
|
||||
"ssh", ".",
|
||||
node.getValue("remote")],
|
||||
cwd = outputPath)
|
||||
elif (uploadType == "scp"):
|
||||
subprocess.call(["scp", node.getValue("args", "-r"), ".",
|
||||
node.getValue("remote")],
|
||||
cwd = outputPath)
|
||||
else:
|
||||
raise RuntimeError("Unsupported upload type:" + uploadType)
|
||||
|
||||
def parseExistingCatalog():
|
||||
global existingCatalogPath
|
||||
global previousCatalog
|
||||
|
||||
# contains existing catalog
|
||||
existingCatalogPath = os.path.join(outPath, 'catalog.xml')
|
||||
|
||||
if not os.path.exists(existingCatalogPath):
|
||||
url = config.getValue("template/url")
|
||||
print "Attempting downloading from", url
|
||||
try:
|
||||
# can happen on new or from clean, try to pull current
|
||||
# catalog from the upload location
|
||||
response = urllib2.urlopen(url, timeout = 5)
|
||||
content = response.read()
|
||||
f = open(existingCatalogPath, 'w' )
|
||||
f.write( content )
|
||||
f.close()
|
||||
print "...worked"
|
||||
except urllib2.URLError as e:
|
||||
print "Downloading current catalog failed", e, "from", url
|
||||
|
||||
rootDir = args.dir
|
||||
if not os.path.isabs(rootDir):
|
||||
rootDir = os.path.abspath(rootDir)
|
||||
os.chdir(rootDir)
|
||||
|
||||
configPath = 'catalog.config.xml'
|
||||
if not os.path.exists(configPath):
|
||||
raise RuntimeError("no config file found at:" + configPath)
|
||||
|
||||
config = sgprops.readProps(configPath)
|
||||
|
||||
# out path
|
||||
outPath = config.getValue('output-dir')
|
||||
if outPath is None:
|
||||
# default out path
|
||||
outPath = os.path.join(rootDir, "output")
|
||||
elif not os.path.isabs(outPath):
|
||||
outPath = os.path.join(rootDir, "output")
|
||||
|
||||
if args.clean:
|
||||
print "Cleaning output"
|
||||
shutil.rmtree(outPath)
|
||||
|
||||
if not os.path.exists(outPath):
|
||||
os.mkdir(outPath)
|
||||
|
||||
thumbnailPath = os.path.join(outPath, config.getValue('thumbnail-dir', "thumbnails"))
|
||||
if not os.path.exists(thumbnailPath):
|
||||
os.mkdir(thumbnailPath)
|
||||
|
||||
thumbnailUrls = list(t.value for t in config.getChildren("thumbnail-url"))
|
||||
|
||||
for i in config.getChildren("include-dir"):
|
||||
if not os.path.exists(i.value):
|
||||
print "Skipping missing include path:", i.value
|
||||
continue
|
||||
includePaths.append(i.value)
|
||||
|
||||
parseExistingCatalog()
|
||||
repositories = initRepositories()
|
||||
|
||||
for scm in repositories:
|
||||
for p in scanPackages(scm):
|
||||
try:
|
||||
p.scanSetXmlFiles(includePaths)
|
||||
packages[p.id] = p
|
||||
except:
|
||||
print "Skipping SCM package due to exception:", p.path
|
||||
|
||||
if os.path.exists(existingCatalogPath):
|
||||
try:
|
||||
previousCatalog = sgprops.readProps(existingCatalogPath)
|
||||
except:
|
||||
print "Previous catalog is malformed"
|
||||
previousCatalog = sgprops.Node()
|
||||
|
||||
for p in previousCatalog.getChildren("package"):
|
||||
pkgId = p.getValue("id")
|
||||
if not pkgId in packages.keys():
|
||||
print "Orphaned old package:", pkgId
|
||||
continue
|
||||
|
||||
packages[pkgId].setPreviousData(p)
|
||||
else:
|
||||
print "No previous catalog"
|
||||
|
||||
catalogNode = sgprops.Node("catalog")
|
||||
sgprops.copy(config.getChild("template"), catalogNode)
|
||||
|
||||
catalogNode.getChild("catalog-version", create = True).value = CATALOG_VERSION
|
||||
mirrorUrls = list(m.value for m in config.getChildren("mirror"))
|
||||
|
||||
packagesToGenerate = []
|
||||
for p in packages.values():
|
||||
if p.isSourceModified or args.forcedirty:
|
||||
packagesToGenerate.append(p)
|
||||
else:
|
||||
p.useExistingCatalogData()
|
||||
|
||||
excludeFilePath = os.path.join(rootDir, "zip-excludes.lst")
|
||||
|
||||
# def f(x):
|
||||
# x.generateZip(outPath)
|
||||
# x.extractThumbnails(thumbnailPath)
|
||||
# return True
|
||||
#
|
||||
# p = Pool(8)
|
||||
# print(p.map(f,packagesToGenerate))
|
||||
|
||||
for p in packagesToGenerate:
|
||||
p.generateZip(outPath, excludeFilePath)
|
||||
p.extractThumbnails(thumbnailPath)
|
||||
|
||||
print "Creating catalog"
|
||||
for p in packages.values():
|
||||
catalogNode.addChild(p.packageNode(mirrorUrls, thumbnailUrls[0]))
|
||||
|
||||
catalogNode.write(os.path.join(outPath, "catalog.xml"))
|
||||
|
||||
for up in config.getChildren("upload"):
|
||||
processUpload(up, outPath)
|
||||
239
package.py
239
package.py
@@ -1,239 +0,0 @@
|
||||
import os, subprocess
|
||||
import sgprops
|
||||
import hashlib # for MD5
|
||||
import shutil # for copy2
|
||||
import catalogTags
|
||||
|
||||
standardTagSet = frozenset(catalogTags.tags)
|
||||
def isNonstandardTag(t):
|
||||
return t not in standardTagSet
|
||||
|
||||
thumbnailNames = ["thumbnail.png", "thumbnail.jpg"]
|
||||
|
||||
class VariantData:
|
||||
def __init__(self, path, node):
|
||||
#self._primary = primary
|
||||
self._path = path
|
||||
self._name = node.getValue("sim/description")
|
||||
if (not self._name):
|
||||
print "Missing description for " + path
|
||||
self._name = "Missing description:" + self.id
|
||||
|
||||
# ratings
|
||||
|
||||
# seperate thumbnails
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
return self._path[:-8] # "remove -set.xml" (8 chars)
|
||||
|
||||
@property
|
||||
def catalogNode(self):
|
||||
n = sgprops.Node("variant")
|
||||
n.addChild("id").value = self.id
|
||||
n.addChild("name").value = self.name
|
||||
return n
|
||||
|
||||
class PackageData:
|
||||
def __init__(self, path, scmRepo):
|
||||
self._path = path
|
||||
self._scm = scmRepo
|
||||
self._previousSCMRevision = None
|
||||
self._previousRevision = 0
|
||||
self._thumbnails = []
|
||||
self._variants = {}
|
||||
self._revision = 0
|
||||
self._md5 = None
|
||||
self._fileSize = 0
|
||||
self._primarySetXmlPath = None
|
||||
self._node = sgprops.Node("package")
|
||||
|
||||
def setPreviousData(self, node):
|
||||
self._previousRevision = node.getValue("revision")
|
||||
self._previousMD5 = node.getValue("md5")
|
||||
self._previousSCMRevision = node.getValue("scm-revision")
|
||||
self._fileSize = int(node.getValue("file-size-bytes"))
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
return self._primarySetXmlPath
|
||||
|
||||
@property
|
||||
def thumbnails(self):
|
||||
return self._thumbnails
|
||||
|
||||
@property
|
||||
def path(self):
|
||||
return self._path
|
||||
|
||||
@property
|
||||
def variants(self):
|
||||
return self._variants
|
||||
|
||||
@property
|
||||
def scmRevision(self):
|
||||
currentRev = self._scm.scmRevisionForPath(self.path)
|
||||
if (currentRev is None):
|
||||
raise RuntimeError("Unable to query SCM revision of files")
|
||||
|
||||
return currentRev
|
||||
|
||||
@property
|
||||
def isSourceModified(self):
|
||||
if (self._previousSCMRevision == None):
|
||||
return True
|
||||
|
||||
if (self._previousSCMRevision == self.scmRevision):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def scanSetXmlFiles(self, includes):
|
||||
foundPrimary = False
|
||||
foundMultiple = False
|
||||
|
||||
for f in os.listdir(self.path):
|
||||
if not f.endswith("-set.xml"):
|
||||
continue
|
||||
|
||||
p = os.path.join(self.path, f)
|
||||
node = sgprops.readProps(p, includePaths = includes)
|
||||
if not node.hasChild("sim"):
|
||||
continue
|
||||
|
||||
simNode = node.getChild("sim")
|
||||
# honour variosu exclusion flags
|
||||
if (simNode.getValue("exclude-from-catalog", False) or simNode.getValue("exclude-from-gui", False)):
|
||||
continue
|
||||
|
||||
primary = simNode.getValue("variant-of", None)
|
||||
if primary:
|
||||
if not primary in self.variants:
|
||||
self._variants[primary] = []
|
||||
self._variants[primary].append(VariantData(f, node))
|
||||
continue
|
||||
|
||||
if foundPrimary:
|
||||
if not foundMultiple:
|
||||
print "Multiple primary -set.xml files at:" + self.path
|
||||
print "\t" + p
|
||||
foundMultiple = True
|
||||
continue
|
||||
else:
|
||||
foundPrimary = True;
|
||||
self._primarySetXmlPath = f[:-8] # trim -set.xml
|
||||
|
||||
self.parsePrimarySetNode(simNode)
|
||||
|
||||
for n in thumbnailNames:
|
||||
if os.path.exists(os.path.join(self.path, n)):
|
||||
self._thumbnails.append(n)
|
||||
|
||||
if not foundPrimary:
|
||||
raise RuntimeError("No primary -set.xml found at:" + self.path)
|
||||
|
||||
|
||||
|
||||
def parsePrimarySetNode(self, sim):
|
||||
|
||||
# basic / mandatory values
|
||||
self._node.addChild('name').value = sim.getValue('description')
|
||||
|
||||
longDesc = sim.getValue('long-description')
|
||||
if longDesc is not None:
|
||||
self._node.addChild('description').value = longDesc
|
||||
|
||||
# copy all the standard values
|
||||
for p in ['status', 'author', 'license']:
|
||||
v = sim.getValue(p)
|
||||
if v is not None:
|
||||
self._node.addChild(p).value = v
|
||||
|
||||
# ratings
|
||||
if sim.hasChild('rating'):
|
||||
pkgRatings = self._node.addChild('rating')
|
||||
for r in ['FDM', 'systems', 'cockpit', 'model']:
|
||||
pkgRatings.addChild(r).value = sim.getValue('rating/' + r, 0)
|
||||
|
||||
# copy tags
|
||||
if sim.hasChild('tags'):
|
||||
for c in sim.getChild('tags').getChildren('tag'):
|
||||
if isNonstandardTag(c.value):
|
||||
print "Skipping non-standard tag:", c.value, self.path
|
||||
else:
|
||||
self._node.addChild('tag').value = c.value
|
||||
|
||||
for t in sim.getChildren("thumbnail"):
|
||||
self._thumbnails.append(t.value)
|
||||
|
||||
def validate(self):
|
||||
for t in self._thumbnails:
|
||||
if not os.path.exists(os.path.join(self.path, t)):
|
||||
raise RuntimeError("missing thumbnail:" + t);
|
||||
|
||||
def generateZip(self, outDir, globalExcludePath):
|
||||
self._revision = self._previousRevision + 1
|
||||
|
||||
baseName = os.path.basename(self.path)
|
||||
zipName = baseName + ".zip"
|
||||
zipFilePath = os.path.join(outDir, zipName)
|
||||
|
||||
os.chdir(os.path.dirname(self.path))
|
||||
|
||||
print "Creating zip", zipFilePath
|
||||
# anything we can do to make this faster?
|
||||
|
||||
zipArgs = ['zip', '--quiet', '-r']
|
||||
if os.path.exists(globalExcludePath):
|
||||
zipArgs += [ "-x@" + globalExcludePath]
|
||||
|
||||
excludePath = os.path.join(self.path, 'package-exclude.lst')
|
||||
if (os.path.exists(excludePath)):
|
||||
print self.id, "has zip exclude list"
|
||||
zipArgs += ["-x@" + excludePath]
|
||||
|
||||
zipArgs += [zipFilePath, baseName]
|
||||
subprocess.call(zipArgs)
|
||||
|
||||
zipFile = open(zipFilePath, 'r')
|
||||
self._md5 = hashlib.md5(zipFile.read()).hexdigest()
|
||||
self._fileSize = os.path.getsize(zipFilePath)
|
||||
|
||||
def useExistingCatalogData(self):
|
||||
self._md5 = self._previousMD5
|
||||
|
||||
def packageNode(self, mirrorUrls, thumbnailUrl):
|
||||
self._node.addChild("id").value = self.id
|
||||
self._node.getChild("md5", create = True).value = self._md5
|
||||
self._node.getChild("file-size-bytes", create = True).value = self._fileSize
|
||||
self._node.getChild("revision", create = True).value = int(self._revision)
|
||||
self._node.getChild("scm-revision", create = True).value = self.scmRevision
|
||||
|
||||
baseName = os.path.basename(self.path)
|
||||
self._node.getChild("dir", create = True).value = baseName
|
||||
zipName = baseName + ".zip"
|
||||
|
||||
for m in mirrorUrls:
|
||||
self._node.addChild("url").value = m + "/" + zipName
|
||||
|
||||
for t in self._thumbnails:
|
||||
self._node.addChild("thumbnail-path").value = t
|
||||
self._node.addChild("thumbnail").value = thumbnailUrl + "/" + self.id + "_" + t
|
||||
|
||||
for pr in self._variants:
|
||||
for vr in self._variants[pr]:
|
||||
self._node.addChild(vr.catalogNode)
|
||||
|
||||
return self._node
|
||||
|
||||
def extractThumbnails(self, thumbnailDir):
|
||||
for t in self._thumbnails:
|
||||
fullName = self.id + "_" + t
|
||||
shutil.copy2(os.path.join(self._path, t),
|
||||
os.path.join(thumbnailDir, fullName)
|
||||
)
|
||||
# TODO : verify image format, size and so on
|
||||
@@ -8,14 +8,19 @@ import os, sys, re, fnmatch
|
||||
from subprocess import call
|
||||
|
||||
suffix = '.dmg'
|
||||
release_version = "unknown"
|
||||
|
||||
if sys.argv[1] == 'windows':
|
||||
suffix = '.exe'
|
||||
if sys.argv[1] == 'linux':
|
||||
suffix = '.tar.bz2'
|
||||
|
||||
isReleaseCandidate = False
|
||||
isRelease = False
|
||||
if len(sys.argv) > 2 and sys.argv[2] == 'release':
|
||||
isReleaseCandidate = True
|
||||
isRelease = True
|
||||
|
||||
if len(sys.argv) > 3:
|
||||
release_version = sys.argv[3]
|
||||
|
||||
allSuffix = '*' + suffix
|
||||
|
||||
@@ -25,10 +30,10 @@ sourceForgeUserHost = "jmturner@frs.sourceforge.net"
|
||||
sftpCommandFile = "sftp-commands"
|
||||
symbolDir = "/home/jenkins/symbols"
|
||||
|
||||
if isReleaseCandidate:
|
||||
if isRelease:
|
||||
publicRoot = "/var/www/html/builds/rc"
|
||||
incomingDir = "/home/jenkins/incoming"
|
||||
sourceForgePath = "/home/frs/project/f/fl/flightgear/release-candidate/"
|
||||
sourceForgePath = "/home/frs/project/f/fl/flightgear/release-" + release_version + "/"
|
||||
else:
|
||||
publicRoot = "/var/www/html/builds/nightly"
|
||||
incomingDir = "/home/jenkins/nightly-incoming"
|
||||
@@ -81,15 +86,15 @@ for file in incomingFiles:
|
||||
|
||||
outFile = file
|
||||
# insert -rc before suffix
|
||||
if isReleaseCandidate:
|
||||
m = re.match(r'(\w+-\d+\.\d+\.\d+[\w-]*)' + suffix, file)
|
||||
outFile = m.group(1) + '-rc' + suffix
|
||||
print "RC out name is " + outFile
|
||||
#if isRelease:
|
||||
#m = re.match(r'(\w+-\d+\.\d+\.\d+[\w-]*)' + suffix, file)
|
||||
#outFile = m.group(1) + '-rc' + suffix
|
||||
#print "RC out name is " + outFile
|
||||
|
||||
os.rename(srcFile, outFile)
|
||||
newFiles.append(outFile)
|
||||
|
||||
if not isReleaseCandidate:
|
||||
if not isRelease:
|
||||
# symlink for stable web URL
|
||||
m = re.match(r'(\w+)-\d+\.\d+\.\d+-([\w-]+)' + suffix, file)
|
||||
latestName = m.group(1) + '-latest-' + m.group(2) + suffix
|
||||
@@ -102,17 +107,17 @@ for file in incomingFiles:
|
||||
|
||||
|
||||
# remove files from SF
|
||||
if len(oldFiles) > 0:
|
||||
f = open(sftpCommandFile, 'w')
|
||||
f.write("cd " + sourceForgePath + '\n')
|
||||
for file in oldFiles:
|
||||
print "Removing file " + file + " from SourceForge"
|
||||
f.write("rm " + file + '\n')
|
||||
f.write("bye\n")
|
||||
f.close()
|
||||
|
||||
call(["sftp", "-b", sftpCommandFile, sourceForgeUserHost])
|
||||
os.remove(sftpCommandFile)
|
||||
#if len(oldFiles) > 0:
|
||||
# f = open(sftpCommandFile, 'w')
|
||||
# f.write("cd " + sourceForgePath + '\n')
|
||||
# for file in oldFiles:
|
||||
# print "Removing file " + file + " from SourceForge"
|
||||
# f.write("rm " + file + '\n')
|
||||
# f.write("bye\n")
|
||||
# f.close()
|
||||
#
|
||||
# call(["sftp", "-b", sftpCommandFile, sourceForgeUserHost])
|
||||
# os.remove(sftpCommandFile)
|
||||
|
||||
# upload to SourceForge
|
||||
for file in newFiles:
|
||||
|
||||
73
release_builder/create-release-branch-for.sh
Executable file
73
release_builder/create-release-branch-for.sh
Executable file
@@ -0,0 +1,73 @@
|
||||
#!/bin/bash
|
||||
#This file is part of FlightGear
|
||||
#
|
||||
#FlightGear is free software: you can redistribute it and/or modify
|
||||
#it under the terms of the GNU General Public License as published by
|
||||
#the Free Software Foundation, either version 2 of the License, or
|
||||
#(at your option) any later version.
|
||||
#
|
||||
#FlightGear is distributed in the hope that it will be useful,
|
||||
#but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
#GNU General Public License for more details.
|
||||
#
|
||||
#You should have received a copy of the GNU General Public License
|
||||
#along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
if [ -z "$1" -o -z "$2" ]; then
|
||||
echo "usage: thismajor.thisminor nextmajor.nextminor path"
|
||||
exit
|
||||
fi
|
||||
|
||||
|
||||
IFS='.' read -r -a VERSION_A <<< "$1"
|
||||
shift
|
||||
if [ ${#VERSION_A[@]} != 2 ]; then
|
||||
echo "Need version as 'number.number'"
|
||||
exit
|
||||
fi
|
||||
THIS_MAJOR_VERSION=${VERSION_A[0]}
|
||||
THIS_MINOR_VERSION=${VERSION_A[1]}
|
||||
RELEASE_BRANCH="release/${THIS_MAJOR_VERSION}.${THIS_MINOR_VERSION}"
|
||||
|
||||
IFS='.' read -r -a VERSION_A <<< "$1"
|
||||
shift
|
||||
if [ ${#VERSION_A[@]} != 2 ]; then
|
||||
echo "Need version as 'number.number'"
|
||||
exit
|
||||
fi
|
||||
NEXT_MAJOR_VERSION=${VERSION_A[0]}
|
||||
NEXT_MINOR_VERSION=${VERSION_A[1]}
|
||||
|
||||
setVersionTo() {
|
||||
local V="$1"
|
||||
echo "setting version to $V"
|
||||
echo "$V" > version
|
||||
git add version
|
||||
echo "new version: $V" | git commit --file=-
|
||||
git tag "version/$V"
|
||||
}
|
||||
|
||||
createBranch() {
|
||||
echo "Preparing release in `pwd`"
|
||||
|
||||
git checkout next
|
||||
git pull --rebase
|
||||
|
||||
setVersionTo "${THIS_MAJOR_VERSION}.${THIS_MINOR_VERSION}.1"
|
||||
|
||||
echo "Creating branch $RELEASE_BRANCH for version $(cat version) in `pwd`"
|
||||
git branch "$RELEASE_BRANCH"
|
||||
|
||||
setVersionTo "${NEXT_MAJOR_VERSION}.${NEXT_MINOR_VERSION}.0"
|
||||
}
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
echo "Processing $1"
|
||||
pushd $1 > /dev/null
|
||||
git config user.name "Automatic Release Builder"
|
||||
git config user.email "build@flightgear.org"
|
||||
createBranch
|
||||
popd > /dev/null
|
||||
shift
|
||||
done
|
||||
45
release_builder/create-release-branch.sh
Executable file
45
release_builder/create-release-branch.sh
Executable file
@@ -0,0 +1,45 @@
|
||||
#!/bin/bash
|
||||
|
||||
THIS_RELEASE="2017.1"
|
||||
NEXT_RELEASE="2017.2"
|
||||
SUBMODULES="simgear flightgear fgdata"
|
||||
|
||||
#:<< 'COMMENT_END'
|
||||
git checkout next
|
||||
git pull --rebase
|
||||
|
||||
$(dirname $0)/create-release-branch-for.sh "$THIS_RELEASE" "$NEXT_RELEASE" $SUBMODULES .
|
||||
|
||||
# use release branch for submodules
|
||||
git checkout release/${THIS_RELEASE}
|
||||
for f in $SUBMODULES; do
|
||||
git config -f .gitmodules submodule.${f}.branch release/${THIS_RELEASE}
|
||||
done
|
||||
git add .gitmodules && echo "set correct release-branch for submodules" | git commit --file=-
|
||||
|
||||
# track submodule changes
|
||||
git checkout next
|
||||
git add $SUBMODULES && echo "track submodule changes for release" | git commit --file=-
|
||||
#COMMENT_END
|
||||
|
||||
echo "Check this and submodules $SUBMODULES - hit <enter> to push or <ctrl-c> to cancel"
|
||||
read something
|
||||
|
||||
for f in $SUBMODULES .; do
|
||||
pushd "$f"
|
||||
echo "Pushing $f"
|
||||
git checkout release/${THIS_RELEASE} && git push origin release/${THIS_RELEASE} && git push origin version/${THIS_RELEASE}.1 && git push origin version/${NEXT_RELEASE}.0 && git checkout next && git push
|
||||
popd
|
||||
done
|
||||
|
||||
#this needs ~/.ssh/config to contain this
|
||||
#HOST sf svn.code.sf.net
|
||||
# HOSTNAME svn.code.sf.net
|
||||
# IdentityFile ~/.ssh/your_sf_keyfile
|
||||
# IdentitiesOnly yes
|
||||
# User user_sf_username
|
||||
|
||||
svn copy svn+ssh://svn.code.sf.net/p/flightgear/fgaddon/trunk \
|
||||
svn+ssh://svn.code.sf.net/p/flightgear/fgaddon/branches/release-${THIS_RELEASE} \
|
||||
-m "branching for release ${THIS_RELEASE}"
|
||||
|
||||
2
simgear
2
simgear
Submodule simgear updated: 951859d8a7...86fb1ed00f
@@ -1,41 +0,0 @@
|
||||
|
||||
import subprocess, os, sgprops
|
||||
import xml.etree.cElementTree as ET
|
||||
|
||||
class SVNCatalogRepository:
|
||||
def __init__(self, node):
|
||||
path = node.getValue("path")
|
||||
if not os.path.exists(path):
|
||||
raise RuntimeError("No directory at:" + path)
|
||||
|
||||
self._path = path
|
||||
xml = subprocess.check_output(["svn", "info", "--xml", path])
|
||||
root = ET.fromstring(xml)
|
||||
|
||||
if (root.find(".//repository/root") == None):
|
||||
raise RuntimeError("Not an SVN repository:" + path)
|
||||
|
||||
self._aircraftPath = None
|
||||
if node.hasChild("scan-suffix"):
|
||||
self._aircraftPath = os.path.join(path, node.getValue("scan-suffix"))
|
||||
|
||||
@property
|
||||
def path(self):
|
||||
return self._path
|
||||
|
||||
@property
|
||||
def aircraftPath(self):
|
||||
return self._aircraftPath
|
||||
|
||||
def hasPathChanged(self, path, oldRevision):
|
||||
return self.scmRevisionForPath(path) != oldRevision
|
||||
|
||||
def scmRevisionForPath(self, path):
|
||||
xml = subprocess.check_output(["svn", "info", "--xml", path])
|
||||
root = ET.fromstring(xml)
|
||||
commit = root.find(".//entry/commit")
|
||||
return commit.get('revision', 0)
|
||||
|
||||
def update(self):
|
||||
print "SVN update of", self._path
|
||||
subprocess.call(["svn", "update", self._path])
|
||||
@@ -1,52 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Template catalog - copy and modify for your site as required
|
||||
-->
|
||||
<PropertyList>
|
||||
|
||||
<!--
|
||||
catalogProps.addChild('version').value = '3.1.0'
|
||||
catalogProps.addChild('id').value = 'org.flightgear.default'
|
||||
catalogProps.addChild('license').value = 'GPL'
|
||||
catalogProps.addChild('url').value = "http://fgfs.goneabitbursar.com/pkg/3.1.0/default-catalog.xml"
|
||||
|
||||
catalogProps.addChild('description').value = "Aircraft developed and maintained by the FlightGear project"
|
||||
|
||||
de = catalogProps.addChild('de')
|
||||
# de.addChild('description').value = "<German translation of catalog description>"
|
||||
|
||||
fr = catalogProps.addChild('fr')
|
||||
-->
|
||||
|
||||
<version>3.4.*</version>
|
||||
<version>3.5.*</version>
|
||||
<version>3.6.*</version>
|
||||
|
||||
<id>org.myorganisation.hangar</id>
|
||||
<license>GPL</license>
|
||||
<url>http://some.stable.url.com/foo/bar/catalog.xml</url>
|
||||
|
||||
<description>A collection of interesting aircraft with some features
|
||||
</description>
|
||||
|
||||
<de>
|
||||
<description>Au Deutsch</description>
|
||||
</de>
|
||||
|
||||
<fr>
|
||||
<description>Francais</description>
|
||||
</fr>
|
||||
|
||||
<mirror>http://some.url/</mirror>
|
||||
<!-- <mirror>another mirror</mirror> -->
|
||||
|
||||
|
||||
<thumbnails>http://some.url/images</thumbnails>
|
||||
|
||||
<git-repository>git://some.git.repo/</git-repository>
|
||||
|
||||
<repository-prefix>Aircraft</repository-prefix>
|
||||
|
||||
</PropertyList>
|
||||
|
||||
|
||||
Submodule windows-3rd-party updated: 527969ffe1...790648cd69
Reference in New Issue
Block a user