svn-transform 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +101 -0
- data/Rakefile +56 -0
- data/VERSION +1 -0
- data/examples/example_helper.rb +31 -0
- data/examples/fixtures/dir_props.rb +29 -0
- data/examples/fixtures/original.rb +86 -0
- data/examples/fixtures/result.rb +105 -0
- data/examples/svn-transform/dir_example.rb +56 -0
- data/examples/svn-transform/file_example.rb +71 -0
- data/examples/svn-transform/transform/extension_example.rb +48 -0
- data/examples/svn-transform/transform/newline_example.rb +51 -0
- data/examples/svn-transform/transform/noop_example.rb +15 -0
- data/examples/svn-transform/transform/props_to_yaml_example.rb +137 -0
- data/examples/svn-transform_example.rb +148 -0
- data/lib/svn-transform.rb +264 -0
- data/lib/svn-transform/dir.rb +65 -0
- data/lib/svn-transform/file.rb +79 -0
- data/lib/svn-transform/session.rb +62 -0
- data/lib/svn-transform/transform/extension.rb +41 -0
- data/lib/svn-transform/transform/newline.rb +50 -0
- data/lib/svn-transform/transform/noop.rb +28 -0
- data/lib/svn-transform/transform/props_to_yaml.rb +134 -0
- metadata +115 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
class SvnTransform
|
2
|
+
module Transform
|
3
|
+
# Convert file extensions
|
4
|
+
class Extension
|
5
|
+
# Initialize Extension Transform.
|
6
|
+
#
|
7
|
+
# ==== Parameters
|
8
|
+
# file<SvnTransform::File>:: File at a given revision
|
9
|
+
# extensions<~each_pair>:: A Hash of old => new extension
|
10
|
+
#
|
11
|
+
# ==== Example
|
12
|
+
#
|
13
|
+
# SvnTransform::Transform::Extension.new(@file,
|
14
|
+
# {:txt => :markdown, :ruby => :rb}
|
15
|
+
# )
|
16
|
+
#
|
17
|
+
def initialize(file, extensions)
|
18
|
+
@file = file
|
19
|
+
@extensions = {}
|
20
|
+
(extensions || {}).each_pair do |existing, change_to|
|
21
|
+
@extensions[".#{existing}"] = ".#{change_to}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Check if this @file has one of the extensions (matches a key). If so,
|
26
|
+
# change its extension.
|
27
|
+
#
|
28
|
+
# ==== Returns
|
29
|
+
# True, False:: indicating whether a change was made.
|
30
|
+
def run
|
31
|
+
@extensions.each_pair do |existing, change_to|
|
32
|
+
if @file.path.extname == existing
|
33
|
+
@file.basename = @file.basename.gsub(/#{existing}\Z/, change_to)
|
34
|
+
return true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
return false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class SvnTransform
|
2
|
+
module Transform
|
3
|
+
# Transform all newlines to use a given sequence. For example, a repository
|
4
|
+
# some files using CRLF and some using LF could be transformed so that all
|
5
|
+
# files through all revisions use LF.
|
6
|
+
class Newline
|
7
|
+
LF = "\n"
|
8
|
+
CRLF = "\r\n"
|
9
|
+
CR = "\r"
|
10
|
+
|
11
|
+
# Initialize Newline Transform.
|
12
|
+
#
|
13
|
+
# ==== Parameters
|
14
|
+
# file<SvnTransform::File>:: File at a given revision
|
15
|
+
# newline<String>:: What to replace newlines with (defaults to \n)
|
16
|
+
def initialize(file, newline = LF)
|
17
|
+
@file = file
|
18
|
+
@newline = newline
|
19
|
+
end
|
20
|
+
|
21
|
+
# Run the transform. It first converts all newlines (LF, CRLF and CR) to
|
22
|
+
# LF, then replaces LF if needed.
|
23
|
+
#
|
24
|
+
# ==== Returns
|
25
|
+
# True, False:: indicating whether a change was made.
|
26
|
+
def run
|
27
|
+
body = @file.body.dup
|
28
|
+
# Replace CR and CRLF
|
29
|
+
body = all_to_lf(body)
|
30
|
+
# Replace LFs with newline if needed
|
31
|
+
body.gsub!(LF, @newline) unless LF == @newline
|
32
|
+
|
33
|
+
if body != @file.body
|
34
|
+
@file.body = body
|
35
|
+
return true
|
36
|
+
else
|
37
|
+
return false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# Ensure all newlines are represented by LF
|
44
|
+
def all_to_lf(body)
|
45
|
+
# Replace CRLF's, then lone CR's
|
46
|
+
return body.gsub(CRLF, LF).gsub(CR, LF)
|
47
|
+
end
|
48
|
+
end # Newline
|
49
|
+
end # Transform
|
50
|
+
end # SvnTransform
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class SvnTransform
|
2
|
+
module Transform
|
3
|
+
# A Transform class that does nothing. Useful for classes to inherit from
|
4
|
+
# that don't need any special initialize logic, and as an ultra-simple
|
5
|
+
# example.
|
6
|
+
class Noop
|
7
|
+
# Initialize Noop Transform.
|
8
|
+
#
|
9
|
+
# ==== Parameters
|
10
|
+
# file<SvnTransform::File>:: File at a given revision
|
11
|
+
# args<Array>:: Splat of other args, all ignored
|
12
|
+
def initialize(file, *args)
|
13
|
+
@file = file
|
14
|
+
@args = args
|
15
|
+
end
|
16
|
+
|
17
|
+
# Run the transform. In this case it does nothing. In actual transforms,
|
18
|
+
# it would alter the @file (#body, #basename, and/or #properties) in
|
19
|
+
# some way, probably only if a condition met.
|
20
|
+
#
|
21
|
+
# ==== Returns
|
22
|
+
# False:: indicating that nothing was done.
|
23
|
+
def run
|
24
|
+
return false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
class SvnTransform
|
4
|
+
module Transform
|
5
|
+
# Move svn properties to YAML Front matter (or, for directories, to a YAML
|
6
|
+
# file). This is particularly intended to assist when converting a
|
7
|
+
# Subversion repository to another SCM that doesn't have arbitrary
|
8
|
+
# per-node properties (or whose conversion tools ignore them).
|
9
|
+
#
|
10
|
+
# See +new+ (+initialize+) for options
|
11
|
+
class PropsToYaml
|
12
|
+
# Default filename for yaml file holding directory properties
|
13
|
+
DEFAULT_YAML_FILE = 'meta.yml'
|
14
|
+
|
15
|
+
# Initialize with node, instructions and options
|
16
|
+
#
|
17
|
+
# ==== Parameters
|
18
|
+
# node<SvnTransform::File, SvnTransform::Directory>:
|
19
|
+
# The file or directory to be transformed
|
20
|
+
# instructions<Array of Array, Symbol>:
|
21
|
+
# - :all (default) will move all svn properties to YAML Front Matter
|
22
|
+
# (except svn:entry props)
|
23
|
+
# - An Array of Arrays. The first element of the inner Array is a Regex
|
24
|
+
# or String to be matched against. The second element is an action
|
25
|
+
# to take for those properties that match (using === operator).
|
26
|
+
# Actions can be:
|
27
|
+
# - :move : Just move the property to YAML
|
28
|
+
# - :delete : Remove from svn properties, don't add to YAML
|
29
|
+
# - String : gsub replacement string
|
30
|
+
#
|
31
|
+
# ==== Options
|
32
|
+
# :yaml_file<String>::
|
33
|
+
# Filename for directory YAML properties (defaults to DEFAULT_YAML_FILE)
|
34
|
+
def initialize(node, instructions = :all, options = {})
|
35
|
+
@node = node
|
36
|
+
@instructions = instructions
|
37
|
+
@instructions = [[/\A(?!svn:entry)/]] if @instructions == :all
|
38
|
+
@yaml_file = options[:yaml_file] || DEFAULT_YAML_FILE
|
39
|
+
@dirty = false
|
40
|
+
end
|
41
|
+
|
42
|
+
def run
|
43
|
+
if file?
|
44
|
+
body_less_yaml = has_yaml_props? ? yaml_split[1] : @node.body
|
45
|
+
end
|
46
|
+
@yaml_props = yaml_properties
|
47
|
+
@svn_props = @node.properties
|
48
|
+
|
49
|
+
@node.properties.each do |prop_key, prop_val|
|
50
|
+
process_property(prop_key, prop_val)
|
51
|
+
end
|
52
|
+
|
53
|
+
if @dirty
|
54
|
+
if file?
|
55
|
+
@node.body = @yaml_props.empty? ? body_less_yaml :
|
56
|
+
(@yaml_props.to_yaml + "---\n\n" + body_less_yaml)
|
57
|
+
else
|
58
|
+
@node.fixture_dir.file(@yaml_file).body(@yaml_props.to_yaml)
|
59
|
+
end
|
60
|
+
@node.properties = @svn_props
|
61
|
+
return true
|
62
|
+
else
|
63
|
+
return false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def process_property(prop_key, prop_val)
|
68
|
+
@instructions.each do |matcher, action|
|
69
|
+
action ||= :move
|
70
|
+
if matcher === prop_key
|
71
|
+
@svn_props.delete(prop_key)
|
72
|
+
@dirty = true
|
73
|
+
case action
|
74
|
+
when :delete
|
75
|
+
return true # Do nothing
|
76
|
+
when :move
|
77
|
+
new_key = prop_key
|
78
|
+
else # A string, hopefully
|
79
|
+
new_key = prop_key.gsub(matcher, action)
|
80
|
+
end
|
81
|
+
@yaml_props[new_key] = prop_val
|
82
|
+
return true
|
83
|
+
end
|
84
|
+
end
|
85
|
+
return false
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
# Is the node a File?
|
91
|
+
def file?
|
92
|
+
@node.kind_of?(SvnTransform::File)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Is the node a Directory?
|
96
|
+
def directory?
|
97
|
+
!file?
|
98
|
+
end
|
99
|
+
|
100
|
+
# Get YAML properties. For a directory, these are stored in
|
101
|
+
# @options[:yaml_file], for a file, they are stored at the beginning of
|
102
|
+
# the file: the first line will bec and the YAML will end before a
|
103
|
+
# line containing "..." or "---".
|
104
|
+
def yaml_properties
|
105
|
+
if directory?
|
106
|
+
yaml_path = ::File.join(@node.path, @yaml_file)
|
107
|
+
@node.repos.stat(yaml_path, @node.rev_num) ?
|
108
|
+
YAML.load(@node.repos.file(yaml_path, @node.rev_num)[0]) :
|
109
|
+
{}
|
110
|
+
else
|
111
|
+
has_yaml_props? ?
|
112
|
+
YAML.load(yaml_split[0]) :
|
113
|
+
{}
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Determine if file has yaml properties, by checking if the file starts
|
118
|
+
# with three leading dashes
|
119
|
+
def has_yaml_props?
|
120
|
+
file? && @node.body[0..2] == "---"
|
121
|
+
end
|
122
|
+
|
123
|
+
# Split a file between properties and body at a line with three dots.
|
124
|
+
# Left trim the body and there may have been blank lines added for
|
125
|
+
# clarity.
|
126
|
+
def yaml_split
|
127
|
+
body = @node.body.gsub("\r", "")
|
128
|
+
ary = body.split(/\n\.\.\.\n|\n---\n/,2)
|
129
|
+
ary[1] = ary[1].lstrip
|
130
|
+
ary
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
metadata
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: svn-transform
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jared Morgan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-28 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: svn-fixture
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - "="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.2.0
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: spicycode-micronaut
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
description: |
|
36
|
+
Given a Subversion repository, svn-transform creates a new repo that is by
|
37
|
+
default identical, but allows changes to files, for example all or some of the
|
38
|
+
properties on each file can be moved from the properties to YAML prepended to
|
39
|
+
the body of the file. Primarily useful prior to conversions to other repository
|
40
|
+
types such as git.
|
41
|
+
|
42
|
+
email: jmorgan@morgancreative.net
|
43
|
+
executables: []
|
44
|
+
|
45
|
+
extensions: []
|
46
|
+
|
47
|
+
extra_rdoc_files:
|
48
|
+
- LICENSE
|
49
|
+
- README.rdoc
|
50
|
+
files:
|
51
|
+
- .document
|
52
|
+
- .gitignore
|
53
|
+
- LICENSE
|
54
|
+
- README.rdoc
|
55
|
+
- Rakefile
|
56
|
+
- VERSION
|
57
|
+
- examples/example_helper.rb
|
58
|
+
- examples/fixtures/dir_props.rb
|
59
|
+
- examples/fixtures/original.rb
|
60
|
+
- examples/fixtures/result.rb
|
61
|
+
- examples/svn-transform/dir_example.rb
|
62
|
+
- examples/svn-transform/file_example.rb
|
63
|
+
- examples/svn-transform/transform/extension_example.rb
|
64
|
+
- examples/svn-transform/transform/newline_example.rb
|
65
|
+
- examples/svn-transform/transform/noop_example.rb
|
66
|
+
- examples/svn-transform/transform/props_to_yaml_example.rb
|
67
|
+
- examples/svn-transform_example.rb
|
68
|
+
- lib/svn-transform.rb
|
69
|
+
- lib/svn-transform/dir.rb
|
70
|
+
- lib/svn-transform/file.rb
|
71
|
+
- lib/svn-transform/session.rb
|
72
|
+
- lib/svn-transform/transform/extension.rb
|
73
|
+
- lib/svn-transform/transform/newline.rb
|
74
|
+
- lib/svn-transform/transform/noop.rb
|
75
|
+
- lib/svn-transform/transform/props_to_yaml.rb
|
76
|
+
has_rdoc: true
|
77
|
+
homepage: http://github.com/jm81/svn-props-to-yaml
|
78
|
+
licenses: []
|
79
|
+
|
80
|
+
post_install_message:
|
81
|
+
rdoc_options:
|
82
|
+
- --charset=UTF-8
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: "0"
|
90
|
+
version:
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: "0"
|
96
|
+
version:
|
97
|
+
requirements: []
|
98
|
+
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 1.3.5
|
101
|
+
signing_key:
|
102
|
+
specification_version: 3
|
103
|
+
summary: Copy Subversion repository, with the ability to alter files
|
104
|
+
test_files:
|
105
|
+
- examples/example_helper.rb
|
106
|
+
- examples/fixtures/dir_props.rb
|
107
|
+
- examples/fixtures/original.rb
|
108
|
+
- examples/fixtures/result.rb
|
109
|
+
- examples/svn-transform/dir_example.rb
|
110
|
+
- examples/svn-transform/file_example.rb
|
111
|
+
- examples/svn-transform/transform/extension_example.rb
|
112
|
+
- examples/svn-transform/transform/newline_example.rb
|
113
|
+
- examples/svn-transform/transform/noop_example.rb
|
114
|
+
- examples/svn-transform/transform/props_to_yaml_example.rb
|
115
|
+
- examples/svn-transform_example.rb
|