Check-in [1ba61d8533]
Not logged in
Overview
Comment:Various fixes related to package version checking and OpenPGP integration.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 1ba61d8533776823b3ef1bdbb069d1bb685cfa13
User & Date: mistachkin on 2020-03-27 20:58:08
Other Links: manifest | tags
Context
2020-03-27
21:03
Update generated documentation. check-in: 63c15d9539 user: mistachkin tags: trunk
20:58
Various fixes related to package version checking and OpenPGP integration. check-in: 1ba61d8533 user: mistachkin tags: trunk
2020-03-26
15:12
Add more comments. Closed-Leaf check-in: ffccb611a3 user: mistachkin tags: pending
2019-12-02
22:06
Fix typos in the Harpy 'sign' tool. check-in: b2ec485564 user: mistachkin tags: trunk
Changes

Modified client/1.0/neutral/pkgd.eagle from [a8520a0f88] to [eff6e99d05].

1261
1262
1263
1264
1265
1266
1267
1268


1269
1270

1271
1272
1273
1274
1275
1276
1277
1261
1262
1263
1264
1265
1266
1267

1268
1269
1270

1271
1272
1273
1274
1275
1276
1277
1278







-
+
+

-
+








  #
  # NOTE: This procedure issues a request to an HTTP(S) server.  It returns
  #       the raw response data verbatim.  It may raise a script error.  It
  #       will always use the currently configured HTTP(S) login cookie, if
  #       any; therefore, it should really only be used for requests to the
  #       package file server.  The uri argument is the fully qualified URI
  #       to request.
  #       to request.  The allowHtml argument should be non-zero if raw HTML
  #       should be allowed in the response data.
  #
  proc getPackageFile { uri } {
  proc getPackageFile { uri {allowHtml false} } {
    variable loginCookie
    variable quiet

    if {[isEagle]} then {
      if {![info exists ::eagle_platform(compileOptions)]} then {
        error "missing compile options from Eagle platform array"
      }
1301
1302
1303
1304
1305
1306
1307
1308

1309
1310

1311
1312
1313
1314
1315
1316
1317
1318
1319

1320
1321











1322
1323
1324
1325
1326
1327
1328
1302
1303
1304
1305
1306
1307
1308

1309
1310

1311
1312
1313
1314
1315
1316
1317
1318
1319

1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340







-
+

-
+








-
+


+
+
+
+
+
+
+
+
+
+
+







      if {[info exists loginCookie] && [llength $loginCookie] == 2} then {
        set script [object create String {
          if {[methodName ToString] eq "GetWebRequest"} then {
            webRequest Headers.Add Cookie [join $loginCookie =]
          }
        }]

        return [uri download -inline -webclientdata $script -- $uri]
        set data [uri download -inline -webclientdata $script -- $uri]
      } else {
        return [uri download -inline -- $uri]
        set data [uri download -inline -- $uri]
      }
    } else {
      set options [list -binary true]

      if {[info exists loginCookie] && [llength $loginCookie] == 2} then {
        lappend options -headers [list Cookie [join $loginCookie =]]
      }

      return [eval ::PackageRepository::getFileViaHttp \
      set data [eval ::PackageRepository::getFileViaHttp \
          [list $uri] [list 20] [list stdout] [list $quiet] $options]
    }

    #
    # HACK: Check for the typical Fossil error response(s), which is an
    #       HTML page that may contain something like "Artifact 'X' does
    #       not exist in this repository").
    #
    if {!$allowHtml && [string range $data 0 14] eq "<!DOCTYPE html>"} then {
      error "bad package file response data, appears to be HTML page"
    }

    return $data
  }

  #
  # NOTE: This procedure returns the prefix for fully qualified variable
  #       names that MAY be present in the global namespace.  There are
  #       no arguments.
  #
1515
1516
1517
1518
1519
1520
1521











































































































































1522
1523
1524
1525
1526
1527
1528
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







          "returning temporary directory name \"" $result \
          "\" for prefix \"" $prefix \"...]
    }

    return $result
  }

  #
  # NOTE: This procedure creates a new interpreter, which may be "safe", and
  #       places a reference to it in a variable in the context of the caller
  #       identified by the varName argument.  The created interpreter has a
  #       fully functioning [package] command ensemble; all other commands do
  #       nothing and return nothing.  This procedure may raise script errors.
  #
  proc createInterp { varName } {
    #
    # NOTE: Prepare to provide the caller with the newly created interpreter
    #       reference.
    #
    upvar 1 $varName interp

    #
    # NOTE: Create a "safe" interpreter and set the global "dir" variable to
    #       a single period.  Generally, this is the only variable used by a
    #       package index file.  It should be noted that since [set] will be
    #       a NOP, attempts to use other variables in the specified package
    #       index file (e.g. ones [set] within it) will fail.
    #
    set interp [interp create -safe]
    interp eval $interp [list set dir .]

    #
    # NOTE: First, obtain the list of child namespaces to delete, if any, and
    #       then delete them all.  This should leave the global namespace and
    #       its commands / variables untouched.
    #
    set namespaces [interp eval $interp [list namespace children ::]]

    foreach namespace $namespaces {
      catch {
        interp eval $interp [list namespace delete $namespace]
      }
    }

    #
    # NOTE: Next, obtain the list of global commands and delete all of them
    #       except the [proc] and [package] commands.  The [proc] command is
    #       handled specially (last) and the [package] command is retained.
    #
    set commands [interp eval $interp [list info commands]]

    foreach command $commands {
      if {$command ne "proc" && $command ne "package"} then {
        interp eval $interp [list proc $command args ""]; # NOP
      }
    }

    if {![isEagle]} then {
      #
      # HACK: The "safe" interpreters in native Tcl do not contain
      #       the [file] command at all, not even for [file join]
      #       and [file split], which may be used in package index
      #       files; therefore, add it as a NOP command.
      #
      interp eval $interp [list proc file args ""]; # NOP
    }

    #
    # NOTE: Next, disable the [proc] command.  This must be done last
    #       because it is used to disable (i.e. via NOP) all the other
    #       global commands.
    #
    interp eval $interp [list proc proc args ""]; # NOP

    #
    # NOTE: Finally, return nothing as the created interpreter reference
    #       is placed directly into the variable specified by the caller.
    #
    return ""
  }

  #
  # NOTE: This procedure evaluates a script file and attempts to determine the
  #       list of new [package ifneeded] scripts added by it.  When successful
  #       it returns a list-of-lists.  Each element of the outer list contains
  #       a package name and the list of its versions in descending order; in
  #       the event of failure, empty lists may be returned for the outer list
  #       or for a list of versions.  The interp argument is the interp to use
  #       when evaluating the file specified by the fileName argument.  This
  #       procedure may raise script errors.
  #
  proc getIfNeededVersions { interp fileName } {
    set result [list]

    set oldPackageNames [interp eval $interp [list package names]]
    interp invokehidden $interp source $fileName; # [package ifneeded], etc.
    set newPackageNames [interp eval $interp [list package names]]

    foreach packageName $newPackageNames {
      if {[lsearch -exact $oldPackageNames $packageName] == -1} then {
        lappend result [list $packageName [lsort -decreasing \
            -command [list package vcompare] [interp eval \
            $interp [list package versions $packageName]]]]
      }
    }

    return $result
  }

  #
  # NOTE: This procedure attempts to extract a package version information
  #       from the specified file.  The fileName argument is the local file
  #       name to read.  This procedure may raise script errors.
  #
  proc extractVersionsFromFile { fileName } {
    switch -exact -- [file tail $fileName] {
      VERSION {
        return [list [string trim [readFile $fileName]]]
      }
      pkgIndex.eagle -
      pkgIndex.tcl {
        #
        # TODO: Evaluate the package index file in a new "safe"
        #       interpreter and obtain the newly added [package
        #       ifneeded] version(s)?
        #
        if {[catch {createInterp interp} error] == 0} then {
          set result [getIfNeededVersions $interp $fileName]
        } else {
          pkgLog [appendArgs \
              "could not create interp to extract versions: " \
              $error]

          set result [list]
        }

        if {[info exists interp]} then {
          catch {interp delete $interp}
          unset interp; # REDUNDANT
        }

        return $result
      }
    }
  }

  #
  # NOTE: This procedure checks if there is a higher version available of the
  #       specified package on the package file server.  The language argument
  #       must be one of the literal strings "eagle", "tcl", or "client".  The
  #       version argument must be one of the literal strings "8.4", "8.5", or
  #       "8.6" when the language is "tcl" -OR- the literal string "1.0" when
  #       the language is either "eagle" or "client".  The platform argument
1549
1550
1551
1552
1553
1554
1555



1556
1557


1558
1559

1560

1561
1562
1563
1564
1565
1566
1567
1568








1569
1570

1571
1572
1573
1574



1575
1576
1577
1578
1579
1580





1581
1582





1583
1584
1585
1586
1587
1588
1589
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709


1710
1711
1712

1713
1714
1715








1716
1717
1718
1719
1720
1721
1722
1723
1724

1725
1726



1727
1728
1729
1730





1731
1732
1733
1734
1735
1736

1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748







+
+
+
-
-
+
+

-
+

+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+

-
+

-
-
-
+
+
+

-
-
-
-
-
+
+
+
+
+

-
+
+
+
+
+







    if {$isClient} then {
      set persistentDirectory $clientDirectory
    } else {
      verifyPersistentRootDirectory
      set persistentDirectory $persistentRootDirectory
    }

    set fileNamesOnly [list VERSION pkgIndex.eagle pkgIndex.tcl]

    foreach fileNameOnly $fileNamesOnly {
    set fileName [file join $packageName VERSION]
    set downloadFileName [file join $temporaryDirectory $fileName]
      set fileName [file join $packageName $fileNameOnly]
      set downloadFileName [file join $temporaryDirectory $fileName]

    file mkdir [file dirname $downloadFileName]
      file mkdir [file dirname $downloadFileName]

      if {[catch {
    downloadOneFile $language $version $platform \
        $fileName $downloadFileName $usePgp

    if {$usePgp} then {
      downloadOneFile $language $version $platform \
          [appendArgs $fileName .asc] \
          [appendArgs $downloadFileName .asc] $usePgp
    }
        downloadOneFile $language $version $platform \
            $fileName $downloadFileName $usePgp
      }] == 0} then {
        if {$usePgp} then {
          downloadOneFile $language $version $platform \
              [appendArgs $fileName .asc] \
              [appendArgs $downloadFileName .asc] $usePgp
        }

    set localFileName [file join $persistentDirectory $fileName]
        set localFileName [file join $persistentDirectory $fileName]

    set compare [package vcompare \
        [string trim [readFile $downloadFileName]] \
        [string trim [readFile $localFileName]]]
        set compare [package vcompare \
            [lindex [extractVersionsFromFile $downloadFileName] 0] \
            [lindex [extractVersionsFromFile $localFileName] 0]]

    if {[isEagle]} then {
      file delete -recursive -- $temporaryDirectory
    } else {
      file delete -force -- $temporaryDirectory
    }
        if {[isEagle]} then {
          file delete -recursive -- $temporaryDirectory
        } else {
          file delete -force -- $temporaryDirectory
        }

    return [expr {$compare > 0}]
        return [expr {$compare > 0}]
      }
    }

    error "could not check higher version: no supported file names"
  }

  #
  # NOTE: This procedure attempts to guess a package name based on a list of
  #       its files.  It relies upon the fact that all packages must include
  #       a package index file.  The language argument must be one of the
  #       literal strings "eagle", "tcl", or "client".  The fileNames argument

Modified client/1.0/neutral/pkgd.eagle.asc from [ca7e2d07fe] to [83ddd6ed04].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17













18
1
2
3
4













5
6
7
8
9
10
11
12
13
14
15
16
17
18




-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
Comment: Eagle Package Repository

iQIcBAABCAAGBQJdwuz3AAoJEFAslq9JXcLZHRAQAJq45rRYk9r9CjPmahPUfOeF
baZC3iDFz8VWDuv4hcU6W2q+RgwqWnsS06wUoVXYnrk2bCY8MH/0XDvkQwtGxIEc
k2p63L9zxw/ri5FxvNYuGIvDl+lhrqKleMHZODCKibQwM51to2CPXx1bMgbKsvDO
sXW2Mz4gcV8GwItdY/sZjEwq8qU/wfXjW4ZWcwaBp3smadUZBv7r94i4nFRdT+yD
5YwxT7Qy0J6qyVxseH4GI1onA/ds1p/to2Wmy4fELUesAuOwwsGNcDTUZl+zDUEy
Fxj16CHWu62lv+YSBDmFFd1xrUBNKvVZ3ckATRXVznbmQYYEwRgv9Dg8GeDg7qtv
zRnUYj5BCCVG8aBYJccCXC2h+cby8otoUF/bCPr9BJwWw/KqzZFeLGLSf5/5rIUB
XK7sOe/2GNkw4nu7NxbgCyHUpZfbr/5eafmhOK2AAwR518NbqDhjhTzJGOUCkkbd
G9qZpkcDQZULVYu20fRYqUW341k5frZ03dcqKVx0ZWg9EQhspbNkV07MQnH3lTG2
A4AkgUQladsqfgR6wnskF0tlcTozy50Jj2wUNZU8N0ciQEUS/2vZDO0hwRrSuJdj
dq6L8+4/EBrEGO3bbwcipi0CACMTYviI5gSECc6wBaqSwllilXVrPLmm/GLgb2yU
xp1P34dex7A0cxbnlncp
=8/XM
iQIcBAABCAAGBQJefmh2AAoJEFAslq9JXcLZU+UP/2og4/PHeqflZF+G46gSq7mc
Fl+jpy8Dm/H22L2hA+j8h3BlTd8a+KZt5puYtcZjtNbTny0FBwJlLLwDsrtUKzO8
proJZlROO4uXkpQz9HDO8P8nAqb+V3xmfn948kolByR3FGr7kjoH6F6YHmiegmo5
8jBsGKVKpyRTp2inxAnhH0iYDzlLt3mNBqPLjL9oDMPbRuEvf7c1r2nahv0ZetbI
r506ozMxd/h17NYtrVajT6MvvMDtymqWvpRWkpqhH/XUksmNNuWr594B3c9uLr0f
ubZYd0oo0thqdNtxxFLw1xZy15t4lwt8RQ4jVPR3B5Yc2ENSmRVJq7InjL8rTy9O
X9c/dOwtlT3vISXmi9R8S+64876M6DVRG79NNfV6sMbyhestUNxgr3KmbkliHzu1
2obGwnWGtncrS/JWnsu+5P2qIWcXTGOka0RZchGMu3hk/6EqYuTHGr7OVUhhvJzy
qOXpiY+kOu4IMA5tpa9bahExE3dyWMAA1z5vx9Hu1TEHCfzICE+iWQ+rskN6orwr
N4aiJchl2xLZDOZp9LXJRsBEvzCApwYx1xSfpu9IFqrClSrQ+vZLvttkppv967ZZ
BxHe/1/gROYxECELBtydWM/w5kLuJHRY0Q1sV8E7rcNa28uDHpFbwhm9ZkbADDrr
yLCorIpOhiR+CTM/QQGI
=0ByE
-----END PGP SIGNATURE-----

Modified client/1.0/neutral/pkgd.eagle.harpy from [d344a71fd0] to [33fa834c19].

17
18
19
20
21
22
23
24

25
26
27

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66




































67
68
17
18
19
20
21
22
23

24
25
26

27
28
29
30




































31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68







-
+


-
+



-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


    THE ASSOCIATED SOFTWARE MAY NOT WORK PROPERLY IF THIS FILE IS ALTERED.
-->
<Certificate xmlns="https://eagle.to/2011/harpy"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Protocol>None</Protocol>
  <Vendor>Mistachkin Systems</Vendor>
  <Id>99b4ca9b-d98b-4ff8-9f54-4ceda46b22e5</Id>
  <Id>ed107b00-7d62-4824-b6b9-f094571af22f</Id>
  <HashAlgorithm>SHA512</HashAlgorithm>
  <EntityType>Script</EntityType>
  <TimeStamp>2019-11-06T15:53:46.6032795Z</TimeStamp>
  <TimeStamp>2020-03-27T20:56:02.6471192Z</TimeStamp>
  <Duration>-1.00:00:00</Duration>
  <Key>0x9559f6017247e3e2</Key>
  <Signature>
    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
  </Signature>
</Certificate>

Modified client/1.0/neutral/pkgd.eagle.harpy.asc from [6993fd762b] to [435ff4a320].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17













18
1
2
3
4













5
6
7
8
9
10
11
12
13
14
15
16
17
18




-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
Comment: Eagle Package Repository

iQIcBAABCAAGBQJdwuz5AAoJEFAslq9JXcLZUDUQAIlvZ+UZowmVWidxVUfoblPo
oLRZfqAHGoMqZfywKPuwrUY7CTJooQcn94bQ7Hu818AwRD+H3QWEqL98XaXADnEe
b0Xk0zD2Carq2XIAKrWwFPQE/sJFdXfFPAWh3NMfzxjd2qgDDZCdV22pr8fiQ4So
EnsVQqPeYJqUExU3Ye7WvamuDwcWJ9uiiXb+imTWzpl/1it879Kk2zwgYW/a1NuA
nSUoyL9uoNtCFjbrvgpoVmIrgJ1EINEarOCkLhg/sBcna4Ub/hk2ACdx+Nqh/nBg
pLov823BCyf3kluI0fOaw6xJ9XfOijebz2iV8SN8ey6TEDNM8n9WKxLn7i4vxkBx
9tcMWP1qQ6IGHAOjABdYUFVn/YrvJhbYYJXBDTAMNduBAHezzJYYRN+DL2UfpE1I
gffU15sSORtbApU9gmWjIhGg4kxfqiVr1R5dwHgoTOdZZ6K2/GRAr033x9qyshdz
7m+MD4sYCog+OqhimgX3QQaNvNZEFjQe9sdkzia13pkQ4JECj6qOPuLhiof8zCU2
NOfMFJDIz1TYbAG29BxjyLqMbt9wj2YZA4y1pdLPH9LdrDBowyGee5t519c8wM6f
6dJRAVoMKYc5OPbe9RJ11C0cPB9dIenGrTuHuj5xKctAvRmhR9fJa8/tJ7bRcH5I
r/mx5wYNZ4oPTbhzJT38
=N7fZ
iQIcBAABCAAGBQJefmh3AAoJEFAslq9JXcLZQvEP/2DmyHIFHTJQ24GRXISNApvc
SwE5Ph/E9rHXsn8FcUZ9nlUt/FBcKDNePCY6g4p1R278sSUEzHv7vG14SfjeGnHr
CDUJN/ALCcappRyvoT39bb2pJ1PwPF3iCebnGNk98wU1vneVSwMAqS5RMCrYgm1u
qOc/s5auwrSJPmKGzd3+pSeVLaoollhIsEfh+JbEmGZX0/p/0IeC/PY3EdU2W7Vd
HE3Tk2t+tS7GiQbkAMF0V3xyc2/11nFiNYz8L20ioEKmYaFO/ScfJZP6ZV2uhwjR
s+lkmWQjO3izSr7bfM8Ffg/UutCgspnyc7DGVAQApZ9AV03m1NR6vYE4/4zdhOVm
2IhKJ/yAJYmiuE7vaA1EM2m1eWccQCY2bMTTE7OdYgPRbT8AWIjS3pWCM0BUIYAv
TAACji5249/Dz8BNT75Y7G6P7CN7H0l2lDUAQKd9YngEZJX21zfAKIxEhmuHcrCG
sVhpfLfGlfXfsaPGBgtPkKsXPdHPLVUGbdEcB/MFsmE5yLzIaaJyhOx4SOQAn91n
BApw6NKPsQDi8CeUeL/ydqG6sJP2gO1WtpQot4sB5BCuz43BFGLIxtWATpl7QRsv
tc+YPeJLx9Ksb66pjoR1yJ/INodUCK8TEXf3x+KORg01r9Z1foLd6fwc01Jsr/tE
70r34qCHAuJjL7WaRrOy
=l79d
-----END PGP SIGNATURE-----

Modified client/1.0/neutral/pkgr.eagle from [8f2d9374a1] to [dd293526a1].

415
416
417
418
419
420
421
422
423


424
425
426
427
428
429

430
431
432
433

434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449








450
451

452
453
454
455


456
457
458










459
460
461
462
463
464
465
415
416
417
418
419
420
421


422
423
424
425
426
427
428

429
430
431
432

433
434
435
436
437
438
439
440
441
442
443
444





445
446
447
448
449
450
451
452
453

454




455
456
457


458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474







-
-
+
+





-
+



-
+











-
-
-
-
-
+
+
+
+
+
+
+
+

-
+
-
-
-
-
+
+

-
-
+
+
+
+
+
+
+
+
+
+







  #       OpenPGP installation directory was successfully detected and added
  #       to the PATH -OR- detecting and adding it was not necessary because
  #       it already appeared to be available for use.
  #
  # <internal>
  proc probeForOpenPgpInstallation {} {
    global env
    variable openPgpFileNameOnly
    variable openPgpInstalledDirectory
    variable openPgpFileNamesOnly
    variable openPgpInstalledDirectories

    if {[catch {openPgpMustBeInstalled}] == 0} then {
      return true
    }

    if {![info exists openPgpFileNameOnly]} then {
    if {![info exists openPgpFileNamesOnly]} then {
      return false
    }

    if {![info exists openPgpInstalledDirectory]} then {
    if {![info exists openPgpInstalledDirectories]} then {
      return false
    }

    if {[isWindows]} then {
      if {[info exists env(ProgramFiles(x86))]} then {
        set programFiles $env(ProgramFiles\(x86\))
      } elseif {[info exists env(ProgramFiles)]} then {
        set programFiles $env(ProgramFiles)
      } else {
        return false
      }

      set directory [file join $programFiles $openPgpInstalledDirectory]
    } else {
      set directory $openPgpInstalledDirectory
    }
    }

    foreach directory $openPgpInstalledDirectories {
      if {[isWindows]} then {
        set subDirectory [file join $programFiles $directory]
      } else {
        set subDirectory $directory
      }

    if {![file isdirectory $directory]} then {
      if {[file isdirectory $subDirectory]} then {
      return false
    }

    set fileName [file join $directory $openPgpFileNameOnly]
        foreach fileNameOnly $openPgpFileNamesOnly {
          set fileName [file join $subDirectory $fileNameOnly]

    if {[file exists $fileName] && [file isfile $fileName]} then {
      return [addToPath $directory]
          if {[file exists $fileName] && [file isfile $fileName]} then {
            pkgLog [appendArgs \
                "the OpenPGP directory is being initialized to \"" \
                $subDirectory "\" based on OpenPGP file name \"" \
                $fileNameOnly \"]

            return [addToPath $subDirectory]
          }
        }
      }
    }

    return false
  }

  #
  # NOTE: This procedure attempts to verify that a configured implementation
483
484
485
486
487
488
489
490

491
492
493
494
495
496
497
492
493
494
495
496
497
498

499
500
501
502
503
504
505
506







-
+








      Alternatively, it may be possible to install GNU Privacy Guard (GPG) via
      the package management subsystem included with your operating system.
    }

    set found false

    foreach fileName $openPgpFileNamesOnly {
    foreach fileNameOnly $openPgpFileNamesOnly {
      if {[isEagle]} then {
        if {[catch {
          eval exec -success Success [subst $openPgpInstalledCommand]
        } result] == 0} then {
          set found true; break
        }
      } else {
509
510
511
512
513
514
515
516

517
518
519

520
521

522
523
524
525
526
527




528

529
530
531
532
533
534
535
518
519
520
521
522
523
524

525
526
527

528
529

530
531
532
533
534
535
536
537
538
539
540

541
542
543
544
545
546
547
548







-
+


-
+

-
+






+
+
+
+
-
+







      #       viable OpenPGP file name?
      #
      if {[info exists openPgpFileNameOnly]} then {
        #
        # NOTE: If the OpenPGP file name that we found before (?) does not
        #       match what we already have, issue a log message.
        #
        if {$fileName ne $openPgpFileNameOnly} then {
        if {$fileNameOnly ne $openPgpFileNameOnly} then {
          pkgLog [appendArgs \
              "the OpenPGP file name is being changed from \"" \
              $openPgpFileNameOnly "\" to \"" $fileName \"]
              $openPgpFileNameOnly "\" to \"" $fileNameOnly \"]

          set openPgpFileNameOnly $fileName
          set openPgpFileNameOnly $fileNameOnly
        }
      } else {
        #
        # NOTE: Configure the OpenPGP file name to the one that was just
        #       found.
        #
        pkgLog [appendArgs \
            "the OpenPGP file name is being initialized to \"" \
            $fileNameOnly \"]

        set openPgpFileNameOnly $fileName
        set openPgpFileNameOnly $fileNameOnly
      }
    } else {
      #
      # NOTE: If no viable OpenPGP file name was found, raise the error
      #       message.
      #
      error $message
2296
2297
2298
2299
2300
2301
2302
2303

2304
2305

2306
2307


2308
2309


2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320

2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341

2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353

2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365


2366
2367
2368
2369
2370
2371
2372
2373
2374
2375

2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386

2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398

2399
2400
2401
2402
2403
2404
2405
2309
2310
2311
2312
2313
2314
2315

2316
2317

2318
2319

2320
2321
2322

2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334

2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355

2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367

2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378


2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389

2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400

2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412

2413
2414
2415
2416
2417
2418
2419
2420







-
+

-
+

-
+
+

-
+
+










-
+




















-
+











-
+










-
-
+
+









-
+










-
+











-
+







  #
  proc setupRepositoryOpenPgpVars { force } {
    #
    # NOTE: This is the name of the sub-directory containing the OpenPGP
    #       implementation.  It is platform-specific.  On Windows, this
    #       sub-directory is relative to the "Program Files" directory.
    #
    variable openPgpInstalledDirectory; # DEFAULT: [file join GNU GnuPG]
    variable openPgpInstalledDirectories; # DEFAULT: [list ...]

    if {![info exists openPgpInstalledDirectory]} then {
    if {$force || ![info exists openPgpInstalledDirectories]} then {
      if {[isWindows]} then {
        set openPgpInstalledDirectory [file join GNU GnuPG]
        set openPgpInstalledDirectories [list \
            [file join gnupg bin] [file join GNU GnuPG]]
      } else {
        set openPgpInstalledDirectory [file join / usr bin]
        set openPgpInstalledDirectories [list \
            [file join / usr bin]]
      }
    }

    #
    # NOTE: These are the candidate names of the executable file used to
    #       invoke the OpenPGP implementation, possibly without a file
    #       extension.
    #
    variable openPgpFileNamesOnly; # DEFAULT: [list gpg2 gpg]

    if {![info exists openPgpFileNamesOnly]} then {
    if {$force || ![info exists openPgpFileNamesOnly]} then {
      if {[isWindows]} then {
        set openPgpFileNamesOnly [list gpg2.exe gpg.exe]
      } else {
        set openPgpFileNamesOnly [list gpg2 gpg]
      }
    }

    #
    # NOTE: This is the name of the executable file used to invoke the
    #       OpenPGP implementation, possibly without a file extension.
    #
    variable openPgpFileNameOnly; # DEFAULT: <unset>

    #
    # NOTE: The command to use when attempting to import an OpenPGP key
    #       file.  This must be configured according to the implementation
    #       of OpenPGP in use.
    #
    variable openPgpImportCommand; # DEFAULT: gpg2 --import

    if {![info exists openPgpImportCommand]} then {
    if {$force || ![info exists openPgpImportCommand]} then {
      set openPgpImportCommand \
          {{${openPgpFileNameOnly}} --import {${fileName}}}
    }

    #
    # NOTE: The regular expression pattern used when attempting to verify
    #       that OpenPGP successfully imported one or more keys.  This must
    #       be configured according to the implementation of OpenPGP in use.
    #
    variable openPgpImportPattern; # DEFAULT: ^gpg: Total number processed...

    if {![info exists openPgpImportPattern]} then {
    if {$force || ![info exists openPgpImportPattern]} then {
      set openPgpImportPattern {^gpg: Total number processed: [1-9]\d*$}
    }

    #
    # NOTE: The command to use when attempting to verify that OpenPGP is
    #       installed locally.  This must be configured according to the
    #       implementation of OpenPGP in use.
    #
    variable openPgpInstalledCommand; # DEFAULT: gpg2 --version --homedir {}

    if {![info exists openPgpInstalledCommand]} then {
      set openPgpInstalledCommand {{${fileName}} --version --homedir {}}
    if {$force || ![info exists openPgpInstalledCommand]} then {
      set openPgpInstalledCommand {{${fileNameOnly}} --version --homedir {}}
    }

    #
    # NOTE: The regular expression pattern used when attempting to verify
    #       that OpenPGP is installed locally.  This must be configured
    #       according to the implementation of OpenPGP in use.
    #
    variable openPgpInstalledPattern; # DEFAULT: ^gpg \(GnuPG\) 2\.[0123]\.

    if {![info exists openPgpInstalledPattern]} then {
    if {$force || ![info exists openPgpInstalledPattern]} then {
      set openPgpInstalledPattern {^gpg \(GnuPG\) 2\.[0123]\.}
    }

    #
    # NOTE: The command to use when verifying OpenPGP signatures for the
    #       downloaded package scripts.  This must be configured according
    #       to the implementation of OpenPGP in use.
    #
    variable openPgpVerifyCommand; # DEFAULT: gpg2 --verify {${fileName}}

    if {![info exists openPgpVerifyCommand]} then {
    if {$force || ![info exists openPgpVerifyCommand]} then {
      set openPgpVerifyCommand \
          {{${openPgpFileNameOnly}} --verify {${fileName}}}
    }

    #
    # NOTE: The command to use when creating OpenPGP signatures for the
    #       downloaded package scripts.  This must be configured according
    #       to the implementation of OpenPGP in use.
    #
    variable openPgpSignCommand; # DEFAULT: gpg2 --detach-sign ...

    if {![info exists openPgpSignCommand]} then {
    if {$force || ![info exists openPgpSignCommand]} then {
      set openPgpSignCommand ""

      append openPgpSignCommand \
          {{${openPgpFileNameOnly}} --detach-sign --armor}

      append openPgpSignCommand \
          { --passphrase-file [formatExecArgument [getOpenPgpPassphraseFile]]}

Modified client/1.0/neutral/pkgr.eagle.asc from [00f9341292] to [22dcdd3585].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17













18
1
2
3
4













5
6
7
8
9
10
11
12
13
14
15
16
17
18




-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
Comment: Eagle Package Repository

iQIcBAABCAAGBQJdwuz8AAoJEFAslq9JXcLZcVkP/jS4+eAdHt6D+Tmv5elrElPX
GiNMqBGiehn5l8uWB5SnjeU/zvvJqW2MybhKvCTwIjEXYu7mv2vFPZBRXADUpvtF
tOfzeIP8K8crlJwz8c/O1NQCvzfA3U2sEa03y7ULu8vZSpXgrtijBMDfu8ABrFlc
StVvLyQhQ0KJtsn5IR9LKLvWb8Izk3/+YTQp+i5jWv3LU40FbBJZinc4K3W6h/Cj
Zg3QFGxRyO2tGw3j2JO6NPtQN6OIIvNLc2nmkEjUnlHROLwxsChMapQmGxVmA1CI
QWtKjsaLbIZXKPGTeryQ7i50icW5AV1uGox/yDp/RFt8a9Sc5Spjr9qoRn5T4wVT
AEYFSIyIi/sy8uZTr6BqeR03QXZ78kfTTLHmOzkjKUiqHwMseEBX1k6jjZUMlymR
Kkofb/uNhW8v0sSezqFQ92bI9XgslTQF/fqyH2yv9ZCaoiyjBoFMzAGGv6y3XzMi
+4i0/drM3BmoF39F2vAiFyObT3cCqGDt0/MgO8y44HHAIROxMO0N1A/xgxtpTWl9
IG/CXTFmLLdUgnDPYya55m9ri0bz7GstcInWdMN7+X0whucYQqcbGIqA/w4CWr6T
87hxtlDGcw1wWxizBa5yDzwaRS6jjGhMw79Sp1QGnF9Hb7lRoZsZxXghDKmMU6cN
Cm9qH9IrK/n3JoDP681A
=FxL1
iQIcBAABCAAGBQJefmhwAAoJEFAslq9JXcLZnzkQAMSqU2nlTobNSziYN+EnEazL
X7cGWSqXgLNqAaWr5RNTRcY+22mu+mr50B2JpJBfuGPxSvSp4eq4GUdQgOLO5fhW
Tw3pnhS0Y9/wjFkn0IFmA5QI1FpLsgZjzDiQNHB+BZZ4ybFFTq94gw5tN6ZS9utn
0Wt7aT1KiHM7bMMymIkeGGmU4VOLtlyCUs/GUHo+iwMdPZPA6DMHV8vXdQNIPr2D
nzUIGsMpQs2k7wIHzCI3iJvVJQA5VyfnFpztzhsR3MxiJxeYjhMdHL1wvfZ2NpOy
csSw3Mb9pRj/otuIJa6bNookHhruVSXr/XUfTVN4wdUup5FVjA5kRzL/yfx99WjQ
baUNyYLjGHPZLXtXsPBrjPF5JI/ipVv4UYAqTL/sjLRxLG+JNRFWg9qDusJB+Trm
9BtMHzhkvJBuPMUsPXvPMuqbVGYJN6os5BRU+ltX0vLUxslf1EI/pAe7F8rFIiir
2oFRbzzq+ypd4PwrpGmF3LhAa2RNz/VnR1j4ip90nYSpFFcl6JjnxubB56moPxPs
q907ex0+xBLpULC/vZ6TPH6O1gVJ4dTLFH9tJpqH5qyWbbIeCyfN5Ynhq69Y+qdB
636kXlUOEgg4I3ZkfDubpKf/DZ8yYMUgyaluRIOiGkkIQ2VuRLKd4zelLtKxT3Mv
KazKvCNfOcxc/9YtD2Z2
=FjC5
-----END PGP SIGNATURE-----

Modified client/1.0/neutral/pkgr.eagle.harpy from [78dfc1d1f9] to [08cc84f00d].

17
18
19
20
21
22
23
24

25
26
27

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66




































67
68
17
18
19
20
21
22
23

24
25
26

27
28
29
30




































31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68







-
+


-
+



-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


    THE ASSOCIATED SOFTWARE MAY NOT WORK PROPERLY IF THIS FILE IS ALTERED.
-->
<Certificate xmlns="https://eagle.to/2011/harpy"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Protocol>None</Protocol>
  <Vendor>Mistachkin Systems</Vendor>
  <Id>36f37a40-de70-4264-8fdb-512973db856d</Id>
  <Id>9bfbeedf-0f5e-44b8-b371-7c5b484e7747</Id>
  <HashAlgorithm>SHA512</HashAlgorithm>
  <EntityType>Script</EntityType>
  <TimeStamp>2019-11-06T15:54:28.2976643Z</TimeStamp>
  <TimeStamp>2020-03-27T20:55:40.9358622Z</TimeStamp>
  <Duration>-1.00:00:00</Duration>
  <Key>0x9559f6017247e3e2</Key>
  <Signature>
    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
  </Signature>
</Certificate>

Modified client/1.0/neutral/pkgr.eagle.harpy.asc from [edb05628a8] to [d272114ef8].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17













18
1
2
3
4













5
6
7
8
9
10
11
12
13
14
15
16
17
18




-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
Comment: Eagle Package Repository

iQIcBAABCAAGBQJdwuz9AAoJEFAslq9JXcLZLrQP/1quy2q2tao4bGkR29oDg56P
VBc68F7VCt3slnRpkjseLeOBoK2JNGxTZp2dkgODHxkeseLypCfkS2xiiwZS0c6Q
zInz66QCLgnKT370Vst+Qa1yeJKYLfOUsT1D4zT7mvMJ0Fnm/SxmZplIBrjBY+XX
IjdAtgWaXgDke14ugi+K+2itB4I/SnJigrO0QVRDzIOZfWoZl48PBjxfiPeO7pPE
BZno5e+vGcM0BEsJlX3vlQcv4W47XABUC05Tz6X4Md2Xhnnb64SSSG1XpLklCuEb
X9g0GkKIB/6aXh5Uct0Jg09N8wpR1UjZkWI+t7ZFXOowucbBsFgaHJfTch0ojON/
6JpdWl2sXoZKsdKxa3fHvAzhobhwGUkjEhi5Kxc1T2484deKYV+SPQ9HU+Vdmih5
4D7bamBwy3rCru3sU69nKHFRxrqa38Hl4IgODA7SnqGgpM9J78cZfqlm3DDN2WXl
EDeKyGye30gciJA+iUHcOu2a1soxcwYcyvVsQ+tEEOfd5Nk2vwlsdcHZKrp3FvPE
xNB8zpNHoFjbkeRTxp8zZHrB7DS+WxODhIPAOQxZ78DuCEhvNSKhqPEVoSt/l7Hr
2o0QUjOniI2XHEhCbpbkj/x3ogmZ5rNcWn9y8kYtqGrXn2PgjxPz1Erof01N5fFK
TCMiWvCssnb7qhdhxty9
=8T2C
iQIcBAABCAAGBQJefmhyAAoJEFAslq9JXcLZveUP/Rlt1T0DafCi0c1cBSaRSg+a
aOB61P5V7ZJieuL7RE1utJUE13IRR3vCfmfjVJjD1WETRmPafBCU/XD/eIvI/Tqv
KleBiCMIFrA5g21TxF1YxrFmcS3BKixzduSCyJWZI0dtG5QmMN0PcWzNMtu9nnFd
TpNazqt6UcIiw4vIq8gx0NXo0c/2bPZa9Hxs3LDJO/lgHJEOHvaJY7JfE0vhFcfT
6UlqJ0p1QfdSda95cc55Takg0dAQaAKNtWvXXIInMMf/O/miexh4uS1KNGx+f61U
ApF6fCQfn0gHTfGHv7zrccvwy8WCinHuwqj6IIms0vXk13SXBc4ZcKUVGNDLWxhZ
qz9rAnTqtZujphUO0z0oDleRj8k+IbJXj4fCdmkDNEaGVSyZu7nps8p9SWtwrFs9
d50THrSeAk5nM+VWaw4fsZ7q8kbFb3r0ANx9SfnGmFmhZMZWUdln+BFn5y8CrzEg
AJm4ShGtznj2ntJLHkBaesDswsTmDASb9QrkDIlZKm9pnjFleTMXW/TcQHnLBlYH
o+aO+XRBAGqSDaAoTrSsXKlm4XW04IMPLgJOaHO+EbhTBRbb2Rh/AEmd4oZb21WL
Ag+qqcFwbNmSfUooO6mtZUxX2BRKEg6BSWpB/nT35yG8c/KwrURW8KHBqLUTpNUK
+ZzhBCUKDu05xmE1heJU
=VxHM
-----END PGP SIGNATURE-----