mirror of
				https://github.com/taigrr/yq
				synced 2025-01-18 04:53:17 -08:00 
			
		
		
		
	Can now update tag/style of nodes without affecting the value
This commit is contained in:
		
							parent
							
								
									64135a16e1
								
							
						
					
					
						commit
						23de61a8d7
					
				| @ -2,6 +2,7 @@ package cmd | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"github.com/mikefarah/yq/v3/pkg/yqlib" | 	"github.com/mikefarah/yq/v3/pkg/yqlib" | ||||||
|  | 	errors "github.com/pkg/errors" | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @ -32,7 +33,12 @@ Note that you can give a create script to perform more sophisticated yaml. This | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func newProperty(cmd *cobra.Command, args []string) error { | func newProperty(cmd *cobra.Command, args []string) error { | ||||||
| 	var updateCommands, updateCommandsError = readUpdateCommands(args, 2, "Must provide <path_to_update> <value>") | 	var badArgsMessage = "Must provide <path_to_update> <value>" | ||||||
|  | 	if len(args) != 2 { | ||||||
|  | 		return errors.New(badArgsMessage) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var updateCommands, updateCommandsError = readUpdateCommands(args, 2, badArgsMessage) | ||||||
| 	if updateCommandsError != nil { | 	if updateCommandsError != nil { | ||||||
| 		return updateCommandsError | 		return updateCommandsError | ||||||
| 	} | 	} | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								cmd/utils.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								cmd/utils.go
									
									
									
									
									
								
							| @ -430,15 +430,20 @@ func readUpdateCommands(args []string, expectedArgs int, badArgsMessage string) | |||||||
| 		log.Debug("args %v", args[expectedArgs-2]) | 		log.Debug("args %v", args[expectedArgs-2]) | ||||||
| 		updateCommands = make([]yqlib.UpdateCommand, 1) | 		updateCommands = make([]yqlib.UpdateCommand, 1) | ||||||
| 		updateCommands[0] = yqlib.UpdateCommand{Command: "update", Path: args[expectedArgs-2], Value: value.Content[0], Overwrite: true} | 		updateCommands[0] = yqlib.UpdateCommand{Command: "update", Path: args[expectedArgs-2], Value: value.Content[0], Overwrite: true} | ||||||
| 
 | 	} else if len(args) == expectedArgs { | ||||||
| 	} else if len(args) < expectedArgs { |  | ||||||
| 		return nil, errors.New(badArgsMessage) |  | ||||||
| 	} else { |  | ||||||
| 		updateCommands = make([]yqlib.UpdateCommand, 1) | 		updateCommands = make([]yqlib.UpdateCommand, 1) | ||||||
| 		log.Debug("args %v", args) | 		log.Debug("args %v", args) | ||||||
| 		log.Debug("path %v", args[expectedArgs-2]) | 		log.Debug("path %v", args[expectedArgs-2]) | ||||||
| 		log.Debug("Value %v", args[expectedArgs-1]) | 		log.Debug("Value %v", args[expectedArgs-1]) | ||||||
| 		updateCommands[0] = yqlib.UpdateCommand{Command: "update", Path: args[expectedArgs-2], Value: valueParser.Parse(args[expectedArgs-1], customTag, customStyle), Overwrite: true} | 		updateCommands[0] = yqlib.UpdateCommand{Command: "update", Path: args[expectedArgs-2], Value: valueParser.Parse(args[expectedArgs-1], customTag, customStyle), Overwrite: true} | ||||||
|  | 	} else if len(args) == expectedArgs-1 { | ||||||
|  | 		// don't update the value | ||||||
|  | 		updateCommands = make([]yqlib.UpdateCommand, 1) | ||||||
|  | 		log.Debug("args %v", args) | ||||||
|  | 		log.Debug("path %v", args[expectedArgs-2]) | ||||||
|  | 		updateCommands[0] = yqlib.UpdateCommand{Command: "update", Path: args[expectedArgs-2], Value: valueParser.Parse("", customTag, customStyle), Overwrite: true, DontUpdateNodeValue: true} | ||||||
|  | 	} else { | ||||||
|  | 		return nil, errors.New(badArgsMessage) | ||||||
| 	} | 	} | ||||||
| 	return updateCommands, nil | 	return updateCommands, nil | ||||||
| } | } | ||||||
|  | |||||||
| @ -63,6 +63,46 @@ func TestWriteWithDoubleQuotedStyleCmd(t *testing.T) { | |||||||
| 	test.AssertResult(t, expectedOutput, result.Output) | 	test.AssertResult(t, expectedOutput, result.Output) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func TestWriteUpdateStyleOnlyCmd(t *testing.T) { | ||||||
|  | 	content := `b: | ||||||
|  |   c: dog | ||||||
|  |   d: things | ||||||
|  | ` | ||||||
|  | 	filename := test.WriteTempYamlFile(content) | ||||||
|  | 	defer test.RemoveTempYamlFile(filename) | ||||||
|  | 
 | ||||||
|  | 	cmd := getRootCommand() | ||||||
|  | 	result := test.RunCmd(cmd, fmt.Sprintf("write %s b.* --style=single", filename)) | ||||||
|  | 	if result.Error != nil { | ||||||
|  | 		t.Error(result.Error) | ||||||
|  | 	} | ||||||
|  | 	expectedOutput := `b: | ||||||
|  |   c: 'dog' | ||||||
|  |   d: 'things' | ||||||
|  | ` | ||||||
|  | 	test.AssertResult(t, expectedOutput, result.Output) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestWriteUpdateTagOnlyCmd(t *testing.T) { | ||||||
|  | 	content := `b: | ||||||
|  |   c: true | ||||||
|  |   d: false | ||||||
|  | ` | ||||||
|  | 	filename := test.WriteTempYamlFile(content) | ||||||
|  | 	defer test.RemoveTempYamlFile(filename) | ||||||
|  | 
 | ||||||
|  | 	cmd := getRootCommand() | ||||||
|  | 	result := test.RunCmd(cmd, fmt.Sprintf("write %s b.* --tag=!!str", filename)) | ||||||
|  | 	if result.Error != nil { | ||||||
|  | 		t.Error(result.Error) | ||||||
|  | 	} | ||||||
|  | 	expectedOutput := `b: | ||||||
|  |   c: "true" | ||||||
|  |   d: "false" | ||||||
|  | ` | ||||||
|  | 	test.AssertResult(t, expectedOutput, result.Output) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func TestWriteWithSingleQuotedStyleCmd(t *testing.T) { | func TestWriteWithSingleQuotedStyleCmd(t *testing.T) { | ||||||
| 	content := `b: | 	content := `b: | ||||||
|   c: dog |   c: dog | ||||||
|  | |||||||
| @ -13,10 +13,11 @@ import ( | |||||||
| var log = logging.MustGetLogger("yq") | var log = logging.MustGetLogger("yq") | ||||||
| 
 | 
 | ||||||
| type UpdateCommand struct { | type UpdateCommand struct { | ||||||
| 	Command   string | 	Command             string | ||||||
| 	Path      string | 	Path                string | ||||||
| 	Value     *yaml.Node | 	Value               *yaml.Node | ||||||
| 	Overwrite bool | 	Overwrite           bool | ||||||
|  | 	DontUpdateNodeValue bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func KindString(kind yaml.Kind) string { | func KindString(kind yaml.Kind) string { | ||||||
|  | |||||||
| @ -21,7 +21,9 @@ func UpdateNavigationStrategy(updateCommand UpdateCommand, autoCreate bool) Navi | |||||||
| 				DebugNode(node) | 				DebugNode(node) | ||||||
| 				log.Debug("with") | 				log.Debug("with") | ||||||
| 				DebugNode(changesToApply) | 				DebugNode(changesToApply) | ||||||
| 				node.Value = changesToApply.Value | 				if !updateCommand.DontUpdateNodeValue { | ||||||
|  | 					node.Value = changesToApply.Value | ||||||
|  | 				} | ||||||
| 				node.Tag = changesToApply.Tag | 				node.Tag = changesToApply.Tag | ||||||
| 				node.Kind = changesToApply.Kind | 				node.Kind = changesToApply.Kind | ||||||
| 				node.Style = changesToApply.Style | 				node.Style = changesToApply.Style | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user