File: CHANGELOG.mkd

package info (click to toggle)
r10k 3.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,880 kB
  • sloc: ruby: 13,704; sh: 137; makefile: 49
file content (1633 lines) | stat: -rw-r--r-- 62,482 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
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
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
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
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
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
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
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
CHANGELOG
=========

3.1.0
-----

## New Feature

Substitute environments acted on in postrun command.

Now post run commands that contain the string "$modifiedenvs"
(eg. ["/usr/local/bin/my-postrun-cmd", "--verbose", "$modifiedenvs"])
will have the string substituted with a space separated list
of environments acted upon (either a single environment if
specified on the command line or all environments).

Specifically this should allow users to easily wrap
`puppet generate types` and matches the terminology used
in g10k.

Many thanks to @raphink for the contribution.


3.0.3
----

## Bug Fixes

(RK-324) Fix Ruby pipe bug affecting Ubuntu

3.0.2
----

## Changes

Minor test fixes.

3.0.1
----

## Changes

Because of dependency issues R10K 3.0.0 required Ruby >= 2.3
rather than the reported 2.0. This release makes the requirement of
Ruby >= 2.3 official and documented.

(#853) ([RK-327](https://tickets.puppetlabs.com/browse/RK-327) Uninitialized Constant Cri::Error
  When resolving the Cri dependency >= 2.13 R10K would fail with an
  uninitialized constant error. Thanks to @ostavnaas for the bug report,
  @ddfreyne for the fix, and @baurmatt for the review.


3.0.0
----

## Changes

### Known issues
  - Child processes may die unexpectedly when deploying many environments
    on Ubuntu Bionic. See
    [RK-324](https://tickets.puppetlabs.com/browse/RK-324).

### Backwards breaking changes
  - Drop support for Ruby < 2.0
  - Remove support for PUPPETFILE and PUPPETFILE_DIR environment variables
    when running the `puppetfile` action, please use flags instead.
  - Fail when duplicate module definitions in Puppetfile

### Bug fixes
  - More reliable pruning of refs on fetch
  - Improved error messaging when:
    - Unable to connect to a proxy
    - r10k.yaml file is empty
    - Unable to parse Puppetfile
  - Various perfomance improvements


2.6.5
----

## Bug Fix

(RK-324) Fix Ruby pipe bug affecting Ubuntu

2.6.4
----

## Changes

Numerous test fixes.

2.6.3
----
## Changes

Update specs with new error string.

**NOTE** - CHANGELOG is only assured to be up to date for a particular branch
when a release is made on that branch.

2.6.2
-----
### Changes

(RK-311) Yard dependency updated for security fix.

2.6.1
-----

### Bug Fixes

(RK-310) Fix ChecksumMismatch error on Windows for forge caching.

2.6.0
-----

### New Features

(RK-307) Branches can now be ignored by prefixes during deployment.

(RK-305) Add --no-force to deploy action to avoid overwriting local module changes.

(RK-264) Add --force action to puppetfile install to force overwriting local
module changes.

(RK-291) (RK-304) Add caching of forge modules.

### Changes

(RK-306) Remove the dependency on semantic_puppet.

(RK-161) Deprecate the usage of PUPPETFILE and PUPPETFILE_DIR environment variables.

2.5.5
-----

2017/06/02

### Bug Fixes

(#696) Move deprecated module check to install/reinstall/upgrade rather than
synchronize. This fixes a major slowdown on redeployment.

### Changes

(RK-290) Add deprecation warning for duplicate module names in Puppetfile. This
will cause an error in r10k v3.0.0.

(RK-285) Update minitar dependency to 0.6.1

2.5.4
-----

2017/04/05

### Bug Fixes

(PF-1317) Only use deprecated attribute when it exists.

2.5.3
-----

2017/03/31

### Bug Fixes

(#645) Fix undefined method error when r10.yaml empty

(#659)(RK-269) Puppetfile actions acknowledge :branch and :default_branch
(Thanks to [Chris Cowley](https://github.com/chriscowley) for the report.)

### Changes

(PF-1317) Emit a warning when syncing a deprecated Forge module.

2.5.2
-----

2017/02/07

(#699) Pin minitar dependency to 0.5.4 to avoid a bug with the 0.6.0 release.
(Thanks to [Logan Garrett](https://github.com/lngarrett) for the report and fix.)

2.5.1
-----

2016/12/05

(RK-78) Use :prune option for #fetch in Rugged::BareRepository

Versions of the "rugged" gem prior to 0.24.0 lacked the ability to automatically
"prune" branches from a local repo that no longer existed in the matching remote
repo after a fetch. To work around this issue, r10k included code that would
manually remove/recreate branches during a fetch. Since "rugged" 0.24.0 is now
widely available, r10k has been updated to use the built-in "prune" option
during a fetch and the workaround code has been removed.

NOTE: If you use the "rugged" gem with r10k, you will need to manually upgrade
it to a version >= 0.24.0 to take advantage of the new functionality. If you
are using a "rugged" version less than 0.24.0, r10k will now issue a warning
every time it fetches from a remote git repository.

2.5.0
-----

2016/11/15

### Bug Fixes

(#669) Updated the behavior of the rugged based git provider to handle
unexpected behavior around checkout and resets regarding file permissions,
specifically, when resetting to an already checked out SHA the executable bit
on files would not update.

### Changes

(#664) Added to the proxy error message for changes made to libcurl which gave
new, surprising errors about unsupported proxy schemes.

2.4.3
-----

2016/08/23

### Bug Fixes

(RK-266) Fixed an issue where the "puppetfile install" action was encountering an
error when operating on a Puppetfile with "local" content declarations.

2.4.2 (Yanked)
--------------

2016/08/22

### Bug Fixes

(RK-265) The "puppetfile install" action will no longer overwrite local
modifications to managed Git content. Instead, a message will be logged at the
"WARN" level indicating that the content was skipped. Note: The "deploy"
actions will still overwrite local modications. For more background on this
change, see below:

In 2.4.0 a change was made to r10k's behavior when it encounters local
modifications during "deploy" operations. Previously, r10k would log an error
and skip updating the modified content. As of 2.4.0, local modifications will
be overwritten and a warning will be logged. This change was considered a bug
fix but was originally omitted from the changelog for that release. This change
also inadvertently modified the behavior of the "puppetfile install" action. A
command line flag to control this behavior more explicitly will likely be added
in a future version.

2.4.1
-----

2016/08/11

### Bug Fixes

(#634) Fix "undefined variable" error in "deploy module" action. (Special thanks
to Andreas Ntaflos (antaflos) for the fix.)

(#635) Reword some documentation around environment level purging.

2.4.0
-----

2016/08/10

### New Features

(RK-222) New "install\_path" option for Git/SVN content.

This feature allows you to specify where inside an environment each item from the
Puppetfile should be installed to. See the [Puppetfile documentation](https://github.com/puppetlabs/r10k/blob/master/doc/puppetfile.mkd#per-item-install-path) for details.

(RK-246) New "environment" level purging and configurable purge levels.

You can now configure how r10k purges unmanaged content after a deployment. The
default behavior should be unchanged but there is a new "purge\_levels" configuration
option that can be used to enable new behavior or de-activate certain existing 
behaviors. See the relevant [configuration documentation](https://github.com/puppetlabs/r10k/blob/master/doc/dynamic-environments/configuration.mkd#purge_levels) for more details.

(RK-223) Ability to track control repo branch from content declarations.

Puppetfile content sourced from Git can now be configured to attempt to track the branch
name of the control repo branch being deployed. For example, if r10k is deploying
the 'production' branch of your control repo, it will try to also deploy the
'production' branch of a given Puppetfile content repo. See the [documentation](https://github.com/puppetlabs/r10k/blob/master/doc/puppetfile.mkd#control-repo-branch-tracking)
for more details.

### Internationalization

All user-facing strings generated by r10k have been externalized to enable future
iternationalization (i18n) and localization work.

### Changed

(RK-258) Symlinks inside of Forge modules will no longer cause r10k to exit non-zero.
This situation used to raise an error but will now generate a WARN level log message
instead.

(#483) Local modifications to managed content will now be overwritten during "deploy"
actions. (Note: This change inadvertently also affected the "puppetfile install"
action in 2.4.0 and 2.4.1. This was fixed in 2.4.2. A command line flag to control
this behavior more explicitly will likely be added in a future version.)

### Bug Fixes

(#616) Ensure that Forge module version strings are valid semantic versions. (Special
thanks to Patrick Robinson (patrobinson) for the fix.)

(#622) Fix typos in workflow docs. (Special thanks to Yury Frolov (mrdracon) for the
fix.)

2.3.0
-----

2016/05/17

### New Features

(RK-236/RK-237) Added HTTP proxy support for Git operations.

Previously, r10k only supported the use of HTTP proxies for connecting to the Puppet
Forge. With these changes, r10k can now be configured to use an HTTP proxy for both
Forge and Git operations. Configuration can be specified globally, for Forge or Git
only, or on a per-Git repository basis. See [configuration documentation](https://github.com/puppetlabs/r10k/blob/master/doc/dynamic-environments/configuration.mkd) 
for more details.

### Bug Fixes

(RK-238) When r10k encounters and ignores invalid file types in a module archive, it
will now log the message at the DEBUG1 level instead of at WARN.

(RK-243) In certain cases, when using the "rugged" Git provider, specifying invalid HTTP
credentials for a repository could result in an infinite loop. Authentication retry
for HTTP repositories is now capped at 50 attempts which matches the existing behavior
for SSH.

2.2.2
-----

2016/04/18

(RK-241) "deploy display" action does not properly format wrapped exceptions

The "deploy display" action was not capturing and logging exceptions in the same way as
other related actions. This meant that in many cases, when an error occurred, the 
underlying cause was not being shown. Specifically, the "deploy display" action was
not benefitting from the improved error messaging for unreadable SSH keys which was 
added in r10k 2.2.0 as part of RK-220.

2.2.1
-----

2016/04/14

(RK-229) Setting Forge proxy options breaks PE Authentication

A bug in the interaction between r10k and the puppet\_forge gem was preventing the correct
Authorization headers for Puppet Enterprise-only modules from being included with requests
to the Puppet Forge when r10k was also configured to use a proxy. This bug has been resolved
by adding new functionality to the puppet\_forge gem and updating r10k to use the new version.

2.2.0
-----

2016/03/08

### Notes

(RK-154) Per-repo config for Git sources

Git repository options, such as the SSH private key, can now be set indepdently for each repository
when using the Rugged provider. See [documentation](https://github.com/puppetlabs/r10k/blob/master/doc/git/providers.mkd#ssh-configuration-1)
for details.

(RK-220) Improved error message for unreadable SSH keys

r10k will now check to ensure that the configured SSH private key for a given repository is readable
before attempting to connect. This will result in a clearer error message in situations where the
key file is not readable.

(CODEMGMT-453) Support for running under JRuby 1.7 with shellgit provider

r10k should now run successfully under JRuby 1.7.x when using the "shellgit" provider.

(MAINT) Documentation fixes

Various errors and inconsistencies in the documentation have been fixed thanks to contributions
from [Paul Tobias](https://github.com/tobiaspal), [Rob Nelson](https://github.com/rnelson0), and
[David Danzilio](https://github.com/danzilio). Thanks!

2.1.1
-----

2015/11/12

### Notes

(CODEMGMT-440) Defer git alternates setup

The fix for RK-175 that updated the Git alternates file for repositories was happening too early, and
could cause issues when multiple r10k processes were running concurrently. This has been fixed so that
the alternates file update is deferred till the first time the git repository is actually accessed.

(RK-187) Consider thin repos with a .git file (not directory) to be mismatched

If a given Git thin repository had a .git file where r10k expected there to be a directory it would
behave badly; this has been fixed so that if r10k encounters this case it treats the repository as
mismatched.

(RK-181) Correctly set baseurl/proxy with shared PuppetForge URL

A combination of some odd connection handling behavior in the puppet_forge gem combined with some
bad assumptions in r10k prevented users from being able to actually set a custom forge baseurl;
this has been fixed.

2.1.0
-----

2015/10/28

### Thanks

Thanks to the following contributors for their work on this release:

  * [Abel Paz](https://github.com/apazga) fixing some broken links in the Git Environments documentation
  * [Alex Rowley](https://github.com/rowleyaj) for surfacing the --puppetfile and --module options for
    `r10k puppetfile install`
  * [Austin Blatt](https://github.com/austb) (our summer intern!) for extracting the vendored Puppetforge
    code and pushing it into the upstream puppet_forge gem.
  * [Branan Riley](https://github.com/branan) for updating the quickstart guide for Puppet 4.
  * [Darrell](https://github.com/darrell) for adding documentation for the :local module type
  * [David Pashley](https://github.com/dpash) for documenting potential issues with Rugged/SSH on Ubuntu
  * [Dennis](https://github.com/pskrz) for clarifying path information in the quickstart guide
  * [E. Dunham](https://github.com/edunham) for adding an entry to the FAQ to explain the name of r10k
  * [Kirill Kondratenko](https://github.com/cybem) for contributing the :local module type (RK-149)
  * [Louis Mayorga](https://github.com/lmayorga1980) for finding and reporting RK-143, and testing fixes
    for that issue.
  * [Mark McKinstry](https://github.com/mmckinst) for fixing some broken links in the FAQ
  * [Patrick Robinson](https://github.com/nemski) for submitting GH-516 to catch and handle
    ArgumentErrors raised when loading Puppetfiles
  * [Thomas Lapinski](https://github.com/thlapin) for fixing a bug where switching from a Git module to
    a Forge module would incorrectly leave the Git module version installed.
  * [Thomas Mueller](https://github.com/vinzent) for updating the r10k homepage link in the gemspec.

### User notes

(RK-70) Expose Forge baseurl setting in r10k.yaml

The Puppet Forge URL can now be changed from the default forgeapi.puppetlabs.com to a user specified value.
This allows users to use private/testing Puppet Forge instances. See
https://github.com/puppetlabs/r10k/blob/master/doc/dynamic-environments/configuration.mkd#baseurl
for documentation on using the baseurl setting.

(RK-96) Correctly switch from Forge modules to Git modules

If a Git version of a module had been installed via a Puppetfile and the Puppetfile entry was updated to
use the Forge version of the module, r10k would only check the metadata - and if the metadata of the Git
version matched then r10k would assume that the Forge module was installed. This has been fixed so that
when checking the status of a Forge module r10k specifically looks for a `.git` directory and considers
the module mismatched when the directory is present, which means that it will correctly replace a Git
version of a module with the Forge version.

(RK-142) Add machine readable output for `r10k deploy display`

The output format for `r10k deploy display` was a YAML-like, janky hand rolled version; this has been
replaced with the ability to specify an actual data format for the output. The default output type is
now YAML.

(GH-477) Add `--fetch` option for `r10k deploy display`

When `r10k deploy display` is run it might be useful to see which environments don't yet exist; the
added `--fetch` option allows r10k to update the environment sources to check for missing environments
when displaying environments.

(RK-143) Use argument vector when executing commands on Windows

R10k used the `Open3.capture3` call, and used to concatenate the string to execute and join it with
spaces. However Windows loves including spaces in file names, which creates all sort of weird behavior
especially when running shell commands over SSH to Windows. This has been fixed to use the argument
vector form of `capture3` to avoid these issues.

(RK-149) Add :local module type

The new :local module type allows users to add modules to the Puppetfile that are included in a control
repository, so that modules can be kept in the Puppetfile moduledir without them being destroyed.

(CODEMGMT-345) Write deploy signatures to a file

If the code deployed by r10k is copied to another location without the cached repos, it becomes impossible
to use Git to interact with the repository and see which version of code r10k deployed. R10k now creates a
`.r10k-deploy.json` file that records the time and SHA of the last code deployment.

(RK-80) Support non SSH key based authentication for rugged provider

An error in how the Rugged Git provider provided SSH credentials prevented HTTPS urls requiring authentication
to function. This has been fixed so that only SSH urls are provided ssh private key credentials, and HTTPS
urls can provided a username and password in the URL for authentication.

(RK-90) Don't raise an error when forge modules are duplicated

A bug in how r10k Forge modules created caused r10k to crash when two forge modules tried to create the same
directory. This has been fixed and restores the old behavior of letting the last module specified win.

In the long term trying to specify two modules with the same name will produce an error, but in the mean time
this fix restores existing behavior so that r10k won't roll over and die on error.

(RK-120) Enable --config as top level command option

R10k was originally built with environment deployment in mind, but the `r10k puppetfile` subcommand made this
assumption faulty. However the way the config file was loaded only worked with `r10k deploy` subcommands,
which prevented users from using a custom cachedir or use other settings when running `r10k puppetfile`. This has
been corrected so that r10k can always read a config file when running any subcommand.

(RK-175) Don't crash on unresolvable Rugged ref

When r10k was using the rugged provider, checking out an unresolvable ref would throw a TypeError because r10k
didn't always ensure that the ref was resolvable. This has been fixed so that r10k explicitly ensures that refs
can be resolved before it checks them out.

(RK-174) Always ensure alternates file is up to date

When r10k created a Git working repository it permanently linked the repository to a cached Git repository via
the Git alternates file. However if the cachedir setting changed, existing repositories would still reference
the old path which could very badly break Git. This has been fixed so that r10k always ensures that the alternates
file is up to date before any Git operations can happen, so that changing the cachedir will not break Git repositories.

(RK-169) Print validation failures for invalid configs

R10k used to have very lax handling of config file input, which would cause crashes during r10k runtime. This
has been fixed so that r10k validates all configuration before it runs and prints out all configuration
validation errors when validation fails.

(RK-21) Indicate error when deploying non-existent environment

When r10k was deploying a specific list of environments, it would skip any existing environment that didn't match
the desired list of environments. However this meant that deploying a non-existent environment would not
deploy any environments and r10k would silently exit with an exit code of 0. This has been fixed so that
when r10k deploys a list of environments it makes sure that each environment can be updated, and when requested
environments are missing it logs an error and exits with a non-zero exit code.

(RK-163) Add deploy/write_lock setting

Users can now prevent `r10k deploy` commands that change environments and modules from running via a config
option; this allows users to lock out code deployments at certain times (code freezes and times outside of
maintenance windows.)

(GH-516) Handle ArgumentError when loading Puppetfiles

The `r10k puppetfile check` command didn't output a very useful error when a module was given the wrong number
of arguments; this has been fixed so that r10k catches ArgumentErrors raised while loading a Puppetfile
and wraps it so that more information is added to the error message.

(GH-469) Add `--puppetfile` and `--moduledir` options to `r10k puppetfile install` subcommand

The `r10k puppetfile install` subcommand was able to set a custom puppetfile path and moduledir location
via environment variables to match librarian-puppet, but they accidentally didn't match the librarian-puppet
semantics - and environment variables aren't very nice to expose for configuring and application. The
`r10k puppetfile install` subcommand now supports command line flags to set these options.

(CODEMGMT-339) Add command line option to set cachedir

There are some scenarios where r10k needs to be run with a common config file, but on a specific basis
may need to set a custom cachedir. To make this work `r10k deploy` now supports a `--cachedir` setting
for these temporary overrides.

2.0.3
-----

2015/8/13

This is a bugfix release that resolves a critical issue issue in installing PE
only modules.

### Notes

(RK-156) PE-only modules cannot be installed

The mechanism used to load PE license information in r10k was preventing r10k
from not being able to locate the pe-license Ruby library in PE 2015.2.0; this
has been resolved by actually trying to load the relevant files instead of
probing for a gem and then conditionally loading it.

2.0.2
-----

2015/06/18

This is a maintenance release that improves error messages around installing
modules from the Puppet Forge.

### User notes

(RK-109) Add context to connection failure errors

If a connection to the Puppet Forge failed for any reason, the resulting
exception would indicate the error type but not the host or proxy host. This
made it hard to understand why connections were failing. This has been fixed so
that r10k will include the host and optional proxy host in error messages when
connections fail.

(RK-121) Improve error handling for nonexistent Forge modules

The r10k Puppet Forge connection error handling reports when HTTP requests fail,
but would simply print the HTTP status code on failure. For cases where a
nonexistent module or module release was queried, r10k now specially handles
HTTP 404 status codes and indicates that the module/module release is missing
instead of just throwing a generic HTTP error.

2.0.1
-----

2015/06/09

This release fixes a couple of issues and defects found in 2.0.0.

### Thanks

Thanks to Tim Meusel (https://github.com/bastelfreak) and ktreese
(https://github.com/ktreese) for reporting GH-443 and GH-447.

### User notes

(RK-117), (GH-443), (GH-447) Add minitar as runtime dependency

Minitar is a hard runtime dependency of r10k as part of the new Forge module
implementation, but was only added as a development dependency which means that
r10k could be installed without all of the required runtime dependencies. This
oversight has been corrected; r10k will now pull in minitar at installation
time.

(RK-118) Readd '/etc/r10k.yaml' to config search path

The '/etc/r10k.yaml' config path was deprecated in r10k 1.5.0, but this
deprecation was only a soft deprecation and was easy to miss. While 2.0.0 is a
backwards incompatible release it was too aggressive to remove this entirely, so
'/etc/r10k.yaml' will continue to be respected/read in r10k 2.x. If this file is
present and used then a deprecation notice will be logged. Apologies for the
churn on this!

2.0.0
-----

2015/06/08

This is a backwards incompatible feature release, but as major releases go this
is a pretty small one. Some changes introduced into master included some
breaking changes and SemVer dictates that we do a major release in this case.
Actual changes that will affect end users should be limited; the only one that
should have big impact is the removal of Ruby 1.8.7 support. Any other issues
encountered should be treated as bugs and will be fixed.

### User notes

(GH-1) Native support for installing modules from the Puppet Forge

R10k can now directly install modules from the Puppet Forge, rather than
shelling out to the Puppet module tool. This will allow for later optimizations
like caching module downloads to speed up installing module across multiple
environments.

(RK-83) Allow '-' as a module name separator

(RK-53) Remove '/etc/r10k.yaml' from config file search path.

R10k 1.5.0 added '/etc/puppetlabs/r10k/r10k.yaml' to the paths checked while
looking for a config file, in order to keep in convention with the rest of the
Puppet Labs config files. In 2.0.0 the old location, '/etc/r10k.yaml', has been
removed.

(RK-57) Notify users of purgedirs key deprecation

The purgedirs key was used in r10k 0.0.9 but has not been used in the 1.x
release series; if this setting is given then r10k will generate a warning
indicating that it is not used.

### Deprecations/Removals

(RK-47) Remove support for Ruby 1.8.7

Given that Ruby 1.8.7 has been EOL for nearly two years, it's time for r10k to
drop support for 1.8.7 as well. The Puppet 4 all in one package ships with Ruby
2.1.6, so even if you're on a platform that doesn't have Ruby 1.9 or greater you
can install r10k into the Puppet collection environment and used the bundled
Ruby.

(RK-54) Remove deprecated subcommands

R10k 1.0.0 reorganized a number of subcommands but retained the old subcommand
names for compatibility with 0.0.x; since it's been over 2 years since 1.0.0 has
been released these commands have finally been removed.

(RK-113) Remove deprecated Task classes and namespaces

The R10K::Task namespace turned out to be unwieldy in practice and has been
replaced with the R10K::Action namespace. Use that for running r10k as an
application.

(RK-114) Remove deprecated git classes

The reorganization of the Git code in 1.5.0 rendered a number of classes
obsolete; they've been removed.

1.5.1
-----

2015/04/09

### Thanks

Thanks to all the users that helped track down RK-86, and Zack Smith in specific
for tracing the source of the bug.

### User notes

(RK-62) Warn when Rugged is compiled without SSH or HTTPS transports

If Rugged/libgit2 was compiled without libssh2, trying to access a Git
repository via SSH throws a fairly cryptic error. It's not terribly easy to
specially handle the error message that's being logged, but in lieu of that r10k
now checks the Rugged gem to make sure it's compiled with support for SSH and
HTTPS when the Rugged Git provider is used.

(RK-79) Bump minimum required version of faraday_middlware-multi_json

Faraday 0.9.0 changed the API for middleware plugins, which made it incompatible
with the faraday_middleware-multi_json plugin. That plugin supported the new API
in version 0.0.6 but the minimum required version in the r10k gemspec was not
updated, allowing r10k to be installed with incompatible versions of faraday and
faraday_middleware-multi_json. This has been fixed by requiring the minimum
compatible version of faraday_middleware-multi_json.

(RK-86) Git modules don't properly track branches

R10k 1.5.0 added smarter syncing for Git caches to reduce network traffic, but
it accidentally caused branches to stop tracking changes to the remote branch.
This has been fixed and the pre-1.5.0 behavior has been restored.

1.5.0
-----

2015/04/02

### Announcements

Ruby 1.8.7 has had a good run, but it's time for r10k to think about moving on.
As of r10k 1.5.0, support for Ruby 1.8.7 is officially deprecated. Issues
affecting Ruby 1.8.7 will still be fixed, but will be of lower priority. Support
for Ruby 1.8.7 will be dropped entirely in r10k 2.0.0.

### Thanks

Thanks to the following contributors for their work on this release:

  * [Brett Swift](https://github.com/brettswift) for adding custom prefix values
    for sources (RK-35)
  * [Eli Young](https://github.com/elyscape) for adding additional debug
    information to `r10k version` (RK-37)
  * [Pete Fritchman](https://github.com/fetep) for removing a warning generated
    under Ruby 2.2 (RK-55)
  * [Theo Chatzimichos](https://github.com/tampakrap) for updating the
    dependency versions for r10k
  * [ETL](https://github.com/etlweather), [Ben S](https://github.com/juniorsysadmin),
    and [Robert Nelson](https://github.com/rnelson0) for their documentation
    contributions

### User notes

(GH-57) Git based modules fail to detect presence of git binary

As part of RK-17, r10k now checks to make sure that the `git` binary is present
and executable before trying to run any commands. If Git is missing, r10k will
fail hard instead of trying to run and failing on the first failed command.

(GH-195) (RK-35) Allow sources to specify a custom prefix string

For r10k deployments that have separate sources for Puppet code and Hiera data,
the created environment paths must line up between the code and data repos. With
basic prefixing where the source name is used as the prefix string, it's not
possible to use prefixing and commonly named environments. This has been fixed
so that the source `prefix` option can be given true, false, or a string which
is a custom value to use for prefixing.

(RK-17) Add rugged/libgit2 based Git implementation

The libgit2 library and Ruby rugged gem provide a native interface to Git for
Ruby that is faster and more consistent than shelling out to Git. An additional
rugged based Git implementation has been added along the original 'shellgit'
implementation, and the implementations can be swapped out as needed.

(RK-24) Add '/etc/puppetlabs/r10k/r10k.yaml' to config search path

In order to be more consistent with the rest of the Puppet ecosystem, r10k will
now check for configuration in a standard location inside of '/etc/puppetlabs'.
The old location, '/etc/r10k.yaml' is still respected so no configuration change
is needed at this point, although the old location will be deprecated in the
future.

(RK-25) Warn if both '/etc/r10k.yaml' and '/etc/puppetlabs/r10k/r10k.yaml' exist

(RK-31) Remove undocumented search for 'r10k.yaml'

Early versions of r10k would try to search for 'r10k.yaml' in parent
directories, in the same manner that programs like Git and Bundler recursively
search for configuration. However this functionality isn't terribly useful, is a
bit surprising, and adds a lot of complexity. This behavior has been removed in
1.5.0.

(RK-32, RK-33, RK-38) Provide configuration options for Git providers

The r10k Git providers can now be selected and configured via configuration in
r10k.yaml. See the [Git specific documentation](doc/git) for more information on
these settings.

(RK-37) Support higher verbosity levels for `r10k version`

If `r10k version` is run with the `--verbose` flag, diagnostic information about
r10k will be included along with version information.

(RK-39, RK-66) Improved logging/messaging

R10k now logs more information about what's going on and is more consistent
about which levels it displays messages.

(RK-74) Improved log formatting

The log formatting that r10k uses was added in some distant point in the past
where there were few users, and wasn't really designed with users in mind. The
formatting has been improved so that at lower log levels the formatting will
include the log level and nothing else, and at higher levels it will include
timing information.

(RK-75) Optional log coloring

At higher log levels r10k can produce a lot of logging information at a rapid
rate, and in general errors and warnings are not very visually distinct and easy
to miss. To help solve these problems r10k 1.5.0 now has optional colored
logging to help provide more information/context at a glance. Coloring can be
enabled with the `--color` option.

(GH-265) (RK-11) Unix commands with > 64KiB of output no longer deadlock

Unix pipes have a maximum buffer size of 64KiB, and if the pipe buffer fills
then subsequent writes will block. Since r10k used to wait for a subprocess to
finish before reading from the attached pipes, if the process filled the buffers
then the processes would deadlock.

This has been fixed by continually reading from the subprocess pipes to prevent
the buffers from filling up.

Unfortunately implementing this correctly requires reading from the pipes until
EOF, which breaks the ssh ControlPersist functionality. Supporting both the
ControlPersist functionality while preventing deadlock introduces too many
potential race conditions, so unfortunately workarounds for this issue can't be
accepted.

See https://bugzilla.mindrot.org/show_bug.cgi?id=1988 for more information about
the ssh ControlPersist bug.

### Developer notes

(GH-142) Use Forge v3 API

R10k was using the old and deprecated v1 Forge API to determine the latest
version of Forge modules when using the `:latest` module version. This has been
fixed so that the v3 API is used.

(RK-16) Decouple Git platform dependent and independent code

The original code that interfaced r10k and Git was very tightly coupled; there
was no defined interface and it was expected that r10k would always shell out to
Git. This has been fixed by extracting the shellout specific code to a library
and defining a common interface for Git classes so that different Git
implementations can be used. The existing shellout implementation has been
renamed to 'shellgit' and should be functionally equivalent to the Git
implementation in previous versions of r10k.

(RK-55, GH-355) Prevent warnings on Ruby 2.2

Ruby 2.2 generates warnings when comparing values and `#<=>` raises an
exception; the code triggering this behavior has been cleaned up to prevent a
warning from being logged.

(RK-65) Switch to using the semantic_puppet gem

R10k is switching from the old vendored copy of 'SemVer' that was stolen from
Puppet to the 'semantic_puppet' gem, which is the library that Puppet now uses
for version comparisons and parsing.

(RK-48) Ignore deleted versions when fetching latest module version

When looking up the latest version of a module on the Forge, if the latest
version had been deleted r10k would try to install that deleted version anyways.
This has been fixed so that all deleted module releases will be ignored.

1.4.2
-----

2015/03/13

### Announcements

The r10k ticket tracker is moving to the Puppet Labs issue tracker; new issues
should be filed on the [R10K project](https://tickets.puppetlabs.com/browse/RK).
The GitHub issue tracker will remain online for the near future but is
deprecated in favor of JIRA. Issues from the GitHub tracker will be prefixed
with "GH-"; issues from JIRA will be prefixed with "RK-".

### User notes

(RK-4) Raise meaningful errors on missing sources

If the 'sources' key in r10k.yaml was left unset, was misspelled, or was empty,
r10k try to blindly iterate through it as a hash and would subsequently raise an
error. This has been remedied so that if the value is missing or empty an error
will be raised.

Note that this doesn't handle the case where r10k.yaml is empty or malformed;
that issue is being tracked as RK-34.

(GH-310, RK-36) `r10k deploy display -p --detail` fails on Ruby 1.8.7

Ruby 1.8.7 does not implement the comparison operator on Symbols, which was
being used by the display command to ensure that hashes were printed in a
consistent order. This has been fixed by backporting the Ruby 1.9 Symbol sorting
to 1.8.7.

### Thanks

Thanks to [Eli Young](https://github.com/elyscape) for reviewing PR 337 and
providing helpful feedback.

1.4.1
-----

2015/01/09

### User notes

(GH-254) Puppetfile subcommands use non-zero exit codes on errors.

The Puppetfile `install` and `purge` commands would always exit with an exit
code of 0, regardless of if any errors occurred or if there was no Puppetfile
available. This has been now corrected so that runtime errors cause r10k to exit
with a non-zero exit code.

(GH-260) Normalize deployed environment names on the command line.

Version 1.4.0 removed the environment name normalization needed to deploy
environments that had their directory names normalized; this has been remedied
so that environment names on the command line are also normalized to match the
corrections that r10k will make to the environment names.

(GH-269) Improved error messages when trying to use non-existent Git refs.

If a Git module tried to use a Git ref that did not exist, it would output a
particularly unhelpful error message that didn't indicate what actually failed.
This has been fixed so that if an invalid ref is used, r10k will actually report
that the ref could not be used. What a brave new world we inhabit!

(GH-271)/(GH-275) Report the name of invalid module names.

The fix for GH-92 released in 1.4.0 added better handling and parsing of module
names, but also added stricter parsing of module names and disallowed invalid
characters that Puppet itself could not use. However when r10k encountered such
an invalid module name, it would not report the module with the invalid name,
making debugging harder than needed. In 1.4.1 r10k when r10k encounters an
invalid module name it reports the invalid module name in the error message.

### Thanks

Thanks to the following contributors for their work on this release:

  * [Lex Rivera](https://github.com/rlex) for discovering and reporting the r10k
    puppetfile exit code bug (GH-254).
  * [Eli Young](https://github.com/elyscape) for discovering and fixing the
    environment normalization bug (GH-260).
  * [Clayton O'Neill](https://github.com/dvorak) For adding better error
    reporting of invalid module names (GH-275).

Additional thanks to all those in #puppet and #r10k for endlessly helping new
users of r10k, your assistance is invaluable!

###

1.4.0
-----

2014/12/2

### User notes

(GH-40) Display expected and actual module versions

When displaying the state of a deployment, modules would report a version but
would not indicate if that was the expected version or desired version. This has
been changed so that both the expected and actual module version information is
displayed. Because determining the actual version for modules can be slow the
`--detail` flag must be passed to display this information.

(GH-43) Using a relative `moduledir` in the Puppetfile is relative to the Puppetfile

The `moduledir` setting in the Puppetfile could be used to set a custom
directory for Puppetfile modules, but if a relative path was used it was
relative to the current working directory. As of 1.4.0 a relative `moduledir`
setting will be expanded to the Puppetfile, which should make it much easier to
use a directory other than 'modules' for the Puppetfile installed modules.

(GH-68) Add alias for `r10k deploy display`

The `r10k deploy display` subcommand had unfriendly syntax, and now has an
alias of `r10k deploy list`.

(GH-92) Support `mod 'owner/module'` for Git and SVN modules

The original implementation of Git and SVN based modules assumed that the module
name was only the name component, and did not include the owner component of the
module. Because of this the full module name was added to the path, which meant
that a Git module or SVN module called `foo/bar` would be created as
`$moduledir/foo/bar`, after which r10k would check for stale modules, see a
module called `foo`, and delete it.

This has now been corrected so that all modules may have an owner and name, and
only the name will be used when constructing the module path.

Issues also closed as part of GH-92:

  * GH-78

(GH-96) Provide output from Git command failures

When r10k encounters an error while running a command, it will always log the
failed command and the output of the command. This should make it dramatically
easier to diagnose issues with the underlying commands used by r10k without
having to re-run the failing r10k command with a myriad of command line flags.

Issues also closed as part of GH-96:

  * GH-46
  * GH-94

(GH-121) Support for calling an arbitrary script after deployment

Users can now specify a `postrun` setting in `r10k.yaml` to run an arbitrary
command after an environment deployment finishes. The current implementation is
fairly simple and isn't passed additional information about the deployment and
is mainly meant to notify other services that the deployment has completed.
Future versions of r10k will provide more information to this command so that
more complex actions can be taken on success and failure.

(GH-155) Allow SVN credentials to be added for modules/environments, disallow interactive SVN

When interacting with SVN modules, r10k could run SVN commands that could try to
prompt the user for input but were not provided access to stdin. R10k is meant
to be non-interactive so credentials need to be provided in some manner, but
cannot be provided directly by the user.

As of 1.4.0 SVN environments and modules can supply a username and password to
be used when interacting with the SVN remote, and SVN commands are run with
`--non-interactive` to prevent commands from trying to grab stdin.

**Note**: SVN credentials are passed as command line options, so the SVN
credentials may be visible in the process table when r10k is running. If you
choose to supply SVN credentials make sure that the system running r10k is
appropriately secured.

(GH-169) Perform non-blocking reads on stderr in Subprocess

When using SSH with a Control Master, the first time an SSH connection is
launched it will persist and will hang onto stderr from the parent process.
R10k was using blocking IO to read from child processes and assumed that the
file descriptors would be closed when the launched process exited, and the
persistent SSH process would cause r10k to hang.

The subprocess code has been updated to perform nonblocking reads of stderr;
when the child process exits it assumes that even if stderr is held open nothing
else should be written to it, drains the buffered pipe content and returns with
that.

This is working around buggy behavior in SSH, but this problem doesn't look like
it'll go away so the best course of action is to incorporate this fix into
downstream.

(GH-180) Don't leak FDs when executing subcommands

R10k was not explicitly closing all file descriptors, and on Ruby 1.8.7 these
would not be closed by the garbage collector, causing file descriptors to leak.
This has been fixed and all file descriptors should be closed after each
subprocess is invoked.

Major thanks to Jeremy Asher for discovering and fixing this.

(GH-193) Don't purge environments if environment sources can't be fetched

The original behavior for deploying environments with r10k was to fetch sources,
deploy environments from those sources, and then clean up any orphaned
environments. If a source had been fetched before but could not be reached then
r10k would use the previously fetched branch information to update environments.
In normal cases this would provide a reasonably robust failure mode.

However, this meant that if no sources had been be fetched or the source remote
information was typoed, r10k would have no source information, could enumerate
no environments, and then enter HULK SMASH mode where it would delete all
unmanaged environments - AKA everything. This is an uncommon failure mode but
could bite environments that were setting up r10k for the first time.

To resolve this issue, r10k will try to fetch all sources and if any source
fails to be fetched then r10k will abort the entire deployment. This means that
r10k will fail very early before any changes have been made which is a safe time
to fail. If the errors were transitory then r10k can be run again, and if the
failures are permanent then it's hard to safely update anything and extremely
dangerous to try to delete any environments.

(GH-202) Different environments cannot manage the same path

R10k allowed for multiple sources to create environments but did not have
semantics for environments from different sources managing the same path. If
this happened, the resulting behavior would be undefined and could do any number
of strange things. The approach to this was by convention and prefixing was
recommended to avoid this, but it's still not a great approach.

This was resolved by looking for environment collisions before deploying; if
collisions exist then r10k will abort the deployment.

Note: The commit that fixed this referenced GH-123 instead of GH-202.

(GH-214) Rescue SyntaxError and LoadError when evaluating Puppetfiles

Since Puppetfiles are just a Ruby DSL it's possible to have multiple Puppetfiles
that are aggregated by using `require` or `load`. However these methods raise
exceptions that don't descend from `StandardError`, so the normal error handling
would not catch them, so a malformed Puppetfile could catastrophically crash
r10k.

Because the Puppetfile is not an actual source file in the conventional sense we
can recover from these errors and continue, so r10k will now recover from these
errors. If a SyntaxError or LoadError is raised while evaluating a Puppetfile,
r10k will rescue them and wrap them in an R10K::Error and then raise that, which
can be caught and handled as a normal, non-critical exception.

(GH-221) Only deploy modules once for each environment deploy

If an environment was deployed for the first time and `--puppetfile` was
specified, the initial creation would create the environment and then deploy
modules, and then the modules would be deployed again because `--puppetfile` was
separate code. The deploy logic has been refactored to consider `--puppetfile`
being passed or the environment being created to be equivalent and will only
deploy modules once.

### Developer notes

`R10K::Environment::Base#sync` is no longer recursive; callers are expected to
handle recursive updates if needed.

The `R10K::Action` namespace has been added to provide an API to r10k
functionality. These should be used by any code that wants to interact with r10k
and should provide an alternative to shelling out to r10k or using `R10K::CLI`
directly. The individual action objects should be called through
`R10K::Action::Runner` so that application setup and teardown is handled.

### Thanks

Thanks to the following contributors for their work on this release:

  * [Robert Nelson](https://github.com/rnelson0) for his work on documenting
    workflows and best practices with r10k and adding convenience aliases for
    `r10k deploy display`
  * [Wolf Noble](https://github.com/rmnwolf) for homogenizing markdown file
    extensions
  * [Thomas Bartelmess](https://github.com/tbartelmess) for updating the
    required version of cri
  * [Theo Chatzimichos](https://github.com/tampakrap) for correcting the license
    format to conform to SPDX
  * [Richard Raseley](https://github.com/richardraseley) for writing a
    quickstart guide for r10k
  * [Matthew Haughton](https://github.com/3flex) for fixing documentation typos
  * [Markus Frosch](https://github.com/lazyfrosch) for fixing a regression in
    how duplicate environments are checked for, before the regression was ever
    released. Good catch!
  * [Jeremy Asher](https://github.com/jeremyasher) for fixing file descriptor
    leaks and hanging on open file descriptors in the Subprocess module. Great
    sleuthing on this!
  * [Guzman Braso](https://github.com/guzmanbraso) for adding Debian support
    and fixing some bugs in the quickstart documentation.
  * [David Schmitt](https://github.com/DavidS) for fixing markdown syntax errors
    so that link URLs would render properly in GitHub
  * [Christophe Bliard](https://github.com/cbliard) for fixing the Puppetfile
    moduledir setting to treat relative paths as relative to the Puppetfile
  * [Christoph Föhrdes](https://github.com/cfoehrdes) For fixing a copy/paste
    error in the Puppetfile documentation

In addition to those who contributed to the code base, thanks to all those that
reported and commented on issues; user input makes it much easier to make r10k a
better project!

1.3.5
-----

2014/11/13

### User notes

(GH-212) Force use of json_pure on Ruby 1.8.7

Ruby 1.8.7 does not ship with a JSON library, so r10k has depended on json_pure
to ensure that there's always a JSON library available. However there is a quirk
in multi_json in how it probes for JSON implementations and may load the wrong
gem, which percolates up and breaks the JSON parsing code used when querying for
forge module versions. To resolve this, json_pure is always used on ruby 1.8.7.

1.3.4
-----

2014/09/14

This bugfix release incorporates all fixes added in 1.2.4.

1.3.3
-----

2014/09/11

### User notes

(GH-178) Failing to fetch a source git repo can wipe out environments

When updating Git sources at the beginning of a deployment, if the fetch was
interrupted r10k could cache an empty list of environments. This could cause
r10k to remove all environments for that source. This was due to a method
directly using a value that was supposed to be lazily evaluated and memoized. It
has been fixed so that even if r10k cannot fetch a source it will still be able
to deploy modules for environments, clean up removed environments, and correctly
remove unmanaged environments.

(GH-186) Rescue SyntaxError when checking Puppetfile syntax

When a Puppetfile with invalid syntax is parsed it raises a SyntaxError,
and the `r10k puppetfile check` code was not specifically handling that.
Thus when checking an invalid file r10k was actually crashing and not
gracefully handling the error. This was fixed to cleanly rescue the SyntaxError,
optionally print stacktraces, and print an all ok message on success.

1.3.2
-----

2014/07/27

This bugfix release incorporates all fixes added in 1.2.3.

1.3.1
-----

2014/07/16

### User notes

(GH-161) Deployments fail where a branch has \W in the git branch name

In 1.3.0 environment naming was partially reworked to allow better handling of
per-environment deployment, but unfortunately this caused a regression where
environments would be differently named in 1.3.0. This fix changes the
environment deployment on a per-name basis to use the normalized name instead
of the raw Git branch name.

This bugfix release also incorporates all fixes added in 1.2.2.

### Thanks

Thanks to Chris Spence for his work on this release.

1.3.0
-----

2014/06/07

### User notes

#### (GH-104) SVN support for environments.

R10k can now dynamically generate enviroments based on SVN repositories. SVN
repositories must SVN repositories must conform to the conventional SVN
repository structure with the directories trunk/, branches/, and optionally
tags/ in the root of the repository. The trunk/ directory is specifically
mapped to the production environment, branches are created as environments with
the name of the given branch.

Please note that since SVN support for environments should be considered
preliminary and may still have some kinks to be worked out, so use it with
caution in production.

#### (GH-112) Modules can be deployed in a single environment.

When deploying modules with `r10k deploy module <modules>`, users can specify
the `-e <environment>` flag to update modules in a single environment.

#### (GH-117) Controllable behavior for invalid Git branches.

Git sources can now tune how r10k behaves when it encounters a git branch with
a non-word character. Valid values are 'correct_and_warn' which emits a warning
and sanitizes the environment name, 'correct' which silently corrects the
environment, and 'error' which emits an error and ignores the environment.

### Developer notes

#### IMPORTANT: as of 1.3.0, r10k is relaxing how it implements semantic versioning.

There are a lot of internal APIs in r10k that need to be improved or
overhauled, and making changes in a backwards compatible manner has been
impeding development on a number of important features. There's no indication
that there are any consumers of the r10k internal APIs, and if that's the case
then r10k doesn't help anyone by maintaining SemVer for its internal APIs.

As of 1.3.0, r10k is dropping guarantees about API compatibility for most of
the core functionality. The `R10K::Task*` classes were designed to be the
primary interface for external use and those will remain backwards compatible
for 1.x. However any code around configuration parsing, deployments, sources,
environments, and modules may have API changes in minor versions.

That being said, if you are using any of these APIs and you experience breakage,
you're not out of luck. If an API change actually does affect you please report
it as a bug and those specific APIs can probably be fixed up. Hopefully this
will ease development of r10k while not making the lives of external developers
too painful.

#### (GH-116) Allow alternate implementations of sources and environments

This allows the groundwork for allowing users to implement plugins for sources
and environments. A real API specification for sources and environments has
been started, and sources and environments can be defined at runtime. In the
long run r10k will add a plugin system for loading additional code from
Rubygems and other sources, so r10k will be extensible without requiring
modifications to the source.

1.2.4
-----

2014/09/14

### User Notes

(GH-188) Call puppet module tool install with --force for downgrades

1.2.3
-----

2014/07/27

### User Notes

(GH-173) Fixed a bug with Ruby 1.8.7 with Pathname objects.

1.2.2
-----

2014/07/16

### User Notes

(GH-165) `r10k puppetfile` only consumes handled command line options.

Previously, passing `-v` or other commands when running `r10k puppetfile *`
could result in this error:

    r10k puppetfile install --help --trace
    Error while running: #<RuntimeError: Unrecognized options: help>

This was due to overly greedy code passing in all options from the command line
to the TaskRunner. This has been fixed so only known options are passed along,
and options that aren't relevant (such as :verbose) will be ignored.

(GH-158) Log levels are now documented in the command line --help pages.

(GH-137) Git remotes are now correctly updated.

A regression in the Git remote handling meant that git remotes would never be
properly updated when switching Git environments and modules from one remote
to another, and the git alternates file was never updated properly. This has
been fixed so that when the Git remote is updated, all references to the
remotes and alternates will be updated.

(GH-163) All Git tags are deleted when switching Git remotes

Git tags cannot necessarily be transferred from one Git repository to another,
so when a Git repo has its remotes changed all tags are deleted to prevent stale
tags from overwriting tags from the new repo.

1.2.1
-----

2014/04/21

### User Notes

(GH-93) r10k deploy subcommands now respect the --help flag.

(GH-100) The addition of a faster command execution library was POSIX centric,
but there were a number of users that were running r10k on Windows, which brike
their environments. Support for Windows has been re-added and Windows is now a
supported platform for using the r10k puppetfile commands. Please note that
r10k now requires Ruby 1.9.3 on Windows to function.

### Thanks

Thanks to Sam Kottler and Daniel Dreier for their their work on this release.

1.2.0
-----

2014/03/07

### User Notes

Preliminary support for Puppetfile modules from SVN sources. SVN repositories
can track the latest available revision or may be pinned to a specific revision.

Forge modules can now track the latest available version. This can be enabled by
setting the module version to `:latest`.

Git based Puppetfile modules can now be specified as branches, tags, and
commits. When tags and commits are specified r10k can perform optimizations
when updating the given repositories to reduce network accesses.

Command execution has been greatly improved. The old library for executing
commands (systemu) had very high overhead and was 50 - 100 times slower than
%x[] or fork/exec. It's been replaced with a custom process execution
implementation.

Modules can swap out sources. When an existing module is changed from Forge to
Git, for instance, the existing module will be removed before the new module is
installed. (GH-30)

1.2.0rc2
--------

2014/02/27

### Notes

Git repositories were not tracking their upstream remotes, repos should now
properly update upstream changes.

Git reference clones now fetch their cache remotes immediately after the
initial clone.

1.2.0rc1
--------

2014/02/08

Release Candidate 1 for 1.2.0

1.1.4
-----

2014-02-24

This is a backwards compatible bugfix release.

### Notes

  * (GH-90) Multiple environments with the same name but with different sources
    were previously colliding and some environments were being ignored. This has
    been fixed and all environments should be deployed when updates are run.

### Thanks

Thanks to the following contributors for their their extraordinary patience and
help in for chasing down GH-90:

  * Andreas Ntaflos (antaflos)
  * Igor Galić (igalic)

1.1.3
-----

2014-01-26

This is a backwards compatible maintenance release.

### Notes

  * (GH-82) Added all git managed files, including README.markdown, CHANGELOG,
    and LICENSE to the gemspec for better compatibility with non-gem packages.

1.1.2
-----

2014-01-06

This is a backwards compatible maintenance release.

### Developer notes

  * If Puppet and r10k are required in the same namespace, it's possible for
    the vendored copy of SemVer to conflict with the Puppet version. This was
    fixed by renaming the copy vendored in r10k and putting it under a namespace.

1.1.1
-----

2013-12-11

This is a backwards compatible bugfix release.

### User notes

  * (GH-48) Environment prefixing always defaults to off. Users were already
    using r10k with multiple sources but in different directories, and
    prefixing breaks this behavior. Since this was a backwards incompatible
    change this has to be rolled back.
  * (GH-64) Multiple sources in a single directory no longer purge each other.

### Thanks

Thanks to the following contributors for their help in 1.1.1:

  * Stig Sandbeck Mathisen
  * Gabriel M Schuyler

1.1.0
-----

2013-09-30

This is a backwards compatible bugfix and feature release.

### User notes

(GH-35) Puppetfiles can now specify a path to the moduledir, instead of assuming
'/modules'. It can be set with the Puppetfile `moduledir` directive. Note that
this is not compatible with librarian-puppet.

(GH-53) Multiple environment sources can now be specified in a single
directory. When multiple sources are specified, each environment will be
prefixed with the source name. This can be enabled and disabled with the
source `prefix` option.

(GH-45) Documentation has been greatly expanded.

(GH-56) New subcommand: `r10k puppetfile check` allows you to validate the
syntax of a Puppetfile.

(GH-66) Initial clones use `git checkout` when switching to a new branch
instead of just `git reset`; without this change it would look like the wrong
branch was checked out.

(GH-59) r10k can now pull from Pulp repositories for Forge based modules.

(GH-70) Handle unset HOME - in case that HOME is unset, assume that the current
user is root. This mainly occurs when r10k is being run as the `prerun` command
under Puppet.

### Developer notes

The method mocking framework has been switched from mocha to rspec-mocks. Mocha
is notoriously bad about breaking changes between versions and rspec-mocks is
very robust, so Mocha has been ripped out and dropped as a dependency.

Rspec expectations now use the `expect(thing).to` syntax instead `thing.should`

A quasi settings framework has been extracted to make application settings less
bad. In the long term a general application framework will be extracted from
r10k to handle generic 'application' problems like this, but for now the settings
framework is the way to handle singleton data.

R10K:Git::Cache object memoization has been extracted into a standalone class
instead of being grafted onto the class. All hail the single responsibility
principle!

R10K::Module code has been refactored. There's now a real base class instead of
a hacky mixin with some metadata magic on top.

### Thanks

Thanks to the following contributors for their help in 1.1.0:

  * Alex Linden Levy
  * Abhay Chrungoo
  * Adam Vessey
  * Chuck Schweizer
  * Elias Probst
  * Greg Baker
  * Jochen Schalanda
  * Theo Chatzimichos

1.0.0
-----

2013-05-30

This is a backwards incompatible bugfix and feature release.

### Configuration

The configuration file format of 0.0.9 should be compatible with 1.0.0, and any
issues with that should be considered a bug.

A longstanding issue was confusion between symbols and strings in r10k.yaml
(GH-18). To resolve this, symbols and strings will be treated equally and
should produce the same behavior. In the long run, symbols will probably be
deprecated for the sake of conformity.

### Command line invocation

A number of commands have been renamed. They still but will emit a deprecation
warning and will redirect to the new command implementation. The only
exceptions is the are the `r10k environment cache` and `r10k environment stale`
commands, but they were pretty much useless anyways.

Log level verbosity can now be specified by level name instead of level number.
If --verbose is passed without a level, it will set the log level to `info`.

### Puppetfile support

r10k can be used to deploy modules from a standalone Puppetfile. See
`r10k puppetfile` for more information.

Modules without a version in the format of 'foo/bar' will be assumed. (GH-21)

### API

r10k handles versioning according to SemVer; since this is a major release this
is a backwards incompatible API change. It's unlikely that this has had any
extensions written on top of it, but if you have, then heads up. However, all
versions of 1.x should be backwards compatible.

### Bugfixes

A number of bugs were due to underlying architecture flaws. Part of 1.0.0 has
been a significant architectural overhaul, so on top of all of the above
changes there should be a lot of other bugs that have been fixed.