profile
viewpoint

bfallik/sixpack 1

geeky fun with beer

bfallik/aws-sdk-go 0

AWS SDK for the Go programming language.

bfallik/b 0

Package b implements a B+tree.

bfallik/berglas 0

A tool for managing secrets on Google Cloud

bfallik/coreos-kubernetes 0

CoreOS + Kubernetes documentation and Vagrant configurations

bfallik/cuelang.org 0

Source for the cuelang.org site

bfallik/deis 0

Your PaaS. Your Rules.

bfallik/dex 0

dex is an OpenID Connect Identity Provider...and more!

created repositorydaved/rustpl

created time in 8 days

created repositorydaved/gpwg

created time in 18 days

created repositorydaved/decomp

created time in 2 months

fork daved/gowt

Sample crud web application project using Golang(http, templates, os, sql), Bootstrap 4, DataTables, MySQL.

https://github.com/le4ndro/gowt

fork in 2 months

fork daved/fruitshop

This project is to build an Fruit store with both front end and back end parts of the application. Angular 10 is used to build front end part and Golang is used for building RESTFul API serving data from in-memory DB.

fork in 2 months

fork daved/cli

The Command Line Interface for managing language runtime environments built by the ActiveState Platform

http://docs.activestate.com/platform/state/

fork in 2 months

delete branch clyphub/jsonenums

delete branch : CLYPD-41195-optional-csv

delete time in 3 months

push eventclyphub/jsonenums

Ammar Dodin

commit sha 69a78a28f9c0b0cbee167d95ae9947b661bbfb34

CLYPD-41195 - Allow exclusion of CSV methods Some enums in gillnet have non-standard CSV Marshal/Unmarshall methods. This option allows us to keep those around and still be able to `go generate` our entire codebase without having to touch the generated code.

view details

Ammar Dodin

commit sha ab287f9f3dddb97cd95e1ec3566d7c427e6e3723

Merge pull request #16 from clyphub/CLYPD-41195-optional-csv CLYPD-41195 - Allow skipping generation of CSV methods

view details

push time in 3 months

PR merged clyphub/jsonenums

CLYPD-41195 - Allow skipping generation of CSV methods

Some enums in gillnet have non-standard CSV Marshal/Unmarshall methods. This option allows us to keep those non-standard™ methods around and still be able to go generate our entire codebase. See this discussion for more details.

Tested by a building a new binary with these changes locally, then generating code for a simple enum with/without the flag.

Without CSV methods:

// generated by jsonenums -type=AdvancedTargetOrigin -prefix_to_drop=AdvancedTargetOrigin -exclude_csv_methods -all_caps -snake_case_json --to_string; DO NOT EDIT

package main

import (
	"database/sql/driver"
	"encoding/json"
	"fmt"
)

var (
	_AdvancedTargetOriginNameToValue = map[string]AdvancedTargetOrigin{
		"NMI": AdvancedTargetOriginNMI,
	}

	_AdvancedTargetOriginValueToName = map[AdvancedTargetOrigin]string{
		AdvancedTargetOriginNMI: "NMI",
	}
)

type _AdvancedTargetOriginInvalidValueError struct {
	invalidValue string
}

func (e _AdvancedTargetOriginInvalidValueError) Error() string {
	return fmt.Sprintf("invalid AdvancedTargetOrigin: %s", e.invalidValue)
}

func (e _AdvancedTargetOriginInvalidValueError) InvalidValueError() string {
	return e.Error()
}

func init() {
	var v AdvancedTargetOrigin
	if _, ok := interface{}(v).(fmt.Stringer); ok {
		_AdvancedTargetOriginNameToValue = map[string]AdvancedTargetOrigin{
			interface{}(AdvancedTargetOriginNMI).(fmt.Stringer).String(): AdvancedTargetOriginNMI,
		}
	}
}

func ListAdvancedTargetOriginValues() map[string]string {
	AdvancedTargetOriginList := make(map[string]string)
	for k := range _AdvancedTargetOriginNameToValue {
		AdvancedTargetOriginList[k] = k
	}
	return AdvancedTargetOriginList
}

func (r AdvancedTargetOrigin) toString() (string, error) {
	s, ok := _AdvancedTargetOriginValueToName[r]
	if !ok {
		return "", fmt.Errorf("invalid AdvancedTargetOrigin: %d", r)
	}
	return s, nil
}

func (r AdvancedTargetOrigin) ToString() (string, error) {
	return r.toString()
}

func (r AdvancedTargetOrigin) getString() (string, error) {
	if s, ok := interface{}(r).(fmt.Stringer); ok {
		return s.String(), nil
	}
	return r.toString()
}

func (r *AdvancedTargetOrigin) setValue(str string) error {
	v, ok := _AdvancedTargetOriginNameToValue[str]
	if !ok {
		return _AdvancedTargetOriginInvalidValueError{invalidValue: str}
	}
	*r = v
	return nil
}

// MarshalJSON is generated so AdvancedTargetOrigin satisfies json.Marshaler.
func (r AdvancedTargetOrigin) MarshalJSON() ([]byte, error) {
	s, err := r.getString()
	if err != nil {
		return nil, err
	}
	return json.Marshal(s)
}

// UnmarshalJSON is generated so AdvancedTargetOrigin satisfies json.Unmarshaler.
func (r *AdvancedTargetOrigin) UnmarshalJSON(data []byte) error {
	var s string
	if err := json.Unmarshal(data, &s); err != nil {
		return _AdvancedTargetOriginInvalidValueError{invalidValue: string(data)}
	}
	return r.setValue(s)
}

//Scan an input string into this structure for use with GORP
func (r *AdvancedTargetOrigin) Scan(i interface{}) error {
	switch t := i.(type) {
	case []byte:
		return r.setValue(string(t))
	case string:
		return r.setValue(t)
	default:
		return fmt.Errorf("can't scan %T into type %T", i, r)
	}
}

func (r AdvancedTargetOrigin) Value() (driver.Value, error) {
	return r.getString()
}

With CSV Methods:

// generated by jsonenums -type=AdvancedTargetOrigin -prefix_to_drop=AdvancedTargetOrigin -all_caps -snake_case_json --to_string; DO NOT EDIT

package main

import (
	"database/sql/driver"
	"encoding/json"
	"fmt"
)

var (
	_AdvancedTargetOriginNameToValue = map[string]AdvancedTargetOrigin{
		"NMI": AdvancedTargetOriginNMI,
	}

	_AdvancedTargetOriginValueToName = map[AdvancedTargetOrigin]string{
		AdvancedTargetOriginNMI: "NMI",
	}
)

type _AdvancedTargetOriginInvalidValueError struct {
	invalidValue string
}

func (e _AdvancedTargetOriginInvalidValueError) Error() string {
	return fmt.Sprintf("invalid AdvancedTargetOrigin: %s", e.invalidValue)
}

func (e _AdvancedTargetOriginInvalidValueError) InvalidValueError() string {
	return e.Error()
}

func init() {
	var v AdvancedTargetOrigin
	if _, ok := interface{}(v).(fmt.Stringer); ok {
		_AdvancedTargetOriginNameToValue = map[string]AdvancedTargetOrigin{
			interface{}(AdvancedTargetOriginNMI).(fmt.Stringer).String(): AdvancedTargetOriginNMI,
		}
	}
}

func ListAdvancedTargetOriginValues() map[string]string {
	AdvancedTargetOriginList := make(map[string]string)
	for k := range _AdvancedTargetOriginNameToValue {
		AdvancedTargetOriginList[k] = k
	}
	return AdvancedTargetOriginList
}

func (r AdvancedTargetOrigin) toString() (string, error) {
	s, ok := _AdvancedTargetOriginValueToName[r]
	if !ok {
		return "", fmt.Errorf("invalid AdvancedTargetOrigin: %d", r)
	}
	return s, nil
}

func (r AdvancedTargetOrigin) ToString() (string, error) {
	return r.toString()
}

func (r AdvancedTargetOrigin) getString() (string, error) {
	if s, ok := interface{}(r).(fmt.Stringer); ok {
		return s.String(), nil
	}
	return r.toString()
}

func (r *AdvancedTargetOrigin) setValue(str string) error {
	v, ok := _AdvancedTargetOriginNameToValue[str]
	if !ok {
		return _AdvancedTargetOriginInvalidValueError{invalidValue: str}
	}
	*r = v
	return nil
}

// MarshalJSON is generated so AdvancedTargetOrigin satisfies json.Marshaler.
func (r AdvancedTargetOrigin) MarshalJSON() ([]byte, error) {
	s, err := r.getString()
	if err != nil {
		return nil, err
	}
	return json.Marshal(s)
}

// UnmarshalJSON is generated so AdvancedTargetOrigin satisfies json.Unmarshaler.
func (r *AdvancedTargetOrigin) UnmarshalJSON(data []byte) error {
	var s string
	if err := json.Unmarshal(data, &s); err != nil {
		return _AdvancedTargetOriginInvalidValueError{invalidValue: string(data)}
	}
	return r.setValue(s)
}

//Scan an input string into this structure for use with GORP
func (r *AdvancedTargetOrigin) Scan(i interface{}) error {
	switch t := i.(type) {
	case []byte:
		return r.setValue(string(t))
	case string:
		return r.setValue(t)
	default:
		return fmt.Errorf("can't scan %T into type %T", i, r)
	}
}

func (r AdvancedTargetOrigin) Value() (driver.Value, error) {
	return r.getString()
}

// MarshalCSV is generated so AdvancedTargetOrigin satisfies csv.Marshaler.
func (r AdvancedTargetOrigin) MarshalCSV() (string, error) {
	return r.getString()
}

// UnmarshalCSV is generated so AdvancedTargetOrigin satisfies csv.Unmarshaler.
func (r *AdvancedTargetOrigin) UnmarshalCSV(s string) error {
	return r.setValue(s)
}

+5 -0

0 comment

2 changed files

ammardodin

pr closed time in 3 months

PR opened clyphub/jsonenums

CLYPD-41195 - Allow skipping generation of CSV methods

Some enums in gillnet have non-standard CSV Marshal/Unmarshall methods. This option allows us to keep those non-standard™ methods around and still be able to go generate our entire codebase. See this discussion for more details.

Tested by a building a new binary with these changes locally, then generating code for a simple enum with/without the flag.

Without CSV methods:

// generated by jsonenums -type=AdvancedTargetOrigin -prefix_to_drop=AdvancedTargetOrigin -exclude_csv_methods -all_caps -snake_case_json --to_string; DO NOT EDIT

package main

import (
	"database/sql/driver"
	"encoding/json"
	"fmt"
)

var (
	_AdvancedTargetOriginNameToValue = map[string]AdvancedTargetOrigin{
		"NMI": AdvancedTargetOriginNMI,
	}

	_AdvancedTargetOriginValueToName = map[AdvancedTargetOrigin]string{
		AdvancedTargetOriginNMI: "NMI",
	}
)

type _AdvancedTargetOriginInvalidValueError struct {
	invalidValue string
}

func (e _AdvancedTargetOriginInvalidValueError) Error() string {
	return fmt.Sprintf("invalid AdvancedTargetOrigin: %s", e.invalidValue)
}

func (e _AdvancedTargetOriginInvalidValueError) InvalidValueError() string {
	return e.Error()
}

func init() {
	var v AdvancedTargetOrigin
	if _, ok := interface{}(v).(fmt.Stringer); ok {
		_AdvancedTargetOriginNameToValue = map[string]AdvancedTargetOrigin{
			interface{}(AdvancedTargetOriginNMI).(fmt.Stringer).String(): AdvancedTargetOriginNMI,
		}
	}
}

func ListAdvancedTargetOriginValues() map[string]string {
	AdvancedTargetOriginList := make(map[string]string)
	for k := range _AdvancedTargetOriginNameToValue {
		AdvancedTargetOriginList[k] = k
	}
	return AdvancedTargetOriginList
}

func (r AdvancedTargetOrigin) toString() (string, error) {
	s, ok := _AdvancedTargetOriginValueToName[r]
	if !ok {
		return "", fmt.Errorf("invalid AdvancedTargetOrigin: %d", r)
	}
	return s, nil
}

func (r AdvancedTargetOrigin) ToString() (string, error) {
	return r.toString()
}

func (r AdvancedTargetOrigin) getString() (string, error) {
	if s, ok := interface{}(r).(fmt.Stringer); ok {
		return s.String(), nil
	}
	return r.toString()
}

func (r *AdvancedTargetOrigin) setValue(str string) error {
	v, ok := _AdvancedTargetOriginNameToValue[str]
	if !ok {
		return _AdvancedTargetOriginInvalidValueError{invalidValue: str}
	}
	*r = v
	return nil
}

// MarshalJSON is generated so AdvancedTargetOrigin satisfies json.Marshaler.
func (r AdvancedTargetOrigin) MarshalJSON() ([]byte, error) {
	s, err := r.getString()
	if err != nil {
		return nil, err
	}
	return json.Marshal(s)
}

// UnmarshalJSON is generated so AdvancedTargetOrigin satisfies json.Unmarshaler.
func (r *AdvancedTargetOrigin) UnmarshalJSON(data []byte) error {
	var s string
	if err := json.Unmarshal(data, &s); err != nil {
		return _AdvancedTargetOriginInvalidValueError{invalidValue: string(data)}
	}
	return r.setValue(s)
}

//Scan an input string into this structure for use with GORP
func (r *AdvancedTargetOrigin) Scan(i interface{}) error {
	switch t := i.(type) {
	case []byte:
		return r.setValue(string(t))
	case string:
		return r.setValue(t)
	default:
		return fmt.Errorf("can't scan %T into type %T", i, r)
	}
}

func (r AdvancedTargetOrigin) Value() (driver.Value, error) {
	return r.getString()
}

With CSV Methods:

// generated by jsonenums -type=AdvancedTargetOrigin -prefix_to_drop=AdvancedTargetOrigin -all_caps -snake_case_json --to_string; DO NOT EDIT

package main

import (
	"database/sql/driver"
	"encoding/json"
	"fmt"
)

var (
	_AdvancedTargetOriginNameToValue = map[string]AdvancedTargetOrigin{
		"NMI": AdvancedTargetOriginNMI,
	}

	_AdvancedTargetOriginValueToName = map[AdvancedTargetOrigin]string{
		AdvancedTargetOriginNMI: "NMI",
	}
)

type _AdvancedTargetOriginInvalidValueError struct {
	invalidValue string
}

func (e _AdvancedTargetOriginInvalidValueError) Error() string {
	return fmt.Sprintf("invalid AdvancedTargetOrigin: %s", e.invalidValue)
}

func (e _AdvancedTargetOriginInvalidValueError) InvalidValueError() string {
	return e.Error()
}

func init() {
	var v AdvancedTargetOrigin
	if _, ok := interface{}(v).(fmt.Stringer); ok {
		_AdvancedTargetOriginNameToValue = map[string]AdvancedTargetOrigin{
			interface{}(AdvancedTargetOriginNMI).(fmt.Stringer).String(): AdvancedTargetOriginNMI,
		}
	}
}

func ListAdvancedTargetOriginValues() map[string]string {
	AdvancedTargetOriginList := make(map[string]string)
	for k := range _AdvancedTargetOriginNameToValue {
		AdvancedTargetOriginList[k] = k
	}
	return AdvancedTargetOriginList
}

func (r AdvancedTargetOrigin) toString() (string, error) {
	s, ok := _AdvancedTargetOriginValueToName[r]
	if !ok {
		return "", fmt.Errorf("invalid AdvancedTargetOrigin: %d", r)
	}
	return s, nil
}

func (r AdvancedTargetOrigin) ToString() (string, error) {
	return r.toString()
}

func (r AdvancedTargetOrigin) getString() (string, error) {
	if s, ok := interface{}(r).(fmt.Stringer); ok {
		return s.String(), nil
	}
	return r.toString()
}

func (r *AdvancedTargetOrigin) setValue(str string) error {
	v, ok := _AdvancedTargetOriginNameToValue[str]
	if !ok {
		return _AdvancedTargetOriginInvalidValueError{invalidValue: str}
	}
	*r = v
	return nil
}

// MarshalJSON is generated so AdvancedTargetOrigin satisfies json.Marshaler.
func (r AdvancedTargetOrigin) MarshalJSON() ([]byte, error) {
	s, err := r.getString()
	if err != nil {
		return nil, err
	}
	return json.Marshal(s)
}

// UnmarshalJSON is generated so AdvancedTargetOrigin satisfies json.Unmarshaler.
func (r *AdvancedTargetOrigin) UnmarshalJSON(data []byte) error {
	var s string
	if err := json.Unmarshal(data, &s); err != nil {
		return _AdvancedTargetOriginInvalidValueError{invalidValue: string(data)}
	}
	return r.setValue(s)
}

//Scan an input string into this structure for use with GORP
func (r *AdvancedTargetOrigin) Scan(i interface{}) error {
	switch t := i.(type) {
	case []byte:
		return r.setValue(string(t))
	case string:
		return r.setValue(t)
	default:
		return fmt.Errorf("can't scan %T into type %T", i, r)
	}
}

func (r AdvancedTargetOrigin) Value() (driver.Value, error) {
	return r.getString()
}

// MarshalCSV is generated so AdvancedTargetOrigin satisfies csv.Marshaler.
func (r AdvancedTargetOrigin) MarshalCSV() (string, error) {
	return r.getString()
}

// UnmarshalCSV is generated so AdvancedTargetOrigin satisfies csv.Unmarshaler.
func (r *AdvancedTargetOrigin) UnmarshalCSV(s string) error {
	return r.setValue(s)
}

+5 -0

0 comment

2 changed files

pr created time in 3 months

create barnchclyphub/jsonenums

branch : CLYPD-41195-optional-csv

created branch time in 3 months

delete branch clyphub/jsonenums

delete branch : CLYPD-41195-optional-csv

delete time in 3 months

create barnchclyphub/jsonenums

branch : CLYPD-41195-optional-csv

created branch time in 3 months

delete branch clyphub/jsonenums

delete branch : CLYPD-41195

delete time in 3 months

push eventclyphub/jsonenums

Herbert Chang

commit sha fa0de000d5f239d31c98878093dda9f1c81bd2a1

also introduce MarshalCSV for jsonenum-ed types

view details

Herbert Chang

commit sha 472af335ca2b0644962196f3649d59dfdf435147

write MarshalCSV for every type needed This was previously accidentally put outside of the template loop and would've resulted in a var undefined error.

view details

Herbert Chang

commit sha 2da9b05b213f385b4463561ee97fac613c381ac1

also introduce UnmarshalCSV

view details

Herbert Chang

commit sha 38a278e4ac0b6358a0f2756254f8701308e53f9d

UnmarshalCSV needs to be a pointer receiver 🤦‍♂️

view details

Herbert Chang

commit sha 1756966197144ceeb68a914c2d8ee34b933abb96

Merge pull request #15 from clyphub/CLYPD-41195 also introduce MarshalCSV for jsonenum-ed types

view details

push time in 3 months

PR merged clyphub/jsonenums

also introduce MarshalCSV for jsonenum-ed types

https://jira.xandr-services.com/browse/CLYPD-41195

+10 -0

3 comments

1 changed file

hchang-clypd

pr closed time in 3 months

pull request commentclyphub/jsonenums

also introduce MarshalCSV for jsonenum-ed types

local testing steps:

  • $ GO111MODULE=on go get github.com/clyphub/jsonenums@38a278e to install the binary
  • $ cp bin/jsonenums bin/third_party/
  • $ cd src/clypd/models/tvplatform && go generate

Which yielded the following diff:

hc072p@Herberts-MacBook-Pro go % git diff                    
diff --git a/go/src/clypd/models/tvplatform/goaltype_jsonenums.go b/go/src/clypd/models/tvplatform/goaltype_jsonenums.go
index cf39a6bcf3..3a21337146 100644
--- a/go/src/clypd/models/tvplatform/goaltype_jsonenums.go
+++ b/go/src/clypd/models/tvplatform/goaltype_jsonenums.go
@@ -117,3 +117,13 @@ func (r *GoalType) Scan(i interface{}) error {
 func (r GoalType) Value() (driver.Value, error) {
        return r.getString()
 }
+
+// MarshalCSV is generated so GoalType satisfies csv.Marshaler.
+func (r GoalType) MarshalCSV() (string, error) {
+       return r.getString()
+}
+
+// UnmarshalCSV is generated so GoalType satisfies csv.Unmarshaler.
+func (r *GoalType) UnmarshalCSV(s string) error {
+       return r.setValue(s)
+}
diff --git a/go/src/clypd/models/tvplatform/rfpstatus_jsonenums.go b/go/src/clypd/models/tvplatform/rfpstatus_jsonenums.go
index 6771ed1c23..7ebb101f91 100644
--- a/go/src/clypd/models/tvplatform/rfpstatus_jsonenums.go
+++ b/go/src/clypd/models/tvplatform/rfpstatus_jsonenums.go
@@ -132,3 +132,13 @@ func (r *RFPStatus) Scan(i interface{}) error {
 func (r RFPStatus) Value() (driver.Value, error) {
        return r.getString()
 }
+
+// MarshalCSV is generated so RFPStatus satisfies csv.Marshaler.
+func (r RFPStatus) MarshalCSV() (string, error) {
+       return r.getString()
+}
+
+// UnmarshalCSV is generated so RFPStatus satisfies csv.Unmarshaler.
+func (r *RFPStatus) UnmarshalCSV(s string) error {
+       return r.setValue(s)
+}

I then rebuilt tvpddeliverycmd, which is a test binary to create sample CSV data for the TVDP dashboard data stream: $ make bin/tvpddeliverytestcmd, and generated a sample file with no issues and the column values now serialize as I expect

hchang-clypd

comment created time in 3 months

pull request commentclyphub/jsonenums

also introduce MarshalCSV for jsonenum-ed types

@enetland yes, my plan after merging this is

  • rebuild and update the binary on clypd-engineering s3 bucket
  • regenerate all our jsonnum things with this enhancement
hchang-clypd

comment created time in 3 months

Pull request review commentclyphub/jsonenums

also introduce MarshalCSV for jsonenum-ed types

 func (r {{$typename}}) MarshalCSV() (string, error) {     return r.getString() } +// UnmarshalCSV is generated so {{$typename}} satisfies csv.Unmarshaler.+func (r {{$typename}}) UnmarshalCSV(s string) (error) {

that's what code review is for :)

hchang-clypd

comment created time in 3 months

Pull request review commentclyphub/jsonenums

also introduce MarshalCSV for jsonenum-ed types

 func (r {{$typename}}) MarshalCSV() (string, error) {     return r.getString() } +// UnmarshalCSV is generated so {{$typename}} satisfies csv.Unmarshaler.+func (r {{$typename}}) UnmarshalCSV(s string) (error) {

thanks. not having tests to rely on is scary 38a278e

hchang-clypd

comment created time in 3 months

push eventclyphub/jsonenums

Herbert Chang

commit sha 38a278e4ac0b6358a0f2756254f8701308e53f9d

UnmarshalCSV needs to be a pointer receiver 🤦‍♂️

view details

push time in 3 months

Pull request review commentclyphub/jsonenums

also introduce MarshalCSV for jsonenum-ed types

 func (r {{$typename}}) MarshalCSV() (string, error) {     return r.getString() } +// UnmarshalCSV is generated so {{$typename}} satisfies csv.Unmarshaler.+func (r {{$typename}}) UnmarshalCSV(s string) (error) {

I think this needs to be a pointer receiver

hchang-clypd

comment created time in 3 months

pull request commentclyphub/jsonenums

also introduce MarshalCSV for jsonenum-ed types

@APILLSBURY yeah, I was hesitant to introduce the unmarshal because it's not always consistent across all the things we do. But upon more thinking I think this is generally safe to do, so 2da9b05

hchang-clypd

comment created time in 3 months

Pull request review commentclyphub/jsonenums

also introduce MarshalCSV for jsonenum-ed types

 func (r {{$typename}}) Value() (driver.Value, error) {  {{end}}

😬 good catch 472af33

hchang-clypd

comment created time in 3 months

push eventclyphub/jsonenums

Herbert Chang

commit sha 472af335ca2b0644962196f3649d59dfdf435147

write MarshalCSV for every type needed This was previously accidentally put outside of the template loop and would've resulted in a var undefined error.

view details

Herbert Chang

commit sha 2da9b05b213f385b4463561ee97fac613c381ac1

also introduce UnmarshalCSV

view details

push time in 3 months

Pull request review commentclyphub/jsonenums

also introduce MarshalCSV for jsonenum-ed types

 func (r {{$typename}}) Value() (driver.Value, error) {  {{end}}

what's this {{end}}? Does your MarshalCSV func need to be before that?

hchang-clypd

comment created time in 3 months

PR opened clyphub/jsonenums

also introduce MarshalCSV for jsonenum-ed types

https://jira.xandr-services.com/browse/CLYPD-41195

+5 -0

0 comment

1 changed file

pr created time in 3 months

create barnchclyphub/jsonenums

branch : CLYPD-41195

created branch time in 3 months

more