From ee7fe7c728b0898b0077e9ac208050a489ae12be Mon Sep 17 00:00:00 2001 From: Adnan Abdulhussein Date: Tue, 18 Oct 2016 18:04:36 -0700 Subject: [PATCH] fix(repo): ensure index generates in the right order --- cmd/helm/repo_index.go | 1 + cmd/helm/repo_index_test.go | 36 ++++++++++++++++-- .../testcharts/compressedchart-0.2.0.tgz | Bin 0 -> 540 bytes .../testcharts/compressedchart-0.3.0.tgz | Bin 0 -> 538 bytes pkg/repo/index.go | 5 ++- pkg/repo/index_test.go | 12 +++--- pkg/repo/repo_test.go | 8 +++- pkg/repo/testdata/local-index.yaml | 12 +++--- .../testdata/repository/sprocket-1.1.0.tgz | Bin 0 -> 814 bytes 9 files changed, 57 insertions(+), 17 deletions(-) create mode 100644 cmd/helm/testdata/testcharts/compressedchart-0.2.0.tgz create mode 100644 cmd/helm/testdata/testcharts/compressedchart-0.3.0.tgz create mode 100644 pkg/repo/testdata/repository/sprocket-1.1.0.tgz diff --git a/cmd/helm/repo_index.go b/cmd/helm/repo_index.go index 1a681c6f9..ad5808946 100644 --- a/cmd/helm/repo_index.go +++ b/cmd/helm/repo_index.go @@ -94,5 +94,6 @@ func index(dir, url, mergeTo string) error { } i.Merge(i2) } + i.SortEntries() return i.WriteFile(out, 0755) } diff --git a/cmd/helm/repo_index_test.go b/cmd/helm/repo_index_test.go index ee00d546d..4f2a69eec 100644 --- a/cmd/helm/repo_index_test.go +++ b/cmd/helm/repo_index_test.go @@ -38,6 +38,10 @@ func TestRepoIndexCmd(t *testing.T) { if err := os.Link("testdata/testcharts/compressedchart-0.1.0.tgz", comp); err != nil { t.Fatal(err) } + comp2 := filepath.Join(dir, "compressedchart-0.2.0.tgz") + if err := os.Link("testdata/testcharts/compressedchart-0.2.0.tgz", comp2); err != nil { + t.Fatal(err) + } buf := bytes.NewBuffer(nil) c := newRepoIndexCmd(buf) @@ -57,16 +61,32 @@ func TestRepoIndexCmd(t *testing.T) { t.Errorf("expected 1 entry, got %d: %#v", len(index.Entries), index.Entries) } + vs := index.Entries["compressedchart"] + if len(vs) != 2 { + t.Errorf("expected 2 versions, got %d: %#v", len(vs), vs) + } + + expectedVersion := "0.2.0" + if vs[0].Version != expectedVersion { + t.Errorf("expected %q, got %q", expectedVersion, vs[0].Version) + } + // Test with `--merge` - // Remove first chart. + // Remove first two charts. if err := os.Remove(comp); err != nil { t.Fatal(err) } - // Add another chart. + if err := os.Remove(comp2); err != nil { + t.Fatal(err) + } + // Add a new chart and a new version of an existing chart if err := os.Link("testdata/testcharts/reqtest-0.1.0.tgz", filepath.Join(dir, "reqtest-0.1.0.tgz")); err != nil { t.Fatal(err) } + if err := os.Link("testdata/testcharts/compressedchart-0.3.0.tgz", filepath.Join(dir, "compressedchart-0.3.0.tgz")); err != nil { + t.Fatal(err) + } c.ParseFlags([]string{"--merge", destIndex}) if err := c.RunE(c, []string{dir}); err != nil { @@ -79,6 +99,16 @@ func TestRepoIndexCmd(t *testing.T) { } if len(index.Entries) != 2 { - t.Errorf("expected 2 entry, got %d: %#v", len(index.Entries), index.Entries) + t.Errorf("expected 2 entries, got %d: %#v", len(index.Entries), index.Entries) + } + + vs = index.Entries["compressedchart"] + if len(vs) != 3 { + t.Errorf("expected 3 versions, got %d: %#v", len(vs), vs) + } + + expectedVersion = "0.3.0" + if vs[0].Version != expectedVersion { + t.Errorf("expected %q, got %q", expectedVersion, vs[0].Version) } } diff --git a/cmd/helm/testdata/testcharts/compressedchart-0.2.0.tgz b/cmd/helm/testdata/testcharts/compressedchart-0.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ba96a80c9c54db1f77a16b45623a9dd6ce816d76 GIT binary patch literal 540 zcmV+%0^|K3iwG0|32ul0|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PL4di`zUDg|qgrIPYZh78+H_I2oAT&@2Y}3DZqiMX_&eQCSj_ zoHR`5zZcm`E-QSt>6!|J_tAB{Md1ZoBKy7$rn!AAdSAp4Q@#_=pq4Yj^E`Wo`rjYRzQ%$*(h3ggpXalI{uhfp zPx?Oxx1^N8{XKgx8p3y!k8W_WHBOZm4-ZL#&zhnBSxu^ul{St}HpjvIzxeI`pU;#2 z&%ziVV;*<9OVs_rV_TEPs+Fpgx`GwOS5d`8{df)Vt+mDl4_}i~sFYcu5uvE1u3o~C z5U*Hb+ne>sKi!=8vngu_@LDeMt42ql3>X}Nlh$c%eyak e!8poTCDXMakw_$t=SKhl0RR87^wW$06aWBmqzKpm literal 0 HcmV?d00001 diff --git a/cmd/helm/testdata/testcharts/compressedchart-0.3.0.tgz b/cmd/helm/testdata/testcharts/compressedchart-0.3.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..89776bfa80fd8e37cb819073ce30792fbcb28fe3 GIT binary patch literal 538 zcmV+#0_FW5iwG0|32ul0|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PL4fYuhjw#&hXs31R)S-sgGc!Zg;A_f!_OaN*6{_+(qrsKLqLob$`stSdR^ z{gRKz^L@Q*ALo;NJizHz@DExagd1>v>^S|+JrPRsg_AZ&qpxs{8&VCrNWjWCyla=_ zGzIdR77bmY7cSYFobS4FHf20}?A;{(m%jejLbc>iYXFDzKbc)XlU>WOi zI7l4~wx)Fm)L10~d6r@4EzNfHd*ac~UmpAOJbU{3-yh4q#)3W43J&R?=aZiP=kq*I z`acIZq?Ezk9s4L6!cUYBZg88ag)XxpG*u%0Y~ZDJw30ul#72f1FJ3Wx(rOE%yPk1Lu;iemCYG_q?YG-t c9A&JM=~|FTBofE-D*yoh|LpYS&Hxku0CM*Yp8x;= literal 0 HcmV?d00001 diff --git a/pkg/repo/index.go b/pkg/repo/index.go index 2b066d47c..f8c27f004 100644 --- a/pkg/repo/index.go +++ b/pkg/repo/index.go @@ -95,6 +95,7 @@ func NewIndexFile() *IndexFile { } // Add adds a file to the index +// This can leave the index in an unsorted state func (i IndexFile) Add(md *chart.Metadata, filename, baseURL, digest string) { u := filename if baseURL != "" { @@ -176,6 +177,8 @@ func (i IndexFile) WriteFile(dest string, mode os.FileMode) error { // // If one of the entries in the given index does _not_ already exist, it is added. // In all other cases, the existing record is preserved. +// +// This can leave the index in an unsorted state func (i *IndexFile) Merge(f *IndexFile) { for _, cvs := range f.Entries { for _, cv := range cvs { @@ -202,7 +205,7 @@ type ChartVersion struct { // // It indexes only charts that have been packaged (*.tgz). // -// It writes the results to dir/index.yaml. +// The index returned will be in an unsorted state func IndexDirectory(dir, baseURL string) (*IndexFile, error) { archives, err := filepath.Glob(filepath.Join(dir, "*.tgz")) if err != nil { diff --git a/pkg/repo/index_test.go b/pkg/repo/index_test.go index 6e61b4dc2..f976012c3 100644 --- a/pkg/repo/index_test.go +++ b/pkg/repo/index_test.go @@ -197,12 +197,12 @@ func verifyLocalIndex(t *testing.T, i *IndexFile) { Metadata: &chart.Metadata{ Name: "nginx", Description: "string", - Version: "0.1.0", + Version: "0.2.0", Keywords: []string{"popular", "web server", "proxy"}, - Home: "https://github.com/something", + Home: "https://github.com/something/else", }, URLs: []string{ - "http://storage.googleapis.com/kubernetes-charts/nginx-0.1.0.tgz", + "http://storage.googleapis.com/kubernetes-charts/nginx-0.2.0.tgz", }, Digest: "sha256:1234567890abcdef", }, @@ -210,12 +210,12 @@ func verifyLocalIndex(t *testing.T, i *IndexFile) { Metadata: &chart.Metadata{ Name: "nginx", Description: "string", - Version: "0.2.0", + Version: "0.1.0", Keywords: []string{"popular", "web server", "proxy"}, - Home: "https://github.com/something/else", + Home: "https://github.com/something", }, URLs: []string{ - "http://storage.googleapis.com/kubernetes-charts/nginx-0.2.0.tgz", + "http://storage.googleapis.com/kubernetes-charts/nginx-0.1.0.tgz", }, Digest: "sha256:1234567890abcdef", }, diff --git a/pkg/repo/repo_test.go b/pkg/repo/repo_test.go index 0f4589dba..704c3fe3d 100644 --- a/pkg/repo/repo_test.go +++ b/pkg/repo/repo_test.go @@ -133,7 +133,7 @@ func TestLoadChartRepository(t *testing.T) { t.Errorf("Problem loading chart repository from %s: %v", testRepository, err) } - paths := []string{filepath.Join(testRepository, "frobnitz-1.2.3.tgz"), filepath.Join(testRepository, "sprocket-1.2.0.tgz")} + paths := []string{filepath.Join(testRepository, "frobnitz-1.2.3.tgz"), filepath.Join(testRepository, "sprocket-1.1.0.tgz"), filepath.Join(testRepository, "sprocket-1.2.0.tgz")} if cr.RootPath != testRepository { t.Errorf("Expected %s as RootPath but got %s", testRepository, cr.RootPath) @@ -211,6 +211,12 @@ func verifyIndex(t *testing.T, actual *IndexFile) { Version: "1.2.0", }, }, + { + Metadata: &chart.Metadata{ + Name: "sprocket", + Version: "1.1.0", + }, + }, }, } diff --git a/pkg/repo/testdata/local-index.yaml b/pkg/repo/testdata/local-index.yaml index ae29dfd8f..c0682643b 100644 --- a/pkg/repo/testdata/local-index.yaml +++ b/pkg/repo/testdata/local-index.yaml @@ -2,22 +2,22 @@ apiVersion: v1 entries: nginx: - urls: - - http://storage.googleapis.com/kubernetes-charts/nginx-0.1.0.tgz + - http://storage.googleapis.com/kubernetes-charts/nginx-0.2.0.tgz name: nginx description: string - version: 0.1.0 - home: https://github.com/something + version: 0.2.0 + home: https://github.com/something/else digest: "sha256:1234567890abcdef" keywords: - popular - web server - proxy - urls: - - http://storage.googleapis.com/kubernetes-charts/nginx-0.2.0.tgz + - http://storage.googleapis.com/kubernetes-charts/nginx-0.1.0.tgz name: nginx description: string - version: 0.2.0 - home: https://github.com/something/else + version: 0.1.0 + home: https://github.com/something digest: "sha256:1234567890abcdef" keywords: - popular diff --git a/pkg/repo/testdata/repository/sprocket-1.1.0.tgz b/pkg/repo/testdata/repository/sprocket-1.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..595e9cc0397068b278d521615b97ae3319eb3623 GIT binary patch literal 814 zcmV+}1JV2+iwG0|32ul0|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PNe%ZqrH>2k_HMcVp?+SNGlrnCmX9_#`X6H(&v8fb67B6ZK<3NLo0*jqRyDvFrY4I*N|Y zl?;byygM;h#vSogz@quS?|0hmYU}&{{MK)^ck2DBJ!p1<7O;ii$axBFxB}n*(SGJ1 z?uLj^hbqZUBC{^rj}y%j%{V*#vv90frr2e%F?rYX@EK2Yfo>>MYlx#GsUqFA8mzBm zFH6jGt5IKRHCQAg9$6_*GQ*P$Rdp(+JP}FUt}H*kGx)xYiQr_TQ&7X|8{G5}na|De^G%YQ4_ z-l6<2!zSBh<5$o6i9i<0Dy+KP=_i9i@p5QzC%JOUtg(kYMaR+@R-;CpL#J$KNmdRY z4~3BI_}Hz&`+`N-=Y=rL zIg(05&dCWy_?K4a-<>W1Tz!-;@-r^ae`|Iu7|;Lh9h(1_qUS%k|A2Me?egF+0P%14 z>8;&^^{uY}X%faL1ZGkyE|LrTNGB(_LWca3DdXi_hu%PjGD1(Q&>JKsE_&tv_1>`P zp~|qFipo`jmk$S?!d!X=wTZal)saq&R3mR0>sLZAeyo6djipT8fk z`mP8egb+dqAxmWPHFyO8>yu-9vR#|o5<&`)b5x|=bfG->4@BdHN|KDtY zPd30u8{mTt@ZJV^X9K*o0bbhxhc>{04RFr}*s=jOZGb=QaX+6oR{T(e5JCtcgb+f0 zGqc637nQO?qiWQ%tzKVBug4W=S*Q@Zz%H&ug~mCxsM8DPi(Tu}XNq0nY^5wr%4cC( sQ47;LTd0d~;Y@{V)Ag^c=Y`n<*;T(FLdXhz4*&rF|3}zP2LM6<0Noys